]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
f53d774b12f5ff3097076d274241a5ed11941029
[rails.git] / vendor / assets / iD / iD.js
1 (() => {
2   var __create = Object.create;
3   var __defProp = Object.defineProperty;
4   var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5   var __getOwnPropNames = Object.getOwnPropertyNames;
6   var __getProtoOf = Object.getPrototypeOf;
7   var __hasOwnProp = Object.prototype.hasOwnProperty;
8   var __commonJS = (cb, mod) => function __require() {
9     return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10   };
11   var __export = (target, all) => {
12     for (var name in all)
13       __defProp(target, name, { get: all[name], enumerable: true });
14   };
15   var __copyProps = (to, from, except, desc) => {
16     if (from && typeof from === "object" || typeof from === "function") {
17       for (let key of __getOwnPropNames(from))
18         if (!__hasOwnProp.call(to, key) && key !== except)
19           __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20     }
21     return to;
22   };
23   var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24     // If the importer is in node compatibility mode or this is not an ESM
25     // file that has been converted to a CommonJS file using a Babel-
26     // compatible transform (i.e. "__esModule" has not been set), then set
27     // "default" to the CommonJS "module.exports" for node compatibility.
28     isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29     mod
30   ));
31
32   // node_modules/diacritics/index.js
33   var require_diacritics = __commonJS({
34     "node_modules/diacritics/index.js"(exports2) {
35       exports2.remove = removeDiacritics2;
36       var replacementList = [
37         {
38           base: " ",
39           chars: "\xA0"
40         },
41         {
42           base: "0",
43           chars: "\u07C0"
44         },
45         {
46           base: "A",
47           chars: "\u24B6\uFF21\xC0\xC1\xC2\u1EA6\u1EA4\u1EAA\u1EA8\xC3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\xC4\u01DE\u1EA2\xC5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F"
48         },
49         {
50           base: "AA",
51           chars: "\uA732"
52         },
53         {
54           base: "AE",
55           chars: "\xC6\u01FC\u01E2"
56         },
57         {
58           base: "AO",
59           chars: "\uA734"
60         },
61         {
62           base: "AU",
63           chars: "\uA736"
64         },
65         {
66           base: "AV",
67           chars: "\uA738\uA73A"
68         },
69         {
70           base: "AY",
71           chars: "\uA73C"
72         },
73         {
74           base: "B",
75           chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181"
76         },
77         {
78           base: "C",
79           chars: "\u24B8\uFF23\uA73E\u1E08\u0106C\u0108\u010A\u010C\xC7\u0187\u023B"
80         },
81         {
82           base: "D",
83           chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779"
84         },
85         {
86           base: "Dh",
87           chars: "\xD0"
88         },
89         {
90           base: "DZ",
91           chars: "\u01F1\u01C4"
92         },
93         {
94           base: "Dz",
95           chars: "\u01F2\u01C5"
96         },
97         {
98           base: "E",
99           chars: "\u025B\u24BA\uFF25\xC8\xC9\xCA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\xCB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07"
100         },
101         {
102           base: "F",
103           chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B"
104         },
105         {
106           base: "G",
107           chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262"
108         },
109         {
110           base: "H",
111           chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D"
112         },
113         {
114           base: "I",
115           chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197"
116         },
117         {
118           base: "J",
119           chars: "\u24BF\uFF2A\u0134\u0248\u0237"
120         },
121         {
122           base: "K",
123           chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2"
124         },
125         {
126           base: "L",
127           chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780"
128         },
129         {
130           base: "LJ",
131           chars: "\u01C7"
132         },
133         {
134           base: "Lj",
135           chars: "\u01C8"
136         },
137         {
138           base: "M",
139           chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB"
140         },
141         {
142           base: "N",
143           chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E"
144         },
145         {
146           base: "NJ",
147           chars: "\u01CA"
148         },
149         {
150           base: "Nj",
151           chars: "\u01CB"
152         },
153         {
154           base: "O",
155           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"
156         },
157         {
158           base: "OE",
159           chars: "\u0152"
160         },
161         {
162           base: "OI",
163           chars: "\u01A2"
164         },
165         {
166           base: "OO",
167           chars: "\uA74E"
168         },
169         {
170           base: "OU",
171           chars: "\u0222"
172         },
173         {
174           base: "P",
175           chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754"
176         },
177         {
178           base: "Q",
179           chars: "\u24C6\uFF31\uA756\uA758\u024A"
180         },
181         {
182           base: "R",
183           chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782"
184         },
185         {
186           base: "S",
187           chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784"
188         },
189         {
190           base: "T",
191           chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786"
192         },
193         {
194           base: "Th",
195           chars: "\xDE"
196         },
197         {
198           base: "TZ",
199           chars: "\uA728"
200         },
201         {
202           base: "U",
203           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"
204         },
205         {
206           base: "V",
207           chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245"
208         },
209         {
210           base: "VY",
211           chars: "\uA760"
212         },
213         {
214           base: "W",
215           chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72"
216         },
217         {
218           base: "X",
219           chars: "\u24CD\uFF38\u1E8A\u1E8C"
220         },
221         {
222           base: "Y",
223           chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE"
224         },
225         {
226           base: "Z",
227           chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762"
228         },
229         {
230           base: "a",
231           chars: "\u24D0\uFF41\u1E9A\xE0\xE1\xE2\u1EA7\u1EA5\u1EAB\u1EA9\xE3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\xE4\u01DF\u1EA3\xE5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251"
232         },
233         {
234           base: "aa",
235           chars: "\uA733"
236         },
237         {
238           base: "ae",
239           chars: "\xE6\u01FD\u01E3"
240         },
241         {
242           base: "ao",
243           chars: "\uA735"
244         },
245         {
246           base: "au",
247           chars: "\uA737"
248         },
249         {
250           base: "av",
251           chars: "\uA739\uA73B"
252         },
253         {
254           base: "ay",
255           chars: "\uA73D"
256         },
257         {
258           base: "b",
259           chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182"
260         },
261         {
262           base: "c",
263           chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\xE7\u1E09\u0188\u023C\uA73F\u2184"
264         },
265         {
266           base: "d",
267           chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA"
268         },
269         {
270           base: "dh",
271           chars: "\xF0"
272         },
273         {
274           base: "dz",
275           chars: "\u01F3\u01C6"
276         },
277         {
278           base: "e",
279           chars: "\u24D4\uFF45\xE8\xE9\xEA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\xEB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD"
280         },
281         {
282           base: "f",
283           chars: "\u24D5\uFF46\u1E1F\u0192"
284         },
285         {
286           base: "ff",
287           chars: "\uFB00"
288         },
289         {
290           base: "fi",
291           chars: "\uFB01"
292         },
293         {
294           base: "fl",
295           chars: "\uFB02"
296         },
297         {
298           base: "ffi",
299           chars: "\uFB03"
300         },
301         {
302           base: "ffl",
303           chars: "\uFB04"
304         },
305         {
306           base: "g",
307           chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79"
308         },
309         {
310           base: "h",
311           chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265"
312         },
313         {
314           base: "hv",
315           chars: "\u0195"
316         },
317         {
318           base: "i",
319           chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131"
320         },
321         {
322           base: "j",
323           chars: "\u24D9\uFF4A\u0135\u01F0\u0249"
324         },
325         {
326           base: "k",
327           chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3"
328         },
329         {
330           base: "l",
331           chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D"
332         },
333         {
334           base: "lj",
335           chars: "\u01C9"
336         },
337         {
338           base: "m",
339           chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F"
340         },
341         {
342           base: "n",
343           chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509"
344         },
345         {
346           base: "nj",
347           chars: "\u01CC"
348         },
349         {
350           base: "o",
351           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"
352         },
353         {
354           base: "oe",
355           chars: "\u0153"
356         },
357         {
358           base: "oi",
359           chars: "\u01A3"
360         },
361         {
362           base: "oo",
363           chars: "\uA74F"
364         },
365         {
366           base: "ou",
367           chars: "\u0223"
368         },
369         {
370           base: "p",
371           chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1"
372         },
373         {
374           base: "q",
375           chars: "\u24E0\uFF51\u024B\uA757\uA759"
376         },
377         {
378           base: "r",
379           chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783"
380         },
381         {
382           base: "s",
383           chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282"
384         },
385         {
386           base: "ss",
387           chars: "\xDF"
388         },
389         {
390           base: "t",
391           chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787"
392         },
393         {
394           base: "th",
395           chars: "\xFE"
396         },
397         {
398           base: "tz",
399           chars: "\uA729"
400         },
401         {
402           base: "u",
403           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"
404         },
405         {
406           base: "v",
407           chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C"
408         },
409         {
410           base: "vy",
411           chars: "\uA761"
412         },
413         {
414           base: "w",
415           chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73"
416         },
417         {
418           base: "x",
419           chars: "\u24E7\uFF58\u1E8B\u1E8D"
420         },
421         {
422           base: "y",
423           chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF"
424         },
425         {
426           base: "z",
427           chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763"
428         }
429       ];
430       var diacriticsMap = {};
431       for (i2 = 0; i2 < replacementList.length; i2 += 1) {
432         chars = replacementList[i2].chars;
433         for (j2 = 0; j2 < chars.length; j2 += 1) {
434           diacriticsMap[chars[j2]] = replacementList[i2].base;
435         }
436       }
437       var chars;
438       var j2;
439       var i2;
440       function removeDiacritics2(str2) {
441         return str2.replace(/[^\u0000-\u007e]/g, function(c) {
442           return diacriticsMap[c] || c;
443         });
444       }
445       exports2.replacementList = replacementList;
446       exports2.diacriticsMap = diacriticsMap;
447     }
448   });
449
450   // node_modules/alif-toolkit/lib/isArabic.js
451   var require_isArabic = __commonJS({
452     "node_modules/alif-toolkit/lib/isArabic.js"(exports2) {
453       "use strict";
454       Object.defineProperty(exports2, "__esModule", { value: true });
455       var arabicBlocks = [
456         [1536, 1791],
457         [1872, 1919],
458         [2208, 2303],
459         [64336, 65023],
460         [65136, 65279],
461         [69216, 69247],
462         [126064, 126143],
463         [126464, 126719]
464         // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
465       ];
466       function isArabic(char) {
467         if (char.length > 1) {
468           throw new Error("isArabic works on only one-character strings");
469         }
470         let code = char.charCodeAt(0);
471         for (let i2 = 0; i2 < arabicBlocks.length; i2++) {
472           let block2 = arabicBlocks[i2];
473           if (code >= block2[0] && code <= block2[1]) {
474             return true;
475           }
476         }
477         return false;
478       }
479       exports2.isArabic = isArabic;
480       function isMath(char) {
481         if (char.length > 2) {
482           throw new Error("isMath works on only one-character strings");
483         }
484         let code = char.charCodeAt(0);
485         return code >= 1632 && code <= 1644 || code >= 1776 && code <= 1785;
486       }
487       exports2.isMath = isMath;
488     }
489   });
490
491   // node_modules/alif-toolkit/lib/unicode-arabic.js
492   var require_unicode_arabic = __commonJS({
493     "node_modules/alif-toolkit/lib/unicode-arabic.js"(exports2) {
494       "use strict";
495       Object.defineProperty(exports2, "__esModule", { value: true });
496       var arabicReference = {
497         "alef": {
498           "normal": [
499             "\u0627"
500           ],
501           "madda_above": {
502             "normal": [
503               "\u0627\u0653",
504               "\u0622"
505             ],
506             "isolated": "\uFE81",
507             "final": "\uFE82"
508           },
509           "hamza_above": {
510             "normal": [
511               "\u0627\u0654",
512               "\u0623"
513             ],
514             "isolated": "\uFE83",
515             "final": "\uFE84"
516           },
517           "hamza_below": {
518             "normal": [
519               "\u0627\u0655",
520               "\u0625"
521             ],
522             "isolated": "\uFE87",
523             "final": "\uFE88"
524           },
525           "wasla": {
526             "normal": "\u0671",
527             "isolated": "\uFB50",
528             "final": "\uFB51"
529           },
530           "wavy_hamza_above": [
531             "\u0672"
532           ],
533           "wavy_hamza_below": [
534             "\u0627\u065F",
535             "\u0673"
536           ],
537           "high_hamza": [
538             "\u0675",
539             "\u0627\u0674"
540           ],
541           "indic_two_above": [
542             "\u0773"
543           ],
544           "indic_three_above": [
545             "\u0774"
546           ],
547           "fathatan": {
548             "normal": [
549               "\u0627\u064B"
550             ],
551             "final": "\uFD3C",
552             "isolated": "\uFD3D"
553           },
554           "isolated": "\uFE8D",
555           "final": "\uFE8E"
556         },
557         "beh": {
558           "normal": [
559             "\u0628"
560           ],
561           "dotless": [
562             "\u066E"
563           ],
564           "three_dots_horizontally_below": [
565             "\u0750"
566           ],
567           "dot_below_three_dots_above": [
568             "\u0751"
569           ],
570           "three_dots_pointing_upwards_below": [
571             "\u0752"
572           ],
573           "three_dots_pointing_upwards_below_two_dots_above": [
574             "\u0753"
575           ],
576           "two_dots_below_dot_above": [
577             "\u0754"
578           ],
579           "inverted_small_v_below": [
580             "\u0755"
581           ],
582           "small_v": [
583             "\u0756"
584           ],
585           "small_v_below": [
586             "\u08A0"
587           ],
588           "hamza_above": [
589             "\u08A1"
590           ],
591           "small_meem_above": [
592             "\u08B6"
593           ],
594           "isolated": "\uFE8F",
595           "final": "\uFE90",
596           "initial": "\uFE91",
597           "medial": "\uFE92"
598         },
599         "teh marbuta": {
600           "normal": [
601             "\u0629"
602           ],
603           "isolated": "\uFE93",
604           "final": "\uFE94"
605         },
606         "teh": {
607           "normal": [
608             "\u062A"
609           ],
610           "ring": [
611             "\u067C"
612           ],
613           "three_dots_above_downwards": [
614             "\u067D"
615           ],
616           "small_teh_above": [
617             "\u08B8"
618           ],
619           "isolated": "\uFE95",
620           "final": "\uFE96",
621           "initial": "\uFE97",
622           "medial": "\uFE98"
623         },
624         "theh": {
625           "normal": [
626             "\u062B"
627           ],
628           "isolated": "\uFE99",
629           "final": "\uFE9A",
630           "initial": "\uFE9B",
631           "medial": "\uFE9C"
632         },
633         "jeem": {
634           "normal": [
635             "\u062C"
636           ],
637           "two_dots_above": [
638             "\u08A2"
639           ],
640           "isolated": "\uFE9D",
641           "final": "\uFE9E",
642           "initial": "\uFE9F",
643           "medial": "\uFEA0"
644         },
645         "hah": {
646           "normal": [
647             "\u062D"
648           ],
649           "hamza_above": [
650             "\u0681"
651           ],
652           "two_dots_vertical_above": [
653             "\u0682"
654           ],
655           "three_dots_above": [
656             "\u0685"
657           ],
658           "two_dots_above": [
659             "\u0757"
660           ],
661           "three_dots_pointing_upwards_below": [
662             "\u0758"
663           ],
664           "small_tah_below": [
665             "\u076E"
666           ],
667           "small_tah_two_dots": [
668             "\u076F"
669           ],
670           "small_tah_above": [
671             "\u0772"
672           ],
673           "indic_four_below": [
674             "\u077C"
675           ],
676           "isolated": "\uFEA1",
677           "final": "\uFEA2",
678           "initial": "\uFEA3",
679           "medial": "\uFEA4"
680         },
681         "khah": {
682           "normal": [
683             "\u062E"
684           ],
685           "isolated": "\uFEA5",
686           "final": "\uFEA6",
687           "initial": "\uFEA7",
688           "medial": "\uFEA8"
689         },
690         "dal": {
691           "normal": [
692             "\u062F"
693           ],
694           "ring": [
695             "\u0689"
696           ],
697           "dot_below": [
698             "\u068A"
699           ],
700           "dot_below_small_tah": [
701             "\u068B"
702           ],
703           "three_dots_above_downwards": [
704             "\u068F"
705           ],
706           "four_dots_above": [
707             "\u0690"
708           ],
709           "inverted_v": [
710             "\u06EE"
711           ],
712           "two_dots_vertically_below_small_tah": [
713             "\u0759"
714           ],
715           "inverted_small_v_below": [
716             "\u075A"
717           ],
718           "three_dots_below": [
719             "\u08AE"
720           ],
721           "isolated": "\uFEA9",
722           "final": "\uFEAA"
723         },
724         "thal": {
725           "normal": [
726             "\u0630"
727           ],
728           "isolated": "\uFEAB",
729           "final": "\uFEAC"
730         },
731         "reh": {
732           "normal": [
733             "\u0631"
734           ],
735           "small_v": [
736             "\u0692"
737           ],
738           "ring": [
739             "\u0693"
740           ],
741           "dot_below": [
742             "\u0694"
743           ],
744           "small_v_below": [
745             "\u0695"
746           ],
747           "dot_below_dot_above": [
748             "\u0696"
749           ],
750           "two_dots_above": [
751             "\u0697"
752           ],
753           "four_dots_above": [
754             "\u0699"
755           ],
756           "inverted_v": [
757             "\u06EF"
758           ],
759           "stroke": [
760             "\u075B"
761           ],
762           "two_dots_vertically_above": [
763             "\u076B"
764           ],
765           "hamza_above": [
766             "\u076C"
767           ],
768           "small_tah_two_dots": [
769             "\u0771"
770           ],
771           "loop": [
772             "\u08AA"
773           ],
774           "small_noon_above": [
775             "\u08B9"
776           ],
777           "isolated": "\uFEAD",
778           "final": "\uFEAE"
779         },
780         "zain": {
781           "normal": [
782             "\u0632"
783           ],
784           "inverted_v_above": [
785             "\u08B2"
786           ],
787           "isolated": "\uFEAF",
788           "final": "\uFEB0"
789         },
790         "seen": {
791           "normal": [
792             "\u0633"
793           ],
794           "dot_below_dot_above": [
795             "\u069A"
796           ],
797           "three_dots_below": [
798             "\u069B"
799           ],
800           "three_dots_below_three_dots_above": [
801             "\u069C"
802           ],
803           "four_dots_above": [
804             "\u075C"
805           ],
806           "two_dots_vertically_above": [
807             "\u076D"
808           ],
809           "small_tah_two_dots": [
810             "\u0770"
811           ],
812           "indic_four_above": [
813             "\u077D"
814           ],
815           "inverted_v": [
816             "\u077E"
817           ],
818           "isolated": "\uFEB1",
819           "final": "\uFEB2",
820           "initial": "\uFEB3",
821           "medial": "\uFEB4"
822         },
823         "sheen": {
824           "normal": [
825             "\u0634"
826           ],
827           "dot_below": [
828             "\u06FA"
829           ],
830           "isolated": "\uFEB5",
831           "final": "\uFEB6",
832           "initial": "\uFEB7",
833           "medial": "\uFEB8"
834         },
835         "sad": {
836           "normal": [
837             "\u0635"
838           ],
839           "two_dots_below": [
840             "\u069D"
841           ],
842           "three_dots_above": [
843             "\u069E"
844           ],
845           "three_dots_below": [
846             "\u08AF"
847           ],
848           "isolated": "\uFEB9",
849           "final": "\uFEBA",
850           "initial": "\uFEBB",
851           "medial": "\uFEBC"
852         },
853         "dad": {
854           "normal": [
855             "\u0636"
856           ],
857           "dot_below": [
858             "\u06FB"
859           ],
860           "isolated": "\uFEBD",
861           "final": "\uFEBE",
862           "initial": "\uFEBF",
863           "medial": "\uFEC0"
864         },
865         "tah": {
866           "normal": [
867             "\u0637"
868           ],
869           "three_dots_above": [
870             "\u069F"
871           ],
872           "two_dots_above": [
873             "\u08A3"
874           ],
875           "isolated": "\uFEC1",
876           "final": "\uFEC2",
877           "initial": "\uFEC3",
878           "medial": "\uFEC4"
879         },
880         "zah": {
881           "normal": [
882             "\u0638"
883           ],
884           "isolated": "\uFEC5",
885           "final": "\uFEC6",
886           "initial": "\uFEC7",
887           "medial": "\uFEC8"
888         },
889         "ain": {
890           "normal": [
891             "\u0639"
892           ],
893           "three_dots_above": [
894             "\u06A0"
895           ],
896           "two_dots_above": [
897             "\u075D"
898           ],
899           "three_dots_pointing_downwards_above": [
900             "\u075E"
901           ],
902           "two_dots_vertically_above": [
903             "\u075F"
904           ],
905           "three_dots_below": [
906             "\u08B3"
907           ],
908           "isolated": "\uFEC9",
909           "final": "\uFECA",
910           "initial": "\uFECB",
911           "medial": "\uFECC"
912         },
913         "ghain": {
914           "normal": [
915             "\u063A"
916           ],
917           "dot_below": [
918             "\u06FC"
919           ],
920           "isolated": "\uFECD",
921           "final": "\uFECE",
922           "initial": "\uFECF",
923           "medial": "\uFED0"
924         },
925         "feh": {
926           "normal": [
927             "\u0641"
928           ],
929           "dotless": [
930             "\u06A1"
931           ],
932           "dot_moved_below": [
933             "\u06A2"
934           ],
935           "dot_below": [
936             "\u06A3"
937           ],
938           "three_dots_below": [
939             "\u06A5"
940           ],
941           "two_dots_below": [
942             "\u0760"
943           ],
944           "three_dots_pointing_upwards_below": [
945             "\u0761"
946           ],
947           "dot_below_three_dots_above": [
948             "\u08A4"
949           ],
950           "isolated": "\uFED1",
951           "final": "\uFED2",
952           "initial": "\uFED3",
953           "medial": "\uFED4"
954         },
955         "qaf": {
956           "normal": [
957             "\u0642"
958           ],
959           "dotless": [
960             "\u066F"
961           ],
962           "dot_above": [
963             "\u06A7"
964           ],
965           "three_dots_above": [
966             "\u06A8"
967           ],
968           "dot_below": [
969             "\u08A5"
970           ],
971           "isolated": "\uFED5",
972           "final": "\uFED6",
973           "initial": "\uFED7",
974           "medial": "\uFED8"
975         },
976         "kaf": {
977           "normal": [
978             "\u0643"
979           ],
980           "swash": [
981             "\u06AA"
982           ],
983           "ring": [
984             "\u06AB"
985           ],
986           "dot_above": [
987             "\u06AC"
988           ],
989           "three_dots_below": [
990             "\u06AE"
991           ],
992           "two_dots_above": [
993             "\u077F"
994           ],
995           "dot_below": [
996             "\u08B4"
997           ],
998           "isolated": "\uFED9",
999           "final": "\uFEDA",
1000           "initial": "\uFEDB",
1001           "medial": "\uFEDC"
1002         },
1003         "lam": {
1004           "normal": [
1005             "\u0644"
1006           ],
1007           "small_v": [
1008             "\u06B5"
1009           ],
1010           "dot_above": [
1011             "\u06B6"
1012           ],
1013           "three_dots_above": [
1014             "\u06B7"
1015           ],
1016           "three_dots_below": [
1017             "\u06B8"
1018           ],
1019           "bar": [
1020             "\u076A"
1021           ],
1022           "double_bar": [
1023             "\u08A6"
1024           ],
1025           "isolated": "\uFEDD",
1026           "final": "\uFEDE",
1027           "initial": "\uFEDF",
1028           "medial": "\uFEE0"
1029         },
1030         "meem": {
1031           "normal": [
1032             "\u0645"
1033           ],
1034           "dot_above": [
1035             "\u0765"
1036           ],
1037           "dot_below": [
1038             "\u0766"
1039           ],
1040           "three_dots_above": [
1041             "\u08A7"
1042           ],
1043           "isolated": "\uFEE1",
1044           "final": "\uFEE2",
1045           "initial": "\uFEE3",
1046           "medial": "\uFEE4"
1047         },
1048         "noon": {
1049           "normal": [
1050             "\u0646"
1051           ],
1052           "dot_below": [
1053             "\u06B9"
1054           ],
1055           "ring": [
1056             "\u06BC"
1057           ],
1058           "three_dots_above": [
1059             "\u06BD"
1060           ],
1061           "two_dots_below": [
1062             "\u0767"
1063           ],
1064           "small_tah": [
1065             "\u0768"
1066           ],
1067           "small_v": [
1068             "\u0769"
1069           ],
1070           "isolated": "\uFEE5",
1071           "final": "\uFEE6",
1072           "initial": "\uFEE7",
1073           "medial": "\uFEE8"
1074         },
1075         "heh": {
1076           "normal": [
1077             "\u0647"
1078           ],
1079           "isolated": "\uFEE9",
1080           "final": "\uFEEA",
1081           "initial": "\uFEEB",
1082           "medial": "\uFEEC"
1083         },
1084         "waw": {
1085           "normal": [
1086             "\u0648"
1087           ],
1088           "hamza_above": {
1089             "normal": [
1090               "\u0624",
1091               "\u0648\u0654"
1092             ],
1093             "isolated": "\uFE85",
1094             "final": "\uFE86"
1095           },
1096           "high_hamza": [
1097             "\u0676",
1098             "\u0648\u0674"
1099           ],
1100           "ring": [
1101             "\u06C4"
1102           ],
1103           "two_dots_above": [
1104             "\u06CA"
1105           ],
1106           "dot_above": [
1107             "\u06CF"
1108           ],
1109           "indic_two_above": [
1110             "\u0778"
1111           ],
1112           "indic_three_above": [
1113             "\u0779"
1114           ],
1115           "dot_within": [
1116             "\u08AB"
1117           ],
1118           "isolated": "\uFEED",
1119           "final": "\uFEEE"
1120         },
1121         "alef_maksura": {
1122           "normal": [
1123             "\u0649"
1124           ],
1125           "hamza_above": [
1126             "\u0626",
1127             "\u064A\u0654"
1128           ],
1129           "initial": "\uFBE8",
1130           "medial": "\uFBE9",
1131           "isolated": "\uFEEF",
1132           "final": "\uFEF0"
1133         },
1134         "yeh": {
1135           "normal": [
1136             "\u064A"
1137           ],
1138           "hamza_above": {
1139             "normal": [
1140               "\u0626",
1141               "\u0649\u0654"
1142             ],
1143             "isolated": "\uFE89",
1144             "final": "\uFE8A",
1145             "initial": "\uFE8B",
1146             "medial": "\uFE8C"
1147           },
1148           "two_dots_below_hamza_above": [
1149             "\u08A8"
1150           ],
1151           "high_hamza": [
1152             "\u0678",
1153             "\u064A\u0674"
1154           ],
1155           "tail": [
1156             "\u06CD"
1157           ],
1158           "small_v": [
1159             "\u06CE"
1160           ],
1161           "three_dots_below": [
1162             "\u06D1"
1163           ],
1164           "two_dots_below_dot_above": [
1165             "\u08A9"
1166           ],
1167           "two_dots_below_small_noon_above": [
1168             "\u08BA"
1169           ],
1170           "isolated": "\uFEF1",
1171           "final": "\uFEF2",
1172           "initial": "\uFEF3",
1173           "medial": "\uFEF4"
1174         },
1175         "tteh": {
1176           "normal": [
1177             "\u0679"
1178           ],
1179           "isolated": "\uFB66",
1180           "final": "\uFB67",
1181           "initial": "\uFB68",
1182           "medial": "\uFB69"
1183         },
1184         "tteheh": {
1185           "normal": [
1186             "\u067A"
1187           ],
1188           "isolated": "\uFB5E",
1189           "final": "\uFB5F",
1190           "initial": "\uFB60",
1191           "medial": "\uFB61"
1192         },
1193         "beeh": {
1194           "normal": [
1195             "\u067B"
1196           ],
1197           "isolated": "\uFB52",
1198           "final": "\uFB53",
1199           "initial": "\uFB54",
1200           "medial": "\uFB55"
1201         },
1202         "peh": {
1203           "normal": [
1204             "\u067E"
1205           ],
1206           "small_meem_above": [
1207             "\u08B7"
1208           ],
1209           "isolated": "\uFB56",
1210           "final": "\uFB57",
1211           "initial": "\uFB58",
1212           "medial": "\uFB59"
1213         },
1214         "teheh": {
1215           "normal": [
1216             "\u067F"
1217           ],
1218           "isolated": "\uFB62",
1219           "final": "\uFB63",
1220           "initial": "\uFB64",
1221           "medial": "\uFB65"
1222         },
1223         "beheh": {
1224           "normal": [
1225             "\u0680"
1226           ],
1227           "isolated": "\uFB5A",
1228           "final": "\uFB5B",
1229           "initial": "\uFB5C",
1230           "medial": "\uFB5D"
1231         },
1232         "nyeh": {
1233           "normal": [
1234             "\u0683"
1235           ],
1236           "isolated": "\uFB76",
1237           "final": "\uFB77",
1238           "initial": "\uFB78",
1239           "medial": "\uFB79"
1240         },
1241         "dyeh": {
1242           "normal": [
1243             "\u0684"
1244           ],
1245           "isolated": "\uFB72",
1246           "final": "\uFB73",
1247           "initial": "\uFB74",
1248           "medial": "\uFB75"
1249         },
1250         "tcheh": {
1251           "normal": [
1252             "\u0686"
1253           ],
1254           "dot_above": [
1255             "\u06BF"
1256           ],
1257           "isolated": "\uFB7A",
1258           "final": "\uFB7B",
1259           "initial": "\uFB7C",
1260           "medial": "\uFB7D"
1261         },
1262         "tcheheh": {
1263           "normal": [
1264             "\u0687"
1265           ],
1266           "isolated": "\uFB7E",
1267           "final": "\uFB7F",
1268           "initial": "\uFB80",
1269           "medial": "\uFB81"
1270         },
1271         "ddal": {
1272           "normal": [
1273             "\u0688"
1274           ],
1275           "isolated": "\uFB88",
1276           "final": "\uFB89"
1277         },
1278         "dahal": {
1279           "normal": [
1280             "\u068C"
1281           ],
1282           "isolated": "\uFB84",
1283           "final": "\uFB85"
1284         },
1285         "ddahal": {
1286           "normal": [
1287             "\u068D"
1288           ],
1289           "isolated": "\uFB82",
1290           "final": "\uFB83"
1291         },
1292         "dul": {
1293           "normal": [
1294             "\u068F",
1295             "\u068E"
1296           ],
1297           "isolated": "\uFB86",
1298           "final": "\uFB87"
1299         },
1300         "rreh": {
1301           "normal": [
1302             "\u0691"
1303           ],
1304           "isolated": "\uFB8C",
1305           "final": "\uFB8D"
1306         },
1307         "jeh": {
1308           "normal": [
1309             "\u0698"
1310           ],
1311           "isolated": "\uFB8A",
1312           "final": "\uFB8B"
1313         },
1314         "veh": {
1315           "normal": [
1316             "\u06A4"
1317           ],
1318           "isolated": "\uFB6A",
1319           "final": "\uFB6B",
1320           "initial": "\uFB6C",
1321           "medial": "\uFB6D"
1322         },
1323         "peheh": {
1324           "normal": [
1325             "\u06A6"
1326           ],
1327           "isolated": "\uFB6E",
1328           "final": "\uFB6F",
1329           "initial": "\uFB70",
1330           "medial": "\uFB71"
1331         },
1332         "keheh": {
1333           "normal": [
1334             "\u06A9"
1335           ],
1336           "dot_above": [
1337             "\u0762"
1338           ],
1339           "three_dots_above": [
1340             "\u0763"
1341           ],
1342           "three_dots_pointing_upwards_below": [
1343             "\u0764"
1344           ],
1345           "isolated": "\uFB8E",
1346           "final": "\uFB8F",
1347           "initial": "\uFB90",
1348           "medial": "\uFB91"
1349         },
1350         "ng": {
1351           "normal": [
1352             "\u06AD"
1353           ],
1354           "isolated": "\uFBD3",
1355           "final": "\uFBD4",
1356           "initial": "\uFBD5",
1357           "medial": "\uFBD6"
1358         },
1359         "gaf": {
1360           "normal": [
1361             "\u06AF"
1362           ],
1363           "ring": [
1364             "\u06B0"
1365           ],
1366           "two_dots_below": [
1367             "\u06B2"
1368           ],
1369           "three_dots_above": [
1370             "\u06B4"
1371           ],
1372           "inverted_stroke": [
1373             "\u08B0"
1374           ],
1375           "isolated": "\uFB92",
1376           "final": "\uFB93",
1377           "initial": "\uFB94",
1378           "medial": "\uFB95"
1379         },
1380         "ngoeh": {
1381           "normal": [
1382             "\u06B1"
1383           ],
1384           "isolated": "\uFB9A",
1385           "final": "\uFB9B",
1386           "initial": "\uFB9C",
1387           "medial": "\uFB9D"
1388         },
1389         "gueh": {
1390           "normal": [
1391             "\u06B3"
1392           ],
1393           "isolated": "\uFB96",
1394           "final": "\uFB97",
1395           "initial": "\uFB98",
1396           "medial": "\uFB99"
1397         },
1398         "noon ghunna": {
1399           "normal": [
1400             "\u06BA"
1401           ],
1402           "isolated": "\uFB9E",
1403           "final": "\uFB9F"
1404         },
1405         "rnoon": {
1406           "normal": [
1407             "\u06BB"
1408           ],
1409           "isolated": "\uFBA0",
1410           "final": "\uFBA1",
1411           "initial": "\uFBA2",
1412           "medial": "\uFBA3"
1413         },
1414         "heh doachashmee": {
1415           "normal": [
1416             "\u06BE"
1417           ],
1418           "isolated": "\uFBAA",
1419           "final": "\uFBAB",
1420           "initial": "\uFBAC",
1421           "medial": "\uFBAD"
1422         },
1423         "heh goal": {
1424           "normal": [
1425             "\u06C1"
1426           ],
1427           "hamza_above": [
1428             "\u06C1\u0654",
1429             "\u06C2"
1430           ],
1431           "isolated": "\uFBA6",
1432           "final": "\uFBA7",
1433           "initial": "\uFBA8",
1434           "medial": "\uFBA9"
1435         },
1436         "teh marbuta goal": {
1437           "normal": [
1438             "\u06C3"
1439           ]
1440         },
1441         "kirghiz oe": {
1442           "normal": [
1443             "\u06C5"
1444           ],
1445           "isolated": "\uFBE0",
1446           "final": "\uFBE1"
1447         },
1448         "oe": {
1449           "normal": [
1450             "\u06C6"
1451           ],
1452           "isolated": "\uFBD9",
1453           "final": "\uFBDA"
1454         },
1455         "u": {
1456           "normal": [
1457             "\u06C7"
1458           ],
1459           "hamza_above": {
1460             "normal": [
1461               "\u0677",
1462               "\u06C7\u0674"
1463             ],
1464             "isolated": "\uFBDD"
1465           },
1466           "isolated": "\uFBD7",
1467           "final": "\uFBD8"
1468         },
1469         "yu": {
1470           "normal": [
1471             "\u06C8"
1472           ],
1473           "isolated": "\uFBDB",
1474           "final": "\uFBDC"
1475         },
1476         "kirghiz yu": {
1477           "normal": [
1478             "\u06C9"
1479           ],
1480           "isolated": "\uFBE2",
1481           "final": "\uFBE3"
1482         },
1483         "ve": {
1484           "normal": [
1485             "\u06CB"
1486           ],
1487           "isolated": "\uFBDE",
1488           "final": "\uFBDF"
1489         },
1490         "farsi yeh": {
1491           "normal": [
1492             "\u06CC"
1493           ],
1494           "indic_two_above": [
1495             "\u0775"
1496           ],
1497           "indic_three_above": [
1498             "\u0776"
1499           ],
1500           "indic_four_above": [
1501             "\u0777"
1502           ],
1503           "isolated": "\uFBFC",
1504           "final": "\uFBFD",
1505           "initial": "\uFBFE",
1506           "medial": "\uFBFF"
1507         },
1508         "e": {
1509           "normal": [
1510             "\u06D0"
1511           ],
1512           "isolated": "\uFBE4",
1513           "final": "\uFBE5",
1514           "initial": "\uFBE6",
1515           "medial": "\uFBE7"
1516         },
1517         "yeh barree": {
1518           "normal": [
1519             "\u06D2"
1520           ],
1521           "hamza_above": {
1522             "normal": [
1523               "\u06D2\u0654",
1524               "\u06D3"
1525             ],
1526             "isolated": "\uFBB0",
1527             "final": "\uFBB1"
1528           },
1529           "indic_two_above": [
1530             "\u077A"
1531           ],
1532           "indic_three_above": [
1533             "\u077B"
1534           ],
1535           "isolated": "\uFBAE",
1536           "final": "\uFBAF"
1537         },
1538         "ae": {
1539           "normal": [
1540             "\u06D5"
1541           ],
1542           "isolated": "\u06D5",
1543           "final": "\uFEEA",
1544           "yeh_above": {
1545             "normal": [
1546               "\u06C0",
1547               "\u06D5\u0654"
1548             ],
1549             "isolated": "\uFBA4",
1550             "final": "\uFBA5"
1551           }
1552         },
1553         "rohingya yeh": {
1554           "normal": [
1555             "\u08AC"
1556           ]
1557         },
1558         "low alef": {
1559           "normal": [
1560             "\u08AD"
1561           ]
1562         },
1563         "straight waw": {
1564           "normal": [
1565             "\u08B1"
1566           ]
1567         },
1568         "african feh": {
1569           "normal": [
1570             "\u08BB"
1571           ]
1572         },
1573         "african qaf": {
1574           "normal": [
1575             "\u08BC"
1576           ]
1577         },
1578         "african noon": {
1579           "normal": [
1580             "\u08BD"
1581           ]
1582         }
1583       };
1584       exports2.default = arabicReference;
1585     }
1586   });
1587
1588   // node_modules/alif-toolkit/lib/unicode-ligatures.js
1589   var require_unicode_ligatures = __commonJS({
1590     "node_modules/alif-toolkit/lib/unicode-ligatures.js"(exports2) {
1591       "use strict";
1592       Object.defineProperty(exports2, "__esModule", { value: true });
1593       var ligatureReference = {
1594         "\u0626\u0627": {
1595           "isolated": "\uFBEA",
1596           "final": "\uFBEB"
1597         },
1598         "\u0626\u06D5": {
1599           "isolated": "\uFBEC",
1600           "final": "\uFBED"
1601         },
1602         "\u0626\u0648": {
1603           "isolated": "\uFBEE",
1604           "final": "\uFBEF"
1605         },
1606         "\u0626\u06C7": {
1607           "isolated": "\uFBF0",
1608           "final": "\uFBF1"
1609         },
1610         "\u0626\u06C6": {
1611           "isolated": "\uFBF2",
1612           "final": "\uFBF3"
1613         },
1614         "\u0626\u06C8": {
1615           "isolated": "\uFBF4",
1616           "final": "\uFBF5"
1617         },
1618         "\u0626\u06D0": {
1619           "isolated": "\uFBF6",
1620           "final": "\uFBF7",
1621           "initial": "\uFBF8"
1622         },
1623         "\u0626\u0649": {
1624           "uighur_kirghiz": {
1625             "isolated": "\uFBF9",
1626             "final": "\uFBFA",
1627             "initial": "\uFBFB"
1628           },
1629           "isolated": "\uFC03",
1630           "final": "\uFC68"
1631         },
1632         "\u0626\u062C": {
1633           "isolated": "\uFC00",
1634           "initial": "\uFC97"
1635         },
1636         "\u0626\u062D": {
1637           "isolated": "\uFC01",
1638           "initial": "\uFC98"
1639         },
1640         "\u0626\u0645": {
1641           "isolated": "\uFC02",
1642           "final": "\uFC66",
1643           "initial": "\uFC9A",
1644           "medial": "\uFCDF"
1645         },
1646         "\u0626\u064A": {
1647           "isolated": "\uFC04",
1648           "final": "\uFC69"
1649         },
1650         "\u0628\u062C": {
1651           "isolated": "\uFC05",
1652           "initial": "\uFC9C"
1653         },
1654         "\u0628\u062D": {
1655           "isolated": "\uFC06",
1656           "initial": "\uFC9D"
1657         },
1658         "\u0628\u062E": {
1659           "isolated": "\uFC07",
1660           "initial": "\uFC9E"
1661         },
1662         "\u0628\u0645": {
1663           "isolated": "\uFC08",
1664           "final": "\uFC6C",
1665           "initial": "\uFC9F",
1666           "medial": "\uFCE1"
1667         },
1668         "\u0628\u0649": {
1669           "isolated": "\uFC09",
1670           "final": "\uFC6E"
1671         },
1672         "\u0628\u064A": {
1673           "isolated": "\uFC0A",
1674           "final": "\uFC6F"
1675         },
1676         "\u062A\u062C": {
1677           "isolated": "\uFC0B",
1678           "initial": "\uFCA1"
1679         },
1680         "\u062A\u062D": {
1681           "isolated": "\uFC0C",
1682           "initial": "\uFCA2"
1683         },
1684         "\u062A\u062E": {
1685           "isolated": "\uFC0D",
1686           "initial": "\uFCA3"
1687         },
1688         "\u062A\u0645": {
1689           "isolated": "\uFC0E",
1690           "final": "\uFC72",
1691           "initial": "\uFCA4",
1692           "medial": "\uFCE3"
1693         },
1694         "\u062A\u0649": {
1695           "isolated": "\uFC0F",
1696           "final": "\uFC74"
1697         },
1698         "\u062A\u064A": {
1699           "isolated": "\uFC10",
1700           "final": "\uFC75"
1701         },
1702         "\u062B\u062C": {
1703           "isolated": "\uFC11"
1704         },
1705         "\u062B\u0645": {
1706           "isolated": "\uFC12",
1707           "final": "\uFC78",
1708           "initial": "\uFCA6",
1709           "medial": "\uFCE5"
1710         },
1711         "\u062B\u0649": {
1712           "isolated": "\uFC13",
1713           "final": "\uFC7A"
1714         },
1715         "\u062B\u0648": {
1716           "isolated": "\uFC14"
1717         },
1718         "\u062C\u062D": {
1719           "isolated": "\uFC15",
1720           "initial": "\uFCA7"
1721         },
1722         "\u062C\u0645": {
1723           "isolated": "\uFC16",
1724           "initial": "\uFCA8"
1725         },
1726         "\u062D\u062C": {
1727           "isolated": "\uFC17",
1728           "initial": "\uFCA9"
1729         },
1730         "\u062D\u0645": {
1731           "isolated": "\uFC18",
1732           "initial": "\uFCAA"
1733         },
1734         "\u062E\u062C": {
1735           "isolated": "\uFC19",
1736           "initial": "\uFCAB"
1737         },
1738         "\u062E\u062D": {
1739           "isolated": "\uFC1A"
1740         },
1741         "\u062E\u0645": {
1742           "isolated": "\uFC1B",
1743           "initial": "\uFCAC"
1744         },
1745         "\u0633\u062C": {
1746           "isolated": "\uFC1C",
1747           "initial": "\uFCAD",
1748           "medial": "\uFD34"
1749         },
1750         "\u0633\u062D": {
1751           "isolated": "\uFC1D",
1752           "initial": "\uFCAE",
1753           "medial": "\uFD35"
1754         },
1755         "\u0633\u062E": {
1756           "isolated": "\uFC1E",
1757           "initial": "\uFCAF",
1758           "medial": "\uFD36"
1759         },
1760         "\u0633\u0645": {
1761           "isolated": "\uFC1F",
1762           "initial": "\uFCB0",
1763           "medial": "\uFCE7"
1764         },
1765         "\u0635\u062D": {
1766           "isolated": "\uFC20",
1767           "initial": "\uFCB1"
1768         },
1769         "\u0635\u0645": {
1770           "isolated": "\uFC21",
1771           "initial": "\uFCB3"
1772         },
1773         "\u0636\u062C": {
1774           "isolated": "\uFC22",
1775           "initial": "\uFCB4"
1776         },
1777         "\u0636\u062D": {
1778           "isolated": "\uFC23",
1779           "initial": "\uFCB5"
1780         },
1781         "\u0636\u062E": {
1782           "isolated": "\uFC24",
1783           "initial": "\uFCB6"
1784         },
1785         "\u0636\u0645": {
1786           "isolated": "\uFC25",
1787           "initial": "\uFCB7"
1788         },
1789         "\u0637\u062D": {
1790           "isolated": "\uFC26",
1791           "initial": "\uFCB8"
1792         },
1793         "\u0637\u0645": {
1794           "isolated": "\uFC27",
1795           "initial": "\uFD33",
1796           "medial": "\uFD3A"
1797         },
1798         "\u0638\u0645": {
1799           "isolated": "\uFC28",
1800           "initial": "\uFCB9",
1801           "medial": "\uFD3B"
1802         },
1803         "\u0639\u062C": {
1804           "isolated": "\uFC29",
1805           "initial": "\uFCBA"
1806         },
1807         "\u0639\u0645": {
1808           "isolated": "\uFC2A",
1809           "initial": "\uFCBB"
1810         },
1811         "\u063A\u062C": {
1812           "isolated": "\uFC2B",
1813           "initial": "\uFCBC"
1814         },
1815         "\u063A\u0645": {
1816           "isolated": "\uFC2C",
1817           "initial": "\uFCBD"
1818         },
1819         "\u0641\u062C": {
1820           "isolated": "\uFC2D",
1821           "initial": "\uFCBE"
1822         },
1823         "\u0641\u062D": {
1824           "isolated": "\uFC2E",
1825           "initial": "\uFCBF"
1826         },
1827         "\u0641\u062E": {
1828           "isolated": "\uFC2F",
1829           "initial": "\uFCC0"
1830         },
1831         "\u0641\u0645": {
1832           "isolated": "\uFC30",
1833           "initial": "\uFCC1"
1834         },
1835         "\u0641\u0649": {
1836           "isolated": "\uFC31",
1837           "final": "\uFC7C"
1838         },
1839         "\u0641\u064A": {
1840           "isolated": "\uFC32",
1841           "final": "\uFC7D"
1842         },
1843         "\u0642\u062D": {
1844           "isolated": "\uFC33",
1845           "initial": "\uFCC2"
1846         },
1847         "\u0642\u0645": {
1848           "isolated": "\uFC34",
1849           "initial": "\uFCC3"
1850         },
1851         "\u0642\u0649": {
1852           "isolated": "\uFC35",
1853           "final": "\uFC7E"
1854         },
1855         "\u0642\u064A": {
1856           "isolated": "\uFC36",
1857           "final": "\uFC7F"
1858         },
1859         "\u0643\u0627": {
1860           "isolated": "\uFC37",
1861           "final": "\uFC80"
1862         },
1863         "\u0643\u062C": {
1864           "isolated": "\uFC38",
1865           "initial": "\uFCC4"
1866         },
1867         "\u0643\u062D": {
1868           "isolated": "\uFC39",
1869           "initial": "\uFCC5"
1870         },
1871         "\u0643\u062E": {
1872           "isolated": "\uFC3A",
1873           "initial": "\uFCC6"
1874         },
1875         "\u0643\u0644": {
1876           "isolated": "\uFC3B",
1877           "final": "\uFC81",
1878           "initial": "\uFCC7",
1879           "medial": "\uFCEB"
1880         },
1881         "\u0643\u0645": {
1882           "isolated": "\uFC3C",
1883           "final": "\uFC82",
1884           "initial": "\uFCC8",
1885           "medial": "\uFCEC"
1886         },
1887         "\u0643\u0649": {
1888           "isolated": "\uFC3D",
1889           "final": "\uFC83"
1890         },
1891         "\u0643\u064A": {
1892           "isolated": "\uFC3E",
1893           "final": "\uFC84"
1894         },
1895         "\u0644\u062C": {
1896           "isolated": "\uFC3F",
1897           "initial": "\uFCC9"
1898         },
1899         "\u0644\u062D": {
1900           "isolated": "\uFC40",
1901           "initial": "\uFCCA"
1902         },
1903         "\u0644\u062E": {
1904           "isolated": "\uFC41",
1905           "initial": "\uFCCB"
1906         },
1907         "\u0644\u0645": {
1908           "isolated": "\uFC42",
1909           "final": "\uFC85",
1910           "initial": "\uFCCC",
1911           "medial": "\uFCED"
1912         },
1913         "\u0644\u0649": {
1914           "isolated": "\uFC43",
1915           "final": "\uFC86"
1916         },
1917         "\u0644\u064A": {
1918           "isolated": "\uFC44",
1919           "final": "\uFC87"
1920         },
1921         "\u0645\u062C": {
1922           "isolated": "\uFC45",
1923           "initial": "\uFCCE"
1924         },
1925         "\u0645\u062D": {
1926           "isolated": "\uFC46",
1927           "initial": "\uFCCF"
1928         },
1929         "\u0645\u062E": {
1930           "isolated": "\uFC47",
1931           "initial": "\uFCD0"
1932         },
1933         "\u0645\u0645": {
1934           "isolated": "\uFC48",
1935           "final": "\uFC89",
1936           "initial": "\uFCD1"
1937         },
1938         "\u0645\u0649": {
1939           "isolated": "\uFC49"
1940         },
1941         "\u0645\u064A": {
1942           "isolated": "\uFC4A"
1943         },
1944         "\u0646\u062C": {
1945           "isolated": "\uFC4B",
1946           "initial": "\uFCD2"
1947         },
1948         "\u0646\u062D": {
1949           "isolated": "\uFC4C",
1950           "initial": "\uFCD3"
1951         },
1952         "\u0646\u062E": {
1953           "isolated": "\uFC4D",
1954           "initial": "\uFCD4"
1955         },
1956         "\u0646\u0645": {
1957           "isolated": "\uFC4E",
1958           "final": "\uFC8C",
1959           "initial": "\uFCD5",
1960           "medial": "\uFCEE"
1961         },
1962         "\u0646\u0649": {
1963           "isolated": "\uFC4F",
1964           "final": "\uFC8E"
1965         },
1966         "\u0646\u064A": {
1967           "isolated": "\uFC50",
1968           "final": "\uFC8F"
1969         },
1970         "\u0647\u062C": {
1971           "isolated": "\uFC51",
1972           "initial": "\uFCD7"
1973         },
1974         "\u0647\u0645": {
1975           "isolated": "\uFC52",
1976           "initial": "\uFCD8"
1977         },
1978         "\u0647\u0649": {
1979           "isolated": "\uFC53"
1980         },
1981         "\u0647\u064A": {
1982           "isolated": "\uFC54"
1983         },
1984         "\u064A\u062C": {
1985           "isolated": "\uFC55",
1986           "initial": "\uFCDA"
1987         },
1988         "\u064A\u062D": {
1989           "isolated": "\uFC56",
1990           "initial": "\uFCDB"
1991         },
1992         "\u064A\u062E": {
1993           "isolated": "\uFC57",
1994           "initial": "\uFCDC"
1995         },
1996         "\u064A\u0645": {
1997           "isolated": "\uFC58",
1998           "final": "\uFC93",
1999           "initial": "\uFCDD",
2000           "medial": "\uFCF0"
2001         },
2002         "\u064A\u0649": {
2003           "isolated": "\uFC59",
2004           "final": "\uFC95"
2005         },
2006         "\u064A\u064A": {
2007           "isolated": "\uFC5A",
2008           "final": "\uFC96"
2009         },
2010         "\u0630\u0670": {
2011           "isolated": "\uFC5B"
2012         },
2013         "\u0631\u0670": {
2014           "isolated": "\uFC5C"
2015         },
2016         "\u0649\u0670": {
2017           "isolated": "\uFC5D",
2018           "final": "\uFC90"
2019         },
2020         "\u064C\u0651": {
2021           "isolated": "\uFC5E"
2022         },
2023         "\u064D\u0651": {
2024           "isolated": "\uFC5F"
2025         },
2026         "\u064E\u0651": {
2027           "isolated": "\uFC60"
2028         },
2029         "\u064F\u0651": {
2030           "isolated": "\uFC61"
2031         },
2032         "\u0650\u0651": {
2033           "isolated": "\uFC62"
2034         },
2035         "\u0651\u0670": {
2036           "isolated": "\uFC63"
2037         },
2038         "\u0626\u0631": {
2039           "final": "\uFC64"
2040         },
2041         "\u0626\u0632": {
2042           "final": "\uFC65"
2043         },
2044         "\u0626\u0646": {
2045           "final": "\uFC67"
2046         },
2047         "\u0628\u0631": {
2048           "final": "\uFC6A"
2049         },
2050         "\u0628\u0632": {
2051           "final": "\uFC6B"
2052         },
2053         "\u0628\u0646": {
2054           "final": "\uFC6D"
2055         },
2056         "\u062A\u0631": {
2057           "final": "\uFC70"
2058         },
2059         "\u062A\u0632": {
2060           "final": "\uFC71"
2061         },
2062         "\u062A\u0646": {
2063           "final": "\uFC73"
2064         },
2065         "\u062B\u0631": {
2066           "final": "\uFC76"
2067         },
2068         "\u062B\u0632": {
2069           "final": "\uFC77"
2070         },
2071         "\u062B\u0646": {
2072           "final": "\uFC79"
2073         },
2074         "\u062B\u064A": {
2075           "final": "\uFC7B"
2076         },
2077         "\u0645\u0627": {
2078           "final": "\uFC88"
2079         },
2080         "\u0646\u0631": {
2081           "final": "\uFC8A"
2082         },
2083         "\u0646\u0632": {
2084           "final": "\uFC8B"
2085         },
2086         "\u0646\u0646": {
2087           "final": "\uFC8D"
2088         },
2089         "\u064A\u0631": {
2090           "final": "\uFC91"
2091         },
2092         "\u064A\u0632": {
2093           "final": "\uFC92"
2094         },
2095         "\u064A\u0646": {
2096           "final": "\uFC94"
2097         },
2098         "\u0626\u062E": {
2099           "initial": "\uFC99"
2100         },
2101         "\u0626\u0647": {
2102           "initial": "\uFC9B",
2103           "medial": "\uFCE0"
2104         },
2105         "\u0628\u0647": {
2106           "initial": "\uFCA0",
2107           "medial": "\uFCE2"
2108         },
2109         "\u062A\u0647": {
2110           "initial": "\uFCA5",
2111           "medial": "\uFCE4"
2112         },
2113         "\u0635\u062E": {
2114           "initial": "\uFCB2"
2115         },
2116         "\u0644\u0647": {
2117           "initial": "\uFCCD"
2118         },
2119         "\u0646\u0647": {
2120           "initial": "\uFCD6",
2121           "medial": "\uFCEF"
2122         },
2123         "\u0647\u0670": {
2124           "initial": "\uFCD9"
2125         },
2126         "\u064A\u0647": {
2127           "initial": "\uFCDE",
2128           "medial": "\uFCF1"
2129         },
2130         "\u062B\u0647": {
2131           "medial": "\uFCE6"
2132         },
2133         "\u0633\u0647": {
2134           "medial": "\uFCE8",
2135           "initial": "\uFD31"
2136         },
2137         "\u0634\u0645": {
2138           "medial": "\uFCE9",
2139           "isolated": "\uFD0C",
2140           "final": "\uFD28",
2141           "initial": "\uFD30"
2142         },
2143         "\u0634\u0647": {
2144           "medial": "\uFCEA",
2145           "initial": "\uFD32"
2146         },
2147         "\u0640\u064E\u0651": {
2148           "medial": "\uFCF2"
2149         },
2150         "\u0640\u064F\u0651": {
2151           "medial": "\uFCF3"
2152         },
2153         "\u0640\u0650\u0651": {
2154           "medial": "\uFCF4"
2155         },
2156         "\u0637\u0649": {
2157           "isolated": "\uFCF5",
2158           "final": "\uFD11"
2159         },
2160         "\u0637\u064A": {
2161           "isolated": "\uFCF6",
2162           "final": "\uFD12"
2163         },
2164         "\u0639\u0649": {
2165           "isolated": "\uFCF7",
2166           "final": "\uFD13"
2167         },
2168         "\u0639\u064A": {
2169           "isolated": "\uFCF8",
2170           "final": "\uFD14"
2171         },
2172         "\u063A\u0649": {
2173           "isolated": "\uFCF9",
2174           "final": "\uFD15"
2175         },
2176         "\u063A\u064A": {
2177           "isolated": "\uFCFA",
2178           "final": "\uFD16"
2179         },
2180         "\u0633\u0649": {
2181           "isolated": "\uFCFB"
2182         },
2183         "\u0633\u064A": {
2184           "isolated": "\uFCFC",
2185           "final": "\uFD18"
2186         },
2187         "\u0634\u0649": {
2188           "isolated": "\uFCFD",
2189           "final": "\uFD19"
2190         },
2191         "\u0634\u064A": {
2192           "isolated": "\uFCFE",
2193           "final": "\uFD1A"
2194         },
2195         "\u062D\u0649": {
2196           "isolated": "\uFCFF",
2197           "final": "\uFD1B"
2198         },
2199         "\u062D\u064A": {
2200           "isolated": "\uFD00",
2201           "final": "\uFD1C"
2202         },
2203         "\u062C\u0649": {
2204           "isolated": "\uFD01",
2205           "final": "\uFD1D"
2206         },
2207         "\u062C\u064A": {
2208           "isolated": "\uFD02",
2209           "final": "\uFD1E"
2210         },
2211         "\u062E\u0649": {
2212           "isolated": "\uFD03",
2213           "final": "\uFD1F"
2214         },
2215         "\u062E\u064A": {
2216           "isolated": "\uFD04",
2217           "final": "\uFD20"
2218         },
2219         "\u0635\u0649": {
2220           "isolated": "\uFD05",
2221           "final": "\uFD21"
2222         },
2223         "\u0635\u064A": {
2224           "isolated": "\uFD06",
2225           "final": "\uFD22"
2226         },
2227         "\u0636\u0649": {
2228           "isolated": "\uFD07",
2229           "final": "\uFD23"
2230         },
2231         "\u0636\u064A": {
2232           "isolated": "\uFD08",
2233           "final": "\uFD24"
2234         },
2235         "\u0634\u062C": {
2236           "isolated": "\uFD09",
2237           "final": "\uFD25",
2238           "initial": "\uFD2D",
2239           "medial": "\uFD37"
2240         },
2241         "\u0634\u062D": {
2242           "isolated": "\uFD0A",
2243           "final": "\uFD26",
2244           "initial": "\uFD2E",
2245           "medial": "\uFD38"
2246         },
2247         "\u0634\u062E": {
2248           "isolated": "\uFD0B",
2249           "final": "\uFD27",
2250           "initial": "\uFD2F",
2251           "medial": "\uFD39"
2252         },
2253         "\u0634\u0631": {
2254           "isolated": "\uFD0D",
2255           "final": "\uFD29"
2256         },
2257         "\u0633\u0631": {
2258           "isolated": "\uFD0E",
2259           "final": "\uFD2A"
2260         },
2261         "\u0635\u0631": {
2262           "isolated": "\uFD0F",
2263           "final": "\uFD2B"
2264         },
2265         "\u0636\u0631": {
2266           "isolated": "\uFD10",
2267           "final": "\uFD2C"
2268         },
2269         "\u0633\u0639": {
2270           "final": "\uFD17"
2271         },
2272         "\u062A\u062C\u0645": {
2273           "initial": "\uFD50"
2274         },
2275         "\u062A\u062D\u062C": {
2276           "final": "\uFD51",
2277           "initial": "\uFD52"
2278         },
2279         "\u062A\u062D\u0645": {
2280           "initial": "\uFD53"
2281         },
2282         "\u062A\u062E\u0645": {
2283           "initial": "\uFD54"
2284         },
2285         "\u062A\u0645\u062C": {
2286           "initial": "\uFD55"
2287         },
2288         "\u062A\u0645\u062D": {
2289           "initial": "\uFD56"
2290         },
2291         "\u062A\u0645\u062E": {
2292           "initial": "\uFD57"
2293         },
2294         "\u062C\u0645\u062D": {
2295           "final": "\uFD58",
2296           "initial": "\uFD59"
2297         },
2298         "\u062D\u0645\u064A": {
2299           "final": "\uFD5A"
2300         },
2301         "\u062D\u0645\u0649": {
2302           "final": "\uFD5B"
2303         },
2304         "\u0633\u062D\u062C": {
2305           "initial": "\uFD5C"
2306         },
2307         "\u0633\u062C\u062D": {
2308           "initial": "\uFD5D"
2309         },
2310         "\u0633\u062C\u0649": {
2311           "final": "\uFD5E"
2312         },
2313         "\u0633\u0645\u062D": {
2314           "final": "\uFD5F",
2315           "initial": "\uFD60"
2316         },
2317         "\u0633\u0645\u062C": {
2318           "initial": "\uFD61"
2319         },
2320         "\u0633\u0645\u0645": {
2321           "final": "\uFD62",
2322           "initial": "\uFD63"
2323         },
2324         "\u0635\u062D\u062D": {
2325           "final": "\uFD64",
2326           "initial": "\uFD65"
2327         },
2328         "\u0635\u0645\u0645": {
2329           "final": "\uFD66",
2330           "initial": "\uFDC5"
2331         },
2332         "\u0634\u062D\u0645": {
2333           "final": "\uFD67",
2334           "initial": "\uFD68"
2335         },
2336         "\u0634\u062C\u064A": {
2337           "final": "\uFD69"
2338         },
2339         "\u0634\u0645\u062E": {
2340           "final": "\uFD6A",
2341           "initial": "\uFD6B"
2342         },
2343         "\u0634\u0645\u0645": {
2344           "final": "\uFD6C",
2345           "initial": "\uFD6D"
2346         },
2347         "\u0636\u062D\u0649": {
2348           "final": "\uFD6E"
2349         },
2350         "\u0636\u062E\u0645": {
2351           "final": "\uFD6F",
2352           "initial": "\uFD70"
2353         },
2354         "\u0636\u0645\u062D": {
2355           "final": "\uFD71"
2356         },
2357         "\u0637\u0645\u062D": {
2358           "initial": "\uFD72"
2359         },
2360         "\u0637\u0645\u0645": {
2361           "initial": "\uFD73"
2362         },
2363         "\u0637\u0645\u064A": {
2364           "final": "\uFD74"
2365         },
2366         "\u0639\u062C\u0645": {
2367           "final": "\uFD75",
2368           "initial": "\uFDC4"
2369         },
2370         "\u0639\u0645\u0645": {
2371           "final": "\uFD76",
2372           "initial": "\uFD77"
2373         },
2374         "\u0639\u0645\u0649": {
2375           "final": "\uFD78"
2376         },
2377         "\u063A\u0645\u0645": {
2378           "final": "\uFD79"
2379         },
2380         "\u063A\u0645\u064A": {
2381           "final": "\uFD7A"
2382         },
2383         "\u063A\u0645\u0649": {
2384           "final": "\uFD7B"
2385         },
2386         "\u0641\u062E\u0645": {
2387           "final": "\uFD7C",
2388           "initial": "\uFD7D"
2389         },
2390         "\u0642\u0645\u062D": {
2391           "final": "\uFD7E",
2392           "initial": "\uFDB4"
2393         },
2394         "\u0642\u0645\u0645": {
2395           "final": "\uFD7F"
2396         },
2397         "\u0644\u062D\u0645": {
2398           "final": "\uFD80",
2399           "initial": "\uFDB5"
2400         },
2401         "\u0644\u062D\u064A": {
2402           "final": "\uFD81"
2403         },
2404         "\u0644\u062D\u0649": {
2405           "final": "\uFD82"
2406         },
2407         "\u0644\u062C\u062C": {
2408           "initial": "\uFD83",
2409           "final": "\uFD84"
2410         },
2411         "\u0644\u062E\u0645": {
2412           "final": "\uFD85",
2413           "initial": "\uFD86"
2414         },
2415         "\u0644\u0645\u062D": {
2416           "final": "\uFD87",
2417           "initial": "\uFD88"
2418         },
2419         "\u0645\u062D\u062C": {
2420           "initial": "\uFD89"
2421         },
2422         "\u0645\u062D\u0645": {
2423           "initial": "\uFD8A"
2424         },
2425         "\u0645\u062D\u064A": {
2426           "final": "\uFD8B"
2427         },
2428         "\u0645\u062C\u062D": {
2429           "initial": "\uFD8C"
2430         },
2431         "\u0645\u062C\u0645": {
2432           "initial": "\uFD8D"
2433         },
2434         "\u0645\u062E\u062C": {
2435           "initial": "\uFD8E"
2436         },
2437         "\u0645\u062E\u0645": {
2438           "initial": "\uFD8F"
2439         },
2440         "\u0645\u062C\u062E": {
2441           "initial": "\uFD92"
2442         },
2443         "\u0647\u0645\u062C": {
2444           "initial": "\uFD93"
2445         },
2446         "\u0647\u0645\u0645": {
2447           "initial": "\uFD94"
2448         },
2449         "\u0646\u062D\u0645": {
2450           "initial": "\uFD95"
2451         },
2452         "\u0646\u062D\u0649": {
2453           "final": "\uFD96"
2454         },
2455         "\u0646\u062C\u0645": {
2456           "final": "\uFD97",
2457           "initial": "\uFD98"
2458         },
2459         "\u0646\u062C\u0649": {
2460           "final": "\uFD99"
2461         },
2462         "\u0646\u0645\u064A": {
2463           "final": "\uFD9A"
2464         },
2465         "\u0646\u0645\u0649": {
2466           "final": "\uFD9B"
2467         },
2468         "\u064A\u0645\u0645": {
2469           "final": "\uFD9C",
2470           "initial": "\uFD9D"
2471         },
2472         "\u0628\u062E\u064A": {
2473           "final": "\uFD9E"
2474         },
2475         "\u062A\u062C\u064A": {
2476           "final": "\uFD9F"
2477         },
2478         "\u062A\u062C\u0649": {
2479           "final": "\uFDA0"
2480         },
2481         "\u062A\u062E\u064A": {
2482           "final": "\uFDA1"
2483         },
2484         "\u062A\u062E\u0649": {
2485           "final": "\uFDA2"
2486         },
2487         "\u062A\u0645\u064A": {
2488           "final": "\uFDA3"
2489         },
2490         "\u062A\u0645\u0649": {
2491           "final": "\uFDA4"
2492         },
2493         "\u062C\u0645\u064A": {
2494           "final": "\uFDA5"
2495         },
2496         "\u062C\u062D\u0649": {
2497           "final": "\uFDA6"
2498         },
2499         "\u062C\u0645\u0649": {
2500           "final": "\uFDA7"
2501         },
2502         "\u0633\u062E\u0649": {
2503           "final": "\uFDA8"
2504         },
2505         "\u0635\u062D\u064A": {
2506           "final": "\uFDA9"
2507         },
2508         "\u0634\u062D\u064A": {
2509           "final": "\uFDAA"
2510         },
2511         "\u0636\u062D\u064A": {
2512           "final": "\uFDAB"
2513         },
2514         "\u0644\u062C\u064A": {
2515           "final": "\uFDAC"
2516         },
2517         "\u0644\u0645\u064A": {
2518           "final": "\uFDAD"
2519         },
2520         "\u064A\u062D\u064A": {
2521           "final": "\uFDAE"
2522         },
2523         "\u064A\u062C\u064A": {
2524           "final": "\uFDAF"
2525         },
2526         "\u064A\u0645\u064A": {
2527           "final": "\uFDB0"
2528         },
2529         "\u0645\u0645\u064A": {
2530           "final": "\uFDB1"
2531         },
2532         "\u0642\u0645\u064A": {
2533           "final": "\uFDB2"
2534         },
2535         "\u0646\u062D\u064A": {
2536           "final": "\uFDB3"
2537         },
2538         "\u0639\u0645\u064A": {
2539           "final": "\uFDB6"
2540         },
2541         "\u0643\u0645\u064A": {
2542           "final": "\uFDB7"
2543         },
2544         "\u0646\u062C\u062D": {
2545           "initial": "\uFDB8",
2546           "final": "\uFDBD"
2547         },
2548         "\u0645\u062E\u064A": {
2549           "final": "\uFDB9"
2550         },
2551         "\u0644\u062C\u0645": {
2552           "initial": "\uFDBA",
2553           "final": "\uFDBC"
2554         },
2555         "\u0643\u0645\u0645": {
2556           "final": "\uFDBB",
2557           "initial": "\uFDC3"
2558         },
2559         "\u062C\u062D\u064A": {
2560           "final": "\uFDBE"
2561         },
2562         "\u062D\u062C\u064A": {
2563           "final": "\uFDBF"
2564         },
2565         "\u0645\u062C\u064A": {
2566           "final": "\uFDC0"
2567         },
2568         "\u0641\u0645\u064A": {
2569           "final": "\uFDC1"
2570         },
2571         "\u0628\u062D\u064A": {
2572           "final": "\uFDC2"
2573         },
2574         "\u0633\u062E\u064A": {
2575           "final": "\uFDC6"
2576         },
2577         "\u0646\u062C\u064A": {
2578           "final": "\uFDC7"
2579         },
2580         "\u0644\u0622": {
2581           "isolated": "\uFEF5",
2582           "final": "\uFEF6"
2583         },
2584         "\u0644\u0623": {
2585           "isolated": "\uFEF7",
2586           "final": "\uFEF8"
2587         },
2588         "\u0644\u0625": {
2589           "isolated": "\uFEF9",
2590           "final": "\uFEFA"
2591         },
2592         "\u0644\u0627": {
2593           "isolated": "\uFEFB",
2594           "final": "\uFEFC"
2595         },
2596         "words": {
2597           "\u0635\u0644\u06D2": "\uFDF0",
2598           "\u0642\u0644\u06D2": "\uFDF1",
2599           "\u0627\u0644\u0644\u0647": "\uFDF2",
2600           "\u0627\u0643\u0628\u0631": "\uFDF3",
2601           "\u0645\u062D\u0645\u062F": "\uFDF4",
2602           "\u0635\u0644\u0639\u0645": "\uFDF5",
2603           "\u0631\u0633\u0648\u0644": "\uFDF6",
2604           "\u0639\u0644\u064A\u0647": "\uFDF7",
2605           "\u0648\u0633\u0644\u0645": "\uFDF8",
2606           "\u0635\u0644\u0649": "\uFDF9",
2607           "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
2608           "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
2609           "\u0631\u06CC\u0627\u0644": "\uFDFC"
2610         }
2611       };
2612       exports2.default = ligatureReference;
2613     }
2614   });
2615
2616   // node_modules/alif-toolkit/lib/reference.js
2617   var require_reference = __commonJS({
2618     "node_modules/alif-toolkit/lib/reference.js"(exports2) {
2619       "use strict";
2620       Object.defineProperty(exports2, "__esModule", { value: true });
2621       var unicode_arabic_1 = require_unicode_arabic();
2622       var unicode_ligatures_1 = require_unicode_ligatures();
2623       var letterList = Object.keys(unicode_arabic_1.default);
2624       exports2.letterList = letterList;
2625       var ligatureList = Object.keys(unicode_ligatures_1.default);
2626       exports2.ligatureList = ligatureList;
2627       var ligatureWordList = Object.keys(unicode_ligatures_1.default.words);
2628       exports2.ligatureWordList = ligatureWordList;
2629       var lams = "\u0644\u06B5\u06B6\u06B7\u06B8";
2630       exports2.lams = lams;
2631       var alefs = "\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774";
2632       exports2.alefs = alefs;
2633       var tashkeel = "\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8";
2634       exports2.tashkeel = tashkeel;
2635       function addToTashkeel(start2, finish) {
2636         for (var i2 = start2; i2 <= finish; i2++) {
2637           exports2.tashkeel = tashkeel += String.fromCharCode(i2);
2638         }
2639       }
2640       addToTashkeel(1552, 1562);
2641       addToTashkeel(1611, 1631);
2642       addToTashkeel(1750, 1756);
2643       addToTashkeel(1760, 1764);
2644       addToTashkeel(1770, 1773);
2645       addToTashkeel(2259, 2273);
2646       addToTashkeel(2275, 2303);
2647       addToTashkeel(65136, 65151);
2648       var lineBreakers = "\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9";
2649       exports2.lineBreakers = lineBreakers;
2650       function addToLineBreakers(start2, finish) {
2651         for (var i2 = start2; i2 <= finish; i2++) {
2652           exports2.lineBreakers = lineBreakers += String.fromCharCode(i2);
2653         }
2654       }
2655       addToLineBreakers(1536, 1567);
2656       addToLineBreakers(1569, 1573);
2657       addToLineBreakers(1583, 1586);
2658       addToLineBreakers(1632, 1645);
2659       addToLineBreakers(1649, 1655);
2660       addToLineBreakers(1672, 1689);
2661       addToLineBreakers(1731, 1739);
2662       addToLineBreakers(1746, 1785);
2663       addToLineBreakers(1881, 1883);
2664       addToLineBreakers(2218, 2222);
2665       addToLineBreakers(64336, 65021);
2666       addToLineBreakers(65152, 65276);
2667       addToLineBreakers(69216, 69247);
2668       addToLineBreakers(126064, 126143);
2669       addToLineBreakers(126464, 126719);
2670     }
2671   });
2672
2673   // node_modules/alif-toolkit/lib/GlyphSplitter.js
2674   var require_GlyphSplitter = __commonJS({
2675     "node_modules/alif-toolkit/lib/GlyphSplitter.js"(exports2) {
2676       "use strict";
2677       Object.defineProperty(exports2, "__esModule", { value: true });
2678       var isArabic_1 = require_isArabic();
2679       var reference_1 = require_reference();
2680       function GlyphSplitter(word) {
2681         let letters = [];
2682         let lastLetter = "";
2683         word.split("").forEach((letter) => {
2684           if (isArabic_1.isArabic(letter)) {
2685             if (reference_1.tashkeel.indexOf(letter) > -1) {
2686               letters[letters.length - 1] += letter;
2687             } else if (lastLetter.length && (reference_1.lams.indexOf(lastLetter) === 0 && reference_1.alefs.indexOf(letter) > -1 || reference_1.lams.indexOf(lastLetter) > 0 && reference_1.alefs.indexOf(letter) === 0)) {
2688               letters[letters.length - 1] += letter;
2689             } else {
2690               letters.push(letter);
2691             }
2692           } else {
2693             letters.push(letter);
2694           }
2695           if (reference_1.tashkeel.indexOf(letter) === -1) {
2696             lastLetter = letter;
2697           }
2698         });
2699         return letters;
2700       }
2701       exports2.GlyphSplitter = GlyphSplitter;
2702     }
2703   });
2704
2705   // node_modules/alif-toolkit/lib/BaselineSplitter.js
2706   var require_BaselineSplitter = __commonJS({
2707     "node_modules/alif-toolkit/lib/BaselineSplitter.js"(exports2) {
2708       "use strict";
2709       Object.defineProperty(exports2, "__esModule", { value: true });
2710       var isArabic_1 = require_isArabic();
2711       var reference_1 = require_reference();
2712       function BaselineSplitter(word) {
2713         let letters = [];
2714         let lastLetter = "";
2715         word.split("").forEach((letter) => {
2716           if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
2717             if (lastLetter.length && reference_1.tashkeel.indexOf(letter) > -1) {
2718               letters[letters.length - 1] += letter;
2719             } else if (reference_1.lineBreakers.indexOf(lastLetter) > -1) {
2720               letters.push(letter);
2721             } else {
2722               letters[letters.length - 1] += letter;
2723             }
2724           } else {
2725             letters.push(letter);
2726           }
2727           if (reference_1.tashkeel.indexOf(letter) === -1) {
2728             lastLetter = letter;
2729           }
2730         });
2731         return letters;
2732       }
2733       exports2.BaselineSplitter = BaselineSplitter;
2734     }
2735   });
2736
2737   // node_modules/alif-toolkit/lib/Normalization.js
2738   var require_Normalization = __commonJS({
2739     "node_modules/alif-toolkit/lib/Normalization.js"(exports2) {
2740       "use strict";
2741       Object.defineProperty(exports2, "__esModule", { value: true });
2742       var unicode_arabic_1 = require_unicode_arabic();
2743       var unicode_ligatures_1 = require_unicode_ligatures();
2744       var isArabic_1 = require_isArabic();
2745       var reference_1 = require_reference();
2746       function Normal(word, breakPresentationForm) {
2747         if (typeof breakPresentationForm === "undefined") {
2748           breakPresentationForm = true;
2749         }
2750         let returnable = "";
2751         word.split("").forEach((letter) => {
2752           if (!isArabic_1.isArabic(letter)) {
2753             returnable += letter;
2754             return;
2755           }
2756           for (let w = 0; w < reference_1.letterList.length; w++) {
2757             let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
2758             let versions = Object.keys(letterForms);
2759             for (let v = 0; v < versions.length; v++) {
2760               let localVersion = letterForms[versions[v]];
2761               if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
2762                 let embeddedForms = Object.keys(localVersion);
2763                 for (let ef = 0; ef < embeddedForms.length; ef++) {
2764                   let form = localVersion[embeddedForms[ef]];
2765                   if (form === letter || typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
2766                     if (form === letter) {
2767                       if (breakPresentationForm && localVersion["normal"] && ["isolated", "initial", "medial", "final"].indexOf(embeddedForms[ef]) > -1) {
2768                         if (typeof localVersion["normal"] === "object") {
2769                           returnable += localVersion["normal"][0];
2770                         } else {
2771                           returnable += localVersion["normal"];
2772                         }
2773                         return;
2774                       }
2775                       returnable += letter;
2776                       return;
2777                     } else if (typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
2778                       returnable += form[0];
2779                       return;
2780                     }
2781                   }
2782                 }
2783               } else if (localVersion === letter) {
2784                 if (breakPresentationForm && letterForms["normal"] && ["isolated", "initial", "medial", "final"].indexOf(versions[v]) > -1) {
2785                   if (typeof letterForms["normal"] === "object") {
2786                     returnable += letterForms["normal"][0];
2787                   } else {
2788                     returnable += letterForms["normal"];
2789                   }
2790                   return;
2791                 }
2792                 returnable += letter;
2793                 return;
2794               } else if (typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
2795                 returnable += localVersion[0];
2796                 return;
2797               }
2798             }
2799           }
2800           for (let v2 = 0; v2 < reference_1.ligatureList.length; v2++) {
2801             let normalForm = reference_1.ligatureList[v2];
2802             if (normalForm !== "words") {
2803               let ligForms = Object.keys(unicode_ligatures_1.default[normalForm]);
2804               for (let f2 = 0; f2 < ligForms.length; f2++) {
2805                 if (unicode_ligatures_1.default[normalForm][ligForms[f2]] === letter) {
2806                   returnable += normalForm;
2807                   return;
2808                 }
2809               }
2810             }
2811           }
2812           for (let v3 = 0; v3 < reference_1.ligatureWordList.length; v3++) {
2813             let normalForm = reference_1.ligatureWordList[v3];
2814             if (unicode_ligatures_1.default.words[normalForm] === letter) {
2815               returnable += normalForm;
2816               return;
2817             }
2818           }
2819           returnable += letter;
2820         });
2821         return returnable;
2822       }
2823       exports2.Normal = Normal;
2824     }
2825   });
2826
2827   // node_modules/alif-toolkit/lib/CharShaper.js
2828   var require_CharShaper = __commonJS({
2829     "node_modules/alif-toolkit/lib/CharShaper.js"(exports2) {
2830       "use strict";
2831       Object.defineProperty(exports2, "__esModule", { value: true });
2832       var unicode_arabic_1 = require_unicode_arabic();
2833       var isArabic_1 = require_isArabic();
2834       var reference_1 = require_reference();
2835       function CharShaper(letter, form) {
2836         if (!isArabic_1.isArabic(letter)) {
2837           throw new Error("Not Arabic");
2838         }
2839         if (letter === "\u0621") {
2840           return "\u0621";
2841         }
2842         for (let w = 0; w < reference_1.letterList.length; w++) {
2843           let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
2844           let versions = Object.keys(letterForms);
2845           for (let v = 0; v < versions.length; v++) {
2846             let localVersion = letterForms[versions[v]];
2847             if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
2848               if (versions.indexOf(form) > -1) {
2849                 return letterForms[form];
2850               }
2851             } else if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
2852               let embeddedVersions = Object.keys(localVersion);
2853               for (let ev = 0; ev < embeddedVersions.length; ev++) {
2854                 if (localVersion[embeddedVersions[ev]] === letter || typeof localVersion[embeddedVersions[ev]] === "object" && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1) {
2855                   if (embeddedVersions.indexOf(form) > -1) {
2856                     return localVersion[form];
2857                   }
2858                 }
2859               }
2860             }
2861           }
2862         }
2863       }
2864       exports2.CharShaper = CharShaper;
2865     }
2866   });
2867
2868   // node_modules/alif-toolkit/lib/WordShaper.js
2869   var require_WordShaper = __commonJS({
2870     "node_modules/alif-toolkit/lib/WordShaper.js"(exports2) {
2871       "use strict";
2872       Object.defineProperty(exports2, "__esModule", { value: true });
2873       var isArabic_1 = require_isArabic();
2874       var reference_1 = require_reference();
2875       var CharShaper_1 = require_CharShaper();
2876       var unicode_ligatures_1 = require_unicode_ligatures();
2877       function WordShaper2(word) {
2878         let state = "initial";
2879         let output = "";
2880         for (let w = 0; w < word.length; w++) {
2881           let nextLetter = " ";
2882           for (let nxw = w + 1; nxw < word.length; nxw++) {
2883             if (!isArabic_1.isArabic(word[nxw])) {
2884               break;
2885             }
2886             if (reference_1.tashkeel.indexOf(word[nxw]) === -1) {
2887               nextLetter = word[nxw];
2888               break;
2889             }
2890           }
2891           if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
2892             output += word[w];
2893             state = "initial";
2894           } else if (reference_1.tashkeel.indexOf(word[w]) > -1) {
2895             output += word[w];
2896           } else if (nextLetter === " " || reference_1.lineBreakers.indexOf(word[w]) > -1) {
2897             output += CharShaper_1.CharShaper(word[w], state === "initial" ? "isolated" : "final");
2898             state = "initial";
2899           } else if (reference_1.lams.indexOf(word[w]) > -1 && reference_1.alefs.indexOf(nextLetter) > -1) {
2900             output += unicode_ligatures_1.default[word[w] + nextLetter][state === "initial" ? "isolated" : "final"];
2901             while (word[w] !== nextLetter) {
2902               w++;
2903             }
2904             state = "initial";
2905           } else {
2906             output += CharShaper_1.CharShaper(word[w], state);
2907             state = "medial";
2908           }
2909         }
2910         return output;
2911       }
2912       exports2.WordShaper = WordShaper2;
2913     }
2914   });
2915
2916   // node_modules/alif-toolkit/lib/ParentLetter.js
2917   var require_ParentLetter = __commonJS({
2918     "node_modules/alif-toolkit/lib/ParentLetter.js"(exports2) {
2919       "use strict";
2920       Object.defineProperty(exports2, "__esModule", { value: true });
2921       var unicode_arabic_1 = require_unicode_arabic();
2922       var isArabic_1 = require_isArabic();
2923       var reference_1 = require_reference();
2924       function ParentLetter(letter) {
2925         if (!isArabic_1.isArabic(letter)) {
2926           throw new Error("Not an Arabic letter");
2927         }
2928         for (let w = 0; w < reference_1.letterList.length; w++) {
2929           let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
2930           let versions = Object.keys(letterForms);
2931           for (let v = 0; v < versions.length; v++) {
2932             let localVersion = letterForms[versions[v]];
2933             if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
2934               let embeddedForms = Object.keys(localVersion);
2935               for (let ef = 0; ef < embeddedForms.length; ef++) {
2936                 let form = localVersion[embeddedForms[ef]];
2937                 if (form === letter || typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
2938                   return localVersion;
2939                 }
2940               }
2941             } else if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
2942               return letterForms;
2943             }
2944           }
2945           return null;
2946         }
2947       }
2948       exports2.ParentLetter = ParentLetter;
2949       function GrandparentLetter(letter) {
2950         if (!isArabic_1.isArabic(letter)) {
2951           throw new Error("Not an Arabic letter");
2952         }
2953         for (let w = 0; w < reference_1.letterList.length; w++) {
2954           let letterForms = unicode_arabic_1.default[reference_1.letterList[w]];
2955           let versions = Object.keys(letterForms);
2956           for (let v = 0; v < versions.length; v++) {
2957             let localVersion = letterForms[versions[v]];
2958             if (typeof localVersion === "object" && typeof localVersion.indexOf === "undefined") {
2959               let embeddedForms = Object.keys(localVersion);
2960               for (let ef = 0; ef < embeddedForms.length; ef++) {
2961                 let form = localVersion[embeddedForms[ef]];
2962                 if (form === letter || typeof form === "object" && form.indexOf && form.indexOf(letter) > -1) {
2963                   return letterForms;
2964                 }
2965               }
2966             } else if (localVersion === letter || typeof localVersion === "object" && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
2967               return letterForms;
2968             }
2969           }
2970           return null;
2971         }
2972       }
2973       exports2.GrandparentLetter = GrandparentLetter;
2974     }
2975   });
2976
2977   // node_modules/alif-toolkit/lib/index.js
2978   var require_lib = __commonJS({
2979     "node_modules/alif-toolkit/lib/index.js"(exports2) {
2980       "use strict";
2981       Object.defineProperty(exports2, "__esModule", { value: true });
2982       var isArabic_1 = require_isArabic();
2983       exports2.isArabic = isArabic_1.isArabic;
2984       var GlyphSplitter_1 = require_GlyphSplitter();
2985       exports2.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
2986       var BaselineSplitter_1 = require_BaselineSplitter();
2987       exports2.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
2988       var Normalization_1 = require_Normalization();
2989       exports2.Normal = Normalization_1.Normal;
2990       var CharShaper_1 = require_CharShaper();
2991       exports2.CharShaper = CharShaper_1.CharShaper;
2992       var WordShaper_1 = require_WordShaper();
2993       exports2.WordShaper = WordShaper_1.WordShaper;
2994       var ParentLetter_1 = require_ParentLetter();
2995       exports2.ParentLetter = ParentLetter_1.ParentLetter;
2996       exports2.GrandparentLetter = ParentLetter_1.GrandparentLetter;
2997     }
2998   });
2999
3000   // node_modules/vparse/index.js
3001   var require_vparse = __commonJS({
3002     "node_modules/vparse/index.js"(exports2, module2) {
3003       (function(window2) {
3004         "use strict";
3005         function parseVersion3(v) {
3006           var m = v.replace(/[^0-9.]/g, "").match(/[0-9]*\.|[0-9]+/g) || [];
3007           v = {
3008             major: +m[0] || 0,
3009             minor: +m[1] || 0,
3010             patch: +m[2] || 0,
3011             build: +m[3] || 0
3012           };
3013           v.isEmpty = !v.major && !v.minor && !v.patch && !v.build;
3014           v.parsed = [v.major, v.minor, v.patch, v.build];
3015           v.text = v.parsed.join(".");
3016           v.compare = compare;
3017           return v;
3018         }
3019         function compare(v) {
3020           if (typeof v === "string") {
3021             v = parseVersion3(v);
3022           }
3023           for (var i2 = 0; i2 < 4; i2++) {
3024             if (this.parsed[i2] !== v.parsed[i2]) {
3025               return this.parsed[i2] > v.parsed[i2] ? 1 : -1;
3026             }
3027           }
3028           return 0;
3029         }
3030         if (typeof module2 === "object" && module2 && typeof module2.exports === "object") {
3031           module2.exports = parseVersion3;
3032         } else {
3033           window2.parseVersion = parseVersion3;
3034         }
3035       })(exports2);
3036     }
3037   });
3038
3039   // node_modules/which-polygon/node_modules/quickselect/quickselect.js
3040   var require_quickselect = __commonJS({
3041     "node_modules/which-polygon/node_modules/quickselect/quickselect.js"(exports2, module2) {
3042       (function(global3, factory) {
3043         typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global3.quickselect = factory();
3044       })(exports2, function() {
3045         "use strict";
3046         function quickselect2(arr, k, left, right, compare) {
3047           quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare);
3048         }
3049         function quickselectStep(arr, k, left, right, compare) {
3050           while (right > left) {
3051             if (right - left > 600) {
3052               var n2 = right - left + 1;
3053               var m = k - left + 1;
3054               var z = Math.log(n2);
3055               var s = 0.5 * Math.exp(2 * z / 3);
3056               var sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1);
3057               var newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd));
3058               var newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd));
3059               quickselectStep(arr, k, newLeft, newRight, compare);
3060             }
3061             var t = arr[k];
3062             var i2 = left;
3063             var j2 = right;
3064             swap2(arr, left, k);
3065             if (compare(arr[right], t) > 0)
3066               swap2(arr, left, right);
3067             while (i2 < j2) {
3068               swap2(arr, i2, j2);
3069               i2++;
3070               j2--;
3071               while (compare(arr[i2], t) < 0)
3072                 i2++;
3073               while (compare(arr[j2], t) > 0)
3074                 j2--;
3075             }
3076             if (compare(arr[left], t) === 0)
3077               swap2(arr, left, j2);
3078             else {
3079               j2++;
3080               swap2(arr, j2, right);
3081             }
3082             if (j2 <= k)
3083               left = j2 + 1;
3084             if (k <= j2)
3085               right = j2 - 1;
3086           }
3087         }
3088         function swap2(arr, i2, j2) {
3089           var tmp = arr[i2];
3090           arr[i2] = arr[j2];
3091           arr[j2] = tmp;
3092         }
3093         function defaultCompare(a, b) {
3094           return a < b ? -1 : a > b ? 1 : 0;
3095         }
3096         return quickselect2;
3097       });
3098     }
3099   });
3100
3101   // node_modules/which-polygon/node_modules/rbush/index.js
3102   var require_rbush = __commonJS({
3103     "node_modules/which-polygon/node_modules/rbush/index.js"(exports2, module2) {
3104       "use strict";
3105       module2.exports = rbush;
3106       module2.exports.default = rbush;
3107       var quickselect2 = require_quickselect();
3108       function rbush(maxEntries, format2) {
3109         if (!(this instanceof rbush))
3110           return new rbush(maxEntries, format2);
3111         this._maxEntries = Math.max(4, maxEntries || 9);
3112         this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
3113         if (format2) {
3114           this._initFormat(format2);
3115         }
3116         this.clear();
3117       }
3118       rbush.prototype = {
3119         all: function() {
3120           return this._all(this.data, []);
3121         },
3122         search: function(bbox2) {
3123           var node = this.data, result = [], toBBox = this.toBBox;
3124           if (!intersects(bbox2, node))
3125             return result;
3126           var nodesToSearch = [], i2, len, child, childBBox;
3127           while (node) {
3128             for (i2 = 0, len = node.children.length; i2 < len; i2++) {
3129               child = node.children[i2];
3130               childBBox = node.leaf ? toBBox(child) : child;
3131               if (intersects(bbox2, childBBox)) {
3132                 if (node.leaf)
3133                   result.push(child);
3134                 else if (contains(bbox2, childBBox))
3135                   this._all(child, result);
3136                 else
3137                   nodesToSearch.push(child);
3138               }
3139             }
3140             node = nodesToSearch.pop();
3141           }
3142           return result;
3143         },
3144         collides: function(bbox2) {
3145           var node = this.data, toBBox = this.toBBox;
3146           if (!intersects(bbox2, node))
3147             return false;
3148           var nodesToSearch = [], i2, len, child, childBBox;
3149           while (node) {
3150             for (i2 = 0, len = node.children.length; i2 < len; i2++) {
3151               child = node.children[i2];
3152               childBBox = node.leaf ? toBBox(child) : child;
3153               if (intersects(bbox2, childBBox)) {
3154                 if (node.leaf || contains(bbox2, childBBox))
3155                   return true;
3156                 nodesToSearch.push(child);
3157               }
3158             }
3159             node = nodesToSearch.pop();
3160           }
3161           return false;
3162         },
3163         load: function(data) {
3164           if (!(data && data.length))
3165             return this;
3166           if (data.length < this._minEntries) {
3167             for (var i2 = 0, len = data.length; i2 < len; i2++) {
3168               this.insert(data[i2]);
3169             }
3170             return this;
3171           }
3172           var node = this._build(data.slice(), 0, data.length - 1, 0);
3173           if (!this.data.children.length) {
3174             this.data = node;
3175           } else if (this.data.height === node.height) {
3176             this._splitRoot(this.data, node);
3177           } else {
3178             if (this.data.height < node.height) {
3179               var tmpNode = this.data;
3180               this.data = node;
3181               node = tmpNode;
3182             }
3183             this._insert(node, this.data.height - node.height - 1, true);
3184           }
3185           return this;
3186         },
3187         insert: function(item) {
3188           if (item)
3189             this._insert(item, this.data.height - 1);
3190           return this;
3191         },
3192         clear: function() {
3193           this.data = createNode([]);
3194           return this;
3195         },
3196         remove: function(item, equalsFn) {
3197           if (!item)
3198             return this;
3199           var node = this.data, bbox2 = this.toBBox(item), path = [], indexes = [], i2, parent, index, goingUp;
3200           while (node || path.length) {
3201             if (!node) {
3202               node = path.pop();
3203               parent = path[path.length - 1];
3204               i2 = indexes.pop();
3205               goingUp = true;
3206             }
3207             if (node.leaf) {
3208               index = findItem(item, node.children, equalsFn);
3209               if (index !== -1) {
3210                 node.children.splice(index, 1);
3211                 path.push(node);
3212                 this._condense(path);
3213                 return this;
3214               }
3215             }
3216             if (!goingUp && !node.leaf && contains(node, bbox2)) {
3217               path.push(node);
3218               indexes.push(i2);
3219               i2 = 0;
3220               parent = node;
3221               node = node.children[0];
3222             } else if (parent) {
3223               i2++;
3224               node = parent.children[i2];
3225               goingUp = false;
3226             } else
3227               node = null;
3228           }
3229           return this;
3230         },
3231         toBBox: function(item) {
3232           return item;
3233         },
3234         compareMinX: compareNodeMinX,
3235         compareMinY: compareNodeMinY,
3236         toJSON: function() {
3237           return this.data;
3238         },
3239         fromJSON: function(data) {
3240           this.data = data;
3241           return this;
3242         },
3243         _all: function(node, result) {
3244           var nodesToSearch = [];
3245           while (node) {
3246             if (node.leaf)
3247               result.push.apply(result, node.children);
3248             else
3249               nodesToSearch.push.apply(nodesToSearch, node.children);
3250             node = nodesToSearch.pop();
3251           }
3252           return result;
3253         },
3254         _build: function(items, left, right, height) {
3255           var N = right - left + 1, M = this._maxEntries, node;
3256           if (N <= M) {
3257             node = createNode(items.slice(left, right + 1));
3258             calcBBox(node, this.toBBox);
3259             return node;
3260           }
3261           if (!height) {
3262             height = Math.ceil(Math.log(N) / Math.log(M));
3263             M = Math.ceil(N / Math.pow(M, height - 1));
3264           }
3265           node = createNode([]);
3266           node.leaf = false;
3267           node.height = height;
3268           var N2 = Math.ceil(N / M), N1 = N2 * Math.ceil(Math.sqrt(M)), i2, j2, right2, right3;
3269           multiSelect(items, left, right, N1, this.compareMinX);
3270           for (i2 = left; i2 <= right; i2 += N1) {
3271             right2 = Math.min(i2 + N1 - 1, right);
3272             multiSelect(items, i2, right2, N2, this.compareMinY);
3273             for (j2 = i2; j2 <= right2; j2 += N2) {
3274               right3 = Math.min(j2 + N2 - 1, right2);
3275               node.children.push(this._build(items, j2, right3, height - 1));
3276             }
3277           }
3278           calcBBox(node, this.toBBox);
3279           return node;
3280         },
3281         _chooseSubtree: function(bbox2, node, level, path) {
3282           var i2, len, child, targetNode, area, enlargement, minArea, minEnlargement;
3283           while (true) {
3284             path.push(node);
3285             if (node.leaf || path.length - 1 === level)
3286               break;
3287             minArea = minEnlargement = Infinity;
3288             for (i2 = 0, len = node.children.length; i2 < len; i2++) {
3289               child = node.children[i2];
3290               area = bboxArea(child);
3291               enlargement = enlargedArea(bbox2, child) - area;
3292               if (enlargement < minEnlargement) {
3293                 minEnlargement = enlargement;
3294                 minArea = area < minArea ? area : minArea;
3295                 targetNode = child;
3296               } else if (enlargement === minEnlargement) {
3297                 if (area < minArea) {
3298                   minArea = area;
3299                   targetNode = child;
3300                 }
3301               }
3302             }
3303             node = targetNode || node.children[0];
3304           }
3305           return node;
3306         },
3307         _insert: function(item, level, isNode) {
3308           var toBBox = this.toBBox, bbox2 = isNode ? item : toBBox(item), insertPath = [];
3309           var node = this._chooseSubtree(bbox2, this.data, level, insertPath);
3310           node.children.push(item);
3311           extend2(node, bbox2);
3312           while (level >= 0) {
3313             if (insertPath[level].children.length > this._maxEntries) {
3314               this._split(insertPath, level);
3315               level--;
3316             } else
3317               break;
3318           }
3319           this._adjustParentBBoxes(bbox2, insertPath, level);
3320         },
3321         // split overflowed node into two
3322         _split: function(insertPath, level) {
3323           var node = insertPath[level], M = node.children.length, m = this._minEntries;
3324           this._chooseSplitAxis(node, m, M);
3325           var splitIndex = this._chooseSplitIndex(node, m, M);
3326           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
3327           newNode.height = node.height;
3328           newNode.leaf = node.leaf;
3329           calcBBox(node, this.toBBox);
3330           calcBBox(newNode, this.toBBox);
3331           if (level)
3332             insertPath[level - 1].children.push(newNode);
3333           else
3334             this._splitRoot(node, newNode);
3335         },
3336         _splitRoot: function(node, newNode) {
3337           this.data = createNode([node, newNode]);
3338           this.data.height = node.height + 1;
3339           this.data.leaf = false;
3340           calcBBox(this.data, this.toBBox);
3341         },
3342         _chooseSplitIndex: function(node, m, M) {
3343           var i2, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
3344           minOverlap = minArea = Infinity;
3345           for (i2 = m; i2 <= M - m; i2++) {
3346             bbox1 = distBBox(node, 0, i2, this.toBBox);
3347             bbox2 = distBBox(node, i2, M, this.toBBox);
3348             overlap = intersectionArea(bbox1, bbox2);
3349             area = bboxArea(bbox1) + bboxArea(bbox2);
3350             if (overlap < minOverlap) {
3351               minOverlap = overlap;
3352               index = i2;
3353               minArea = area < minArea ? area : minArea;
3354             } else if (overlap === minOverlap) {
3355               if (area < minArea) {
3356                 minArea = area;
3357                 index = i2;
3358               }
3359             }
3360           }
3361           return index;
3362         },
3363         // sorts node children by the best axis for split
3364         _chooseSplitAxis: function(node, m, M) {
3365           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX, compareMinY = node.leaf ? this.compareMinY : compareNodeMinY, xMargin = this._allDistMargin(node, m, M, compareMinX), yMargin = this._allDistMargin(node, m, M, compareMinY);
3366           if (xMargin < yMargin)
3367             node.children.sort(compareMinX);
3368         },
3369         // total margin of all possible split distributions where each node is at least m full
3370         _allDistMargin: function(node, m, M, compare) {
3371           node.children.sort(compare);
3372           var toBBox = this.toBBox, leftBBox = distBBox(node, 0, m, toBBox), rightBBox = distBBox(node, M - m, M, toBBox), margin = bboxMargin(leftBBox) + bboxMargin(rightBBox), i2, child;
3373           for (i2 = m; i2 < M - m; i2++) {
3374             child = node.children[i2];
3375             extend2(leftBBox, node.leaf ? toBBox(child) : child);
3376             margin += bboxMargin(leftBBox);
3377           }
3378           for (i2 = M - m - 1; i2 >= m; i2--) {
3379             child = node.children[i2];
3380             extend2(rightBBox, node.leaf ? toBBox(child) : child);
3381             margin += bboxMargin(rightBBox);
3382           }
3383           return margin;
3384         },
3385         _adjustParentBBoxes: function(bbox2, path, level) {
3386           for (var i2 = level; i2 >= 0; i2--) {
3387             extend2(path[i2], bbox2);
3388           }
3389         },
3390         _condense: function(path) {
3391           for (var i2 = path.length - 1, siblings; i2 >= 0; i2--) {
3392             if (path[i2].children.length === 0) {
3393               if (i2 > 0) {
3394                 siblings = path[i2 - 1].children;
3395                 siblings.splice(siblings.indexOf(path[i2]), 1);
3396               } else
3397                 this.clear();
3398             } else
3399               calcBBox(path[i2], this.toBBox);
3400           }
3401         },
3402         _initFormat: function(format2) {
3403           var compareArr = ["return a", " - b", ";"];
3404           this.compareMinX = new Function("a", "b", compareArr.join(format2[0]));
3405           this.compareMinY = new Function("a", "b", compareArr.join(format2[1]));
3406           this.toBBox = new Function(
3407             "a",
3408             "return {minX: a" + format2[0] + ", minY: a" + format2[1] + ", maxX: a" + format2[2] + ", maxY: a" + format2[3] + "};"
3409           );
3410         }
3411       };
3412       function findItem(item, items, equalsFn) {
3413         if (!equalsFn)
3414           return items.indexOf(item);
3415         for (var i2 = 0; i2 < items.length; i2++) {
3416           if (equalsFn(item, items[i2]))
3417             return i2;
3418         }
3419         return -1;
3420       }
3421       function calcBBox(node, toBBox) {
3422         distBBox(node, 0, node.children.length, toBBox, node);
3423       }
3424       function distBBox(node, k, p, toBBox, destNode) {
3425         if (!destNode)
3426           destNode = createNode(null);
3427         destNode.minX = Infinity;
3428         destNode.minY = Infinity;
3429         destNode.maxX = -Infinity;
3430         destNode.maxY = -Infinity;
3431         for (var i2 = k, child; i2 < p; i2++) {
3432           child = node.children[i2];
3433           extend2(destNode, node.leaf ? toBBox(child) : child);
3434         }
3435         return destNode;
3436       }
3437       function extend2(a, b) {
3438         a.minX = Math.min(a.minX, b.minX);
3439         a.minY = Math.min(a.minY, b.minY);
3440         a.maxX = Math.max(a.maxX, b.maxX);
3441         a.maxY = Math.max(a.maxY, b.maxY);
3442         return a;
3443       }
3444       function compareNodeMinX(a, b) {
3445         return a.minX - b.minX;
3446       }
3447       function compareNodeMinY(a, b) {
3448         return a.minY - b.minY;
3449       }
3450       function bboxArea(a) {
3451         return (a.maxX - a.minX) * (a.maxY - a.minY);
3452       }
3453       function bboxMargin(a) {
3454         return a.maxX - a.minX + (a.maxY - a.minY);
3455       }
3456       function enlargedArea(a, b) {
3457         return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
3458       }
3459       function intersectionArea(a, b) {
3460         var minX = Math.max(a.minX, b.minX), minY = Math.max(a.minY, b.minY), maxX = Math.min(a.maxX, b.maxX), maxY = Math.min(a.maxY, b.maxY);
3461         return Math.max(0, maxX - minX) * Math.max(0, maxY - minY);
3462       }
3463       function contains(a, b) {
3464         return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY;
3465       }
3466       function intersects(a, b) {
3467         return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY;
3468       }
3469       function createNode(children2) {
3470         return {
3471           children: children2,
3472           height: 1,
3473           leaf: true,
3474           minX: Infinity,
3475           minY: Infinity,
3476           maxX: -Infinity,
3477           maxY: -Infinity
3478         };
3479       }
3480       function multiSelect(arr, left, right, n2, compare) {
3481         var stack = [left, right], mid;
3482         while (stack.length) {
3483           right = stack.pop();
3484           left = stack.pop();
3485           if (right - left <= n2)
3486             continue;
3487           mid = left + Math.ceil((right - left) / n2 / 2) * n2;
3488           quickselect2(arr, mid, left, right, compare);
3489           stack.push(left, mid, mid, right);
3490         }
3491       }
3492     }
3493   });
3494
3495   // node_modules/lineclip/index.js
3496   var require_lineclip = __commonJS({
3497     "node_modules/lineclip/index.js"(exports2, module2) {
3498       "use strict";
3499       module2.exports = lineclip2;
3500       lineclip2.polyline = lineclip2;
3501       lineclip2.polygon = polygonclip2;
3502       function lineclip2(points, bbox2, result) {
3503         var len = points.length, codeA = bitCode2(points[0], bbox2), part = [], i2, a, b, codeB, lastCode;
3504         if (!result)
3505           result = [];
3506         for (i2 = 1; i2 < len; i2++) {
3507           a = points[i2 - 1];
3508           b = points[i2];
3509           codeB = lastCode = bitCode2(b, bbox2);
3510           while (true) {
3511             if (!(codeA | codeB)) {
3512               part.push(a);
3513               if (codeB !== lastCode) {
3514                 part.push(b);
3515                 if (i2 < len - 1) {
3516                   result.push(part);
3517                   part = [];
3518                 }
3519               } else if (i2 === len - 1) {
3520                 part.push(b);
3521               }
3522               break;
3523             } else if (codeA & codeB) {
3524               break;
3525             } else if (codeA) {
3526               a = intersect2(a, b, codeA, bbox2);
3527               codeA = bitCode2(a, bbox2);
3528             } else {
3529               b = intersect2(a, b, codeB, bbox2);
3530               codeB = bitCode2(b, bbox2);
3531             }
3532           }
3533           codeA = lastCode;
3534         }
3535         if (part.length)
3536           result.push(part);
3537         return result;
3538       }
3539       function polygonclip2(points, bbox2) {
3540         var result, edge, prev, prevInside, i2, p, inside;
3541         for (edge = 1; edge <= 8; edge *= 2) {
3542           result = [];
3543           prev = points[points.length - 1];
3544           prevInside = !(bitCode2(prev, bbox2) & edge);
3545           for (i2 = 0; i2 < points.length; i2++) {
3546             p = points[i2];
3547             inside = !(bitCode2(p, bbox2) & edge);
3548             if (inside !== prevInside)
3549               result.push(intersect2(prev, p, edge, bbox2));
3550             if (inside)
3551               result.push(p);
3552             prev = p;
3553             prevInside = inside;
3554           }
3555           points = result;
3556           if (!points.length)
3557             break;
3558         }
3559         return result;
3560       }
3561       function intersect2(a, b, edge, bbox2) {
3562         return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox2[3] - a[1]) / (b[1] - a[1]), bbox2[3]] : (
3563           // top
3564           edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox2[1] - a[1]) / (b[1] - a[1]), bbox2[1]] : (
3565             // bottom
3566             edge & 2 ? [bbox2[2], a[1] + (b[1] - a[1]) * (bbox2[2] - a[0]) / (b[0] - a[0])] : (
3567               // right
3568               edge & 1 ? [bbox2[0], a[1] + (b[1] - a[1]) * (bbox2[0] - a[0]) / (b[0] - a[0])] : (
3569                 // left
3570                 null
3571               )
3572             )
3573           )
3574         );
3575       }
3576       function bitCode2(p, bbox2) {
3577         var code = 0;
3578         if (p[0] < bbox2[0])
3579           code |= 1;
3580         else if (p[0] > bbox2[2])
3581           code |= 2;
3582         if (p[1] < bbox2[1])
3583           code |= 4;
3584         else if (p[1] > bbox2[3])
3585           code |= 8;
3586         return code;
3587       }
3588     }
3589   });
3590
3591   // node_modules/which-polygon/index.js
3592   var require_which_polygon = __commonJS({
3593     "node_modules/which-polygon/index.js"(exports2, module2) {
3594       "use strict";
3595       var rbush = require_rbush();
3596       var lineclip2 = require_lineclip();
3597       module2.exports = whichPolygon5;
3598       function whichPolygon5(data) {
3599         var bboxes = [];
3600         for (var i2 = 0; i2 < data.features.length; i2++) {
3601           var feature3 = data.features[i2];
3602           var coords = feature3.geometry.coordinates;
3603           if (feature3.geometry.type === "Polygon") {
3604             bboxes.push(treeItem(coords, feature3.properties));
3605           } else if (feature3.geometry.type === "MultiPolygon") {
3606             for (var j2 = 0; j2 < coords.length; j2++) {
3607               bboxes.push(treeItem(coords[j2], feature3.properties));
3608             }
3609           }
3610         }
3611         var tree = rbush().load(bboxes);
3612         function query(p, multi) {
3613           var output = [], result = tree.search({
3614             minX: p[0],
3615             minY: p[1],
3616             maxX: p[0],
3617             maxY: p[1]
3618           });
3619           for (var i3 = 0; i3 < result.length; i3++) {
3620             if (insidePolygon(result[i3].coords, p)) {
3621               if (multi)
3622                 output.push(result[i3].props);
3623               else
3624                 return result[i3].props;
3625             }
3626           }
3627           return multi && output.length ? output : null;
3628         }
3629         query.tree = tree;
3630         query.bbox = function queryBBox(bbox2) {
3631           var output = [];
3632           var result = tree.search({
3633             minX: bbox2[0],
3634             minY: bbox2[1],
3635             maxX: bbox2[2],
3636             maxY: bbox2[3]
3637           });
3638           for (var i3 = 0; i3 < result.length; i3++) {
3639             if (polygonIntersectsBBox(result[i3].coords, bbox2)) {
3640               output.push(result[i3].props);
3641             }
3642           }
3643           return output;
3644         };
3645         return query;
3646       }
3647       function polygonIntersectsBBox(polygon2, bbox2) {
3648         var bboxCenter = [
3649           (bbox2[0] + bbox2[2]) / 2,
3650           (bbox2[1] + bbox2[3]) / 2
3651         ];
3652         if (insidePolygon(polygon2, bboxCenter))
3653           return true;
3654         for (var i2 = 0; i2 < polygon2.length; i2++) {
3655           if (lineclip2(polygon2[i2], bbox2).length > 0)
3656             return true;
3657         }
3658         return false;
3659       }
3660       function insidePolygon(rings, p) {
3661         var inside = false;
3662         for (var i2 = 0, len = rings.length; i2 < len; i2++) {
3663           var ring = rings[i2];
3664           for (var j2 = 0, len2 = ring.length, k = len2 - 1; j2 < len2; k = j2++) {
3665             if (rayIntersect(p, ring[j2], ring[k]))
3666               inside = !inside;
3667           }
3668         }
3669         return inside;
3670       }
3671       function rayIntersect(p, p1, p2) {
3672         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];
3673       }
3674       function treeItem(coords, props) {
3675         var item = {
3676           minX: Infinity,
3677           minY: Infinity,
3678           maxX: -Infinity,
3679           maxY: -Infinity,
3680           coords,
3681           props
3682         };
3683         for (var i2 = 0; i2 < coords[0].length; i2++) {
3684           var p = coords[0][i2];
3685           item.minX = Math.min(item.minX, p[0]);
3686           item.minY = Math.min(item.minY, p[1]);
3687           item.maxX = Math.max(item.maxX, p[0]);
3688           item.maxY = Math.max(item.maxY, p[1]);
3689         }
3690         return item;
3691       }
3692     }
3693   });
3694
3695   // node_modules/wgs84/index.js
3696   var require_wgs84 = __commonJS({
3697     "node_modules/wgs84/index.js"(exports2, module2) {
3698       module2.exports.RADIUS = 6378137;
3699       module2.exports.FLATTENING = 1 / 298.257223563;
3700       module2.exports.POLAR_RADIUS = 63567523142e-4;
3701     }
3702   });
3703
3704   // node_modules/@mapbox/geojson-area/index.js
3705   var require_geojson_area = __commonJS({
3706     "node_modules/@mapbox/geojson-area/index.js"(exports2, module2) {
3707       var wgs84 = require_wgs84();
3708       module2.exports.geometry = geometry;
3709       module2.exports.ring = ringArea;
3710       function geometry(_) {
3711         var area = 0, i2;
3712         switch (_.type) {
3713           case "Polygon":
3714             return polygonArea(_.coordinates);
3715           case "MultiPolygon":
3716             for (i2 = 0; i2 < _.coordinates.length; i2++) {
3717               area += polygonArea(_.coordinates[i2]);
3718             }
3719             return area;
3720           case "Point":
3721           case "MultiPoint":
3722           case "LineString":
3723           case "MultiLineString":
3724             return 0;
3725           case "GeometryCollection":
3726             for (i2 = 0; i2 < _.geometries.length; i2++) {
3727               area += geometry(_.geometries[i2]);
3728             }
3729             return area;
3730         }
3731       }
3732       function polygonArea(coords) {
3733         var area = 0;
3734         if (coords && coords.length > 0) {
3735           area += Math.abs(ringArea(coords[0]));
3736           for (var i2 = 1; i2 < coords.length; i2++) {
3737             area -= Math.abs(ringArea(coords[i2]));
3738           }
3739         }
3740         return area;
3741       }
3742       function ringArea(coords) {
3743         var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i2, area = 0, coordsLength = coords.length;
3744         if (coordsLength > 2) {
3745           for (i2 = 0; i2 < coordsLength; i2++) {
3746             if (i2 === coordsLength - 2) {
3747               lowerIndex = coordsLength - 2;
3748               middleIndex = coordsLength - 1;
3749               upperIndex = 0;
3750             } else if (i2 === coordsLength - 1) {
3751               lowerIndex = coordsLength - 1;
3752               middleIndex = 0;
3753               upperIndex = 1;
3754             } else {
3755               lowerIndex = i2;
3756               middleIndex = i2 + 1;
3757               upperIndex = i2 + 2;
3758             }
3759             p1 = coords[lowerIndex];
3760             p2 = coords[middleIndex];
3761             p3 = coords[upperIndex];
3762             area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1]));
3763           }
3764           area = area * wgs84.RADIUS * wgs84.RADIUS / 2;
3765         }
3766         return area;
3767       }
3768       function rad(_) {
3769         return _ * Math.PI / 180;
3770       }
3771     }
3772   });
3773
3774   // node_modules/circle-to-polygon/input-validation/validateCenter.js
3775   var require_validateCenter = __commonJS({
3776     "node_modules/circle-to-polygon/input-validation/validateCenter.js"(exports2) {
3777       exports2.validateCenter = function validateCenter(center) {
3778         var validCenterLengths = [2, 3];
3779         if (!Array.isArray(center) || !validCenterLengths.includes(center.length)) {
3780           throw new Error("ERROR! Center has to be an array of length two or three");
3781         }
3782         var [lng, lat] = center;
3783         if (typeof lng !== "number" || typeof lat !== "number") {
3784           throw new Error(
3785             `ERROR! Longitude and Latitude has to be numbers but where ${typeof lng} and ${typeof lat}`
3786           );
3787         }
3788         if (lng > 180 || lng < -180) {
3789           throw new Error(`ERROR! Longitude has to be between -180 and 180 but was ${lng}`);
3790         }
3791         if (lat > 90 || lat < -90) {
3792           throw new Error(`ERROR! Latitude has to be between -90 and 90 but was ${lat}`);
3793         }
3794       };
3795     }
3796   });
3797
3798   // node_modules/circle-to-polygon/input-validation/validateRadius.js
3799   var require_validateRadius = __commonJS({
3800     "node_modules/circle-to-polygon/input-validation/validateRadius.js"(exports2) {
3801       exports2.validateRadius = function validateRadius(radius) {
3802         if (typeof radius !== "number") {
3803           throw new Error(`ERROR! Radius has to be a positive number but was: ${typeof radius}`);
3804         }
3805         if (radius <= 0) {
3806           throw new Error(`ERROR! Radius has to be a positive number but was: ${radius}`);
3807         }
3808       };
3809     }
3810   });
3811
3812   // node_modules/circle-to-polygon/input-validation/validateNumberOfEdges.js
3813   var require_validateNumberOfEdges = __commonJS({
3814     "node_modules/circle-to-polygon/input-validation/validateNumberOfEdges.js"(exports2) {
3815       exports2.validateNumberOfEdges = function validateNumberOfEdges(numberOfEdges) {
3816         if (typeof numberOfEdges !== "number") {
3817           const ARGUMENT_TYPE = Array.isArray(numberOfEdges) ? "array" : typeof numberOfEdges;
3818           throw new Error(`ERROR! Number of edges has to be a number but was: ${ARGUMENT_TYPE}`);
3819         }
3820         if (numberOfEdges < 3) {
3821           throw new Error(`ERROR! Number of edges has to be at least 3 but was: ${numberOfEdges}`);
3822         }
3823       };
3824     }
3825   });
3826
3827   // node_modules/circle-to-polygon/input-validation/validateEarthRadius.js
3828   var require_validateEarthRadius = __commonJS({
3829     "node_modules/circle-to-polygon/input-validation/validateEarthRadius.js"(exports2) {
3830       exports2.validateEarthRadius = function validateEarthRadius(earthRadius2) {
3831         if (typeof earthRadius2 !== "number") {
3832           const ARGUMENT_TYPE = Array.isArray(earthRadius2) ? "array" : typeof earthRadius2;
3833           throw new Error(`ERROR! Earth radius has to be a number but was: ${ARGUMENT_TYPE}`);
3834         }
3835         if (earthRadius2 <= 0) {
3836           throw new Error(`ERROR! Earth radius has to be a positive number but was: ${earthRadius2}`);
3837         }
3838       };
3839     }
3840   });
3841
3842   // node_modules/circle-to-polygon/input-validation/validateBearing.js
3843   var require_validateBearing = __commonJS({
3844     "node_modules/circle-to-polygon/input-validation/validateBearing.js"(exports2) {
3845       exports2.validateBearing = function validateBearing(bearing) {
3846         if (typeof bearing !== "number") {
3847           const ARGUMENT_TYPE = Array.isArray(bearing) ? "array" : typeof bearing;
3848           throw new Error(`ERROR! Bearing has to be a number but was: ${ARGUMENT_TYPE}`);
3849         }
3850       };
3851     }
3852   });
3853
3854   // node_modules/circle-to-polygon/input-validation/index.js
3855   var require_input_validation = __commonJS({
3856     "node_modules/circle-to-polygon/input-validation/index.js"(exports2) {
3857       var validateCenter = require_validateCenter().validateCenter;
3858       var validateRadius = require_validateRadius().validateRadius;
3859       var validateNumberOfEdges = require_validateNumberOfEdges().validateNumberOfEdges;
3860       var validateEarthRadius = require_validateEarthRadius().validateEarthRadius;
3861       var validateBearing = require_validateBearing().validateBearing;
3862       function validateInput({ center, radius, numberOfEdges, earthRadius: earthRadius2, bearing }) {
3863         validateCenter(center);
3864         validateRadius(radius);
3865         validateNumberOfEdges(numberOfEdges);
3866         validateEarthRadius(earthRadius2);
3867         validateBearing(bearing);
3868       }
3869       exports2.validateCenter = validateCenter;
3870       exports2.validateRadius = validateRadius;
3871       exports2.validateNumberOfEdges = validateNumberOfEdges;
3872       exports2.validateEarthRadius = validateEarthRadius;
3873       exports2.validateBearing = validateBearing;
3874       exports2.validateInput = validateInput;
3875     }
3876   });
3877
3878   // node_modules/circle-to-polygon/index.js
3879   var require_circle_to_polygon = __commonJS({
3880     "node_modules/circle-to-polygon/index.js"(exports2, module2) {
3881       "use strict";
3882       var { validateInput } = require_input_validation();
3883       var defaultEarthRadius = 6378137;
3884       function toRadians(angleInDegrees) {
3885         return angleInDegrees * Math.PI / 180;
3886       }
3887       function toDegrees(angleInRadians) {
3888         return angleInRadians * 180 / Math.PI;
3889       }
3890       function offset(c1, distance, earthRadius2, bearing) {
3891         var lat1 = toRadians(c1[1]);
3892         var lon1 = toRadians(c1[0]);
3893         var dByR = distance / earthRadius2;
3894         var lat = Math.asin(
3895           Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing)
3896         );
3897         var lon = lon1 + Math.atan2(
3898           Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1),
3899           Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat)
3900         );
3901         return [toDegrees(lon), toDegrees(lat)];
3902       }
3903       module2.exports = function circleToPolygon2(center, radius, options2) {
3904         var n2 = getNumberOfEdges(options2);
3905         var earthRadius2 = getEarthRadius(options2);
3906         var bearing = getBearing(options2);
3907         var direction = getDirection(options2);
3908         validateInput({ center, radius, numberOfEdges: n2, earthRadius: earthRadius2, bearing });
3909         var start2 = toRadians(bearing);
3910         var coordinates = [];
3911         for (var i2 = 0; i2 < n2; ++i2) {
3912           coordinates.push(
3913             offset(
3914               center,
3915               radius,
3916               earthRadius2,
3917               start2 + direction * 2 * Math.PI * -i2 / n2
3918             )
3919           );
3920         }
3921         coordinates.push(coordinates[0]);
3922         return {
3923           type: "Polygon",
3924           coordinates: [coordinates]
3925         };
3926       };
3927       function getNumberOfEdges(options2) {
3928         if (isUndefinedOrNull(options2)) {
3929           return 32;
3930         } else if (isObjectNotArray(options2)) {
3931           var numberOfEdges = options2.numberOfEdges;
3932           return numberOfEdges === void 0 ? 32 : numberOfEdges;
3933         }
3934         return options2;
3935       }
3936       function getEarthRadius(options2) {
3937         if (isUndefinedOrNull(options2)) {
3938           return defaultEarthRadius;
3939         } else if (isObjectNotArray(options2)) {
3940           var earthRadius2 = options2.earthRadius;
3941           return earthRadius2 === void 0 ? defaultEarthRadius : earthRadius2;
3942         }
3943         return defaultEarthRadius;
3944       }
3945       function getDirection(options2) {
3946         if (isObjectNotArray(options2) && options2.rightHandRule) {
3947           return -1;
3948         }
3949         return 1;
3950       }
3951       function getBearing(options2) {
3952         if (isUndefinedOrNull(options2)) {
3953           return 0;
3954         } else if (isObjectNotArray(options2)) {
3955           var bearing = options2.bearing;
3956           return bearing === void 0 ? 0 : bearing;
3957         }
3958         return 0;
3959       }
3960       function isObjectNotArray(argument) {
3961         return argument !== null && typeof argument === "object" && !Array.isArray(argument);
3962       }
3963       function isUndefinedOrNull(argument) {
3964         return argument === null || argument === void 0;
3965       }
3966     }
3967   });
3968
3969   // node_modules/polygon-clipping/dist/polygon-clipping.umd.js
3970   var require_polygon_clipping_umd = __commonJS({
3971     "node_modules/polygon-clipping/dist/polygon-clipping.umd.js"(exports2, module2) {
3972       (function(global3, factory) {
3973         typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global3 = typeof globalThis !== "undefined" ? globalThis : global3 || self, global3.polygonClipping = factory());
3974       })(exports2, function() {
3975         "use strict";
3976         function _classCallCheck(instance, Constructor) {
3977           if (!(instance instanceof Constructor)) {
3978             throw new TypeError("Cannot call a class as a function");
3979           }
3980         }
3981         function _defineProperties(target, props) {
3982           for (var i2 = 0; i2 < props.length; i2++) {
3983             var descriptor = props[i2];
3984             descriptor.enumerable = descriptor.enumerable || false;
3985             descriptor.configurable = true;
3986             if ("value" in descriptor)
3987               descriptor.writable = true;
3988             Object.defineProperty(target, descriptor.key, descriptor);
3989           }
3990         }
3991         function _createClass(Constructor, protoProps, staticProps) {
3992           if (protoProps)
3993             _defineProperties(Constructor.prototype, protoProps);
3994           if (staticProps)
3995             _defineProperties(Constructor, staticProps);
3996           return Constructor;
3997         }
3998         var Node = (
3999           /** @class */
4000           function() {
4001             function Node2(key, data) {
4002               this.next = null;
4003               this.key = key;
4004               this.data = data;
4005               this.left = null;
4006               this.right = null;
4007             }
4008             return Node2;
4009           }()
4010         );
4011         function DEFAULT_COMPARE(a, b) {
4012           return a > b ? 1 : a < b ? -1 : 0;
4013         }
4014         function splay(i2, t, comparator) {
4015           var N = new Node(null, null);
4016           var l = N;
4017           var r = N;
4018           while (true) {
4019             var cmp2 = comparator(i2, t.key);
4020             if (cmp2 < 0) {
4021               if (t.left === null)
4022                 break;
4023               if (comparator(i2, t.left.key) < 0) {
4024                 var y = t.left;
4025                 t.left = y.right;
4026                 y.right = t;
4027                 t = y;
4028                 if (t.left === null)
4029                   break;
4030               }
4031               r.left = t;
4032               r = t;
4033               t = t.left;
4034             } else if (cmp2 > 0) {
4035               if (t.right === null)
4036                 break;
4037               if (comparator(i2, t.right.key) > 0) {
4038                 var y = t.right;
4039                 t.right = y.left;
4040                 y.left = t;
4041                 t = y;
4042                 if (t.right === null)
4043                   break;
4044               }
4045               l.right = t;
4046               l = t;
4047               t = t.right;
4048             } else
4049               break;
4050           }
4051           l.right = t.left;
4052           r.left = t.right;
4053           t.left = N.right;
4054           t.right = N.left;
4055           return t;
4056         }
4057         function insert(i2, data, t, comparator) {
4058           var node = new Node(i2, data);
4059           if (t === null) {
4060             node.left = node.right = null;
4061             return node;
4062           }
4063           t = splay(i2, t, comparator);
4064           var cmp2 = comparator(i2, t.key);
4065           if (cmp2 < 0) {
4066             node.left = t.left;
4067             node.right = t;
4068             t.left = null;
4069           } else if (cmp2 >= 0) {
4070             node.right = t.right;
4071             node.left = t;
4072             t.right = null;
4073           }
4074           return node;
4075         }
4076         function split(key, v, comparator) {
4077           var left = null;
4078           var right = null;
4079           if (v) {
4080             v = splay(key, v, comparator);
4081             var cmp2 = comparator(v.key, key);
4082             if (cmp2 === 0) {
4083               left = v.left;
4084               right = v.right;
4085             } else if (cmp2 < 0) {
4086               right = v.right;
4087               v.right = null;
4088               left = v;
4089             } else {
4090               left = v.left;
4091               v.left = null;
4092               right = v;
4093             }
4094           }
4095           return {
4096             left,
4097             right
4098           };
4099         }
4100         function merge3(left, right, comparator) {
4101           if (right === null)
4102             return left;
4103           if (left === null)
4104             return right;
4105           right = splay(left.key, right, comparator);
4106           right.left = left;
4107           return right;
4108         }
4109         function printRow(root3, prefix, isTail, out, printNode) {
4110           if (root3) {
4111             out("" + prefix + (isTail ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ") + printNode(root3) + "\n");
4112             var indent2 = prefix + (isTail ? "    " : "\u2502   ");
4113             if (root3.left)
4114               printRow(root3.left, indent2, false, out, printNode);
4115             if (root3.right)
4116               printRow(root3.right, indent2, true, out, printNode);
4117           }
4118         }
4119         var Tree = (
4120           /** @class */
4121           function() {
4122             function Tree2(comparator) {
4123               if (comparator === void 0) {
4124                 comparator = DEFAULT_COMPARE;
4125               }
4126               this._root = null;
4127               this._size = 0;
4128               this._comparator = comparator;
4129             }
4130             Tree2.prototype.insert = function(key, data) {
4131               this._size++;
4132               return this._root = insert(key, data, this._root, this._comparator);
4133             };
4134             Tree2.prototype.add = function(key, data) {
4135               var node = new Node(key, data);
4136               if (this._root === null) {
4137                 node.left = node.right = null;
4138                 this._size++;
4139                 this._root = node;
4140               }
4141               var comparator = this._comparator;
4142               var t = splay(key, this._root, comparator);
4143               var cmp2 = comparator(key, t.key);
4144               if (cmp2 === 0)
4145                 this._root = t;
4146               else {
4147                 if (cmp2 < 0) {
4148                   node.left = t.left;
4149                   node.right = t;
4150                   t.left = null;
4151                 } else if (cmp2 > 0) {
4152                   node.right = t.right;
4153                   node.left = t;
4154                   t.right = null;
4155                 }
4156                 this._size++;
4157                 this._root = node;
4158               }
4159               return this._root;
4160             };
4161             Tree2.prototype.remove = function(key) {
4162               this._root = this._remove(key, this._root, this._comparator);
4163             };
4164             Tree2.prototype._remove = function(i2, t, comparator) {
4165               var x;
4166               if (t === null)
4167                 return null;
4168               t = splay(i2, t, comparator);
4169               var cmp2 = comparator(i2, t.key);
4170               if (cmp2 === 0) {
4171                 if (t.left === null) {
4172                   x = t.right;
4173                 } else {
4174                   x = splay(i2, t.left, comparator);
4175                   x.right = t.right;
4176                 }
4177                 this._size--;
4178                 return x;
4179               }
4180               return t;
4181             };
4182             Tree2.prototype.pop = function() {
4183               var node = this._root;
4184               if (node) {
4185                 while (node.left) {
4186                   node = node.left;
4187                 }
4188                 this._root = splay(node.key, this._root, this._comparator);
4189                 this._root = this._remove(node.key, this._root, this._comparator);
4190                 return {
4191                   key: node.key,
4192                   data: node.data
4193                 };
4194               }
4195               return null;
4196             };
4197             Tree2.prototype.findStatic = function(key) {
4198               var current = this._root;
4199               var compare = this._comparator;
4200               while (current) {
4201                 var cmp2 = compare(key, current.key);
4202                 if (cmp2 === 0)
4203                   return current;
4204                 else if (cmp2 < 0)
4205                   current = current.left;
4206                 else
4207                   current = current.right;
4208               }
4209               return null;
4210             };
4211             Tree2.prototype.find = function(key) {
4212               if (this._root) {
4213                 this._root = splay(key, this._root, this._comparator);
4214                 if (this._comparator(key, this._root.key) !== 0)
4215                   return null;
4216               }
4217               return this._root;
4218             };
4219             Tree2.prototype.contains = function(key) {
4220               var current = this._root;
4221               var compare = this._comparator;
4222               while (current) {
4223                 var cmp2 = compare(key, current.key);
4224                 if (cmp2 === 0)
4225                   return true;
4226                 else if (cmp2 < 0)
4227                   current = current.left;
4228                 else
4229                   current = current.right;
4230               }
4231               return false;
4232             };
4233             Tree2.prototype.forEach = function(visitor, ctx) {
4234               var current = this._root;
4235               var Q = [];
4236               var done = false;
4237               while (!done) {
4238                 if (current !== null) {
4239                   Q.push(current);
4240                   current = current.left;
4241                 } else {
4242                   if (Q.length !== 0) {
4243                     current = Q.pop();
4244                     visitor.call(ctx, current);
4245                     current = current.right;
4246                   } else
4247                     done = true;
4248                 }
4249               }
4250               return this;
4251             };
4252             Tree2.prototype.range = function(low, high, fn, ctx) {
4253               var Q = [];
4254               var compare = this._comparator;
4255               var node = this._root;
4256               var cmp2;
4257               while (Q.length !== 0 || node) {
4258                 if (node) {
4259                   Q.push(node);
4260                   node = node.left;
4261                 } else {
4262                   node = Q.pop();
4263                   cmp2 = compare(node.key, high);
4264                   if (cmp2 > 0) {
4265                     break;
4266                   } else if (compare(node.key, low) >= 0) {
4267                     if (fn.call(ctx, node))
4268                       return this;
4269                   }
4270                   node = node.right;
4271                 }
4272               }
4273               return this;
4274             };
4275             Tree2.prototype.keys = function() {
4276               var keys = [];
4277               this.forEach(function(_a) {
4278                 var key = _a.key;
4279                 return keys.push(key);
4280               });
4281               return keys;
4282             };
4283             Tree2.prototype.values = function() {
4284               var values = [];
4285               this.forEach(function(_a) {
4286                 var data = _a.data;
4287                 return values.push(data);
4288               });
4289               return values;
4290             };
4291             Tree2.prototype.min = function() {
4292               if (this._root)
4293                 return this.minNode(this._root).key;
4294               return null;
4295             };
4296             Tree2.prototype.max = function() {
4297               if (this._root)
4298                 return this.maxNode(this._root).key;
4299               return null;
4300             };
4301             Tree2.prototype.minNode = function(t) {
4302               if (t === void 0) {
4303                 t = this._root;
4304               }
4305               if (t)
4306                 while (t.left) {
4307                   t = t.left;
4308                 }
4309               return t;
4310             };
4311             Tree2.prototype.maxNode = function(t) {
4312               if (t === void 0) {
4313                 t = this._root;
4314               }
4315               if (t)
4316                 while (t.right) {
4317                   t = t.right;
4318                 }
4319               return t;
4320             };
4321             Tree2.prototype.at = function(index2) {
4322               var current = this._root;
4323               var done = false;
4324               var i2 = 0;
4325               var Q = [];
4326               while (!done) {
4327                 if (current) {
4328                   Q.push(current);
4329                   current = current.left;
4330                 } else {
4331                   if (Q.length > 0) {
4332                     current = Q.pop();
4333                     if (i2 === index2)
4334                       return current;
4335                     i2++;
4336                     current = current.right;
4337                   } else
4338                     done = true;
4339                 }
4340               }
4341               return null;
4342             };
4343             Tree2.prototype.next = function(d) {
4344               var root3 = this._root;
4345               var successor = null;
4346               if (d.right) {
4347                 successor = d.right;
4348                 while (successor.left) {
4349                   successor = successor.left;
4350                 }
4351                 return successor;
4352               }
4353               var comparator = this._comparator;
4354               while (root3) {
4355                 var cmp2 = comparator(d.key, root3.key);
4356                 if (cmp2 === 0)
4357                   break;
4358                 else if (cmp2 < 0) {
4359                   successor = root3;
4360                   root3 = root3.left;
4361                 } else
4362                   root3 = root3.right;
4363               }
4364               return successor;
4365             };
4366             Tree2.prototype.prev = function(d) {
4367               var root3 = this._root;
4368               var predecessor = null;
4369               if (d.left !== null) {
4370                 predecessor = d.left;
4371                 while (predecessor.right) {
4372                   predecessor = predecessor.right;
4373                 }
4374                 return predecessor;
4375               }
4376               var comparator = this._comparator;
4377               while (root3) {
4378                 var cmp2 = comparator(d.key, root3.key);
4379                 if (cmp2 === 0)
4380                   break;
4381                 else if (cmp2 < 0)
4382                   root3 = root3.left;
4383                 else {
4384                   predecessor = root3;
4385                   root3 = root3.right;
4386                 }
4387               }
4388               return predecessor;
4389             };
4390             Tree2.prototype.clear = function() {
4391               this._root = null;
4392               this._size = 0;
4393               return this;
4394             };
4395             Tree2.prototype.toList = function() {
4396               return toList(this._root);
4397             };
4398             Tree2.prototype.load = function(keys, values, presort) {
4399               if (values === void 0) {
4400                 values = [];
4401               }
4402               if (presort === void 0) {
4403                 presort = false;
4404               }
4405               var size = keys.length;
4406               var comparator = this._comparator;
4407               if (presort)
4408                 sort(keys, values, 0, size - 1, comparator);
4409               if (this._root === null) {
4410                 this._root = loadRecursive(keys, values, 0, size);
4411                 this._size = size;
4412               } else {
4413                 var mergedList = mergeLists(this.toList(), createList(keys, values), comparator);
4414                 size = this._size + size;
4415                 this._root = sortedListToBST({
4416                   head: mergedList
4417                 }, 0, size);
4418               }
4419               return this;
4420             };
4421             Tree2.prototype.isEmpty = function() {
4422               return this._root === null;
4423             };
4424             Object.defineProperty(Tree2.prototype, "size", {
4425               get: function get4() {
4426                 return this._size;
4427               },
4428               enumerable: true,
4429               configurable: true
4430             });
4431             Object.defineProperty(Tree2.prototype, "root", {
4432               get: function get4() {
4433                 return this._root;
4434               },
4435               enumerable: true,
4436               configurable: true
4437             });
4438             Tree2.prototype.toString = function(printNode) {
4439               if (printNode === void 0) {
4440                 printNode = function printNode2(n2) {
4441                   return String(n2.key);
4442                 };
4443               }
4444               var out = [];
4445               printRow(this._root, "", true, function(v) {
4446                 return out.push(v);
4447               }, printNode);
4448               return out.join("");
4449             };
4450             Tree2.prototype.update = function(key, newKey, newData) {
4451               var comparator = this._comparator;
4452               var _a = split(key, this._root, comparator), left = _a.left, right = _a.right;
4453               if (comparator(key, newKey) < 0) {
4454                 right = insert(newKey, newData, right, comparator);
4455               } else {
4456                 left = insert(newKey, newData, left, comparator);
4457               }
4458               this._root = merge3(left, right, comparator);
4459             };
4460             Tree2.prototype.split = function(key) {
4461               return split(key, this._root, this._comparator);
4462             };
4463             return Tree2;
4464           }()
4465         );
4466         function loadRecursive(keys, values, start2, end) {
4467           var size = end - start2;
4468           if (size > 0) {
4469             var middle = start2 + Math.floor(size / 2);
4470             var key = keys[middle];
4471             var data = values[middle];
4472             var node = new Node(key, data);
4473             node.left = loadRecursive(keys, values, start2, middle);
4474             node.right = loadRecursive(keys, values, middle + 1, end);
4475             return node;
4476           }
4477           return null;
4478         }
4479         function createList(keys, values) {
4480           var head = new Node(null, null);
4481           var p = head;
4482           for (var i2 = 0; i2 < keys.length; i2++) {
4483             p = p.next = new Node(keys[i2], values[i2]);
4484           }
4485           p.next = null;
4486           return head.next;
4487         }
4488         function toList(root3) {
4489           var current = root3;
4490           var Q = [];
4491           var done = false;
4492           var head = new Node(null, null);
4493           var p = head;
4494           while (!done) {
4495             if (current) {
4496               Q.push(current);
4497               current = current.left;
4498             } else {
4499               if (Q.length > 0) {
4500                 current = p = p.next = Q.pop();
4501                 current = current.right;
4502               } else
4503                 done = true;
4504             }
4505           }
4506           p.next = null;
4507           return head.next;
4508         }
4509         function sortedListToBST(list, start2, end) {
4510           var size = end - start2;
4511           if (size > 0) {
4512             var middle = start2 + Math.floor(size / 2);
4513             var left = sortedListToBST(list, start2, middle);
4514             var root3 = list.head;
4515             root3.left = left;
4516             list.head = list.head.next;
4517             root3.right = sortedListToBST(list, middle + 1, end);
4518             return root3;
4519           }
4520           return null;
4521         }
4522         function mergeLists(l1, l2, compare) {
4523           var head = new Node(null, null);
4524           var p = head;
4525           var p1 = l1;
4526           var p2 = l2;
4527           while (p1 !== null && p2 !== null) {
4528             if (compare(p1.key, p2.key) < 0) {
4529               p.next = p1;
4530               p1 = p1.next;
4531             } else {
4532               p.next = p2;
4533               p2 = p2.next;
4534             }
4535             p = p.next;
4536           }
4537           if (p1 !== null) {
4538             p.next = p1;
4539           } else if (p2 !== null) {
4540             p.next = p2;
4541           }
4542           return head.next;
4543         }
4544         function sort(keys, values, left, right, compare) {
4545           if (left >= right)
4546             return;
4547           var pivot = keys[left + right >> 1];
4548           var i2 = left - 1;
4549           var j2 = right + 1;
4550           while (true) {
4551             do {
4552               i2++;
4553             } while (compare(keys[i2], pivot) < 0);
4554             do {
4555               j2--;
4556             } while (compare(keys[j2], pivot) > 0);
4557             if (i2 >= j2)
4558               break;
4559             var tmp = keys[i2];
4560             keys[i2] = keys[j2];
4561             keys[j2] = tmp;
4562             tmp = values[i2];
4563             values[i2] = values[j2];
4564             values[j2] = tmp;
4565           }
4566           sort(keys, values, left, j2, compare);
4567           sort(keys, values, j2 + 1, right, compare);
4568         }
4569         var isInBbox = function isInBbox2(bbox2, point2) {
4570           return bbox2.ll.x <= point2.x && point2.x <= bbox2.ur.x && bbox2.ll.y <= point2.y && point2.y <= bbox2.ur.y;
4571         };
4572         var getBboxOverlap = function getBboxOverlap2(b1, b2) {
4573           if (b2.ur.x < b1.ll.x || b1.ur.x < b2.ll.x || b2.ur.y < b1.ll.y || b1.ur.y < b2.ll.y)
4574             return null;
4575           var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;
4576           var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x;
4577           var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;
4578           var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y;
4579           return {
4580             ll: {
4581               x: lowerX,
4582               y: lowerY
4583             },
4584             ur: {
4585               x: upperX,
4586               y: upperY
4587             }
4588           };
4589         };
4590         var epsilon3 = Number.EPSILON;
4591         if (epsilon3 === void 0)
4592           epsilon3 = Math.pow(2, -52);
4593         var EPSILON_SQ = epsilon3 * epsilon3;
4594         var cmp = function cmp2(a, b) {
4595           if (-epsilon3 < a && a < epsilon3) {
4596             if (-epsilon3 < b && b < epsilon3) {
4597               return 0;
4598             }
4599           }
4600           var ab = a - b;
4601           if (ab * ab < EPSILON_SQ * a * b) {
4602             return 0;
4603           }
4604           return a < b ? -1 : 1;
4605         };
4606         var PtRounder = /* @__PURE__ */ function() {
4607           function PtRounder2() {
4608             _classCallCheck(this, PtRounder2);
4609             this.reset();
4610           }
4611           _createClass(PtRounder2, [{
4612             key: "reset",
4613             value: function reset() {
4614               this.xRounder = new CoordRounder();
4615               this.yRounder = new CoordRounder();
4616             }
4617           }, {
4618             key: "round",
4619             value: function round(x, y) {
4620               return {
4621                 x: this.xRounder.round(x),
4622                 y: this.yRounder.round(y)
4623               };
4624             }
4625           }]);
4626           return PtRounder2;
4627         }();
4628         var CoordRounder = /* @__PURE__ */ function() {
4629           function CoordRounder2() {
4630             _classCallCheck(this, CoordRounder2);
4631             this.tree = new Tree();
4632             this.round(0);
4633           }
4634           _createClass(CoordRounder2, [{
4635             key: "round",
4636             value: function round(coord2) {
4637               var node = this.tree.add(coord2);
4638               var prevNode = this.tree.prev(node);
4639               if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {
4640                 this.tree.remove(coord2);
4641                 return prevNode.key;
4642               }
4643               var nextNode = this.tree.next(node);
4644               if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {
4645                 this.tree.remove(coord2);
4646                 return nextNode.key;
4647               }
4648               return coord2;
4649             }
4650           }]);
4651           return CoordRounder2;
4652         }();
4653         var rounder = new PtRounder();
4654         var crossProduct = function crossProduct2(a, b) {
4655           return a.x * b.y - a.y * b.x;
4656         };
4657         var dotProduct = function dotProduct2(a, b) {
4658           return a.x * b.x + a.y * b.y;
4659         };
4660         var compareVectorAngles = function compareVectorAngles2(basePt, endPt1, endPt2) {
4661           var v1 = {
4662             x: endPt1.x - basePt.x,
4663             y: endPt1.y - basePt.y
4664           };
4665           var v2 = {
4666             x: endPt2.x - basePt.x,
4667             y: endPt2.y - basePt.y
4668           };
4669           var kross = crossProduct(v1, v2);
4670           return cmp(kross, 0);
4671         };
4672         var length = function length2(v) {
4673           return Math.sqrt(dotProduct(v, v));
4674         };
4675         var sineOfAngle = function sineOfAngle2(pShared, pBase, pAngle) {
4676           var vBase = {
4677             x: pBase.x - pShared.x,
4678             y: pBase.y - pShared.y
4679           };
4680           var vAngle = {
4681             x: pAngle.x - pShared.x,
4682             y: pAngle.y - pShared.y
4683           };
4684           return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);
4685         };
4686         var cosineOfAngle = function cosineOfAngle2(pShared, pBase, pAngle) {
4687           var vBase = {
4688             x: pBase.x - pShared.x,
4689             y: pBase.y - pShared.y
4690           };
4691           var vAngle = {
4692             x: pAngle.x - pShared.x,
4693             y: pAngle.y - pShared.y
4694           };
4695           return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);
4696         };
4697         var horizontalIntersection = function horizontalIntersection2(pt, v, y) {
4698           if (v.y === 0)
4699             return null;
4700           return {
4701             x: pt.x + v.x / v.y * (y - pt.y),
4702             y
4703           };
4704         };
4705         var verticalIntersection = function verticalIntersection2(pt, v, x) {
4706           if (v.x === 0)
4707             return null;
4708           return {
4709             x,
4710             y: pt.y + v.y / v.x * (x - pt.x)
4711           };
4712         };
4713         var intersection = function intersection2(pt1, v1, pt2, v2) {
4714           if (v1.x === 0)
4715             return verticalIntersection(pt2, v2, pt1.x);
4716           if (v2.x === 0)
4717             return verticalIntersection(pt1, v1, pt2.x);
4718           if (v1.y === 0)
4719             return horizontalIntersection(pt2, v2, pt1.y);
4720           if (v2.y === 0)
4721             return horizontalIntersection(pt1, v1, pt2.y);
4722           var kross = crossProduct(v1, v2);
4723           if (kross == 0)
4724             return null;
4725           var ve = {
4726             x: pt2.x - pt1.x,
4727             y: pt2.y - pt1.y
4728           };
4729           var d1 = crossProduct(ve, v1) / kross;
4730           var d2 = crossProduct(ve, v2) / kross;
4731           var x12 = pt1.x + d2 * v1.x, x2 = pt2.x + d1 * v2.x;
4732           var y12 = pt1.y + d2 * v1.y, y2 = pt2.y + d1 * v2.y;
4733           var x = (x12 + x2) / 2;
4734           var y = (y12 + y2) / 2;
4735           return {
4736             x,
4737             y
4738           };
4739         };
4740         var SweepEvent = /* @__PURE__ */ function() {
4741           _createClass(SweepEvent2, null, [{
4742             key: "compare",
4743             // for ordering sweep events in the sweep event queue
4744             value: function compare(a, b) {
4745               var ptCmp = SweepEvent2.comparePoints(a.point, b.point);
4746               if (ptCmp !== 0)
4747                 return ptCmp;
4748               if (a.point !== b.point)
4749                 a.link(b);
4750               if (a.isLeft !== b.isLeft)
4751                 return a.isLeft ? 1 : -1;
4752               return Segment.compare(a.segment, b.segment);
4753             }
4754             // for ordering points in sweep line order
4755           }, {
4756             key: "comparePoints",
4757             value: function comparePoints(aPt, bPt) {
4758               if (aPt.x < bPt.x)
4759                 return -1;
4760               if (aPt.x > bPt.x)
4761                 return 1;
4762               if (aPt.y < bPt.y)
4763                 return -1;
4764               if (aPt.y > bPt.y)
4765                 return 1;
4766               return 0;
4767             }
4768             // Warning: 'point' input will be modified and re-used (for performance)
4769           }]);
4770           function SweepEvent2(point2, isLeft) {
4771             _classCallCheck(this, SweepEvent2);
4772             if (point2.events === void 0)
4773               point2.events = [this];
4774             else
4775               point2.events.push(this);
4776             this.point = point2;
4777             this.isLeft = isLeft;
4778           }
4779           _createClass(SweepEvent2, [{
4780             key: "link",
4781             value: function link2(other) {
4782               if (other.point === this.point) {
4783                 throw new Error("Tried to link already linked events");
4784               }
4785               var otherEvents = other.point.events;
4786               for (var i2 = 0, iMax = otherEvents.length; i2 < iMax; i2++) {
4787                 var evt = otherEvents[i2];
4788                 this.point.events.push(evt);
4789                 evt.point = this.point;
4790               }
4791               this.checkForConsuming();
4792             }
4793             /* Do a pass over our linked events and check to see if any pair
4794              * of segments match, and should be consumed. */
4795           }, {
4796             key: "checkForConsuming",
4797             value: function checkForConsuming() {
4798               var numEvents = this.point.events.length;
4799               for (var i2 = 0; i2 < numEvents; i2++) {
4800                 var evt1 = this.point.events[i2];
4801                 if (evt1.segment.consumedBy !== void 0)
4802                   continue;
4803                 for (var j2 = i2 + 1; j2 < numEvents; j2++) {
4804                   var evt2 = this.point.events[j2];
4805                   if (evt2.consumedBy !== void 0)
4806                     continue;
4807                   if (evt1.otherSE.point.events !== evt2.otherSE.point.events)
4808                     continue;
4809                   evt1.segment.consume(evt2.segment);
4810                 }
4811               }
4812             }
4813           }, {
4814             key: "getAvailableLinkedEvents",
4815             value: function getAvailableLinkedEvents() {
4816               var events = [];
4817               for (var i2 = 0, iMax = this.point.events.length; i2 < iMax; i2++) {
4818                 var evt = this.point.events[i2];
4819                 if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {
4820                   events.push(evt);
4821                 }
4822               }
4823               return events;
4824             }
4825             /**
4826              * Returns a comparator function for sorting linked events that will
4827              * favor the event that will give us the smallest left-side angle.
4828              * All ring construction starts as low as possible heading to the right,
4829              * so by always turning left as sharp as possible we'll get polygons
4830              * without uncessary loops & holes.
4831              *
4832              * The comparator function has a compute cache such that it avoids
4833              * re-computing already-computed values.
4834              */
4835           }, {
4836             key: "getLeftmostComparator",
4837             value: function getLeftmostComparator(baseEvent) {
4838               var _this = this;
4839               var cache = /* @__PURE__ */ new Map();
4840               var fillCache = function fillCache2(linkedEvent) {
4841                 var nextEvent = linkedEvent.otherSE;
4842                 cache.set(linkedEvent, {
4843                   sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),
4844                   cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)
4845                 });
4846               };
4847               return function(a, b) {
4848                 if (!cache.has(a))
4849                   fillCache(a);
4850                 if (!cache.has(b))
4851                   fillCache(b);
4852                 var _cache$get = cache.get(a), asine = _cache$get.sine, acosine = _cache$get.cosine;
4853                 var _cache$get2 = cache.get(b), bsine = _cache$get2.sine, bcosine = _cache$get2.cosine;
4854                 if (asine >= 0 && bsine >= 0) {
4855                   if (acosine < bcosine)
4856                     return 1;
4857                   if (acosine > bcosine)
4858                     return -1;
4859                   return 0;
4860                 }
4861                 if (asine < 0 && bsine < 0) {
4862                   if (acosine < bcosine)
4863                     return -1;
4864                   if (acosine > bcosine)
4865                     return 1;
4866                   return 0;
4867                 }
4868                 if (bsine < asine)
4869                   return -1;
4870                 if (bsine > asine)
4871                   return 1;
4872                 return 0;
4873               };
4874             }
4875           }]);
4876           return SweepEvent2;
4877         }();
4878         var segmentId = 0;
4879         var Segment = /* @__PURE__ */ function() {
4880           _createClass(Segment2, null, [{
4881             key: "compare",
4882             /* This compare() function is for ordering segments in the sweep
4883              * line tree, and does so according to the following criteria:
4884              *
4885              * Consider the vertical line that lies an infinestimal step to the
4886              * right of the right-more of the two left endpoints of the input
4887              * segments. Imagine slowly moving a point up from negative infinity
4888              * in the increasing y direction. Which of the two segments will that
4889              * point intersect first? That segment comes 'before' the other one.
4890              *
4891              * If neither segment would be intersected by such a line, (if one
4892              * or more of the segments are vertical) then the line to be considered
4893              * is directly on the right-more of the two left inputs.
4894              */
4895             value: function compare(a, b) {
4896               var alx = a.leftSE.point.x;
4897               var blx = b.leftSE.point.x;
4898               var arx = a.rightSE.point.x;
4899               var brx = b.rightSE.point.x;
4900               if (brx < alx)
4901                 return 1;
4902               if (arx < blx)
4903                 return -1;
4904               var aly = a.leftSE.point.y;
4905               var bly = b.leftSE.point.y;
4906               var ary = a.rightSE.point.y;
4907               var bry = b.rightSE.point.y;
4908               if (alx < blx) {
4909                 if (bly < aly && bly < ary)
4910                   return 1;
4911                 if (bly > aly && bly > ary)
4912                   return -1;
4913                 var aCmpBLeft = a.comparePoint(b.leftSE.point);
4914                 if (aCmpBLeft < 0)
4915                   return 1;
4916                 if (aCmpBLeft > 0)
4917                   return -1;
4918                 var bCmpARight = b.comparePoint(a.rightSE.point);
4919                 if (bCmpARight !== 0)
4920                   return bCmpARight;
4921                 return -1;
4922               }
4923               if (alx > blx) {
4924                 if (aly < bly && aly < bry)
4925                   return -1;
4926                 if (aly > bly && aly > bry)
4927                   return 1;
4928                 var bCmpALeft = b.comparePoint(a.leftSE.point);
4929                 if (bCmpALeft !== 0)
4930                   return bCmpALeft;
4931                 var aCmpBRight = a.comparePoint(b.rightSE.point);
4932                 if (aCmpBRight < 0)
4933                   return 1;
4934                 if (aCmpBRight > 0)
4935                   return -1;
4936                 return 1;
4937               }
4938               if (aly < bly)
4939                 return -1;
4940               if (aly > bly)
4941                 return 1;
4942               if (arx < brx) {
4943                 var _bCmpARight = b.comparePoint(a.rightSE.point);
4944                 if (_bCmpARight !== 0)
4945                   return _bCmpARight;
4946               }
4947               if (arx > brx) {
4948                 var _aCmpBRight = a.comparePoint(b.rightSE.point);
4949                 if (_aCmpBRight < 0)
4950                   return 1;
4951                 if (_aCmpBRight > 0)
4952                   return -1;
4953               }
4954               if (arx !== brx) {
4955                 var ay = ary - aly;
4956                 var ax = arx - alx;
4957                 var by = bry - bly;
4958                 var bx = brx - blx;
4959                 if (ay > ax && by < bx)
4960                   return 1;
4961                 if (ay < ax && by > bx)
4962                   return -1;
4963               }
4964               if (arx > brx)
4965                 return 1;
4966               if (arx < brx)
4967                 return -1;
4968               if (ary < bry)
4969                 return -1;
4970               if (ary > bry)
4971                 return 1;
4972               if (a.id < b.id)
4973                 return -1;
4974               if (a.id > b.id)
4975                 return 1;
4976               return 0;
4977             }
4978             /* Warning: a reference to ringWindings input will be stored,
4979              *  and possibly will be later modified */
4980           }]);
4981           function Segment2(leftSE, rightSE, rings, windings) {
4982             _classCallCheck(this, Segment2);
4983             this.id = ++segmentId;
4984             this.leftSE = leftSE;
4985             leftSE.segment = this;
4986             leftSE.otherSE = rightSE;
4987             this.rightSE = rightSE;
4988             rightSE.segment = this;
4989             rightSE.otherSE = leftSE;
4990             this.rings = rings;
4991             this.windings = windings;
4992           }
4993           _createClass(Segment2, [{
4994             key: "replaceRightSE",
4995             /* When a segment is split, the rightSE is replaced with a new sweep event */
4996             value: function replaceRightSE(newRightSE) {
4997               this.rightSE = newRightSE;
4998               this.rightSE.segment = this;
4999               this.rightSE.otherSE = this.leftSE;
5000               this.leftSE.otherSE = this.rightSE;
5001             }
5002           }, {
5003             key: "bbox",
5004             value: function bbox2() {
5005               var y12 = this.leftSE.point.y;
5006               var y2 = this.rightSE.point.y;
5007               return {
5008                 ll: {
5009                   x: this.leftSE.point.x,
5010                   y: y12 < y2 ? y12 : y2
5011                 },
5012                 ur: {
5013                   x: this.rightSE.point.x,
5014                   y: y12 > y2 ? y12 : y2
5015                 }
5016               };
5017             }
5018             /* A vector from the left point to the right */
5019           }, {
5020             key: "vector",
5021             value: function vector() {
5022               return {
5023                 x: this.rightSE.point.x - this.leftSE.point.x,
5024                 y: this.rightSE.point.y - this.leftSE.point.y
5025               };
5026             }
5027           }, {
5028             key: "isAnEndpoint",
5029             value: function isAnEndpoint(pt) {
5030               return pt.x === this.leftSE.point.x && pt.y === this.leftSE.point.y || pt.x === this.rightSE.point.x && pt.y === this.rightSE.point.y;
5031             }
5032             /* Compare this segment with a point.
5033              *
5034              * A point P is considered to be colinear to a segment if there
5035              * exists a distance D such that if we travel along the segment
5036              * from one * endpoint towards the other a distance D, we find
5037              * ourselves at point P.
5038              *
5039              * Return value indicates:
5040              *
5041              *   1: point lies above the segment (to the left of vertical)
5042              *   0: point is colinear to segment
5043              *  -1: point lies below the segment (to the right of vertical)
5044              */
5045           }, {
5046             key: "comparePoint",
5047             value: function comparePoint(point2) {
5048               if (this.isAnEndpoint(point2))
5049                 return 0;
5050               var lPt = this.leftSE.point;
5051               var rPt = this.rightSE.point;
5052               var v = this.vector();
5053               if (lPt.x === rPt.x) {
5054                 if (point2.x === lPt.x)
5055                   return 0;
5056                 return point2.x < lPt.x ? 1 : -1;
5057               }
5058               var yDist = (point2.y - lPt.y) / v.y;
5059               var xFromYDist = lPt.x + yDist * v.x;
5060               if (point2.x === xFromYDist)
5061                 return 0;
5062               var xDist = (point2.x - lPt.x) / v.x;
5063               var yFromXDist = lPt.y + xDist * v.y;
5064               if (point2.y === yFromXDist)
5065                 return 0;
5066               return point2.y < yFromXDist ? -1 : 1;
5067             }
5068             /**
5069              * Given another segment, returns the first non-trivial intersection
5070              * between the two segments (in terms of sweep line ordering), if it exists.
5071              *
5072              * A 'non-trivial' intersection is one that will cause one or both of the
5073              * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:
5074              *
5075              *   * endpoint of segA with endpoint of segB --> trivial
5076              *   * endpoint of segA with point along segB --> non-trivial
5077              *   * endpoint of segB with point along segA --> non-trivial
5078              *   * point along segA with point along segB --> non-trivial
5079              *
5080              * If no non-trivial intersection exists, return null
5081              * Else, return null.
5082              */
5083           }, {
5084             key: "getIntersection",
5085             value: function getIntersection(other) {
5086               var tBbox = this.bbox();
5087               var oBbox = other.bbox();
5088               var bboxOverlap = getBboxOverlap(tBbox, oBbox);
5089               if (bboxOverlap === null)
5090                 return null;
5091               var tlp = this.leftSE.point;
5092               var trp = this.rightSE.point;
5093               var olp = other.leftSE.point;
5094               var orp = other.rightSE.point;
5095               var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;
5096               var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;
5097               var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;
5098               var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0;
5099               if (touchesThisLSE && touchesOtherLSE) {
5100                 if (touchesThisRSE && !touchesOtherRSE)
5101                   return trp;
5102                 if (!touchesThisRSE && touchesOtherRSE)
5103                   return orp;
5104                 return null;
5105               }
5106               if (touchesThisLSE) {
5107                 if (touchesOtherRSE) {
5108                   if (tlp.x === orp.x && tlp.y === orp.y)
5109                     return null;
5110                 }
5111                 return tlp;
5112               }
5113               if (touchesOtherLSE) {
5114                 if (touchesThisRSE) {
5115                   if (trp.x === olp.x && trp.y === olp.y)
5116                     return null;
5117                 }
5118                 return olp;
5119               }
5120               if (touchesThisRSE && touchesOtherRSE)
5121                 return null;
5122               if (touchesThisRSE)
5123                 return trp;
5124               if (touchesOtherRSE)
5125                 return orp;
5126               var pt = intersection(tlp, this.vector(), olp, other.vector());
5127               if (pt === null)
5128                 return null;
5129               if (!isInBbox(bboxOverlap, pt))
5130                 return null;
5131               return rounder.round(pt.x, pt.y);
5132             }
5133             /**
5134              * Split the given segment into multiple segments on the given points.
5135              *  * Each existing segment will retain its leftSE and a new rightSE will be
5136              *    generated for it.
5137              *  * A new segment will be generated which will adopt the original segment's
5138              *    rightSE, and a new leftSE will be generated for it.
5139              *  * If there are more than two points given to split on, new segments
5140              *    in the middle will be generated with new leftSE and rightSE's.
5141              *  * An array of the newly generated SweepEvents will be returned.
5142              *
5143              * Warning: input array of points is modified
5144              */
5145           }, {
5146             key: "split",
5147             value: function split2(point2) {
5148               var newEvents = [];
5149               var alreadyLinked = point2.events !== void 0;
5150               var newLeftSE = new SweepEvent(point2, true);
5151               var newRightSE = new SweepEvent(point2, false);
5152               var oldRightSE = this.rightSE;
5153               this.replaceRightSE(newRightSE);
5154               newEvents.push(newRightSE);
5155               newEvents.push(newLeftSE);
5156               var newSeg = new Segment2(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice());
5157               if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {
5158                 newSeg.swapEvents();
5159               }
5160               if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {
5161                 this.swapEvents();
5162               }
5163               if (alreadyLinked) {
5164                 newLeftSE.checkForConsuming();
5165                 newRightSE.checkForConsuming();
5166               }
5167               return newEvents;
5168             }
5169             /* Swap which event is left and right */
5170           }, {
5171             key: "swapEvents",
5172             value: function swapEvents() {
5173               var tmpEvt = this.rightSE;
5174               this.rightSE = this.leftSE;
5175               this.leftSE = tmpEvt;
5176               this.leftSE.isLeft = true;
5177               this.rightSE.isLeft = false;
5178               for (var i2 = 0, iMax = this.windings.length; i2 < iMax; i2++) {
5179                 this.windings[i2] *= -1;
5180               }
5181             }
5182             /* Consume another segment. We take their rings under our wing
5183              * and mark them as consumed. Use for perfectly overlapping segments */
5184           }, {
5185             key: "consume",
5186             value: function consume(other) {
5187               var consumer = this;
5188               var consumee = other;
5189               while (consumer.consumedBy) {
5190                 consumer = consumer.consumedBy;
5191               }
5192               while (consumee.consumedBy) {
5193                 consumee = consumee.consumedBy;
5194               }
5195               var cmp2 = Segment2.compare(consumer, consumee);
5196               if (cmp2 === 0)
5197                 return;
5198               if (cmp2 > 0) {
5199                 var tmp = consumer;
5200                 consumer = consumee;
5201                 consumee = tmp;
5202               }
5203               if (consumer.prev === consumee) {
5204                 var _tmp = consumer;
5205                 consumer = consumee;
5206                 consumee = _tmp;
5207               }
5208               for (var i2 = 0, iMax = consumee.rings.length; i2 < iMax; i2++) {
5209                 var ring = consumee.rings[i2];
5210                 var winding = consumee.windings[i2];
5211                 var index2 = consumer.rings.indexOf(ring);
5212                 if (index2 === -1) {
5213                   consumer.rings.push(ring);
5214                   consumer.windings.push(winding);
5215                 } else
5216                   consumer.windings[index2] += winding;
5217               }
5218               consumee.rings = null;
5219               consumee.windings = null;
5220               consumee.consumedBy = consumer;
5221               consumee.leftSE.consumedBy = consumer.leftSE;
5222               consumee.rightSE.consumedBy = consumer.rightSE;
5223             }
5224             /* The first segment previous segment chain that is in the result */
5225           }, {
5226             key: "prevInResult",
5227             value: function prevInResult() {
5228               if (this._prevInResult !== void 0)
5229                 return this._prevInResult;
5230               if (!this.prev)
5231                 this._prevInResult = null;
5232               else if (this.prev.isInResult())
5233                 this._prevInResult = this.prev;
5234               else
5235                 this._prevInResult = this.prev.prevInResult();
5236               return this._prevInResult;
5237             }
5238           }, {
5239             key: "beforeState",
5240             value: function beforeState() {
5241               if (this._beforeState !== void 0)
5242                 return this._beforeState;
5243               if (!this.prev)
5244                 this._beforeState = {
5245                   rings: [],
5246                   windings: [],
5247                   multiPolys: []
5248                 };
5249               else {
5250                 var seg = this.prev.consumedBy || this.prev;
5251                 this._beforeState = seg.afterState();
5252               }
5253               return this._beforeState;
5254             }
5255           }, {
5256             key: "afterState",
5257             value: function afterState() {
5258               if (this._afterState !== void 0)
5259                 return this._afterState;
5260               var beforeState = this.beforeState();
5261               this._afterState = {
5262                 rings: beforeState.rings.slice(0),
5263                 windings: beforeState.windings.slice(0),
5264                 multiPolys: []
5265               };
5266               var ringsAfter = this._afterState.rings;
5267               var windingsAfter = this._afterState.windings;
5268               var mpsAfter = this._afterState.multiPolys;
5269               for (var i2 = 0, iMax = this.rings.length; i2 < iMax; i2++) {
5270                 var ring = this.rings[i2];
5271                 var winding = this.windings[i2];
5272                 var index2 = ringsAfter.indexOf(ring);
5273                 if (index2 === -1) {
5274                   ringsAfter.push(ring);
5275                   windingsAfter.push(winding);
5276                 } else
5277                   windingsAfter[index2] += winding;
5278               }
5279               var polysAfter = [];
5280               var polysExclude = [];
5281               for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {
5282                 if (windingsAfter[_i] === 0)
5283                   continue;
5284                 var _ring = ringsAfter[_i];
5285                 var poly = _ring.poly;
5286                 if (polysExclude.indexOf(poly) !== -1)
5287                   continue;
5288                 if (_ring.isExterior)
5289                   polysAfter.push(poly);
5290                 else {
5291                   if (polysExclude.indexOf(poly) === -1)
5292                     polysExclude.push(poly);
5293                   var _index = polysAfter.indexOf(_ring.poly);
5294                   if (_index !== -1)
5295                     polysAfter.splice(_index, 1);
5296                 }
5297               }
5298               for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {
5299                 var mp = polysAfter[_i2].multiPoly;
5300                 if (mpsAfter.indexOf(mp) === -1)
5301                   mpsAfter.push(mp);
5302               }
5303               return this._afterState;
5304             }
5305             /* Is this segment part of the final result? */
5306           }, {
5307             key: "isInResult",
5308             value: function isInResult() {
5309               if (this.consumedBy)
5310                 return false;
5311               if (this._isInResult !== void 0)
5312                 return this._isInResult;
5313               var mpsBefore = this.beforeState().multiPolys;
5314               var mpsAfter = this.afterState().multiPolys;
5315               switch (operation.type) {
5316                 case "union": {
5317                   var noBefores = mpsBefore.length === 0;
5318                   var noAfters = mpsAfter.length === 0;
5319                   this._isInResult = noBefores !== noAfters;
5320                   break;
5321                 }
5322                 case "intersection": {
5323                   var least;
5324                   var most;
5325                   if (mpsBefore.length < mpsAfter.length) {
5326                     least = mpsBefore.length;
5327                     most = mpsAfter.length;
5328                   } else {
5329                     least = mpsAfter.length;
5330                     most = mpsBefore.length;
5331                   }
5332                   this._isInResult = most === operation.numMultiPolys && least < most;
5333                   break;
5334                 }
5335                 case "xor": {
5336                   var diff = Math.abs(mpsBefore.length - mpsAfter.length);
5337                   this._isInResult = diff % 2 === 1;
5338                   break;
5339                 }
5340                 case "difference": {
5341                   var isJustSubject = function isJustSubject2(mps) {
5342                     return mps.length === 1 && mps[0].isSubject;
5343                   };
5344                   this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);
5345                   break;
5346                 }
5347                 default:
5348                   throw new Error("Unrecognized operation type found ".concat(operation.type));
5349               }
5350               return this._isInResult;
5351             }
5352           }], [{
5353             key: "fromRing",
5354             value: function fromRing(pt1, pt2, ring) {
5355               var leftPt, rightPt, winding;
5356               var cmpPts = SweepEvent.comparePoints(pt1, pt2);
5357               if (cmpPts < 0) {
5358                 leftPt = pt1;
5359                 rightPt = pt2;
5360                 winding = 1;
5361               } else if (cmpPts > 0) {
5362                 leftPt = pt2;
5363                 rightPt = pt1;
5364                 winding = -1;
5365               } else
5366                 throw new Error("Tried to create degenerate segment at [".concat(pt1.x, ", ").concat(pt1.y, "]"));
5367               var leftSE = new SweepEvent(leftPt, true);
5368               var rightSE = new SweepEvent(rightPt, false);
5369               return new Segment2(leftSE, rightSE, [ring], [winding]);
5370             }
5371           }]);
5372           return Segment2;
5373         }();
5374         var RingIn = /* @__PURE__ */ function() {
5375           function RingIn2(geomRing, poly, isExterior) {
5376             _classCallCheck(this, RingIn2);
5377             if (!Array.isArray(geomRing) || geomRing.length === 0) {
5378               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5379             }
5380             this.poly = poly;
5381             this.isExterior = isExterior;
5382             this.segments = [];
5383             if (typeof geomRing[0][0] !== "number" || typeof geomRing[0][1] !== "number") {
5384               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5385             }
5386             var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);
5387             this.bbox = {
5388               ll: {
5389                 x: firstPoint.x,
5390                 y: firstPoint.y
5391               },
5392               ur: {
5393                 x: firstPoint.x,
5394                 y: firstPoint.y
5395               }
5396             };
5397             var prevPoint = firstPoint;
5398             for (var i2 = 1, iMax = geomRing.length; i2 < iMax; i2++) {
5399               if (typeof geomRing[i2][0] !== "number" || typeof geomRing[i2][1] !== "number") {
5400                 throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5401               }
5402               var point2 = rounder.round(geomRing[i2][0], geomRing[i2][1]);
5403               if (point2.x === prevPoint.x && point2.y === prevPoint.y)
5404                 continue;
5405               this.segments.push(Segment.fromRing(prevPoint, point2, this));
5406               if (point2.x < this.bbox.ll.x)
5407                 this.bbox.ll.x = point2.x;
5408               if (point2.y < this.bbox.ll.y)
5409                 this.bbox.ll.y = point2.y;
5410               if (point2.x > this.bbox.ur.x)
5411                 this.bbox.ur.x = point2.x;
5412               if (point2.y > this.bbox.ur.y)
5413                 this.bbox.ur.y = point2.y;
5414               prevPoint = point2;
5415             }
5416             if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {
5417               this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));
5418             }
5419           }
5420           _createClass(RingIn2, [{
5421             key: "getSweepEvents",
5422             value: function getSweepEvents() {
5423               var sweepEvents = [];
5424               for (var i2 = 0, iMax = this.segments.length; i2 < iMax; i2++) {
5425                 var segment = this.segments[i2];
5426                 sweepEvents.push(segment.leftSE);
5427                 sweepEvents.push(segment.rightSE);
5428               }
5429               return sweepEvents;
5430             }
5431           }]);
5432           return RingIn2;
5433         }();
5434         var PolyIn = /* @__PURE__ */ function() {
5435           function PolyIn2(geomPoly, multiPoly) {
5436             _classCallCheck(this, PolyIn2);
5437             if (!Array.isArray(geomPoly)) {
5438               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5439             }
5440             this.exteriorRing = new RingIn(geomPoly[0], this, true);
5441             this.bbox = {
5442               ll: {
5443                 x: this.exteriorRing.bbox.ll.x,
5444                 y: this.exteriorRing.bbox.ll.y
5445               },
5446               ur: {
5447                 x: this.exteriorRing.bbox.ur.x,
5448                 y: this.exteriorRing.bbox.ur.y
5449               }
5450             };
5451             this.interiorRings = [];
5452             for (var i2 = 1, iMax = geomPoly.length; i2 < iMax; i2++) {
5453               var ring = new RingIn(geomPoly[i2], this, false);
5454               if (ring.bbox.ll.x < this.bbox.ll.x)
5455                 this.bbox.ll.x = ring.bbox.ll.x;
5456               if (ring.bbox.ll.y < this.bbox.ll.y)
5457                 this.bbox.ll.y = ring.bbox.ll.y;
5458               if (ring.bbox.ur.x > this.bbox.ur.x)
5459                 this.bbox.ur.x = ring.bbox.ur.x;
5460               if (ring.bbox.ur.y > this.bbox.ur.y)
5461                 this.bbox.ur.y = ring.bbox.ur.y;
5462               this.interiorRings.push(ring);
5463             }
5464             this.multiPoly = multiPoly;
5465           }
5466           _createClass(PolyIn2, [{
5467             key: "getSweepEvents",
5468             value: function getSweepEvents() {
5469               var sweepEvents = this.exteriorRing.getSweepEvents();
5470               for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) {
5471                 var ringSweepEvents = this.interiorRings[i2].getSweepEvents();
5472                 for (var j2 = 0, jMax = ringSweepEvents.length; j2 < jMax; j2++) {
5473                   sweepEvents.push(ringSweepEvents[j2]);
5474                 }
5475               }
5476               return sweepEvents;
5477             }
5478           }]);
5479           return PolyIn2;
5480         }();
5481         var MultiPolyIn = /* @__PURE__ */ function() {
5482           function MultiPolyIn2(geom, isSubject) {
5483             _classCallCheck(this, MultiPolyIn2);
5484             if (!Array.isArray(geom)) {
5485               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5486             }
5487             try {
5488               if (typeof geom[0][0][0] === "number")
5489                 geom = [geom];
5490             } catch (ex) {
5491             }
5492             this.polys = [];
5493             this.bbox = {
5494               ll: {
5495                 x: Number.POSITIVE_INFINITY,
5496                 y: Number.POSITIVE_INFINITY
5497               },
5498               ur: {
5499                 x: Number.NEGATIVE_INFINITY,
5500                 y: Number.NEGATIVE_INFINITY
5501               }
5502             };
5503             for (var i2 = 0, iMax = geom.length; i2 < iMax; i2++) {
5504               var poly = new PolyIn(geom[i2], this);
5505               if (poly.bbox.ll.x < this.bbox.ll.x)
5506                 this.bbox.ll.x = poly.bbox.ll.x;
5507               if (poly.bbox.ll.y < this.bbox.ll.y)
5508                 this.bbox.ll.y = poly.bbox.ll.y;
5509               if (poly.bbox.ur.x > this.bbox.ur.x)
5510                 this.bbox.ur.x = poly.bbox.ur.x;
5511               if (poly.bbox.ur.y > this.bbox.ur.y)
5512                 this.bbox.ur.y = poly.bbox.ur.y;
5513               this.polys.push(poly);
5514             }
5515             this.isSubject = isSubject;
5516           }
5517           _createClass(MultiPolyIn2, [{
5518             key: "getSweepEvents",
5519             value: function getSweepEvents() {
5520               var sweepEvents = [];
5521               for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) {
5522                 var polySweepEvents = this.polys[i2].getSweepEvents();
5523                 for (var j2 = 0, jMax = polySweepEvents.length; j2 < jMax; j2++) {
5524                   sweepEvents.push(polySweepEvents[j2]);
5525                 }
5526               }
5527               return sweepEvents;
5528             }
5529           }]);
5530           return MultiPolyIn2;
5531         }();
5532         var RingOut = /* @__PURE__ */ function() {
5533           _createClass(RingOut2, null, [{
5534             key: "factory",
5535             /* Given the segments from the sweep line pass, compute & return a series
5536              * of closed rings from all the segments marked to be part of the result */
5537             value: function factory(allSegments) {
5538               var ringsOut = [];
5539               for (var i2 = 0, iMax = allSegments.length; i2 < iMax; i2++) {
5540                 var segment = allSegments[i2];
5541                 if (!segment.isInResult() || segment.ringOut)
5542                   continue;
5543                 var prevEvent = null;
5544                 var event = segment.leftSE;
5545                 var nextEvent = segment.rightSE;
5546                 var events = [event];
5547                 var startingPoint = event.point;
5548                 var intersectionLEs = [];
5549                 while (true) {
5550                   prevEvent = event;
5551                   event = nextEvent;
5552                   events.push(event);
5553                   if (event.point === startingPoint)
5554                     break;
5555                   while (true) {
5556                     var availableLEs = event.getAvailableLinkedEvents();
5557                     if (availableLEs.length === 0) {
5558                       var firstPt = events[0].point;
5559                       var lastPt = events[events.length - 1].point;
5560                       throw new Error("Unable to complete output ring starting at [".concat(firstPt.x, ",") + " ".concat(firstPt.y, "]. Last matching segment found ends at") + " [".concat(lastPt.x, ", ").concat(lastPt.y, "]."));
5561                     }
5562                     if (availableLEs.length === 1) {
5563                       nextEvent = availableLEs[0].otherSE;
5564                       break;
5565                     }
5566                     var indexLE = null;
5567                     for (var j2 = 0, jMax = intersectionLEs.length; j2 < jMax; j2++) {
5568                       if (intersectionLEs[j2].point === event.point) {
5569                         indexLE = j2;
5570                         break;
5571                       }
5572                     }
5573                     if (indexLE !== null) {
5574                       var intersectionLE = intersectionLEs.splice(indexLE)[0];
5575                       var ringEvents = events.splice(intersectionLE.index);
5576                       ringEvents.unshift(ringEvents[0].otherSE);
5577                       ringsOut.push(new RingOut2(ringEvents.reverse()));
5578                       continue;
5579                     }
5580                     intersectionLEs.push({
5581                       index: events.length,
5582                       point: event.point
5583                     });
5584                     var comparator = event.getLeftmostComparator(prevEvent);
5585                     nextEvent = availableLEs.sort(comparator)[0].otherSE;
5586                     break;
5587                   }
5588                 }
5589                 ringsOut.push(new RingOut2(events));
5590               }
5591               return ringsOut;
5592             }
5593           }]);
5594           function RingOut2(events) {
5595             _classCallCheck(this, RingOut2);
5596             this.events = events;
5597             for (var i2 = 0, iMax = events.length; i2 < iMax; i2++) {
5598               events[i2].segment.ringOut = this;
5599             }
5600             this.poly = null;
5601           }
5602           _createClass(RingOut2, [{
5603             key: "getGeom",
5604             value: function getGeom2() {
5605               var prevPt = this.events[0].point;
5606               var points = [prevPt];
5607               for (var i2 = 1, iMax = this.events.length - 1; i2 < iMax; i2++) {
5608                 var _pt = this.events[i2].point;
5609                 var _nextPt = this.events[i2 + 1].point;
5610                 if (compareVectorAngles(_pt, prevPt, _nextPt) === 0)
5611                   continue;
5612                 points.push(_pt);
5613                 prevPt = _pt;
5614               }
5615               if (points.length === 1)
5616                 return null;
5617               var pt = points[0];
5618               var nextPt = points[1];
5619               if (compareVectorAngles(pt, prevPt, nextPt) === 0)
5620                 points.shift();
5621               points.push(points[0]);
5622               var step = this.isExteriorRing() ? 1 : -1;
5623               var iStart = this.isExteriorRing() ? 0 : points.length - 1;
5624               var iEnd = this.isExteriorRing() ? points.length : -1;
5625               var orderedPoints = [];
5626               for (var _i = iStart; _i != iEnd; _i += step) {
5627                 orderedPoints.push([points[_i].x, points[_i].y]);
5628               }
5629               return orderedPoints;
5630             }
5631           }, {
5632             key: "isExteriorRing",
5633             value: function isExteriorRing() {
5634               if (this._isExteriorRing === void 0) {
5635                 var enclosing = this.enclosingRing();
5636                 this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;
5637               }
5638               return this._isExteriorRing;
5639             }
5640           }, {
5641             key: "enclosingRing",
5642             value: function enclosingRing() {
5643               if (this._enclosingRing === void 0) {
5644                 this._enclosingRing = this._calcEnclosingRing();
5645               }
5646               return this._enclosingRing;
5647             }
5648             /* Returns the ring that encloses this one, if any */
5649           }, {
5650             key: "_calcEnclosingRing",
5651             value: function _calcEnclosingRing() {
5652               var leftMostEvt = this.events[0];
5653               for (var i2 = 1, iMax = this.events.length; i2 < iMax; i2++) {
5654                 var evt = this.events[i2];
5655                 if (SweepEvent.compare(leftMostEvt, evt) > 0)
5656                   leftMostEvt = evt;
5657               }
5658               var prevSeg = leftMostEvt.segment.prevInResult();
5659               var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
5660               while (true) {
5661                 if (!prevSeg)
5662                   return null;
5663                 if (!prevPrevSeg)
5664                   return prevSeg.ringOut;
5665                 if (prevPrevSeg.ringOut !== prevSeg.ringOut) {
5666                   if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {
5667                     return prevSeg.ringOut;
5668                   } else
5669                     return prevSeg.ringOut.enclosingRing();
5670                 }
5671                 prevSeg = prevPrevSeg.prevInResult();
5672                 prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
5673               }
5674             }
5675           }]);
5676           return RingOut2;
5677         }();
5678         var PolyOut = /* @__PURE__ */ function() {
5679           function PolyOut2(exteriorRing) {
5680             _classCallCheck(this, PolyOut2);
5681             this.exteriorRing = exteriorRing;
5682             exteriorRing.poly = this;
5683             this.interiorRings = [];
5684           }
5685           _createClass(PolyOut2, [{
5686             key: "addInterior",
5687             value: function addInterior(ring) {
5688               this.interiorRings.push(ring);
5689               ring.poly = this;
5690             }
5691           }, {
5692             key: "getGeom",
5693             value: function getGeom2() {
5694               var geom = [this.exteriorRing.getGeom()];
5695               if (geom[0] === null)
5696                 return null;
5697               for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) {
5698                 var ringGeom = this.interiorRings[i2].getGeom();
5699                 if (ringGeom === null)
5700                   continue;
5701                 geom.push(ringGeom);
5702               }
5703               return geom;
5704             }
5705           }]);
5706           return PolyOut2;
5707         }();
5708         var MultiPolyOut = /* @__PURE__ */ function() {
5709           function MultiPolyOut2(rings) {
5710             _classCallCheck(this, MultiPolyOut2);
5711             this.rings = rings;
5712             this.polys = this._composePolys(rings);
5713           }
5714           _createClass(MultiPolyOut2, [{
5715             key: "getGeom",
5716             value: function getGeom2() {
5717               var geom = [];
5718               for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) {
5719                 var polyGeom = this.polys[i2].getGeom();
5720                 if (polyGeom === null)
5721                   continue;
5722                 geom.push(polyGeom);
5723               }
5724               return geom;
5725             }
5726           }, {
5727             key: "_composePolys",
5728             value: function _composePolys(rings) {
5729               var polys = [];
5730               for (var i2 = 0, iMax = rings.length; i2 < iMax; i2++) {
5731                 var ring = rings[i2];
5732                 if (ring.poly)
5733                   continue;
5734                 if (ring.isExteriorRing())
5735                   polys.push(new PolyOut(ring));
5736                 else {
5737                   var enclosingRing = ring.enclosingRing();
5738                   if (!enclosingRing.poly)
5739                     polys.push(new PolyOut(enclosingRing));
5740                   enclosingRing.poly.addInterior(ring);
5741                 }
5742               }
5743               return polys;
5744             }
5745           }]);
5746           return MultiPolyOut2;
5747         }();
5748         var SweepLine = /* @__PURE__ */ function() {
5749           function SweepLine2(queue) {
5750             var comparator = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Segment.compare;
5751             _classCallCheck(this, SweepLine2);
5752             this.queue = queue;
5753             this.tree = new Tree(comparator);
5754             this.segments = [];
5755           }
5756           _createClass(SweepLine2, [{
5757             key: "process",
5758             value: function process2(event) {
5759               var segment = event.segment;
5760               var newEvents = [];
5761               if (event.consumedBy) {
5762                 if (event.isLeft)
5763                   this.queue.remove(event.otherSE);
5764                 else
5765                   this.tree.remove(segment);
5766                 return newEvents;
5767               }
5768               var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);
5769               if (!node)
5770                 throw new Error("Unable to find segment #".concat(segment.id, " ") + "[".concat(segment.leftSE.point.x, ", ").concat(segment.leftSE.point.y, "] -> ") + "[".concat(segment.rightSE.point.x, ", ").concat(segment.rightSE.point.y, "] ") + "in SweepLine tree. Please submit a bug report.");
5771               var prevNode = node;
5772               var nextNode = node;
5773               var prevSeg = void 0;
5774               var nextSeg = void 0;
5775               while (prevSeg === void 0) {
5776                 prevNode = this.tree.prev(prevNode);
5777                 if (prevNode === null)
5778                   prevSeg = null;
5779                 else if (prevNode.key.consumedBy === void 0)
5780                   prevSeg = prevNode.key;
5781               }
5782               while (nextSeg === void 0) {
5783                 nextNode = this.tree.next(nextNode);
5784                 if (nextNode === null)
5785                   nextSeg = null;
5786                 else if (nextNode.key.consumedBy === void 0)
5787                   nextSeg = nextNode.key;
5788               }
5789               if (event.isLeft) {
5790                 var prevMySplitter = null;
5791                 if (prevSeg) {
5792                   var prevInter = prevSeg.getIntersection(segment);
5793                   if (prevInter !== null) {
5794                     if (!segment.isAnEndpoint(prevInter))
5795                       prevMySplitter = prevInter;
5796                     if (!prevSeg.isAnEndpoint(prevInter)) {
5797                       var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);
5798                       for (var i2 = 0, iMax = newEventsFromSplit.length; i2 < iMax; i2++) {
5799                         newEvents.push(newEventsFromSplit[i2]);
5800                       }
5801                     }
5802                   }
5803                 }
5804                 var nextMySplitter = null;
5805                 if (nextSeg) {
5806                   var nextInter = nextSeg.getIntersection(segment);
5807                   if (nextInter !== null) {
5808                     if (!segment.isAnEndpoint(nextInter))
5809                       nextMySplitter = nextInter;
5810                     if (!nextSeg.isAnEndpoint(nextInter)) {
5811                       var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);
5812                       for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {
5813                         newEvents.push(_newEventsFromSplit[_i]);
5814                       }
5815                     }
5816                   }
5817                 }
5818                 if (prevMySplitter !== null || nextMySplitter !== null) {
5819                   var mySplitter = null;
5820                   if (prevMySplitter === null)
5821                     mySplitter = nextMySplitter;
5822                   else if (nextMySplitter === null)
5823                     mySplitter = prevMySplitter;
5824                   else {
5825                     var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);
5826                     mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;
5827                   }
5828                   this.queue.remove(segment.rightSE);
5829                   newEvents.push(segment.rightSE);
5830                   var _newEventsFromSplit2 = segment.split(mySplitter);
5831                   for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {
5832                     newEvents.push(_newEventsFromSplit2[_i2]);
5833                   }
5834                 }
5835                 if (newEvents.length > 0) {
5836                   this.tree.remove(segment);
5837                   newEvents.push(event);
5838                 } else {
5839                   this.segments.push(segment);
5840                   segment.prev = prevSeg;
5841                 }
5842               } else {
5843                 if (prevSeg && nextSeg) {
5844                   var inter = prevSeg.getIntersection(nextSeg);
5845                   if (inter !== null) {
5846                     if (!prevSeg.isAnEndpoint(inter)) {
5847                       var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);
5848                       for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {
5849                         newEvents.push(_newEventsFromSplit3[_i3]);
5850                       }
5851                     }
5852                     if (!nextSeg.isAnEndpoint(inter)) {
5853                       var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);
5854                       for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {
5855                         newEvents.push(_newEventsFromSplit4[_i4]);
5856                       }
5857                     }
5858                   }
5859                 }
5860                 this.tree.remove(segment);
5861               }
5862               return newEvents;
5863             }
5864             /* Safely split a segment that is currently in the datastructures
5865              * IE - a segment other than the one that is currently being processed. */
5866           }, {
5867             key: "_splitSafely",
5868             value: function _splitSafely(seg, pt) {
5869               this.tree.remove(seg);
5870               var rightSE = seg.rightSE;
5871               this.queue.remove(rightSE);
5872               var newEvents = seg.split(pt);
5873               newEvents.push(rightSE);
5874               if (seg.consumedBy === void 0)
5875                 this.tree.insert(seg);
5876               return newEvents;
5877             }
5878           }]);
5879           return SweepLine2;
5880         }();
5881         var POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== "undefined" && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1e6;
5882         var POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== "undefined" && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1e6;
5883         var Operation = /* @__PURE__ */ function() {
5884           function Operation2() {
5885             _classCallCheck(this, Operation2);
5886           }
5887           _createClass(Operation2, [{
5888             key: "run",
5889             value: function run(type2, geom, moreGeoms) {
5890               operation.type = type2;
5891               rounder.reset();
5892               var multipolys = [new MultiPolyIn(geom, true)];
5893               for (var i2 = 0, iMax = moreGeoms.length; i2 < iMax; i2++) {
5894                 multipolys.push(new MultiPolyIn(moreGeoms[i2], false));
5895               }
5896               operation.numMultiPolys = multipolys.length;
5897               if (operation.type === "difference") {
5898                 var subject = multipolys[0];
5899                 var _i = 1;
5900                 while (_i < multipolys.length) {
5901                   if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null)
5902                     _i++;
5903                   else
5904                     multipolys.splice(_i, 1);
5905                 }
5906               }
5907               if (operation.type === "intersection") {
5908                 for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {
5909                   var mpA = multipolys[_i2];
5910                   for (var j2 = _i2 + 1, jMax = multipolys.length; j2 < jMax; j2++) {
5911                     if (getBboxOverlap(mpA.bbox, multipolys[j2].bbox) === null)
5912                       return [];
5913                   }
5914                 }
5915               }
5916               var queue = new Tree(SweepEvent.compare);
5917               for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {
5918                 var sweepEvents = multipolys[_i3].getSweepEvents();
5919                 for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {
5920                   queue.insert(sweepEvents[_j]);
5921                   if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
5922                     throw new Error("Infinite loop when putting segment endpoints in a priority queue (queue size too big). Please file a bug report.");
5923                   }
5924                 }
5925               }
5926               var sweepLine = new SweepLine(queue);
5927               var prevQueueSize = queue.size;
5928               var node = queue.pop();
5929               while (node) {
5930                 var evt = node.key;
5931                 if (queue.size === prevQueueSize) {
5932                   var seg = evt.segment;
5933                   throw new Error("Unable to pop() ".concat(evt.isLeft ? "left" : "right", " SweepEvent ") + "[".concat(evt.point.x, ", ").concat(evt.point.y, "] from segment #").concat(seg.id, " ") + "[".concat(seg.leftSE.point.x, ", ").concat(seg.leftSE.point.y, "] -> ") + "[".concat(seg.rightSE.point.x, ", ").concat(seg.rightSE.point.y, "] from queue. ") + "Please file a bug report.");
5934                 }
5935                 if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
5936                   throw new Error("Infinite loop when passing sweep line over endpoints (queue size too big). Please file a bug report.");
5937                 }
5938                 if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) {
5939                   throw new Error("Infinite loop when passing sweep line over endpoints (too many sweep line segments). Please file a bug report.");
5940                 }
5941                 var newEvents = sweepLine.process(evt);
5942                 for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {
5943                   var _evt = newEvents[_i4];
5944                   if (_evt.consumedBy === void 0)
5945                     queue.insert(_evt);
5946                 }
5947                 prevQueueSize = queue.size;
5948                 node = queue.pop();
5949               }
5950               rounder.reset();
5951               var ringsOut = RingOut.factory(sweepLine.segments);
5952               var result = new MultiPolyOut(ringsOut);
5953               return result.getGeom();
5954             }
5955           }]);
5956           return Operation2;
5957         }();
5958         var operation = new Operation();
5959         var union = function union2(geom) {
5960           for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
5961             moreGeoms[_key - 1] = arguments[_key];
5962           }
5963           return operation.run("union", geom, moreGeoms);
5964         };
5965         var intersection$1 = function intersection2(geom) {
5966           for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
5967             moreGeoms[_key2 - 1] = arguments[_key2];
5968           }
5969           return operation.run("intersection", geom, moreGeoms);
5970         };
5971         var xor = function xor2(geom) {
5972           for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
5973             moreGeoms[_key3 - 1] = arguments[_key3];
5974           }
5975           return operation.run("xor", geom, moreGeoms);
5976         };
5977         var difference = function difference2(subjectGeom) {
5978           for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
5979             clippingGeoms[_key4 - 1] = arguments[_key4];
5980           }
5981           return operation.run("difference", subjectGeom, clippingGeoms);
5982         };
5983         var index = {
5984           union,
5985           intersection: intersection$1,
5986           xor,
5987           difference
5988         };
5989         return index;
5990       });
5991     }
5992   });
5993
5994   // node_modules/geojson-precision/index.js
5995   var require_geojson_precision = __commonJS({
5996     "node_modules/geojson-precision/index.js"(exports2, module2) {
5997       (function() {
5998         function parse(t, coordinatePrecision, extrasPrecision) {
5999           function point2(p) {
6000             return p.map(function(e, index) {
6001               if (index < 2) {
6002                 return 1 * e.toFixed(coordinatePrecision);
6003               } else {
6004                 return 1 * e.toFixed(extrasPrecision);
6005               }
6006             });
6007           }
6008           function multi(l) {
6009             return l.map(point2);
6010           }
6011           function poly(p) {
6012             return p.map(multi);
6013           }
6014           function multiPoly(m) {
6015             return m.map(poly);
6016           }
6017           function geometry(obj) {
6018             if (!obj) {
6019               return {};
6020             }
6021             switch (obj.type) {
6022               case "Point":
6023                 obj.coordinates = point2(obj.coordinates);
6024                 return obj;
6025               case "LineString":
6026               case "MultiPoint":
6027                 obj.coordinates = multi(obj.coordinates);
6028                 return obj;
6029               case "Polygon":
6030               case "MultiLineString":
6031                 obj.coordinates = poly(obj.coordinates);
6032                 return obj;
6033               case "MultiPolygon":
6034                 obj.coordinates = multiPoly(obj.coordinates);
6035                 return obj;
6036               case "GeometryCollection":
6037                 obj.geometries = obj.geometries.map(geometry);
6038                 return obj;
6039               default:
6040                 return {};
6041             }
6042           }
6043           function feature3(obj) {
6044             obj.geometry = geometry(obj.geometry);
6045             return obj;
6046           }
6047           function featureCollection(f2) {
6048             f2.features = f2.features.map(feature3);
6049             return f2;
6050           }
6051           function geometryCollection(g) {
6052             g.geometries = g.geometries.map(geometry);
6053             return g;
6054           }
6055           if (!t) {
6056             return t;
6057           }
6058           switch (t.type) {
6059             case "Feature":
6060               return feature3(t);
6061             case "GeometryCollection":
6062               return geometryCollection(t);
6063             case "FeatureCollection":
6064               return featureCollection(t);
6065             case "Point":
6066             case "LineString":
6067             case "Polygon":
6068             case "MultiPoint":
6069             case "MultiPolygon":
6070             case "MultiLineString":
6071               return geometry(t);
6072             default:
6073               return t;
6074           }
6075         }
6076         module2.exports = parse;
6077         module2.exports.parse = parse;
6078       })();
6079     }
6080   });
6081
6082   // node_modules/@aitodotai/json-stringify-pretty-compact/index.js
6083   var require_json_stringify_pretty_compact = __commonJS({
6084     "node_modules/@aitodotai/json-stringify-pretty-compact/index.js"(exports2, module2) {
6085       function isObject3(obj) {
6086         return typeof obj === "object" && obj !== null;
6087       }
6088       function forEach(obj, cb) {
6089         if (Array.isArray(obj)) {
6090           obj.forEach(cb);
6091         } else if (isObject3(obj)) {
6092           Object.keys(obj).forEach(function(key) {
6093             var val = obj[key];
6094             cb(val, key);
6095           });
6096         }
6097       }
6098       function getTreeDepth(obj) {
6099         var depth = 0;
6100         if (Array.isArray(obj) || isObject3(obj)) {
6101           forEach(obj, function(val) {
6102             if (Array.isArray(val) || isObject3(val)) {
6103               var tmpDepth = getTreeDepth(val);
6104               if (tmpDepth > depth) {
6105                 depth = tmpDepth;
6106               }
6107             }
6108           });
6109           return depth + 1;
6110         }
6111         return depth;
6112       }
6113       function stringify3(obj, options2) {
6114         options2 = options2 || {};
6115         var indent2 = JSON.stringify([1], null, get4(options2, "indent", 2)).slice(2, -3);
6116         var addMargin = get4(options2, "margins", false);
6117         var addArrayMargin = get4(options2, "arrayMargins", false);
6118         var addObjectMargin = get4(options2, "objectMargins", false);
6119         var maxLength = indent2 === "" ? Infinity : get4(options2, "maxLength", 80);
6120         var maxNesting = get4(options2, "maxNesting", Infinity);
6121         return function _stringify(obj2, currentIndent, reserved) {
6122           if (obj2 && typeof obj2.toJSON === "function") {
6123             obj2 = obj2.toJSON();
6124           }
6125           var string = JSON.stringify(obj2);
6126           if (string === void 0) {
6127             return string;
6128           }
6129           var length = maxLength - currentIndent.length - reserved;
6130           var treeDepth = getTreeDepth(obj2);
6131           if (treeDepth <= maxNesting && string.length <= length) {
6132             var prettified = prettify(string, {
6133               addMargin,
6134               addArrayMargin,
6135               addObjectMargin
6136             });
6137             if (prettified.length <= length) {
6138               return prettified;
6139             }
6140           }
6141           if (isObject3(obj2)) {
6142             var nextIndent = currentIndent + indent2;
6143             var items = [];
6144             var delimiters;
6145             var comma = function(array2, index2) {
6146               return index2 === array2.length - 1 ? 0 : 1;
6147             };
6148             if (Array.isArray(obj2)) {
6149               for (var index = 0; index < obj2.length; index++) {
6150                 items.push(
6151                   _stringify(obj2[index], nextIndent, comma(obj2, index)) || "null"
6152                 );
6153               }
6154               delimiters = "[]";
6155             } else {
6156               Object.keys(obj2).forEach(function(key, index2, array2) {
6157                 var keyPart = JSON.stringify(key) + ": ";
6158                 var value = _stringify(
6159                   obj2[key],
6160                   nextIndent,
6161                   keyPart.length + comma(array2, index2)
6162                 );
6163                 if (value !== void 0) {
6164                   items.push(keyPart + value);
6165                 }
6166               });
6167               delimiters = "{}";
6168             }
6169             if (items.length > 0) {
6170               return [
6171                 delimiters[0],
6172                 indent2 + items.join(",\n" + nextIndent),
6173                 delimiters[1]
6174               ].join("\n" + currentIndent);
6175             }
6176           }
6177           return string;
6178         }(obj, "", 0);
6179       }
6180       var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,\][}{]/g;
6181       function prettify(string, options2) {
6182         options2 = options2 || {};
6183         var tokens = {
6184           "{": "{",
6185           "}": "}",
6186           "[": "[",
6187           "]": "]",
6188           ",": ", ",
6189           ":": ": "
6190         };
6191         if (options2.addMargin || options2.addObjectMargin) {
6192           tokens["{"] = "{ ";
6193           tokens["}"] = " }";
6194         }
6195         if (options2.addMargin || options2.addArrayMargin) {
6196           tokens["["] = "[ ";
6197           tokens["]"] = " ]";
6198         }
6199         return string.replace(stringOrChar, function(match, string2) {
6200           return string2 ? match : tokens[match];
6201         });
6202       }
6203       function get4(options2, name, defaultValue) {
6204         return name in options2 ? options2[name] : defaultValue;
6205       }
6206       module2.exports = stringify3;
6207     }
6208   });
6209
6210   // node_modules/aes-js/index.js
6211   var require_aes_js = __commonJS({
6212     "node_modules/aes-js/index.js"(exports2, module2) {
6213       (function(root3) {
6214         "use strict";
6215         function checkInt(value) {
6216           return parseInt(value) === value;
6217         }
6218         function checkInts(arrayish) {
6219           if (!checkInt(arrayish.length)) {
6220             return false;
6221           }
6222           for (var i2 = 0; i2 < arrayish.length; i2++) {
6223             if (!checkInt(arrayish[i2]) || arrayish[i2] < 0 || arrayish[i2] > 255) {
6224               return false;
6225             }
6226           }
6227           return true;
6228         }
6229         function coerceArray(arg, copy2) {
6230           if (arg.buffer && arg.name === "Uint8Array") {
6231             if (copy2) {
6232               if (arg.slice) {
6233                 arg = arg.slice();
6234               } else {
6235                 arg = Array.prototype.slice.call(arg);
6236               }
6237             }
6238             return arg;
6239           }
6240           if (Array.isArray(arg)) {
6241             if (!checkInts(arg)) {
6242               throw new Error("Array contains invalid value: " + arg);
6243             }
6244             return new Uint8Array(arg);
6245           }
6246           if (checkInt(arg.length) && checkInts(arg)) {
6247             return new Uint8Array(arg);
6248           }
6249           throw new Error("unsupported array-like object");
6250         }
6251         function createArray(length) {
6252           return new Uint8Array(length);
6253         }
6254         function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
6255           if (sourceStart != null || sourceEnd != null) {
6256             if (sourceArray.slice) {
6257               sourceArray = sourceArray.slice(sourceStart, sourceEnd);
6258             } else {
6259               sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
6260             }
6261           }
6262           targetArray.set(sourceArray, targetStart);
6263         }
6264         var convertUtf8 = function() {
6265           function toBytes(text2) {
6266             var result = [], i2 = 0;
6267             text2 = encodeURI(text2);
6268             while (i2 < text2.length) {
6269               var c = text2.charCodeAt(i2++);
6270               if (c === 37) {
6271                 result.push(parseInt(text2.substr(i2, 2), 16));
6272                 i2 += 2;
6273               } else {
6274                 result.push(c);
6275               }
6276             }
6277             return coerceArray(result);
6278           }
6279           function fromBytes(bytes) {
6280             var result = [], i2 = 0;
6281             while (i2 < bytes.length) {
6282               var c = bytes[i2];
6283               if (c < 128) {
6284                 result.push(String.fromCharCode(c));
6285                 i2++;
6286               } else if (c > 191 && c < 224) {
6287                 result.push(String.fromCharCode((c & 31) << 6 | bytes[i2 + 1] & 63));
6288                 i2 += 2;
6289               } else {
6290                 result.push(String.fromCharCode((c & 15) << 12 | (bytes[i2 + 1] & 63) << 6 | bytes[i2 + 2] & 63));
6291                 i2 += 3;
6292               }
6293             }
6294             return result.join("");
6295           }
6296           return {
6297             toBytes,
6298             fromBytes
6299           };
6300         }();
6301         var convertHex = function() {
6302           function toBytes(text2) {
6303             var result = [];
6304             for (var i2 = 0; i2 < text2.length; i2 += 2) {
6305               result.push(parseInt(text2.substr(i2, 2), 16));
6306             }
6307             return result;
6308           }
6309           var Hex = "0123456789abcdef";
6310           function fromBytes(bytes) {
6311             var result = [];
6312             for (var i2 = 0; i2 < bytes.length; i2++) {
6313               var v = bytes[i2];
6314               result.push(Hex[(v & 240) >> 4] + Hex[v & 15]);
6315             }
6316             return result.join("");
6317           }
6318           return {
6319             toBytes,
6320             fromBytes
6321           };
6322         }();
6323         var numberOfRounds = { 16: 10, 24: 12, 32: 14 };
6324         var rcon = [1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145];
6325         var S = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];
6326         var Si = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];
6327         var T1 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 504303377, 2075177163, 2824099068, 1841019862, 739644986];
6328         var T2 = [2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 4238890068, 3597515707, 975967766];
6329         var T3 = [1671808611, 2089089148, 2006576759, 2072901243, 4061003762, 1807603307, 1873927791, 3310653893, 810573872, 16974337, 1739181671, 729634347, 4263110654, 3613570519, 2883997099, 1989864566, 3393556426, 2191335298, 3376449993, 2106063485, 4195741690, 1508618841, 1204391495, 4027317232, 2917941677, 3563566036, 2734514082, 2951366063, 2629772188, 2767672228, 1922491506, 3227229120, 3082974647, 4246528509, 2477669779, 644500518, 911895606, 1061256767, 4144166391, 3427763148, 878471220, 2784252325, 3845444069, 4043897329, 1905517169, 3631459288, 827548209, 356461077, 67897348, 3344078279, 593839651, 3277757891, 405286936, 2527147926, 84871685, 2595565466, 118033927, 305538066, 2157648768, 3795705826, 3945188843, 661212711, 2999812018, 1973414517, 152769033, 2208177539, 745822252, 439235610, 455947803, 1857215598, 1525593178, 2700827552, 1391895634, 994932283, 3596728278, 3016654259, 695947817, 3812548067, 795958831, 2224493444, 1408607827, 3513301457, 0, 3979133421, 543178784, 4229948412, 2982705585, 1542305371, 1790891114, 3410398667, 3201918910, 961245753, 1256100938, 1289001036, 1491644504, 3477767631, 3496721360, 4012557807, 2867154858, 4212583931, 1137018435, 1305975373, 861234739, 2241073541, 1171229253, 4178635257, 33948674, 2139225727, 1357946960, 1011120188, 2679776671, 2833468328, 1374921297, 2751356323, 1086357568, 2408187279, 2460827538, 2646352285, 944271416, 4110742005, 3168756668, 3066132406, 3665145818, 560153121, 271589392, 4279952895, 4077846003, 3530407890, 3444343245, 202643468, 322250259, 3962553324, 1608629855, 2543990167, 1154254916, 389623319, 3294073796, 2817676711, 2122513534, 1028094525, 1689045092, 1575467613, 422261273, 1939203699, 1621147744, 2174228865, 1339137615, 3699352540, 577127458, 712922154, 2427141008, 2290289544, 1187679302, 3995715566, 3100863416, 339486740, 3732514782, 1591917662, 186455563, 3681988059, 3762019296, 844522546, 978220090, 169743370, 1239126601, 101321734, 611076132, 1558493276, 3260915650, 3547250131, 2901361580, 1655096418, 2443721105, 2510565781, 3828863972, 2039214713, 3878868455, 3359869896, 928607799, 1840765549, 2374762893, 3580146133, 1322425422, 2850048425, 1823791212, 1459268694, 4094161908, 3928346602, 1706019429, 2056189050, 2934523822, 135794696, 3134549946, 2022240376, 628050469, 779246638, 472135708, 2800834470, 3032970164, 3327236038, 3894660072, 3715932637, 1956440180, 522272287, 1272813131, 3185336765, 2340818315, 2323976074, 1888542832, 1044544574, 3049550261, 1722469478, 1222152264, 50660867, 4127324150, 236067854, 1638122081, 895445557, 1475980887, 3117443513, 2257655686, 3243809217, 489110045, 2662934430, 3778599393, 4162055160, 2561878936, 288563729, 1773916777, 3648039385, 2391345038, 2493985684, 2612407707, 505560094, 2274497927, 3911240169, 3460925390, 1442818645, 678973480, 3749357023, 2358182796, 2717407649, 2306869641, 219617805, 3218761151, 3862026214, 1120306242, 1756942440, 1103331905, 2578459033, 762796589, 252780047, 2966125488, 1425844308, 3151392187, 372911126];
6330         var T4 = [1667474886, 2088535288, 2004326894, 2071694838, 4075949567, 1802223062, 1869591006, 3318043793, 808472672, 16843522, 1734846926, 724270422, 4278065639, 3621216949, 2880169549, 1987484396, 3402253711, 2189597983, 3385409673, 2105378810, 4210693615, 1499065266, 1195886990, 4042263547, 2913856577, 3570689971, 2728590687, 2947541573, 2627518243, 2762274643, 1920112356, 3233831835, 3082273397, 4261223649, 2475929149, 640051788, 909531756, 1061110142, 4160160501, 3435941763, 875846760, 2779116625, 3857003729, 4059105529, 1903268834, 3638064043, 825316194, 353713962, 67374088, 3351728789, 589522246, 3284360861, 404236336, 2526454071, 84217610, 2593830191, 117901582, 303183396, 2155911963, 3806477791, 3958056653, 656894286, 2998062463, 1970642922, 151591698, 2206440989, 741110872, 437923380, 454765878, 1852748508, 1515908788, 2694904667, 1381168804, 993742198, 3604373943, 3014905469, 690584402, 3823320797, 791638366, 2223281939, 1398011302, 3520161977, 0, 3991743681, 538992704, 4244381667, 2981218425, 1532751286, 1785380564, 3419096717, 3200178535, 960056178, 1246420628, 1280103576, 1482221744, 3486468741, 3503319995, 4025428677, 2863326543, 4227536621, 1128514950, 1296947098, 859002214, 2240123921, 1162203018, 4193849577, 33687044, 2139062782, 1347481760, 1010582648, 2678045221, 2829640523, 1364325282, 2745433693, 1077985408, 2408548869, 2459086143, 2644360225, 943212656, 4126475505, 3166494563, 3065430391, 3671750063, 555836226, 269496352, 4294908645, 4092792573, 3537006015, 3452783745, 202118168, 320025894, 3974901699, 1600119230, 2543297077, 1145359496, 387397934, 3301201811, 2812801621, 2122220284, 1027426170, 1684319432, 1566435258, 421079858, 1936954854, 1616945344, 2172753945, 1330631070, 3705438115, 572679748, 707427924, 2425400123, 2290647819, 1179044492, 4008585671, 3099120491, 336870440, 3739122087, 1583276732, 185277718, 3688593069, 3772791771, 842159716, 976899700, 168435220, 1229577106, 101059084, 606366792, 1549591736, 3267517855, 3553849021, 2897014595, 1650632388, 2442242105, 2509612081, 3840161747, 2038008818, 3890688725, 3368567691, 926374254, 1835907034, 2374863873, 3587531953, 1313788572, 2846482505, 1819063512, 1448540844, 4109633523, 3941213647, 1701162954, 2054852340, 2930698567, 134748176, 3132806511, 2021165296, 623210314, 774795868, 471606328, 2795958615, 3031746419, 3334885783, 3907527627, 3722280097, 1953799400, 522133822, 1263263126, 3183336545, 2341176845, 2324333839, 1886425312, 1044267644, 3048588401, 1718004428, 1212733584, 50529542, 4143317495, 235803164, 1633788866, 892690282, 1465383342, 3115962473, 2256965911, 3250673817, 488449850, 2661202215, 3789633753, 4177007595, 2560144171, 286339874, 1768537042, 3654906025, 2391705863, 2492770099, 2610673197, 505291324, 2273808917, 3924369609, 3469625735, 1431699370, 673740880, 3755965093, 2358021891, 2711746649, 2307489801, 218961690, 3217021541, 3873845719, 1111672452, 1751693520, 1094828930, 2576986153, 757954394, 252645662, 2964376443, 1414855848, 3149649517, 370555436];
6331         var T5 = [1374988112, 2118214995, 437757123, 975658646, 1001089995, 530400753, 2902087851, 1273168787, 540080725, 2910219766, 2295101073, 4110568485, 1340463100, 3307916247, 641025152, 3043140495, 3736164937, 632953703, 1172967064, 1576976609, 3274667266, 2169303058, 2370213795, 1809054150, 59727847, 361929877, 3211623147, 2505202138, 3569255213, 1484005843, 1239443753, 2395588676, 1975683434, 4102977912, 2572697195, 666464733, 3202437046, 4035489047, 3374361702, 2110667444, 1675577880, 3843699074, 2538681184, 1649639237, 2976151520, 3144396420, 4269907996, 4178062228, 1883793496, 2403728665, 2497604743, 1383856311, 2876494627, 1917518562, 3810496343, 1716890410, 3001755655, 800440835, 2261089178, 3543599269, 807962610, 599762354, 33778362, 3977675356, 2328828971, 2809771154, 4077384432, 1315562145, 1708848333, 101039829, 3509871135, 3299278474, 875451293, 2733856160, 92987698, 2767645557, 193195065, 1080094634, 1584504582, 3178106961, 1042385657, 2531067453, 3711829422, 1306967366, 2438237621, 1908694277, 67556463, 1615861247, 429456164, 3602770327, 2302690252, 1742315127, 2968011453, 126454664, 3877198648, 2043211483, 2709260871, 2084704233, 4169408201, 0, 159417987, 841739592, 504459436, 1817866830, 4245618683, 260388950, 1034867998, 908933415, 168810852, 1750902305, 2606453969, 607530554, 202008497, 2472011535, 3035535058, 463180190, 2160117071, 1641816226, 1517767529, 470948374, 3801332234, 3231722213, 1008918595, 303765277, 235474187, 4069246893, 766945465, 337553864, 1475418501, 2943682380, 4003061179, 2743034109, 4144047775, 1551037884, 1147550661, 1543208500, 2336434550, 3408119516, 3069049960, 3102011747, 3610369226, 1113818384, 328671808, 2227573024, 2236228733, 3535486456, 2935566865, 3341394285, 496906059, 3702665459, 226906860, 2009195472, 733156972, 2842737049, 294930682, 1206477858, 2835123396, 2700099354, 1451044056, 573804783, 2269728455, 3644379585, 2362090238, 2564033334, 2801107407, 2776292904, 3669462566, 1068351396, 742039012, 1350078989, 1784663195, 1417561698, 4136440770, 2430122216, 775550814, 2193862645, 2673705150, 1775276924, 1876241833, 3475313331, 3366754619, 270040487, 3902563182, 3678124923, 3441850377, 1851332852, 3969562369, 2203032232, 3868552805, 2868897406, 566021896, 4011190502, 3135740889, 1248802510, 3936291284, 699432150, 832877231, 708780849, 3332740144, 899835584, 1951317047, 4236429990, 3767586992, 866637845, 4043610186, 1106041591, 2144161806, 395441711, 1984812685, 1139781709, 3433712980, 3835036895, 2664543715, 1282050075, 3240894392, 1181045119, 2640243204, 25965917, 4203181171, 4211818798, 3009879386, 2463879762, 3910161971, 1842759443, 2597806476, 933301370, 1509430414, 3943906441, 3467192302, 3076639029, 3776767469, 2051518780, 2631065433, 1441952575, 404016761, 1942435775, 1408749034, 1610459739, 3745345300, 2017778566, 3400528769, 3110650942, 941896748, 3265478751, 371049330, 3168937228, 675039627, 4279080257, 967311729, 135050206, 3635733660, 1683407248, 2076935265, 3576870512, 1215061108, 3501741890];
6332         var T6 = [1347548327, 1400783205, 3273267108, 2520393566, 3409685355, 4045380933, 2880240216, 2471224067, 1428173050, 4138563181, 2441661558, 636813900, 4233094615, 3620022987, 2149987652, 2411029155, 1239331162, 1730525723, 2554718734, 3781033664, 46346101, 310463728, 2743944855, 3328955385, 3875770207, 2501218972, 3955191162, 3667219033, 768917123, 3545789473, 692707433, 1150208456, 1786102409, 2029293177, 1805211710, 3710368113, 3065962831, 401639597, 1724457132, 3028143674, 409198410, 2196052529, 1620529459, 1164071807, 3769721975, 2226875310, 486441376, 2499348523, 1483753576, 428819965, 2274680428, 3075636216, 598438867, 3799141122, 1474502543, 711349675, 129166120, 53458370, 2592523643, 2782082824, 4063242375, 2988687269, 3120694122, 1559041666, 730517276, 2460449204, 4042459122, 2706270690, 3446004468, 3573941694, 533804130, 2328143614, 2637442643, 2695033685, 839224033, 1973745387, 957055980, 2856345839, 106852767, 1371368976, 4181598602, 1033297158, 2933734917, 1179510461, 3046200461, 91341917, 1862534868, 4284502037, 605657339, 2547432937, 3431546947, 2003294622, 3182487618, 2282195339, 954669403, 3682191598, 1201765386, 3917234703, 3388507166, 0, 2198438022, 1211247597, 2887651696, 1315723890, 4227665663, 1443857720, 507358933, 657861945, 1678381017, 560487590, 3516619604, 975451694, 2970356327, 261314535, 3535072918, 2652609425, 1333838021, 2724322336, 1767536459, 370938394, 182621114, 3854606378, 1128014560, 487725847, 185469197, 2918353863, 3106780840, 3356761769, 2237133081, 1286567175, 3152976349, 4255350624, 2683765030, 3160175349, 3309594171, 878443390, 1988838185, 3704300486, 1756818940, 1673061617, 3403100636, 272786309, 1075025698, 545572369, 2105887268, 4174560061, 296679730, 1841768865, 1260232239, 4091327024, 3960309330, 3497509347, 1814803222, 2578018489, 4195456072, 575138148, 3299409036, 446754879, 3629546796, 4011996048, 3347532110, 3252238545, 4270639778, 915985419, 3483825537, 681933534, 651868046, 2755636671, 3828103837, 223377554, 2607439820, 1649704518, 3270937875, 3901806776, 1580087799, 4118987695, 3198115200, 2087309459, 2842678573, 3016697106, 1003007129, 2802849917, 1860738147, 2077965243, 164439672, 4100872472, 32283319, 2827177882, 1709610350, 2125135846, 136428751, 3874428392, 3652904859, 3460984630, 3572145929, 3593056380, 2939266226, 824852259, 818324884, 3224740454, 930369212, 2801566410, 2967507152, 355706840, 1257309336, 4148292826, 243256656, 790073846, 2373340630, 1296297904, 1422699085, 3756299780, 3818836405, 457992840, 3099667487, 2135319889, 77422314, 1560382517, 1945798516, 788204353, 1521706781, 1385356242, 870912086, 325965383, 2358957921, 2050466060, 2388260884, 2313884476, 4006521127, 901210569, 3990953189, 1014646705, 1503449823, 1062597235, 2031621326, 3212035895, 3931371469, 1533017514, 350174575, 2256028891, 2177544179, 1052338372, 741876788, 1606591296, 1914052035, 213705253, 2334669897, 1107234197, 1899603969, 3725069491, 2631447780, 2422494913, 1635502980, 1893020342, 1950903388, 1120974935];
6333         var T7 = [2807058932, 1699970625, 2764249623, 1586903591, 1808481195, 1173430173, 1487645946, 59984867, 4199882800, 1844882806, 1989249228, 1277555970, 3623636965, 3419915562, 1149249077, 2744104290, 1514790577, 459744698, 244860394, 3235995134, 1963115311, 4027744588, 2544078150, 4190530515, 1608975247, 2627016082, 2062270317, 1507497298, 2200818878, 567498868, 1764313568, 3359936201, 2305455554, 2037970062, 1047239e3, 1910319033, 1337376481, 2904027272, 2892417312, 984907214, 1243112415, 830661914, 861968209, 2135253587, 2011214180, 2927934315, 2686254721, 731183368, 1750626376, 4246310725, 1820824798, 4172763771, 3542330227, 48394827, 2404901663, 2871682645, 671593195, 3254988725, 2073724613, 145085239, 2280796200, 2779915199, 1790575107, 2187128086, 472615631, 3029510009, 4075877127, 3802222185, 4107101658, 3201631749, 1646252340, 4270507174, 1402811438, 1436590835, 3778151818, 3950355702, 3963161475, 4020912224, 2667994737, 273792366, 2331590177, 104699613, 95345982, 3175501286, 2377486676, 1560637892, 3564045318, 369057872, 4213447064, 3919042237, 1137477952, 2658625497, 1119727848, 2340947849, 1530455833, 4007360968, 172466556, 266959938, 516552836, 0, 2256734592, 3980931627, 1890328081, 1917742170, 4294704398, 945164165, 3575528878, 958871085, 3647212047, 2787207260, 1423022939, 775562294, 1739656202, 3876557655, 2530391278, 2443058075, 3310321856, 547512796, 1265195639, 437656594, 3121275539, 719700128, 3762502690, 387781147, 218828297, 3350065803, 2830708150, 2848461854, 428169201, 122466165, 3720081049, 1627235199, 648017665, 4122762354, 1002783846, 2117360635, 695634755, 3336358691, 4234721005, 4049844452, 3704280881, 2232435299, 574624663, 287343814, 612205898, 1039717051, 840019705, 2708326185, 793451934, 821288114, 1391201670, 3822090177, 376187827, 3113855344, 1224348052, 1679968233, 2361698556, 1058709744, 752375421, 2431590963, 1321699145, 3519142200, 2734591178, 188127444, 2177869557, 3727205754, 2384911031, 3215212461, 2648976442, 2450346104, 3432737375, 1180849278, 331544205, 3102249176, 4150144569, 2952102595, 2159976285, 2474404304, 766078933, 313773861, 2570832044, 2108100632, 1668212892, 3145456443, 2013908262, 418672217, 3070356634, 2594734927, 1852171925, 3867060991, 3473416636, 3907448597, 2614737639, 919489135, 164948639, 2094410160, 2997825956, 590424639, 2486224549, 1723872674, 3157750862, 3399941250, 3501252752, 3625268135, 2555048196, 3673637356, 1343127501, 4130281361, 3599595085, 2957853679, 1297403050, 81781910, 3051593425, 2283490410, 532201772, 1367295589, 3926170974, 895287692, 1953757831, 1093597963, 492483431, 3528626907, 1446242576, 1192455638, 1636604631, 209336225, 344873464, 1015671571, 669961897, 3375740769, 3857572124, 2973530695, 3747192018, 1933530610, 3464042516, 935293895, 3454686199, 2858115069, 1863638845, 3683022916, 4085369519, 3292445032, 875313188, 1080017571, 3279033885, 621591778, 1233856572, 2504130317, 24197544, 3017672716, 3835484340, 3247465558, 2220981195, 3060847922, 1551124588, 1463996600];
6334         var T8 = [4104605777, 1097159550, 396673818, 660510266, 2875968315, 2638606623, 4200115116, 3808662347, 821712160, 1986918061, 3430322568, 38544885, 3856137295, 718002117, 893681702, 1654886325, 2975484382, 3122358053, 3926825029, 4274053469, 796197571, 1290801793, 1184342925, 3556361835, 2405426947, 2459735317, 1836772287, 1381620373, 3196267988, 1948373848, 3764988233, 3385345166, 3263785589, 2390325492, 1480485785, 3111247143, 3780097726, 2293045232, 548169417, 3459953789, 3746175075, 439452389, 1362321559, 1400849762, 1685577905, 1806599355, 2174754046, 137073913, 1214797936, 1174215055, 3731654548, 2079897426, 1943217067, 1258480242, 529487843, 1437280870, 3945269170, 3049390895, 3313212038, 923313619, 679998e3, 3215307299, 57326082, 377642221, 3474729866, 2041877159, 133361907, 1776460110, 3673476453, 96392454, 878845905, 2801699524, 777231668, 4082475170, 2330014213, 4142626212, 2213296395, 1626319424, 1906247262, 1846563261, 562755902, 3708173718, 1040559837, 3871163981, 1418573201, 3294430577, 114585348, 1343618912, 2566595609, 3186202582, 1078185097, 3651041127, 3896688048, 2307622919, 425408743, 3371096953, 2081048481, 1108339068, 2216610296, 0, 2156299017, 736970802, 292596766, 1517440620, 251657213, 2235061775, 2933202493, 758720310, 265905162, 1554391400, 1532285339, 908999204, 174567692, 1474760595, 4002861748, 2610011675, 3234156416, 3693126241, 2001430874, 303699484, 2478443234, 2687165888, 585122620, 454499602, 151849742, 2345119218, 3064510765, 514443284, 4044981591, 1963412655, 2581445614, 2137062819, 19308535, 1928707164, 1715193156, 4219352155, 1126790795, 600235211, 3992742070, 3841024952, 836553431, 1669664834, 2535604243, 3323011204, 1243905413, 3141400786, 4180808110, 698445255, 2653899549, 2989552604, 2253581325, 3252932727, 3004591147, 1891211689, 2487810577, 3915653703, 4237083816, 4030667424, 2100090966, 865136418, 1229899655, 953270745, 3399679628, 3557504664, 4118925222, 2061379749, 3079546586, 2915017791, 983426092, 2022837584, 1607244650, 2118541908, 2366882550, 3635996816, 972512814, 3283088770, 1568718495, 3499326569, 3576539503, 621982671, 2895723464, 410887952, 2623762152, 1002142683, 645401037, 1494807662, 2595684844, 1335535747, 2507040230, 4293295786, 3167684641, 367585007, 3885750714, 1865862730, 2668221674, 2960971305, 2763173681, 1059270954, 2777952454, 2724642869, 1320957812, 2194319100, 2429595872, 2815956275, 77089521, 3973773121, 3444575871, 2448830231, 1305906550, 4021308739, 2857194700, 2516901860, 3518358430, 1787304780, 740276417, 1699839814, 1592394909, 2352307457, 2272556026, 188821243, 1729977011, 3687994002, 274084841, 3594982253, 3613494426, 2701949495, 4162096729, 322734571, 2837966542, 1640576439, 484830689, 1202797690, 3537852828, 4067639125, 349075736, 3342319475, 4157467219, 4255800159, 1030690015, 1155237496, 2951971274, 1757691577, 607398968, 2738905026, 499347990, 3794078908, 1011452712, 227885567, 2818666809, 213114376, 3034881240, 1455525988, 3414450555, 850817237, 1817998408, 3092726480];
6335         var U1 = [0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, 1172967064, 1475418501, 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, 3211623147, 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, 92987698, 193195065, 429456164, 395441711, 1984812685, 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 135050206, 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, 2564033334, 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 1008918595, 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, 967311729, 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, 1441952575, 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, 2438237621, 2203032232, 2370213795];
6336         var U2 = [0, 185469197, 370938394, 487725847, 741876788, 657861945, 975451694, 824852259, 1483753576, 1400783205, 1315723890, 1164071807, 1950903388, 2135319889, 1649704518, 1767536459, 2967507152, 3152976349, 2801566410, 2918353863, 2631447780, 2547432937, 2328143614, 2177544179, 3901806776, 3818836405, 4270639778, 4118987695, 3299409036, 3483825537, 3535072918, 3652904859, 2077965243, 1893020342, 1841768865, 1724457132, 1474502543, 1559041666, 1107234197, 1257309336, 598438867, 681933534, 901210569, 1052338372, 261314535, 77422314, 428819965, 310463728, 3409685355, 3224740454, 3710368113, 3593056380, 3875770207, 3960309330, 4045380933, 4195456072, 2471224067, 2554718734, 2237133081, 2388260884, 3212035895, 3028143674, 2842678573, 2724322336, 4138563181, 4255350624, 3769721975, 3955191162, 3667219033, 3516619604, 3431546947, 3347532110, 2933734917, 2782082824, 3099667487, 3016697106, 2196052529, 2313884476, 2499348523, 2683765030, 1179510461, 1296297904, 1347548327, 1533017514, 1786102409, 1635502980, 2087309459, 2003294622, 507358933, 355706840, 136428751, 53458370, 839224033, 957055980, 605657339, 790073846, 2373340630, 2256028891, 2607439820, 2422494913, 2706270690, 2856345839, 3075636216, 3160175349, 3573941694, 3725069491, 3273267108, 3356761769, 4181598602, 4063242375, 4011996048, 3828103837, 1033297158, 915985419, 730517276, 545572369, 296679730, 446754879, 129166120, 213705253, 1709610350, 1860738147, 1945798516, 2029293177, 1239331162, 1120974935, 1606591296, 1422699085, 4148292826, 4233094615, 3781033664, 3931371469, 3682191598, 3497509347, 3446004468, 3328955385, 2939266226, 2755636671, 3106780840, 2988687269, 2198438022, 2282195339, 2501218972, 2652609425, 1201765386, 1286567175, 1371368976, 1521706781, 1805211710, 1620529459, 2105887268, 1988838185, 533804130, 350174575, 164439672, 46346101, 870912086, 954669403, 636813900, 788204353, 2358957921, 2274680428, 2592523643, 2441661558, 2695033685, 2880240216, 3065962831, 3182487618, 3572145929, 3756299780, 3270937875, 3388507166, 4174560061, 4091327024, 4006521127, 3854606378, 1014646705, 930369212, 711349675, 560487590, 272786309, 457992840, 106852767, 223377554, 1678381017, 1862534868, 1914052035, 2031621326, 1211247597, 1128014560, 1580087799, 1428173050, 32283319, 182621114, 401639597, 486441376, 768917123, 651868046, 1003007129, 818324884, 1503449823, 1385356242, 1333838021, 1150208456, 1973745387, 2125135846, 1673061617, 1756818940, 2970356327, 3120694122, 2802849917, 2887651696, 2637442643, 2520393566, 2334669897, 2149987652, 3917234703, 3799141122, 4284502037, 4100872472, 3309594171, 3460984630, 3545789473, 3629546796, 2050466060, 1899603969, 1814803222, 1730525723, 1443857720, 1560382517, 1075025698, 1260232239, 575138148, 692707433, 878443390, 1062597235, 243256656, 91341917, 409198410, 325965383, 3403100636, 3252238545, 3704300486, 3620022987, 3874428392, 3990953189, 4042459122, 4227665663, 2460449204, 2578018489, 2226875310, 2411029155, 3198115200, 3046200461, 2827177882, 2743944855];
6337         var U3 = [0, 218828297, 437656594, 387781147, 875313188, 958871085, 775562294, 590424639, 1750626376, 1699970625, 1917742170, 2135253587, 1551124588, 1367295589, 1180849278, 1265195639, 3501252752, 3720081049, 3399941250, 3350065803, 3835484340, 3919042237, 4270507174, 4085369519, 3102249176, 3051593425, 2734591178, 2952102595, 2361698556, 2177869557, 2530391278, 2614737639, 3145456443, 3060847922, 2708326185, 2892417312, 2404901663, 2187128086, 2504130317, 2555048196, 3542330227, 3727205754, 3375740769, 3292445032, 3876557655, 3926170974, 4246310725, 4027744588, 1808481195, 1723872674, 1910319033, 2094410160, 1608975247, 1391201670, 1173430173, 1224348052, 59984867, 244860394, 428169201, 344873464, 935293895, 984907214, 766078933, 547512796, 1844882806, 1627235199, 2011214180, 2062270317, 1507497298, 1423022939, 1137477952, 1321699145, 95345982, 145085239, 532201772, 313773861, 830661914, 1015671571, 731183368, 648017665, 3175501286, 2957853679, 2807058932, 2858115069, 2305455554, 2220981195, 2474404304, 2658625497, 3575528878, 3625268135, 3473416636, 3254988725, 3778151818, 3963161475, 4213447064, 4130281361, 3599595085, 3683022916, 3432737375, 3247465558, 3802222185, 4020912224, 4172763771, 4122762354, 3201631749, 3017672716, 2764249623, 2848461854, 2331590177, 2280796200, 2431590963, 2648976442, 104699613, 188127444, 472615631, 287343814, 840019705, 1058709744, 671593195, 621591778, 1852171925, 1668212892, 1953757831, 2037970062, 1514790577, 1463996600, 1080017571, 1297403050, 3673637356, 3623636965, 3235995134, 3454686199, 4007360968, 3822090177, 4107101658, 4190530515, 2997825956, 3215212461, 2830708150, 2779915199, 2256734592, 2340947849, 2627016082, 2443058075, 172466556, 122466165, 273792366, 492483431, 1047239e3, 861968209, 612205898, 695634755, 1646252340, 1863638845, 2013908262, 1963115311, 1446242576, 1530455833, 1277555970, 1093597963, 1636604631, 1820824798, 2073724613, 1989249228, 1436590835, 1487645946, 1337376481, 1119727848, 164948639, 81781910, 331544205, 516552836, 1039717051, 821288114, 669961897, 719700128, 2973530695, 3157750862, 2871682645, 2787207260, 2232435299, 2283490410, 2667994737, 2450346104, 3647212047, 3564045318, 3279033885, 3464042516, 3980931627, 3762502690, 4150144569, 4199882800, 3070356634, 3121275539, 2904027272, 2686254721, 2200818878, 2384911031, 2570832044, 2486224549, 3747192018, 3528626907, 3310321856, 3359936201, 3950355702, 3867060991, 4049844452, 4234721005, 1739656202, 1790575107, 2108100632, 1890328081, 1402811438, 1586903591, 1233856572, 1149249077, 266959938, 48394827, 369057872, 418672217, 1002783846, 919489135, 567498868, 752375421, 209336225, 24197544, 376187827, 459744698, 945164165, 895287692, 574624663, 793451934, 1679968233, 1764313568, 2117360635, 1933530610, 1343127501, 1560637892, 1243112415, 1192455638, 3704280881, 3519142200, 3336358691, 3419915562, 3907448597, 3857572124, 4075877127, 4294704398, 3029510009, 3113855344, 2927934315, 2744104290, 2159976285, 2377486676, 2594734927, 2544078150];
6338         var U4 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998e3, 865136418, 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 1418573201, 1335535747, 1184342925];
6339         function convertToInt32(bytes) {
6340           var result = [];
6341           for (var i2 = 0; i2 < bytes.length; i2 += 4) {
6342             result.push(
6343               bytes[i2] << 24 | bytes[i2 + 1] << 16 | bytes[i2 + 2] << 8 | bytes[i2 + 3]
6344             );
6345           }
6346           return result;
6347         }
6348         var AES = function(key) {
6349           if (!(this instanceof AES)) {
6350             throw Error("AES must be instanitated with `new`");
6351           }
6352           Object.defineProperty(this, "key", {
6353             value: coerceArray(key, true)
6354           });
6355           this._prepare();
6356         };
6357         AES.prototype._prepare = function() {
6358           var rounds = numberOfRounds[this.key.length];
6359           if (rounds == null) {
6360             throw new Error("invalid key size (must be 16, 24 or 32 bytes)");
6361           }
6362           this._Ke = [];
6363           this._Kd = [];
6364           for (var i2 = 0; i2 <= rounds; i2++) {
6365             this._Ke.push([0, 0, 0, 0]);
6366             this._Kd.push([0, 0, 0, 0]);
6367           }
6368           var roundKeyCount = (rounds + 1) * 4;
6369           var KC = this.key.length / 4;
6370           var tk = convertToInt32(this.key);
6371           var index;
6372           for (var i2 = 0; i2 < KC; i2++) {
6373             index = i2 >> 2;
6374             this._Ke[index][i2 % 4] = tk[i2];
6375             this._Kd[rounds - index][i2 % 4] = tk[i2];
6376           }
6377           var rconpointer = 0;
6378           var t = KC, tt;
6379           while (t < roundKeyCount) {
6380             tt = tk[KC - 1];
6381             tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24;
6382             rconpointer += 1;
6383             if (KC != 8) {
6384               for (var i2 = 1; i2 < KC; i2++) {
6385                 tk[i2] ^= tk[i2 - 1];
6386               }
6387             } else {
6388               for (var i2 = 1; i2 < KC / 2; i2++) {
6389                 tk[i2] ^= tk[i2 - 1];
6390               }
6391               tt = tk[KC / 2 - 1];
6392               tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24;
6393               for (var i2 = KC / 2 + 1; i2 < KC; i2++) {
6394                 tk[i2] ^= tk[i2 - 1];
6395               }
6396             }
6397             var i2 = 0, r, c;
6398             while (i2 < KC && t < roundKeyCount) {
6399               r = t >> 2;
6400               c = t % 4;
6401               this._Ke[r][c] = tk[i2];
6402               this._Kd[rounds - r][c] = tk[i2++];
6403               t++;
6404             }
6405           }
6406           for (var r = 1; r < rounds; r++) {
6407             for (var c = 0; c < 4; c++) {
6408               tt = this._Kd[r][c];
6409               this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255];
6410             }
6411           }
6412         };
6413         AES.prototype.encrypt = function(plaintext) {
6414           if (plaintext.length != 16) {
6415             throw new Error("invalid plaintext size (must be 16 bytes)");
6416           }
6417           var rounds = this._Ke.length - 1;
6418           var a = [0, 0, 0, 0];
6419           var t = convertToInt32(plaintext);
6420           for (var i2 = 0; i2 < 4; i2++) {
6421             t[i2] ^= this._Ke[0][i2];
6422           }
6423           for (var r = 1; r < rounds; r++) {
6424             for (var i2 = 0; i2 < 4; i2++) {
6425               a[i2] = T1[t[i2] >> 24 & 255] ^ T2[t[(i2 + 1) % 4] >> 16 & 255] ^ T3[t[(i2 + 2) % 4] >> 8 & 255] ^ T4[t[(i2 + 3) % 4] & 255] ^ this._Ke[r][i2];
6426             }
6427             t = a.slice();
6428           }
6429           var result = createArray(16), tt;
6430           for (var i2 = 0; i2 < 4; i2++) {
6431             tt = this._Ke[rounds][i2];
6432             result[4 * i2] = (S[t[i2] >> 24 & 255] ^ tt >> 24) & 255;
6433             result[4 * i2 + 1] = (S[t[(i2 + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255;
6434             result[4 * i2 + 2] = (S[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;
6435             result[4 * i2 + 3] = (S[t[(i2 + 3) % 4] & 255] ^ tt) & 255;
6436           }
6437           return result;
6438         };
6439         AES.prototype.decrypt = function(ciphertext) {
6440           if (ciphertext.length != 16) {
6441             throw new Error("invalid ciphertext size (must be 16 bytes)");
6442           }
6443           var rounds = this._Kd.length - 1;
6444           var a = [0, 0, 0, 0];
6445           var t = convertToInt32(ciphertext);
6446           for (var i2 = 0; i2 < 4; i2++) {
6447             t[i2] ^= this._Kd[0][i2];
6448           }
6449           for (var r = 1; r < rounds; r++) {
6450             for (var i2 = 0; i2 < 4; i2++) {
6451               a[i2] = T5[t[i2] >> 24 & 255] ^ T6[t[(i2 + 3) % 4] >> 16 & 255] ^ T7[t[(i2 + 2) % 4] >> 8 & 255] ^ T8[t[(i2 + 1) % 4] & 255] ^ this._Kd[r][i2];
6452             }
6453             t = a.slice();
6454           }
6455           var result = createArray(16), tt;
6456           for (var i2 = 0; i2 < 4; i2++) {
6457             tt = this._Kd[rounds][i2];
6458             result[4 * i2] = (Si[t[i2] >> 24 & 255] ^ tt >> 24) & 255;
6459             result[4 * i2 + 1] = (Si[t[(i2 + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255;
6460             result[4 * i2 + 2] = (Si[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;
6461             result[4 * i2 + 3] = (Si[t[(i2 + 1) % 4] & 255] ^ tt) & 255;
6462           }
6463           return result;
6464         };
6465         var ModeOfOperationECB = function(key) {
6466           if (!(this instanceof ModeOfOperationECB)) {
6467             throw Error("AES must be instanitated with `new`");
6468           }
6469           this.description = "Electronic Code Block";
6470           this.name = "ecb";
6471           this._aes = new AES(key);
6472         };
6473         ModeOfOperationECB.prototype.encrypt = function(plaintext) {
6474           plaintext = coerceArray(plaintext);
6475           if (plaintext.length % 16 !== 0) {
6476             throw new Error("invalid plaintext size (must be multiple of 16 bytes)");
6477           }
6478           var ciphertext = createArray(plaintext.length);
6479           var block2 = createArray(16);
6480           for (var i2 = 0; i2 < plaintext.length; i2 += 16) {
6481             copyArray(plaintext, block2, 0, i2, i2 + 16);
6482             block2 = this._aes.encrypt(block2);
6483             copyArray(block2, ciphertext, i2);
6484           }
6485           return ciphertext;
6486         };
6487         ModeOfOperationECB.prototype.decrypt = function(ciphertext) {
6488           ciphertext = coerceArray(ciphertext);
6489           if (ciphertext.length % 16 !== 0) {
6490             throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");
6491           }
6492           var plaintext = createArray(ciphertext.length);
6493           var block2 = createArray(16);
6494           for (var i2 = 0; i2 < ciphertext.length; i2 += 16) {
6495             copyArray(ciphertext, block2, 0, i2, i2 + 16);
6496             block2 = this._aes.decrypt(block2);
6497             copyArray(block2, plaintext, i2);
6498           }
6499           return plaintext;
6500         };
6501         var ModeOfOperationCBC = function(key, iv) {
6502           if (!(this instanceof ModeOfOperationCBC)) {
6503             throw Error("AES must be instanitated with `new`");
6504           }
6505           this.description = "Cipher Block Chaining";
6506           this.name = "cbc";
6507           if (!iv) {
6508             iv = createArray(16);
6509           } else if (iv.length != 16) {
6510             throw new Error("invalid initialation vector size (must be 16 bytes)");
6511           }
6512           this._lastCipherblock = coerceArray(iv, true);
6513           this._aes = new AES(key);
6514         };
6515         ModeOfOperationCBC.prototype.encrypt = function(plaintext) {
6516           plaintext = coerceArray(plaintext);
6517           if (plaintext.length % 16 !== 0) {
6518             throw new Error("invalid plaintext size (must be multiple of 16 bytes)");
6519           }
6520           var ciphertext = createArray(plaintext.length);
6521           var block2 = createArray(16);
6522           for (var i2 = 0; i2 < plaintext.length; i2 += 16) {
6523             copyArray(plaintext, block2, 0, i2, i2 + 16);
6524             for (var j2 = 0; j2 < 16; j2++) {
6525               block2[j2] ^= this._lastCipherblock[j2];
6526             }
6527             this._lastCipherblock = this._aes.encrypt(block2);
6528             copyArray(this._lastCipherblock, ciphertext, i2);
6529           }
6530           return ciphertext;
6531         };
6532         ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {
6533           ciphertext = coerceArray(ciphertext);
6534           if (ciphertext.length % 16 !== 0) {
6535             throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");
6536           }
6537           var plaintext = createArray(ciphertext.length);
6538           var block2 = createArray(16);
6539           for (var i2 = 0; i2 < ciphertext.length; i2 += 16) {
6540             copyArray(ciphertext, block2, 0, i2, i2 + 16);
6541             block2 = this._aes.decrypt(block2);
6542             for (var j2 = 0; j2 < 16; j2++) {
6543               plaintext[i2 + j2] = block2[j2] ^ this._lastCipherblock[j2];
6544             }
6545             copyArray(ciphertext, this._lastCipherblock, 0, i2, i2 + 16);
6546           }
6547           return plaintext;
6548         };
6549         var ModeOfOperationCFB = function(key, iv, segmentSize) {
6550           if (!(this instanceof ModeOfOperationCFB)) {
6551             throw Error("AES must be instanitated with `new`");
6552           }
6553           this.description = "Cipher Feedback";
6554           this.name = "cfb";
6555           if (!iv) {
6556             iv = createArray(16);
6557           } else if (iv.length != 16) {
6558             throw new Error("invalid initialation vector size (must be 16 size)");
6559           }
6560           if (!segmentSize) {
6561             segmentSize = 1;
6562           }
6563           this.segmentSize = segmentSize;
6564           this._shiftRegister = coerceArray(iv, true);
6565           this._aes = new AES(key);
6566         };
6567         ModeOfOperationCFB.prototype.encrypt = function(plaintext) {
6568           if (plaintext.length % this.segmentSize != 0) {
6569             throw new Error("invalid plaintext size (must be segmentSize bytes)");
6570           }
6571           var encrypted = coerceArray(plaintext, true);
6572           var xorSegment;
6573           for (var i2 = 0; i2 < encrypted.length; i2 += this.segmentSize) {
6574             xorSegment = this._aes.encrypt(this._shiftRegister);
6575             for (var j2 = 0; j2 < this.segmentSize; j2++) {
6576               encrypted[i2 + j2] ^= xorSegment[j2];
6577             }
6578             copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
6579             copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize);
6580           }
6581           return encrypted;
6582         };
6583         ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {
6584           if (ciphertext.length % this.segmentSize != 0) {
6585             throw new Error("invalid ciphertext size (must be segmentSize bytes)");
6586           }
6587           var plaintext = coerceArray(ciphertext, true);
6588           var xorSegment;
6589           for (var i2 = 0; i2 < plaintext.length; i2 += this.segmentSize) {
6590             xorSegment = this._aes.encrypt(this._shiftRegister);
6591             for (var j2 = 0; j2 < this.segmentSize; j2++) {
6592               plaintext[i2 + j2] ^= xorSegment[j2];
6593             }
6594             copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
6595             copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize);
6596           }
6597           return plaintext;
6598         };
6599         var ModeOfOperationOFB = function(key, iv) {
6600           if (!(this instanceof ModeOfOperationOFB)) {
6601             throw Error("AES must be instanitated with `new`");
6602           }
6603           this.description = "Output Feedback";
6604           this.name = "ofb";
6605           if (!iv) {
6606             iv = createArray(16);
6607           } else if (iv.length != 16) {
6608             throw new Error("invalid initialation vector size (must be 16 bytes)");
6609           }
6610           this._lastPrecipher = coerceArray(iv, true);
6611           this._lastPrecipherIndex = 16;
6612           this._aes = new AES(key);
6613         };
6614         ModeOfOperationOFB.prototype.encrypt = function(plaintext) {
6615           var encrypted = coerceArray(plaintext, true);
6616           for (var i2 = 0; i2 < encrypted.length; i2++) {
6617             if (this._lastPrecipherIndex === 16) {
6618               this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
6619               this._lastPrecipherIndex = 0;
6620             }
6621             encrypted[i2] ^= this._lastPrecipher[this._lastPrecipherIndex++];
6622           }
6623           return encrypted;
6624         };
6625         ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
6626         var Counter = function(initialValue) {
6627           if (!(this instanceof Counter)) {
6628             throw Error("Counter must be instanitated with `new`");
6629           }
6630           if (initialValue !== 0 && !initialValue) {
6631             initialValue = 1;
6632           }
6633           if (typeof initialValue === "number") {
6634             this._counter = createArray(16);
6635             this.setValue(initialValue);
6636           } else {
6637             this.setBytes(initialValue);
6638           }
6639         };
6640         Counter.prototype.setValue = function(value) {
6641           if (typeof value !== "number" || parseInt(value) != value) {
6642             throw new Error("invalid counter value (must be an integer)");
6643           }
6644           if (value > Number.MAX_SAFE_INTEGER) {
6645             throw new Error("integer value out of safe range");
6646           }
6647           for (var index = 15; index >= 0; --index) {
6648             this._counter[index] = value % 256;
6649             value = parseInt(value / 256);
6650           }
6651         };
6652         Counter.prototype.setBytes = function(bytes) {
6653           bytes = coerceArray(bytes, true);
6654           if (bytes.length != 16) {
6655             throw new Error("invalid counter bytes size (must be 16 bytes)");
6656           }
6657           this._counter = bytes;
6658         };
6659         Counter.prototype.increment = function() {
6660           for (var i2 = 15; i2 >= 0; i2--) {
6661             if (this._counter[i2] === 255) {
6662               this._counter[i2] = 0;
6663             } else {
6664               this._counter[i2]++;
6665               break;
6666             }
6667           }
6668         };
6669         var ModeOfOperationCTR = function(key, counter) {
6670           if (!(this instanceof ModeOfOperationCTR)) {
6671             throw Error("AES must be instanitated with `new`");
6672           }
6673           this.description = "Counter";
6674           this.name = "ctr";
6675           if (!(counter instanceof Counter)) {
6676             counter = new Counter(counter);
6677           }
6678           this._counter = counter;
6679           this._remainingCounter = null;
6680           this._remainingCounterIndex = 16;
6681           this._aes = new AES(key);
6682         };
6683         ModeOfOperationCTR.prototype.encrypt = function(plaintext) {
6684           var encrypted = coerceArray(plaintext, true);
6685           for (var i2 = 0; i2 < encrypted.length; i2++) {
6686             if (this._remainingCounterIndex === 16) {
6687               this._remainingCounter = this._aes.encrypt(this._counter._counter);
6688               this._remainingCounterIndex = 0;
6689               this._counter.increment();
6690             }
6691             encrypted[i2] ^= this._remainingCounter[this._remainingCounterIndex++];
6692           }
6693           return encrypted;
6694         };
6695         ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;
6696         function pkcs7pad(data) {
6697           data = coerceArray(data, true);
6698           var padder = 16 - data.length % 16;
6699           var result = createArray(data.length + padder);
6700           copyArray(data, result);
6701           for (var i2 = data.length; i2 < result.length; i2++) {
6702             result[i2] = padder;
6703           }
6704           return result;
6705         }
6706         function pkcs7strip(data) {
6707           data = coerceArray(data, true);
6708           if (data.length < 16) {
6709             throw new Error("PKCS#7 invalid length");
6710           }
6711           var padder = data[data.length - 1];
6712           if (padder > 16) {
6713             throw new Error("PKCS#7 padding byte out of range");
6714           }
6715           var length = data.length - padder;
6716           for (var i2 = 0; i2 < padder; i2++) {
6717             if (data[length + i2] !== padder) {
6718               throw new Error("PKCS#7 invalid padding byte");
6719             }
6720           }
6721           var result = createArray(length);
6722           copyArray(data, result, 0, 0, length);
6723           return result;
6724         }
6725         var aesjs2 = {
6726           AES,
6727           Counter,
6728           ModeOfOperation: {
6729             ecb: ModeOfOperationECB,
6730             cbc: ModeOfOperationCBC,
6731             cfb: ModeOfOperationCFB,
6732             ofb: ModeOfOperationOFB,
6733             ctr: ModeOfOperationCTR
6734           },
6735           utils: {
6736             hex: convertHex,
6737             utf8: convertUtf8
6738           },
6739           padding: {
6740             pkcs7: {
6741               pad: pkcs7pad,
6742               strip: pkcs7strip
6743             }
6744           },
6745           _arrayTest: {
6746             coerceArray,
6747             createArray,
6748             copyArray
6749           }
6750         };
6751         if (typeof exports2 !== "undefined") {
6752           module2.exports = aesjs2;
6753         } else if (typeof define === "function" && define.amd) {
6754           define([], function() {
6755             return aesjs2;
6756           });
6757         } else {
6758           if (root3.aesjs) {
6759             aesjs2._aesjs = root3.aesjs;
6760           }
6761           root3.aesjs = aesjs2;
6762         }
6763       })(exports2);
6764     }
6765   });
6766
6767   // node_modules/fast-deep-equal/index.js
6768   var require_fast_deep_equal = __commonJS({
6769     "node_modules/fast-deep-equal/index.js"(exports2, module2) {
6770       "use strict";
6771       module2.exports = function equal(a, b) {
6772         if (a === b)
6773           return true;
6774         if (a && b && typeof a == "object" && typeof b == "object") {
6775           if (a.constructor !== b.constructor)
6776             return false;
6777           var length, i2, keys;
6778           if (Array.isArray(a)) {
6779             length = a.length;
6780             if (length != b.length)
6781               return false;
6782             for (i2 = length; i2-- !== 0; )
6783               if (!equal(a[i2], b[i2]))
6784                 return false;
6785             return true;
6786           }
6787           if (a.constructor === RegExp)
6788             return a.source === b.source && a.flags === b.flags;
6789           if (a.valueOf !== Object.prototype.valueOf)
6790             return a.valueOf() === b.valueOf();
6791           if (a.toString !== Object.prototype.toString)
6792             return a.toString() === b.toString();
6793           keys = Object.keys(a);
6794           length = keys.length;
6795           if (length !== Object.keys(b).length)
6796             return false;
6797           for (i2 = length; i2-- !== 0; )
6798             if (!Object.prototype.hasOwnProperty.call(b, keys[i2]))
6799               return false;
6800           for (i2 = length; i2-- !== 0; ) {
6801             var key = keys[i2];
6802             if (!equal(a[key], b[key]))
6803               return false;
6804           }
6805           return true;
6806         }
6807         return a !== a && b !== b;
6808       };
6809     }
6810   });
6811
6812   // node_modules/lodash/lodash.js
6813   var require_lodash = __commonJS({
6814     "node_modules/lodash/lodash.js"(exports2, module2) {
6815       (function() {
6816         var undefined2;
6817         var VERSION = "4.17.21";
6818         var LARGE_ARRAY_SIZE = 200;
6819         var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT3 = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`";
6820         var HASH_UNDEFINED = "__lodash_hash_undefined__";
6821         var MAX_MEMOIZE_SIZE = 500;
6822         var PLACEHOLDER = "__lodash_placeholder__";
6823         var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4;
6824         var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
6825         var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512;
6826         var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "...";
6827         var HOT_COUNT = 800, HOT_SPAN = 16;
6828         var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3;
6829         var INFINITY2 = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN2 = 0 / 0;
6830         var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
6831         var wrapFlags = [
6832           ["ary", WRAP_ARY_FLAG],
6833           ["bind", WRAP_BIND_FLAG],
6834           ["bindKey", WRAP_BIND_KEY_FLAG],
6835           ["curry", WRAP_CURRY_FLAG],
6836           ["curryRight", WRAP_CURRY_RIGHT_FLAG],
6837           ["flip", WRAP_FLIP_FLAG],
6838           ["partial", WRAP_PARTIAL_FLAG],
6839           ["partialRight", WRAP_PARTIAL_RIGHT_FLAG],
6840           ["rearg", WRAP_REARG_FLAG]
6841         ];
6842         var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag2 = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag2 = "[object Symbol]", undefinedTag2 = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]";
6843         var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
6844         var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
6845         var reEscapedHtml2 = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml2 = /[&<>"']/g, reHasEscapedHtml2 = RegExp(reEscapedHtml2.source), reHasUnescapedHtml2 = RegExp(reUnescapedHtml2.source);
6846         var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g;
6847         var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
6848         var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source);
6849         var reTrimStart2 = /^\s+/;
6850         var reWhitespace2 = /\s/;
6851         var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /;
6852         var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
6853         var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
6854         var reEscapeChar = /\\(\\)?/g;
6855         var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
6856         var reFlags = /\w*$/;
6857         var reIsBadHex2 = /^[-+]0x[0-9a-f]+$/i;
6858         var reIsBinary2 = /^0b[01]+$/i;
6859         var reIsHostCtor = /^\[object .+?Constructor\]$/;
6860         var reIsOctal2 = /^0o[0-7]+$/i;
6861         var reIsUint = /^(?:0|[1-9]\d*)$/;
6862         var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
6863         var reNoMatch = /($^)/;
6864         var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
6865         var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
6866         var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d";
6867         var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")";
6868         var reApos = RegExp(rsApos, "g");
6869         var reComboMark = RegExp(rsCombo, "g");
6870         var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g");
6871         var reUnicodeWord = RegExp([
6872           rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")",
6873           rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")",
6874           rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower,
6875           rsUpper + "+" + rsOptContrUpper,
6876           rsOrdUpper,
6877           rsOrdLower,
6878           rsDigits,
6879           rsEmoji
6880         ].join("|"), "g");
6881         var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]");
6882         var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
6883         var contextProps = [
6884           "Array",
6885           "Buffer",
6886           "DataView",
6887           "Date",
6888           "Error",
6889           "Float32Array",
6890           "Float64Array",
6891           "Function",
6892           "Int8Array",
6893           "Int16Array",
6894           "Int32Array",
6895           "Map",
6896           "Math",
6897           "Object",
6898           "Promise",
6899           "RegExp",
6900           "Set",
6901           "String",
6902           "Symbol",
6903           "TypeError",
6904           "Uint8Array",
6905           "Uint8ClampedArray",
6906           "Uint16Array",
6907           "Uint32Array",
6908           "WeakMap",
6909           "_",
6910           "clearTimeout",
6911           "isFinite",
6912           "parseInt",
6913           "setTimeout"
6914         ];
6915         var templateCounter = -1;
6916         var typedArrayTags = {};
6917         typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
6918         typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
6919         var cloneableTags = {};
6920         cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag2] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
6921         cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
6922         var deburredLetters = {
6923           // Latin-1 Supplement block.
6924           "\xC0": "A",
6925           "\xC1": "A",
6926           "\xC2": "A",
6927           "\xC3": "A",
6928           "\xC4": "A",
6929           "\xC5": "A",
6930           "\xE0": "a",
6931           "\xE1": "a",
6932           "\xE2": "a",
6933           "\xE3": "a",
6934           "\xE4": "a",
6935           "\xE5": "a",
6936           "\xC7": "C",
6937           "\xE7": "c",
6938           "\xD0": "D",
6939           "\xF0": "d",
6940           "\xC8": "E",
6941           "\xC9": "E",
6942           "\xCA": "E",
6943           "\xCB": "E",
6944           "\xE8": "e",
6945           "\xE9": "e",
6946           "\xEA": "e",
6947           "\xEB": "e",
6948           "\xCC": "I",
6949           "\xCD": "I",
6950           "\xCE": "I",
6951           "\xCF": "I",
6952           "\xEC": "i",
6953           "\xED": "i",
6954           "\xEE": "i",
6955           "\xEF": "i",
6956           "\xD1": "N",
6957           "\xF1": "n",
6958           "\xD2": "O",
6959           "\xD3": "O",
6960           "\xD4": "O",
6961           "\xD5": "O",
6962           "\xD6": "O",
6963           "\xD8": "O",
6964           "\xF2": "o",
6965           "\xF3": "o",
6966           "\xF4": "o",
6967           "\xF5": "o",
6968           "\xF6": "o",
6969           "\xF8": "o",
6970           "\xD9": "U",
6971           "\xDA": "U",
6972           "\xDB": "U",
6973           "\xDC": "U",
6974           "\xF9": "u",
6975           "\xFA": "u",
6976           "\xFB": "u",
6977           "\xFC": "u",
6978           "\xDD": "Y",
6979           "\xFD": "y",
6980           "\xFF": "y",
6981           "\xC6": "Ae",
6982           "\xE6": "ae",
6983           "\xDE": "Th",
6984           "\xFE": "th",
6985           "\xDF": "ss",
6986           // Latin Extended-A block.
6987           "\u0100": "A",
6988           "\u0102": "A",
6989           "\u0104": "A",
6990           "\u0101": "a",
6991           "\u0103": "a",
6992           "\u0105": "a",
6993           "\u0106": "C",
6994           "\u0108": "C",
6995           "\u010A": "C",
6996           "\u010C": "C",
6997           "\u0107": "c",
6998           "\u0109": "c",
6999           "\u010B": "c",
7000           "\u010D": "c",
7001           "\u010E": "D",
7002           "\u0110": "D",
7003           "\u010F": "d",
7004           "\u0111": "d",
7005           "\u0112": "E",
7006           "\u0114": "E",
7007           "\u0116": "E",
7008           "\u0118": "E",
7009           "\u011A": "E",
7010           "\u0113": "e",
7011           "\u0115": "e",
7012           "\u0117": "e",
7013           "\u0119": "e",
7014           "\u011B": "e",
7015           "\u011C": "G",
7016           "\u011E": "G",
7017           "\u0120": "G",
7018           "\u0122": "G",
7019           "\u011D": "g",
7020           "\u011F": "g",
7021           "\u0121": "g",
7022           "\u0123": "g",
7023           "\u0124": "H",
7024           "\u0126": "H",
7025           "\u0125": "h",
7026           "\u0127": "h",
7027           "\u0128": "I",
7028           "\u012A": "I",
7029           "\u012C": "I",
7030           "\u012E": "I",
7031           "\u0130": "I",
7032           "\u0129": "i",
7033           "\u012B": "i",
7034           "\u012D": "i",
7035           "\u012F": "i",
7036           "\u0131": "i",
7037           "\u0134": "J",
7038           "\u0135": "j",
7039           "\u0136": "K",
7040           "\u0137": "k",
7041           "\u0138": "k",
7042           "\u0139": "L",
7043           "\u013B": "L",
7044           "\u013D": "L",
7045           "\u013F": "L",
7046           "\u0141": "L",
7047           "\u013A": "l",
7048           "\u013C": "l",
7049           "\u013E": "l",
7050           "\u0140": "l",
7051           "\u0142": "l",
7052           "\u0143": "N",
7053           "\u0145": "N",
7054           "\u0147": "N",
7055           "\u014A": "N",
7056           "\u0144": "n",
7057           "\u0146": "n",
7058           "\u0148": "n",
7059           "\u014B": "n",
7060           "\u014C": "O",
7061           "\u014E": "O",
7062           "\u0150": "O",
7063           "\u014D": "o",
7064           "\u014F": "o",
7065           "\u0151": "o",
7066           "\u0154": "R",
7067           "\u0156": "R",
7068           "\u0158": "R",
7069           "\u0155": "r",
7070           "\u0157": "r",
7071           "\u0159": "r",
7072           "\u015A": "S",
7073           "\u015C": "S",
7074           "\u015E": "S",
7075           "\u0160": "S",
7076           "\u015B": "s",
7077           "\u015D": "s",
7078           "\u015F": "s",
7079           "\u0161": "s",
7080           "\u0162": "T",
7081           "\u0164": "T",
7082           "\u0166": "T",
7083           "\u0163": "t",
7084           "\u0165": "t",
7085           "\u0167": "t",
7086           "\u0168": "U",
7087           "\u016A": "U",
7088           "\u016C": "U",
7089           "\u016E": "U",
7090           "\u0170": "U",
7091           "\u0172": "U",
7092           "\u0169": "u",
7093           "\u016B": "u",
7094           "\u016D": "u",
7095           "\u016F": "u",
7096           "\u0171": "u",
7097           "\u0173": "u",
7098           "\u0174": "W",
7099           "\u0175": "w",
7100           "\u0176": "Y",
7101           "\u0177": "y",
7102           "\u0178": "Y",
7103           "\u0179": "Z",
7104           "\u017B": "Z",
7105           "\u017D": "Z",
7106           "\u017A": "z",
7107           "\u017C": "z",
7108           "\u017E": "z",
7109           "\u0132": "IJ",
7110           "\u0133": "ij",
7111           "\u0152": "Oe",
7112           "\u0153": "oe",
7113           "\u0149": "'n",
7114           "\u017F": "s"
7115         };
7116         var htmlEscapes2 = {
7117           "&": "&amp;",
7118           "<": "&lt;",
7119           ">": "&gt;",
7120           '"': "&quot;",
7121           "'": "&#39;"
7122         };
7123         var htmlUnescapes2 = {
7124           "&amp;": "&",
7125           "&lt;": "<",
7126           "&gt;": ">",
7127           "&quot;": '"',
7128           "&#39;": "'"
7129         };
7130         var stringEscapes = {
7131           "\\": "\\",
7132           "'": "'",
7133           "\n": "n",
7134           "\r": "r",
7135           "\u2028": "u2028",
7136           "\u2029": "u2029"
7137         };
7138         var freeParseFloat = parseFloat, freeParseInt2 = parseInt;
7139         var freeGlobal2 = typeof global == "object" && global && global.Object === Object && global;
7140         var freeSelf2 = typeof self == "object" && self && self.Object === Object && self;
7141         var root3 = freeGlobal2 || freeSelf2 || Function("return this")();
7142         var freeExports = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2;
7143         var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2;
7144         var moduleExports = freeModule && freeModule.exports === freeExports;
7145         var freeProcess = moduleExports && freeGlobal2.process;
7146         var nodeUtil = function() {
7147           try {
7148             var types = freeModule && freeModule.require && freeModule.require("util").types;
7149             if (types) {
7150               return types;
7151             }
7152             return freeProcess && freeProcess.binding && freeProcess.binding("util");
7153           } catch (e) {
7154           }
7155         }();
7156         var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
7157         function apply(func, thisArg, args) {
7158           switch (args.length) {
7159             case 0:
7160               return func.call(thisArg);
7161             case 1:
7162               return func.call(thisArg, args[0]);
7163             case 2:
7164               return func.call(thisArg, args[0], args[1]);
7165             case 3:
7166               return func.call(thisArg, args[0], args[1], args[2]);
7167           }
7168           return func.apply(thisArg, args);
7169         }
7170         function arrayAggregator(array2, setter, iteratee, accumulator) {
7171           var index = -1, length = array2 == null ? 0 : array2.length;
7172           while (++index < length) {
7173             var value = array2[index];
7174             setter(accumulator, value, iteratee(value), array2);
7175           }
7176           return accumulator;
7177         }
7178         function arrayEach(array2, iteratee) {
7179           var index = -1, length = array2 == null ? 0 : array2.length;
7180           while (++index < length) {
7181             if (iteratee(array2[index], index, array2) === false) {
7182               break;
7183             }
7184           }
7185           return array2;
7186         }
7187         function arrayEachRight(array2, iteratee) {
7188           var length = array2 == null ? 0 : array2.length;
7189           while (length--) {
7190             if (iteratee(array2[length], length, array2) === false) {
7191               break;
7192             }
7193           }
7194           return array2;
7195         }
7196         function arrayEvery(array2, predicate) {
7197           var index = -1, length = array2 == null ? 0 : array2.length;
7198           while (++index < length) {
7199             if (!predicate(array2[index], index, array2)) {
7200               return false;
7201             }
7202           }
7203           return true;
7204         }
7205         function arrayFilter(array2, predicate) {
7206           var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
7207           while (++index < length) {
7208             var value = array2[index];
7209             if (predicate(value, index, array2)) {
7210               result[resIndex++] = value;
7211             }
7212           }
7213           return result;
7214         }
7215         function arrayIncludes(array2, value) {
7216           var length = array2 == null ? 0 : array2.length;
7217           return !!length && baseIndexOf(array2, value, 0) > -1;
7218         }
7219         function arrayIncludesWith(array2, value, comparator) {
7220           var index = -1, length = array2 == null ? 0 : array2.length;
7221           while (++index < length) {
7222             if (comparator(value, array2[index])) {
7223               return true;
7224             }
7225           }
7226           return false;
7227         }
7228         function arrayMap2(array2, iteratee) {
7229           var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
7230           while (++index < length) {
7231             result[index] = iteratee(array2[index], index, array2);
7232           }
7233           return result;
7234         }
7235         function arrayPush(array2, values) {
7236           var index = -1, length = values.length, offset = array2.length;
7237           while (++index < length) {
7238             array2[offset + index] = values[index];
7239           }
7240           return array2;
7241         }
7242         function arrayReduce(array2, iteratee, accumulator, initAccum) {
7243           var index = -1, length = array2 == null ? 0 : array2.length;
7244           if (initAccum && length) {
7245             accumulator = array2[++index];
7246           }
7247           while (++index < length) {
7248             accumulator = iteratee(accumulator, array2[index], index, array2);
7249           }
7250           return accumulator;
7251         }
7252         function arrayReduceRight(array2, iteratee, accumulator, initAccum) {
7253           var length = array2 == null ? 0 : array2.length;
7254           if (initAccum && length) {
7255             accumulator = array2[--length];
7256           }
7257           while (length--) {
7258             accumulator = iteratee(accumulator, array2[length], length, array2);
7259           }
7260           return accumulator;
7261         }
7262         function arraySome(array2, predicate) {
7263           var index = -1, length = array2 == null ? 0 : array2.length;
7264           while (++index < length) {
7265             if (predicate(array2[index], index, array2)) {
7266               return true;
7267             }
7268           }
7269           return false;
7270         }
7271         var asciiSize = baseProperty("length");
7272         function asciiToArray(string) {
7273           return string.split("");
7274         }
7275         function asciiWords(string) {
7276           return string.match(reAsciiWord) || [];
7277         }
7278         function baseFindKey(collection, predicate, eachFunc) {
7279           var result;
7280           eachFunc(collection, function(value, key, collection2) {
7281             if (predicate(value, key, collection2)) {
7282               result = key;
7283               return false;
7284             }
7285           });
7286           return result;
7287         }
7288         function baseFindIndex(array2, predicate, fromIndex, fromRight) {
7289           var length = array2.length, index = fromIndex + (fromRight ? 1 : -1);
7290           while (fromRight ? index-- : ++index < length) {
7291             if (predicate(array2[index], index, array2)) {
7292               return index;
7293             }
7294           }
7295           return -1;
7296         }
7297         function baseIndexOf(array2, value, fromIndex) {
7298           return value === value ? strictIndexOf(array2, value, fromIndex) : baseFindIndex(array2, baseIsNaN, fromIndex);
7299         }
7300         function baseIndexOfWith(array2, value, fromIndex, comparator) {
7301           var index = fromIndex - 1, length = array2.length;
7302           while (++index < length) {
7303             if (comparator(array2[index], value)) {
7304               return index;
7305             }
7306           }
7307           return -1;
7308         }
7309         function baseIsNaN(value) {
7310           return value !== value;
7311         }
7312         function baseMean(array2, iteratee) {
7313           var length = array2 == null ? 0 : array2.length;
7314           return length ? baseSum(array2, iteratee) / length : NAN2;
7315         }
7316         function baseProperty(key) {
7317           return function(object) {
7318             return object == null ? undefined2 : object[key];
7319           };
7320         }
7321         function basePropertyOf2(object) {
7322           return function(key) {
7323             return object == null ? undefined2 : object[key];
7324           };
7325         }
7326         function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
7327           eachFunc(collection, function(value, index, collection2) {
7328             accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2);
7329           });
7330           return accumulator;
7331         }
7332         function baseSortBy(array2, comparer) {
7333           var length = array2.length;
7334           array2.sort(comparer);
7335           while (length--) {
7336             array2[length] = array2[length].value;
7337           }
7338           return array2;
7339         }
7340         function baseSum(array2, iteratee) {
7341           var result, index = -1, length = array2.length;
7342           while (++index < length) {
7343             var current = iteratee(array2[index]);
7344             if (current !== undefined2) {
7345               result = result === undefined2 ? current : result + current;
7346             }
7347           }
7348           return result;
7349         }
7350         function baseTimes(n2, iteratee) {
7351           var index = -1, result = Array(n2);
7352           while (++index < n2) {
7353             result[index] = iteratee(index);
7354           }
7355           return result;
7356         }
7357         function baseToPairs(object, props) {
7358           return arrayMap2(props, function(key) {
7359             return [key, object[key]];
7360           });
7361         }
7362         function baseTrim2(string) {
7363           return string ? string.slice(0, trimmedEndIndex2(string) + 1).replace(reTrimStart2, "") : string;
7364         }
7365         function baseUnary(func) {
7366           return function(value) {
7367             return func(value);
7368           };
7369         }
7370         function baseValues(object, props) {
7371           return arrayMap2(props, function(key) {
7372             return object[key];
7373           });
7374         }
7375         function cacheHas(cache, key) {
7376           return cache.has(key);
7377         }
7378         function charsStartIndex(strSymbols, chrSymbols) {
7379           var index = -1, length = strSymbols.length;
7380           while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
7381           }
7382           return index;
7383         }
7384         function charsEndIndex(strSymbols, chrSymbols) {
7385           var index = strSymbols.length;
7386           while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
7387           }
7388           return index;
7389         }
7390         function countHolders(array2, placeholder) {
7391           var length = array2.length, result = 0;
7392           while (length--) {
7393             if (array2[length] === placeholder) {
7394               ++result;
7395             }
7396           }
7397           return result;
7398         }
7399         var deburrLetter = basePropertyOf2(deburredLetters);
7400         var escapeHtmlChar2 = basePropertyOf2(htmlEscapes2);
7401         function escapeStringChar(chr) {
7402           return "\\" + stringEscapes[chr];
7403         }
7404         function getValue(object, key) {
7405           return object == null ? undefined2 : object[key];
7406         }
7407         function hasUnicode(string) {
7408           return reHasUnicode.test(string);
7409         }
7410         function hasUnicodeWord(string) {
7411           return reHasUnicodeWord.test(string);
7412         }
7413         function iteratorToArray(iterator) {
7414           var data, result = [];
7415           while (!(data = iterator.next()).done) {
7416             result.push(data.value);
7417           }
7418           return result;
7419         }
7420         function mapToArray(map2) {
7421           var index = -1, result = Array(map2.size);
7422           map2.forEach(function(value, key) {
7423             result[++index] = [key, value];
7424           });
7425           return result;
7426         }
7427         function overArg(func, transform2) {
7428           return function(arg) {
7429             return func(transform2(arg));
7430           };
7431         }
7432         function replaceHolders(array2, placeholder) {
7433           var index = -1, length = array2.length, resIndex = 0, result = [];
7434           while (++index < length) {
7435             var value = array2[index];
7436             if (value === placeholder || value === PLACEHOLDER) {
7437               array2[index] = PLACEHOLDER;
7438               result[resIndex++] = index;
7439             }
7440           }
7441           return result;
7442         }
7443         function setToArray(set3) {
7444           var index = -1, result = Array(set3.size);
7445           set3.forEach(function(value) {
7446             result[++index] = value;
7447           });
7448           return result;
7449         }
7450         function setToPairs(set3) {
7451           var index = -1, result = Array(set3.size);
7452           set3.forEach(function(value) {
7453             result[++index] = [value, value];
7454           });
7455           return result;
7456         }
7457         function strictIndexOf(array2, value, fromIndex) {
7458           var index = fromIndex - 1, length = array2.length;
7459           while (++index < length) {
7460             if (array2[index] === value) {
7461               return index;
7462             }
7463           }
7464           return -1;
7465         }
7466         function strictLastIndexOf(array2, value, fromIndex) {
7467           var index = fromIndex + 1;
7468           while (index--) {
7469             if (array2[index] === value) {
7470               return index;
7471             }
7472           }
7473           return index;
7474         }
7475         function stringSize(string) {
7476           return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
7477         }
7478         function stringToArray(string) {
7479           return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
7480         }
7481         function trimmedEndIndex2(string) {
7482           var index = string.length;
7483           while (index-- && reWhitespace2.test(string.charAt(index))) {
7484           }
7485           return index;
7486         }
7487         var unescapeHtmlChar2 = basePropertyOf2(htmlUnescapes2);
7488         function unicodeSize(string) {
7489           var result = reUnicode.lastIndex = 0;
7490           while (reUnicode.test(string)) {
7491             ++result;
7492           }
7493           return result;
7494         }
7495         function unicodeToArray(string) {
7496           return string.match(reUnicode) || [];
7497         }
7498         function unicodeWords(string) {
7499           return string.match(reUnicodeWord) || [];
7500         }
7501         var runInContext = function runInContext2(context) {
7502           context = context == null ? root3 : _.defaults(root3.Object(), context, _.pick(root3, contextProps));
7503           var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError;
7504           var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto3 = Object2.prototype;
7505           var coreJsData = context["__core-js_shared__"];
7506           var funcToString = funcProto.toString;
7507           var hasOwnProperty2 = objectProto3.hasOwnProperty;
7508           var idCounter = 0;
7509           var maskSrcKey = function() {
7510             var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
7511             return uid ? "Symbol(src)_1." + uid : "";
7512           }();
7513           var nativeObjectToString3 = objectProto3.toString;
7514           var objectCtorString = funcToString.call(Object2);
7515           var oldDash = root3._;
7516           var reIsNative = RegExp2(
7517             "^" + funcToString.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
7518           );
7519           var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol3 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto3.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol3 ? Symbol3.isConcatSpreadable : undefined2, symIterator = Symbol3 ? Symbol3.iterator : undefined2, symToStringTag3 = Symbol3 ? Symbol3.toStringTag : undefined2;
7520           var defineProperty = function() {
7521             try {
7522               var func = getNative(Object2, "defineProperty");
7523               func({}, "", {});
7524               return func;
7525             } catch (e) {
7526             }
7527           }();
7528           var ctxClearTimeout = context.clearTimeout !== root3.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root3.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root3.setTimeout && context.setTimeout;
7529           var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax2 = Math2.max, nativeMin2 = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
7530           var DataView2 = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create");
7531           var metaMap = WeakMap && new WeakMap();
7532           var realNames = {};
7533           var dataViewCtorString = toSource(DataView2), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap);
7534           var symbolProto2 = Symbol3 ? Symbol3.prototype : undefined2, symbolValueOf = symbolProto2 ? symbolProto2.valueOf : undefined2, symbolToString2 = symbolProto2 ? symbolProto2.toString : undefined2;
7535           function lodash(value) {
7536             if (isObjectLike2(value) && !isArray2(value) && !(value instanceof LazyWrapper)) {
7537               if (value instanceof LodashWrapper) {
7538                 return value;
7539               }
7540               if (hasOwnProperty2.call(value, "__wrapped__")) {
7541                 return wrapperClone(value);
7542               }
7543             }
7544             return new LodashWrapper(value);
7545           }
7546           var baseCreate = function() {
7547             function object() {
7548             }
7549             return function(proto) {
7550               if (!isObject3(proto)) {
7551                 return {};
7552               }
7553               if (objectCreate) {
7554                 return objectCreate(proto);
7555               }
7556               object.prototype = proto;
7557               var result2 = new object();
7558               object.prototype = undefined2;
7559               return result2;
7560             };
7561           }();
7562           function baseLodash() {
7563           }
7564           function LodashWrapper(value, chainAll) {
7565             this.__wrapped__ = value;
7566             this.__actions__ = [];
7567             this.__chain__ = !!chainAll;
7568             this.__index__ = 0;
7569             this.__values__ = undefined2;
7570           }
7571           lodash.templateSettings = {
7572             /**
7573              * Used to detect `data` property values to be HTML-escaped.
7574              *
7575              * @memberOf _.templateSettings
7576              * @type {RegExp}
7577              */
7578             "escape": reEscape,
7579             /**
7580              * Used to detect code to be evaluated.
7581              *
7582              * @memberOf _.templateSettings
7583              * @type {RegExp}
7584              */
7585             "evaluate": reEvaluate,
7586             /**
7587              * Used to detect `data` property values to inject.
7588              *
7589              * @memberOf _.templateSettings
7590              * @type {RegExp}
7591              */
7592             "interpolate": reInterpolate,
7593             /**
7594              * Used to reference the data object in the template text.
7595              *
7596              * @memberOf _.templateSettings
7597              * @type {string}
7598              */
7599             "variable": "",
7600             /**
7601              * Used to import variables into the compiled template.
7602              *
7603              * @memberOf _.templateSettings
7604              * @type {Object}
7605              */
7606             "imports": {
7607               /**
7608                * A reference to the `lodash` function.
7609                *
7610                * @memberOf _.templateSettings.imports
7611                * @type {Function}
7612                */
7613               "_": lodash
7614             }
7615           };
7616           lodash.prototype = baseLodash.prototype;
7617           lodash.prototype.constructor = lodash;
7618           LodashWrapper.prototype = baseCreate(baseLodash.prototype);
7619           LodashWrapper.prototype.constructor = LodashWrapper;
7620           function LazyWrapper(value) {
7621             this.__wrapped__ = value;
7622             this.__actions__ = [];
7623             this.__dir__ = 1;
7624             this.__filtered__ = false;
7625             this.__iteratees__ = [];
7626             this.__takeCount__ = MAX_ARRAY_LENGTH;
7627             this.__views__ = [];
7628           }
7629           function lazyClone() {
7630             var result2 = new LazyWrapper(this.__wrapped__);
7631             result2.__actions__ = copyArray(this.__actions__);
7632             result2.__dir__ = this.__dir__;
7633             result2.__filtered__ = this.__filtered__;
7634             result2.__iteratees__ = copyArray(this.__iteratees__);
7635             result2.__takeCount__ = this.__takeCount__;
7636             result2.__views__ = copyArray(this.__views__);
7637             return result2;
7638           }
7639           function lazyReverse() {
7640             if (this.__filtered__) {
7641               var result2 = new LazyWrapper(this);
7642               result2.__dir__ = -1;
7643               result2.__filtered__ = true;
7644             } else {
7645               result2 = this.clone();
7646               result2.__dir__ *= -1;
7647             }
7648             return result2;
7649           }
7650           function lazyValue() {
7651             var array2 = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray2(array2), isRight = dir < 0, arrLength = isArr ? array2.length : 0, view = getView(0, arrLength, this.__views__), start2 = view.start, end = view.end, length = end - start2, index = isRight ? end : start2 - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin2(length, this.__takeCount__);
7652             if (!isArr || !isRight && arrLength == length && takeCount == length) {
7653               return baseWrapperValue(array2, this.__actions__);
7654             }
7655             var result2 = [];
7656             outer:
7657               while (length-- && resIndex < takeCount) {
7658                 index += dir;
7659                 var iterIndex = -1, value = array2[index];
7660                 while (++iterIndex < iterLength) {
7661                   var data = iteratees[iterIndex], iteratee2 = data.iteratee, type2 = data.type, computed = iteratee2(value);
7662                   if (type2 == LAZY_MAP_FLAG) {
7663                     value = computed;
7664                   } else if (!computed) {
7665                     if (type2 == LAZY_FILTER_FLAG) {
7666                       continue outer;
7667                     } else {
7668                       break outer;
7669                     }
7670                   }
7671                 }
7672                 result2[resIndex++] = value;
7673               }
7674             return result2;
7675           }
7676           LazyWrapper.prototype = baseCreate(baseLodash.prototype);
7677           LazyWrapper.prototype.constructor = LazyWrapper;
7678           function Hash(entries) {
7679             var index = -1, length = entries == null ? 0 : entries.length;
7680             this.clear();
7681             while (++index < length) {
7682               var entry = entries[index];
7683               this.set(entry[0], entry[1]);
7684             }
7685           }
7686           function hashClear() {
7687             this.__data__ = nativeCreate ? nativeCreate(null) : {};
7688             this.size = 0;
7689           }
7690           function hashDelete(key) {
7691             var result2 = this.has(key) && delete this.__data__[key];
7692             this.size -= result2 ? 1 : 0;
7693             return result2;
7694           }
7695           function hashGet(key) {
7696             var data = this.__data__;
7697             if (nativeCreate) {
7698               var result2 = data[key];
7699               return result2 === HASH_UNDEFINED ? undefined2 : result2;
7700             }
7701             return hasOwnProperty2.call(data, key) ? data[key] : undefined2;
7702           }
7703           function hashHas(key) {
7704             var data = this.__data__;
7705             return nativeCreate ? data[key] !== undefined2 : hasOwnProperty2.call(data, key);
7706           }
7707           function hashSet(key, value) {
7708             var data = this.__data__;
7709             this.size += this.has(key) ? 0 : 1;
7710             data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value;
7711             return this;
7712           }
7713           Hash.prototype.clear = hashClear;
7714           Hash.prototype["delete"] = hashDelete;
7715           Hash.prototype.get = hashGet;
7716           Hash.prototype.has = hashHas;
7717           Hash.prototype.set = hashSet;
7718           function ListCache(entries) {
7719             var index = -1, length = entries == null ? 0 : entries.length;
7720             this.clear();
7721             while (++index < length) {
7722               var entry = entries[index];
7723               this.set(entry[0], entry[1]);
7724             }
7725           }
7726           function listCacheClear() {
7727             this.__data__ = [];
7728             this.size = 0;
7729           }
7730           function listCacheDelete(key) {
7731             var data = this.__data__, index = assocIndexOf(data, key);
7732             if (index < 0) {
7733               return false;
7734             }
7735             var lastIndex = data.length - 1;
7736             if (index == lastIndex) {
7737               data.pop();
7738             } else {
7739               splice.call(data, index, 1);
7740             }
7741             --this.size;
7742             return true;
7743           }
7744           function listCacheGet(key) {
7745             var data = this.__data__, index = assocIndexOf(data, key);
7746             return index < 0 ? undefined2 : data[index][1];
7747           }
7748           function listCacheHas(key) {
7749             return assocIndexOf(this.__data__, key) > -1;
7750           }
7751           function listCacheSet(key, value) {
7752             var data = this.__data__, index = assocIndexOf(data, key);
7753             if (index < 0) {
7754               ++this.size;
7755               data.push([key, value]);
7756             } else {
7757               data[index][1] = value;
7758             }
7759             return this;
7760           }
7761           ListCache.prototype.clear = listCacheClear;
7762           ListCache.prototype["delete"] = listCacheDelete;
7763           ListCache.prototype.get = listCacheGet;
7764           ListCache.prototype.has = listCacheHas;
7765           ListCache.prototype.set = listCacheSet;
7766           function MapCache(entries) {
7767             var index = -1, length = entries == null ? 0 : entries.length;
7768             this.clear();
7769             while (++index < length) {
7770               var entry = entries[index];
7771               this.set(entry[0], entry[1]);
7772             }
7773           }
7774           function mapCacheClear() {
7775             this.size = 0;
7776             this.__data__ = {
7777               "hash": new Hash(),
7778               "map": new (Map2 || ListCache)(),
7779               "string": new Hash()
7780             };
7781           }
7782           function mapCacheDelete(key) {
7783             var result2 = getMapData(this, key)["delete"](key);
7784             this.size -= result2 ? 1 : 0;
7785             return result2;
7786           }
7787           function mapCacheGet(key) {
7788             return getMapData(this, key).get(key);
7789           }
7790           function mapCacheHas(key) {
7791             return getMapData(this, key).has(key);
7792           }
7793           function mapCacheSet(key, value) {
7794             var data = getMapData(this, key), size2 = data.size;
7795             data.set(key, value);
7796             this.size += data.size == size2 ? 0 : 1;
7797             return this;
7798           }
7799           MapCache.prototype.clear = mapCacheClear;
7800           MapCache.prototype["delete"] = mapCacheDelete;
7801           MapCache.prototype.get = mapCacheGet;
7802           MapCache.prototype.has = mapCacheHas;
7803           MapCache.prototype.set = mapCacheSet;
7804           function SetCache(values2) {
7805             var index = -1, length = values2 == null ? 0 : values2.length;
7806             this.__data__ = new MapCache();
7807             while (++index < length) {
7808               this.add(values2[index]);
7809             }
7810           }
7811           function setCacheAdd(value) {
7812             this.__data__.set(value, HASH_UNDEFINED);
7813             return this;
7814           }
7815           function setCacheHas(value) {
7816             return this.__data__.has(value);
7817           }
7818           SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
7819           SetCache.prototype.has = setCacheHas;
7820           function Stack(entries) {
7821             var data = this.__data__ = new ListCache(entries);
7822             this.size = data.size;
7823           }
7824           function stackClear() {
7825             this.__data__ = new ListCache();
7826             this.size = 0;
7827           }
7828           function stackDelete(key) {
7829             var data = this.__data__, result2 = data["delete"](key);
7830             this.size = data.size;
7831             return result2;
7832           }
7833           function stackGet(key) {
7834             return this.__data__.get(key);
7835           }
7836           function stackHas(key) {
7837             return this.__data__.has(key);
7838           }
7839           function stackSet(key, value) {
7840             var data = this.__data__;
7841             if (data instanceof ListCache) {
7842               var pairs = data.__data__;
7843               if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) {
7844                 pairs.push([key, value]);
7845                 this.size = ++data.size;
7846                 return this;
7847               }
7848               data = this.__data__ = new MapCache(pairs);
7849             }
7850             data.set(key, value);
7851             this.size = data.size;
7852             return this;
7853           }
7854           Stack.prototype.clear = stackClear;
7855           Stack.prototype["delete"] = stackDelete;
7856           Stack.prototype.get = stackGet;
7857           Stack.prototype.has = stackHas;
7858           Stack.prototype.set = stackSet;
7859           function arrayLikeKeys(value, inherited) {
7860             var isArr = isArray2(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length;
7861             for (var key in value) {
7862               if ((inherited || hasOwnProperty2.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode.
7863               (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers.
7864               isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays.
7865               isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties.
7866               isIndex(key, length)))) {
7867                 result2.push(key);
7868               }
7869             }
7870             return result2;
7871           }
7872           function arraySample(array2) {
7873             var length = array2.length;
7874             return length ? array2[baseRandom(0, length - 1)] : undefined2;
7875           }
7876           function arraySampleSize(array2, n2) {
7877             return shuffleSelf(copyArray(array2), baseClamp(n2, 0, array2.length));
7878           }
7879           function arrayShuffle(array2) {
7880             return shuffleSelf(copyArray(array2));
7881           }
7882           function assignMergeValue(object, key, value) {
7883             if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) {
7884               baseAssignValue(object, key, value);
7885             }
7886           }
7887           function assignValue(object, key, value) {
7888             var objValue = object[key];
7889             if (!(hasOwnProperty2.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) {
7890               baseAssignValue(object, key, value);
7891             }
7892           }
7893           function assocIndexOf(array2, key) {
7894             var length = array2.length;
7895             while (length--) {
7896               if (eq(array2[length][0], key)) {
7897                 return length;
7898               }
7899             }
7900             return -1;
7901           }
7902           function baseAggregator(collection, setter, iteratee2, accumulator) {
7903             baseEach(collection, function(value, key, collection2) {
7904               setter(accumulator, value, iteratee2(value), collection2);
7905             });
7906             return accumulator;
7907           }
7908           function baseAssign(object, source) {
7909             return object && copyObject(source, keys(source), object);
7910           }
7911           function baseAssignIn(object, source) {
7912             return object && copyObject(source, keysIn(source), object);
7913           }
7914           function baseAssignValue(object, key, value) {
7915             if (key == "__proto__" && defineProperty) {
7916               defineProperty(object, key, {
7917                 "configurable": true,
7918                 "enumerable": true,
7919                 "value": value,
7920                 "writable": true
7921               });
7922             } else {
7923               object[key] = value;
7924             }
7925           }
7926           function baseAt(object, paths) {
7927             var index = -1, length = paths.length, result2 = Array2(length), skip = object == null;
7928             while (++index < length) {
7929               result2[index] = skip ? undefined2 : get4(object, paths[index]);
7930             }
7931             return result2;
7932           }
7933           function baseClamp(number3, lower2, upper) {
7934             if (number3 === number3) {
7935               if (upper !== undefined2) {
7936                 number3 = number3 <= upper ? number3 : upper;
7937               }
7938               if (lower2 !== undefined2) {
7939                 number3 = number3 >= lower2 ? number3 : lower2;
7940               }
7941             }
7942             return number3;
7943           }
7944           function baseClone(value, bitmask, customizer, key, object, stack) {
7945             var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG;
7946             if (customizer) {
7947               result2 = object ? customizer(value, key, object, stack) : customizer(value);
7948             }
7949             if (result2 !== undefined2) {
7950               return result2;
7951             }
7952             if (!isObject3(value)) {
7953               return value;
7954             }
7955             var isArr = isArray2(value);
7956             if (isArr) {
7957               result2 = initCloneArray(value);
7958               if (!isDeep) {
7959                 return copyArray(value, result2);
7960               }
7961             } else {
7962               var tag = getTag(value), isFunc = tag == funcTag || tag == genTag;
7963               if (isBuffer(value)) {
7964                 return cloneBuffer(value, isDeep);
7965               }
7966               if (tag == objectTag || tag == argsTag || isFunc && !object) {
7967                 result2 = isFlat || isFunc ? {} : initCloneObject(value);
7968                 if (!isDeep) {
7969                   return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value));
7970                 }
7971               } else {
7972                 if (!cloneableTags[tag]) {
7973                   return object ? value : {};
7974                 }
7975                 result2 = initCloneByTag(value, tag, isDeep);
7976               }
7977             }
7978             stack || (stack = new Stack());
7979             var stacked = stack.get(value);
7980             if (stacked) {
7981               return stacked;
7982             }
7983             stack.set(value, result2);
7984             if (isSet(value)) {
7985               value.forEach(function(subValue) {
7986                 result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
7987               });
7988             } else if (isMap(value)) {
7989               value.forEach(function(subValue, key2) {
7990                 result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
7991               });
7992             }
7993             var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
7994             var props = isArr ? undefined2 : keysFunc(value);
7995             arrayEach(props || value, function(subValue, key2) {
7996               if (props) {
7997                 key2 = subValue;
7998                 subValue = value[key2];
7999               }
8000               assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
8001             });
8002             return result2;
8003           }
8004           function baseConforms(source) {
8005             var props = keys(source);
8006             return function(object) {
8007               return baseConformsTo(object, source, props);
8008             };
8009           }
8010           function baseConformsTo(object, source, props) {
8011             var length = props.length;
8012             if (object == null) {
8013               return !length;
8014             }
8015             object = Object2(object);
8016             while (length--) {
8017               var key = props[length], predicate = source[key], value = object[key];
8018               if (value === undefined2 && !(key in object) || !predicate(value)) {
8019                 return false;
8020               }
8021             }
8022             return true;
8023           }
8024           function baseDelay(func, wait, args) {
8025             if (typeof func != "function") {
8026               throw new TypeError2(FUNC_ERROR_TEXT3);
8027             }
8028             return setTimeout2(function() {
8029               func.apply(undefined2, args);
8030             }, wait);
8031           }
8032           function baseDifference(array2, values2, iteratee2, comparator) {
8033             var index = -1, includes2 = arrayIncludes, isCommon = true, length = array2.length, result2 = [], valuesLength = values2.length;
8034             if (!length) {
8035               return result2;
8036             }
8037             if (iteratee2) {
8038               values2 = arrayMap2(values2, baseUnary(iteratee2));
8039             }
8040             if (comparator) {
8041               includes2 = arrayIncludesWith;
8042               isCommon = false;
8043             } else if (values2.length >= LARGE_ARRAY_SIZE) {
8044               includes2 = cacheHas;
8045               isCommon = false;
8046               values2 = new SetCache(values2);
8047             }
8048             outer:
8049               while (++index < length) {
8050                 var value = array2[index], computed = iteratee2 == null ? value : iteratee2(value);
8051                 value = comparator || value !== 0 ? value : 0;
8052                 if (isCommon && computed === computed) {
8053                   var valuesIndex = valuesLength;
8054                   while (valuesIndex--) {
8055                     if (values2[valuesIndex] === computed) {
8056                       continue outer;
8057                     }
8058                   }
8059                   result2.push(value);
8060                 } else if (!includes2(values2, computed, comparator)) {
8061                   result2.push(value);
8062                 }
8063               }
8064             return result2;
8065           }
8066           var baseEach = createBaseEach(baseForOwn);
8067           var baseEachRight = createBaseEach(baseForOwnRight, true);
8068           function baseEvery(collection, predicate) {
8069             var result2 = true;
8070             baseEach(collection, function(value, index, collection2) {
8071               result2 = !!predicate(value, index, collection2);
8072               return result2;
8073             });
8074             return result2;
8075           }
8076           function baseExtremum(array2, iteratee2, comparator) {
8077             var index = -1, length = array2.length;
8078             while (++index < length) {
8079               var value = array2[index], current = iteratee2(value);
8080               if (current != null && (computed === undefined2 ? current === current && !isSymbol2(current) : comparator(current, computed))) {
8081                 var computed = current, result2 = value;
8082               }
8083             }
8084             return result2;
8085           }
8086           function baseFill(array2, value, start2, end) {
8087             var length = array2.length;
8088             start2 = toInteger(start2);
8089             if (start2 < 0) {
8090               start2 = -start2 > length ? 0 : length + start2;
8091             }
8092             end = end === undefined2 || end > length ? length : toInteger(end);
8093             if (end < 0) {
8094               end += length;
8095             }
8096             end = start2 > end ? 0 : toLength(end);
8097             while (start2 < end) {
8098               array2[start2++] = value;
8099             }
8100             return array2;
8101           }
8102           function baseFilter(collection, predicate) {
8103             var result2 = [];
8104             baseEach(collection, function(value, index, collection2) {
8105               if (predicate(value, index, collection2)) {
8106                 result2.push(value);
8107               }
8108             });
8109             return result2;
8110           }
8111           function baseFlatten(array2, depth, predicate, isStrict, result2) {
8112             var index = -1, length = array2.length;
8113             predicate || (predicate = isFlattenable);
8114             result2 || (result2 = []);
8115             while (++index < length) {
8116               var value = array2[index];
8117               if (depth > 0 && predicate(value)) {
8118                 if (depth > 1) {
8119                   baseFlatten(value, depth - 1, predicate, isStrict, result2);
8120                 } else {
8121                   arrayPush(result2, value);
8122                 }
8123               } else if (!isStrict) {
8124                 result2[result2.length] = value;
8125               }
8126             }
8127             return result2;
8128           }
8129           var baseFor = createBaseFor();
8130           var baseForRight = createBaseFor(true);
8131           function baseForOwn(object, iteratee2) {
8132             return object && baseFor(object, iteratee2, keys);
8133           }
8134           function baseForOwnRight(object, iteratee2) {
8135             return object && baseForRight(object, iteratee2, keys);
8136           }
8137           function baseFunctions(object, props) {
8138             return arrayFilter(props, function(key) {
8139               return isFunction(object[key]);
8140             });
8141           }
8142           function baseGet(object, path) {
8143             path = castPath(path, object);
8144             var index = 0, length = path.length;
8145             while (object != null && index < length) {
8146               object = object[toKey(path[index++])];
8147             }
8148             return index && index == length ? object : undefined2;
8149           }
8150           function baseGetAllKeys(object, keysFunc, symbolsFunc) {
8151             var result2 = keysFunc(object);
8152             return isArray2(object) ? result2 : arrayPush(result2, symbolsFunc(object));
8153           }
8154           function baseGetTag2(value) {
8155             if (value == null) {
8156               return value === undefined2 ? undefinedTag2 : nullTag2;
8157             }
8158             return symToStringTag3 && symToStringTag3 in Object2(value) ? getRawTag2(value) : objectToString2(value);
8159           }
8160           function baseGt(value, other) {
8161             return value > other;
8162           }
8163           function baseHas(object, key) {
8164             return object != null && hasOwnProperty2.call(object, key);
8165           }
8166           function baseHasIn(object, key) {
8167             return object != null && key in Object2(object);
8168           }
8169           function baseInRange(number3, start2, end) {
8170             return number3 >= nativeMin2(start2, end) && number3 < nativeMax2(start2, end);
8171           }
8172           function baseIntersection(arrays, iteratee2, comparator) {
8173             var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = [];
8174             while (othIndex--) {
8175               var array2 = arrays[othIndex];
8176               if (othIndex && iteratee2) {
8177                 array2 = arrayMap2(array2, baseUnary(iteratee2));
8178               }
8179               maxLength = nativeMin2(array2.length, maxLength);
8180               caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array2.length >= 120) ? new SetCache(othIndex && array2) : undefined2;
8181             }
8182             array2 = arrays[0];
8183             var index = -1, seen = caches[0];
8184             outer:
8185               while (++index < length && result2.length < maxLength) {
8186                 var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
8187                 value = comparator || value !== 0 ? value : 0;
8188                 if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) {
8189                   othIndex = othLength;
8190                   while (--othIndex) {
8191                     var cache = caches[othIndex];
8192                     if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) {
8193                       continue outer;
8194                     }
8195                   }
8196                   if (seen) {
8197                     seen.push(computed);
8198                   }
8199                   result2.push(value);
8200                 }
8201               }
8202             return result2;
8203           }
8204           function baseInverter(object, setter, iteratee2, accumulator) {
8205             baseForOwn(object, function(value, key, object2) {
8206               setter(accumulator, iteratee2(value), key, object2);
8207             });
8208             return accumulator;
8209           }
8210           function baseInvoke(object, path, args) {
8211             path = castPath(path, object);
8212             object = parent(object, path);
8213             var func = object == null ? object : object[toKey(last(path))];
8214             return func == null ? undefined2 : apply(func, object, args);
8215           }
8216           function baseIsArguments(value) {
8217             return isObjectLike2(value) && baseGetTag2(value) == argsTag;
8218           }
8219           function baseIsArrayBuffer(value) {
8220             return isObjectLike2(value) && baseGetTag2(value) == arrayBufferTag;
8221           }
8222           function baseIsDate(value) {
8223             return isObjectLike2(value) && baseGetTag2(value) == dateTag;
8224           }
8225           function baseIsEqual(value, other, bitmask, customizer, stack) {
8226             if (value === other) {
8227               return true;
8228             }
8229             if (value == null || other == null || !isObjectLike2(value) && !isObjectLike2(other)) {
8230               return value !== value && other !== other;
8231             }
8232             return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
8233           }
8234           function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
8235             var objIsArr = isArray2(object), othIsArr = isArray2(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);
8236             objTag = objTag == argsTag ? objectTag : objTag;
8237             othTag = othTag == argsTag ? objectTag : othTag;
8238             var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
8239             if (isSameTag && isBuffer(object)) {
8240               if (!isBuffer(other)) {
8241                 return false;
8242               }
8243               objIsArr = true;
8244               objIsObj = false;
8245             }
8246             if (isSameTag && !objIsObj) {
8247               stack || (stack = new Stack());
8248               return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
8249             }
8250             if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
8251               var objIsWrapped = objIsObj && hasOwnProperty2.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty2.call(other, "__wrapped__");
8252               if (objIsWrapped || othIsWrapped) {
8253                 var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
8254                 stack || (stack = new Stack());
8255                 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
8256               }
8257             }
8258             if (!isSameTag) {
8259               return false;
8260             }
8261             stack || (stack = new Stack());
8262             return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
8263           }
8264           function baseIsMap(value) {
8265             return isObjectLike2(value) && getTag(value) == mapTag;
8266           }
8267           function baseIsMatch(object, source, matchData, customizer) {
8268             var index = matchData.length, length = index, noCustomizer = !customizer;
8269             if (object == null) {
8270               return !length;
8271             }
8272             object = Object2(object);
8273             while (index--) {
8274               var data = matchData[index];
8275               if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
8276                 return false;
8277               }
8278             }
8279             while (++index < length) {
8280               data = matchData[index];
8281               var key = data[0], objValue = object[key], srcValue = data[1];
8282               if (noCustomizer && data[2]) {
8283                 if (objValue === undefined2 && !(key in object)) {
8284                   return false;
8285                 }
8286               } else {
8287                 var stack = new Stack();
8288                 if (customizer) {
8289                   var result2 = customizer(objValue, srcValue, key, object, source, stack);
8290                 }
8291                 if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) {
8292                   return false;
8293                 }
8294               }
8295             }
8296             return true;
8297           }
8298           function baseIsNative(value) {
8299             if (!isObject3(value) || isMasked(value)) {
8300               return false;
8301             }
8302             var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
8303             return pattern.test(toSource(value));
8304           }
8305           function baseIsRegExp(value) {
8306             return isObjectLike2(value) && baseGetTag2(value) == regexpTag;
8307           }
8308           function baseIsSet(value) {
8309             return isObjectLike2(value) && getTag(value) == setTag;
8310           }
8311           function baseIsTypedArray(value) {
8312             return isObjectLike2(value) && isLength(value.length) && !!typedArrayTags[baseGetTag2(value)];
8313           }
8314           function baseIteratee(value) {
8315             if (typeof value == "function") {
8316               return value;
8317             }
8318             if (value == null) {
8319               return identity4;
8320             }
8321             if (typeof value == "object") {
8322               return isArray2(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
8323             }
8324             return property(value);
8325           }
8326           function baseKeys(object) {
8327             if (!isPrototype(object)) {
8328               return nativeKeys(object);
8329             }
8330             var result2 = [];
8331             for (var key in Object2(object)) {
8332               if (hasOwnProperty2.call(object, key) && key != "constructor") {
8333                 result2.push(key);
8334               }
8335             }
8336             return result2;
8337           }
8338           function baseKeysIn(object) {
8339             if (!isObject3(object)) {
8340               return nativeKeysIn(object);
8341             }
8342             var isProto = isPrototype(object), result2 = [];
8343             for (var key in object) {
8344               if (!(key == "constructor" && (isProto || !hasOwnProperty2.call(object, key)))) {
8345                 result2.push(key);
8346               }
8347             }
8348             return result2;
8349           }
8350           function baseLt(value, other) {
8351             return value < other;
8352           }
8353           function baseMap(collection, iteratee2) {
8354             var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : [];
8355             baseEach(collection, function(value, key, collection2) {
8356               result2[++index] = iteratee2(value, key, collection2);
8357             });
8358             return result2;
8359           }
8360           function baseMatches(source) {
8361             var matchData = getMatchData(source);
8362             if (matchData.length == 1 && matchData[0][2]) {
8363               return matchesStrictComparable(matchData[0][0], matchData[0][1]);
8364             }
8365             return function(object) {
8366               return object === source || baseIsMatch(object, source, matchData);
8367             };
8368           }
8369           function baseMatchesProperty(path, srcValue) {
8370             if (isKey(path) && isStrictComparable(srcValue)) {
8371               return matchesStrictComparable(toKey(path), srcValue);
8372             }
8373             return function(object) {
8374               var objValue = get4(object, path);
8375               return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
8376             };
8377           }
8378           function baseMerge(object, source, srcIndex, customizer, stack) {
8379             if (object === source) {
8380               return;
8381             }
8382             baseFor(source, function(srcValue, key) {
8383               stack || (stack = new Stack());
8384               if (isObject3(srcValue)) {
8385                 baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
8386               } else {
8387                 var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2;
8388                 if (newValue === undefined2) {
8389                   newValue = srcValue;
8390                 }
8391                 assignMergeValue(object, key, newValue);
8392               }
8393             }, keysIn);
8394           }
8395           function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
8396             var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue);
8397             if (stacked) {
8398               assignMergeValue(object, key, stacked);
8399               return;
8400             }
8401             var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2;
8402             var isCommon = newValue === undefined2;
8403             if (isCommon) {
8404               var isArr = isArray2(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue);
8405               newValue = srcValue;
8406               if (isArr || isBuff || isTyped) {
8407                 if (isArray2(objValue)) {
8408                   newValue = objValue;
8409                 } else if (isArrayLikeObject(objValue)) {
8410                   newValue = copyArray(objValue);
8411                 } else if (isBuff) {
8412                   isCommon = false;
8413                   newValue = cloneBuffer(srcValue, true);
8414                 } else if (isTyped) {
8415                   isCommon = false;
8416                   newValue = cloneTypedArray(srcValue, true);
8417                 } else {
8418                   newValue = [];
8419                 }
8420               } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
8421                 newValue = objValue;
8422                 if (isArguments(objValue)) {
8423                   newValue = toPlainObject(objValue);
8424                 } else if (!isObject3(objValue) || isFunction(objValue)) {
8425                   newValue = initCloneObject(srcValue);
8426                 }
8427               } else {
8428                 isCommon = false;
8429               }
8430             }
8431             if (isCommon) {
8432               stack.set(srcValue, newValue);
8433               mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
8434               stack["delete"](srcValue);
8435             }
8436             assignMergeValue(object, key, newValue);
8437           }
8438           function baseNth(array2, n2) {
8439             var length = array2.length;
8440             if (!length) {
8441               return;
8442             }
8443             n2 += n2 < 0 ? length : 0;
8444             return isIndex(n2, length) ? array2[n2] : undefined2;
8445           }
8446           function baseOrderBy(collection, iteratees, orders) {
8447             if (iteratees.length) {
8448               iteratees = arrayMap2(iteratees, function(iteratee2) {
8449                 if (isArray2(iteratee2)) {
8450                   return function(value) {
8451                     return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2);
8452                   };
8453                 }
8454                 return iteratee2;
8455               });
8456             } else {
8457               iteratees = [identity4];
8458             }
8459             var index = -1;
8460             iteratees = arrayMap2(iteratees, baseUnary(getIteratee()));
8461             var result2 = baseMap(collection, function(value, key, collection2) {
8462               var criteria = arrayMap2(iteratees, function(iteratee2) {
8463                 return iteratee2(value);
8464               });
8465               return { "criteria": criteria, "index": ++index, "value": value };
8466             });
8467             return baseSortBy(result2, function(object, other) {
8468               return compareMultiple(object, other, orders);
8469             });
8470           }
8471           function basePick(object, paths) {
8472             return basePickBy(object, paths, function(value, path) {
8473               return hasIn(object, path);
8474             });
8475           }
8476           function basePickBy(object, paths, predicate) {
8477             var index = -1, length = paths.length, result2 = {};
8478             while (++index < length) {
8479               var path = paths[index], value = baseGet(object, path);
8480               if (predicate(value, path)) {
8481                 baseSet(result2, castPath(path, object), value);
8482               }
8483             }
8484             return result2;
8485           }
8486           function basePropertyDeep(path) {
8487             return function(object) {
8488               return baseGet(object, path);
8489             };
8490           }
8491           function basePullAll(array2, values2, iteratee2, comparator) {
8492             var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array2;
8493             if (array2 === values2) {
8494               values2 = copyArray(values2);
8495             }
8496             if (iteratee2) {
8497               seen = arrayMap2(array2, baseUnary(iteratee2));
8498             }
8499             while (++index < length) {
8500               var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value;
8501               while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) {
8502                 if (seen !== array2) {
8503                   splice.call(seen, fromIndex, 1);
8504                 }
8505                 splice.call(array2, fromIndex, 1);
8506               }
8507             }
8508             return array2;
8509           }
8510           function basePullAt(array2, indexes) {
8511             var length = array2 ? indexes.length : 0, lastIndex = length - 1;
8512             while (length--) {
8513               var index = indexes[length];
8514               if (length == lastIndex || index !== previous) {
8515                 var previous = index;
8516                 if (isIndex(index)) {
8517                   splice.call(array2, index, 1);
8518                 } else {
8519                   baseUnset(array2, index);
8520                 }
8521               }
8522             }
8523             return array2;
8524           }
8525           function baseRandom(lower2, upper) {
8526             return lower2 + nativeFloor(nativeRandom() * (upper - lower2 + 1));
8527           }
8528           function baseRange(start2, end, step, fromRight) {
8529             var index = -1, length = nativeMax2(nativeCeil((end - start2) / (step || 1)), 0), result2 = Array2(length);
8530             while (length--) {
8531               result2[fromRight ? length : ++index] = start2;
8532               start2 += step;
8533             }
8534             return result2;
8535           }
8536           function baseRepeat(string, n2) {
8537             var result2 = "";
8538             if (!string || n2 < 1 || n2 > MAX_SAFE_INTEGER) {
8539               return result2;
8540             }
8541             do {
8542               if (n2 % 2) {
8543                 result2 += string;
8544               }
8545               n2 = nativeFloor(n2 / 2);
8546               if (n2) {
8547                 string += string;
8548               }
8549             } while (n2);
8550             return result2;
8551           }
8552           function baseRest(func, start2) {
8553             return setToString(overRest(func, start2, identity4), func + "");
8554           }
8555           function baseSample(collection) {
8556             return arraySample(values(collection));
8557           }
8558           function baseSampleSize(collection, n2) {
8559             var array2 = values(collection);
8560             return shuffleSelf(array2, baseClamp(n2, 0, array2.length));
8561           }
8562           function baseSet(object, path, value, customizer) {
8563             if (!isObject3(object)) {
8564               return object;
8565             }
8566             path = castPath(path, object);
8567             var index = -1, length = path.length, lastIndex = length - 1, nested = object;
8568             while (nested != null && ++index < length) {
8569               var key = toKey(path[index]), newValue = value;
8570               if (key === "__proto__" || key === "constructor" || key === "prototype") {
8571                 return object;
8572               }
8573               if (index != lastIndex) {
8574                 var objValue = nested[key];
8575                 newValue = customizer ? customizer(objValue, key, nested) : undefined2;
8576                 if (newValue === undefined2) {
8577                   newValue = isObject3(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
8578                 }
8579               }
8580               assignValue(nested, key, newValue);
8581               nested = nested[key];
8582             }
8583             return object;
8584           }
8585           var baseSetData = !metaMap ? identity4 : function(func, data) {
8586             metaMap.set(func, data);
8587             return func;
8588           };
8589           var baseSetToString = !defineProperty ? identity4 : function(func, string) {
8590             return defineProperty(func, "toString", {
8591               "configurable": true,
8592               "enumerable": false,
8593               "value": constant(string),
8594               "writable": true
8595             });
8596           };
8597           function baseShuffle(collection) {
8598             return shuffleSelf(values(collection));
8599           }
8600           function baseSlice(array2, start2, end) {
8601             var index = -1, length = array2.length;
8602             if (start2 < 0) {
8603               start2 = -start2 > length ? 0 : length + start2;
8604             }
8605             end = end > length ? length : end;
8606             if (end < 0) {
8607               end += length;
8608             }
8609             length = start2 > end ? 0 : end - start2 >>> 0;
8610             start2 >>>= 0;
8611             var result2 = Array2(length);
8612             while (++index < length) {
8613               result2[index] = array2[index + start2];
8614             }
8615             return result2;
8616           }
8617           function baseSome(collection, predicate) {
8618             var result2;
8619             baseEach(collection, function(value, index, collection2) {
8620               result2 = predicate(value, index, collection2);
8621               return !result2;
8622             });
8623             return !!result2;
8624           }
8625           function baseSortedIndex(array2, value, retHighest) {
8626             var low = 0, high = array2 == null ? low : array2.length;
8627             if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
8628               while (low < high) {
8629                 var mid = low + high >>> 1, computed = array2[mid];
8630                 if (computed !== null && !isSymbol2(computed) && (retHighest ? computed <= value : computed < value)) {
8631                   low = mid + 1;
8632                 } else {
8633                   high = mid;
8634                 }
8635               }
8636               return high;
8637             }
8638             return baseSortedIndexBy(array2, value, identity4, retHighest);
8639           }
8640           function baseSortedIndexBy(array2, value, iteratee2, retHighest) {
8641             var low = 0, high = array2 == null ? 0 : array2.length;
8642             if (high === 0) {
8643               return 0;
8644             }
8645             value = iteratee2(value);
8646             var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol2(value), valIsUndefined = value === undefined2;
8647             while (low < high) {
8648               var mid = nativeFloor((low + high) / 2), computed = iteratee2(array2[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol2(computed);
8649               if (valIsNaN) {
8650                 var setLow = retHighest || othIsReflexive;
8651               } else if (valIsUndefined) {
8652                 setLow = othIsReflexive && (retHighest || othIsDefined);
8653               } else if (valIsNull) {
8654                 setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
8655               } else if (valIsSymbol) {
8656                 setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
8657               } else if (othIsNull || othIsSymbol) {
8658                 setLow = false;
8659               } else {
8660                 setLow = retHighest ? computed <= value : computed < value;
8661               }
8662               if (setLow) {
8663                 low = mid + 1;
8664               } else {
8665                 high = mid;
8666               }
8667             }
8668             return nativeMin2(high, MAX_ARRAY_INDEX);
8669           }
8670           function baseSortedUniq(array2, iteratee2) {
8671             var index = -1, length = array2.length, resIndex = 0, result2 = [];
8672             while (++index < length) {
8673               var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
8674               if (!index || !eq(computed, seen)) {
8675                 var seen = computed;
8676                 result2[resIndex++] = value === 0 ? 0 : value;
8677               }
8678             }
8679             return result2;
8680           }
8681           function baseToNumber(value) {
8682             if (typeof value == "number") {
8683               return value;
8684             }
8685             if (isSymbol2(value)) {
8686               return NAN2;
8687             }
8688             return +value;
8689           }
8690           function baseToString2(value) {
8691             if (typeof value == "string") {
8692               return value;
8693             }
8694             if (isArray2(value)) {
8695               return arrayMap2(value, baseToString2) + "";
8696             }
8697             if (isSymbol2(value)) {
8698               return symbolToString2 ? symbolToString2.call(value) : "";
8699             }
8700             var result2 = value + "";
8701             return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2;
8702           }
8703           function baseUniq(array2, iteratee2, comparator) {
8704             var index = -1, includes2 = arrayIncludes, length = array2.length, isCommon = true, result2 = [], seen = result2;
8705             if (comparator) {
8706               isCommon = false;
8707               includes2 = arrayIncludesWith;
8708             } else if (length >= LARGE_ARRAY_SIZE) {
8709               var set4 = iteratee2 ? null : createSet(array2);
8710               if (set4) {
8711                 return setToArray(set4);
8712               }
8713               isCommon = false;
8714               includes2 = cacheHas;
8715               seen = new SetCache();
8716             } else {
8717               seen = iteratee2 ? [] : result2;
8718             }
8719             outer:
8720               while (++index < length) {
8721                 var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
8722                 value = comparator || value !== 0 ? value : 0;
8723                 if (isCommon && computed === computed) {
8724                   var seenIndex = seen.length;
8725                   while (seenIndex--) {
8726                     if (seen[seenIndex] === computed) {
8727                       continue outer;
8728                     }
8729                   }
8730                   if (iteratee2) {
8731                     seen.push(computed);
8732                   }
8733                   result2.push(value);
8734                 } else if (!includes2(seen, computed, comparator)) {
8735                   if (seen !== result2) {
8736                     seen.push(computed);
8737                   }
8738                   result2.push(value);
8739                 }
8740               }
8741             return result2;
8742           }
8743           function baseUnset(object, path) {
8744             path = castPath(path, object);
8745             object = parent(object, path);
8746             return object == null || delete object[toKey(last(path))];
8747           }
8748           function baseUpdate(object, path, updater, customizer) {
8749             return baseSet(object, path, updater(baseGet(object, path)), customizer);
8750           }
8751           function baseWhile(array2, predicate, isDrop, fromRight) {
8752             var length = array2.length, index = fromRight ? length : -1;
8753             while ((fromRight ? index-- : ++index < length) && predicate(array2[index], index, array2)) {
8754             }
8755             return isDrop ? baseSlice(array2, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array2, fromRight ? index + 1 : 0, fromRight ? length : index);
8756           }
8757           function baseWrapperValue(value, actions) {
8758             var result2 = value;
8759             if (result2 instanceof LazyWrapper) {
8760               result2 = result2.value();
8761             }
8762             return arrayReduce(actions, function(result3, action) {
8763               return action.func.apply(action.thisArg, arrayPush([result3], action.args));
8764             }, result2);
8765           }
8766           function baseXor(arrays, iteratee2, comparator) {
8767             var length = arrays.length;
8768             if (length < 2) {
8769               return length ? baseUniq(arrays[0]) : [];
8770             }
8771             var index = -1, result2 = Array2(length);
8772             while (++index < length) {
8773               var array2 = arrays[index], othIndex = -1;
8774               while (++othIndex < length) {
8775                 if (othIndex != index) {
8776                   result2[index] = baseDifference(result2[index] || array2, arrays[othIndex], iteratee2, comparator);
8777                 }
8778               }
8779             }
8780             return baseUniq(baseFlatten(result2, 1), iteratee2, comparator);
8781           }
8782           function baseZipObject(props, values2, assignFunc) {
8783             var index = -1, length = props.length, valsLength = values2.length, result2 = {};
8784             while (++index < length) {
8785               var value = index < valsLength ? values2[index] : undefined2;
8786               assignFunc(result2, props[index], value);
8787             }
8788             return result2;
8789           }
8790           function castArrayLikeObject(value) {
8791             return isArrayLikeObject(value) ? value : [];
8792           }
8793           function castFunction(value) {
8794             return typeof value == "function" ? value : identity4;
8795           }
8796           function castPath(value, object) {
8797             if (isArray2(value)) {
8798               return value;
8799             }
8800             return isKey(value, object) ? [value] : stringToPath(toString2(value));
8801           }
8802           var castRest = baseRest;
8803           function castSlice(array2, start2, end) {
8804             var length = array2.length;
8805             end = end === undefined2 ? length : end;
8806             return !start2 && end >= length ? array2 : baseSlice(array2, start2, end);
8807           }
8808           var clearTimeout2 = ctxClearTimeout || function(id2) {
8809             return root3.clearTimeout(id2);
8810           };
8811           function cloneBuffer(buffer, isDeep) {
8812             if (isDeep) {
8813               return buffer.slice();
8814             }
8815             var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
8816             buffer.copy(result2);
8817             return result2;
8818           }
8819           function cloneArrayBuffer(arrayBuffer) {
8820             var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength);
8821             new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer));
8822             return result2;
8823           }
8824           function cloneDataView(dataView, isDeep) {
8825             var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
8826             return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
8827           }
8828           function cloneRegExp(regexp) {
8829             var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp));
8830             result2.lastIndex = regexp.lastIndex;
8831             return result2;
8832           }
8833           function cloneSymbol(symbol) {
8834             return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {};
8835           }
8836           function cloneTypedArray(typedArray, isDeep) {
8837             var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
8838             return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
8839           }
8840           function compareAscending(value, other) {
8841             if (value !== other) {
8842               var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol2(value);
8843               var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol2(other);
8844               if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
8845                 return 1;
8846               }
8847               if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
8848                 return -1;
8849               }
8850             }
8851             return 0;
8852           }
8853           function compareMultiple(object, other, orders) {
8854             var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
8855             while (++index < length) {
8856               var result2 = compareAscending(objCriteria[index], othCriteria[index]);
8857               if (result2) {
8858                 if (index >= ordersLength) {
8859                   return result2;
8860                 }
8861                 var order = orders[index];
8862                 return result2 * (order == "desc" ? -1 : 1);
8863               }
8864             }
8865             return object.index - other.index;
8866           }
8867           function composeArgs(args, partials, holders, isCurried) {
8868             var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax2(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried;
8869             while (++leftIndex < leftLength) {
8870               result2[leftIndex] = partials[leftIndex];
8871             }
8872             while (++argsIndex < holdersLength) {
8873               if (isUncurried || argsIndex < argsLength) {
8874                 result2[holders[argsIndex]] = args[argsIndex];
8875               }
8876             }
8877             while (rangeLength--) {
8878               result2[leftIndex++] = args[argsIndex++];
8879             }
8880             return result2;
8881           }
8882           function composeArgsRight(args, partials, holders, isCurried) {
8883             var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax2(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried;
8884             while (++argsIndex < rangeLength) {
8885               result2[argsIndex] = args[argsIndex];
8886             }
8887             var offset = argsIndex;
8888             while (++rightIndex < rightLength) {
8889               result2[offset + rightIndex] = partials[rightIndex];
8890             }
8891             while (++holdersIndex < holdersLength) {
8892               if (isUncurried || argsIndex < argsLength) {
8893                 result2[offset + holders[holdersIndex]] = args[argsIndex++];
8894               }
8895             }
8896             return result2;
8897           }
8898           function copyArray(source, array2) {
8899             var index = -1, length = source.length;
8900             array2 || (array2 = Array2(length));
8901             while (++index < length) {
8902               array2[index] = source[index];
8903             }
8904             return array2;
8905           }
8906           function copyObject(source, props, object, customizer) {
8907             var isNew = !object;
8908             object || (object = {});
8909             var index = -1, length = props.length;
8910             while (++index < length) {
8911               var key = props[index];
8912               var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined2;
8913               if (newValue === undefined2) {
8914                 newValue = source[key];
8915               }
8916               if (isNew) {
8917                 baseAssignValue(object, key, newValue);
8918               } else {
8919                 assignValue(object, key, newValue);
8920               }
8921             }
8922             return object;
8923           }
8924           function copySymbols(source, object) {
8925             return copyObject(source, getSymbols(source), object);
8926           }
8927           function copySymbolsIn(source, object) {
8928             return copyObject(source, getSymbolsIn(source), object);
8929           }
8930           function createAggregator(setter, initializer) {
8931             return function(collection, iteratee2) {
8932               var func = isArray2(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {};
8933               return func(collection, setter, getIteratee(iteratee2, 2), accumulator);
8934             };
8935           }
8936           function createAssigner(assigner) {
8937             return baseRest(function(object, sources) {
8938               var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2;
8939               customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2;
8940               if (guard && isIterateeCall(sources[0], sources[1], guard)) {
8941                 customizer = length < 3 ? undefined2 : customizer;
8942                 length = 1;
8943               }
8944               object = Object2(object);
8945               while (++index < length) {
8946                 var source = sources[index];
8947                 if (source) {
8948                   assigner(object, source, index, customizer);
8949                 }
8950               }
8951               return object;
8952             });
8953           }
8954           function createBaseEach(eachFunc, fromRight) {
8955             return function(collection, iteratee2) {
8956               if (collection == null) {
8957                 return collection;
8958               }
8959               if (!isArrayLike(collection)) {
8960                 return eachFunc(collection, iteratee2);
8961               }
8962               var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection);
8963               while (fromRight ? index-- : ++index < length) {
8964                 if (iteratee2(iterable[index], index, iterable) === false) {
8965                   break;
8966                 }
8967               }
8968               return collection;
8969             };
8970           }
8971           function createBaseFor(fromRight) {
8972             return function(object, iteratee2, keysFunc) {
8973               var index = -1, iterable = Object2(object), props = keysFunc(object), length = props.length;
8974               while (length--) {
8975                 var key = props[fromRight ? length : ++index];
8976                 if (iteratee2(iterable[key], key, iterable) === false) {
8977                   break;
8978                 }
8979               }
8980               return object;
8981             };
8982           }
8983           function createBind(func, bitmask, thisArg) {
8984             var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
8985             function wrapper() {
8986               var fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
8987               return fn.apply(isBind ? thisArg : this, arguments);
8988             }
8989             return wrapper;
8990           }
8991           function createCaseFirst(methodName) {
8992             return function(string) {
8993               string = toString2(string);
8994               var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2;
8995               var chr = strSymbols ? strSymbols[0] : string.charAt(0);
8996               var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1);
8997               return chr[methodName]() + trailing;
8998             };
8999           }
9000           function createCompounder(callback) {
9001             return function(string) {
9002               return arrayReduce(words(deburr(string).replace(reApos, "")), callback, "");
9003             };
9004           }
9005           function createCtor(Ctor) {
9006             return function() {
9007               var args = arguments;
9008               switch (args.length) {
9009                 case 0:
9010                   return new Ctor();
9011                 case 1:
9012                   return new Ctor(args[0]);
9013                 case 2:
9014                   return new Ctor(args[0], args[1]);
9015                 case 3:
9016                   return new Ctor(args[0], args[1], args[2]);
9017                 case 4:
9018                   return new Ctor(args[0], args[1], args[2], args[3]);
9019                 case 5:
9020                   return new Ctor(args[0], args[1], args[2], args[3], args[4]);
9021                 case 6:
9022                   return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
9023                 case 7:
9024                   return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
9025               }
9026               var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args);
9027               return isObject3(result2) ? result2 : thisBinding;
9028             };
9029           }
9030           function createCurry(func, bitmask, arity) {
9031             var Ctor = createCtor(func);
9032             function wrapper() {
9033               var length = arguments.length, args = Array2(length), index = length, placeholder = getHolder(wrapper);
9034               while (index--) {
9035                 args[index] = arguments[index];
9036               }
9037               var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);
9038               length -= holders.length;
9039               if (length < arity) {
9040                 return createRecurry(
9041                   func,
9042                   bitmask,
9043                   createHybrid,
9044                   wrapper.placeholder,
9045                   undefined2,
9046                   args,
9047                   holders,
9048                   undefined2,
9049                   undefined2,
9050                   arity - length
9051                 );
9052               }
9053               var fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
9054               return apply(fn, this, args);
9055             }
9056             return wrapper;
9057           }
9058           function createFind(findIndexFunc) {
9059             return function(collection, predicate, fromIndex) {
9060               var iterable = Object2(collection);
9061               if (!isArrayLike(collection)) {
9062                 var iteratee2 = getIteratee(predicate, 3);
9063                 collection = keys(collection);
9064                 predicate = function(key) {
9065                   return iteratee2(iterable[key], key, iterable);
9066                 };
9067               }
9068               var index = findIndexFunc(collection, predicate, fromIndex);
9069               return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2;
9070             };
9071           }
9072           function createFlow(fromRight) {
9073             return flatRest(function(funcs) {
9074               var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru;
9075               if (fromRight) {
9076                 funcs.reverse();
9077               }
9078               while (index--) {
9079                 var func = funcs[index];
9080                 if (typeof func != "function") {
9081                   throw new TypeError2(FUNC_ERROR_TEXT3);
9082                 }
9083                 if (prereq && !wrapper && getFuncName(func) == "wrapper") {
9084                   var wrapper = new LodashWrapper([], true);
9085                 }
9086               }
9087               index = wrapper ? index : length;
9088               while (++index < length) {
9089                 func = funcs[index];
9090                 var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2;
9091                 if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) {
9092                   wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
9093                 } else {
9094                   wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
9095                 }
9096               }
9097               return function() {
9098                 var args = arguments, value = args[0];
9099                 if (wrapper && args.length == 1 && isArray2(value)) {
9100                   return wrapper.plant(value).value();
9101                 }
9102                 var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value;
9103                 while (++index2 < length) {
9104                   result2 = funcs[index2].call(this, result2);
9105                 }
9106                 return result2;
9107               };
9108             });
9109           }
9110           function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) {
9111             var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func);
9112             function wrapper() {
9113               var length = arguments.length, args = Array2(length), index = length;
9114               while (index--) {
9115                 args[index] = arguments[index];
9116               }
9117               if (isCurried) {
9118                 var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder);
9119               }
9120               if (partials) {
9121                 args = composeArgs(args, partials, holders, isCurried);
9122               }
9123               if (partialsRight) {
9124                 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
9125               }
9126               length -= holdersCount;
9127               if (isCurried && length < arity) {
9128                 var newHolders = replaceHolders(args, placeholder);
9129                 return createRecurry(
9130                   func,
9131                   bitmask,
9132                   createHybrid,
9133                   wrapper.placeholder,
9134                   thisArg,
9135                   args,
9136                   newHolders,
9137                   argPos,
9138                   ary2,
9139                   arity - length
9140                 );
9141               }
9142               var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func;
9143               length = args.length;
9144               if (argPos) {
9145                 args = reorder(args, argPos);
9146               } else if (isFlip && length > 1) {
9147                 args.reverse();
9148               }
9149               if (isAry && ary2 < length) {
9150                 args.length = ary2;
9151               }
9152               if (this && this !== root3 && this instanceof wrapper) {
9153                 fn = Ctor || createCtor(fn);
9154               }
9155               return fn.apply(thisBinding, args);
9156             }
9157             return wrapper;
9158           }
9159           function createInverter(setter, toIteratee) {
9160             return function(object, iteratee2) {
9161               return baseInverter(object, setter, toIteratee(iteratee2), {});
9162             };
9163           }
9164           function createMathOperation(operator, defaultValue) {
9165             return function(value, other) {
9166               var result2;
9167               if (value === undefined2 && other === undefined2) {
9168                 return defaultValue;
9169               }
9170               if (value !== undefined2) {
9171                 result2 = value;
9172               }
9173               if (other !== undefined2) {
9174                 if (result2 === undefined2) {
9175                   return other;
9176                 }
9177                 if (typeof value == "string" || typeof other == "string") {
9178                   value = baseToString2(value);
9179                   other = baseToString2(other);
9180                 } else {
9181                   value = baseToNumber(value);
9182                   other = baseToNumber(other);
9183                 }
9184                 result2 = operator(value, other);
9185               }
9186               return result2;
9187             };
9188           }
9189           function createOver(arrayFunc) {
9190             return flatRest(function(iteratees) {
9191               iteratees = arrayMap2(iteratees, baseUnary(getIteratee()));
9192               return baseRest(function(args) {
9193                 var thisArg = this;
9194                 return arrayFunc(iteratees, function(iteratee2) {
9195                   return apply(iteratee2, thisArg, args);
9196                 });
9197               });
9198             });
9199           }
9200           function createPadding(length, chars) {
9201             chars = chars === undefined2 ? " " : baseToString2(chars);
9202             var charsLength = chars.length;
9203             if (charsLength < 2) {
9204               return charsLength ? baseRepeat(chars, length) : chars;
9205             }
9206             var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
9207             return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length);
9208           }
9209           function createPartial(func, bitmask, thisArg, partials) {
9210             var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
9211             function wrapper() {
9212               var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
9213               while (++leftIndex < leftLength) {
9214                 args[leftIndex] = partials[leftIndex];
9215               }
9216               while (argsLength--) {
9217                 args[leftIndex++] = arguments[++argsIndex];
9218               }
9219               return apply(fn, isBind ? thisArg : this, args);
9220             }
9221             return wrapper;
9222           }
9223           function createRange(fromRight) {
9224             return function(start2, end, step) {
9225               if (step && typeof step != "number" && isIterateeCall(start2, end, step)) {
9226                 end = step = undefined2;
9227               }
9228               start2 = toFinite(start2);
9229               if (end === undefined2) {
9230                 end = start2;
9231                 start2 = 0;
9232               } else {
9233                 end = toFinite(end);
9234               }
9235               step = step === undefined2 ? start2 < end ? 1 : -1 : toFinite(step);
9236               return baseRange(start2, end, step, fromRight);
9237             };
9238           }
9239           function createRelationalOperation(operator) {
9240             return function(value, other) {
9241               if (!(typeof value == "string" && typeof other == "string")) {
9242                 value = toNumber2(value);
9243                 other = toNumber2(other);
9244               }
9245               return operator(value, other);
9246             };
9247           }
9248           function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) {
9249             var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials;
9250             bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
9251             bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
9252             if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
9253               bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
9254             }
9255             var newData = [
9256               func,
9257               bitmask,
9258               thisArg,
9259               newPartials,
9260               newHolders,
9261               newPartialsRight,
9262               newHoldersRight,
9263               argPos,
9264               ary2,
9265               arity
9266             ];
9267             var result2 = wrapFunc.apply(undefined2, newData);
9268             if (isLaziable(func)) {
9269               setData(result2, newData);
9270             }
9271             result2.placeholder = placeholder;
9272             return setWrapToString(result2, func, bitmask);
9273           }
9274           function createRound(methodName) {
9275             var func = Math2[methodName];
9276             return function(number3, precision2) {
9277               number3 = toNumber2(number3);
9278               precision2 = precision2 == null ? 0 : nativeMin2(toInteger(precision2), 292);
9279               if (precision2 && nativeIsFinite(number3)) {
9280                 var pair2 = (toString2(number3) + "e").split("e"), value = func(pair2[0] + "e" + (+pair2[1] + precision2));
9281                 pair2 = (toString2(value) + "e").split("e");
9282                 return +(pair2[0] + "e" + (+pair2[1] - precision2));
9283               }
9284               return func(number3);
9285             };
9286           }
9287           var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY2) ? noop3 : function(values2) {
9288             return new Set2(values2);
9289           };
9290           function createToPairs(keysFunc) {
9291             return function(object) {
9292               var tag = getTag(object);
9293               if (tag == mapTag) {
9294                 return mapToArray(object);
9295               }
9296               if (tag == setTag) {
9297                 return setToPairs(object);
9298               }
9299               return baseToPairs(object, keysFunc(object));
9300             };
9301           }
9302           function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) {
9303             var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
9304             if (!isBindKey && typeof func != "function") {
9305               throw new TypeError2(FUNC_ERROR_TEXT3);
9306             }
9307             var length = partials ? partials.length : 0;
9308             if (!length) {
9309               bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
9310               partials = holders = undefined2;
9311             }
9312             ary2 = ary2 === undefined2 ? ary2 : nativeMax2(toInteger(ary2), 0);
9313             arity = arity === undefined2 ? arity : toInteger(arity);
9314             length -= holders ? holders.length : 0;
9315             if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
9316               var partialsRight = partials, holdersRight = holders;
9317               partials = holders = undefined2;
9318             }
9319             var data = isBindKey ? undefined2 : getData(func);
9320             var newData = [
9321               func,
9322               bitmask,
9323               thisArg,
9324               partials,
9325               holders,
9326               partialsRight,
9327               holdersRight,
9328               argPos,
9329               ary2,
9330               arity
9331             ];
9332             if (data) {
9333               mergeData(newData, data);
9334             }
9335             func = newData[0];
9336             bitmask = newData[1];
9337             thisArg = newData[2];
9338             partials = newData[3];
9339             holders = newData[4];
9340             arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax2(newData[9] - length, 0);
9341             if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
9342               bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
9343             }
9344             if (!bitmask || bitmask == WRAP_BIND_FLAG) {
9345               var result2 = createBind(func, bitmask, thisArg);
9346             } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
9347               result2 = createCurry(func, bitmask, arity);
9348             } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
9349               result2 = createPartial(func, bitmask, thisArg, partials);
9350             } else {
9351               result2 = createHybrid.apply(undefined2, newData);
9352             }
9353             var setter = data ? baseSetData : setData;
9354             return setWrapToString(setter(result2, newData), func, bitmask);
9355           }
9356           function customDefaultsAssignIn(objValue, srcValue, key, object) {
9357             if (objValue === undefined2 || eq(objValue, objectProto3[key]) && !hasOwnProperty2.call(object, key)) {
9358               return srcValue;
9359             }
9360             return objValue;
9361           }
9362           function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
9363             if (isObject3(objValue) && isObject3(srcValue)) {
9364               stack.set(srcValue, objValue);
9365               baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack);
9366               stack["delete"](srcValue);
9367             }
9368             return objValue;
9369           }
9370           function customOmitClone(value) {
9371             return isPlainObject(value) ? undefined2 : value;
9372           }
9373           function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) {
9374             var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array2.length, othLength = other.length;
9375             if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
9376               return false;
9377             }
9378             var arrStacked = stack.get(array2);
9379             var othStacked = stack.get(other);
9380             if (arrStacked && othStacked) {
9381               return arrStacked == other && othStacked == array2;
9382             }
9383             var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2;
9384             stack.set(array2, other);
9385             stack.set(other, array2);
9386             while (++index < arrLength) {
9387               var arrValue = array2[index], othValue = other[index];
9388               if (customizer) {
9389                 var compared = isPartial ? customizer(othValue, arrValue, index, other, array2, stack) : customizer(arrValue, othValue, index, array2, other, stack);
9390               }
9391               if (compared !== undefined2) {
9392                 if (compared) {
9393                   continue;
9394                 }
9395                 result2 = false;
9396                 break;
9397               }
9398               if (seen) {
9399                 if (!arraySome(other, function(othValue2, othIndex) {
9400                   if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
9401                     return seen.push(othIndex);
9402                   }
9403                 })) {
9404                   result2 = false;
9405                   break;
9406                 }
9407               } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
9408                 result2 = false;
9409                 break;
9410               }
9411             }
9412             stack["delete"](array2);
9413             stack["delete"](other);
9414             return result2;
9415           }
9416           function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
9417             switch (tag) {
9418               case dataViewTag:
9419                 if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
9420                   return false;
9421                 }
9422                 object = object.buffer;
9423                 other = other.buffer;
9424               case arrayBufferTag:
9425                 if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) {
9426                   return false;
9427                 }
9428                 return true;
9429               case boolTag:
9430               case dateTag:
9431               case numberTag:
9432                 return eq(+object, +other);
9433               case errorTag:
9434                 return object.name == other.name && object.message == other.message;
9435               case regexpTag:
9436               case stringTag:
9437                 return object == other + "";
9438               case mapTag:
9439                 var convert = mapToArray;
9440               case setTag:
9441                 var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
9442                 convert || (convert = setToArray);
9443                 if (object.size != other.size && !isPartial) {
9444                   return false;
9445                 }
9446                 var stacked = stack.get(object);
9447                 if (stacked) {
9448                   return stacked == other;
9449                 }
9450                 bitmask |= COMPARE_UNORDERED_FLAG;
9451                 stack.set(object, other);
9452                 var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
9453                 stack["delete"](object);
9454                 return result2;
9455               case symbolTag2:
9456                 if (symbolValueOf) {
9457                   return symbolValueOf.call(object) == symbolValueOf.call(other);
9458                 }
9459             }
9460             return false;
9461           }
9462           function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
9463             var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
9464             if (objLength != othLength && !isPartial) {
9465               return false;
9466             }
9467             var index = objLength;
9468             while (index--) {
9469               var key = objProps[index];
9470               if (!(isPartial ? key in other : hasOwnProperty2.call(other, key))) {
9471                 return false;
9472               }
9473             }
9474             var objStacked = stack.get(object);
9475             var othStacked = stack.get(other);
9476             if (objStacked && othStacked) {
9477               return objStacked == other && othStacked == object;
9478             }
9479             var result2 = true;
9480             stack.set(object, other);
9481             stack.set(other, object);
9482             var skipCtor = isPartial;
9483             while (++index < objLength) {
9484               key = objProps[index];
9485               var objValue = object[key], othValue = other[key];
9486               if (customizer) {
9487                 var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
9488               }
9489               if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
9490                 result2 = false;
9491                 break;
9492               }
9493               skipCtor || (skipCtor = key == "constructor");
9494             }
9495             if (result2 && !skipCtor) {
9496               var objCtor = object.constructor, othCtor = other.constructor;
9497               if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
9498                 result2 = false;
9499               }
9500             }
9501             stack["delete"](object);
9502             stack["delete"](other);
9503             return result2;
9504           }
9505           function flatRest(func) {
9506             return setToString(overRest(func, undefined2, flatten2), func + "");
9507           }
9508           function getAllKeys(object) {
9509             return baseGetAllKeys(object, keys, getSymbols);
9510           }
9511           function getAllKeysIn(object) {
9512             return baseGetAllKeys(object, keysIn, getSymbolsIn);
9513           }
9514           var getData = !metaMap ? noop3 : function(func) {
9515             return metaMap.get(func);
9516           };
9517           function getFuncName(func) {
9518             var result2 = func.name + "", array2 = realNames[result2], length = hasOwnProperty2.call(realNames, result2) ? array2.length : 0;
9519             while (length--) {
9520               var data = array2[length], otherFunc = data.func;
9521               if (otherFunc == null || otherFunc == func) {
9522                 return data.name;
9523               }
9524             }
9525             return result2;
9526           }
9527           function getHolder(func) {
9528             var object = hasOwnProperty2.call(lodash, "placeholder") ? lodash : func;
9529             return object.placeholder;
9530           }
9531           function getIteratee() {
9532             var result2 = lodash.iteratee || iteratee;
9533             result2 = result2 === iteratee ? baseIteratee : result2;
9534             return arguments.length ? result2(arguments[0], arguments[1]) : result2;
9535           }
9536           function getMapData(map3, key) {
9537             var data = map3.__data__;
9538             return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
9539           }
9540           function getMatchData(object) {
9541             var result2 = keys(object), length = result2.length;
9542             while (length--) {
9543               var key = result2[length], value = object[key];
9544               result2[length] = [key, value, isStrictComparable(value)];
9545             }
9546             return result2;
9547           }
9548           function getNative(object, key) {
9549             var value = getValue(object, key);
9550             return baseIsNative(value) ? value : undefined2;
9551           }
9552           function getRawTag2(value) {
9553             var isOwn = hasOwnProperty2.call(value, symToStringTag3), tag = value[symToStringTag3];
9554             try {
9555               value[symToStringTag3] = undefined2;
9556               var unmasked = true;
9557             } catch (e) {
9558             }
9559             var result2 = nativeObjectToString3.call(value);
9560             if (unmasked) {
9561               if (isOwn) {
9562                 value[symToStringTag3] = tag;
9563               } else {
9564                 delete value[symToStringTag3];
9565               }
9566             }
9567             return result2;
9568           }
9569           var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
9570             if (object == null) {
9571               return [];
9572             }
9573             object = Object2(object);
9574             return arrayFilter(nativeGetSymbols(object), function(symbol) {
9575               return propertyIsEnumerable.call(object, symbol);
9576             });
9577           };
9578           var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
9579             var result2 = [];
9580             while (object) {
9581               arrayPush(result2, getSymbols(object));
9582               object = getPrototype(object);
9583             }
9584             return result2;
9585           };
9586           var getTag = baseGetTag2;
9587           if (DataView2 && getTag(new DataView2(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {
9588             getTag = function(value) {
9589               var result2 = baseGetTag2(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : "";
9590               if (ctorString) {
9591                 switch (ctorString) {
9592                   case dataViewCtorString:
9593                     return dataViewTag;
9594                   case mapCtorString:
9595                     return mapTag;
9596                   case promiseCtorString:
9597                     return promiseTag;
9598                   case setCtorString:
9599                     return setTag;
9600                   case weakMapCtorString:
9601                     return weakMapTag;
9602                 }
9603               }
9604               return result2;
9605             };
9606           }
9607           function getView(start2, end, transforms) {
9608             var index = -1, length = transforms.length;
9609             while (++index < length) {
9610               var data = transforms[index], size2 = data.size;
9611               switch (data.type) {
9612                 case "drop":
9613                   start2 += size2;
9614                   break;
9615                 case "dropRight":
9616                   end -= size2;
9617                   break;
9618                 case "take":
9619                   end = nativeMin2(end, start2 + size2);
9620                   break;
9621                 case "takeRight":
9622                   start2 = nativeMax2(start2, end - size2);
9623                   break;
9624               }
9625             }
9626             return { "start": start2, "end": end };
9627           }
9628           function getWrapDetails(source) {
9629             var match = source.match(reWrapDetails);
9630             return match ? match[1].split(reSplitDetails) : [];
9631           }
9632           function hasPath(object, path, hasFunc) {
9633             path = castPath(path, object);
9634             var index = -1, length = path.length, result2 = false;
9635             while (++index < length) {
9636               var key = toKey(path[index]);
9637               if (!(result2 = object != null && hasFunc(object, key))) {
9638                 break;
9639               }
9640               object = object[key];
9641             }
9642             if (result2 || ++index != length) {
9643               return result2;
9644             }
9645             length = object == null ? 0 : object.length;
9646             return !!length && isLength(length) && isIndex(key, length) && (isArray2(object) || isArguments(object));
9647           }
9648           function initCloneArray(array2) {
9649             var length = array2.length, result2 = new array2.constructor(length);
9650             if (length && typeof array2[0] == "string" && hasOwnProperty2.call(array2, "index")) {
9651               result2.index = array2.index;
9652               result2.input = array2.input;
9653             }
9654             return result2;
9655           }
9656           function initCloneObject(object) {
9657             return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
9658           }
9659           function initCloneByTag(object, tag, isDeep) {
9660             var Ctor = object.constructor;
9661             switch (tag) {
9662               case arrayBufferTag:
9663                 return cloneArrayBuffer(object);
9664               case boolTag:
9665               case dateTag:
9666                 return new Ctor(+object);
9667               case dataViewTag:
9668                 return cloneDataView(object, isDeep);
9669               case float32Tag:
9670               case float64Tag:
9671               case int8Tag:
9672               case int16Tag:
9673               case int32Tag:
9674               case uint8Tag:
9675               case uint8ClampedTag:
9676               case uint16Tag:
9677               case uint32Tag:
9678                 return cloneTypedArray(object, isDeep);
9679               case mapTag:
9680                 return new Ctor();
9681               case numberTag:
9682               case stringTag:
9683                 return new Ctor(object);
9684               case regexpTag:
9685                 return cloneRegExp(object);
9686               case setTag:
9687                 return new Ctor();
9688               case symbolTag2:
9689                 return cloneSymbol(object);
9690             }
9691           }
9692           function insertWrapDetails(source, details) {
9693             var length = details.length;
9694             if (!length) {
9695               return source;
9696             }
9697             var lastIndex = length - 1;
9698             details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex];
9699             details = details.join(length > 2 ? ", " : " ");
9700             return source.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n");
9701           }
9702           function isFlattenable(value) {
9703             return isArray2(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
9704           }
9705           function isIndex(value, length) {
9706             var type2 = typeof value;
9707             length = length == null ? MAX_SAFE_INTEGER : length;
9708             return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
9709           }
9710           function isIterateeCall(value, index, object) {
9711             if (!isObject3(object)) {
9712               return false;
9713             }
9714             var type2 = typeof index;
9715             if (type2 == "number" ? isArrayLike(object) && isIndex(index, object.length) : type2 == "string" && index in object) {
9716               return eq(object[index], value);
9717             }
9718             return false;
9719           }
9720           function isKey(value, object) {
9721             if (isArray2(value)) {
9722               return false;
9723             }
9724             var type2 = typeof value;
9725             if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol2(value)) {
9726               return true;
9727             }
9728             return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object);
9729           }
9730           function isKeyable(value) {
9731             var type2 = typeof value;
9732             return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
9733           }
9734           function isLaziable(func) {
9735             var funcName = getFuncName(func), other = lodash[funcName];
9736             if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) {
9737               return false;
9738             }
9739             if (func === other) {
9740               return true;
9741             }
9742             var data = getData(other);
9743             return !!data && func === data[0];
9744           }
9745           function isMasked(func) {
9746             return !!maskSrcKey && maskSrcKey in func;
9747           }
9748           var isMaskable = coreJsData ? isFunction : stubFalse;
9749           function isPrototype(value) {
9750             var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto3;
9751             return value === proto;
9752           }
9753           function isStrictComparable(value) {
9754             return value === value && !isObject3(value);
9755           }
9756           function matchesStrictComparable(key, srcValue) {
9757             return function(object) {
9758               if (object == null) {
9759                 return false;
9760               }
9761               return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object));
9762             };
9763           }
9764           function memoizeCapped(func) {
9765             var result2 = memoize(func, function(key) {
9766               if (cache.size === MAX_MEMOIZE_SIZE) {
9767                 cache.clear();
9768               }
9769               return key;
9770             });
9771             var cache = result2.cache;
9772             return result2;
9773           }
9774           function mergeData(data, source) {
9775             var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
9776             var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG;
9777             if (!(isCommon || isCombo)) {
9778               return data;
9779             }
9780             if (srcBitmask & WRAP_BIND_FLAG) {
9781               data[2] = source[2];
9782               newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
9783             }
9784             var value = source[3];
9785             if (value) {
9786               var partials = data[3];
9787               data[3] = partials ? composeArgs(partials, value, source[4]) : value;
9788               data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
9789             }
9790             value = source[5];
9791             if (value) {
9792               partials = data[5];
9793               data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
9794               data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
9795             }
9796             value = source[7];
9797             if (value) {
9798               data[7] = value;
9799             }
9800             if (srcBitmask & WRAP_ARY_FLAG) {
9801               data[8] = data[8] == null ? source[8] : nativeMin2(data[8], source[8]);
9802             }
9803             if (data[9] == null) {
9804               data[9] = source[9];
9805             }
9806             data[0] = source[0];
9807             data[1] = newBitmask;
9808             return data;
9809           }
9810           function nativeKeysIn(object) {
9811             var result2 = [];
9812             if (object != null) {
9813               for (var key in Object2(object)) {
9814                 result2.push(key);
9815               }
9816             }
9817             return result2;
9818           }
9819           function objectToString2(value) {
9820             return nativeObjectToString3.call(value);
9821           }
9822           function overRest(func, start2, transform3) {
9823             start2 = nativeMax2(start2 === undefined2 ? func.length - 1 : start2, 0);
9824             return function() {
9825               var args = arguments, index = -1, length = nativeMax2(args.length - start2, 0), array2 = Array2(length);
9826               while (++index < length) {
9827                 array2[index] = args[start2 + index];
9828               }
9829               index = -1;
9830               var otherArgs = Array2(start2 + 1);
9831               while (++index < start2) {
9832                 otherArgs[index] = args[index];
9833               }
9834               otherArgs[start2] = transform3(array2);
9835               return apply(func, this, otherArgs);
9836             };
9837           }
9838           function parent(object, path) {
9839             return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
9840           }
9841           function reorder(array2, indexes) {
9842             var arrLength = array2.length, length = nativeMin2(indexes.length, arrLength), oldArray = copyArray(array2);
9843             while (length--) {
9844               var index = indexes[length];
9845               array2[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2;
9846             }
9847             return array2;
9848           }
9849           function safeGet(object, key) {
9850             if (key === "constructor" && typeof object[key] === "function") {
9851               return;
9852             }
9853             if (key == "__proto__") {
9854               return;
9855             }
9856             return object[key];
9857           }
9858           var setData = shortOut(baseSetData);
9859           var setTimeout2 = ctxSetTimeout || function(func, wait) {
9860             return root3.setTimeout(func, wait);
9861           };
9862           var setToString = shortOut(baseSetToString);
9863           function setWrapToString(wrapper, reference, bitmask) {
9864             var source = reference + "";
9865             return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
9866           }
9867           function shortOut(func) {
9868             var count = 0, lastCalled = 0;
9869             return function() {
9870               var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
9871               lastCalled = stamp;
9872               if (remaining > 0) {
9873                 if (++count >= HOT_COUNT) {
9874                   return arguments[0];
9875                 }
9876               } else {
9877                 count = 0;
9878               }
9879               return func.apply(undefined2, arguments);
9880             };
9881           }
9882           function shuffleSelf(array2, size2) {
9883             var index = -1, length = array2.length, lastIndex = length - 1;
9884             size2 = size2 === undefined2 ? length : size2;
9885             while (++index < size2) {
9886               var rand = baseRandom(index, lastIndex), value = array2[rand];
9887               array2[rand] = array2[index];
9888               array2[index] = value;
9889             }
9890             array2.length = size2;
9891             return array2;
9892           }
9893           var stringToPath = memoizeCapped(function(string) {
9894             var result2 = [];
9895             if (string.charCodeAt(0) === 46) {
9896               result2.push("");
9897             }
9898             string.replace(rePropName, function(match, number3, quote2, subString) {
9899               result2.push(quote2 ? subString.replace(reEscapeChar, "$1") : number3 || match);
9900             });
9901             return result2;
9902           });
9903           function toKey(value) {
9904             if (typeof value == "string" || isSymbol2(value)) {
9905               return value;
9906             }
9907             var result2 = value + "";
9908             return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2;
9909           }
9910           function toSource(func) {
9911             if (func != null) {
9912               try {
9913                 return funcToString.call(func);
9914               } catch (e) {
9915               }
9916               try {
9917                 return func + "";
9918               } catch (e) {
9919               }
9920             }
9921             return "";
9922           }
9923           function updateWrapDetails(details, bitmask) {
9924             arrayEach(wrapFlags, function(pair2) {
9925               var value = "_." + pair2[0];
9926               if (bitmask & pair2[1] && !arrayIncludes(details, value)) {
9927                 details.push(value);
9928               }
9929             });
9930             return details.sort();
9931           }
9932           function wrapperClone(wrapper) {
9933             if (wrapper instanceof LazyWrapper) {
9934               return wrapper.clone();
9935             }
9936             var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
9937             result2.__actions__ = copyArray(wrapper.__actions__);
9938             result2.__index__ = wrapper.__index__;
9939             result2.__values__ = wrapper.__values__;
9940             return result2;
9941           }
9942           function chunk(array2, size2, guard) {
9943             if (guard ? isIterateeCall(array2, size2, guard) : size2 === undefined2) {
9944               size2 = 1;
9945             } else {
9946               size2 = nativeMax2(toInteger(size2), 0);
9947             }
9948             var length = array2 == null ? 0 : array2.length;
9949             if (!length || size2 < 1) {
9950               return [];
9951             }
9952             var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2));
9953             while (index < length) {
9954               result2[resIndex++] = baseSlice(array2, index, index += size2);
9955             }
9956             return result2;
9957           }
9958           function compact(array2) {
9959             var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result2 = [];
9960             while (++index < length) {
9961               var value = array2[index];
9962               if (value) {
9963                 result2[resIndex++] = value;
9964               }
9965             }
9966             return result2;
9967           }
9968           function concat() {
9969             var length = arguments.length;
9970             if (!length) {
9971               return [];
9972             }
9973             var args = Array2(length - 1), array2 = arguments[0], index = length;
9974             while (index--) {
9975               args[index - 1] = arguments[index];
9976             }
9977             return arrayPush(isArray2(array2) ? copyArray(array2) : [array2], baseFlatten(args, 1));
9978           }
9979           var difference = baseRest(function(array2, values2) {
9980             return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true)) : [];
9981           });
9982           var differenceBy = baseRest(function(array2, values2) {
9983             var iteratee2 = last(values2);
9984             if (isArrayLikeObject(iteratee2)) {
9985               iteratee2 = undefined2;
9986             }
9987             return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : [];
9988           });
9989           var differenceWith = baseRest(function(array2, values2) {
9990             var comparator = last(values2);
9991             if (isArrayLikeObject(comparator)) {
9992               comparator = undefined2;
9993             }
9994             return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : [];
9995           });
9996           function drop(array2, n2, guard) {
9997             var length = array2 == null ? 0 : array2.length;
9998             if (!length) {
9999               return [];
10000             }
10001             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
10002             return baseSlice(array2, n2 < 0 ? 0 : n2, length);
10003           }
10004           function dropRight(array2, n2, guard) {
10005             var length = array2 == null ? 0 : array2.length;
10006             if (!length) {
10007               return [];
10008             }
10009             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
10010             n2 = length - n2;
10011             return baseSlice(array2, 0, n2 < 0 ? 0 : n2);
10012           }
10013           function dropRightWhile(array2, predicate) {
10014             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true, true) : [];
10015           }
10016           function dropWhile(array2, predicate) {
10017             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true) : [];
10018           }
10019           function fill(array2, value, start2, end) {
10020             var length = array2 == null ? 0 : array2.length;
10021             if (!length) {
10022               return [];
10023             }
10024             if (start2 && typeof start2 != "number" && isIterateeCall(array2, value, start2)) {
10025               start2 = 0;
10026               end = length;
10027             }
10028             return baseFill(array2, value, start2, end);
10029           }
10030           function findIndex(array2, predicate, fromIndex) {
10031             var length = array2 == null ? 0 : array2.length;
10032             if (!length) {
10033               return -1;
10034             }
10035             var index = fromIndex == null ? 0 : toInteger(fromIndex);
10036             if (index < 0) {
10037               index = nativeMax2(length + index, 0);
10038             }
10039             return baseFindIndex(array2, getIteratee(predicate, 3), index);
10040           }
10041           function findLastIndex(array2, predicate, fromIndex) {
10042             var length = array2 == null ? 0 : array2.length;
10043             if (!length) {
10044               return -1;
10045             }
10046             var index = length - 1;
10047             if (fromIndex !== undefined2) {
10048               index = toInteger(fromIndex);
10049               index = fromIndex < 0 ? nativeMax2(length + index, 0) : nativeMin2(index, length - 1);
10050             }
10051             return baseFindIndex(array2, getIteratee(predicate, 3), index, true);
10052           }
10053           function flatten2(array2) {
10054             var length = array2 == null ? 0 : array2.length;
10055             return length ? baseFlatten(array2, 1) : [];
10056           }
10057           function flattenDeep(array2) {
10058             var length = array2 == null ? 0 : array2.length;
10059             return length ? baseFlatten(array2, INFINITY2) : [];
10060           }
10061           function flattenDepth(array2, depth) {
10062             var length = array2 == null ? 0 : array2.length;
10063             if (!length) {
10064               return [];
10065             }
10066             depth = depth === undefined2 ? 1 : toInteger(depth);
10067             return baseFlatten(array2, depth);
10068           }
10069           function fromPairs(pairs) {
10070             var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {};
10071             while (++index < length) {
10072               var pair2 = pairs[index];
10073               result2[pair2[0]] = pair2[1];
10074             }
10075             return result2;
10076           }
10077           function head(array2) {
10078             return array2 && array2.length ? array2[0] : undefined2;
10079           }
10080           function indexOf(array2, value, fromIndex) {
10081             var length = array2 == null ? 0 : array2.length;
10082             if (!length) {
10083               return -1;
10084             }
10085             var index = fromIndex == null ? 0 : toInteger(fromIndex);
10086             if (index < 0) {
10087               index = nativeMax2(length + index, 0);
10088             }
10089             return baseIndexOf(array2, value, index);
10090           }
10091           function initial(array2) {
10092             var length = array2 == null ? 0 : array2.length;
10093             return length ? baseSlice(array2, 0, -1) : [];
10094           }
10095           var intersection = baseRest(function(arrays) {
10096             var mapped = arrayMap2(arrays, castArrayLikeObject);
10097             return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
10098           });
10099           var intersectionBy = baseRest(function(arrays) {
10100             var iteratee2 = last(arrays), mapped = arrayMap2(arrays, castArrayLikeObject);
10101             if (iteratee2 === last(mapped)) {
10102               iteratee2 = undefined2;
10103             } else {
10104               mapped.pop();
10105             }
10106             return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : [];
10107           });
10108           var intersectionWith = baseRest(function(arrays) {
10109             var comparator = last(arrays), mapped = arrayMap2(arrays, castArrayLikeObject);
10110             comparator = typeof comparator == "function" ? comparator : undefined2;
10111             if (comparator) {
10112               mapped.pop();
10113             }
10114             return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
10115           });
10116           function join(array2, separator) {
10117             return array2 == null ? "" : nativeJoin.call(array2, separator);
10118           }
10119           function last(array2) {
10120             var length = array2 == null ? 0 : array2.length;
10121             return length ? array2[length - 1] : undefined2;
10122           }
10123           function lastIndexOf(array2, value, fromIndex) {
10124             var length = array2 == null ? 0 : array2.length;
10125             if (!length) {
10126               return -1;
10127             }
10128             var index = length;
10129             if (fromIndex !== undefined2) {
10130               index = toInteger(fromIndex);
10131               index = index < 0 ? nativeMax2(length + index, 0) : nativeMin2(index, length - 1);
10132             }
10133             return value === value ? strictLastIndexOf(array2, value, index) : baseFindIndex(array2, baseIsNaN, index, true);
10134           }
10135           function nth(array2, n2) {
10136             return array2 && array2.length ? baseNth(array2, toInteger(n2)) : undefined2;
10137           }
10138           var pull = baseRest(pullAll);
10139           function pullAll(array2, values2) {
10140             return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2) : array2;
10141           }
10142           function pullAllBy(array2, values2, iteratee2) {
10143             return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2, getIteratee(iteratee2, 2)) : array2;
10144           }
10145           function pullAllWith(array2, values2, comparator) {
10146             return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2, undefined2, comparator) : array2;
10147           }
10148           var pullAt = flatRest(function(array2, indexes) {
10149             var length = array2 == null ? 0 : array2.length, result2 = baseAt(array2, indexes);
10150             basePullAt(array2, arrayMap2(indexes, function(index) {
10151               return isIndex(index, length) ? +index : index;
10152             }).sort(compareAscending));
10153             return result2;
10154           });
10155           function remove2(array2, predicate) {
10156             var result2 = [];
10157             if (!(array2 && array2.length)) {
10158               return result2;
10159             }
10160             var index = -1, indexes = [], length = array2.length;
10161             predicate = getIteratee(predicate, 3);
10162             while (++index < length) {
10163               var value = array2[index];
10164               if (predicate(value, index, array2)) {
10165                 result2.push(value);
10166                 indexes.push(index);
10167               }
10168             }
10169             basePullAt(array2, indexes);
10170             return result2;
10171           }
10172           function reverse(array2) {
10173             return array2 == null ? array2 : nativeReverse.call(array2);
10174           }
10175           function slice(array2, start2, end) {
10176             var length = array2 == null ? 0 : array2.length;
10177             if (!length) {
10178               return [];
10179             }
10180             if (end && typeof end != "number" && isIterateeCall(array2, start2, end)) {
10181               start2 = 0;
10182               end = length;
10183             } else {
10184               start2 = start2 == null ? 0 : toInteger(start2);
10185               end = end === undefined2 ? length : toInteger(end);
10186             }
10187             return baseSlice(array2, start2, end);
10188           }
10189           function sortedIndex(array2, value) {
10190             return baseSortedIndex(array2, value);
10191           }
10192           function sortedIndexBy(array2, value, iteratee2) {
10193             return baseSortedIndexBy(array2, value, getIteratee(iteratee2, 2));
10194           }
10195           function sortedIndexOf(array2, value) {
10196             var length = array2 == null ? 0 : array2.length;
10197             if (length) {
10198               var index = baseSortedIndex(array2, value);
10199               if (index < length && eq(array2[index], value)) {
10200                 return index;
10201               }
10202             }
10203             return -1;
10204           }
10205           function sortedLastIndex(array2, value) {
10206             return baseSortedIndex(array2, value, true);
10207           }
10208           function sortedLastIndexBy(array2, value, iteratee2) {
10209             return baseSortedIndexBy(array2, value, getIteratee(iteratee2, 2), true);
10210           }
10211           function sortedLastIndexOf(array2, value) {
10212             var length = array2 == null ? 0 : array2.length;
10213             if (length) {
10214               var index = baseSortedIndex(array2, value, true) - 1;
10215               if (eq(array2[index], value)) {
10216                 return index;
10217               }
10218             }
10219             return -1;
10220           }
10221           function sortedUniq(array2) {
10222             return array2 && array2.length ? baseSortedUniq(array2) : [];
10223           }
10224           function sortedUniqBy(array2, iteratee2) {
10225             return array2 && array2.length ? baseSortedUniq(array2, getIteratee(iteratee2, 2)) : [];
10226           }
10227           function tail(array2) {
10228             var length = array2 == null ? 0 : array2.length;
10229             return length ? baseSlice(array2, 1, length) : [];
10230           }
10231           function take(array2, n2, guard) {
10232             if (!(array2 && array2.length)) {
10233               return [];
10234             }
10235             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
10236             return baseSlice(array2, 0, n2 < 0 ? 0 : n2);
10237           }
10238           function takeRight(array2, n2, guard) {
10239             var length = array2 == null ? 0 : array2.length;
10240             if (!length) {
10241               return [];
10242             }
10243             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
10244             n2 = length - n2;
10245             return baseSlice(array2, n2 < 0 ? 0 : n2, length);
10246           }
10247           function takeRightWhile(array2, predicate) {
10248             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), false, true) : [];
10249           }
10250           function takeWhile(array2, predicate) {
10251             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3)) : [];
10252           }
10253           var union = baseRest(function(arrays) {
10254             return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
10255           });
10256           var unionBy = baseRest(function(arrays) {
10257             var iteratee2 = last(arrays);
10258             if (isArrayLikeObject(iteratee2)) {
10259               iteratee2 = undefined2;
10260             }
10261             return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2));
10262           });
10263           var unionWith = baseRest(function(arrays) {
10264             var comparator = last(arrays);
10265             comparator = typeof comparator == "function" ? comparator : undefined2;
10266             return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator);
10267           });
10268           function uniq(array2) {
10269             return array2 && array2.length ? baseUniq(array2) : [];
10270           }
10271           function uniqBy(array2, iteratee2) {
10272             return array2 && array2.length ? baseUniq(array2, getIteratee(iteratee2, 2)) : [];
10273           }
10274           function uniqWith(array2, comparator) {
10275             comparator = typeof comparator == "function" ? comparator : undefined2;
10276             return array2 && array2.length ? baseUniq(array2, undefined2, comparator) : [];
10277           }
10278           function unzip(array2) {
10279             if (!(array2 && array2.length)) {
10280               return [];
10281             }
10282             var length = 0;
10283             array2 = arrayFilter(array2, function(group) {
10284               if (isArrayLikeObject(group)) {
10285                 length = nativeMax2(group.length, length);
10286                 return true;
10287               }
10288             });
10289             return baseTimes(length, function(index) {
10290               return arrayMap2(array2, baseProperty(index));
10291             });
10292           }
10293           function unzipWith(array2, iteratee2) {
10294             if (!(array2 && array2.length)) {
10295               return [];
10296             }
10297             var result2 = unzip(array2);
10298             if (iteratee2 == null) {
10299               return result2;
10300             }
10301             return arrayMap2(result2, function(group) {
10302               return apply(iteratee2, undefined2, group);
10303             });
10304           }
10305           var without = baseRest(function(array2, values2) {
10306             return isArrayLikeObject(array2) ? baseDifference(array2, values2) : [];
10307           });
10308           var xor = baseRest(function(arrays) {
10309             return baseXor(arrayFilter(arrays, isArrayLikeObject));
10310           });
10311           var xorBy = baseRest(function(arrays) {
10312             var iteratee2 = last(arrays);
10313             if (isArrayLikeObject(iteratee2)) {
10314               iteratee2 = undefined2;
10315             }
10316             return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2));
10317           });
10318           var xorWith = baseRest(function(arrays) {
10319             var comparator = last(arrays);
10320             comparator = typeof comparator == "function" ? comparator : undefined2;
10321             return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator);
10322           });
10323           var zip = baseRest(unzip);
10324           function zipObject(props, values2) {
10325             return baseZipObject(props || [], values2 || [], assignValue);
10326           }
10327           function zipObjectDeep(props, values2) {
10328             return baseZipObject(props || [], values2 || [], baseSet);
10329           }
10330           var zipWith = baseRest(function(arrays) {
10331             var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2;
10332             iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2;
10333             return unzipWith(arrays, iteratee2);
10334           });
10335           function chain(value) {
10336             var result2 = lodash(value);
10337             result2.__chain__ = true;
10338             return result2;
10339           }
10340           function tap(value, interceptor) {
10341             interceptor(value);
10342             return value;
10343           }
10344           function thru(value, interceptor) {
10345             return interceptor(value);
10346           }
10347           var wrapperAt = flatRest(function(paths) {
10348             var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) {
10349               return baseAt(object, paths);
10350             };
10351             if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) {
10352               return this.thru(interceptor);
10353             }
10354             value = value.slice(start2, +start2 + (length ? 1 : 0));
10355             value.__actions__.push({
10356               "func": thru,
10357               "args": [interceptor],
10358               "thisArg": undefined2
10359             });
10360             return new LodashWrapper(value, this.__chain__).thru(function(array2) {
10361               if (length && !array2.length) {
10362                 array2.push(undefined2);
10363               }
10364               return array2;
10365             });
10366           });
10367           function wrapperChain() {
10368             return chain(this);
10369           }
10370           function wrapperCommit() {
10371             return new LodashWrapper(this.value(), this.__chain__);
10372           }
10373           function wrapperNext() {
10374             if (this.__values__ === undefined2) {
10375               this.__values__ = toArray(this.value());
10376             }
10377             var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++];
10378             return { "done": done, "value": value };
10379           }
10380           function wrapperToIterator() {
10381             return this;
10382           }
10383           function wrapperPlant(value) {
10384             var result2, parent2 = this;
10385             while (parent2 instanceof baseLodash) {
10386               var clone2 = wrapperClone(parent2);
10387               clone2.__index__ = 0;
10388               clone2.__values__ = undefined2;
10389               if (result2) {
10390                 previous.__wrapped__ = clone2;
10391               } else {
10392                 result2 = clone2;
10393               }
10394               var previous = clone2;
10395               parent2 = parent2.__wrapped__;
10396             }
10397             previous.__wrapped__ = value;
10398             return result2;
10399           }
10400           function wrapperReverse() {
10401             var value = this.__wrapped__;
10402             if (value instanceof LazyWrapper) {
10403               var wrapped = value;
10404               if (this.__actions__.length) {
10405                 wrapped = new LazyWrapper(this);
10406               }
10407               wrapped = wrapped.reverse();
10408               wrapped.__actions__.push({
10409                 "func": thru,
10410                 "args": [reverse],
10411                 "thisArg": undefined2
10412               });
10413               return new LodashWrapper(wrapped, this.__chain__);
10414             }
10415             return this.thru(reverse);
10416           }
10417           function wrapperValue() {
10418             return baseWrapperValue(this.__wrapped__, this.__actions__);
10419           }
10420           var countBy = createAggregator(function(result2, value, key) {
10421             if (hasOwnProperty2.call(result2, key)) {
10422               ++result2[key];
10423             } else {
10424               baseAssignValue(result2, key, 1);
10425             }
10426           });
10427           function every(collection, predicate, guard) {
10428             var func = isArray2(collection) ? arrayEvery : baseEvery;
10429             if (guard && isIterateeCall(collection, predicate, guard)) {
10430               predicate = undefined2;
10431             }
10432             return func(collection, getIteratee(predicate, 3));
10433           }
10434           function filter2(collection, predicate) {
10435             var func = isArray2(collection) ? arrayFilter : baseFilter;
10436             return func(collection, getIteratee(predicate, 3));
10437           }
10438           var find2 = createFind(findIndex);
10439           var findLast = createFind(findLastIndex);
10440           function flatMap(collection, iteratee2) {
10441             return baseFlatten(map2(collection, iteratee2), 1);
10442           }
10443           function flatMapDeep(collection, iteratee2) {
10444             return baseFlatten(map2(collection, iteratee2), INFINITY2);
10445           }
10446           function flatMapDepth(collection, iteratee2, depth) {
10447             depth = depth === undefined2 ? 1 : toInteger(depth);
10448             return baseFlatten(map2(collection, iteratee2), depth);
10449           }
10450           function forEach(collection, iteratee2) {
10451             var func = isArray2(collection) ? arrayEach : baseEach;
10452             return func(collection, getIteratee(iteratee2, 3));
10453           }
10454           function forEachRight(collection, iteratee2) {
10455             var func = isArray2(collection) ? arrayEachRight : baseEachRight;
10456             return func(collection, getIteratee(iteratee2, 3));
10457           }
10458           var groupBy = createAggregator(function(result2, value, key) {
10459             if (hasOwnProperty2.call(result2, key)) {
10460               result2[key].push(value);
10461             } else {
10462               baseAssignValue(result2, key, [value]);
10463             }
10464           });
10465           function includes(collection, value, fromIndex, guard) {
10466             collection = isArrayLike(collection) ? collection : values(collection);
10467             fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
10468             var length = collection.length;
10469             if (fromIndex < 0) {
10470               fromIndex = nativeMax2(length + fromIndex, 0);
10471             }
10472             return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
10473           }
10474           var invokeMap = baseRest(function(collection, path, args) {
10475             var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : [];
10476             baseEach(collection, function(value) {
10477               result2[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
10478             });
10479             return result2;
10480           });
10481           var keyBy = createAggregator(function(result2, value, key) {
10482             baseAssignValue(result2, key, value);
10483           });
10484           function map2(collection, iteratee2) {
10485             var func = isArray2(collection) ? arrayMap2 : baseMap;
10486             return func(collection, getIteratee(iteratee2, 3));
10487           }
10488           function orderBy(collection, iteratees, orders, guard) {
10489             if (collection == null) {
10490               return [];
10491             }
10492             if (!isArray2(iteratees)) {
10493               iteratees = iteratees == null ? [] : [iteratees];
10494             }
10495             orders = guard ? undefined2 : orders;
10496             if (!isArray2(orders)) {
10497               orders = orders == null ? [] : [orders];
10498             }
10499             return baseOrderBy(collection, iteratees, orders);
10500           }
10501           var partition = createAggregator(function(result2, value, key) {
10502             result2[key ? 0 : 1].push(value);
10503           }, function() {
10504             return [[], []];
10505           });
10506           function reduce(collection, iteratee2, accumulator) {
10507             var func = isArray2(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3;
10508             return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach);
10509           }
10510           function reduceRight(collection, iteratee2, accumulator) {
10511             var func = isArray2(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3;
10512             return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight);
10513           }
10514           function reject(collection, predicate) {
10515             var func = isArray2(collection) ? arrayFilter : baseFilter;
10516             return func(collection, negate(getIteratee(predicate, 3)));
10517           }
10518           function sample(collection) {
10519             var func = isArray2(collection) ? arraySample : baseSample;
10520             return func(collection);
10521           }
10522           function sampleSize(collection, n2, guard) {
10523             if (guard ? isIterateeCall(collection, n2, guard) : n2 === undefined2) {
10524               n2 = 1;
10525             } else {
10526               n2 = toInteger(n2);
10527             }
10528             var func = isArray2(collection) ? arraySampleSize : baseSampleSize;
10529             return func(collection, n2);
10530           }
10531           function shuffle(collection) {
10532             var func = isArray2(collection) ? arrayShuffle : baseShuffle;
10533             return func(collection);
10534           }
10535           function size(collection) {
10536             if (collection == null) {
10537               return 0;
10538             }
10539             if (isArrayLike(collection)) {
10540               return isString(collection) ? stringSize(collection) : collection.length;
10541             }
10542             var tag = getTag(collection);
10543             if (tag == mapTag || tag == setTag) {
10544               return collection.size;
10545             }
10546             return baseKeys(collection).length;
10547           }
10548           function some(collection, predicate, guard) {
10549             var func = isArray2(collection) ? arraySome : baseSome;
10550             if (guard && isIterateeCall(collection, predicate, guard)) {
10551               predicate = undefined2;
10552             }
10553             return func(collection, getIteratee(predicate, 3));
10554           }
10555           var sortBy = baseRest(function(collection, iteratees) {
10556             if (collection == null) {
10557               return [];
10558             }
10559             var length = iteratees.length;
10560             if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
10561               iteratees = [];
10562             } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
10563               iteratees = [iteratees[0]];
10564             }
10565             return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
10566           });
10567           var now3 = ctxNow || function() {
10568             return root3.Date.now();
10569           };
10570           function after(n2, func) {
10571             if (typeof func != "function") {
10572               throw new TypeError2(FUNC_ERROR_TEXT3);
10573             }
10574             n2 = toInteger(n2);
10575             return function() {
10576               if (--n2 < 1) {
10577                 return func.apply(this, arguments);
10578               }
10579             };
10580           }
10581           function ary(func, n2, guard) {
10582             n2 = guard ? undefined2 : n2;
10583             n2 = func && n2 == null ? func.length : n2;
10584             return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n2);
10585           }
10586           function before(n2, func) {
10587             var result2;
10588             if (typeof func != "function") {
10589               throw new TypeError2(FUNC_ERROR_TEXT3);
10590             }
10591             n2 = toInteger(n2);
10592             return function() {
10593               if (--n2 > 0) {
10594                 result2 = func.apply(this, arguments);
10595               }
10596               if (n2 <= 1) {
10597                 func = undefined2;
10598               }
10599               return result2;
10600             };
10601           }
10602           var bind = baseRest(function(func, thisArg, partials) {
10603             var bitmask = WRAP_BIND_FLAG;
10604             if (partials.length) {
10605               var holders = replaceHolders(partials, getHolder(bind));
10606               bitmask |= WRAP_PARTIAL_FLAG;
10607             }
10608             return createWrap(func, bitmask, thisArg, partials, holders);
10609           });
10610           var bindKey2 = baseRest(function(object, key, partials) {
10611             var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
10612             if (partials.length) {
10613               var holders = replaceHolders(partials, getHolder(bindKey2));
10614               bitmask |= WRAP_PARTIAL_FLAG;
10615             }
10616             return createWrap(key, bitmask, object, partials, holders);
10617           });
10618           function curry(func, arity, guard) {
10619             arity = guard ? undefined2 : arity;
10620             var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
10621             result2.placeholder = curry.placeholder;
10622             return result2;
10623           }
10624           function curryRight(func, arity, guard) {
10625             arity = guard ? undefined2 : arity;
10626             var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
10627             result2.placeholder = curryRight.placeholder;
10628             return result2;
10629           }
10630           function debounce2(func, wait, options2) {
10631             var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
10632             if (typeof func != "function") {
10633               throw new TypeError2(FUNC_ERROR_TEXT3);
10634             }
10635             wait = toNumber2(wait) || 0;
10636             if (isObject3(options2)) {
10637               leading = !!options2.leading;
10638               maxing = "maxWait" in options2;
10639               maxWait = maxing ? nativeMax2(toNumber2(options2.maxWait) || 0, wait) : maxWait;
10640               trailing = "trailing" in options2 ? !!options2.trailing : trailing;
10641             }
10642             function invokeFunc(time) {
10643               var args = lastArgs, thisArg = lastThis;
10644               lastArgs = lastThis = undefined2;
10645               lastInvokeTime = time;
10646               result2 = func.apply(thisArg, args);
10647               return result2;
10648             }
10649             function leadingEdge(time) {
10650               lastInvokeTime = time;
10651               timerId = setTimeout2(timerExpired, wait);
10652               return leading ? invokeFunc(time) : result2;
10653             }
10654             function remainingWait(time) {
10655               var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
10656               return maxing ? nativeMin2(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
10657             }
10658             function shouldInvoke(time) {
10659               var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
10660               return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
10661             }
10662             function timerExpired() {
10663               var time = now3();
10664               if (shouldInvoke(time)) {
10665                 return trailingEdge(time);
10666               }
10667               timerId = setTimeout2(timerExpired, remainingWait(time));
10668             }
10669             function trailingEdge(time) {
10670               timerId = undefined2;
10671               if (trailing && lastArgs) {
10672                 return invokeFunc(time);
10673               }
10674               lastArgs = lastThis = undefined2;
10675               return result2;
10676             }
10677             function cancel() {
10678               if (timerId !== undefined2) {
10679                 clearTimeout2(timerId);
10680               }
10681               lastInvokeTime = 0;
10682               lastArgs = lastCallTime = lastThis = timerId = undefined2;
10683             }
10684             function flush() {
10685               return timerId === undefined2 ? result2 : trailingEdge(now3());
10686             }
10687             function debounced() {
10688               var time = now3(), isInvoking = shouldInvoke(time);
10689               lastArgs = arguments;
10690               lastThis = this;
10691               lastCallTime = time;
10692               if (isInvoking) {
10693                 if (timerId === undefined2) {
10694                   return leadingEdge(lastCallTime);
10695                 }
10696                 if (maxing) {
10697                   clearTimeout2(timerId);
10698                   timerId = setTimeout2(timerExpired, wait);
10699                   return invokeFunc(lastCallTime);
10700                 }
10701               }
10702               if (timerId === undefined2) {
10703                 timerId = setTimeout2(timerExpired, wait);
10704               }
10705               return result2;
10706             }
10707             debounced.cancel = cancel;
10708             debounced.flush = flush;
10709             return debounced;
10710           }
10711           var defer = baseRest(function(func, args) {
10712             return baseDelay(func, 1, args);
10713           });
10714           var delay = baseRest(function(func, wait, args) {
10715             return baseDelay(func, toNumber2(wait) || 0, args);
10716           });
10717           function flip(func) {
10718             return createWrap(func, WRAP_FLIP_FLAG);
10719           }
10720           function memoize(func, resolver) {
10721             if (typeof func != "function" || resolver != null && typeof resolver != "function") {
10722               throw new TypeError2(FUNC_ERROR_TEXT3);
10723             }
10724             var memoized = function() {
10725               var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
10726               if (cache.has(key)) {
10727                 return cache.get(key);
10728               }
10729               var result2 = func.apply(this, args);
10730               memoized.cache = cache.set(key, result2) || cache;
10731               return result2;
10732             };
10733             memoized.cache = new (memoize.Cache || MapCache)();
10734             return memoized;
10735           }
10736           memoize.Cache = MapCache;
10737           function negate(predicate) {
10738             if (typeof predicate != "function") {
10739               throw new TypeError2(FUNC_ERROR_TEXT3);
10740             }
10741             return function() {
10742               var args = arguments;
10743               switch (args.length) {
10744                 case 0:
10745                   return !predicate.call(this);
10746                 case 1:
10747                   return !predicate.call(this, args[0]);
10748                 case 2:
10749                   return !predicate.call(this, args[0], args[1]);
10750                 case 3:
10751                   return !predicate.call(this, args[0], args[1], args[2]);
10752               }
10753               return !predicate.apply(this, args);
10754             };
10755           }
10756           function once(func) {
10757             return before(2, func);
10758           }
10759           var overArgs = castRest(function(func, transforms) {
10760             transforms = transforms.length == 1 && isArray2(transforms[0]) ? arrayMap2(transforms[0], baseUnary(getIteratee())) : arrayMap2(baseFlatten(transforms, 1), baseUnary(getIteratee()));
10761             var funcsLength = transforms.length;
10762             return baseRest(function(args) {
10763               var index = -1, length = nativeMin2(args.length, funcsLength);
10764               while (++index < length) {
10765                 args[index] = transforms[index].call(this, args[index]);
10766               }
10767               return apply(func, this, args);
10768             });
10769           });
10770           var partial = baseRest(function(func, partials) {
10771             var holders = replaceHolders(partials, getHolder(partial));
10772             return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders);
10773           });
10774           var partialRight = baseRest(function(func, partials) {
10775             var holders = replaceHolders(partials, getHolder(partialRight));
10776             return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders);
10777           });
10778           var rearg = flatRest(function(func, indexes) {
10779             return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes);
10780           });
10781           function rest(func, start2) {
10782             if (typeof func != "function") {
10783               throw new TypeError2(FUNC_ERROR_TEXT3);
10784             }
10785             start2 = start2 === undefined2 ? start2 : toInteger(start2);
10786             return baseRest(func, start2);
10787           }
10788           function spread(func, start2) {
10789             if (typeof func != "function") {
10790               throw new TypeError2(FUNC_ERROR_TEXT3);
10791             }
10792             start2 = start2 == null ? 0 : nativeMax2(toInteger(start2), 0);
10793             return baseRest(function(args) {
10794               var array2 = args[start2], otherArgs = castSlice(args, 0, start2);
10795               if (array2) {
10796                 arrayPush(otherArgs, array2);
10797               }
10798               return apply(func, this, otherArgs);
10799             });
10800           }
10801           function throttle2(func, wait, options2) {
10802             var leading = true, trailing = true;
10803             if (typeof func != "function") {
10804               throw new TypeError2(FUNC_ERROR_TEXT3);
10805             }
10806             if (isObject3(options2)) {
10807               leading = "leading" in options2 ? !!options2.leading : leading;
10808               trailing = "trailing" in options2 ? !!options2.trailing : trailing;
10809             }
10810             return debounce2(func, wait, {
10811               "leading": leading,
10812               "maxWait": wait,
10813               "trailing": trailing
10814             });
10815           }
10816           function unary(func) {
10817             return ary(func, 1);
10818           }
10819           function wrap2(value, wrapper) {
10820             return partial(castFunction(wrapper), value);
10821           }
10822           function castArray() {
10823             if (!arguments.length) {
10824               return [];
10825             }
10826             var value = arguments[0];
10827             return isArray2(value) ? value : [value];
10828           }
10829           function clone(value) {
10830             return baseClone(value, CLONE_SYMBOLS_FLAG);
10831           }
10832           function cloneWith(value, customizer) {
10833             customizer = typeof customizer == "function" ? customizer : undefined2;
10834             return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
10835           }
10836           function cloneDeep(value) {
10837             return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
10838           }
10839           function cloneDeepWith(value, customizer) {
10840             customizer = typeof customizer == "function" ? customizer : undefined2;
10841             return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
10842           }
10843           function conformsTo(object, source) {
10844             return source == null || baseConformsTo(object, source, keys(source));
10845           }
10846           function eq(value, other) {
10847             return value === other || value !== value && other !== other;
10848           }
10849           var gt = createRelationalOperation(baseGt);
10850           var gte = createRelationalOperation(function(value, other) {
10851             return value >= other;
10852           });
10853           var isArguments = baseIsArguments(function() {
10854             return arguments;
10855           }()) ? baseIsArguments : function(value) {
10856             return isObjectLike2(value) && hasOwnProperty2.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
10857           };
10858           var isArray2 = Array2.isArray;
10859           var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
10860           function isArrayLike(value) {
10861             return value != null && isLength(value.length) && !isFunction(value);
10862           }
10863           function isArrayLikeObject(value) {
10864             return isObjectLike2(value) && isArrayLike(value);
10865           }
10866           function isBoolean(value) {
10867             return value === true || value === false || isObjectLike2(value) && baseGetTag2(value) == boolTag;
10868           }
10869           var isBuffer = nativeIsBuffer || stubFalse;
10870           var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
10871           function isElement2(value) {
10872             return isObjectLike2(value) && value.nodeType === 1 && !isPlainObject(value);
10873           }
10874           function isEmpty(value) {
10875             if (value == null) {
10876               return true;
10877             }
10878             if (isArrayLike(value) && (isArray2(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) {
10879               return !value.length;
10880             }
10881             var tag = getTag(value);
10882             if (tag == mapTag || tag == setTag) {
10883               return !value.size;
10884             }
10885             if (isPrototype(value)) {
10886               return !baseKeys(value).length;
10887             }
10888             for (var key in value) {
10889               if (hasOwnProperty2.call(value, key)) {
10890                 return false;
10891               }
10892             }
10893             return true;
10894           }
10895           function isEqual(value, other) {
10896             return baseIsEqual(value, other);
10897           }
10898           function isEqualWith(value, other, customizer) {
10899             customizer = typeof customizer == "function" ? customizer : undefined2;
10900             var result2 = customizer ? customizer(value, other) : undefined2;
10901             return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2;
10902           }
10903           function isError(value) {
10904             if (!isObjectLike2(value)) {
10905               return false;
10906             }
10907             var tag = baseGetTag2(value);
10908             return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value);
10909           }
10910           function isFinite2(value) {
10911             return typeof value == "number" && nativeIsFinite(value);
10912           }
10913           function isFunction(value) {
10914             if (!isObject3(value)) {
10915               return false;
10916             }
10917             var tag = baseGetTag2(value);
10918             return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
10919           }
10920           function isInteger(value) {
10921             return typeof value == "number" && value == toInteger(value);
10922           }
10923           function isLength(value) {
10924             return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
10925           }
10926           function isObject3(value) {
10927             var type2 = typeof value;
10928             return value != null && (type2 == "object" || type2 == "function");
10929           }
10930           function isObjectLike2(value) {
10931             return value != null && typeof value == "object";
10932           }
10933           var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
10934           function isMatch(object, source) {
10935             return object === source || baseIsMatch(object, source, getMatchData(source));
10936           }
10937           function isMatchWith(object, source, customizer) {
10938             customizer = typeof customizer == "function" ? customizer : undefined2;
10939             return baseIsMatch(object, source, getMatchData(source), customizer);
10940           }
10941           function isNaN2(value) {
10942             return isNumber2(value) && value != +value;
10943           }
10944           function isNative(value) {
10945             if (isMaskable(value)) {
10946               throw new Error2(CORE_ERROR_TEXT);
10947             }
10948             return baseIsNative(value);
10949           }
10950           function isNull(value) {
10951             return value === null;
10952           }
10953           function isNil(value) {
10954             return value == null;
10955           }
10956           function isNumber2(value) {
10957             return typeof value == "number" || isObjectLike2(value) && baseGetTag2(value) == numberTag;
10958           }
10959           function isPlainObject(value) {
10960             if (!isObjectLike2(value) || baseGetTag2(value) != objectTag) {
10961               return false;
10962             }
10963             var proto = getPrototype(value);
10964             if (proto === null) {
10965               return true;
10966             }
10967             var Ctor = hasOwnProperty2.call(proto, "constructor") && proto.constructor;
10968             return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
10969           }
10970           var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
10971           function isSafeInteger(value) {
10972             return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
10973           }
10974           var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
10975           function isString(value) {
10976             return typeof value == "string" || !isArray2(value) && isObjectLike2(value) && baseGetTag2(value) == stringTag;
10977           }
10978           function isSymbol2(value) {
10979             return typeof value == "symbol" || isObjectLike2(value) && baseGetTag2(value) == symbolTag2;
10980           }
10981           var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
10982           function isUndefined(value) {
10983             return value === undefined2;
10984           }
10985           function isWeakMap(value) {
10986             return isObjectLike2(value) && getTag(value) == weakMapTag;
10987           }
10988           function isWeakSet(value) {
10989             return isObjectLike2(value) && baseGetTag2(value) == weakSetTag;
10990           }
10991           var lt = createRelationalOperation(baseLt);
10992           var lte = createRelationalOperation(function(value, other) {
10993             return value <= other;
10994           });
10995           function toArray(value) {
10996             if (!value) {
10997               return [];
10998             }
10999             if (isArrayLike(value)) {
11000               return isString(value) ? stringToArray(value) : copyArray(value);
11001             }
11002             if (symIterator && value[symIterator]) {
11003               return iteratorToArray(value[symIterator]());
11004             }
11005             var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;
11006             return func(value);
11007           }
11008           function toFinite(value) {
11009             if (!value) {
11010               return value === 0 ? value : 0;
11011             }
11012             value = toNumber2(value);
11013             if (value === INFINITY2 || value === -INFINITY2) {
11014               var sign2 = value < 0 ? -1 : 1;
11015               return sign2 * MAX_INTEGER;
11016             }
11017             return value === value ? value : 0;
11018           }
11019           function toInteger(value) {
11020             var result2 = toFinite(value), remainder = result2 % 1;
11021             return result2 === result2 ? remainder ? result2 - remainder : result2 : 0;
11022           }
11023           function toLength(value) {
11024             return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
11025           }
11026           function toNumber2(value) {
11027             if (typeof value == "number") {
11028               return value;
11029             }
11030             if (isSymbol2(value)) {
11031               return NAN2;
11032             }
11033             if (isObject3(value)) {
11034               var other = typeof value.valueOf == "function" ? value.valueOf() : value;
11035               value = isObject3(other) ? other + "" : other;
11036             }
11037             if (typeof value != "string") {
11038               return value === 0 ? value : +value;
11039             }
11040             value = baseTrim2(value);
11041             var isBinary = reIsBinary2.test(value);
11042             return isBinary || reIsOctal2.test(value) ? freeParseInt2(value.slice(2), isBinary ? 2 : 8) : reIsBadHex2.test(value) ? NAN2 : +value;
11043           }
11044           function toPlainObject(value) {
11045             return copyObject(value, keysIn(value));
11046           }
11047           function toSafeInteger(value) {
11048             return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;
11049           }
11050           function toString2(value) {
11051             return value == null ? "" : baseToString2(value);
11052           }
11053           var assign = createAssigner(function(object, source) {
11054             if (isPrototype(source) || isArrayLike(source)) {
11055               copyObject(source, keys(source), object);
11056               return;
11057             }
11058             for (var key in source) {
11059               if (hasOwnProperty2.call(source, key)) {
11060                 assignValue(object, key, source[key]);
11061               }
11062             }
11063           });
11064           var assignIn = createAssigner(function(object, source) {
11065             copyObject(source, keysIn(source), object);
11066           });
11067           var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
11068             copyObject(source, keysIn(source), object, customizer);
11069           });
11070           var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
11071             copyObject(source, keys(source), object, customizer);
11072           });
11073           var at = flatRest(baseAt);
11074           function create2(prototype, properties) {
11075             var result2 = baseCreate(prototype);
11076             return properties == null ? result2 : baseAssign(result2, properties);
11077           }
11078           var defaults2 = baseRest(function(object, sources) {
11079             object = Object2(object);
11080             var index = -1;
11081             var length = sources.length;
11082             var guard = length > 2 ? sources[2] : undefined2;
11083             if (guard && isIterateeCall(sources[0], sources[1], guard)) {
11084               length = 1;
11085             }
11086             while (++index < length) {
11087               var source = sources[index];
11088               var props = keysIn(source);
11089               var propsIndex = -1;
11090               var propsLength = props.length;
11091               while (++propsIndex < propsLength) {
11092                 var key = props[propsIndex];
11093                 var value = object[key];
11094                 if (value === undefined2 || eq(value, objectProto3[key]) && !hasOwnProperty2.call(object, key)) {
11095                   object[key] = source[key];
11096                 }
11097               }
11098             }
11099             return object;
11100           });
11101           var defaultsDeep = baseRest(function(args) {
11102             args.push(undefined2, customDefaultsMerge);
11103             return apply(mergeWith, undefined2, args);
11104           });
11105           function findKey(object, predicate) {
11106             return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
11107           }
11108           function findLastKey(object, predicate) {
11109             return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
11110           }
11111           function forIn(object, iteratee2) {
11112             return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn);
11113           }
11114           function forInRight(object, iteratee2) {
11115             return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn);
11116           }
11117           function forOwn(object, iteratee2) {
11118             return object && baseForOwn(object, getIteratee(iteratee2, 3));
11119           }
11120           function forOwnRight(object, iteratee2) {
11121             return object && baseForOwnRight(object, getIteratee(iteratee2, 3));
11122           }
11123           function functions(object) {
11124             return object == null ? [] : baseFunctions(object, keys(object));
11125           }
11126           function functionsIn(object) {
11127             return object == null ? [] : baseFunctions(object, keysIn(object));
11128           }
11129           function get4(object, path, defaultValue) {
11130             var result2 = object == null ? undefined2 : baseGet(object, path);
11131             return result2 === undefined2 ? defaultValue : result2;
11132           }
11133           function has(object, path) {
11134             return object != null && hasPath(object, path, baseHas);
11135           }
11136           function hasIn(object, path) {
11137             return object != null && hasPath(object, path, baseHasIn);
11138           }
11139           var invert = createInverter(function(result2, value, key) {
11140             if (value != null && typeof value.toString != "function") {
11141               value = nativeObjectToString3.call(value);
11142             }
11143             result2[value] = key;
11144           }, constant(identity4));
11145           var invertBy = createInverter(function(result2, value, key) {
11146             if (value != null && typeof value.toString != "function") {
11147               value = nativeObjectToString3.call(value);
11148             }
11149             if (hasOwnProperty2.call(result2, value)) {
11150               result2[value].push(key);
11151             } else {
11152               result2[value] = [key];
11153             }
11154           }, getIteratee);
11155           var invoke = baseRest(baseInvoke);
11156           function keys(object) {
11157             return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
11158           }
11159           function keysIn(object) {
11160             return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
11161           }
11162           function mapKeys(object, iteratee2) {
11163             var result2 = {};
11164             iteratee2 = getIteratee(iteratee2, 3);
11165             baseForOwn(object, function(value, key, object2) {
11166               baseAssignValue(result2, iteratee2(value, key, object2), value);
11167             });
11168             return result2;
11169           }
11170           function mapValues(object, iteratee2) {
11171             var result2 = {};
11172             iteratee2 = getIteratee(iteratee2, 3);
11173             baseForOwn(object, function(value, key, object2) {
11174               baseAssignValue(result2, key, iteratee2(value, key, object2));
11175             });
11176             return result2;
11177           }
11178           var merge3 = createAssigner(function(object, source, srcIndex) {
11179             baseMerge(object, source, srcIndex);
11180           });
11181           var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
11182             baseMerge(object, source, srcIndex, customizer);
11183           });
11184           var omit = flatRest(function(object, paths) {
11185             var result2 = {};
11186             if (object == null) {
11187               return result2;
11188             }
11189             var isDeep = false;
11190             paths = arrayMap2(paths, function(path) {
11191               path = castPath(path, object);
11192               isDeep || (isDeep = path.length > 1);
11193               return path;
11194             });
11195             copyObject(object, getAllKeysIn(object), result2);
11196             if (isDeep) {
11197               result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
11198             }
11199             var length = paths.length;
11200             while (length--) {
11201               baseUnset(result2, paths[length]);
11202             }
11203             return result2;
11204           });
11205           function omitBy(object, predicate) {
11206             return pickBy(object, negate(getIteratee(predicate)));
11207           }
11208           var pick = flatRest(function(object, paths) {
11209             return object == null ? {} : basePick(object, paths);
11210           });
11211           function pickBy(object, predicate) {
11212             if (object == null) {
11213               return {};
11214             }
11215             var props = arrayMap2(getAllKeysIn(object), function(prop) {
11216               return [prop];
11217             });
11218             predicate = getIteratee(predicate);
11219             return basePickBy(object, props, function(value, path) {
11220               return predicate(value, path[0]);
11221             });
11222           }
11223           function result(object, path, defaultValue) {
11224             path = castPath(path, object);
11225             var index = -1, length = path.length;
11226             if (!length) {
11227               length = 1;
11228               object = undefined2;
11229             }
11230             while (++index < length) {
11231               var value = object == null ? undefined2 : object[toKey(path[index])];
11232               if (value === undefined2) {
11233                 index = length;
11234                 value = defaultValue;
11235               }
11236               object = isFunction(value) ? value.call(object) : value;
11237             }
11238             return object;
11239           }
11240           function set3(object, path, value) {
11241             return object == null ? object : baseSet(object, path, value);
11242           }
11243           function setWith(object, path, value, customizer) {
11244             customizer = typeof customizer == "function" ? customizer : undefined2;
11245             return object == null ? object : baseSet(object, path, value, customizer);
11246           }
11247           var toPairs = createToPairs(keys);
11248           var toPairsIn = createToPairs(keysIn);
11249           function transform2(object, iteratee2, accumulator) {
11250             var isArr = isArray2(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object);
11251             iteratee2 = getIteratee(iteratee2, 4);
11252             if (accumulator == null) {
11253               var Ctor = object && object.constructor;
11254               if (isArrLike) {
11255                 accumulator = isArr ? new Ctor() : [];
11256               } else if (isObject3(object)) {
11257                 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
11258               } else {
11259                 accumulator = {};
11260               }
11261             }
11262             (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) {
11263               return iteratee2(accumulator, value, index, object2);
11264             });
11265             return accumulator;
11266           }
11267           function unset(object, path) {
11268             return object == null ? true : baseUnset(object, path);
11269           }
11270           function update(object, path, updater) {
11271             return object == null ? object : baseUpdate(object, path, castFunction(updater));
11272           }
11273           function updateWith(object, path, updater, customizer) {
11274             customizer = typeof customizer == "function" ? customizer : undefined2;
11275             return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
11276           }
11277           function values(object) {
11278             return object == null ? [] : baseValues(object, keys(object));
11279           }
11280           function valuesIn(object) {
11281             return object == null ? [] : baseValues(object, keysIn(object));
11282           }
11283           function clamp3(number3, lower2, upper) {
11284             if (upper === undefined2) {
11285               upper = lower2;
11286               lower2 = undefined2;
11287             }
11288             if (upper !== undefined2) {
11289               upper = toNumber2(upper);
11290               upper = upper === upper ? upper : 0;
11291             }
11292             if (lower2 !== undefined2) {
11293               lower2 = toNumber2(lower2);
11294               lower2 = lower2 === lower2 ? lower2 : 0;
11295             }
11296             return baseClamp(toNumber2(number3), lower2, upper);
11297           }
11298           function inRange(number3, start2, end) {
11299             start2 = toFinite(start2);
11300             if (end === undefined2) {
11301               end = start2;
11302               start2 = 0;
11303             } else {
11304               end = toFinite(end);
11305             }
11306             number3 = toNumber2(number3);
11307             return baseInRange(number3, start2, end);
11308           }
11309           function random(lower2, upper, floating) {
11310             if (floating && typeof floating != "boolean" && isIterateeCall(lower2, upper, floating)) {
11311               upper = floating = undefined2;
11312             }
11313             if (floating === undefined2) {
11314               if (typeof upper == "boolean") {
11315                 floating = upper;
11316                 upper = undefined2;
11317               } else if (typeof lower2 == "boolean") {
11318                 floating = lower2;
11319                 lower2 = undefined2;
11320               }
11321             }
11322             if (lower2 === undefined2 && upper === undefined2) {
11323               lower2 = 0;
11324               upper = 1;
11325             } else {
11326               lower2 = toFinite(lower2);
11327               if (upper === undefined2) {
11328                 upper = lower2;
11329                 lower2 = 0;
11330               } else {
11331                 upper = toFinite(upper);
11332               }
11333             }
11334             if (lower2 > upper) {
11335               var temp = lower2;
11336               lower2 = upper;
11337               upper = temp;
11338             }
11339             if (floating || lower2 % 1 || upper % 1) {
11340               var rand = nativeRandom();
11341               return nativeMin2(lower2 + rand * (upper - lower2 + freeParseFloat("1e-" + ((rand + "").length - 1))), upper);
11342             }
11343             return baseRandom(lower2, upper);
11344           }
11345           var camelCase = createCompounder(function(result2, word, index) {
11346             word = word.toLowerCase();
11347             return result2 + (index ? capitalize(word) : word);
11348           });
11349           function capitalize(string) {
11350             return upperFirst(toString2(string).toLowerCase());
11351           }
11352           function deburr(string) {
11353             string = toString2(string);
11354             return string && string.replace(reLatin, deburrLetter).replace(reComboMark, "");
11355           }
11356           function endsWith(string, target, position) {
11357             string = toString2(string);
11358             target = baseToString2(target);
11359             var length = string.length;
11360             position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length);
11361             var end = position;
11362             position -= target.length;
11363             return position >= 0 && string.slice(position, end) == target;
11364           }
11365           function escape6(string) {
11366             string = toString2(string);
11367             return string && reHasUnescapedHtml2.test(string) ? string.replace(reUnescapedHtml2, escapeHtmlChar2) : string;
11368           }
11369           function escapeRegExp(string) {
11370             string = toString2(string);
11371             return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string;
11372           }
11373           var kebabCase = createCompounder(function(result2, word, index) {
11374             return result2 + (index ? "-" : "") + word.toLowerCase();
11375           });
11376           var lowerCase = createCompounder(function(result2, word, index) {
11377             return result2 + (index ? " " : "") + word.toLowerCase();
11378           });
11379           var lowerFirst = createCaseFirst("toLowerCase");
11380           function pad2(string, length, chars) {
11381             string = toString2(string);
11382             length = toInteger(length);
11383             var strLength = length ? stringSize(string) : 0;
11384             if (!length || strLength >= length) {
11385               return string;
11386             }
11387             var mid = (length - strLength) / 2;
11388             return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
11389           }
11390           function padEnd(string, length, chars) {
11391             string = toString2(string);
11392             length = toInteger(length);
11393             var strLength = length ? stringSize(string) : 0;
11394             return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
11395           }
11396           function padStart(string, length, chars) {
11397             string = toString2(string);
11398             length = toInteger(length);
11399             var strLength = length ? stringSize(string) : 0;
11400             return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
11401           }
11402           function parseInt2(string, radix, guard) {
11403             if (guard || radix == null) {
11404               radix = 0;
11405             } else if (radix) {
11406               radix = +radix;
11407             }
11408             return nativeParseInt(toString2(string).replace(reTrimStart2, ""), radix || 0);
11409           }
11410           function repeat(string, n2, guard) {
11411             if (guard ? isIterateeCall(string, n2, guard) : n2 === undefined2) {
11412               n2 = 1;
11413             } else {
11414               n2 = toInteger(n2);
11415             }
11416             return baseRepeat(toString2(string), n2);
11417           }
11418           function replace() {
11419             var args = arguments, string = toString2(args[0]);
11420             return args.length < 3 ? string : string.replace(args[1], args[2]);
11421           }
11422           var snakeCase = createCompounder(function(result2, word, index) {
11423             return result2 + (index ? "_" : "") + word.toLowerCase();
11424           });
11425           function split(string, separator, limit) {
11426             if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) {
11427               separator = limit = undefined2;
11428             }
11429             limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0;
11430             if (!limit) {
11431               return [];
11432             }
11433             string = toString2(string);
11434             if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) {
11435               separator = baseToString2(separator);
11436               if (!separator && hasUnicode(string)) {
11437                 return castSlice(stringToArray(string), 0, limit);
11438               }
11439             }
11440             return string.split(separator, limit);
11441           }
11442           var startCase = createCompounder(function(result2, word, index) {
11443             return result2 + (index ? " " : "") + upperFirst(word);
11444           });
11445           function startsWith(string, target, position) {
11446             string = toString2(string);
11447             position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
11448             target = baseToString2(target);
11449             return string.slice(position, position + target.length) == target;
11450           }
11451           function template(string, options2, guard) {
11452             var settings = lodash.templateSettings;
11453             if (guard && isIterateeCall(string, options2, guard)) {
11454               options2 = undefined2;
11455             }
11456             string = toString2(string);
11457             options2 = assignInWith({}, options2, settings, customDefaultsAssignIn);
11458             var imports = assignInWith({}, options2.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys);
11459             var isEscaping, isEvaluating, index = 0, interpolate = options2.interpolate || reNoMatch, source = "__p += '";
11460             var reDelimiters = RegExp2(
11461               (options2.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options2.evaluate || reNoMatch).source + "|$",
11462               "g"
11463             );
11464             var sourceURL = "//# sourceURL=" + (hasOwnProperty2.call(options2, "sourceURL") ? (options2.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n";
11465             string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
11466               interpolateValue || (interpolateValue = esTemplateValue);
11467               source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
11468               if (escapeValue) {
11469                 isEscaping = true;
11470                 source += "' +\n__e(" + escapeValue + ") +\n'";
11471               }
11472               if (evaluateValue) {
11473                 isEvaluating = true;
11474                 source += "';\n" + evaluateValue + ";\n__p += '";
11475               }
11476               if (interpolateValue) {
11477                 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
11478               }
11479               index = offset + match.length;
11480               return match;
11481             });
11482             source += "';\n";
11483             var variable = hasOwnProperty2.call(options2, "variable") && options2.variable;
11484             if (!variable) {
11485               source = "with (obj) {\n" + source + "\n}\n";
11486             } else if (reForbiddenIdentifierChars.test(variable)) {
11487               throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT);
11488             }
11489             source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;");
11490             source = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source + "return __p\n}";
11491             var result2 = attempt(function() {
11492               return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues);
11493             });
11494             result2.source = source;
11495             if (isError(result2)) {
11496               throw result2;
11497             }
11498             return result2;
11499           }
11500           function toLower(value) {
11501             return toString2(value).toLowerCase();
11502           }
11503           function toUpper(value) {
11504             return toString2(value).toUpperCase();
11505           }
11506           function trim(string, chars, guard) {
11507             string = toString2(string);
11508             if (string && (guard || chars === undefined2)) {
11509               return baseTrim2(string);
11510             }
11511             if (!string || !(chars = baseToString2(chars))) {
11512               return string;
11513             }
11514             var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1;
11515             return castSlice(strSymbols, start2, end).join("");
11516           }
11517           function trimEnd(string, chars, guard) {
11518             string = toString2(string);
11519             if (string && (guard || chars === undefined2)) {
11520               return string.slice(0, trimmedEndIndex2(string) + 1);
11521             }
11522             if (!string || !(chars = baseToString2(chars))) {
11523               return string;
11524             }
11525             var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
11526             return castSlice(strSymbols, 0, end).join("");
11527           }
11528           function trimStart(string, chars, guard) {
11529             string = toString2(string);
11530             if (string && (guard || chars === undefined2)) {
11531               return string.replace(reTrimStart2, "");
11532             }
11533             if (!string || !(chars = baseToString2(chars))) {
11534               return string;
11535             }
11536             var strSymbols = stringToArray(string), start2 = charsStartIndex(strSymbols, stringToArray(chars));
11537             return castSlice(strSymbols, start2).join("");
11538           }
11539           function truncate(string, options2) {
11540             var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;
11541             if (isObject3(options2)) {
11542               var separator = "separator" in options2 ? options2.separator : separator;
11543               length = "length" in options2 ? toInteger(options2.length) : length;
11544               omission = "omission" in options2 ? baseToString2(options2.omission) : omission;
11545             }
11546             string = toString2(string);
11547             var strLength = string.length;
11548             if (hasUnicode(string)) {
11549               var strSymbols = stringToArray(string);
11550               strLength = strSymbols.length;
11551             }
11552             if (length >= strLength) {
11553               return string;
11554             }
11555             var end = length - stringSize(omission);
11556             if (end < 1) {
11557               return omission;
11558             }
11559             var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end);
11560             if (separator === undefined2) {
11561               return result2 + omission;
11562             }
11563             if (strSymbols) {
11564               end += result2.length - end;
11565             }
11566             if (isRegExp(separator)) {
11567               if (string.slice(end).search(separator)) {
11568                 var match, substring = result2;
11569                 if (!separator.global) {
11570                   separator = RegExp2(separator.source, toString2(reFlags.exec(separator)) + "g");
11571                 }
11572                 separator.lastIndex = 0;
11573                 while (match = separator.exec(substring)) {
11574                   var newEnd = match.index;
11575                 }
11576                 result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd);
11577               }
11578             } else if (string.indexOf(baseToString2(separator), end) != end) {
11579               var index = result2.lastIndexOf(separator);
11580               if (index > -1) {
11581                 result2 = result2.slice(0, index);
11582               }
11583             }
11584             return result2 + omission;
11585           }
11586           function unescape4(string) {
11587             string = toString2(string);
11588             return string && reHasEscapedHtml2.test(string) ? string.replace(reEscapedHtml2, unescapeHtmlChar2) : string;
11589           }
11590           var upperCase = createCompounder(function(result2, word, index) {
11591             return result2 + (index ? " " : "") + word.toUpperCase();
11592           });
11593           var upperFirst = createCaseFirst("toUpperCase");
11594           function words(string, pattern, guard) {
11595             string = toString2(string);
11596             pattern = guard ? undefined2 : pattern;
11597             if (pattern === undefined2) {
11598               return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
11599             }
11600             return string.match(pattern) || [];
11601           }
11602           var attempt = baseRest(function(func, args) {
11603             try {
11604               return apply(func, undefined2, args);
11605             } catch (e) {
11606               return isError(e) ? e : new Error2(e);
11607             }
11608           });
11609           var bindAll = flatRest(function(object, methodNames) {
11610             arrayEach(methodNames, function(key) {
11611               key = toKey(key);
11612               baseAssignValue(object, key, bind(object[key], object));
11613             });
11614             return object;
11615           });
11616           function cond(pairs) {
11617             var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee();
11618             pairs = !length ? [] : arrayMap2(pairs, function(pair2) {
11619               if (typeof pair2[1] != "function") {
11620                 throw new TypeError2(FUNC_ERROR_TEXT3);
11621               }
11622               return [toIteratee(pair2[0]), pair2[1]];
11623             });
11624             return baseRest(function(args) {
11625               var index = -1;
11626               while (++index < length) {
11627                 var pair2 = pairs[index];
11628                 if (apply(pair2[0], this, args)) {
11629                   return apply(pair2[1], this, args);
11630                 }
11631               }
11632             });
11633           }
11634           function conforms(source) {
11635             return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
11636           }
11637           function constant(value) {
11638             return function() {
11639               return value;
11640             };
11641           }
11642           function defaultTo(value, defaultValue) {
11643             return value == null || value !== value ? defaultValue : value;
11644           }
11645           var flow = createFlow();
11646           var flowRight = createFlow(true);
11647           function identity4(value) {
11648             return value;
11649           }
11650           function iteratee(func) {
11651             return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG));
11652           }
11653           function matches(source) {
11654             return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
11655           }
11656           function matchesProperty(path, srcValue) {
11657             return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
11658           }
11659           var method = baseRest(function(path, args) {
11660             return function(object) {
11661               return baseInvoke(object, path, args);
11662             };
11663           });
11664           var methodOf = baseRest(function(object, args) {
11665             return function(path) {
11666               return baseInvoke(object, path, args);
11667             };
11668           });
11669           function mixin(object, source, options2) {
11670             var props = keys(source), methodNames = baseFunctions(source, props);
11671             if (options2 == null && !(isObject3(source) && (methodNames.length || !props.length))) {
11672               options2 = source;
11673               source = object;
11674               object = this;
11675               methodNames = baseFunctions(source, keys(source));
11676             }
11677             var chain2 = !(isObject3(options2) && "chain" in options2) || !!options2.chain, isFunc = isFunction(object);
11678             arrayEach(methodNames, function(methodName) {
11679               var func = source[methodName];
11680               object[methodName] = func;
11681               if (isFunc) {
11682                 object.prototype[methodName] = function() {
11683                   var chainAll = this.__chain__;
11684                   if (chain2 || chainAll) {
11685                     var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__);
11686                     actions.push({ "func": func, "args": arguments, "thisArg": object });
11687                     result2.__chain__ = chainAll;
11688                     return result2;
11689                   }
11690                   return func.apply(object, arrayPush([this.value()], arguments));
11691                 };
11692               }
11693             });
11694             return object;
11695           }
11696           function noConflict() {
11697             if (root3._ === this) {
11698               root3._ = oldDash;
11699             }
11700             return this;
11701           }
11702           function noop3() {
11703           }
11704           function nthArg(n2) {
11705             n2 = toInteger(n2);
11706             return baseRest(function(args) {
11707               return baseNth(args, n2);
11708             });
11709           }
11710           var over = createOver(arrayMap2);
11711           var overEvery = createOver(arrayEvery);
11712           var overSome = createOver(arraySome);
11713           function property(path) {
11714             return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
11715           }
11716           function propertyOf(object) {
11717             return function(path) {
11718               return object == null ? undefined2 : baseGet(object, path);
11719             };
11720           }
11721           var range3 = createRange();
11722           var rangeRight = createRange(true);
11723           function stubArray() {
11724             return [];
11725           }
11726           function stubFalse() {
11727             return false;
11728           }
11729           function stubObject() {
11730             return {};
11731           }
11732           function stubString() {
11733             return "";
11734           }
11735           function stubTrue() {
11736             return true;
11737           }
11738           function times(n2, iteratee2) {
11739             n2 = toInteger(n2);
11740             if (n2 < 1 || n2 > MAX_SAFE_INTEGER) {
11741               return [];
11742             }
11743             var index = MAX_ARRAY_LENGTH, length = nativeMin2(n2, MAX_ARRAY_LENGTH);
11744             iteratee2 = getIteratee(iteratee2);
11745             n2 -= MAX_ARRAY_LENGTH;
11746             var result2 = baseTimes(length, iteratee2);
11747             while (++index < n2) {
11748               iteratee2(index);
11749             }
11750             return result2;
11751           }
11752           function toPath(value) {
11753             if (isArray2(value)) {
11754               return arrayMap2(value, toKey);
11755             }
11756             return isSymbol2(value) ? [value] : copyArray(stringToPath(toString2(value)));
11757           }
11758           function uniqueId(prefix) {
11759             var id2 = ++idCounter;
11760             return toString2(prefix) + id2;
11761           }
11762           var add = createMathOperation(function(augend, addend) {
11763             return augend + addend;
11764           }, 0);
11765           var ceil = createRound("ceil");
11766           var divide = createMathOperation(function(dividend, divisor) {
11767             return dividend / divisor;
11768           }, 1);
11769           var floor = createRound("floor");
11770           function max3(array2) {
11771             return array2 && array2.length ? baseExtremum(array2, identity4, baseGt) : undefined2;
11772           }
11773           function maxBy(array2, iteratee2) {
11774             return array2 && array2.length ? baseExtremum(array2, getIteratee(iteratee2, 2), baseGt) : undefined2;
11775           }
11776           function mean(array2) {
11777             return baseMean(array2, identity4);
11778           }
11779           function meanBy(array2, iteratee2) {
11780             return baseMean(array2, getIteratee(iteratee2, 2));
11781           }
11782           function min3(array2) {
11783             return array2 && array2.length ? baseExtremum(array2, identity4, baseLt) : undefined2;
11784           }
11785           function minBy(array2, iteratee2) {
11786             return array2 && array2.length ? baseExtremum(array2, getIteratee(iteratee2, 2), baseLt) : undefined2;
11787           }
11788           var multiply = createMathOperation(function(multiplier, multiplicand) {
11789             return multiplier * multiplicand;
11790           }, 1);
11791           var round = createRound("round");
11792           var subtract = createMathOperation(function(minuend, subtrahend) {
11793             return minuend - subtrahend;
11794           }, 0);
11795           function sum(array2) {
11796             return array2 && array2.length ? baseSum(array2, identity4) : 0;
11797           }
11798           function sumBy(array2, iteratee2) {
11799             return array2 && array2.length ? baseSum(array2, getIteratee(iteratee2, 2)) : 0;
11800           }
11801           lodash.after = after;
11802           lodash.ary = ary;
11803           lodash.assign = assign;
11804           lodash.assignIn = assignIn;
11805           lodash.assignInWith = assignInWith;
11806           lodash.assignWith = assignWith;
11807           lodash.at = at;
11808           lodash.before = before;
11809           lodash.bind = bind;
11810           lodash.bindAll = bindAll;
11811           lodash.bindKey = bindKey2;
11812           lodash.castArray = castArray;
11813           lodash.chain = chain;
11814           lodash.chunk = chunk;
11815           lodash.compact = compact;
11816           lodash.concat = concat;
11817           lodash.cond = cond;
11818           lodash.conforms = conforms;
11819           lodash.constant = constant;
11820           lodash.countBy = countBy;
11821           lodash.create = create2;
11822           lodash.curry = curry;
11823           lodash.curryRight = curryRight;
11824           lodash.debounce = debounce2;
11825           lodash.defaults = defaults2;
11826           lodash.defaultsDeep = defaultsDeep;
11827           lodash.defer = defer;
11828           lodash.delay = delay;
11829           lodash.difference = difference;
11830           lodash.differenceBy = differenceBy;
11831           lodash.differenceWith = differenceWith;
11832           lodash.drop = drop;
11833           lodash.dropRight = dropRight;
11834           lodash.dropRightWhile = dropRightWhile;
11835           lodash.dropWhile = dropWhile;
11836           lodash.fill = fill;
11837           lodash.filter = filter2;
11838           lodash.flatMap = flatMap;
11839           lodash.flatMapDeep = flatMapDeep;
11840           lodash.flatMapDepth = flatMapDepth;
11841           lodash.flatten = flatten2;
11842           lodash.flattenDeep = flattenDeep;
11843           lodash.flattenDepth = flattenDepth;
11844           lodash.flip = flip;
11845           lodash.flow = flow;
11846           lodash.flowRight = flowRight;
11847           lodash.fromPairs = fromPairs;
11848           lodash.functions = functions;
11849           lodash.functionsIn = functionsIn;
11850           lodash.groupBy = groupBy;
11851           lodash.initial = initial;
11852           lodash.intersection = intersection;
11853           lodash.intersectionBy = intersectionBy;
11854           lodash.intersectionWith = intersectionWith;
11855           lodash.invert = invert;
11856           lodash.invertBy = invertBy;
11857           lodash.invokeMap = invokeMap;
11858           lodash.iteratee = iteratee;
11859           lodash.keyBy = keyBy;
11860           lodash.keys = keys;
11861           lodash.keysIn = keysIn;
11862           lodash.map = map2;
11863           lodash.mapKeys = mapKeys;
11864           lodash.mapValues = mapValues;
11865           lodash.matches = matches;
11866           lodash.matchesProperty = matchesProperty;
11867           lodash.memoize = memoize;
11868           lodash.merge = merge3;
11869           lodash.mergeWith = mergeWith;
11870           lodash.method = method;
11871           lodash.methodOf = methodOf;
11872           lodash.mixin = mixin;
11873           lodash.negate = negate;
11874           lodash.nthArg = nthArg;
11875           lodash.omit = omit;
11876           lodash.omitBy = omitBy;
11877           lodash.once = once;
11878           lodash.orderBy = orderBy;
11879           lodash.over = over;
11880           lodash.overArgs = overArgs;
11881           lodash.overEvery = overEvery;
11882           lodash.overSome = overSome;
11883           lodash.partial = partial;
11884           lodash.partialRight = partialRight;
11885           lodash.partition = partition;
11886           lodash.pick = pick;
11887           lodash.pickBy = pickBy;
11888           lodash.property = property;
11889           lodash.propertyOf = propertyOf;
11890           lodash.pull = pull;
11891           lodash.pullAll = pullAll;
11892           lodash.pullAllBy = pullAllBy;
11893           lodash.pullAllWith = pullAllWith;
11894           lodash.pullAt = pullAt;
11895           lodash.range = range3;
11896           lodash.rangeRight = rangeRight;
11897           lodash.rearg = rearg;
11898           lodash.reject = reject;
11899           lodash.remove = remove2;
11900           lodash.rest = rest;
11901           lodash.reverse = reverse;
11902           lodash.sampleSize = sampleSize;
11903           lodash.set = set3;
11904           lodash.setWith = setWith;
11905           lodash.shuffle = shuffle;
11906           lodash.slice = slice;
11907           lodash.sortBy = sortBy;
11908           lodash.sortedUniq = sortedUniq;
11909           lodash.sortedUniqBy = sortedUniqBy;
11910           lodash.split = split;
11911           lodash.spread = spread;
11912           lodash.tail = tail;
11913           lodash.take = take;
11914           lodash.takeRight = takeRight;
11915           lodash.takeRightWhile = takeRightWhile;
11916           lodash.takeWhile = takeWhile;
11917           lodash.tap = tap;
11918           lodash.throttle = throttle2;
11919           lodash.thru = thru;
11920           lodash.toArray = toArray;
11921           lodash.toPairs = toPairs;
11922           lodash.toPairsIn = toPairsIn;
11923           lodash.toPath = toPath;
11924           lodash.toPlainObject = toPlainObject;
11925           lodash.transform = transform2;
11926           lodash.unary = unary;
11927           lodash.union = union;
11928           lodash.unionBy = unionBy;
11929           lodash.unionWith = unionWith;
11930           lodash.uniq = uniq;
11931           lodash.uniqBy = uniqBy;
11932           lodash.uniqWith = uniqWith;
11933           lodash.unset = unset;
11934           lodash.unzip = unzip;
11935           lodash.unzipWith = unzipWith;
11936           lodash.update = update;
11937           lodash.updateWith = updateWith;
11938           lodash.values = values;
11939           lodash.valuesIn = valuesIn;
11940           lodash.without = without;
11941           lodash.words = words;
11942           lodash.wrap = wrap2;
11943           lodash.xor = xor;
11944           lodash.xorBy = xorBy;
11945           lodash.xorWith = xorWith;
11946           lodash.zip = zip;
11947           lodash.zipObject = zipObject;
11948           lodash.zipObjectDeep = zipObjectDeep;
11949           lodash.zipWith = zipWith;
11950           lodash.entries = toPairs;
11951           lodash.entriesIn = toPairsIn;
11952           lodash.extend = assignIn;
11953           lodash.extendWith = assignInWith;
11954           mixin(lodash, lodash);
11955           lodash.add = add;
11956           lodash.attempt = attempt;
11957           lodash.camelCase = camelCase;
11958           lodash.capitalize = capitalize;
11959           lodash.ceil = ceil;
11960           lodash.clamp = clamp3;
11961           lodash.clone = clone;
11962           lodash.cloneDeep = cloneDeep;
11963           lodash.cloneDeepWith = cloneDeepWith;
11964           lodash.cloneWith = cloneWith;
11965           lodash.conformsTo = conformsTo;
11966           lodash.deburr = deburr;
11967           lodash.defaultTo = defaultTo;
11968           lodash.divide = divide;
11969           lodash.endsWith = endsWith;
11970           lodash.eq = eq;
11971           lodash.escape = escape6;
11972           lodash.escapeRegExp = escapeRegExp;
11973           lodash.every = every;
11974           lodash.find = find2;
11975           lodash.findIndex = findIndex;
11976           lodash.findKey = findKey;
11977           lodash.findLast = findLast;
11978           lodash.findLastIndex = findLastIndex;
11979           lodash.findLastKey = findLastKey;
11980           lodash.floor = floor;
11981           lodash.forEach = forEach;
11982           lodash.forEachRight = forEachRight;
11983           lodash.forIn = forIn;
11984           lodash.forInRight = forInRight;
11985           lodash.forOwn = forOwn;
11986           lodash.forOwnRight = forOwnRight;
11987           lodash.get = get4;
11988           lodash.gt = gt;
11989           lodash.gte = gte;
11990           lodash.has = has;
11991           lodash.hasIn = hasIn;
11992           lodash.head = head;
11993           lodash.identity = identity4;
11994           lodash.includes = includes;
11995           lodash.indexOf = indexOf;
11996           lodash.inRange = inRange;
11997           lodash.invoke = invoke;
11998           lodash.isArguments = isArguments;
11999           lodash.isArray = isArray2;
12000           lodash.isArrayBuffer = isArrayBuffer;
12001           lodash.isArrayLike = isArrayLike;
12002           lodash.isArrayLikeObject = isArrayLikeObject;
12003           lodash.isBoolean = isBoolean;
12004           lodash.isBuffer = isBuffer;
12005           lodash.isDate = isDate;
12006           lodash.isElement = isElement2;
12007           lodash.isEmpty = isEmpty;
12008           lodash.isEqual = isEqual;
12009           lodash.isEqualWith = isEqualWith;
12010           lodash.isError = isError;
12011           lodash.isFinite = isFinite2;
12012           lodash.isFunction = isFunction;
12013           lodash.isInteger = isInteger;
12014           lodash.isLength = isLength;
12015           lodash.isMap = isMap;
12016           lodash.isMatch = isMatch;
12017           lodash.isMatchWith = isMatchWith;
12018           lodash.isNaN = isNaN2;
12019           lodash.isNative = isNative;
12020           lodash.isNil = isNil;
12021           lodash.isNull = isNull;
12022           lodash.isNumber = isNumber2;
12023           lodash.isObject = isObject3;
12024           lodash.isObjectLike = isObjectLike2;
12025           lodash.isPlainObject = isPlainObject;
12026           lodash.isRegExp = isRegExp;
12027           lodash.isSafeInteger = isSafeInteger;
12028           lodash.isSet = isSet;
12029           lodash.isString = isString;
12030           lodash.isSymbol = isSymbol2;
12031           lodash.isTypedArray = isTypedArray;
12032           lodash.isUndefined = isUndefined;
12033           lodash.isWeakMap = isWeakMap;
12034           lodash.isWeakSet = isWeakSet;
12035           lodash.join = join;
12036           lodash.kebabCase = kebabCase;
12037           lodash.last = last;
12038           lodash.lastIndexOf = lastIndexOf;
12039           lodash.lowerCase = lowerCase;
12040           lodash.lowerFirst = lowerFirst;
12041           lodash.lt = lt;
12042           lodash.lte = lte;
12043           lodash.max = max3;
12044           lodash.maxBy = maxBy;
12045           lodash.mean = mean;
12046           lodash.meanBy = meanBy;
12047           lodash.min = min3;
12048           lodash.minBy = minBy;
12049           lodash.stubArray = stubArray;
12050           lodash.stubFalse = stubFalse;
12051           lodash.stubObject = stubObject;
12052           lodash.stubString = stubString;
12053           lodash.stubTrue = stubTrue;
12054           lodash.multiply = multiply;
12055           lodash.nth = nth;
12056           lodash.noConflict = noConflict;
12057           lodash.noop = noop3;
12058           lodash.now = now3;
12059           lodash.pad = pad2;
12060           lodash.padEnd = padEnd;
12061           lodash.padStart = padStart;
12062           lodash.parseInt = parseInt2;
12063           lodash.random = random;
12064           lodash.reduce = reduce;
12065           lodash.reduceRight = reduceRight;
12066           lodash.repeat = repeat;
12067           lodash.replace = replace;
12068           lodash.result = result;
12069           lodash.round = round;
12070           lodash.runInContext = runInContext2;
12071           lodash.sample = sample;
12072           lodash.size = size;
12073           lodash.snakeCase = snakeCase;
12074           lodash.some = some;
12075           lodash.sortedIndex = sortedIndex;
12076           lodash.sortedIndexBy = sortedIndexBy;
12077           lodash.sortedIndexOf = sortedIndexOf;
12078           lodash.sortedLastIndex = sortedLastIndex;
12079           lodash.sortedLastIndexBy = sortedLastIndexBy;
12080           lodash.sortedLastIndexOf = sortedLastIndexOf;
12081           lodash.startCase = startCase;
12082           lodash.startsWith = startsWith;
12083           lodash.subtract = subtract;
12084           lodash.sum = sum;
12085           lodash.sumBy = sumBy;
12086           lodash.template = template;
12087           lodash.times = times;
12088           lodash.toFinite = toFinite;
12089           lodash.toInteger = toInteger;
12090           lodash.toLength = toLength;
12091           lodash.toLower = toLower;
12092           lodash.toNumber = toNumber2;
12093           lodash.toSafeInteger = toSafeInteger;
12094           lodash.toString = toString2;
12095           lodash.toUpper = toUpper;
12096           lodash.trim = trim;
12097           lodash.trimEnd = trimEnd;
12098           lodash.trimStart = trimStart;
12099           lodash.truncate = truncate;
12100           lodash.unescape = unescape4;
12101           lodash.uniqueId = uniqueId;
12102           lodash.upperCase = upperCase;
12103           lodash.upperFirst = upperFirst;
12104           lodash.each = forEach;
12105           lodash.eachRight = forEachRight;
12106           lodash.first = head;
12107           mixin(lodash, function() {
12108             var source = {};
12109             baseForOwn(lodash, function(func, methodName) {
12110               if (!hasOwnProperty2.call(lodash.prototype, methodName)) {
12111                 source[methodName] = func;
12112               }
12113             });
12114             return source;
12115           }(), { "chain": false });
12116           lodash.VERSION = VERSION;
12117           arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) {
12118             lodash[methodName].placeholder = lodash;
12119           });
12120           arrayEach(["drop", "take"], function(methodName, index) {
12121             LazyWrapper.prototype[methodName] = function(n2) {
12122               n2 = n2 === undefined2 ? 1 : nativeMax2(toInteger(n2), 0);
12123               var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone();
12124               if (result2.__filtered__) {
12125                 result2.__takeCount__ = nativeMin2(n2, result2.__takeCount__);
12126               } else {
12127                 result2.__views__.push({
12128                   "size": nativeMin2(n2, MAX_ARRAY_LENGTH),
12129                   "type": methodName + (result2.__dir__ < 0 ? "Right" : "")
12130                 });
12131               }
12132               return result2;
12133             };
12134             LazyWrapper.prototype[methodName + "Right"] = function(n2) {
12135               return this.reverse()[methodName](n2).reverse();
12136             };
12137           });
12138           arrayEach(["filter", "map", "takeWhile"], function(methodName, index) {
12139             var type2 = index + 1, isFilter = type2 == LAZY_FILTER_FLAG || type2 == LAZY_WHILE_FLAG;
12140             LazyWrapper.prototype[methodName] = function(iteratee2) {
12141               var result2 = this.clone();
12142               result2.__iteratees__.push({
12143                 "iteratee": getIteratee(iteratee2, 3),
12144                 "type": type2
12145               });
12146               result2.__filtered__ = result2.__filtered__ || isFilter;
12147               return result2;
12148             };
12149           });
12150           arrayEach(["head", "last"], function(methodName, index) {
12151             var takeName = "take" + (index ? "Right" : "");
12152             LazyWrapper.prototype[methodName] = function() {
12153               return this[takeName](1).value()[0];
12154             };
12155           });
12156           arrayEach(["initial", "tail"], function(methodName, index) {
12157             var dropName = "drop" + (index ? "" : "Right");
12158             LazyWrapper.prototype[methodName] = function() {
12159               return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
12160             };
12161           });
12162           LazyWrapper.prototype.compact = function() {
12163             return this.filter(identity4);
12164           };
12165           LazyWrapper.prototype.find = function(predicate) {
12166             return this.filter(predicate).head();
12167           };
12168           LazyWrapper.prototype.findLast = function(predicate) {
12169             return this.reverse().find(predicate);
12170           };
12171           LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
12172             if (typeof path == "function") {
12173               return new LazyWrapper(this);
12174             }
12175             return this.map(function(value) {
12176               return baseInvoke(value, path, args);
12177             });
12178           });
12179           LazyWrapper.prototype.reject = function(predicate) {
12180             return this.filter(negate(getIteratee(predicate)));
12181           };
12182           LazyWrapper.prototype.slice = function(start2, end) {
12183             start2 = toInteger(start2);
12184             var result2 = this;
12185             if (result2.__filtered__ && (start2 > 0 || end < 0)) {
12186               return new LazyWrapper(result2);
12187             }
12188             if (start2 < 0) {
12189               result2 = result2.takeRight(-start2);
12190             } else if (start2) {
12191               result2 = result2.drop(start2);
12192             }
12193             if (end !== undefined2) {
12194               end = toInteger(end);
12195               result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start2);
12196             }
12197             return result2;
12198           };
12199           LazyWrapper.prototype.takeRightWhile = function(predicate) {
12200             return this.reverse().takeWhile(predicate).reverse();
12201           };
12202           LazyWrapper.prototype.toArray = function() {
12203             return this.take(MAX_ARRAY_LENGTH);
12204           };
12205           baseForOwn(LazyWrapper.prototype, function(func, methodName) {
12206             var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName);
12207             if (!lodashFunc) {
12208               return;
12209             }
12210             lodash.prototype[methodName] = function() {
12211               var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray2(value);
12212               var interceptor = function(value2) {
12213                 var result3 = lodashFunc.apply(lodash, arrayPush([value2], args));
12214                 return isTaker && chainAll ? result3[0] : result3;
12215               };
12216               if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) {
12217                 isLazy = useLazy = false;
12218               }
12219               var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid;
12220               if (!retUnwrapped && useLazy) {
12221                 value = onlyLazy ? value : new LazyWrapper(this);
12222                 var result2 = func.apply(value, args);
12223                 result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 });
12224                 return new LodashWrapper(result2, chainAll);
12225               }
12226               if (isUnwrapped && onlyLazy) {
12227                 return func.apply(this, args);
12228               }
12229               result2 = this.thru(interceptor);
12230               return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2;
12231             };
12232           });
12233           arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) {
12234             var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName);
12235             lodash.prototype[methodName] = function() {
12236               var args = arguments;
12237               if (retUnwrapped && !this.__chain__) {
12238                 var value = this.value();
12239                 return func.apply(isArray2(value) ? value : [], args);
12240               }
12241               return this[chainName](function(value2) {
12242                 return func.apply(isArray2(value2) ? value2 : [], args);
12243               });
12244             };
12245           });
12246           baseForOwn(LazyWrapper.prototype, function(func, methodName) {
12247             var lodashFunc = lodash[methodName];
12248             if (lodashFunc) {
12249               var key = lodashFunc.name + "";
12250               if (!hasOwnProperty2.call(realNames, key)) {
12251                 realNames[key] = [];
12252               }
12253               realNames[key].push({ "name": methodName, "func": lodashFunc });
12254             }
12255           });
12256           realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{
12257             "name": "wrapper",
12258             "func": undefined2
12259           }];
12260           LazyWrapper.prototype.clone = lazyClone;
12261           LazyWrapper.prototype.reverse = lazyReverse;
12262           LazyWrapper.prototype.value = lazyValue;
12263           lodash.prototype.at = wrapperAt;
12264           lodash.prototype.chain = wrapperChain;
12265           lodash.prototype.commit = wrapperCommit;
12266           lodash.prototype.next = wrapperNext;
12267           lodash.prototype.plant = wrapperPlant;
12268           lodash.prototype.reverse = wrapperReverse;
12269           lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
12270           lodash.prototype.first = lodash.prototype.head;
12271           if (symIterator) {
12272             lodash.prototype[symIterator] = wrapperToIterator;
12273           }
12274           return lodash;
12275         };
12276         var _ = runInContext();
12277         if (typeof define == "function" && typeof define.amd == "object" && define.amd) {
12278           root3._ = _;
12279           define(function() {
12280             return _;
12281           });
12282         } else if (freeModule) {
12283           (freeModule.exports = _)._ = _;
12284           freeExports._ = _;
12285         } else {
12286           root3._ = _;
12287         }
12288       }).call(exports2);
12289     }
12290   });
12291
12292   // node_modules/rbush/rbush.min.js
12293   var require_rbush_min = __commonJS({
12294     "node_modules/rbush/rbush.min.js"(exports2, module2) {
12295       !function(t, i2) {
12296         "object" == typeof exports2 && "undefined" != typeof module2 ? module2.exports = i2() : "function" == typeof define && define.amd ? define(i2) : (t = t || self).RBush = i2();
12297       }(exports2, function() {
12298         "use strict";
12299         function t(t2, r2, e3, a2, h2) {
12300           !function t3(n3, r3, e4, a3, h3) {
12301             for (; a3 > e4; ) {
12302               if (a3 - e4 > 600) {
12303                 var o2 = a3 - e4 + 1, s2 = r3 - e4 + 1, l2 = Math.log(o2), f3 = 0.5 * Math.exp(2 * l2 / 3), u2 = 0.5 * Math.sqrt(l2 * f3 * (o2 - f3) / o2) * (s2 - o2 / 2 < 0 ? -1 : 1), m2 = Math.max(e4, Math.floor(r3 - s2 * f3 / o2 + u2)), c2 = Math.min(a3, Math.floor(r3 + (o2 - s2) * f3 / o2 + u2));
12304                 t3(n3, r3, m2, c2, h3);
12305               }
12306               var p2 = n3[r3], d2 = e4, x = a3;
12307               for (i2(n3, e4, r3), h3(n3[a3], p2) > 0 && i2(n3, e4, a3); d2 < x; ) {
12308                 for (i2(n3, d2, x), d2++, x--; h3(n3[d2], p2) < 0; )
12309                   d2++;
12310                 for (; h3(n3[x], p2) > 0; )
12311                   x--;
12312               }
12313               0 === h3(n3[e4], p2) ? i2(n3, e4, x) : i2(n3, ++x, a3), x <= r3 && (e4 = x + 1), r3 <= x && (a3 = x - 1);
12314             }
12315           }(t2, r2, e3 || 0, a2 || t2.length - 1, h2 || n2);
12316         }
12317         function i2(t2, i3, n3) {
12318           var r2 = t2[i3];
12319           t2[i3] = t2[n3], t2[n3] = r2;
12320         }
12321         function n2(t2, i3) {
12322           return t2 < i3 ? -1 : t2 > i3 ? 1 : 0;
12323         }
12324         var r = function(t2) {
12325           void 0 === t2 && (t2 = 9), this._maxEntries = Math.max(4, t2), this._minEntries = Math.max(2, Math.ceil(0.4 * this._maxEntries)), this.clear();
12326         };
12327         function e(t2, i3, n3) {
12328           if (!n3)
12329             return i3.indexOf(t2);
12330           for (var r2 = 0; r2 < i3.length; r2++)
12331             if (n3(t2, i3[r2]))
12332               return r2;
12333           return -1;
12334         }
12335         function a(t2, i3) {
12336           h(t2, 0, t2.children.length, i3, t2);
12337         }
12338         function h(t2, i3, n3, r2, e3) {
12339           e3 || (e3 = p(null)), e3.minX = 1 / 0, e3.minY = 1 / 0, e3.maxX = -1 / 0, e3.maxY = -1 / 0;
12340           for (var a2 = i3; a2 < n3; a2++) {
12341             var h2 = t2.children[a2];
12342             o(e3, t2.leaf ? r2(h2) : h2);
12343           }
12344           return e3;
12345         }
12346         function o(t2, i3) {
12347           return t2.minX = Math.min(t2.minX, i3.minX), t2.minY = Math.min(t2.minY, i3.minY), t2.maxX = Math.max(t2.maxX, i3.maxX), t2.maxY = Math.max(t2.maxY, i3.maxY), t2;
12348         }
12349         function s(t2, i3) {
12350           return t2.minX - i3.minX;
12351         }
12352         function l(t2, i3) {
12353           return t2.minY - i3.minY;
12354         }
12355         function f2(t2) {
12356           return (t2.maxX - t2.minX) * (t2.maxY - t2.minY);
12357         }
12358         function u(t2) {
12359           return t2.maxX - t2.minX + (t2.maxY - t2.minY);
12360         }
12361         function m(t2, i3) {
12362           return t2.minX <= i3.minX && t2.minY <= i3.minY && i3.maxX <= t2.maxX && i3.maxY <= t2.maxY;
12363         }
12364         function c(t2, i3) {
12365           return i3.minX <= t2.maxX && i3.minY <= t2.maxY && i3.maxX >= t2.minX && i3.maxY >= t2.minY;
12366         }
12367         function p(t2) {
12368           return { children: t2, height: 1, leaf: true, minX: 1 / 0, minY: 1 / 0, maxX: -1 / 0, maxY: -1 / 0 };
12369         }
12370         function d(i3, n3, r2, e3, a2) {
12371           for (var h2 = [n3, r2]; h2.length; )
12372             if (!((r2 = h2.pop()) - (n3 = h2.pop()) <= e3)) {
12373               var o2 = n3 + Math.ceil((r2 - n3) / e3 / 2) * e3;
12374               t(i3, o2, n3, r2, a2), h2.push(n3, o2, o2, r2);
12375             }
12376         }
12377         return r.prototype.all = function() {
12378           return this._all(this.data, []);
12379         }, r.prototype.search = function(t2) {
12380           var i3 = this.data, n3 = [];
12381           if (!c(t2, i3))
12382             return n3;
12383           for (var r2 = this.toBBox, e3 = []; i3; ) {
12384             for (var a2 = 0; a2 < i3.children.length; a2++) {
12385               var h2 = i3.children[a2], o2 = i3.leaf ? r2(h2) : h2;
12386               c(t2, o2) && (i3.leaf ? n3.push(h2) : m(t2, o2) ? this._all(h2, n3) : e3.push(h2));
12387             }
12388             i3 = e3.pop();
12389           }
12390           return n3;
12391         }, r.prototype.collides = function(t2) {
12392           var i3 = this.data;
12393           if (!c(t2, i3))
12394             return false;
12395           for (var n3 = []; i3; ) {
12396             for (var r2 = 0; r2 < i3.children.length; r2++) {
12397               var e3 = i3.children[r2], a2 = i3.leaf ? this.toBBox(e3) : e3;
12398               if (c(t2, a2)) {
12399                 if (i3.leaf || m(t2, a2))
12400                   return true;
12401                 n3.push(e3);
12402               }
12403             }
12404             i3 = n3.pop();
12405           }
12406           return false;
12407         }, r.prototype.load = function(t2) {
12408           if (!t2 || !t2.length)
12409             return this;
12410           if (t2.length < this._minEntries) {
12411             for (var i3 = 0; i3 < t2.length; i3++)
12412               this.insert(t2[i3]);
12413             return this;
12414           }
12415           var n3 = this._build(t2.slice(), 0, t2.length - 1, 0);
12416           if (this.data.children.length)
12417             if (this.data.height === n3.height)
12418               this._splitRoot(this.data, n3);
12419             else {
12420               if (this.data.height < n3.height) {
12421                 var r2 = this.data;
12422                 this.data = n3, n3 = r2;
12423               }
12424               this._insert(n3, this.data.height - n3.height - 1, true);
12425             }
12426           else
12427             this.data = n3;
12428           return this;
12429         }, r.prototype.insert = function(t2) {
12430           return t2 && this._insert(t2, this.data.height - 1), this;
12431         }, r.prototype.clear = function() {
12432           return this.data = p([]), this;
12433         }, r.prototype.remove = function(t2, i3) {
12434           if (!t2)
12435             return this;
12436           for (var n3, r2, a2, h2 = this.data, o2 = this.toBBox(t2), s2 = [], l2 = []; h2 || s2.length; ) {
12437             if (h2 || (h2 = s2.pop(), r2 = s2[s2.length - 1], n3 = l2.pop(), a2 = true), h2.leaf) {
12438               var f3 = e(t2, h2.children, i3);
12439               if (-1 !== f3)
12440                 return h2.children.splice(f3, 1), s2.push(h2), this._condense(s2), this;
12441             }
12442             a2 || h2.leaf || !m(h2, o2) ? r2 ? (n3++, h2 = r2.children[n3], a2 = false) : h2 = null : (s2.push(h2), l2.push(n3), n3 = 0, r2 = h2, h2 = h2.children[0]);
12443           }
12444           return this;
12445         }, r.prototype.toBBox = function(t2) {
12446           return t2;
12447         }, r.prototype.compareMinX = function(t2, i3) {
12448           return t2.minX - i3.minX;
12449         }, r.prototype.compareMinY = function(t2, i3) {
12450           return t2.minY - i3.minY;
12451         }, r.prototype.toJSON = function() {
12452           return this.data;
12453         }, r.prototype.fromJSON = function(t2) {
12454           return this.data = t2, this;
12455         }, r.prototype._all = function(t2, i3) {
12456           for (var n3 = []; t2; )
12457             t2.leaf ? i3.push.apply(i3, t2.children) : n3.push.apply(n3, t2.children), t2 = n3.pop();
12458           return i3;
12459         }, r.prototype._build = function(t2, i3, n3, r2) {
12460           var e3, h2 = n3 - i3 + 1, o2 = this._maxEntries;
12461           if (h2 <= o2)
12462             return a(e3 = p(t2.slice(i3, n3 + 1)), this.toBBox), e3;
12463           r2 || (r2 = Math.ceil(Math.log(h2) / Math.log(o2)), o2 = Math.ceil(h2 / Math.pow(o2, r2 - 1))), (e3 = p([])).leaf = false, e3.height = r2;
12464           var s2 = Math.ceil(h2 / o2), l2 = s2 * Math.ceil(Math.sqrt(o2));
12465           d(t2, i3, n3, l2, this.compareMinX);
12466           for (var f3 = i3; f3 <= n3; f3 += l2) {
12467             var u2 = Math.min(f3 + l2 - 1, n3);
12468             d(t2, f3, u2, s2, this.compareMinY);
12469             for (var m2 = f3; m2 <= u2; m2 += s2) {
12470               var c2 = Math.min(m2 + s2 - 1, u2);
12471               e3.children.push(this._build(t2, m2, c2, r2 - 1));
12472             }
12473           }
12474           return a(e3, this.toBBox), e3;
12475         }, r.prototype._chooseSubtree = function(t2, i3, n3, r2) {
12476           for (; r2.push(i3), !i3.leaf && r2.length - 1 !== n3; ) {
12477             for (var e3 = 1 / 0, a2 = 1 / 0, h2 = void 0, o2 = 0; o2 < i3.children.length; o2++) {
12478               var s2 = i3.children[o2], l2 = f2(s2), u2 = (m2 = t2, c2 = s2, (Math.max(c2.maxX, m2.maxX) - Math.min(c2.minX, m2.minX)) * (Math.max(c2.maxY, m2.maxY) - Math.min(c2.minY, m2.minY)) - l2);
12479               u2 < a2 ? (a2 = u2, e3 = l2 < e3 ? l2 : e3, h2 = s2) : u2 === a2 && l2 < e3 && (e3 = l2, h2 = s2);
12480             }
12481             i3 = h2 || i3.children[0];
12482           }
12483           var m2, c2;
12484           return i3;
12485         }, r.prototype._insert = function(t2, i3, n3) {
12486           var r2 = n3 ? t2 : this.toBBox(t2), e3 = [], a2 = this._chooseSubtree(r2, this.data, i3, e3);
12487           for (a2.children.push(t2), o(a2, r2); i3 >= 0 && e3[i3].children.length > this._maxEntries; )
12488             this._split(e3, i3), i3--;
12489           this._adjustParentBBoxes(r2, e3, i3);
12490         }, r.prototype._split = function(t2, i3) {
12491           var n3 = t2[i3], r2 = n3.children.length, e3 = this._minEntries;
12492           this._chooseSplitAxis(n3, e3, r2);
12493           var h2 = this._chooseSplitIndex(n3, e3, r2), o2 = p(n3.children.splice(h2, n3.children.length - h2));
12494           o2.height = n3.height, o2.leaf = n3.leaf, a(n3, this.toBBox), a(o2, this.toBBox), i3 ? t2[i3 - 1].children.push(o2) : this._splitRoot(n3, o2);
12495         }, r.prototype._splitRoot = function(t2, i3) {
12496           this.data = p([t2, i3]), this.data.height = t2.height + 1, this.data.leaf = false, a(this.data, this.toBBox);
12497         }, r.prototype._chooseSplitIndex = function(t2, i3, n3) {
12498           for (var r2, e3, a2, o2, s2, l2, u2, m2 = 1 / 0, c2 = 1 / 0, p2 = i3; p2 <= n3 - i3; p2++) {
12499             var d2 = h(t2, 0, p2, this.toBBox), x = h(t2, p2, n3, this.toBBox), v = (e3 = d2, a2 = x, o2 = void 0, s2 = void 0, l2 = void 0, u2 = void 0, o2 = Math.max(e3.minX, a2.minX), s2 = Math.max(e3.minY, a2.minY), l2 = Math.min(e3.maxX, a2.maxX), u2 = Math.min(e3.maxY, a2.maxY), Math.max(0, l2 - o2) * Math.max(0, u2 - s2)), M = f2(d2) + f2(x);
12500             v < m2 ? (m2 = v, r2 = p2, c2 = M < c2 ? M : c2) : v === m2 && M < c2 && (c2 = M, r2 = p2);
12501           }
12502           return r2 || n3 - i3;
12503         }, r.prototype._chooseSplitAxis = function(t2, i3, n3) {
12504           var r2 = t2.leaf ? this.compareMinX : s, e3 = t2.leaf ? this.compareMinY : l;
12505           this._allDistMargin(t2, i3, n3, r2) < this._allDistMargin(t2, i3, n3, e3) && t2.children.sort(r2);
12506         }, r.prototype._allDistMargin = function(t2, i3, n3, r2) {
12507           t2.children.sort(r2);
12508           for (var e3 = this.toBBox, a2 = h(t2, 0, i3, e3), s2 = h(t2, n3 - i3, n3, e3), l2 = u(a2) + u(s2), f3 = i3; f3 < n3 - i3; f3++) {
12509             var m2 = t2.children[f3];
12510             o(a2, t2.leaf ? e3(m2) : m2), l2 += u(a2);
12511           }
12512           for (var c2 = n3 - i3 - 1; c2 >= i3; c2--) {
12513             var p2 = t2.children[c2];
12514             o(s2, t2.leaf ? e3(p2) : p2), l2 += u(s2);
12515           }
12516           return l2;
12517         }, r.prototype._adjustParentBBoxes = function(t2, i3, n3) {
12518           for (var r2 = n3; r2 >= 0; r2--)
12519             o(i3[r2], t2);
12520         }, r.prototype._condense = function(t2) {
12521           for (var i3 = t2.length - 1, n3 = void 0; i3 >= 0; i3--)
12522             0 === t2[i3].children.length ? i3 > 0 ? (n3 = t2[i3 - 1].children).splice(n3.indexOf(t2[i3]), 1) : this.clear() : a(t2[i3], this.toBBox);
12523         }, r;
12524       });
12525     }
12526   });
12527
12528   // node_modules/ieee754/index.js
12529   var require_ieee754 = __commonJS({
12530     "node_modules/ieee754/index.js"(exports2) {
12531       exports2.read = function(buffer, offset, isLE, mLen, nBytes) {
12532         var e, m;
12533         var eLen = nBytes * 8 - mLen - 1;
12534         var eMax = (1 << eLen) - 1;
12535         var eBias = eMax >> 1;
12536         var nBits = -7;
12537         var i2 = isLE ? nBytes - 1 : 0;
12538         var d = isLE ? -1 : 1;
12539         var s = buffer[offset + i2];
12540         i2 += d;
12541         e = s & (1 << -nBits) - 1;
12542         s >>= -nBits;
12543         nBits += eLen;
12544         for (; nBits > 0; e = e * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
12545         }
12546         m = e & (1 << -nBits) - 1;
12547         e >>= -nBits;
12548         nBits += mLen;
12549         for (; nBits > 0; m = m * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
12550         }
12551         if (e === 0) {
12552           e = 1 - eBias;
12553         } else if (e === eMax) {
12554           return m ? NaN : (s ? -1 : 1) * Infinity;
12555         } else {
12556           m = m + Math.pow(2, mLen);
12557           e = e - eBias;
12558         }
12559         return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
12560       };
12561       exports2.write = function(buffer, value, offset, isLE, mLen, nBytes) {
12562         var e, m, c;
12563         var eLen = nBytes * 8 - mLen - 1;
12564         var eMax = (1 << eLen) - 1;
12565         var eBias = eMax >> 1;
12566         var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
12567         var i2 = isLE ? 0 : nBytes - 1;
12568         var d = isLE ? 1 : -1;
12569         var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
12570         value = Math.abs(value);
12571         if (isNaN(value) || value === Infinity) {
12572           m = isNaN(value) ? 1 : 0;
12573           e = eMax;
12574         } else {
12575           e = Math.floor(Math.log(value) / Math.LN2);
12576           if (value * (c = Math.pow(2, -e)) < 1) {
12577             e--;
12578             c *= 2;
12579           }
12580           if (e + eBias >= 1) {
12581             value += rt / c;
12582           } else {
12583             value += rt * Math.pow(2, 1 - eBias);
12584           }
12585           if (value * c >= 2) {
12586             e++;
12587             c /= 2;
12588           }
12589           if (e + eBias >= eMax) {
12590             m = 0;
12591             e = eMax;
12592           } else if (e + eBias >= 1) {
12593             m = (value * c - 1) * Math.pow(2, mLen);
12594             e = e + eBias;
12595           } else {
12596             m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
12597             e = 0;
12598           }
12599         }
12600         for (; mLen >= 8; buffer[offset + i2] = m & 255, i2 += d, m /= 256, mLen -= 8) {
12601         }
12602         e = e << mLen | m;
12603         eLen += mLen;
12604         for (; eLen > 0; buffer[offset + i2] = e & 255, i2 += d, e /= 256, eLen -= 8) {
12605         }
12606         buffer[offset + i2 - d] |= s * 128;
12607       };
12608     }
12609   });
12610
12611   // node_modules/pbf/index.js
12612   var require_pbf = __commonJS({
12613     "node_modules/pbf/index.js"(exports2, module2) {
12614       "use strict";
12615       module2.exports = Pbf;
12616       var ieee754 = require_ieee754();
12617       function Pbf(buf) {
12618         this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
12619         this.pos = 0;
12620         this.type = 0;
12621         this.length = this.buf.length;
12622       }
12623       Pbf.Varint = 0;
12624       Pbf.Fixed64 = 1;
12625       Pbf.Bytes = 2;
12626       Pbf.Fixed32 = 5;
12627       var SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
12628       var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
12629       var TEXT_DECODER_MIN_LENGTH = 12;
12630       var utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf8");
12631       Pbf.prototype = {
12632         destroy: function() {
12633           this.buf = null;
12634         },
12635         // === READING =================================================================
12636         readFields: function(readField, result, end) {
12637           end = end || this.length;
12638           while (this.pos < end) {
12639             var val = this.readVarint(), tag = val >> 3, startPos = this.pos;
12640             this.type = val & 7;
12641             readField(tag, result, this);
12642             if (this.pos === startPos)
12643               this.skip(val);
12644           }
12645           return result;
12646         },
12647         readMessage: function(readField, result) {
12648           return this.readFields(readField, result, this.readVarint() + this.pos);
12649         },
12650         readFixed32: function() {
12651           var val = readUInt32(this.buf, this.pos);
12652           this.pos += 4;
12653           return val;
12654         },
12655         readSFixed32: function() {
12656           var val = readInt32(this.buf, this.pos);
12657           this.pos += 4;
12658           return val;
12659         },
12660         // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
12661         readFixed64: function() {
12662           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
12663           this.pos += 8;
12664           return val;
12665         },
12666         readSFixed64: function() {
12667           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
12668           this.pos += 8;
12669           return val;
12670         },
12671         readFloat: function() {
12672           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
12673           this.pos += 4;
12674           return val;
12675         },
12676         readDouble: function() {
12677           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
12678           this.pos += 8;
12679           return val;
12680         },
12681         readVarint: function(isSigned) {
12682           var buf = this.buf, val, b;
12683           b = buf[this.pos++];
12684           val = b & 127;
12685           if (b < 128)
12686             return val;
12687           b = buf[this.pos++];
12688           val |= (b & 127) << 7;
12689           if (b < 128)
12690             return val;
12691           b = buf[this.pos++];
12692           val |= (b & 127) << 14;
12693           if (b < 128)
12694             return val;
12695           b = buf[this.pos++];
12696           val |= (b & 127) << 21;
12697           if (b < 128)
12698             return val;
12699           b = buf[this.pos];
12700           val |= (b & 15) << 28;
12701           return readVarintRemainder(val, isSigned, this);
12702         },
12703         readVarint64: function() {
12704           return this.readVarint(true);
12705         },
12706         readSVarint: function() {
12707           var num = this.readVarint();
12708           return num % 2 === 1 ? (num + 1) / -2 : num / 2;
12709         },
12710         readBoolean: function() {
12711           return Boolean(this.readVarint());
12712         },
12713         readString: function() {
12714           var end = this.readVarint() + this.pos;
12715           var pos = this.pos;
12716           this.pos = end;
12717           if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
12718             return readUtf8TextDecoder(this.buf, pos, end);
12719           }
12720           return readUtf8(this.buf, pos, end);
12721         },
12722         readBytes: function() {
12723           var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end);
12724           this.pos = end;
12725           return buffer;
12726         },
12727         // verbose for performance reasons; doesn't affect gzipped size
12728         readPackedVarint: function(arr, isSigned) {
12729           if (this.type !== Pbf.Bytes)
12730             return arr.push(this.readVarint(isSigned));
12731           var end = readPackedEnd(this);
12732           arr = arr || [];
12733           while (this.pos < end)
12734             arr.push(this.readVarint(isSigned));
12735           return arr;
12736         },
12737         readPackedSVarint: function(arr) {
12738           if (this.type !== Pbf.Bytes)
12739             return arr.push(this.readSVarint());
12740           var end = readPackedEnd(this);
12741           arr = arr || [];
12742           while (this.pos < end)
12743             arr.push(this.readSVarint());
12744           return arr;
12745         },
12746         readPackedBoolean: function(arr) {
12747           if (this.type !== Pbf.Bytes)
12748             return arr.push(this.readBoolean());
12749           var end = readPackedEnd(this);
12750           arr = arr || [];
12751           while (this.pos < end)
12752             arr.push(this.readBoolean());
12753           return arr;
12754         },
12755         readPackedFloat: function(arr) {
12756           if (this.type !== Pbf.Bytes)
12757             return arr.push(this.readFloat());
12758           var end = readPackedEnd(this);
12759           arr = arr || [];
12760           while (this.pos < end)
12761             arr.push(this.readFloat());
12762           return arr;
12763         },
12764         readPackedDouble: function(arr) {
12765           if (this.type !== Pbf.Bytes)
12766             return arr.push(this.readDouble());
12767           var end = readPackedEnd(this);
12768           arr = arr || [];
12769           while (this.pos < end)
12770             arr.push(this.readDouble());
12771           return arr;
12772         },
12773         readPackedFixed32: function(arr) {
12774           if (this.type !== Pbf.Bytes)
12775             return arr.push(this.readFixed32());
12776           var end = readPackedEnd(this);
12777           arr = arr || [];
12778           while (this.pos < end)
12779             arr.push(this.readFixed32());
12780           return arr;
12781         },
12782         readPackedSFixed32: function(arr) {
12783           if (this.type !== Pbf.Bytes)
12784             return arr.push(this.readSFixed32());
12785           var end = readPackedEnd(this);
12786           arr = arr || [];
12787           while (this.pos < end)
12788             arr.push(this.readSFixed32());
12789           return arr;
12790         },
12791         readPackedFixed64: function(arr) {
12792           if (this.type !== Pbf.Bytes)
12793             return arr.push(this.readFixed64());
12794           var end = readPackedEnd(this);
12795           arr = arr || [];
12796           while (this.pos < end)
12797             arr.push(this.readFixed64());
12798           return arr;
12799         },
12800         readPackedSFixed64: function(arr) {
12801           if (this.type !== Pbf.Bytes)
12802             return arr.push(this.readSFixed64());
12803           var end = readPackedEnd(this);
12804           arr = arr || [];
12805           while (this.pos < end)
12806             arr.push(this.readSFixed64());
12807           return arr;
12808         },
12809         skip: function(val) {
12810           var type2 = val & 7;
12811           if (type2 === Pbf.Varint)
12812             while (this.buf[this.pos++] > 127) {
12813             }
12814           else if (type2 === Pbf.Bytes)
12815             this.pos = this.readVarint() + this.pos;
12816           else if (type2 === Pbf.Fixed32)
12817             this.pos += 4;
12818           else if (type2 === Pbf.Fixed64)
12819             this.pos += 8;
12820           else
12821             throw new Error("Unimplemented type: " + type2);
12822         },
12823         // === WRITING =================================================================
12824         writeTag: function(tag, type2) {
12825           this.writeVarint(tag << 3 | type2);
12826         },
12827         realloc: function(min3) {
12828           var length = this.length || 16;
12829           while (length < this.pos + min3)
12830             length *= 2;
12831           if (length !== this.length) {
12832             var buf = new Uint8Array(length);
12833             buf.set(this.buf);
12834             this.buf = buf;
12835             this.length = length;
12836           }
12837         },
12838         finish: function() {
12839           this.length = this.pos;
12840           this.pos = 0;
12841           return this.buf.subarray(0, this.length);
12842         },
12843         writeFixed32: function(val) {
12844           this.realloc(4);
12845           writeInt32(this.buf, val, this.pos);
12846           this.pos += 4;
12847         },
12848         writeSFixed32: function(val) {
12849           this.realloc(4);
12850           writeInt32(this.buf, val, this.pos);
12851           this.pos += 4;
12852         },
12853         writeFixed64: function(val) {
12854           this.realloc(8);
12855           writeInt32(this.buf, val & -1, this.pos);
12856           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
12857           this.pos += 8;
12858         },
12859         writeSFixed64: function(val) {
12860           this.realloc(8);
12861           writeInt32(this.buf, val & -1, this.pos);
12862           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
12863           this.pos += 8;
12864         },
12865         writeVarint: function(val) {
12866           val = +val || 0;
12867           if (val > 268435455 || val < 0) {
12868             writeBigVarint(val, this);
12869             return;
12870           }
12871           this.realloc(4);
12872           this.buf[this.pos++] = val & 127 | (val > 127 ? 128 : 0);
12873           if (val <= 127)
12874             return;
12875           this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0);
12876           if (val <= 127)
12877             return;
12878           this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0);
12879           if (val <= 127)
12880             return;
12881           this.buf[this.pos++] = val >>> 7 & 127;
12882         },
12883         writeSVarint: function(val) {
12884           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
12885         },
12886         writeBoolean: function(val) {
12887           this.writeVarint(Boolean(val));
12888         },
12889         writeString: function(str2) {
12890           str2 = String(str2);
12891           this.realloc(str2.length * 4);
12892           this.pos++;
12893           var startPos = this.pos;
12894           this.pos = writeUtf8(this.buf, str2, this.pos);
12895           var len = this.pos - startPos;
12896           if (len >= 128)
12897             makeRoomForExtraLength(startPos, len, this);
12898           this.pos = startPos - 1;
12899           this.writeVarint(len);
12900           this.pos += len;
12901         },
12902         writeFloat: function(val) {
12903           this.realloc(4);
12904           ieee754.write(this.buf, val, this.pos, true, 23, 4);
12905           this.pos += 4;
12906         },
12907         writeDouble: function(val) {
12908           this.realloc(8);
12909           ieee754.write(this.buf, val, this.pos, true, 52, 8);
12910           this.pos += 8;
12911         },
12912         writeBytes: function(buffer) {
12913           var len = buffer.length;
12914           this.writeVarint(len);
12915           this.realloc(len);
12916           for (var i2 = 0; i2 < len; i2++)
12917             this.buf[this.pos++] = buffer[i2];
12918         },
12919         writeRawMessage: function(fn, obj) {
12920           this.pos++;
12921           var startPos = this.pos;
12922           fn(obj, this);
12923           var len = this.pos - startPos;
12924           if (len >= 128)
12925             makeRoomForExtraLength(startPos, len, this);
12926           this.pos = startPos - 1;
12927           this.writeVarint(len);
12928           this.pos += len;
12929         },
12930         writeMessage: function(tag, fn, obj) {
12931           this.writeTag(tag, Pbf.Bytes);
12932           this.writeRawMessage(fn, obj);
12933         },
12934         writePackedVarint: function(tag, arr) {
12935           if (arr.length)
12936             this.writeMessage(tag, writePackedVarint, arr);
12937         },
12938         writePackedSVarint: function(tag, arr) {
12939           if (arr.length)
12940             this.writeMessage(tag, writePackedSVarint, arr);
12941         },
12942         writePackedBoolean: function(tag, arr) {
12943           if (arr.length)
12944             this.writeMessage(tag, writePackedBoolean, arr);
12945         },
12946         writePackedFloat: function(tag, arr) {
12947           if (arr.length)
12948             this.writeMessage(tag, writePackedFloat, arr);
12949         },
12950         writePackedDouble: function(tag, arr) {
12951           if (arr.length)
12952             this.writeMessage(tag, writePackedDouble, arr);
12953         },
12954         writePackedFixed32: function(tag, arr) {
12955           if (arr.length)
12956             this.writeMessage(tag, writePackedFixed32, arr);
12957         },
12958         writePackedSFixed32: function(tag, arr) {
12959           if (arr.length)
12960             this.writeMessage(tag, writePackedSFixed32, arr);
12961         },
12962         writePackedFixed64: function(tag, arr) {
12963           if (arr.length)
12964             this.writeMessage(tag, writePackedFixed64, arr);
12965         },
12966         writePackedSFixed64: function(tag, arr) {
12967           if (arr.length)
12968             this.writeMessage(tag, writePackedSFixed64, arr);
12969         },
12970         writeBytesField: function(tag, buffer) {
12971           this.writeTag(tag, Pbf.Bytes);
12972           this.writeBytes(buffer);
12973         },
12974         writeFixed32Field: function(tag, val) {
12975           this.writeTag(tag, Pbf.Fixed32);
12976           this.writeFixed32(val);
12977         },
12978         writeSFixed32Field: function(tag, val) {
12979           this.writeTag(tag, Pbf.Fixed32);
12980           this.writeSFixed32(val);
12981         },
12982         writeFixed64Field: function(tag, val) {
12983           this.writeTag(tag, Pbf.Fixed64);
12984           this.writeFixed64(val);
12985         },
12986         writeSFixed64Field: function(tag, val) {
12987           this.writeTag(tag, Pbf.Fixed64);
12988           this.writeSFixed64(val);
12989         },
12990         writeVarintField: function(tag, val) {
12991           this.writeTag(tag, Pbf.Varint);
12992           this.writeVarint(val);
12993         },
12994         writeSVarintField: function(tag, val) {
12995           this.writeTag(tag, Pbf.Varint);
12996           this.writeSVarint(val);
12997         },
12998         writeStringField: function(tag, str2) {
12999           this.writeTag(tag, Pbf.Bytes);
13000           this.writeString(str2);
13001         },
13002         writeFloatField: function(tag, val) {
13003           this.writeTag(tag, Pbf.Fixed32);
13004           this.writeFloat(val);
13005         },
13006         writeDoubleField: function(tag, val) {
13007           this.writeTag(tag, Pbf.Fixed64);
13008           this.writeDouble(val);
13009         },
13010         writeBooleanField: function(tag, val) {
13011           this.writeVarintField(tag, Boolean(val));
13012         }
13013       };
13014       function readVarintRemainder(l, s, p) {
13015         var buf = p.buf, h, b;
13016         b = buf[p.pos++];
13017         h = (b & 112) >> 4;
13018         if (b < 128)
13019           return toNum(l, h, s);
13020         b = buf[p.pos++];
13021         h |= (b & 127) << 3;
13022         if (b < 128)
13023           return toNum(l, h, s);
13024         b = buf[p.pos++];
13025         h |= (b & 127) << 10;
13026         if (b < 128)
13027           return toNum(l, h, s);
13028         b = buf[p.pos++];
13029         h |= (b & 127) << 17;
13030         if (b < 128)
13031           return toNum(l, h, s);
13032         b = buf[p.pos++];
13033         h |= (b & 127) << 24;
13034         if (b < 128)
13035           return toNum(l, h, s);
13036         b = buf[p.pos++];
13037         h |= (b & 1) << 31;
13038         if (b < 128)
13039           return toNum(l, h, s);
13040         throw new Error("Expected varint not more than 10 bytes");
13041       }
13042       function readPackedEnd(pbf) {
13043         return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1;
13044       }
13045       function toNum(low, high, isSigned) {
13046         if (isSigned) {
13047           return high * 4294967296 + (low >>> 0);
13048         }
13049         return (high >>> 0) * 4294967296 + (low >>> 0);
13050       }
13051       function writeBigVarint(val, pbf) {
13052         var low, high;
13053         if (val >= 0) {
13054           low = val % 4294967296 | 0;
13055           high = val / 4294967296 | 0;
13056         } else {
13057           low = ~(-val % 4294967296);
13058           high = ~(-val / 4294967296);
13059           if (low ^ 4294967295) {
13060             low = low + 1 | 0;
13061           } else {
13062             low = 0;
13063             high = high + 1 | 0;
13064           }
13065         }
13066         if (val >= 18446744073709552e3 || val < -18446744073709552e3) {
13067           throw new Error("Given varint doesn't fit into 10 bytes");
13068         }
13069         pbf.realloc(10);
13070         writeBigVarintLow(low, high, pbf);
13071         writeBigVarintHigh(high, pbf);
13072       }
13073       function writeBigVarintLow(low, high, pbf) {
13074         pbf.buf[pbf.pos++] = low & 127 | 128;
13075         low >>>= 7;
13076         pbf.buf[pbf.pos++] = low & 127 | 128;
13077         low >>>= 7;
13078         pbf.buf[pbf.pos++] = low & 127 | 128;
13079         low >>>= 7;
13080         pbf.buf[pbf.pos++] = low & 127 | 128;
13081         low >>>= 7;
13082         pbf.buf[pbf.pos] = low & 127;
13083       }
13084       function writeBigVarintHigh(high, pbf) {
13085         var lsb = (high & 7) << 4;
13086         pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 128 : 0);
13087         if (!high)
13088           return;
13089         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13090         if (!high)
13091           return;
13092         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13093         if (!high)
13094           return;
13095         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13096         if (!high)
13097           return;
13098         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13099         if (!high)
13100           return;
13101         pbf.buf[pbf.pos++] = high & 127;
13102       }
13103       function makeRoomForExtraLength(startPos, len, pbf) {
13104         var extraLen = len <= 16383 ? 1 : len <= 2097151 ? 2 : len <= 268435455 ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
13105         pbf.realloc(extraLen);
13106         for (var i2 = pbf.pos - 1; i2 >= startPos; i2--)
13107           pbf.buf[i2 + extraLen] = pbf.buf[i2];
13108       }
13109       function writePackedVarint(arr, pbf) {
13110         for (var i2 = 0; i2 < arr.length; i2++)
13111           pbf.writeVarint(arr[i2]);
13112       }
13113       function writePackedSVarint(arr, pbf) {
13114         for (var i2 = 0; i2 < arr.length; i2++)
13115           pbf.writeSVarint(arr[i2]);
13116       }
13117       function writePackedFloat(arr, pbf) {
13118         for (var i2 = 0; i2 < arr.length; i2++)
13119           pbf.writeFloat(arr[i2]);
13120       }
13121       function writePackedDouble(arr, pbf) {
13122         for (var i2 = 0; i2 < arr.length; i2++)
13123           pbf.writeDouble(arr[i2]);
13124       }
13125       function writePackedBoolean(arr, pbf) {
13126         for (var i2 = 0; i2 < arr.length; i2++)
13127           pbf.writeBoolean(arr[i2]);
13128       }
13129       function writePackedFixed32(arr, pbf) {
13130         for (var i2 = 0; i2 < arr.length; i2++)
13131           pbf.writeFixed32(arr[i2]);
13132       }
13133       function writePackedSFixed32(arr, pbf) {
13134         for (var i2 = 0; i2 < arr.length; i2++)
13135           pbf.writeSFixed32(arr[i2]);
13136       }
13137       function writePackedFixed64(arr, pbf) {
13138         for (var i2 = 0; i2 < arr.length; i2++)
13139           pbf.writeFixed64(arr[i2]);
13140       }
13141       function writePackedSFixed64(arr, pbf) {
13142         for (var i2 = 0; i2 < arr.length; i2++)
13143           pbf.writeSFixed64(arr[i2]);
13144       }
13145       function readUInt32(buf, pos) {
13146         return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 16777216;
13147       }
13148       function writeInt32(buf, val, pos) {
13149         buf[pos] = val;
13150         buf[pos + 1] = val >>> 8;
13151         buf[pos + 2] = val >>> 16;
13152         buf[pos + 3] = val >>> 24;
13153       }
13154       function readInt32(buf, pos) {
13155         return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + (buf[pos + 3] << 24);
13156       }
13157       function readUtf8(buf, pos, end) {
13158         var str2 = "";
13159         var i2 = pos;
13160         while (i2 < end) {
13161           var b0 = buf[i2];
13162           var c = null;
13163           var bytesPerSequence = b0 > 239 ? 4 : b0 > 223 ? 3 : b0 > 191 ? 2 : 1;
13164           if (i2 + bytesPerSequence > end)
13165             break;
13166           var b1, b2, b3;
13167           if (bytesPerSequence === 1) {
13168             if (b0 < 128) {
13169               c = b0;
13170             }
13171           } else if (bytesPerSequence === 2) {
13172             b1 = buf[i2 + 1];
13173             if ((b1 & 192) === 128) {
13174               c = (b0 & 31) << 6 | b1 & 63;
13175               if (c <= 127) {
13176                 c = null;
13177               }
13178             }
13179           } else if (bytesPerSequence === 3) {
13180             b1 = buf[i2 + 1];
13181             b2 = buf[i2 + 2];
13182             if ((b1 & 192) === 128 && (b2 & 192) === 128) {
13183               c = (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63;
13184               if (c <= 2047 || c >= 55296 && c <= 57343) {
13185                 c = null;
13186               }
13187             }
13188           } else if (bytesPerSequence === 4) {
13189             b1 = buf[i2 + 1];
13190             b2 = buf[i2 + 2];
13191             b3 = buf[i2 + 3];
13192             if ((b1 & 192) === 128 && (b2 & 192) === 128 && (b3 & 192) === 128) {
13193               c = (b0 & 15) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63;
13194               if (c <= 65535 || c >= 1114112) {
13195                 c = null;
13196               }
13197             }
13198           }
13199           if (c === null) {
13200             c = 65533;
13201             bytesPerSequence = 1;
13202           } else if (c > 65535) {
13203             c -= 65536;
13204             str2 += String.fromCharCode(c >>> 10 & 1023 | 55296);
13205             c = 56320 | c & 1023;
13206           }
13207           str2 += String.fromCharCode(c);
13208           i2 += bytesPerSequence;
13209         }
13210         return str2;
13211       }
13212       function readUtf8TextDecoder(buf, pos, end) {
13213         return utf8TextDecoder.decode(buf.subarray(pos, end));
13214       }
13215       function writeUtf8(buf, str2, pos) {
13216         for (var i2 = 0, c, lead; i2 < str2.length; i2++) {
13217           c = str2.charCodeAt(i2);
13218           if (c > 55295 && c < 57344) {
13219             if (lead) {
13220               if (c < 56320) {
13221                 buf[pos++] = 239;
13222                 buf[pos++] = 191;
13223                 buf[pos++] = 189;
13224                 lead = c;
13225                 continue;
13226               } else {
13227                 c = lead - 55296 << 10 | c - 56320 | 65536;
13228                 lead = null;
13229               }
13230             } else {
13231               if (c > 56319 || i2 + 1 === str2.length) {
13232                 buf[pos++] = 239;
13233                 buf[pos++] = 191;
13234                 buf[pos++] = 189;
13235               } else {
13236                 lead = c;
13237               }
13238               continue;
13239             }
13240           } else if (lead) {
13241             buf[pos++] = 239;
13242             buf[pos++] = 191;
13243             buf[pos++] = 189;
13244             lead = null;
13245           }
13246           if (c < 128) {
13247             buf[pos++] = c;
13248           } else {
13249             if (c < 2048) {
13250               buf[pos++] = c >> 6 | 192;
13251             } else {
13252               if (c < 65536) {
13253                 buf[pos++] = c >> 12 | 224;
13254               } else {
13255                 buf[pos++] = c >> 18 | 240;
13256                 buf[pos++] = c >> 12 & 63 | 128;
13257               }
13258               buf[pos++] = c >> 6 & 63 | 128;
13259             }
13260             buf[pos++] = c & 63 | 128;
13261           }
13262         }
13263         return pos;
13264       }
13265     }
13266   });
13267
13268   // node_modules/@mapbox/point-geometry/index.js
13269   var require_point_geometry = __commonJS({
13270     "node_modules/@mapbox/point-geometry/index.js"(exports2, module2) {
13271       "use strict";
13272       module2.exports = Point;
13273       function Point(x, y) {
13274         this.x = x;
13275         this.y = y;
13276       }
13277       Point.prototype = {
13278         /**
13279          * Clone this point, returning a new point that can be modified
13280          * without affecting the old one.
13281          * @return {Point} the clone
13282          */
13283         clone: function() {
13284           return new Point(this.x, this.y);
13285         },
13286         /**
13287          * Add this point's x & y coordinates to another point,
13288          * yielding a new point.
13289          * @param {Point} p the other point
13290          * @return {Point} output point
13291          */
13292         add: function(p) {
13293           return this.clone()._add(p);
13294         },
13295         /**
13296          * Subtract this point's x & y coordinates to from point,
13297          * yielding a new point.
13298          * @param {Point} p the other point
13299          * @return {Point} output point
13300          */
13301         sub: function(p) {
13302           return this.clone()._sub(p);
13303         },
13304         /**
13305          * Multiply this point's x & y coordinates by point,
13306          * yielding a new point.
13307          * @param {Point} p the other point
13308          * @return {Point} output point
13309          */
13310         multByPoint: function(p) {
13311           return this.clone()._multByPoint(p);
13312         },
13313         /**
13314          * Divide this point's x & y coordinates by point,
13315          * yielding a new point.
13316          * @param {Point} p the other point
13317          * @return {Point} output point
13318          */
13319         divByPoint: function(p) {
13320           return this.clone()._divByPoint(p);
13321         },
13322         /**
13323          * Multiply this point's x & y coordinates by a factor,
13324          * yielding a new point.
13325          * @param {Point} k factor
13326          * @return {Point} output point
13327          */
13328         mult: function(k) {
13329           return this.clone()._mult(k);
13330         },
13331         /**
13332          * Divide this point's x & y coordinates by a factor,
13333          * yielding a new point.
13334          * @param {Point} k factor
13335          * @return {Point} output point
13336          */
13337         div: function(k) {
13338           return this.clone()._div(k);
13339         },
13340         /**
13341          * Rotate this point around the 0, 0 origin by an angle a,
13342          * given in radians
13343          * @param {Number} a angle to rotate around, in radians
13344          * @return {Point} output point
13345          */
13346         rotate: function(a) {
13347           return this.clone()._rotate(a);
13348         },
13349         /**
13350          * Rotate this point around p point by an angle a,
13351          * given in radians
13352          * @param {Number} a angle to rotate around, in radians
13353          * @param {Point} p Point to rotate around
13354          * @return {Point} output point
13355          */
13356         rotateAround: function(a, p) {
13357           return this.clone()._rotateAround(a, p);
13358         },
13359         /**
13360          * Multiply this point by a 4x1 transformation matrix
13361          * @param {Array<Number>} m transformation matrix
13362          * @return {Point} output point
13363          */
13364         matMult: function(m) {
13365           return this.clone()._matMult(m);
13366         },
13367         /**
13368          * Calculate this point but as a unit vector from 0, 0, meaning
13369          * that the distance from the resulting point to the 0, 0
13370          * coordinate will be equal to 1 and the angle from the resulting
13371          * point to the 0, 0 coordinate will be the same as before.
13372          * @return {Point} unit vector point
13373          */
13374         unit: function() {
13375           return this.clone()._unit();
13376         },
13377         /**
13378          * Compute a perpendicular point, where the new y coordinate
13379          * is the old x coordinate and the new x coordinate is the old y
13380          * coordinate multiplied by -1
13381          * @return {Point} perpendicular point
13382          */
13383         perp: function() {
13384           return this.clone()._perp();
13385         },
13386         /**
13387          * Return a version of this point with the x & y coordinates
13388          * rounded to integers.
13389          * @return {Point} rounded point
13390          */
13391         round: function() {
13392           return this.clone()._round();
13393         },
13394         /**
13395          * Return the magitude of this point: this is the Euclidean
13396          * distance from the 0, 0 coordinate to this point's x and y
13397          * coordinates.
13398          * @return {Number} magnitude
13399          */
13400         mag: function() {
13401           return Math.sqrt(this.x * this.x + this.y * this.y);
13402         },
13403         /**
13404          * Judge whether this point is equal to another point, returning
13405          * true or false.
13406          * @param {Point} other the other point
13407          * @return {boolean} whether the points are equal
13408          */
13409         equals: function(other) {
13410           return this.x === other.x && this.y === other.y;
13411         },
13412         /**
13413          * Calculate the distance from this point to another point
13414          * @param {Point} p the other point
13415          * @return {Number} distance
13416          */
13417         dist: function(p) {
13418           return Math.sqrt(this.distSqr(p));
13419         },
13420         /**
13421          * Calculate the distance from this point to another point,
13422          * without the square root step. Useful if you're comparing
13423          * relative distances.
13424          * @param {Point} p the other point
13425          * @return {Number} distance
13426          */
13427         distSqr: function(p) {
13428           var dx = p.x - this.x, dy = p.y - this.y;
13429           return dx * dx + dy * dy;
13430         },
13431         /**
13432          * Get the angle from the 0, 0 coordinate to this point, in radians
13433          * coordinates.
13434          * @return {Number} angle
13435          */
13436         angle: function() {
13437           return Math.atan2(this.y, this.x);
13438         },
13439         /**
13440          * Get the angle from this point to another point, in radians
13441          * @param {Point} b the other point
13442          * @return {Number} angle
13443          */
13444         angleTo: function(b) {
13445           return Math.atan2(this.y - b.y, this.x - b.x);
13446         },
13447         /**
13448          * Get the angle between this point and another point, in radians
13449          * @param {Point} b the other point
13450          * @return {Number} angle
13451          */
13452         angleWith: function(b) {
13453           return this.angleWithSep(b.x, b.y);
13454         },
13455         /*
13456          * Find the angle of the two vectors, solving the formula for
13457          * the cross product a x b = |a||b|sin(θ) for θ.
13458          * @param {Number} x the x-coordinate
13459          * @param {Number} y the y-coordinate
13460          * @return {Number} the angle in radians
13461          */
13462         angleWithSep: function(x, y) {
13463           return Math.atan2(
13464             this.x * y - this.y * x,
13465             this.x * x + this.y * y
13466           );
13467         },
13468         _matMult: function(m) {
13469           var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y;
13470           this.x = x;
13471           this.y = y;
13472           return this;
13473         },
13474         _add: function(p) {
13475           this.x += p.x;
13476           this.y += p.y;
13477           return this;
13478         },
13479         _sub: function(p) {
13480           this.x -= p.x;
13481           this.y -= p.y;
13482           return this;
13483         },
13484         _mult: function(k) {
13485           this.x *= k;
13486           this.y *= k;
13487           return this;
13488         },
13489         _div: function(k) {
13490           this.x /= k;
13491           this.y /= k;
13492           return this;
13493         },
13494         _multByPoint: function(p) {
13495           this.x *= p.x;
13496           this.y *= p.y;
13497           return this;
13498         },
13499         _divByPoint: function(p) {
13500           this.x /= p.x;
13501           this.y /= p.y;
13502           return this;
13503         },
13504         _unit: function() {
13505           this._div(this.mag());
13506           return this;
13507         },
13508         _perp: function() {
13509           var y = this.y;
13510           this.y = this.x;
13511           this.x = -y;
13512           return this;
13513         },
13514         _rotate: function(angle2) {
13515           var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = cos2 * this.x - sin2 * this.y, y = sin2 * this.x + cos2 * this.y;
13516           this.x = x;
13517           this.y = y;
13518           return this;
13519         },
13520         _rotateAround: function(angle2, p) {
13521           var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = p.x + cos2 * (this.x - p.x) - sin2 * (this.y - p.y), y = p.y + sin2 * (this.x - p.x) + cos2 * (this.y - p.y);
13522           this.x = x;
13523           this.y = y;
13524           return this;
13525         },
13526         _round: function() {
13527           this.x = Math.round(this.x);
13528           this.y = Math.round(this.y);
13529           return this;
13530         }
13531       };
13532       Point.convert = function(a) {
13533         if (a instanceof Point) {
13534           return a;
13535         }
13536         if (Array.isArray(a)) {
13537           return new Point(a[0], a[1]);
13538         }
13539         return a;
13540       };
13541     }
13542   });
13543
13544   // node_modules/@mapbox/vector-tile/lib/vectortilefeature.js
13545   var require_vectortilefeature = __commonJS({
13546     "node_modules/@mapbox/vector-tile/lib/vectortilefeature.js"(exports2, module2) {
13547       "use strict";
13548       var Point = require_point_geometry();
13549       module2.exports = VectorTileFeature;
13550       function VectorTileFeature(pbf, end, extent, keys, values) {
13551         this.properties = {};
13552         this.extent = extent;
13553         this.type = 0;
13554         this._pbf = pbf;
13555         this._geometry = -1;
13556         this._keys = keys;
13557         this._values = values;
13558         pbf.readFields(readFeature, this, end);
13559       }
13560       function readFeature(tag, feature3, pbf) {
13561         if (tag == 1)
13562           feature3.id = pbf.readVarint();
13563         else if (tag == 2)
13564           readTag(pbf, feature3);
13565         else if (tag == 3)
13566           feature3.type = pbf.readVarint();
13567         else if (tag == 4)
13568           feature3._geometry = pbf.pos;
13569       }
13570       function readTag(pbf, feature3) {
13571         var end = pbf.readVarint() + pbf.pos;
13572         while (pbf.pos < end) {
13573           var key = feature3._keys[pbf.readVarint()], value = feature3._values[pbf.readVarint()];
13574           feature3.properties[key] = value;
13575         }
13576       }
13577       VectorTileFeature.types = ["Unknown", "Point", "LineString", "Polygon"];
13578       VectorTileFeature.prototype.loadGeometry = function() {
13579         var pbf = this._pbf;
13580         pbf.pos = this._geometry;
13581         var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line;
13582         while (pbf.pos < end) {
13583           if (length <= 0) {
13584             var cmdLen = pbf.readVarint();
13585             cmd = cmdLen & 7;
13586             length = cmdLen >> 3;
13587           }
13588           length--;
13589           if (cmd === 1 || cmd === 2) {
13590             x += pbf.readSVarint();
13591             y += pbf.readSVarint();
13592             if (cmd === 1) {
13593               if (line)
13594                 lines.push(line);
13595               line = [];
13596             }
13597             line.push(new Point(x, y));
13598           } else if (cmd === 7) {
13599             if (line) {
13600               line.push(line[0].clone());
13601             }
13602           } else {
13603             throw new Error("unknown command " + cmd);
13604           }
13605         }
13606         if (line)
13607           lines.push(line);
13608         return lines;
13609       };
13610       VectorTileFeature.prototype.bbox = function() {
13611         var pbf = this._pbf;
13612         pbf.pos = this._geometry;
13613         var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x12 = Infinity, x2 = -Infinity, y12 = Infinity, y2 = -Infinity;
13614         while (pbf.pos < end) {
13615           if (length <= 0) {
13616             var cmdLen = pbf.readVarint();
13617             cmd = cmdLen & 7;
13618             length = cmdLen >> 3;
13619           }
13620           length--;
13621           if (cmd === 1 || cmd === 2) {
13622             x += pbf.readSVarint();
13623             y += pbf.readSVarint();
13624             if (x < x12)
13625               x12 = x;
13626             if (x > x2)
13627               x2 = x;
13628             if (y < y12)
13629               y12 = y;
13630             if (y > y2)
13631               y2 = y;
13632           } else if (cmd !== 7) {
13633             throw new Error("unknown command " + cmd);
13634           }
13635         }
13636         return [x12, y12, x2, y2];
13637       };
13638       VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
13639         var size = this.extent * Math.pow(2, z), x05 = this.extent * x, y05 = this.extent * y, coords = this.loadGeometry(), type2 = VectorTileFeature.types[this.type], i2, j2;
13640         function project(line) {
13641           for (var j3 = 0; j3 < line.length; j3++) {
13642             var p = line[j3], y2 = 180 - (p.y + y05) * 360 / size;
13643             line[j3] = [
13644               (p.x + x05) * 360 / size - 180,
13645               360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
13646             ];
13647           }
13648         }
13649         switch (this.type) {
13650           case 1:
13651             var points = [];
13652             for (i2 = 0; i2 < coords.length; i2++) {
13653               points[i2] = coords[i2][0];
13654             }
13655             coords = points;
13656             project(coords);
13657             break;
13658           case 2:
13659             for (i2 = 0; i2 < coords.length; i2++) {
13660               project(coords[i2]);
13661             }
13662             break;
13663           case 3:
13664             coords = classifyRings(coords);
13665             for (i2 = 0; i2 < coords.length; i2++) {
13666               for (j2 = 0; j2 < coords[i2].length; j2++) {
13667                 project(coords[i2][j2]);
13668               }
13669             }
13670             break;
13671         }
13672         if (coords.length === 1) {
13673           coords = coords[0];
13674         } else {
13675           type2 = "Multi" + type2;
13676         }
13677         var result = {
13678           type: "Feature",
13679           geometry: {
13680             type: type2,
13681             coordinates: coords
13682           },
13683           properties: this.properties
13684         };
13685         if ("id" in this) {
13686           result.id = this.id;
13687         }
13688         return result;
13689       };
13690       function classifyRings(rings) {
13691         var len = rings.length;
13692         if (len <= 1)
13693           return [rings];
13694         var polygons = [], polygon2, ccw;
13695         for (var i2 = 0; i2 < len; i2++) {
13696           var area = signedArea(rings[i2]);
13697           if (area === 0)
13698             continue;
13699           if (ccw === void 0)
13700             ccw = area < 0;
13701           if (ccw === area < 0) {
13702             if (polygon2)
13703               polygons.push(polygon2);
13704             polygon2 = [rings[i2]];
13705           } else {
13706             polygon2.push(rings[i2]);
13707           }
13708         }
13709         if (polygon2)
13710           polygons.push(polygon2);
13711         return polygons;
13712       }
13713       function signedArea(ring) {
13714         var sum = 0;
13715         for (var i2 = 0, len = ring.length, j2 = len - 1, p1, p2; i2 < len; j2 = i2++) {
13716           p1 = ring[i2];
13717           p2 = ring[j2];
13718           sum += (p2.x - p1.x) * (p1.y + p2.y);
13719         }
13720         return sum;
13721       }
13722     }
13723   });
13724
13725   // node_modules/@mapbox/vector-tile/lib/vectortilelayer.js
13726   var require_vectortilelayer = __commonJS({
13727     "node_modules/@mapbox/vector-tile/lib/vectortilelayer.js"(exports2, module2) {
13728       "use strict";
13729       var VectorTileFeature = require_vectortilefeature();
13730       module2.exports = VectorTileLayer;
13731       function VectorTileLayer(pbf, end) {
13732         this.version = 1;
13733         this.name = null;
13734         this.extent = 4096;
13735         this.length = 0;
13736         this._pbf = pbf;
13737         this._keys = [];
13738         this._values = [];
13739         this._features = [];
13740         pbf.readFields(readLayer, this, end);
13741         this.length = this._features.length;
13742       }
13743       function readLayer(tag, layer, pbf) {
13744         if (tag === 15)
13745           layer.version = pbf.readVarint();
13746         else if (tag === 1)
13747           layer.name = pbf.readString();
13748         else if (tag === 5)
13749           layer.extent = pbf.readVarint();
13750         else if (tag === 2)
13751           layer._features.push(pbf.pos);
13752         else if (tag === 3)
13753           layer._keys.push(pbf.readString());
13754         else if (tag === 4)
13755           layer._values.push(readValueMessage(pbf));
13756       }
13757       function readValueMessage(pbf) {
13758         var value = null, end = pbf.readVarint() + pbf.pos;
13759         while (pbf.pos < end) {
13760           var tag = pbf.readVarint() >> 3;
13761           value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null;
13762         }
13763         return value;
13764       }
13765       VectorTileLayer.prototype.feature = function(i2) {
13766         if (i2 < 0 || i2 >= this._features.length)
13767           throw new Error("feature index out of bounds");
13768         this._pbf.pos = this._features[i2];
13769         var end = this._pbf.readVarint() + this._pbf.pos;
13770         return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);
13771       };
13772     }
13773   });
13774
13775   // node_modules/@mapbox/vector-tile/lib/vectortile.js
13776   var require_vectortile = __commonJS({
13777     "node_modules/@mapbox/vector-tile/lib/vectortile.js"(exports2, module2) {
13778       "use strict";
13779       var VectorTileLayer = require_vectortilelayer();
13780       module2.exports = VectorTile2;
13781       function VectorTile2(pbf, end) {
13782         this.layers = pbf.readFields(readTile, {}, end);
13783       }
13784       function readTile(tag, layers, pbf) {
13785         if (tag === 3) {
13786           var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);
13787           if (layer.length)
13788             layers[layer.name] = layer;
13789         }
13790       }
13791     }
13792   });
13793
13794   // node_modules/@mapbox/vector-tile/index.js
13795   var require_vector_tile = __commonJS({
13796     "node_modules/@mapbox/vector-tile/index.js"(exports2, module2) {
13797       module2.exports.VectorTile = require_vectortile();
13798       module2.exports.VectorTileFeature = require_vectortilefeature();
13799       module2.exports.VectorTileLayer = require_vectortilelayer();
13800     }
13801   });
13802
13803   // node_modules/fast-json-stable-stringify/index.js
13804   var require_fast_json_stable_stringify = __commonJS({
13805     "node_modules/fast-json-stable-stringify/index.js"(exports2, module2) {
13806       "use strict";
13807       module2.exports = function(data, opts) {
13808         if (!opts)
13809           opts = {};
13810         if (typeof opts === "function")
13811           opts = { cmp: opts };
13812         var cycles = typeof opts.cycles === "boolean" ? opts.cycles : false;
13813         var cmp = opts.cmp && function(f2) {
13814           return function(node) {
13815             return function(a, b) {
13816               var aobj = { key: a, value: node[a] };
13817               var bobj = { key: b, value: node[b] };
13818               return f2(aobj, bobj);
13819             };
13820           };
13821         }(opts.cmp);
13822         var seen = [];
13823         return function stringify3(node) {
13824           if (node && node.toJSON && typeof node.toJSON === "function") {
13825             node = node.toJSON();
13826           }
13827           if (node === void 0)
13828             return;
13829           if (typeof node == "number")
13830             return isFinite(node) ? "" + node : "null";
13831           if (typeof node !== "object")
13832             return JSON.stringify(node);
13833           var i2, out;
13834           if (Array.isArray(node)) {
13835             out = "[";
13836             for (i2 = 0; i2 < node.length; i2++) {
13837               if (i2)
13838                 out += ",";
13839               out += stringify3(node[i2]) || "null";
13840             }
13841             return out + "]";
13842           }
13843           if (node === null)
13844             return "null";
13845           if (seen.indexOf(node) !== -1) {
13846             if (cycles)
13847               return JSON.stringify("__cycle__");
13848             throw new TypeError("Converting circular structure to JSON");
13849           }
13850           var seenIndex = seen.push(node) - 1;
13851           var keys = Object.keys(node).sort(cmp && cmp(node));
13852           out = "";
13853           for (i2 = 0; i2 < keys.length; i2++) {
13854             var key = keys[i2];
13855             var value = stringify3(node[key]);
13856             if (!value)
13857               continue;
13858             if (out)
13859               out += ",";
13860             out += JSON.stringify(key) + ":" + value;
13861           }
13862           seen.splice(seenIndex, 1);
13863           return "{" + out + "}";
13864         }(data);
13865       };
13866     }
13867   });
13868
13869   // node_modules/@mapbox/sexagesimal/index.js
13870   var require_sexagesimal = __commonJS({
13871     "node_modules/@mapbox/sexagesimal/index.js"(exports2, module2) {
13872       module2.exports = element;
13873       module2.exports.pair = pair2;
13874       module2.exports.format = format2;
13875       module2.exports.formatPair = formatPair;
13876       module2.exports.coordToDMS = coordToDMS;
13877       function element(input, dims) {
13878         var result = search(input, dims);
13879         return result === null ? null : result.val;
13880       }
13881       function formatPair(input) {
13882         return format2(input.lat, "lat") + " " + format2(input.lon, "lon");
13883       }
13884       function format2(input, dim) {
13885         var dms = coordToDMS(input, dim);
13886         return dms.whole + "\xB0 " + (dms.minutes ? dms.minutes + "' " : "") + (dms.seconds ? dms.seconds + '" ' : "") + dms.dir;
13887       }
13888       function coordToDMS(input, dim) {
13889         var dirs = { lat: ["N", "S"], lon: ["E", "W"] }[dim] || "";
13890         var dir = dirs[input >= 0 ? 0 : 1];
13891         var abs3 = Math.abs(input);
13892         var whole = Math.floor(abs3);
13893         var fraction = abs3 - whole;
13894         var fractionMinutes = fraction * 60;
13895         var minutes = Math.floor(fractionMinutes);
13896         var seconds = Math.floor((fractionMinutes - minutes) * 60);
13897         return {
13898           whole,
13899           minutes,
13900           seconds,
13901           dir
13902         };
13903       }
13904       function search(input, dims) {
13905         if (!dims)
13906           dims = "NSEW";
13907         if (typeof input !== "string")
13908           return null;
13909         input = input.toUpperCase();
13910         var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/;
13911         var m = input.match(regex);
13912         if (!m)
13913           return null;
13914         var matched = m[0];
13915         var dim;
13916         if (m[1] && m[5]) {
13917           dim = m[1];
13918           matched = matched.slice(0, -1);
13919         } else {
13920           dim = m[1] || m[5];
13921         }
13922         if (dim && dims.indexOf(dim) === -1)
13923           return null;
13924         var deg = m[2] ? parseFloat(m[2]) : 0;
13925         var min3 = m[3] ? parseFloat(m[3]) / 60 : 0;
13926         var sec = m[4] ? parseFloat(m[4]) / 3600 : 0;
13927         var sign2 = deg < 0 ? -1 : 1;
13928         if (dim === "S" || dim === "W")
13929           sign2 *= -1;
13930         return {
13931           val: (Math.abs(deg) + min3 + sec) * sign2,
13932           dim,
13933           matched,
13934           remain: input.slice(matched.length)
13935         };
13936       }
13937       function pair2(input, dims) {
13938         input = input.trim();
13939         var one2 = search(input, dims);
13940         if (!one2)
13941           return null;
13942         input = one2.remain.trim();
13943         var two = search(input, dims);
13944         if (!two || two.remain)
13945           return null;
13946         if (one2.dim) {
13947           return swapdim(one2.val, two.val, one2.dim);
13948         } else {
13949           return [one2.val, two.val];
13950         }
13951       }
13952       function swapdim(a, b, dim) {
13953         if (dim === "N" || dim === "S")
13954           return [a, b];
13955         if (dim === "W" || dim === "E")
13956           return [b, a];
13957       }
13958     }
13959   });
13960
13961   // node_modules/store/src/util.js
13962   var require_util = __commonJS({
13963     "node_modules/store/src/util.js"(exports2, module2) {
13964       var assign = make_assign();
13965       var create2 = make_create();
13966       var trim = make_trim();
13967       var Global = typeof window !== "undefined" ? window : global;
13968       module2.exports = {
13969         assign,
13970         create: create2,
13971         trim,
13972         bind,
13973         slice,
13974         each,
13975         map: map2,
13976         pluck,
13977         isList,
13978         isFunction,
13979         isObject: isObject3,
13980         Global
13981       };
13982       function make_assign() {
13983         if (Object.assign) {
13984           return Object.assign;
13985         } else {
13986           return function shimAssign(obj, props1, props2, etc) {
13987             for (var i2 = 1; i2 < arguments.length; i2++) {
13988               each(Object(arguments[i2]), function(val, key) {
13989                 obj[key] = val;
13990               });
13991             }
13992             return obj;
13993           };
13994         }
13995       }
13996       function make_create() {
13997         if (Object.create) {
13998           return function create3(obj, assignProps1, assignProps2, etc) {
13999             var assignArgsList = slice(arguments, 1);
14000             return assign.apply(this, [Object.create(obj)].concat(assignArgsList));
14001           };
14002         } else {
14003           let F2 = function() {
14004           };
14005           var F = F2;
14006           return function create3(obj, assignProps1, assignProps2, etc) {
14007             var assignArgsList = slice(arguments, 1);
14008             F2.prototype = obj;
14009             return assign.apply(this, [new F2()].concat(assignArgsList));
14010           };
14011         }
14012       }
14013       function make_trim() {
14014         if (String.prototype.trim) {
14015           return function trim2(str2) {
14016             return String.prototype.trim.call(str2);
14017           };
14018         } else {
14019           return function trim2(str2) {
14020             return str2.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
14021           };
14022         }
14023       }
14024       function bind(obj, fn) {
14025         return function() {
14026           return fn.apply(obj, Array.prototype.slice.call(arguments, 0));
14027         };
14028       }
14029       function slice(arr, index) {
14030         return Array.prototype.slice.call(arr, index || 0);
14031       }
14032       function each(obj, fn) {
14033         pluck(obj, function(val, key) {
14034           fn(val, key);
14035           return false;
14036         });
14037       }
14038       function map2(obj, fn) {
14039         var res = isList(obj) ? [] : {};
14040         pluck(obj, function(v, k) {
14041           res[k] = fn(v, k);
14042           return false;
14043         });
14044         return res;
14045       }
14046       function pluck(obj, fn) {
14047         if (isList(obj)) {
14048           for (var i2 = 0; i2 < obj.length; i2++) {
14049             if (fn(obj[i2], i2)) {
14050               return obj[i2];
14051             }
14052           }
14053         } else {
14054           for (var key in obj) {
14055             if (obj.hasOwnProperty(key)) {
14056               if (fn(obj[key], key)) {
14057                 return obj[key];
14058               }
14059             }
14060           }
14061         }
14062       }
14063       function isList(val) {
14064         return val != null && typeof val != "function" && typeof val.length == "number";
14065       }
14066       function isFunction(val) {
14067         return val && {}.toString.call(val) === "[object Function]";
14068       }
14069       function isObject3(val) {
14070         return val && {}.toString.call(val) === "[object Object]";
14071       }
14072     }
14073   });
14074
14075   // node_modules/store/src/store-engine.js
14076   var require_store_engine = __commonJS({
14077     "node_modules/store/src/store-engine.js"(exports2, module2) {
14078       var util = require_util();
14079       var slice = util.slice;
14080       var pluck = util.pluck;
14081       var each = util.each;
14082       var bind = util.bind;
14083       var create2 = util.create;
14084       var isList = util.isList;
14085       var isFunction = util.isFunction;
14086       var isObject3 = util.isObject;
14087       module2.exports = {
14088         createStore
14089       };
14090       var storeAPI = {
14091         version: "2.0.12",
14092         enabled: false,
14093         // get returns the value of the given key. If that value
14094         // is undefined, it returns optionalDefaultValue instead.
14095         get: function(key, optionalDefaultValue) {
14096           var data = this.storage.read(this._namespacePrefix + key);
14097           return this._deserialize(data, optionalDefaultValue);
14098         },
14099         // set will store the given value at key and returns value.
14100         // Calling set with value === undefined is equivalent to calling remove.
14101         set: function(key, value) {
14102           if (value === void 0) {
14103             return this.remove(key);
14104           }
14105           this.storage.write(this._namespacePrefix + key, this._serialize(value));
14106           return value;
14107         },
14108         // remove deletes the key and value stored at the given key.
14109         remove: function(key) {
14110           this.storage.remove(this._namespacePrefix + key);
14111         },
14112         // each will call the given callback once for each key-value pair
14113         // in this store.
14114         each: function(callback) {
14115           var self2 = this;
14116           this.storage.each(function(val, namespacedKey) {
14117             callback.call(self2, self2._deserialize(val), (namespacedKey || "").replace(self2._namespaceRegexp, ""));
14118           });
14119         },
14120         // clearAll will remove all the stored key-value pairs in this store.
14121         clearAll: function() {
14122           this.storage.clearAll();
14123         },
14124         // additional functionality that can't live in plugins
14125         // ---------------------------------------------------
14126         // hasNamespace returns true if this store instance has the given namespace.
14127         hasNamespace: function(namespace) {
14128           return this._namespacePrefix == "__storejs_" + namespace + "_";
14129         },
14130         // createStore creates a store.js instance with the first
14131         // functioning storage in the list of storage candidates,
14132         // and applies the the given mixins to the instance.
14133         createStore: function() {
14134           return createStore.apply(this, arguments);
14135         },
14136         addPlugin: function(plugin) {
14137           this._addPlugin(plugin);
14138         },
14139         namespace: function(namespace) {
14140           return createStore(this.storage, this.plugins, namespace);
14141         }
14142       };
14143       function _warn() {
14144         var _console = typeof console == "undefined" ? null : console;
14145         if (!_console) {
14146           return;
14147         }
14148         var fn = _console.warn ? _console.warn : _console.log;
14149         fn.apply(_console, arguments);
14150       }
14151       function createStore(storages, plugins, namespace) {
14152         if (!namespace) {
14153           namespace = "";
14154         }
14155         if (storages && !isList(storages)) {
14156           storages = [storages];
14157         }
14158         if (plugins && !isList(plugins)) {
14159           plugins = [plugins];
14160         }
14161         var namespacePrefix = namespace ? "__storejs_" + namespace + "_" : "";
14162         var namespaceRegexp = namespace ? new RegExp("^" + namespacePrefix) : null;
14163         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/;
14164         if (!legalNamespaces.test(namespace)) {
14165           throw new Error("store.js namespaces can only have alphanumerics + underscores and dashes");
14166         }
14167         var _privateStoreProps = {
14168           _namespacePrefix: namespacePrefix,
14169           _namespaceRegexp: namespaceRegexp,
14170           _testStorage: function(storage) {
14171             try {
14172               var testStr = "__storejs__test__";
14173               storage.write(testStr, testStr);
14174               var ok = storage.read(testStr) === testStr;
14175               storage.remove(testStr);
14176               return ok;
14177             } catch (e) {
14178               return false;
14179             }
14180           },
14181           _assignPluginFnProp: function(pluginFnProp, propName) {
14182             var oldFn = this[propName];
14183             this[propName] = function pluginFn() {
14184               var args = slice(arguments, 0);
14185               var self2 = this;
14186               function super_fn() {
14187                 if (!oldFn) {
14188                   return;
14189                 }
14190                 each(arguments, function(arg, i2) {
14191                   args[i2] = arg;
14192                 });
14193                 return oldFn.apply(self2, args);
14194               }
14195               var newFnArgs = [super_fn].concat(args);
14196               return pluginFnProp.apply(self2, newFnArgs);
14197             };
14198           },
14199           _serialize: function(obj) {
14200             return JSON.stringify(obj);
14201           },
14202           _deserialize: function(strVal, defaultVal) {
14203             if (!strVal) {
14204               return defaultVal;
14205             }
14206             var val = "";
14207             try {
14208               val = JSON.parse(strVal);
14209             } catch (e) {
14210               val = strVal;
14211             }
14212             return val !== void 0 ? val : defaultVal;
14213           },
14214           _addStorage: function(storage) {
14215             if (this.enabled) {
14216               return;
14217             }
14218             if (this._testStorage(storage)) {
14219               this.storage = storage;
14220               this.enabled = true;
14221             }
14222           },
14223           _addPlugin: function(plugin) {
14224             var self2 = this;
14225             if (isList(plugin)) {
14226               each(plugin, function(plugin2) {
14227                 self2._addPlugin(plugin2);
14228               });
14229               return;
14230             }
14231             var seenPlugin = pluck(this.plugins, function(seenPlugin2) {
14232               return plugin === seenPlugin2;
14233             });
14234             if (seenPlugin) {
14235               return;
14236             }
14237             this.plugins.push(plugin);
14238             if (!isFunction(plugin)) {
14239               throw new Error("Plugins must be function values that return objects");
14240             }
14241             var pluginProperties = plugin.call(this);
14242             if (!isObject3(pluginProperties)) {
14243               throw new Error("Plugins must return an object of function properties");
14244             }
14245             each(pluginProperties, function(pluginFnProp, propName) {
14246               if (!isFunction(pluginFnProp)) {
14247                 throw new Error("Bad plugin property: " + propName + " from plugin " + plugin.name + ". Plugins should only return functions.");
14248               }
14249               self2._assignPluginFnProp(pluginFnProp, propName);
14250             });
14251           },
14252           // Put deprecated properties in the private API, so as to not expose it to accidential
14253           // discovery through inspection of the store object.
14254           // Deprecated: addStorage
14255           addStorage: function(storage) {
14256             _warn("store.addStorage(storage) is deprecated. Use createStore([storages])");
14257             this._addStorage(storage);
14258           }
14259         };
14260         var store2 = create2(_privateStoreProps, storeAPI, {
14261           plugins: []
14262         });
14263         store2.raw = {};
14264         each(store2, function(prop, propName) {
14265           if (isFunction(prop)) {
14266             store2.raw[propName] = bind(store2, prop);
14267           }
14268         });
14269         each(storages, function(storage) {
14270           store2._addStorage(storage);
14271         });
14272         each(plugins, function(plugin) {
14273           store2._addPlugin(plugin);
14274         });
14275         return store2;
14276       }
14277     }
14278   });
14279
14280   // node_modules/store/storages/localStorage.js
14281   var require_localStorage = __commonJS({
14282     "node_modules/store/storages/localStorage.js"(exports2, module2) {
14283       var util = require_util();
14284       var Global = util.Global;
14285       module2.exports = {
14286         name: "localStorage",
14287         read,
14288         write,
14289         each,
14290         remove: remove2,
14291         clearAll
14292       };
14293       function localStorage2() {
14294         return Global.localStorage;
14295       }
14296       function read(key) {
14297         return localStorage2().getItem(key);
14298       }
14299       function write(key, data) {
14300         return localStorage2().setItem(key, data);
14301       }
14302       function each(fn) {
14303         for (var i2 = localStorage2().length - 1; i2 >= 0; i2--) {
14304           var key = localStorage2().key(i2);
14305           fn(read(key), key);
14306         }
14307       }
14308       function remove2(key) {
14309         return localStorage2().removeItem(key);
14310       }
14311       function clearAll() {
14312         return localStorage2().clear();
14313       }
14314     }
14315   });
14316
14317   // node_modules/store/storages/oldFF-globalStorage.js
14318   var require_oldFF_globalStorage = __commonJS({
14319     "node_modules/store/storages/oldFF-globalStorage.js"(exports2, module2) {
14320       var util = require_util();
14321       var Global = util.Global;
14322       module2.exports = {
14323         name: "oldFF-globalStorage",
14324         read,
14325         write,
14326         each,
14327         remove: remove2,
14328         clearAll
14329       };
14330       var globalStorage = Global.globalStorage;
14331       function read(key) {
14332         return globalStorage[key];
14333       }
14334       function write(key, data) {
14335         globalStorage[key] = data;
14336       }
14337       function each(fn) {
14338         for (var i2 = globalStorage.length - 1; i2 >= 0; i2--) {
14339           var key = globalStorage.key(i2);
14340           fn(globalStorage[key], key);
14341         }
14342       }
14343       function remove2(key) {
14344         return globalStorage.removeItem(key);
14345       }
14346       function clearAll() {
14347         each(function(key, _) {
14348           delete globalStorage[key];
14349         });
14350       }
14351     }
14352   });
14353
14354   // node_modules/store/storages/oldIE-userDataStorage.js
14355   var require_oldIE_userDataStorage = __commonJS({
14356     "node_modules/store/storages/oldIE-userDataStorage.js"(exports2, module2) {
14357       var util = require_util();
14358       var Global = util.Global;
14359       module2.exports = {
14360         name: "oldIE-userDataStorage",
14361         write,
14362         read,
14363         each,
14364         remove: remove2,
14365         clearAll
14366       };
14367       var storageName = "storejs";
14368       var doc = Global.document;
14369       var _withStorageEl = _makeIEStorageElFunction();
14370       var disable = (Global.navigator ? Global.navigator.userAgent : "").match(/ (MSIE 8|MSIE 9|MSIE 10)\./);
14371       function write(unfixedKey, data) {
14372         if (disable) {
14373           return;
14374         }
14375         var fixedKey = fixKey(unfixedKey);
14376         _withStorageEl(function(storageEl) {
14377           storageEl.setAttribute(fixedKey, data);
14378           storageEl.save(storageName);
14379         });
14380       }
14381       function read(unfixedKey) {
14382         if (disable) {
14383           return;
14384         }
14385         var fixedKey = fixKey(unfixedKey);
14386         var res = null;
14387         _withStorageEl(function(storageEl) {
14388           res = storageEl.getAttribute(fixedKey);
14389         });
14390         return res;
14391       }
14392       function each(callback) {
14393         _withStorageEl(function(storageEl) {
14394           var attributes = storageEl.XMLDocument.documentElement.attributes;
14395           for (var i2 = attributes.length - 1; i2 >= 0; i2--) {
14396             var attr = attributes[i2];
14397             callback(storageEl.getAttribute(attr.name), attr.name);
14398           }
14399         });
14400       }
14401       function remove2(unfixedKey) {
14402         var fixedKey = fixKey(unfixedKey);
14403         _withStorageEl(function(storageEl) {
14404           storageEl.removeAttribute(fixedKey);
14405           storageEl.save(storageName);
14406         });
14407       }
14408       function clearAll() {
14409         _withStorageEl(function(storageEl) {
14410           var attributes = storageEl.XMLDocument.documentElement.attributes;
14411           storageEl.load(storageName);
14412           for (var i2 = attributes.length - 1; i2 >= 0; i2--) {
14413             storageEl.removeAttribute(attributes[i2].name);
14414           }
14415           storageEl.save(storageName);
14416         });
14417       }
14418       var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
14419       function fixKey(key) {
14420         return key.replace(/^\d/, "___$&").replace(forbiddenCharsRegex, "___");
14421       }
14422       function _makeIEStorageElFunction() {
14423         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
14424           return null;
14425         }
14426         var scriptTag = "script", storageOwner, storageContainer, storageEl;
14427         try {
14428           storageContainer = new ActiveXObject("htmlfile");
14429           storageContainer.open();
14430           storageContainer.write("<" + scriptTag + ">document.w=window</" + scriptTag + '><iframe src="/favicon.ico"></iframe>');
14431           storageContainer.close();
14432           storageOwner = storageContainer.w.frames[0].document;
14433           storageEl = storageOwner.createElement("div");
14434         } catch (e) {
14435           storageEl = doc.createElement("div");
14436           storageOwner = doc.body;
14437         }
14438         return function(storeFunction) {
14439           var args = [].slice.call(arguments, 0);
14440           args.unshift(storageEl);
14441           storageOwner.appendChild(storageEl);
14442           storageEl.addBehavior("#default#userData");
14443           storageEl.load(storageName);
14444           storeFunction.apply(this, args);
14445           storageOwner.removeChild(storageEl);
14446           return;
14447         };
14448       }
14449     }
14450   });
14451
14452   // node_modules/store/storages/cookieStorage.js
14453   var require_cookieStorage = __commonJS({
14454     "node_modules/store/storages/cookieStorage.js"(exports2, module2) {
14455       var util = require_util();
14456       var Global = util.Global;
14457       var trim = util.trim;
14458       module2.exports = {
14459         name: "cookieStorage",
14460         read,
14461         write,
14462         each,
14463         remove: remove2,
14464         clearAll
14465       };
14466       var doc = Global.document;
14467       function read(key) {
14468         if (!key || !_has(key)) {
14469           return null;
14470         }
14471         var regexpStr = "(?:^|.*;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
14472         return unescape(doc.cookie.replace(new RegExp(regexpStr), "$1"));
14473       }
14474       function each(callback) {
14475         var cookies = doc.cookie.split(/; ?/g);
14476         for (var i2 = cookies.length - 1; i2 >= 0; i2--) {
14477           if (!trim(cookies[i2])) {
14478             continue;
14479           }
14480           var kvp = cookies[i2].split("=");
14481           var key = unescape(kvp[0]);
14482           var val = unescape(kvp[1]);
14483           callback(val, key);
14484         }
14485       }
14486       function write(key, data) {
14487         if (!key) {
14488           return;
14489         }
14490         doc.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
14491       }
14492       function remove2(key) {
14493         if (!key || !_has(key)) {
14494           return;
14495         }
14496         doc.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
14497       }
14498       function clearAll() {
14499         each(function(_, key) {
14500           remove2(key);
14501         });
14502       }
14503       function _has(key) {
14504         return new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(doc.cookie);
14505       }
14506     }
14507   });
14508
14509   // node_modules/store/storages/sessionStorage.js
14510   var require_sessionStorage = __commonJS({
14511     "node_modules/store/storages/sessionStorage.js"(exports2, module2) {
14512       var util = require_util();
14513       var Global = util.Global;
14514       module2.exports = {
14515         name: "sessionStorage",
14516         read,
14517         write,
14518         each,
14519         remove: remove2,
14520         clearAll
14521       };
14522       function sessionStorage() {
14523         return Global.sessionStorage;
14524       }
14525       function read(key) {
14526         return sessionStorage().getItem(key);
14527       }
14528       function write(key, data) {
14529         return sessionStorage().setItem(key, data);
14530       }
14531       function each(fn) {
14532         for (var i2 = sessionStorage().length - 1; i2 >= 0; i2--) {
14533           var key = sessionStorage().key(i2);
14534           fn(read(key), key);
14535         }
14536       }
14537       function remove2(key) {
14538         return sessionStorage().removeItem(key);
14539       }
14540       function clearAll() {
14541         return sessionStorage().clear();
14542       }
14543     }
14544   });
14545
14546   // node_modules/store/storages/memoryStorage.js
14547   var require_memoryStorage = __commonJS({
14548     "node_modules/store/storages/memoryStorage.js"(exports2, module2) {
14549       module2.exports = {
14550         name: "memoryStorage",
14551         read,
14552         write,
14553         each,
14554         remove: remove2,
14555         clearAll
14556       };
14557       var memoryStorage = {};
14558       function read(key) {
14559         return memoryStorage[key];
14560       }
14561       function write(key, data) {
14562         memoryStorage[key] = data;
14563       }
14564       function each(callback) {
14565         for (var key in memoryStorage) {
14566           if (memoryStorage.hasOwnProperty(key)) {
14567             callback(memoryStorage[key], key);
14568           }
14569         }
14570       }
14571       function remove2(key) {
14572         delete memoryStorage[key];
14573       }
14574       function clearAll(key) {
14575         memoryStorage = {};
14576       }
14577     }
14578   });
14579
14580   // node_modules/store/storages/all.js
14581   var require_all = __commonJS({
14582     "node_modules/store/storages/all.js"(exports2, module2) {
14583       module2.exports = [
14584         // Listed in order of usage preference
14585         require_localStorage(),
14586         require_oldFF_globalStorage(),
14587         require_oldIE_userDataStorage(),
14588         require_cookieStorage(),
14589         require_sessionStorage(),
14590         require_memoryStorage()
14591       ];
14592     }
14593   });
14594
14595   // node_modules/store/plugins/lib/json2.js
14596   var require_json2 = __commonJS({
14597     "node_modules/store/plugins/lib/json2.js"(exports, module) {
14598       if (typeof JSON !== "object") {
14599         JSON = {};
14600       }
14601       (function() {
14602         "use strict";
14603         var rx_one = /^[\],:{}\s]*$/;
14604         var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
14605         var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
14606         var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
14607         var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
14608         var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
14609         function f(n2) {
14610           return n2 < 10 ? "0" + n2 : n2;
14611         }
14612         function this_value() {
14613           return this.valueOf();
14614         }
14615         if (typeof Date.prototype.toJSON !== "function") {
14616           Date.prototype.toJSON = function() {
14617             return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null;
14618           };
14619           Boolean.prototype.toJSON = this_value;
14620           Number.prototype.toJSON = this_value;
14621           String.prototype.toJSON = this_value;
14622         }
14623         var gap;
14624         var indent;
14625         var meta;
14626         var rep;
14627         function quote(string) {
14628           rx_escapable.lastIndex = 0;
14629           return rx_escapable.test(string) ? '"' + string.replace(rx_escapable, function(a) {
14630             var c = meta[a];
14631             return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
14632           }) + '"' : '"' + string + '"';
14633         }
14634         function str(key, holder) {
14635           var i2;
14636           var k;
14637           var v;
14638           var length;
14639           var mind = gap;
14640           var partial;
14641           var value = holder[key];
14642           if (value && typeof value === "object" && typeof value.toJSON === "function") {
14643             value = value.toJSON(key);
14644           }
14645           if (typeof rep === "function") {
14646             value = rep.call(holder, key, value);
14647           }
14648           switch (typeof value) {
14649             case "string":
14650               return quote(value);
14651             case "number":
14652               return isFinite(value) ? String(value) : "null";
14653             case "boolean":
14654             case "null":
14655               return String(value);
14656             case "object":
14657               if (!value) {
14658                 return "null";
14659               }
14660               gap += indent;
14661               partial = [];
14662               if (Object.prototype.toString.apply(value) === "[object Array]") {
14663                 length = value.length;
14664                 for (i2 = 0; i2 < length; i2 += 1) {
14665                   partial[i2] = str(i2, value) || "null";
14666                 }
14667                 v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]";
14668                 gap = mind;
14669                 return v;
14670               }
14671               if (rep && typeof rep === "object") {
14672                 length = rep.length;
14673                 for (i2 = 0; i2 < length; i2 += 1) {
14674                   if (typeof rep[i2] === "string") {
14675                     k = rep[i2];
14676                     v = str(k, value);
14677                     if (v) {
14678                       partial.push(quote(k) + (gap ? ": " : ":") + v);
14679                     }
14680                   }
14681                 }
14682               } else {
14683                 for (k in value) {
14684                   if (Object.prototype.hasOwnProperty.call(value, k)) {
14685                     v = str(k, value);
14686                     if (v) {
14687                       partial.push(quote(k) + (gap ? ": " : ":") + v);
14688                     }
14689                   }
14690                 }
14691               }
14692               v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}";
14693               gap = mind;
14694               return v;
14695           }
14696         }
14697         if (typeof JSON.stringify !== "function") {
14698           meta = {
14699             // table of character substitutions
14700             "\b": "\\b",
14701             "   ": "\\t",
14702             "\n": "\\n",
14703             "\f": "\\f",
14704             "\r": "\\r",
14705             '"': '\\"',
14706             "\\": "\\\\"
14707           };
14708           JSON.stringify = function(value, replacer, space) {
14709             var i2;
14710             gap = "";
14711             indent = "";
14712             if (typeof space === "number") {
14713               for (i2 = 0; i2 < space; i2 += 1) {
14714                 indent += " ";
14715               }
14716             } else if (typeof space === "string") {
14717               indent = space;
14718             }
14719             rep = replacer;
14720             if (replacer && typeof replacer !== "function" && (typeof replacer !== "object" || typeof replacer.length !== "number")) {
14721               throw new Error("JSON.stringify");
14722             }
14723             return str("", { "": value });
14724           };
14725         }
14726         if (typeof JSON.parse !== "function") {
14727           JSON.parse = function(text, reviver) {
14728             var j;
14729             function walk(holder, key) {
14730               var k;
14731               var v;
14732               var value = holder[key];
14733               if (value && typeof value === "object") {
14734                 for (k in value) {
14735                   if (Object.prototype.hasOwnProperty.call(value, k)) {
14736                     v = walk(value, k);
14737                     if (v !== void 0) {
14738                       value[k] = v;
14739                     } else {
14740                       delete value[k];
14741                     }
14742                   }
14743                 }
14744               }
14745               return reviver.call(holder, key, value);
14746             }
14747             text = String(text);
14748             rx_dangerous.lastIndex = 0;
14749             if (rx_dangerous.test(text)) {
14750               text = text.replace(rx_dangerous, function(a) {
14751                 return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
14752               });
14753             }
14754             if (rx_one.test(
14755               text.replace(rx_two, "@").replace(rx_three, "]").replace(rx_four, "")
14756             )) {
14757               j = eval("(" + text + ")");
14758               return typeof reviver === "function" ? walk({ "": j }, "") : j;
14759             }
14760             throw new SyntaxError("JSON.parse");
14761           };
14762         }
14763       })();
14764     }
14765   });
14766
14767   // node_modules/store/plugins/json2.js
14768   var require_json22 = __commonJS({
14769     "node_modules/store/plugins/json2.js"(exports2, module2) {
14770       module2.exports = json2Plugin;
14771       function json2Plugin() {
14772         require_json2();
14773         return {};
14774       }
14775     }
14776   });
14777
14778   // node_modules/store/dist/store.legacy.js
14779   var require_store_legacy = __commonJS({
14780     "node_modules/store/dist/store.legacy.js"(exports2, module2) {
14781       var engine = require_store_engine();
14782       var storages = require_all();
14783       var plugins = [require_json22()];
14784       module2.exports = engine.createStore(storages, plugins);
14785     }
14786   });
14787
14788   // node_modules/whatwg-fetch/fetch.js
14789   var global2 = typeof globalThis !== "undefined" && globalThis || typeof self !== "undefined" && self || typeof global2 !== "undefined" && global2;
14790   var support = {
14791     searchParams: "URLSearchParams" in global2,
14792     iterable: "Symbol" in global2 && "iterator" in Symbol,
14793     blob: "FileReader" in global2 && "Blob" in global2 && function() {
14794       try {
14795         new Blob();
14796         return true;
14797       } catch (e) {
14798         return false;
14799       }
14800     }(),
14801     formData: "FormData" in global2,
14802     arrayBuffer: "ArrayBuffer" in global2
14803   };
14804   function isDataView(obj) {
14805     return obj && DataView.prototype.isPrototypeOf(obj);
14806   }
14807   if (support.arrayBuffer) {
14808     viewClasses = [
14809       "[object Int8Array]",
14810       "[object Uint8Array]",
14811       "[object Uint8ClampedArray]",
14812       "[object Int16Array]",
14813       "[object Uint16Array]",
14814       "[object Int32Array]",
14815       "[object Uint32Array]",
14816       "[object Float32Array]",
14817       "[object Float64Array]"
14818     ];
14819     isArrayBufferView = ArrayBuffer.isView || function(obj) {
14820       return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
14821     };
14822   }
14823   var viewClasses;
14824   var isArrayBufferView;
14825   function normalizeName(name) {
14826     if (typeof name !== "string") {
14827       name = String(name);
14828     }
14829     if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === "") {
14830       throw new TypeError('Invalid character in header field name: "' + name + '"');
14831     }
14832     return name.toLowerCase();
14833   }
14834   function normalizeValue(value) {
14835     if (typeof value !== "string") {
14836       value = String(value);
14837     }
14838     return value;
14839   }
14840   function iteratorFor(items) {
14841     var iterator = {
14842       next: function() {
14843         var value = items.shift();
14844         return { done: value === void 0, value };
14845       }
14846     };
14847     if (support.iterable) {
14848       iterator[Symbol.iterator] = function() {
14849         return iterator;
14850       };
14851     }
14852     return iterator;
14853   }
14854   function Headers(headers) {
14855     this.map = {};
14856     if (headers instanceof Headers) {
14857       headers.forEach(function(value, name) {
14858         this.append(name, value);
14859       }, this);
14860     } else if (Array.isArray(headers)) {
14861       headers.forEach(function(header) {
14862         this.append(header[0], header[1]);
14863       }, this);
14864     } else if (headers) {
14865       Object.getOwnPropertyNames(headers).forEach(function(name) {
14866         this.append(name, headers[name]);
14867       }, this);
14868     }
14869   }
14870   Headers.prototype.append = function(name, value) {
14871     name = normalizeName(name);
14872     value = normalizeValue(value);
14873     var oldValue = this.map[name];
14874     this.map[name] = oldValue ? oldValue + ", " + value : value;
14875   };
14876   Headers.prototype["delete"] = function(name) {
14877     delete this.map[normalizeName(name)];
14878   };
14879   Headers.prototype.get = function(name) {
14880     name = normalizeName(name);
14881     return this.has(name) ? this.map[name] : null;
14882   };
14883   Headers.prototype.has = function(name) {
14884     return this.map.hasOwnProperty(normalizeName(name));
14885   };
14886   Headers.prototype.set = function(name, value) {
14887     this.map[normalizeName(name)] = normalizeValue(value);
14888   };
14889   Headers.prototype.forEach = function(callback, thisArg) {
14890     for (var name in this.map) {
14891       if (this.map.hasOwnProperty(name)) {
14892         callback.call(thisArg, this.map[name], name, this);
14893       }
14894     }
14895   };
14896   Headers.prototype.keys = function() {
14897     var items = [];
14898     this.forEach(function(value, name) {
14899       items.push(name);
14900     });
14901     return iteratorFor(items);
14902   };
14903   Headers.prototype.values = function() {
14904     var items = [];
14905     this.forEach(function(value) {
14906       items.push(value);
14907     });
14908     return iteratorFor(items);
14909   };
14910   Headers.prototype.entries = function() {
14911     var items = [];
14912     this.forEach(function(value, name) {
14913       items.push([name, value]);
14914     });
14915     return iteratorFor(items);
14916   };
14917   if (support.iterable) {
14918     Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
14919   }
14920   function consumed(body) {
14921     if (body.bodyUsed) {
14922       return Promise.reject(new TypeError("Already read"));
14923     }
14924     body.bodyUsed = true;
14925   }
14926   function fileReaderReady(reader) {
14927     return new Promise(function(resolve, reject) {
14928       reader.onload = function() {
14929         resolve(reader.result);
14930       };
14931       reader.onerror = function() {
14932         reject(reader.error);
14933       };
14934     });
14935   }
14936   function readBlobAsArrayBuffer(blob) {
14937     var reader = new FileReader();
14938     var promise = fileReaderReady(reader);
14939     reader.readAsArrayBuffer(blob);
14940     return promise;
14941   }
14942   function readBlobAsText(blob) {
14943     var reader = new FileReader();
14944     var promise = fileReaderReady(reader);
14945     reader.readAsText(blob);
14946     return promise;
14947   }
14948   function readArrayBufferAsText(buf) {
14949     var view = new Uint8Array(buf);
14950     var chars = new Array(view.length);
14951     for (var i2 = 0; i2 < view.length; i2++) {
14952       chars[i2] = String.fromCharCode(view[i2]);
14953     }
14954     return chars.join("");
14955   }
14956   function bufferClone(buf) {
14957     if (buf.slice) {
14958       return buf.slice(0);
14959     } else {
14960       var view = new Uint8Array(buf.byteLength);
14961       view.set(new Uint8Array(buf));
14962       return view.buffer;
14963     }
14964   }
14965   function Body() {
14966     this.bodyUsed = false;
14967     this._initBody = function(body) {
14968       this.bodyUsed = this.bodyUsed;
14969       this._bodyInit = body;
14970       if (!body) {
14971         this._bodyText = "";
14972       } else if (typeof body === "string") {
14973         this._bodyText = body;
14974       } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
14975         this._bodyBlob = body;
14976       } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
14977         this._bodyFormData = body;
14978       } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
14979         this._bodyText = body.toString();
14980       } else if (support.arrayBuffer && support.blob && isDataView(body)) {
14981         this._bodyArrayBuffer = bufferClone(body.buffer);
14982         this._bodyInit = new Blob([this._bodyArrayBuffer]);
14983       } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
14984         this._bodyArrayBuffer = bufferClone(body);
14985       } else {
14986         this._bodyText = body = Object.prototype.toString.call(body);
14987       }
14988       if (!this.headers.get("content-type")) {
14989         if (typeof body === "string") {
14990           this.headers.set("content-type", "text/plain;charset=UTF-8");
14991         } else if (this._bodyBlob && this._bodyBlob.type) {
14992           this.headers.set("content-type", this._bodyBlob.type);
14993         } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
14994           this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
14995         }
14996       }
14997     };
14998     if (support.blob) {
14999       this.blob = function() {
15000         var rejected = consumed(this);
15001         if (rejected) {
15002           return rejected;
15003         }
15004         if (this._bodyBlob) {
15005           return Promise.resolve(this._bodyBlob);
15006         } else if (this._bodyArrayBuffer) {
15007           return Promise.resolve(new Blob([this._bodyArrayBuffer]));
15008         } else if (this._bodyFormData) {
15009           throw new Error("could not read FormData body as blob");
15010         } else {
15011           return Promise.resolve(new Blob([this._bodyText]));
15012         }
15013       };
15014       this.arrayBuffer = function() {
15015         if (this._bodyArrayBuffer) {
15016           var isConsumed = consumed(this);
15017           if (isConsumed) {
15018             return isConsumed;
15019           }
15020           if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
15021             return Promise.resolve(
15022               this._bodyArrayBuffer.buffer.slice(
15023                 this._bodyArrayBuffer.byteOffset,
15024                 this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength
15025               )
15026             );
15027           } else {
15028             return Promise.resolve(this._bodyArrayBuffer);
15029           }
15030         } else {
15031           return this.blob().then(readBlobAsArrayBuffer);
15032         }
15033       };
15034     }
15035     this.text = function() {
15036       var rejected = consumed(this);
15037       if (rejected) {
15038         return rejected;
15039       }
15040       if (this._bodyBlob) {
15041         return readBlobAsText(this._bodyBlob);
15042       } else if (this._bodyArrayBuffer) {
15043         return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
15044       } else if (this._bodyFormData) {
15045         throw new Error("could not read FormData body as text");
15046       } else {
15047         return Promise.resolve(this._bodyText);
15048       }
15049     };
15050     if (support.formData) {
15051       this.formData = function() {
15052         return this.text().then(decode);
15053       };
15054     }
15055     this.json = function() {
15056       return this.text().then(JSON.parse);
15057     };
15058     return this;
15059   }
15060   var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
15061   function normalizeMethod(method) {
15062     var upcased = method.toUpperCase();
15063     return methods.indexOf(upcased) > -1 ? upcased : method;
15064   }
15065   function Request(input, options2) {
15066     if (!(this instanceof Request)) {
15067       throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
15068     }
15069     options2 = options2 || {};
15070     var body = options2.body;
15071     if (input instanceof Request) {
15072       if (input.bodyUsed) {
15073         throw new TypeError("Already read");
15074       }
15075       this.url = input.url;
15076       this.credentials = input.credentials;
15077       if (!options2.headers) {
15078         this.headers = new Headers(input.headers);
15079       }
15080       this.method = input.method;
15081       this.mode = input.mode;
15082       this.signal = input.signal;
15083       if (!body && input._bodyInit != null) {
15084         body = input._bodyInit;
15085         input.bodyUsed = true;
15086       }
15087     } else {
15088       this.url = String(input);
15089     }
15090     this.credentials = options2.credentials || this.credentials || "same-origin";
15091     if (options2.headers || !this.headers) {
15092       this.headers = new Headers(options2.headers);
15093     }
15094     this.method = normalizeMethod(options2.method || this.method || "GET");
15095     this.mode = options2.mode || this.mode || null;
15096     this.signal = options2.signal || this.signal;
15097     this.referrer = null;
15098     if ((this.method === "GET" || this.method === "HEAD") && body) {
15099       throw new TypeError("Body not allowed for GET or HEAD requests");
15100     }
15101     this._initBody(body);
15102     if (this.method === "GET" || this.method === "HEAD") {
15103       if (options2.cache === "no-store" || options2.cache === "no-cache") {
15104         var reParamSearch = /([?&])_=[^&]*/;
15105         if (reParamSearch.test(this.url)) {
15106           this.url = this.url.replace(reParamSearch, "$1_=" + new Date().getTime());
15107         } else {
15108           var reQueryString = /\?/;
15109           this.url += (reQueryString.test(this.url) ? "&" : "?") + "_=" + new Date().getTime();
15110         }
15111       }
15112     }
15113   }
15114   Request.prototype.clone = function() {
15115     return new Request(this, { body: this._bodyInit });
15116   };
15117   function decode(body) {
15118     var form = new FormData();
15119     body.trim().split("&").forEach(function(bytes) {
15120       if (bytes) {
15121         var split = bytes.split("=");
15122         var name = split.shift().replace(/\+/g, " ");
15123         var value = split.join("=").replace(/\+/g, " ");
15124         form.append(decodeURIComponent(name), decodeURIComponent(value));
15125       }
15126     });
15127     return form;
15128   }
15129   function parseHeaders(rawHeaders) {
15130     var headers = new Headers();
15131     var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, " ");
15132     preProcessedHeaders.split("\r").map(function(header) {
15133       return header.indexOf("\n") === 0 ? header.substr(1, header.length) : header;
15134     }).forEach(function(line) {
15135       var parts = line.split(":");
15136       var key = parts.shift().trim();
15137       if (key) {
15138         var value = parts.join(":").trim();
15139         headers.append(key, value);
15140       }
15141     });
15142     return headers;
15143   }
15144   Body.call(Request.prototype);
15145   function Response(bodyInit, options2) {
15146     if (!(this instanceof Response)) {
15147       throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
15148     }
15149     if (!options2) {
15150       options2 = {};
15151     }
15152     this.type = "default";
15153     this.status = options2.status === void 0 ? 200 : options2.status;
15154     this.ok = this.status >= 200 && this.status < 300;
15155     this.statusText = options2.statusText === void 0 ? "" : "" + options2.statusText;
15156     this.headers = new Headers(options2.headers);
15157     this.url = options2.url || "";
15158     this._initBody(bodyInit);
15159   }
15160   Body.call(Response.prototype);
15161   Response.prototype.clone = function() {
15162     return new Response(this._bodyInit, {
15163       status: this.status,
15164       statusText: this.statusText,
15165       headers: new Headers(this.headers),
15166       url: this.url
15167     });
15168   };
15169   Response.error = function() {
15170     var response = new Response(null, { status: 0, statusText: "" });
15171     response.type = "error";
15172     return response;
15173   };
15174   var redirectStatuses = [301, 302, 303, 307, 308];
15175   Response.redirect = function(url, status) {
15176     if (redirectStatuses.indexOf(status) === -1) {
15177       throw new RangeError("Invalid status code");
15178     }
15179     return new Response(null, { status, headers: { location: url } });
15180   };
15181   var DOMException2 = global2.DOMException;
15182   try {
15183     new DOMException2();
15184   } catch (err) {
15185     DOMException2 = function(message, name) {
15186       this.message = message;
15187       this.name = name;
15188       var error = Error(message);
15189       this.stack = error.stack;
15190     };
15191     DOMException2.prototype = Object.create(Error.prototype);
15192     DOMException2.prototype.constructor = DOMException2;
15193   }
15194   function fetch2(input, init2) {
15195     return new Promise(function(resolve, reject) {
15196       var request3 = new Request(input, init2);
15197       if (request3.signal && request3.signal.aborted) {
15198         return reject(new DOMException2("Aborted", "AbortError"));
15199       }
15200       var xhr = new XMLHttpRequest();
15201       function abortXhr() {
15202         xhr.abort();
15203       }
15204       xhr.onload = function() {
15205         var options2 = {
15206           status: xhr.status,
15207           statusText: xhr.statusText,
15208           headers: parseHeaders(xhr.getAllResponseHeaders() || "")
15209         };
15210         options2.url = "responseURL" in xhr ? xhr.responseURL : options2.headers.get("X-Request-URL");
15211         var body = "response" in xhr ? xhr.response : xhr.responseText;
15212         setTimeout(function() {
15213           resolve(new Response(body, options2));
15214         }, 0);
15215       };
15216       xhr.onerror = function() {
15217         setTimeout(function() {
15218           reject(new TypeError("Network request failed"));
15219         }, 0);
15220       };
15221       xhr.ontimeout = function() {
15222         setTimeout(function() {
15223           reject(new TypeError("Network request failed"));
15224         }, 0);
15225       };
15226       xhr.onabort = function() {
15227         setTimeout(function() {
15228           reject(new DOMException2("Aborted", "AbortError"));
15229         }, 0);
15230       };
15231       function fixUrl(url) {
15232         try {
15233           return url === "" && global2.location.href ? global2.location.href : url;
15234         } catch (e) {
15235           return url;
15236         }
15237       }
15238       xhr.open(request3.method, fixUrl(request3.url), true);
15239       if (request3.credentials === "include") {
15240         xhr.withCredentials = true;
15241       } else if (request3.credentials === "omit") {
15242         xhr.withCredentials = false;
15243       }
15244       if ("responseType" in xhr) {
15245         if (support.blob) {
15246           xhr.responseType = "blob";
15247         } else if (support.arrayBuffer && request3.headers.get("Content-Type") && request3.headers.get("Content-Type").indexOf("application/octet-stream") !== -1) {
15248           xhr.responseType = "arraybuffer";
15249         }
15250       }
15251       if (init2 && typeof init2.headers === "object" && !(init2.headers instanceof Headers)) {
15252         Object.getOwnPropertyNames(init2.headers).forEach(function(name) {
15253           xhr.setRequestHeader(name, normalizeValue(init2.headers[name]));
15254         });
15255       } else {
15256         request3.headers.forEach(function(value, name) {
15257           xhr.setRequestHeader(name, value);
15258         });
15259       }
15260       if (request3.signal) {
15261         request3.signal.addEventListener("abort", abortXhr);
15262         xhr.onreadystatechange = function() {
15263           if (xhr.readyState === 4) {
15264             request3.signal.removeEventListener("abort", abortXhr);
15265           }
15266         };
15267       }
15268       xhr.send(typeof request3._bodyInit === "undefined" ? null : request3._bodyInit);
15269     });
15270   }
15271   fetch2.polyfill = true;
15272   if (!global2.fetch) {
15273     global2.fetch = fetch2;
15274     global2.Headers = Headers;
15275     global2.Request = Request;
15276     global2.Response = Response;
15277   }
15278
15279   // node_modules/abortcontroller-polyfill/dist/polyfill-patch-fetch.js
15280   (function(factory) {
15281     typeof define === "function" && define.amd ? define(factory) : factory();
15282   })(function() {
15283     "use strict";
15284     function _classCallCheck(instance, Constructor) {
15285       if (!(instance instanceof Constructor)) {
15286         throw new TypeError("Cannot call a class as a function");
15287       }
15288     }
15289     function _defineProperties(target, props) {
15290       for (var i2 = 0; i2 < props.length; i2++) {
15291         var descriptor = props[i2];
15292         descriptor.enumerable = descriptor.enumerable || false;
15293         descriptor.configurable = true;
15294         if ("value" in descriptor)
15295           descriptor.writable = true;
15296         Object.defineProperty(target, descriptor.key, descriptor);
15297       }
15298     }
15299     function _createClass(Constructor, protoProps, staticProps) {
15300       if (protoProps)
15301         _defineProperties(Constructor.prototype, protoProps);
15302       if (staticProps)
15303         _defineProperties(Constructor, staticProps);
15304       return Constructor;
15305     }
15306     function _inherits(subClass, superClass) {
15307       if (typeof superClass !== "function" && superClass !== null) {
15308         throw new TypeError("Super expression must either be null or a function");
15309       }
15310       subClass.prototype = Object.create(superClass && superClass.prototype, {
15311         constructor: {
15312           value: subClass,
15313           writable: true,
15314           configurable: true
15315         }
15316       });
15317       if (superClass)
15318         _setPrototypeOf(subClass, superClass);
15319     }
15320     function _getPrototypeOf(o) {
15321       _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
15322         return o2.__proto__ || Object.getPrototypeOf(o2);
15323       };
15324       return _getPrototypeOf(o);
15325     }
15326     function _setPrototypeOf(o, p) {
15327       _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) {
15328         o2.__proto__ = p2;
15329         return o2;
15330       };
15331       return _setPrototypeOf(o, p);
15332     }
15333     function _isNativeReflectConstruct() {
15334       if (typeof Reflect === "undefined" || !Reflect.construct)
15335         return false;
15336       if (Reflect.construct.sham)
15337         return false;
15338       if (typeof Proxy === "function")
15339         return true;
15340       try {
15341         Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
15342         }));
15343         return true;
15344       } catch (e) {
15345         return false;
15346       }
15347     }
15348     function _assertThisInitialized(self2) {
15349       if (self2 === void 0) {
15350         throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
15351       }
15352       return self2;
15353     }
15354     function _possibleConstructorReturn(self2, call) {
15355       if (call && (typeof call === "object" || typeof call === "function")) {
15356         return call;
15357       }
15358       return _assertThisInitialized(self2);
15359     }
15360     function _createSuper(Derived) {
15361       var hasNativeReflectConstruct = _isNativeReflectConstruct();
15362       return function _createSuperInternal() {
15363         var Super = _getPrototypeOf(Derived), result;
15364         if (hasNativeReflectConstruct) {
15365           var NewTarget = _getPrototypeOf(this).constructor;
15366           result = Reflect.construct(Super, arguments, NewTarget);
15367         } else {
15368           result = Super.apply(this, arguments);
15369         }
15370         return _possibleConstructorReturn(this, result);
15371       };
15372     }
15373     function _superPropBase(object, property) {
15374       while (!Object.prototype.hasOwnProperty.call(object, property)) {
15375         object = _getPrototypeOf(object);
15376         if (object === null)
15377           break;
15378       }
15379       return object;
15380     }
15381     function _get(target, property, receiver) {
15382       if (typeof Reflect !== "undefined" && Reflect.get) {
15383         _get = Reflect.get;
15384       } else {
15385         _get = function _get2(target2, property2, receiver2) {
15386           var base = _superPropBase(target2, property2);
15387           if (!base)
15388             return;
15389           var desc = Object.getOwnPropertyDescriptor(base, property2);
15390           if (desc.get) {
15391             return desc.get.call(receiver2);
15392           }
15393           return desc.value;
15394         };
15395       }
15396       return _get(target, property, receiver || target);
15397     }
15398     var Emitter = /* @__PURE__ */ function() {
15399       function Emitter2() {
15400         _classCallCheck(this, Emitter2);
15401         Object.defineProperty(this, "listeners", {
15402           value: {},
15403           writable: true,
15404           configurable: true
15405         });
15406       }
15407       _createClass(Emitter2, [{
15408         key: "addEventListener",
15409         value: function addEventListener(type2, callback, options2) {
15410           if (!(type2 in this.listeners)) {
15411             this.listeners[type2] = [];
15412           }
15413           this.listeners[type2].push({
15414             callback,
15415             options: options2
15416           });
15417         }
15418       }, {
15419         key: "removeEventListener",
15420         value: function removeEventListener(type2, callback) {
15421           if (!(type2 in this.listeners)) {
15422             return;
15423           }
15424           var stack = this.listeners[type2];
15425           for (var i2 = 0, l = stack.length; i2 < l; i2++) {
15426             if (stack[i2].callback === callback) {
15427               stack.splice(i2, 1);
15428               return;
15429             }
15430           }
15431         }
15432       }, {
15433         key: "dispatchEvent",
15434         value: function dispatchEvent2(event) {
15435           if (!(event.type in this.listeners)) {
15436             return;
15437           }
15438           var stack = this.listeners[event.type];
15439           var stackToCall = stack.slice();
15440           for (var i2 = 0, l = stackToCall.length; i2 < l; i2++) {
15441             var listener = stackToCall[i2];
15442             try {
15443               listener.callback.call(this, event);
15444             } catch (e) {
15445               Promise.resolve().then(function() {
15446                 throw e;
15447               });
15448             }
15449             if (listener.options && listener.options.once) {
15450               this.removeEventListener(event.type, listener.callback);
15451             }
15452           }
15453           return !event.defaultPrevented;
15454         }
15455       }]);
15456       return Emitter2;
15457     }();
15458     var AbortSignal = /* @__PURE__ */ function(_Emitter) {
15459       _inherits(AbortSignal2, _Emitter);
15460       var _super = _createSuper(AbortSignal2);
15461       function AbortSignal2() {
15462         var _this;
15463         _classCallCheck(this, AbortSignal2);
15464         _this = _super.call(this);
15465         if (!_this.listeners) {
15466           Emitter.call(_assertThisInitialized(_this));
15467         }
15468         Object.defineProperty(_assertThisInitialized(_this), "aborted", {
15469           value: false,
15470           writable: true,
15471           configurable: true
15472         });
15473         Object.defineProperty(_assertThisInitialized(_this), "onabort", {
15474           value: null,
15475           writable: true,
15476           configurable: true
15477         });
15478         return _this;
15479       }
15480       _createClass(AbortSignal2, [{
15481         key: "toString",
15482         value: function toString2() {
15483           return "[object AbortSignal]";
15484         }
15485       }, {
15486         key: "dispatchEvent",
15487         value: function dispatchEvent2(event) {
15488           if (event.type === "abort") {
15489             this.aborted = true;
15490             if (typeof this.onabort === "function") {
15491               this.onabort.call(this, event);
15492             }
15493           }
15494           _get(_getPrototypeOf(AbortSignal2.prototype), "dispatchEvent", this).call(this, event);
15495         }
15496       }]);
15497       return AbortSignal2;
15498     }(Emitter);
15499     var AbortController2 = /* @__PURE__ */ function() {
15500       function AbortController3() {
15501         _classCallCheck(this, AbortController3);
15502         Object.defineProperty(this, "signal", {
15503           value: new AbortSignal(),
15504           writable: true,
15505           configurable: true
15506         });
15507       }
15508       _createClass(AbortController3, [{
15509         key: "abort",
15510         value: function abort() {
15511           var event;
15512           try {
15513             event = new Event("abort");
15514           } catch (e) {
15515             if (typeof document !== "undefined") {
15516               if (!document.createEvent) {
15517                 event = document.createEventObject();
15518                 event.type = "abort";
15519               } else {
15520                 event = document.createEvent("Event");
15521                 event.initEvent("abort", false, false);
15522               }
15523             } else {
15524               event = {
15525                 type: "abort",
15526                 bubbles: false,
15527                 cancelable: false
15528               };
15529             }
15530           }
15531           this.signal.dispatchEvent(event);
15532         }
15533       }, {
15534         key: "toString",
15535         value: function toString2() {
15536           return "[object AbortController]";
15537         }
15538       }]);
15539       return AbortController3;
15540     }();
15541     if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
15542       AbortController2.prototype[Symbol.toStringTag] = "AbortController";
15543       AbortSignal.prototype[Symbol.toStringTag] = "AbortSignal";
15544     }
15545     function polyfillNeeded(self2) {
15546       if (self2.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
15547         console.log("__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill");
15548         return true;
15549       }
15550       return typeof self2.Request === "function" && !self2.Request.prototype.hasOwnProperty("signal") || !self2.AbortController;
15551     }
15552     function abortableFetchDecorator(patchTargets) {
15553       if ("function" === typeof patchTargets) {
15554         patchTargets = {
15555           fetch: patchTargets
15556         };
15557       }
15558       var _patchTargets = patchTargets, fetch3 = _patchTargets.fetch, _patchTargets$Request = _patchTargets.Request, NativeRequest = _patchTargets$Request === void 0 ? fetch3.Request : _patchTargets$Request, NativeAbortController = _patchTargets.AbortController, _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL, __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
15559       if (!polyfillNeeded({
15560         fetch: fetch3,
15561         Request: NativeRequest,
15562         AbortController: NativeAbortController,
15563         __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
15564       })) {
15565         return {
15566           fetch: fetch3,
15567           Request: Request2
15568         };
15569       }
15570       var Request2 = NativeRequest;
15571       if (Request2 && !Request2.prototype.hasOwnProperty("signal") || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
15572         Request2 = function Request3(input, init2) {
15573           var signal;
15574           if (init2 && init2.signal) {
15575             signal = init2.signal;
15576             delete init2.signal;
15577           }
15578           var request3 = new NativeRequest(input, init2);
15579           if (signal) {
15580             Object.defineProperty(request3, "signal", {
15581               writable: false,
15582               enumerable: false,
15583               configurable: true,
15584               value: signal
15585             });
15586           }
15587           return request3;
15588         };
15589         Request2.prototype = NativeRequest.prototype;
15590       }
15591       var realFetch = fetch3;
15592       var abortableFetch = function abortableFetch2(input, init2) {
15593         var signal = Request2 && Request2.prototype.isPrototypeOf(input) ? input.signal : init2 ? init2.signal : void 0;
15594         if (signal) {
15595           var abortError;
15596           try {
15597             abortError = new DOMException("Aborted", "AbortError");
15598           } catch (err) {
15599             abortError = new Error("Aborted");
15600             abortError.name = "AbortError";
15601           }
15602           if (signal.aborted) {
15603             return Promise.reject(abortError);
15604           }
15605           var cancellation = new Promise(function(_, reject) {
15606             signal.addEventListener("abort", function() {
15607               return reject(abortError);
15608             }, {
15609               once: true
15610             });
15611           });
15612           if (init2 && init2.signal) {
15613             delete init2.signal;
15614           }
15615           return Promise.race([cancellation, realFetch(input, init2)]);
15616         }
15617         return realFetch(input, init2);
15618       };
15619       return {
15620         fetch: abortableFetch,
15621         Request: Request2
15622       };
15623     }
15624     (function(self2) {
15625       if (!polyfillNeeded(self2)) {
15626         return;
15627       }
15628       if (!self2.fetch) {
15629         console.warn("fetch() is not available, cannot install abortcontroller-polyfill");
15630         return;
15631       }
15632       var _abortableFetch = abortableFetchDecorator(self2), fetch3 = _abortableFetch.fetch, Request2 = _abortableFetch.Request;
15633       self2.fetch = fetch3;
15634       self2.Request = Request2;
15635       Object.defineProperty(self2, "AbortController", {
15636         writable: true,
15637         enumerable: false,
15638         configurable: true,
15639         value: AbortController2
15640       });
15641       Object.defineProperty(self2, "AbortSignal", {
15642         writable: true,
15643         enumerable: false,
15644         configurable: true,
15645         value: AbortSignal
15646       });
15647     })(typeof self !== "undefined" ? self : global);
15648   });
15649
15650   // modules/index.js
15651   var modules_exports = {};
15652   __export(modules_exports, {
15653     LocationManager: () => LocationManager,
15654     QAItem: () => QAItem,
15655     actionAddEntity: () => actionAddEntity,
15656     actionAddMember: () => actionAddMember,
15657     actionAddMidpoint: () => actionAddMidpoint,
15658     actionAddVertex: () => actionAddVertex,
15659     actionChangeMember: () => actionChangeMember,
15660     actionChangePreset: () => actionChangePreset,
15661     actionChangeTags: () => actionChangeTags,
15662     actionCircularize: () => actionCircularize,
15663     actionConnect: () => actionConnect,
15664     actionCopyEntities: () => actionCopyEntities,
15665     actionDeleteMember: () => actionDeleteMember,
15666     actionDeleteMultiple: () => actionDeleteMultiple,
15667     actionDeleteNode: () => actionDeleteNode,
15668     actionDeleteRelation: () => actionDeleteRelation,
15669     actionDeleteWay: () => actionDeleteWay,
15670     actionDiscardTags: () => actionDiscardTags,
15671     actionDisconnect: () => actionDisconnect,
15672     actionExtract: () => actionExtract,
15673     actionJoin: () => actionJoin,
15674     actionMerge: () => actionMerge,
15675     actionMergeNodes: () => actionMergeNodes,
15676     actionMergePolygon: () => actionMergePolygon,
15677     actionMergeRemoteChanges: () => actionMergeRemoteChanges,
15678     actionMove: () => actionMove,
15679     actionMoveMember: () => actionMoveMember,
15680     actionMoveNode: () => actionMoveNode,
15681     actionNoop: () => actionNoop,
15682     actionOrthogonalize: () => actionOrthogonalize,
15683     actionReflect: () => actionReflect,
15684     actionRestrictTurn: () => actionRestrictTurn,
15685     actionReverse: () => actionReverse,
15686     actionRevert: () => actionRevert,
15687     actionRotate: () => actionRotate,
15688     actionScale: () => actionScale,
15689     actionSplit: () => actionSplit,
15690     actionStraightenNodes: () => actionStraightenNodes,
15691     actionStraightenWay: () => actionStraightenWay,
15692     actionUnrestrictTurn: () => actionUnrestrictTurn,
15693     actionUpgradeTags: () => actionUpgradeTags,
15694     behaviorAddWay: () => behaviorAddWay,
15695     behaviorBreathe: () => behaviorBreathe,
15696     behaviorDrag: () => behaviorDrag,
15697     behaviorDraw: () => behaviorDraw,
15698     behaviorDrawWay: () => behaviorDrawWay,
15699     behaviorEdit: () => behaviorEdit,
15700     behaviorHash: () => behaviorHash,
15701     behaviorHover: () => behaviorHover,
15702     behaviorLasso: () => behaviorLasso,
15703     behaviorOperation: () => behaviorOperation,
15704     behaviorPaste: () => behaviorPaste,
15705     behaviorSelect: () => behaviorSelect,
15706     coreContext: () => coreContext,
15707     coreDifference: () => coreDifference,
15708     coreFileFetcher: () => coreFileFetcher,
15709     coreGraph: () => coreGraph,
15710     coreHistory: () => coreHistory,
15711     coreLocalizer: () => coreLocalizer,
15712     coreTree: () => coreTree,
15713     coreUploader: () => coreUploader,
15714     coreValidator: () => coreValidator,
15715     d3: () => d3,
15716     debug: () => debug,
15717     fileFetcher: () => _mainFileFetcher,
15718     geoAngle: () => geoAngle,
15719     geoChooseEdge: () => geoChooseEdge,
15720     geoEdgeEqual: () => geoEdgeEqual,
15721     geoExtent: () => geoExtent,
15722     geoGetSmallestSurroundingRectangle: () => geoGetSmallestSurroundingRectangle,
15723     geoHasLineIntersections: () => geoHasLineIntersections,
15724     geoHasSelfIntersections: () => geoHasSelfIntersections,
15725     geoLatToMeters: () => geoLatToMeters,
15726     geoLineIntersection: () => geoLineIntersection,
15727     geoLonToMeters: () => geoLonToMeters,
15728     geoMetersToLat: () => geoMetersToLat,
15729     geoMetersToLon: () => geoMetersToLon,
15730     geoMetersToOffset: () => geoMetersToOffset,
15731     geoOffsetToMeters: () => geoOffsetToMeters,
15732     geoOrthoCalcScore: () => geoOrthoCalcScore,
15733     geoOrthoCanOrthogonalize: () => geoOrthoCanOrthogonalize,
15734     geoOrthoMaxOffsetAngle: () => geoOrthoMaxOffsetAngle,
15735     geoOrthoNormalizedDotProduct: () => geoOrthoNormalizedDotProduct,
15736     geoPathHasIntersections: () => geoPathHasIntersections,
15737     geoPathIntersections: () => geoPathIntersections,
15738     geoPathLength: () => geoPathLength,
15739     geoPointInPolygon: () => geoPointInPolygon,
15740     geoPolygonContainsPolygon: () => geoPolygonContainsPolygon,
15741     geoPolygonIntersectsPolygon: () => geoPolygonIntersectsPolygon,
15742     geoRawMercator: () => geoRawMercator,
15743     geoRotate: () => geoRotate,
15744     geoScaleToZoom: () => geoScaleToZoom,
15745     geoSphericalClosestNode: () => geoSphericalClosestNode,
15746     geoSphericalDistance: () => geoSphericalDistance,
15747     geoVecAdd: () => geoVecAdd,
15748     geoVecAngle: () => geoVecAngle,
15749     geoVecCross: () => geoVecCross,
15750     geoVecDot: () => geoVecDot,
15751     geoVecEqual: () => geoVecEqual,
15752     geoVecFloor: () => geoVecFloor,
15753     geoVecInterp: () => geoVecInterp,
15754     geoVecLength: () => geoVecLength,
15755     geoVecLengthSquare: () => geoVecLengthSquare,
15756     geoVecNormalize: () => geoVecNormalize,
15757     geoVecNormalizedDot: () => geoVecNormalizedDot,
15758     geoVecProject: () => geoVecProject,
15759     geoVecScale: () => geoVecScale,
15760     geoVecSubtract: () => geoVecSubtract,
15761     geoViewportEdge: () => geoViewportEdge,
15762     geoZoomToScale: () => geoZoomToScale,
15763     localizer: () => _mainLocalizer,
15764     locationManager: () => _sharedLocationManager,
15765     modeAddArea: () => modeAddArea,
15766     modeAddLine: () => modeAddLine,
15767     modeAddNote: () => modeAddNote,
15768     modeAddPoint: () => modeAddPoint,
15769     modeBrowse: () => modeBrowse,
15770     modeDragNode: () => modeDragNode,
15771     modeDragNote: () => modeDragNote,
15772     modeDrawArea: () => modeDrawArea,
15773     modeDrawLine: () => modeDrawLine,
15774     modeMove: () => modeMove,
15775     modeRotate: () => modeRotate,
15776     modeSave: () => modeSave,
15777     modeSelect: () => modeSelect,
15778     modeSelectData: () => modeSelectData,
15779     modeSelectError: () => modeSelectError,
15780     modeSelectNote: () => modeSelectNote,
15781     operationCircularize: () => operationCircularize,
15782     operationContinue: () => operationContinue,
15783     operationCopy: () => operationCopy,
15784     operationDelete: () => operationDelete,
15785     operationDisconnect: () => operationDisconnect,
15786     operationDowngrade: () => operationDowngrade,
15787     operationExtract: () => operationExtract,
15788     operationMerge: () => operationMerge,
15789     operationMove: () => operationMove,
15790     operationOrthogonalize: () => operationOrthogonalize,
15791     operationPaste: () => operationPaste,
15792     operationReflectLong: () => operationReflectLong,
15793     operationReflectShort: () => operationReflectShort,
15794     operationReverse: () => operationReverse,
15795     operationRotate: () => operationRotate,
15796     operationSplit: () => operationSplit,
15797     operationStraighten: () => operationStraighten,
15798     osmAreaKeys: () => osmAreaKeys,
15799     osmChangeset: () => osmChangeset,
15800     osmEntity: () => osmEntity,
15801     osmFlowingWaterwayTagValues: () => osmFlowingWaterwayTagValues,
15802     osmInferRestriction: () => osmInferRestriction,
15803     osmIntersection: () => osmIntersection,
15804     osmIsInterestingTag: () => osmIsInterestingTag,
15805     osmIsOldMultipolygonOuterMember: () => osmIsOldMultipolygonOuterMember,
15806     osmJoinWays: () => osmJoinWays,
15807     osmLanes: () => osmLanes,
15808     osmLifecyclePrefixes: () => osmLifecyclePrefixes,
15809     osmNode: () => osmNode,
15810     osmNodeGeometriesForTags: () => osmNodeGeometriesForTags,
15811     osmNote: () => osmNote,
15812     osmOldMultipolygonOuterMember: () => osmOldMultipolygonOuterMember,
15813     osmOldMultipolygonOuterMemberOfRelation: () => osmOldMultipolygonOuterMemberOfRelation,
15814     osmOneWayTags: () => osmOneWayTags,
15815     osmPavedTags: () => osmPavedTags,
15816     osmPointTags: () => osmPointTags,
15817     osmRailwayTrackTagValues: () => osmRailwayTrackTagValues,
15818     osmRelation: () => osmRelation,
15819     osmRemoveLifecyclePrefix: () => osmRemoveLifecyclePrefix,
15820     osmRoutableHighwayTagValues: () => osmRoutableHighwayTagValues,
15821     osmSetAreaKeys: () => osmSetAreaKeys,
15822     osmSetPointTags: () => osmSetPointTags,
15823     osmSetVertexTags: () => osmSetVertexTags,
15824     osmTagSuggestingArea: () => osmTagSuggestingArea,
15825     osmTurn: () => osmTurn,
15826     osmVertexTags: () => osmVertexTags,
15827     osmWay: () => osmWay,
15828     prefs: () => corePreferences,
15829     presetCategory: () => presetCategory,
15830     presetCollection: () => presetCollection,
15831     presetField: () => presetField,
15832     presetIndex: () => presetIndex,
15833     presetManager: () => _mainPresetIndex,
15834     presetPreset: () => presetPreset,
15835     rendererBackground: () => rendererBackground,
15836     rendererBackgroundSource: () => rendererBackgroundSource,
15837     rendererFeatures: () => rendererFeatures,
15838     rendererMap: () => rendererMap,
15839     rendererPhotos: () => rendererPhotos,
15840     rendererTileLayer: () => rendererTileLayer,
15841     serviceImproveOSM: () => improveOSM_default,
15842     serviceKartaview: () => kartaview_default,
15843     serviceKeepRight: () => keepRight_default,
15844     serviceMapRules: () => maprules_default,
15845     serviceMapillary: () => mapillary_default,
15846     serviceNominatim: () => nominatim_default,
15847     serviceNsi: () => nsi_default,
15848     serviceOsm: () => osm_default,
15849     serviceOsmWikibase: () => osm_wikibase_default,
15850     serviceOsmose: () => osmose_default,
15851     serviceStreetside: () => streetside_default,
15852     serviceTaginfo: () => taginfo_default,
15853     serviceVectorTile: () => vector_tile_default,
15854     serviceWikidata: () => wikidata_default,
15855     serviceWikipedia: () => wikipedia_default,
15856     services: () => services,
15857     svgAreas: () => svgAreas,
15858     svgData: () => svgData,
15859     svgDebug: () => svgDebug,
15860     svgDefs: () => svgDefs,
15861     svgGeolocate: () => svgGeolocate,
15862     svgIcon: () => svgIcon,
15863     svgKartaviewImages: () => svgKartaviewImages,
15864     svgKeepRight: () => svgKeepRight,
15865     svgLabels: () => svgLabels,
15866     svgLayers: () => svgLayers,
15867     svgLines: () => svgLines,
15868     svgMapillaryImages: () => svgMapillaryImages,
15869     svgMapillarySigns: () => svgMapillarySigns,
15870     svgMarkerSegments: () => svgMarkerSegments,
15871     svgMidpoints: () => svgMidpoints,
15872     svgNotes: () => svgNotes,
15873     svgOsm: () => svgOsm,
15874     svgPassiveVertex: () => svgPassiveVertex,
15875     svgPath: () => svgPath,
15876     svgPointTransform: () => svgPointTransform,
15877     svgPoints: () => svgPoints,
15878     svgRelationMemberTags: () => svgRelationMemberTags,
15879     svgSegmentWay: () => svgSegmentWay,
15880     svgStreetside: () => svgStreetside,
15881     svgTagClasses: () => svgTagClasses,
15882     svgTagPattern: () => svgTagPattern,
15883     svgTouch: () => svgTouch,
15884     svgTurns: () => svgTurns,
15885     svgVertices: () => svgVertices,
15886     t: () => _t,
15887     uiAccount: () => uiAccount,
15888     uiAttribution: () => uiAttribution,
15889     uiChangesetEditor: () => uiChangesetEditor,
15890     uiCmd: () => uiCmd,
15891     uiCombobox: () => uiCombobox,
15892     uiCommit: () => uiCommit,
15893     uiCommitWarnings: () => uiCommitWarnings,
15894     uiConfirm: () => uiConfirm,
15895     uiConflicts: () => uiConflicts,
15896     uiContributors: () => uiContributors,
15897     uiCurtain: () => uiCurtain,
15898     uiDataEditor: () => uiDataEditor,
15899     uiDataHeader: () => uiDataHeader,
15900     uiDisclosure: () => uiDisclosure,
15901     uiEditMenu: () => uiEditMenu,
15902     uiEntityEditor: () => uiEntityEditor,
15903     uiFeatureInfo: () => uiFeatureInfo,
15904     uiFeatureList: () => uiFeatureList,
15905     uiField: () => uiField,
15906     uiFieldAccess: () => uiFieldAccess,
15907     uiFieldAddress: () => uiFieldAddress,
15908     uiFieldCheck: () => uiFieldCheck,
15909     uiFieldColour: () => uiFieldText,
15910     uiFieldCombo: () => uiFieldCombo,
15911     uiFieldDefaultCheck: () => uiFieldCheck,
15912     uiFieldDirectionalCombo: () => uiFieldDirectionalCombo,
15913     uiFieldEmail: () => uiFieldText,
15914     uiFieldHelp: () => uiFieldHelp,
15915     uiFieldIdentifier: () => uiFieldText,
15916     uiFieldLanes: () => uiFieldLanes,
15917     uiFieldLocalized: () => uiFieldLocalized,
15918     uiFieldManyCombo: () => uiFieldCombo,
15919     uiFieldMultiCombo: () => uiFieldCombo,
15920     uiFieldNetworkCombo: () => uiFieldCombo,
15921     uiFieldNumber: () => uiFieldText,
15922     uiFieldOnewayCheck: () => uiFieldCheck,
15923     uiFieldRadio: () => uiFieldRadio,
15924     uiFieldRestrictions: () => uiFieldRestrictions,
15925     uiFieldRoadheight: () => uiFieldRoadheight,
15926     uiFieldRoadspeed: () => uiFieldRoadspeed,
15927     uiFieldSemiCombo: () => uiFieldCombo,
15928     uiFieldStructureRadio: () => uiFieldRadio,
15929     uiFieldTel: () => uiFieldText,
15930     uiFieldText: () => uiFieldText,
15931     uiFieldTextarea: () => uiFieldTextarea,
15932     uiFieldTypeCombo: () => uiFieldCombo,
15933     uiFieldUrl: () => uiFieldText,
15934     uiFieldWikidata: () => uiFieldWikidata,
15935     uiFieldWikipedia: () => uiFieldWikipedia,
15936     uiFields: () => uiFields,
15937     uiFlash: () => uiFlash,
15938     uiFormFields: () => uiFormFields,
15939     uiFullScreen: () => uiFullScreen,
15940     uiGeolocate: () => uiGeolocate,
15941     uiImproveOsmComments: () => uiImproveOsmComments,
15942     uiImproveOsmDetails: () => uiImproveOsmDetails,
15943     uiImproveOsmEditor: () => uiImproveOsmEditor,
15944     uiImproveOsmHeader: () => uiImproveOsmHeader,
15945     uiInfo: () => uiInfo,
15946     uiInfoPanels: () => uiInfoPanels,
15947     uiInit: () => uiInit,
15948     uiInspector: () => uiInspector,
15949     uiIntro: () => uiIntro,
15950     uiIssuesInfo: () => uiIssuesInfo,
15951     uiKeepRightDetails: () => uiKeepRightDetails,
15952     uiKeepRightEditor: () => uiKeepRightEditor,
15953     uiKeepRightHeader: () => uiKeepRightHeader,
15954     uiLasso: () => uiLasso,
15955     uiLengthIndicator: () => uiLengthIndicator,
15956     uiLoading: () => uiLoading,
15957     uiMapInMap: () => uiMapInMap,
15958     uiModal: () => uiModal,
15959     uiNoteComments: () => uiNoteComments,
15960     uiNoteEditor: () => uiNoteEditor,
15961     uiNoteHeader: () => uiNoteHeader,
15962     uiNoteReport: () => uiNoteReport,
15963     uiNotice: () => uiNotice,
15964     uiPaneBackground: () => uiPaneBackground,
15965     uiPaneHelp: () => uiPaneHelp,
15966     uiPaneIssues: () => uiPaneIssues,
15967     uiPaneMapData: () => uiPaneMapData,
15968     uiPanePreferences: () => uiPanePreferences,
15969     uiPanelBackground: () => uiPanelBackground,
15970     uiPanelHistory: () => uiPanelHistory,
15971     uiPanelLocation: () => uiPanelLocation,
15972     uiPanelMeasurement: () => uiPanelMeasurement,
15973     uiPopover: () => uiPopover,
15974     uiPresetIcon: () => uiPresetIcon,
15975     uiPresetList: () => uiPresetList,
15976     uiRestore: () => uiRestore,
15977     uiScale: () => uiScale,
15978     uiSectionBackgroundDisplayOptions: () => uiSectionBackgroundDisplayOptions,
15979     uiSectionBackgroundList: () => uiSectionBackgroundList,
15980     uiSectionBackgroundOffset: () => uiSectionBackgroundOffset,
15981     uiSectionChanges: () => uiSectionChanges,
15982     uiSectionDataLayers: () => uiSectionDataLayers,
15983     uiSectionEntityIssues: () => uiSectionEntityIssues,
15984     uiSectionFeatureType: () => uiSectionFeatureType,
15985     uiSectionMapFeatures: () => uiSectionMapFeatures,
15986     uiSectionMapStyleOptions: () => uiSectionMapStyleOptions,
15987     uiSectionOverlayList: () => uiSectionOverlayList,
15988     uiSectionPhotoOverlays: () => uiSectionPhotoOverlays,
15989     uiSectionPresetFields: () => uiSectionPresetFields,
15990     uiSectionPrivacy: () => uiSectionPrivacy,
15991     uiSectionRawMemberEditor: () => uiSectionRawMemberEditor,
15992     uiSectionRawMembershipEditor: () => uiSectionRawMembershipEditor,
15993     uiSectionRawTagEditor: () => uiSectionRawTagEditor,
15994     uiSectionSelectionList: () => uiSectionSelectionList,
15995     uiSectionValidationIssues: () => uiSectionValidationIssues,
15996     uiSectionValidationOptions: () => uiSectionValidationOptions,
15997     uiSectionValidationRules: () => uiSectionValidationRules,
15998     uiSectionValidationStatus: () => uiSectionValidationStatus,
15999     uiSettingsCustomBackground: () => uiSettingsCustomBackground,
16000     uiSettingsCustomData: () => uiSettingsCustomData,
16001     uiSidebar: () => uiSidebar,
16002     uiSourceSwitch: () => uiSourceSwitch,
16003     uiSpinner: () => uiSpinner,
16004     uiSplash: () => uiSplash,
16005     uiStatus: () => uiStatus,
16006     uiSuccess: () => uiSuccess,
16007     uiTagReference: () => uiTagReference,
16008     uiToggle: () => uiToggle,
16009     uiTooltip: () => uiTooltip,
16010     uiVersion: () => uiVersion,
16011     uiViewOnKeepRight: () => uiViewOnKeepRight,
16012     uiViewOnOSM: () => uiViewOnOSM,
16013     uiZoom: () => uiZoom,
16014     utilAesDecrypt: () => utilAesDecrypt,
16015     utilAesEncrypt: () => utilAesEncrypt,
16016     utilArrayChunk: () => utilArrayChunk,
16017     utilArrayDifference: () => utilArrayDifference,
16018     utilArrayFlatten: () => utilArrayFlatten,
16019     utilArrayGroupBy: () => utilArrayGroupBy,
16020     utilArrayIdentical: () => utilArrayIdentical,
16021     utilArrayIntersection: () => utilArrayIntersection,
16022     utilArrayUnion: () => utilArrayUnion,
16023     utilArrayUniq: () => utilArrayUniq,
16024     utilArrayUniqBy: () => utilArrayUniqBy,
16025     utilAsyncMap: () => utilAsyncMap,
16026     utilCleanOsmString: () => utilCleanOsmString,
16027     utilCleanTags: () => utilCleanTags,
16028     utilCombinedTags: () => utilCombinedTags,
16029     utilCompareIDs: () => utilCompareIDs,
16030     utilDeepMemberSelector: () => utilDeepMemberSelector,
16031     utilDetect: () => utilDetect,
16032     utilDisplayLabel: () => utilDisplayLabel,
16033     utilDisplayName: () => utilDisplayName,
16034     utilDisplayNameForPath: () => utilDisplayNameForPath,
16035     utilDisplayType: () => utilDisplayType,
16036     utilEditDistance: () => utilEditDistance,
16037     utilEntityAndDeepMemberIDs: () => utilEntityAndDeepMemberIDs,
16038     utilEntityOrDeepMemberSelector: () => utilEntityOrDeepMemberSelector,
16039     utilEntityOrMemberSelector: () => utilEntityOrMemberSelector,
16040     utilEntityRoot: () => utilEntityRoot,
16041     utilEntitySelector: () => utilEntitySelector,
16042     utilFastMouse: () => utilFastMouse,
16043     utilFunctor: () => utilFunctor,
16044     utilGetAllNodes: () => utilGetAllNodes,
16045     utilGetSetValue: () => utilGetSetValue,
16046     utilHashcode: () => utilHashcode,
16047     utilHighlightEntities: () => utilHighlightEntities,
16048     utilKeybinding: () => utilKeybinding,
16049     utilNoAuto: () => utilNoAuto,
16050     utilObjectOmit: () => utilObjectOmit,
16051     utilOldestID: () => utilOldestID,
16052     utilPrefixCSSProperty: () => utilPrefixCSSProperty,
16053     utilPrefixDOMProperty: () => utilPrefixDOMProperty,
16054     utilQsString: () => utilQsString,
16055     utilRebind: () => utilRebind,
16056     utilSafeClassName: () => utilSafeClassName,
16057     utilSessionMutex: () => utilSessionMutex,
16058     utilSetTransform: () => utilSetTransform,
16059     utilStringQs: () => utilStringQs,
16060     utilTagDiff: () => utilTagDiff,
16061     utilTagText: () => utilTagText,
16062     utilTiler: () => utilTiler,
16063     utilTotalExtent: () => utilTotalExtent,
16064     utilTriggerEvent: () => utilTriggerEvent,
16065     utilUnicodeCharsCount: () => utilUnicodeCharsCount,
16066     utilUnicodeCharsTruncated: () => utilUnicodeCharsTruncated,
16067     utilUniqueDomId: () => utilUniqueDomId,
16068     utilWrap: () => utilWrap,
16069     validationAlmostJunction: () => validationAlmostJunction,
16070     validationCloseNodes: () => validationCloseNodes,
16071     validationCrossingWays: () => validationCrossingWays,
16072     validationDisconnectedWay: () => validationDisconnectedWay,
16073     validationFormatting: () => validationFormatting,
16074     validationHelpRequest: () => validationHelpRequest,
16075     validationImpossibleOneway: () => validationImpossibleOneway,
16076     validationIncompatibleSource: () => validationIncompatibleSource,
16077     validationMaprules: () => validationMaprules,
16078     validationMismatchedGeometry: () => validationMismatchedGeometry,
16079     validationMissingRole: () => validationMissingRole,
16080     validationMissingTag: () => validationMissingTag,
16081     validationOutdatedTags: () => validationOutdatedTags,
16082     validationPrivateData: () => validationPrivateData,
16083     validationSuspiciousName: () => validationSuspiciousName,
16084     validationUnsquareWay: () => validationUnsquareWay
16085   });
16086
16087   // modules/actions/add_entity.js
16088   function actionAddEntity(way) {
16089     return function(graph) {
16090       return graph.replace(way);
16091     };
16092   }
16093
16094   // modules/actions/reverse.js
16095   function actionReverse(entityID, options2) {
16096     var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
16097     var numeric = /^([+\-]?)(?=[\d.])/;
16098     var directionKey = /direction$/;
16099     var turn_lanes = /^turn:lanes:?/;
16100     var keyReplacements = [
16101       [/:right$/, ":left"],
16102       [/:left$/, ":right"],
16103       [/:forward$/, ":backward"],
16104       [/:backward$/, ":forward"],
16105       [/:right:/, ":left:"],
16106       [/:left:/, ":right:"],
16107       [/:forward:/, ":backward:"],
16108       [/:backward:/, ":forward:"]
16109     ];
16110     var valueReplacements = {
16111       left: "right",
16112       right: "left",
16113       up: "down",
16114       down: "up",
16115       forward: "backward",
16116       backward: "forward",
16117       forwards: "backward",
16118       backwards: "forward"
16119     };
16120     var roleReplacements = {
16121       forward: "backward",
16122       backward: "forward",
16123       forwards: "backward",
16124       backwards: "forward"
16125     };
16126     var onewayReplacements = {
16127       yes: "-1",
16128       "1": "-1",
16129       "-1": "yes"
16130     };
16131     var compassReplacements = {
16132       N: "S",
16133       NNE: "SSW",
16134       NE: "SW",
16135       ENE: "WSW",
16136       E: "W",
16137       ESE: "WNW",
16138       SE: "NW",
16139       SSE: "NNW",
16140       S: "N",
16141       SSW: "NNE",
16142       SW: "NE",
16143       WSW: "ENE",
16144       W: "E",
16145       WNW: "ESE",
16146       NW: "SE",
16147       NNW: "SSE"
16148     };
16149     function reverseKey(key) {
16150       for (var i2 = 0; i2 < keyReplacements.length; ++i2) {
16151         var replacement = keyReplacements[i2];
16152         if (replacement[0].test(key)) {
16153           return key.replace(replacement[0], replacement[1]);
16154         }
16155       }
16156       return key;
16157     }
16158     function reverseValue(key, value, includeAbsolute) {
16159       if (ignoreKey.test(key))
16160         return value;
16161       if (turn_lanes.test(key)) {
16162         return value;
16163       } else if (key === "incline" && numeric.test(value)) {
16164         return value.replace(numeric, function(_, sign2) {
16165           return sign2 === "-" ? "" : "-";
16166         });
16167       } else if (options2 && options2.reverseOneway && key === "oneway") {
16168         return onewayReplacements[value] || value;
16169       } else if (includeAbsolute && directionKey.test(key)) {
16170         return value.split(";").map((value2) => {
16171           if (compassReplacements[value2])
16172             return compassReplacements[value2];
16173           var degrees3 = Number(value2);
16174           if (isFinite(degrees3)) {
16175             if (degrees3 < 180) {
16176               degrees3 += 180;
16177             } else {
16178               degrees3 -= 180;
16179             }
16180             return degrees3.toString();
16181           } else {
16182             return valueReplacements[value2] || value2;
16183           }
16184         }).join(";");
16185       }
16186       return valueReplacements[value] || value;
16187     }
16188     function reverseNodeTags(graph, nodeIDs) {
16189       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
16190         var node = graph.hasEntity(nodeIDs[i2]);
16191         if (!node || !Object.keys(node.tags).length)
16192           continue;
16193         var tags = {};
16194         for (var key in node.tags) {
16195           tags[reverseKey(key)] = reverseValue(key, node.tags[key], node.id === entityID);
16196         }
16197         graph = graph.replace(node.update({ tags }));
16198       }
16199       return graph;
16200     }
16201     function reverseWay(graph, way) {
16202       var nodes = way.nodes.slice().reverse();
16203       var tags = {};
16204       var role;
16205       for (var key in way.tags) {
16206         tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
16207       }
16208       graph.parentRelations(way).forEach(function(relation) {
16209         relation.members.forEach(function(member, index) {
16210           if (member.id === way.id && (role = roleReplacements[member.role])) {
16211             relation = relation.updateMember({ role }, index);
16212             graph = graph.replace(relation);
16213           }
16214         });
16215       });
16216       return reverseNodeTags(graph, nodes).replace(way.update({ nodes, tags }));
16217     }
16218     var action = function(graph) {
16219       var entity = graph.entity(entityID);
16220       if (entity.type === "way") {
16221         return reverseWay(graph, entity);
16222       }
16223       return reverseNodeTags(graph, [entityID]);
16224     };
16225     action.disabled = function(graph) {
16226       var entity = graph.hasEntity(entityID);
16227       if (!entity || entity.type === "way")
16228         return false;
16229       for (var key in entity.tags) {
16230         var value = entity.tags[key];
16231         if (reverseKey(key) !== key || reverseValue(key, value, true) !== value) {
16232           return false;
16233         }
16234       }
16235       return "nondirectional_node";
16236     };
16237     action.entityID = function() {
16238       return entityID;
16239     };
16240     return action;
16241   }
16242
16243   // modules/osm/tags.js
16244   function osmIsInterestingTag(key) {
16245     return key !== "attribution" && key !== "created_by" && key !== "source" && key !== "odbl" && key.indexOf("source:") !== 0 && key.indexOf("source_ref") !== 0 && // purposely exclude colon
16246     key.indexOf("tiger:") !== 0;
16247   }
16248   var osmLifecyclePrefixes = {
16249     // nonexistent, might be built
16250     proposed: true,
16251     planned: true,
16252     // under maintentance or between groundbreaking and opening
16253     construction: true,
16254     // existent but not functional
16255     disused: true,
16256     // dilapidated to nonexistent
16257     abandoned: true,
16258     was: true,
16259     // nonexistent, still may appear in imagery
16260     dismantled: true,
16261     razed: true,
16262     demolished: true,
16263     destroyed: true,
16264     removed: true,
16265     obliterated: true,
16266     // existent occasionally, e.g. stormwater drainage basin
16267     intermittent: true
16268   };
16269   function osmRemoveLifecyclePrefix(key) {
16270     const keySegments = key.split(":");
16271     if (keySegments.length === 1)
16272       return key;
16273     if (keySegments[0] in osmLifecyclePrefixes) {
16274       return key.slice(keySegments[0].length + 1);
16275     }
16276     return key;
16277   }
16278   var osmAreaKeys = {};
16279   function osmSetAreaKeys(value) {
16280     osmAreaKeys = value;
16281   }
16282   var osmAreaKeysExceptions = {
16283     highway: {
16284       elevator: true,
16285       rest_area: true,
16286       services: true
16287     },
16288     public_transport: {
16289       platform: true
16290     },
16291     railway: {
16292       platform: true,
16293       roundhouse: true,
16294       station: true,
16295       traverser: true,
16296       turntable: true,
16297       wash: true
16298     },
16299     traffic_calming: {
16300       island: true
16301     },
16302     waterway: {
16303       dam: true
16304     }
16305   };
16306   function osmTagSuggestingArea(tags) {
16307     if (tags.area === "yes")
16308       return { area: "yes" };
16309     if (tags.area === "no")
16310       return null;
16311     var returnTags = {};
16312     for (var realKey in tags) {
16313       const key = osmRemoveLifecyclePrefix(realKey);
16314       if (key in osmAreaKeys && !(tags[key] in osmAreaKeys[key])) {
16315         returnTags[realKey] = tags[realKey];
16316         return returnTags;
16317       }
16318       if (key in osmAreaKeysExceptions && tags[key] in osmAreaKeysExceptions[key]) {
16319         returnTags[realKey] = tags[realKey];
16320         return returnTags;
16321       }
16322     }
16323     return null;
16324   }
16325   var osmLineTags = {};
16326   function osmSetLineTags(value) {
16327     osmLineTags = value;
16328   }
16329   var osmPointTags = {};
16330   function osmSetPointTags(value) {
16331     osmPointTags = value;
16332   }
16333   var osmVertexTags = {};
16334   function osmSetVertexTags(value) {
16335     osmVertexTags = value;
16336   }
16337   function osmNodeGeometriesForTags(nodeTags) {
16338     var geometries = {};
16339     for (var key in nodeTags) {
16340       if (osmPointTags[key] && (osmPointTags[key]["*"] || osmPointTags[key][nodeTags[key]])) {
16341         geometries.point = true;
16342       }
16343       if (osmVertexTags[key] && (osmVertexTags[key]["*"] || osmVertexTags[key][nodeTags[key]])) {
16344         geometries.vertex = true;
16345       }
16346       if (geometries.point && geometries.vertex)
16347         break;
16348     }
16349     return geometries;
16350   }
16351   var osmOneWayTags = {
16352     "aerialway": {
16353       "chair_lift": true,
16354       "drag_lift": true,
16355       "j-bar": true,
16356       "magic_carpet": true,
16357       "mixed_lift": true,
16358       "platter": true,
16359       "rope_tow": true,
16360       "t-bar": true,
16361       "zip_line": true
16362     },
16363     "highway": {
16364       "motorway": true
16365     },
16366     "junction": {
16367       "circular": true,
16368       "roundabout": true
16369     },
16370     "man_made": {
16371       "goods_conveyor": true,
16372       "piste:halfpipe": true
16373     },
16374     "piste:type": {
16375       "downhill": true,
16376       "sled": true,
16377       "yes": true
16378     },
16379     "seamark:type": {
16380       "separation_lane": true,
16381       "separation_roundabout": true
16382     },
16383     "waterway": {
16384       "canal": true,
16385       "ditch": true,
16386       "drain": true,
16387       "fish_pass": true,
16388       "river": true,
16389       "stream": true,
16390       "tidal_channel": true
16391     }
16392   };
16393   var osmPavedTags = {
16394     "surface": {
16395       "paved": true,
16396       "asphalt": true,
16397       "concrete": true,
16398       "chipseal": true,
16399       "concrete:lanes": true,
16400       "concrete:plates": true
16401     },
16402     "tracktype": {
16403       "grade1": true
16404     }
16405   };
16406   var osmSemipavedTags = {
16407     "surface": {
16408       "cobblestone": true,
16409       "cobblestone:flattened": true,
16410       "unhewn_cobblestone": true,
16411       "sett": true,
16412       "paving_stones": true,
16413       "metal": true,
16414       "wood": true
16415     }
16416   };
16417   var osmRightSideIsInsideTags = {
16418     "natural": {
16419       "cliff": true,
16420       "coastline": "coastline"
16421     },
16422     "barrier": {
16423       "retaining_wall": true,
16424       "kerb": true,
16425       "guard_rail": true,
16426       "city_wall": true
16427     },
16428     "man_made": {
16429       "embankment": true
16430     },
16431     "waterway": {
16432       "weir": true
16433     }
16434   };
16435   var osmRoutableHighwayTagValues = {
16436     motorway: true,
16437     trunk: true,
16438     primary: true,
16439     secondary: true,
16440     tertiary: true,
16441     residential: true,
16442     motorway_link: true,
16443     trunk_link: true,
16444     primary_link: true,
16445     secondary_link: true,
16446     tertiary_link: true,
16447     unclassified: true,
16448     road: true,
16449     service: true,
16450     track: true,
16451     living_street: true,
16452     bus_guideway: true,
16453     path: true,
16454     footway: true,
16455     cycleway: true,
16456     bridleway: true,
16457     pedestrian: true,
16458     corridor: true,
16459     steps: true
16460   };
16461   var osmPathHighwayTagValues = {
16462     path: true,
16463     footway: true,
16464     cycleway: true,
16465     bridleway: true,
16466     pedestrian: true,
16467     corridor: true,
16468     steps: true
16469   };
16470   var osmRailwayTrackTagValues = {
16471     rail: true,
16472     light_rail: true,
16473     tram: true,
16474     subway: true,
16475     monorail: true,
16476     funicular: true,
16477     miniature: true,
16478     narrow_gauge: true,
16479     disused: true,
16480     preserved: true
16481   };
16482   var osmFlowingWaterwayTagValues = {
16483     canal: true,
16484     ditch: true,
16485     drain: true,
16486     fish_pass: true,
16487     river: true,
16488     stream: true,
16489     tidal_channel: true
16490   };
16491
16492   // node_modules/d3-array/src/ascending.js
16493   function ascending(a, b) {
16494     return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
16495   }
16496
16497   // node_modules/d3-array/src/descending.js
16498   function descending(a, b) {
16499     return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
16500   }
16501
16502   // node_modules/d3-array/src/bisector.js
16503   function bisector(f2) {
16504     let compare1, compare2, delta;
16505     if (f2.length !== 2) {
16506       compare1 = ascending;
16507       compare2 = (d, x) => ascending(f2(d), x);
16508       delta = (d, x) => f2(d) - x;
16509     } else {
16510       compare1 = f2 === ascending || f2 === descending ? f2 : zero;
16511       compare2 = f2;
16512       delta = f2;
16513     }
16514     function left(a, x, lo = 0, hi = a.length) {
16515       if (lo < hi) {
16516         if (compare1(x, x) !== 0)
16517           return hi;
16518         do {
16519           const mid = lo + hi >>> 1;
16520           if (compare2(a[mid], x) < 0)
16521             lo = mid + 1;
16522           else
16523             hi = mid;
16524         } while (lo < hi);
16525       }
16526       return lo;
16527     }
16528     function right(a, x, lo = 0, hi = a.length) {
16529       if (lo < hi) {
16530         if (compare1(x, x) !== 0)
16531           return hi;
16532         do {
16533           const mid = lo + hi >>> 1;
16534           if (compare2(a[mid], x) <= 0)
16535             lo = mid + 1;
16536           else
16537             hi = mid;
16538         } while (lo < hi);
16539       }
16540       return lo;
16541     }
16542     function center(a, x, lo = 0, hi = a.length) {
16543       const i2 = left(a, x, lo, hi - 1);
16544       return i2 > lo && delta(a[i2 - 1], x) > -delta(a[i2], x) ? i2 - 1 : i2;
16545     }
16546     return { left, center, right };
16547   }
16548   function zero() {
16549     return 0;
16550   }
16551
16552   // node_modules/d3-array/src/number.js
16553   function number(x) {
16554     return x === null ? NaN : +x;
16555   }
16556   function* numbers(values, valueof) {
16557     if (valueof === void 0) {
16558       for (let value of values) {
16559         if (value != null && (value = +value) >= value) {
16560           yield value;
16561         }
16562       }
16563     } else {
16564       let index = -1;
16565       for (let value of values) {
16566         if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {
16567           yield value;
16568         }
16569       }
16570     }
16571   }
16572
16573   // node_modules/d3-array/src/bisect.js
16574   var ascendingBisect = bisector(ascending);
16575   var bisectRight = ascendingBisect.right;
16576   var bisectLeft = ascendingBisect.left;
16577   var bisectCenter = bisector(number).center;
16578   var bisect_default = bisectRight;
16579
16580   // node_modules/d3-array/src/fsum.js
16581   var Adder = class {
16582     constructor() {
16583       this._partials = new Float64Array(32);
16584       this._n = 0;
16585     }
16586     add(x) {
16587       const p = this._partials;
16588       let i2 = 0;
16589       for (let j2 = 0; j2 < this._n && j2 < 32; j2++) {
16590         const y = p[j2], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);
16591         if (lo)
16592           p[i2++] = lo;
16593         x = hi;
16594       }
16595       p[i2] = x;
16596       this._n = i2 + 1;
16597       return this;
16598     }
16599     valueOf() {
16600       const p = this._partials;
16601       let n2 = this._n, x, y, lo, hi = 0;
16602       if (n2 > 0) {
16603         hi = p[--n2];
16604         while (n2 > 0) {
16605           x = hi;
16606           y = p[--n2];
16607           hi = x + y;
16608           lo = y - (hi - x);
16609           if (lo)
16610             break;
16611         }
16612         if (n2 > 0 && (lo < 0 && p[n2 - 1] < 0 || lo > 0 && p[n2 - 1] > 0)) {
16613           y = lo * 2;
16614           x = hi + y;
16615           if (y == x - hi)
16616             hi = x;
16617         }
16618       }
16619       return hi;
16620     }
16621   };
16622
16623   // node_modules/d3-array/src/sort.js
16624   function compareDefined(compare = ascending) {
16625     if (compare === ascending)
16626       return ascendingDefined;
16627     if (typeof compare !== "function")
16628       throw new TypeError("compare is not a function");
16629     return (a, b) => {
16630       const x = compare(a, b);
16631       if (x || x === 0)
16632         return x;
16633       return (compare(b, b) === 0) - (compare(a, a) === 0);
16634     };
16635   }
16636   function ascendingDefined(a, b) {
16637     return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);
16638   }
16639
16640   // node_modules/d3-array/src/ticks.js
16641   var e10 = Math.sqrt(50);
16642   var e5 = Math.sqrt(10);
16643   var e2 = Math.sqrt(2);
16644   function ticks(start2, stop, count) {
16645     var reverse, i2 = -1, n2, ticks2, step;
16646     stop = +stop, start2 = +start2, count = +count;
16647     if (start2 === stop && count > 0)
16648       return [start2];
16649     if (reverse = stop < start2)
16650       n2 = start2, start2 = stop, stop = n2;
16651     if ((step = tickIncrement(start2, stop, count)) === 0 || !isFinite(step))
16652       return [];
16653     if (step > 0) {
16654       let r0 = Math.round(start2 / step), r1 = Math.round(stop / step);
16655       if (r0 * step < start2)
16656         ++r0;
16657       if (r1 * step > stop)
16658         --r1;
16659       ticks2 = new Array(n2 = r1 - r0 + 1);
16660       while (++i2 < n2)
16661         ticks2[i2] = (r0 + i2) * step;
16662     } else {
16663       step = -step;
16664       let r0 = Math.round(start2 * step), r1 = Math.round(stop * step);
16665       if (r0 / step < start2)
16666         ++r0;
16667       if (r1 / step > stop)
16668         --r1;
16669       ticks2 = new Array(n2 = r1 - r0 + 1);
16670       while (++i2 < n2)
16671         ticks2[i2] = (r0 + i2) / step;
16672     }
16673     if (reverse)
16674       ticks2.reverse();
16675     return ticks2;
16676   }
16677   function tickIncrement(start2, stop, count) {
16678     var step = (stop - start2) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);
16679     return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
16680   }
16681   function tickStep(start2, stop, count) {
16682     var step0 = Math.abs(stop - start2) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;
16683     if (error >= e10)
16684       step1 *= 10;
16685     else if (error >= e5)
16686       step1 *= 5;
16687     else if (error >= e2)
16688       step1 *= 2;
16689     return stop < start2 ? -step1 : step1;
16690   }
16691
16692   // node_modules/d3-array/src/max.js
16693   function max(values, valueof) {
16694     let max3;
16695     if (valueof === void 0) {
16696       for (const value of values) {
16697         if (value != null && (max3 < value || max3 === void 0 && value >= value)) {
16698           max3 = value;
16699         }
16700       }
16701     } else {
16702       let index = -1;
16703       for (let value of values) {
16704         if ((value = valueof(value, ++index, values)) != null && (max3 < value || max3 === void 0 && value >= value)) {
16705           max3 = value;
16706         }
16707       }
16708     }
16709     return max3;
16710   }
16711
16712   // node_modules/d3-array/src/min.js
16713   function min(values, valueof) {
16714     let min3;
16715     if (valueof === void 0) {
16716       for (const value of values) {
16717         if (value != null && (min3 > value || min3 === void 0 && value >= value)) {
16718           min3 = value;
16719         }
16720       }
16721     } else {
16722       let index = -1;
16723       for (let value of values) {
16724         if ((value = valueof(value, ++index, values)) != null && (min3 > value || min3 === void 0 && value >= value)) {
16725           min3 = value;
16726         }
16727       }
16728     }
16729     return min3;
16730   }
16731
16732   // node_modules/d3-array/src/quickselect.js
16733   function quickselect(array2, k, left = 0, right = array2.length - 1, compare) {
16734     compare = compare === void 0 ? ascendingDefined : compareDefined(compare);
16735     while (right > left) {
16736       if (right - left > 600) {
16737         const n2 = right - left + 1;
16738         const m = k - left + 1;
16739         const z = Math.log(n2);
16740         const s = 0.5 * Math.exp(2 * z / 3);
16741         const sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1);
16742         const newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd));
16743         const newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd));
16744         quickselect(array2, k, newLeft, newRight, compare);
16745       }
16746       const t = array2[k];
16747       let i2 = left;
16748       let j2 = right;
16749       swap(array2, left, k);
16750       if (compare(array2[right], t) > 0)
16751         swap(array2, left, right);
16752       while (i2 < j2) {
16753         swap(array2, i2, j2), ++i2, --j2;
16754         while (compare(array2[i2], t) < 0)
16755           ++i2;
16756         while (compare(array2[j2], t) > 0)
16757           --j2;
16758       }
16759       if (compare(array2[left], t) === 0)
16760         swap(array2, left, j2);
16761       else
16762         ++j2, swap(array2, j2, right);
16763       if (j2 <= k)
16764         left = j2 + 1;
16765       if (k <= j2)
16766         right = j2 - 1;
16767     }
16768     return array2;
16769   }
16770   function swap(array2, i2, j2) {
16771     const t = array2[i2];
16772     array2[i2] = array2[j2];
16773     array2[j2] = t;
16774   }
16775
16776   // node_modules/d3-array/src/quantile.js
16777   function quantile(values, p, valueof) {
16778     values = Float64Array.from(numbers(values, valueof));
16779     if (!(n2 = values.length))
16780       return;
16781     if ((p = +p) <= 0 || n2 < 2)
16782       return min(values);
16783     if (p >= 1)
16784       return max(values);
16785     var n2, i2 = (n2 - 1) * p, i0 = Math.floor(i2), value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), value1 = min(values.subarray(i0 + 1));
16786     return value0 + (value1 - value0) * (i2 - i0);
16787   }
16788
16789   // node_modules/d3-array/src/median.js
16790   function median(values, valueof) {
16791     return quantile(values, 0.5, valueof);
16792   }
16793
16794   // node_modules/d3-array/src/merge.js
16795   function* flatten(arrays) {
16796     for (const array2 of arrays) {
16797       yield* array2;
16798     }
16799   }
16800   function merge(arrays) {
16801     return Array.from(flatten(arrays));
16802   }
16803
16804   // node_modules/d3-array/src/range.js
16805   function range(start2, stop, step) {
16806     start2 = +start2, stop = +stop, step = (n2 = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n2 < 3 ? 1 : +step;
16807     var i2 = -1, n2 = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range3 = new Array(n2);
16808     while (++i2 < n2) {
16809       range3[i2] = start2 + i2 * step;
16810     }
16811     return range3;
16812   }
16813
16814   // node_modules/d3-geo/src/math.js
16815   var epsilon = 1e-6;
16816   var epsilon2 = 1e-12;
16817   var pi = Math.PI;
16818   var halfPi = pi / 2;
16819   var quarterPi = pi / 4;
16820   var tau = pi * 2;
16821   var degrees = 180 / pi;
16822   var radians = pi / 180;
16823   var abs = Math.abs;
16824   var atan = Math.atan;
16825   var atan2 = Math.atan2;
16826   var cos = Math.cos;
16827   var exp = Math.exp;
16828   var log = Math.log;
16829   var sin = Math.sin;
16830   var sign = Math.sign || function(x) {
16831     return x > 0 ? 1 : x < 0 ? -1 : 0;
16832   };
16833   var sqrt = Math.sqrt;
16834   var tan = Math.tan;
16835   function acos(x) {
16836     return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
16837   }
16838   function asin(x) {
16839     return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);
16840   }
16841
16842   // node_modules/d3-geo/src/noop.js
16843   function noop() {
16844   }
16845
16846   // node_modules/d3-geo/src/stream.js
16847   function streamGeometry(geometry, stream) {
16848     if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
16849       streamGeometryType[geometry.type](geometry, stream);
16850     }
16851   }
16852   var streamObjectType = {
16853     Feature: function(object, stream) {
16854       streamGeometry(object.geometry, stream);
16855     },
16856     FeatureCollection: function(object, stream) {
16857       var features = object.features, i2 = -1, n2 = features.length;
16858       while (++i2 < n2)
16859         streamGeometry(features[i2].geometry, stream);
16860     }
16861   };
16862   var streamGeometryType = {
16863     Sphere: function(object, stream) {
16864       stream.sphere();
16865     },
16866     Point: function(object, stream) {
16867       object = object.coordinates;
16868       stream.point(object[0], object[1], object[2]);
16869     },
16870     MultiPoint: function(object, stream) {
16871       var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
16872       while (++i2 < n2)
16873         object = coordinates[i2], stream.point(object[0], object[1], object[2]);
16874     },
16875     LineString: function(object, stream) {
16876       streamLine(object.coordinates, stream, 0);
16877     },
16878     MultiLineString: function(object, stream) {
16879       var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
16880       while (++i2 < n2)
16881         streamLine(coordinates[i2], stream, 0);
16882     },
16883     Polygon: function(object, stream) {
16884       streamPolygon(object.coordinates, stream);
16885     },
16886     MultiPolygon: function(object, stream) {
16887       var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
16888       while (++i2 < n2)
16889         streamPolygon(coordinates[i2], stream);
16890     },
16891     GeometryCollection: function(object, stream) {
16892       var geometries = object.geometries, i2 = -1, n2 = geometries.length;
16893       while (++i2 < n2)
16894         streamGeometry(geometries[i2], stream);
16895     }
16896   };
16897   function streamLine(coordinates, stream, closed) {
16898     var i2 = -1, n2 = coordinates.length - closed, coordinate;
16899     stream.lineStart();
16900     while (++i2 < n2)
16901       coordinate = coordinates[i2], stream.point(coordinate[0], coordinate[1], coordinate[2]);
16902     stream.lineEnd();
16903   }
16904   function streamPolygon(coordinates, stream) {
16905     var i2 = -1, n2 = coordinates.length;
16906     stream.polygonStart();
16907     while (++i2 < n2)
16908       streamLine(coordinates[i2], stream, 1);
16909     stream.polygonEnd();
16910   }
16911   function stream_default(object, stream) {
16912     if (object && streamObjectType.hasOwnProperty(object.type)) {
16913       streamObjectType[object.type](object, stream);
16914     } else {
16915       streamGeometry(object, stream);
16916     }
16917   }
16918
16919   // node_modules/d3-geo/src/area.js
16920   var areaRingSum = new Adder();
16921   var areaSum = new Adder();
16922   var lambda00;
16923   var phi00;
16924   var lambda0;
16925   var cosPhi0;
16926   var sinPhi0;
16927   var areaStream = {
16928     point: noop,
16929     lineStart: noop,
16930     lineEnd: noop,
16931     polygonStart: function() {
16932       areaRingSum = new Adder();
16933       areaStream.lineStart = areaRingStart;
16934       areaStream.lineEnd = areaRingEnd;
16935     },
16936     polygonEnd: function() {
16937       var areaRing = +areaRingSum;
16938       areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);
16939       this.lineStart = this.lineEnd = this.point = noop;
16940     },
16941     sphere: function() {
16942       areaSum.add(tau);
16943     }
16944   };
16945   function areaRingStart() {
16946     areaStream.point = areaPointFirst;
16947   }
16948   function areaRingEnd() {
16949     areaPoint(lambda00, phi00);
16950   }
16951   function areaPointFirst(lambda, phi) {
16952     areaStream.point = areaPoint;
16953     lambda00 = lambda, phi00 = phi;
16954     lambda *= radians, phi *= radians;
16955     lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);
16956   }
16957   function areaPoint(lambda, phi) {
16958     lambda *= radians, phi *= radians;
16959     phi = phi / 2 + quarterPi;
16960     var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos(phi), sinPhi = sin(phi), k = sinPhi0 * sinPhi, u = cosPhi0 * cosPhi + k * cos(adLambda), v = k * sdLambda * sin(adLambda);
16961     areaRingSum.add(atan2(v, u));
16962     lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
16963   }
16964   function area_default(object) {
16965     areaSum = new Adder();
16966     stream_default(object, areaStream);
16967     return areaSum * 2;
16968   }
16969
16970   // node_modules/d3-geo/src/cartesian.js
16971   function spherical(cartesian2) {
16972     return [atan2(cartesian2[1], cartesian2[0]), asin(cartesian2[2])];
16973   }
16974   function cartesian(spherical2) {
16975     var lambda = spherical2[0], phi = spherical2[1], cosPhi = cos(phi);
16976     return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];
16977   }
16978   function cartesianDot(a, b) {
16979     return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
16980   }
16981   function cartesianCross(a, b) {
16982     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]];
16983   }
16984   function cartesianAddInPlace(a, b) {
16985     a[0] += b[0], a[1] += b[1], a[2] += b[2];
16986   }
16987   function cartesianScale(vector, k) {
16988     return [vector[0] * k, vector[1] * k, vector[2] * k];
16989   }
16990   function cartesianNormalizeInPlace(d) {
16991     var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
16992     d[0] /= l, d[1] /= l, d[2] /= l;
16993   }
16994
16995   // node_modules/d3-geo/src/bounds.js
16996   var lambda02;
16997   var phi0;
16998   var lambda1;
16999   var phi1;
17000   var lambda2;
17001   var lambda002;
17002   var phi002;
17003   var p0;
17004   var deltaSum;
17005   var ranges;
17006   var range2;
17007   var boundsStream = {
17008     point: boundsPoint,
17009     lineStart: boundsLineStart,
17010     lineEnd: boundsLineEnd,
17011     polygonStart: function() {
17012       boundsStream.point = boundsRingPoint;
17013       boundsStream.lineStart = boundsRingStart;
17014       boundsStream.lineEnd = boundsRingEnd;
17015       deltaSum = new Adder();
17016       areaStream.polygonStart();
17017     },
17018     polygonEnd: function() {
17019       areaStream.polygonEnd();
17020       boundsStream.point = boundsPoint;
17021       boundsStream.lineStart = boundsLineStart;
17022       boundsStream.lineEnd = boundsLineEnd;
17023       if (areaRingSum < 0)
17024         lambda02 = -(lambda1 = 180), phi0 = -(phi1 = 90);
17025       else if (deltaSum > epsilon)
17026         phi1 = 90;
17027       else if (deltaSum < -epsilon)
17028         phi0 = -90;
17029       range2[0] = lambda02, range2[1] = lambda1;
17030     },
17031     sphere: function() {
17032       lambda02 = -(lambda1 = 180), phi0 = -(phi1 = 90);
17033     }
17034   };
17035   function boundsPoint(lambda, phi) {
17036     ranges.push(range2 = [lambda02 = lambda, lambda1 = lambda]);
17037     if (phi < phi0)
17038       phi0 = phi;
17039     if (phi > phi1)
17040       phi1 = phi;
17041   }
17042   function linePoint(lambda, phi) {
17043     var p = cartesian([lambda * radians, phi * radians]);
17044     if (p0) {
17045       var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);
17046       cartesianNormalizeInPlace(inflection);
17047       inflection = spherical(inflection);
17048       var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs(delta) > 180;
17049       if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {
17050         phii = inflection[1] * degrees;
17051         if (phii > phi1)
17052           phi1 = phii;
17053       } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {
17054         phii = -inflection[1] * degrees;
17055         if (phii < phi0)
17056           phi0 = phii;
17057       } else {
17058         if (phi < phi0)
17059           phi0 = phi;
17060         if (phi > phi1)
17061           phi1 = phi;
17062       }
17063       if (antimeridian) {
17064         if (lambda < lambda2) {
17065           if (angle(lambda02, lambda) > angle(lambda02, lambda1))
17066             lambda1 = lambda;
17067         } else {
17068           if (angle(lambda, lambda1) > angle(lambda02, lambda1))
17069             lambda02 = lambda;
17070         }
17071       } else {
17072         if (lambda1 >= lambda02) {
17073           if (lambda < lambda02)
17074             lambda02 = lambda;
17075           if (lambda > lambda1)
17076             lambda1 = lambda;
17077         } else {
17078           if (lambda > lambda2) {
17079             if (angle(lambda02, lambda) > angle(lambda02, lambda1))
17080               lambda1 = lambda;
17081           } else {
17082             if (angle(lambda, lambda1) > angle(lambda02, lambda1))
17083               lambda02 = lambda;
17084           }
17085         }
17086       }
17087     } else {
17088       ranges.push(range2 = [lambda02 = lambda, lambda1 = lambda]);
17089     }
17090     if (phi < phi0)
17091       phi0 = phi;
17092     if (phi > phi1)
17093       phi1 = phi;
17094     p0 = p, lambda2 = lambda;
17095   }
17096   function boundsLineStart() {
17097     boundsStream.point = linePoint;
17098   }
17099   function boundsLineEnd() {
17100     range2[0] = lambda02, range2[1] = lambda1;
17101     boundsStream.point = boundsPoint;
17102     p0 = null;
17103   }
17104   function boundsRingPoint(lambda, phi) {
17105     if (p0) {
17106       var delta = lambda - lambda2;
17107       deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
17108     } else {
17109       lambda002 = lambda, phi002 = phi;
17110     }
17111     areaStream.point(lambda, phi);
17112     linePoint(lambda, phi);
17113   }
17114   function boundsRingStart() {
17115     areaStream.lineStart();
17116   }
17117   function boundsRingEnd() {
17118     boundsRingPoint(lambda002, phi002);
17119     areaStream.lineEnd();
17120     if (abs(deltaSum) > epsilon)
17121       lambda02 = -(lambda1 = 180);
17122     range2[0] = lambda02, range2[1] = lambda1;
17123     p0 = null;
17124   }
17125   function angle(lambda04, lambda12) {
17126     return (lambda12 -= lambda04) < 0 ? lambda12 + 360 : lambda12;
17127   }
17128   function rangeCompare(a, b) {
17129     return a[0] - b[0];
17130   }
17131   function rangeContains(range3, x) {
17132     return range3[0] <= range3[1] ? range3[0] <= x && x <= range3[1] : x < range3[0] || range3[1] < x;
17133   }
17134   function bounds_default(feature3) {
17135     var i2, n2, a, b, merged, deltaMax, delta;
17136     phi1 = lambda1 = -(lambda02 = phi0 = Infinity);
17137     ranges = [];
17138     stream_default(feature3, boundsStream);
17139     if (n2 = ranges.length) {
17140       ranges.sort(rangeCompare);
17141       for (i2 = 1, a = ranges[0], merged = [a]; i2 < n2; ++i2) {
17142         b = ranges[i2];
17143         if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
17144           if (angle(a[0], b[1]) > angle(a[0], a[1]))
17145             a[1] = b[1];
17146           if (angle(b[0], a[1]) > angle(a[0], a[1]))
17147             a[0] = b[0];
17148         } else {
17149           merged.push(a = b);
17150         }
17151       }
17152       for (deltaMax = -Infinity, n2 = merged.length - 1, i2 = 0, a = merged[n2]; i2 <= n2; a = b, ++i2) {
17153         b = merged[i2];
17154         if ((delta = angle(a[1], b[0])) > deltaMax)
17155           deltaMax = delta, lambda02 = b[0], lambda1 = a[1];
17156       }
17157     }
17158     ranges = range2 = null;
17159     return lambda02 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda02, phi0], [lambda1, phi1]];
17160   }
17161
17162   // node_modules/d3-geo/src/compose.js
17163   function compose_default(a, b) {
17164     function compose(x, y) {
17165       return x = a(x, y), b(x[0], x[1]);
17166     }
17167     if (a.invert && b.invert)
17168       compose.invert = function(x, y) {
17169         return x = b.invert(x, y), x && a.invert(x[0], x[1]);
17170       };
17171     return compose;
17172   }
17173
17174   // node_modules/d3-geo/src/rotation.js
17175   function rotationIdentity(lambda, phi) {
17176     return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi];
17177   }
17178   rotationIdentity.invert = rotationIdentity;
17179   function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
17180     return (deltaLambda %= tau) ? deltaPhi || deltaGamma ? compose_default(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;
17181   }
17182   function forwardRotationLambda(deltaLambda) {
17183     return function(lambda, phi) {
17184       return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];
17185     };
17186   }
17187   function rotationLambda(deltaLambda) {
17188     var rotation = forwardRotationLambda(deltaLambda);
17189     rotation.invert = forwardRotationLambda(-deltaLambda);
17190     return rotation;
17191   }
17192   function rotationPhiGamma(deltaPhi, deltaGamma) {
17193     var cosDeltaPhi = cos(deltaPhi), sinDeltaPhi = sin(deltaPhi), cosDeltaGamma = cos(deltaGamma), sinDeltaGamma = sin(deltaGamma);
17194     function rotation(lambda, phi) {
17195       var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaPhi + x * sinDeltaPhi;
17196       return [
17197         atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
17198         asin(k * cosDeltaGamma + y * sinDeltaGamma)
17199       ];
17200     }
17201     rotation.invert = function(lambda, phi) {
17202       var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaGamma - y * sinDeltaGamma;
17203       return [
17204         atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
17205         asin(k * cosDeltaPhi - x * sinDeltaPhi)
17206       ];
17207     };
17208     return rotation;
17209   }
17210   function rotation_default(rotate) {
17211     rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
17212     function forward(coordinates) {
17213       coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
17214       return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
17215     }
17216     forward.invert = function(coordinates) {
17217       coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
17218       return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
17219     };
17220     return forward;
17221   }
17222
17223   // node_modules/d3-geo/src/circle.js
17224   function circleStream(stream, radius, delta, direction, t0, t1) {
17225     if (!delta)
17226       return;
17227     var cosRadius = cos(radius), sinRadius = sin(radius), step = direction * delta;
17228     if (t0 == null) {
17229       t0 = radius + direction * tau;
17230       t1 = radius - step / 2;
17231     } else {
17232       t0 = circleRadius(cosRadius, t0);
17233       t1 = circleRadius(cosRadius, t1);
17234       if (direction > 0 ? t0 < t1 : t0 > t1)
17235         t0 += direction * tau;
17236     }
17237     for (var point2, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
17238       point2 = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);
17239       stream.point(point2[0], point2[1]);
17240     }
17241   }
17242   function circleRadius(cosRadius, point2) {
17243     point2 = cartesian(point2), point2[0] -= cosRadius;
17244     cartesianNormalizeInPlace(point2);
17245     var radius = acos(-point2[1]);
17246     return ((-point2[2] < 0 ? -radius : radius) + tau - epsilon) % tau;
17247   }
17248
17249   // node_modules/d3-geo/src/clip/buffer.js
17250   function buffer_default() {
17251     var lines = [], line;
17252     return {
17253       point: function(x, y, m) {
17254         line.push([x, y, m]);
17255       },
17256       lineStart: function() {
17257         lines.push(line = []);
17258       },
17259       lineEnd: noop,
17260       rejoin: function() {
17261         if (lines.length > 1)
17262           lines.push(lines.pop().concat(lines.shift()));
17263       },
17264       result: function() {
17265         var result = lines;
17266         lines = [];
17267         line = null;
17268         return result;
17269       }
17270     };
17271   }
17272
17273   // node_modules/d3-geo/src/pointEqual.js
17274   function pointEqual_default(a, b) {
17275     return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;
17276   }
17277
17278   // node_modules/d3-geo/src/clip/rejoin.js
17279   function Intersection(point2, points, other, entry) {
17280     this.x = point2;
17281     this.z = points;
17282     this.o = other;
17283     this.e = entry;
17284     this.v = false;
17285     this.n = this.p = null;
17286   }
17287   function rejoin_default(segments, compareIntersection2, startInside, interpolate, stream) {
17288     var subject = [], clip = [], i2, n2;
17289     segments.forEach(function(segment) {
17290       if ((n3 = segment.length - 1) <= 0)
17291         return;
17292       var n3, p02 = segment[0], p1 = segment[n3], x;
17293       if (pointEqual_default(p02, p1)) {
17294         if (!p02[2] && !p1[2]) {
17295           stream.lineStart();
17296           for (i2 = 0; i2 < n3; ++i2)
17297             stream.point((p02 = segment[i2])[0], p02[1]);
17298           stream.lineEnd();
17299           return;
17300         }
17301         p1[0] += 2 * epsilon;
17302       }
17303       subject.push(x = new Intersection(p02, segment, null, true));
17304       clip.push(x.o = new Intersection(p02, null, x, false));
17305       subject.push(x = new Intersection(p1, segment, null, false));
17306       clip.push(x.o = new Intersection(p1, null, x, true));
17307     });
17308     if (!subject.length)
17309       return;
17310     clip.sort(compareIntersection2);
17311     link(subject);
17312     link(clip);
17313     for (i2 = 0, n2 = clip.length; i2 < n2; ++i2) {
17314       clip[i2].e = startInside = !startInside;
17315     }
17316     var start2 = subject[0], points, point2;
17317     while (1) {
17318       var current = start2, isSubject = true;
17319       while (current.v)
17320         if ((current = current.n) === start2)
17321           return;
17322       points = current.z;
17323       stream.lineStart();
17324       do {
17325         current.v = current.o.v = true;
17326         if (current.e) {
17327           if (isSubject) {
17328             for (i2 = 0, n2 = points.length; i2 < n2; ++i2)
17329               stream.point((point2 = points[i2])[0], point2[1]);
17330           } else {
17331             interpolate(current.x, current.n.x, 1, stream);
17332           }
17333           current = current.n;
17334         } else {
17335           if (isSubject) {
17336             points = current.p.z;
17337             for (i2 = points.length - 1; i2 >= 0; --i2)
17338               stream.point((point2 = points[i2])[0], point2[1]);
17339           } else {
17340             interpolate(current.x, current.p.x, -1, stream);
17341           }
17342           current = current.p;
17343         }
17344         current = current.o;
17345         points = current.z;
17346         isSubject = !isSubject;
17347       } while (!current.v);
17348       stream.lineEnd();
17349     }
17350   }
17351   function link(array2) {
17352     if (!(n2 = array2.length))
17353       return;
17354     var n2, i2 = 0, a = array2[0], b;
17355     while (++i2 < n2) {
17356       a.n = b = array2[i2];
17357       b.p = a;
17358       a = b;
17359     }
17360     a.n = b = array2[0];
17361     b.p = a;
17362   }
17363
17364   // node_modules/d3-geo/src/polygonContains.js
17365   function longitude(point2) {
17366     return abs(point2[0]) <= pi ? point2[0] : sign(point2[0]) * ((abs(point2[0]) + pi) % tau - pi);
17367   }
17368   function polygonContains_default(polygon2, point2) {
17369     var lambda = longitude(point2), phi = point2[1], sinPhi = sin(phi), normal = [sin(lambda), -cos(lambda), 0], angle2 = 0, winding = 0;
17370     var sum = new Adder();
17371     if (sinPhi === 1)
17372       phi = halfPi + epsilon;
17373     else if (sinPhi === -1)
17374       phi = -halfPi - epsilon;
17375     for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) {
17376       if (!(m = (ring = polygon2[i2]).length))
17377         continue;
17378       var ring, m, point0 = ring[m - 1], lambda04 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi03 = sin(phi02), cosPhi03 = cos(phi02);
17379       for (var j2 = 0; j2 < m; ++j2, lambda04 = lambda12, sinPhi03 = sinPhi1, cosPhi03 = cosPhi1, point0 = point1) {
17380         var point1 = ring[j2], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin(phi12), cosPhi1 = cos(phi12), delta = lambda12 - lambda04, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi, k = sinPhi03 * sinPhi1;
17381         sum.add(atan2(k * sign2 * sin(absDelta), cosPhi03 * cosPhi1 + k * cos(absDelta)));
17382         angle2 += antimeridian ? delta + sign2 * tau : delta;
17383         if (antimeridian ^ lambda04 >= lambda ^ lambda12 >= lambda) {
17384           var arc = cartesianCross(cartesian(point0), cartesian(point1));
17385           cartesianNormalizeInPlace(arc);
17386           var intersection = cartesianCross(normal, arc);
17387           cartesianNormalizeInPlace(intersection);
17388           var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
17389           if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
17390             winding += antimeridian ^ delta >= 0 ? 1 : -1;
17391           }
17392         }
17393       }
17394     }
17395     return (angle2 < -epsilon || angle2 < epsilon && sum < -epsilon2) ^ winding & 1;
17396   }
17397
17398   // node_modules/d3-geo/src/clip/index.js
17399   function clip_default(pointVisible, clipLine, interpolate, start2) {
17400     return function(sink) {
17401       var line = clipLine(sink), ringBuffer = buffer_default(), ringSink = clipLine(ringBuffer), polygonStarted = false, polygon2, segments, ring;
17402       var clip = {
17403         point: point2,
17404         lineStart,
17405         lineEnd,
17406         polygonStart: function() {
17407           clip.point = pointRing;
17408           clip.lineStart = ringStart;
17409           clip.lineEnd = ringEnd;
17410           segments = [];
17411           polygon2 = [];
17412         },
17413         polygonEnd: function() {
17414           clip.point = point2;
17415           clip.lineStart = lineStart;
17416           clip.lineEnd = lineEnd;
17417           segments = merge(segments);
17418           var startInside = polygonContains_default(polygon2, start2);
17419           if (segments.length) {
17420             if (!polygonStarted)
17421               sink.polygonStart(), polygonStarted = true;
17422             rejoin_default(segments, compareIntersection, startInside, interpolate, sink);
17423           } else if (startInside) {
17424             if (!polygonStarted)
17425               sink.polygonStart(), polygonStarted = true;
17426             sink.lineStart();
17427             interpolate(null, null, 1, sink);
17428             sink.lineEnd();
17429           }
17430           if (polygonStarted)
17431             sink.polygonEnd(), polygonStarted = false;
17432           segments = polygon2 = null;
17433         },
17434         sphere: function() {
17435           sink.polygonStart();
17436           sink.lineStart();
17437           interpolate(null, null, 1, sink);
17438           sink.lineEnd();
17439           sink.polygonEnd();
17440         }
17441       };
17442       function point2(lambda, phi) {
17443         if (pointVisible(lambda, phi))
17444           sink.point(lambda, phi);
17445       }
17446       function pointLine(lambda, phi) {
17447         line.point(lambda, phi);
17448       }
17449       function lineStart() {
17450         clip.point = pointLine;
17451         line.lineStart();
17452       }
17453       function lineEnd() {
17454         clip.point = point2;
17455         line.lineEnd();
17456       }
17457       function pointRing(lambda, phi) {
17458         ring.push([lambda, phi]);
17459         ringSink.point(lambda, phi);
17460       }
17461       function ringStart() {
17462         ringSink.lineStart();
17463         ring = [];
17464       }
17465       function ringEnd() {
17466         pointRing(ring[0][0], ring[0][1]);
17467         ringSink.lineEnd();
17468         var clean2 = ringSink.clean(), ringSegments = ringBuffer.result(), i2, n2 = ringSegments.length, m, segment, point3;
17469         ring.pop();
17470         polygon2.push(ring);
17471         ring = null;
17472         if (!n2)
17473           return;
17474         if (clean2 & 1) {
17475           segment = ringSegments[0];
17476           if ((m = segment.length - 1) > 0) {
17477             if (!polygonStarted)
17478               sink.polygonStart(), polygonStarted = true;
17479             sink.lineStart();
17480             for (i2 = 0; i2 < m; ++i2)
17481               sink.point((point3 = segment[i2])[0], point3[1]);
17482             sink.lineEnd();
17483           }
17484           return;
17485         }
17486         if (n2 > 1 && clean2 & 2)
17487           ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
17488         segments.push(ringSegments.filter(validSegment));
17489       }
17490       return clip;
17491     };
17492   }
17493   function validSegment(segment) {
17494     return segment.length > 1;
17495   }
17496   function compareIntersection(a, b) {
17497     return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);
17498   }
17499
17500   // node_modules/d3-geo/src/clip/antimeridian.js
17501   var antimeridian_default = clip_default(
17502     function() {
17503       return true;
17504     },
17505     clipAntimeridianLine,
17506     clipAntimeridianInterpolate,
17507     [-pi, -halfPi]
17508   );
17509   function clipAntimeridianLine(stream) {
17510     var lambda04 = NaN, phi02 = NaN, sign0 = NaN, clean2;
17511     return {
17512       lineStart: function() {
17513         stream.lineStart();
17514         clean2 = 1;
17515       },
17516       point: function(lambda12, phi12) {
17517         var sign1 = lambda12 > 0 ? pi : -pi, delta = abs(lambda12 - lambda04);
17518         if (abs(delta - pi) < epsilon) {
17519           stream.point(lambda04, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi : -halfPi);
17520           stream.point(sign0, phi02);
17521           stream.lineEnd();
17522           stream.lineStart();
17523           stream.point(sign1, phi02);
17524           stream.point(lambda12, phi02);
17525           clean2 = 0;
17526         } else if (sign0 !== sign1 && delta >= pi) {
17527           if (abs(lambda04 - sign0) < epsilon)
17528             lambda04 -= sign0 * epsilon;
17529           if (abs(lambda12 - sign1) < epsilon)
17530             lambda12 -= sign1 * epsilon;
17531           phi02 = clipAntimeridianIntersect(lambda04, phi02, lambda12, phi12);
17532           stream.point(sign0, phi02);
17533           stream.lineEnd();
17534           stream.lineStart();
17535           stream.point(sign1, phi02);
17536           clean2 = 0;
17537         }
17538         stream.point(lambda04 = lambda12, phi02 = phi12);
17539         sign0 = sign1;
17540       },
17541       lineEnd: function() {
17542         stream.lineEnd();
17543         lambda04 = phi02 = NaN;
17544       },
17545       clean: function() {
17546         return 2 - clean2;
17547       }
17548     };
17549   }
17550   function clipAntimeridianIntersect(lambda04, phi02, lambda12, phi12) {
17551     var cosPhi03, cosPhi1, sinLambda0Lambda1 = sin(lambda04 - lambda12);
17552     return abs(sinLambda0Lambda1) > epsilon ? atan((sin(phi02) * (cosPhi1 = cos(phi12)) * sin(lambda12) - sin(phi12) * (cosPhi03 = cos(phi02)) * sin(lambda04)) / (cosPhi03 * cosPhi1 * sinLambda0Lambda1)) : (phi02 + phi12) / 2;
17553   }
17554   function clipAntimeridianInterpolate(from, to, direction, stream) {
17555     var phi;
17556     if (from == null) {
17557       phi = direction * halfPi;
17558       stream.point(-pi, phi);
17559       stream.point(0, phi);
17560       stream.point(pi, phi);
17561       stream.point(pi, 0);
17562       stream.point(pi, -phi);
17563       stream.point(0, -phi);
17564       stream.point(-pi, -phi);
17565       stream.point(-pi, 0);
17566       stream.point(-pi, phi);
17567     } else if (abs(from[0] - to[0]) > epsilon) {
17568       var lambda = from[0] < to[0] ? pi : -pi;
17569       phi = direction * lambda / 2;
17570       stream.point(-lambda, phi);
17571       stream.point(0, phi);
17572       stream.point(lambda, phi);
17573     } else {
17574       stream.point(to[0], to[1]);
17575     }
17576   }
17577
17578   // node_modules/d3-geo/src/clip/circle.js
17579   function circle_default(radius) {
17580     var cr = cos(radius), delta = 6 * radians, smallRadius = cr > 0, notHemisphere = abs(cr) > epsilon;
17581     function interpolate(from, to, direction, stream) {
17582       circleStream(stream, radius, delta, direction, from, to);
17583     }
17584     function visible(lambda, phi) {
17585       return cos(lambda) * cos(phi) > cr;
17586     }
17587     function clipLine(stream) {
17588       var point0, c0, v0, v00, clean2;
17589       return {
17590         lineStart: function() {
17591           v00 = v0 = false;
17592           clean2 = 1;
17593         },
17594         point: function(lambda, phi) {
17595           var point1 = [lambda, phi], point2, v = visible(lambda, phi), c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;
17596           if (!point0 && (v00 = v0 = v))
17597             stream.lineStart();
17598           if (v !== v0) {
17599             point2 = intersect2(point0, point1);
17600             if (!point2 || pointEqual_default(point0, point2) || pointEqual_default(point1, point2))
17601               point1[2] = 1;
17602           }
17603           if (v !== v0) {
17604             clean2 = 0;
17605             if (v) {
17606               stream.lineStart();
17607               point2 = intersect2(point1, point0);
17608               stream.point(point2[0], point2[1]);
17609             } else {
17610               point2 = intersect2(point0, point1);
17611               stream.point(point2[0], point2[1], 2);
17612               stream.lineEnd();
17613             }
17614             point0 = point2;
17615           } else if (notHemisphere && point0 && smallRadius ^ v) {
17616             var t;
17617             if (!(c & c0) && (t = intersect2(point1, point0, true))) {
17618               clean2 = 0;
17619               if (smallRadius) {
17620                 stream.lineStart();
17621                 stream.point(t[0][0], t[0][1]);
17622                 stream.point(t[1][0], t[1][1]);
17623                 stream.lineEnd();
17624               } else {
17625                 stream.point(t[1][0], t[1][1]);
17626                 stream.lineEnd();
17627                 stream.lineStart();
17628                 stream.point(t[0][0], t[0][1], 3);
17629               }
17630             }
17631           }
17632           if (v && (!point0 || !pointEqual_default(point0, point1))) {
17633             stream.point(point1[0], point1[1]);
17634           }
17635           point0 = point1, v0 = v, c0 = c;
17636         },
17637         lineEnd: function() {
17638           if (v0)
17639             stream.lineEnd();
17640           point0 = null;
17641         },
17642         // Rejoin first and last segments if there were intersections and the first
17643         // and last points were visible.
17644         clean: function() {
17645           return clean2 | (v00 && v0) << 1;
17646         }
17647       };
17648     }
17649     function intersect2(a, b, two) {
17650       var pa = cartesian(a), pb = cartesian(b);
17651       var n1 = [1, 0, 0], n2 = cartesianCross(pa, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
17652       if (!determinant)
17653         return !two && a;
17654       var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A = cartesianScale(n1, c1), B = cartesianScale(n2, c2);
17655       cartesianAddInPlace(A, B);
17656       var u = n1xn2, w = cartesianDot(A, u), uu = cartesianDot(u, u), t2 = w * w - uu * (cartesianDot(A, A) - 1);
17657       if (t2 < 0)
17658         return;
17659       var t = sqrt(t2), q = cartesianScale(u, (-w - t) / uu);
17660       cartesianAddInPlace(q, A);
17661       q = spherical(q);
17662       if (!two)
17663         return q;
17664       var lambda04 = a[0], lambda12 = b[0], phi02 = a[1], phi12 = b[1], z;
17665       if (lambda12 < lambda04)
17666         z = lambda04, lambda04 = lambda12, lambda12 = z;
17667       var delta2 = lambda12 - lambda04, polar = abs(delta2 - pi) < epsilon, meridian = polar || delta2 < epsilon;
17668       if (!polar && phi12 < phi02)
17669         z = phi02, phi02 = phi12, phi12 = z;
17670       if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs(q[0] - lambda04) < epsilon ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi ^ (lambda04 <= q[0] && q[0] <= lambda12)) {
17671         var q1 = cartesianScale(u, (-w + t) / uu);
17672         cartesianAddInPlace(q1, A);
17673         return [q, spherical(q1)];
17674       }
17675     }
17676     function code(lambda, phi) {
17677       var r = smallRadius ? radius : pi - radius, code2 = 0;
17678       if (lambda < -r)
17679         code2 |= 1;
17680       else if (lambda > r)
17681         code2 |= 2;
17682       if (phi < -r)
17683         code2 |= 4;
17684       else if (phi > r)
17685         code2 |= 8;
17686       return code2;
17687     }
17688     return clip_default(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);
17689   }
17690
17691   // node_modules/d3-geo/src/clip/line.js
17692   function line_default(a, b, x05, y05, x12, y12) {
17693     var ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
17694     r = x05 - ax;
17695     if (!dx && r > 0)
17696       return;
17697     r /= dx;
17698     if (dx < 0) {
17699       if (r < t0)
17700         return;
17701       if (r < t1)
17702         t1 = r;
17703     } else if (dx > 0) {
17704       if (r > t1)
17705         return;
17706       if (r > t0)
17707         t0 = r;
17708     }
17709     r = x12 - ax;
17710     if (!dx && r < 0)
17711       return;
17712     r /= dx;
17713     if (dx < 0) {
17714       if (r > t1)
17715         return;
17716       if (r > t0)
17717         t0 = r;
17718     } else if (dx > 0) {
17719       if (r < t0)
17720         return;
17721       if (r < t1)
17722         t1 = r;
17723     }
17724     r = y05 - ay;
17725     if (!dy && r > 0)
17726       return;
17727     r /= dy;
17728     if (dy < 0) {
17729       if (r < t0)
17730         return;
17731       if (r < t1)
17732         t1 = r;
17733     } else if (dy > 0) {
17734       if (r > t1)
17735         return;
17736       if (r > t0)
17737         t0 = r;
17738     }
17739     r = y12 - ay;
17740     if (!dy && r < 0)
17741       return;
17742     r /= dy;
17743     if (dy < 0) {
17744       if (r > t1)
17745         return;
17746       if (r > t0)
17747         t0 = r;
17748     } else if (dy > 0) {
17749       if (r < t0)
17750         return;
17751       if (r < t1)
17752         t1 = r;
17753     }
17754     if (t0 > 0)
17755       a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
17756     if (t1 < 1)
17757       b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
17758     return true;
17759   }
17760
17761   // node_modules/d3-geo/src/clip/rectangle.js
17762   var clipMax = 1e9;
17763   var clipMin = -clipMax;
17764   function clipRectangle(x05, y05, x12, y12) {
17765     function visible(x, y) {
17766       return x05 <= x && x <= x12 && y05 <= y && y <= y12;
17767     }
17768     function interpolate(from, to, direction, stream) {
17769       var a = 0, a1 = 0;
17770       if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {
17771         do
17772           stream.point(a === 0 || a === 3 ? x05 : x12, a > 1 ? y12 : y05);
17773         while ((a = (a + direction + 4) % 4) !== a1);
17774       } else {
17775         stream.point(to[0], to[1]);
17776       }
17777     }
17778     function corner(p, direction) {
17779       return abs(p[0] - x05) < epsilon ? direction > 0 ? 0 : 3 : abs(p[0] - x12) < epsilon ? direction > 0 ? 2 : 1 : abs(p[1] - y05) < epsilon ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
17780     }
17781     function compareIntersection2(a, b) {
17782       return comparePoint(a.x, b.x);
17783     }
17784     function comparePoint(a, b) {
17785       var ca = corner(a, 1), cb = corner(b, 1);
17786       return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
17787     }
17788     return function(stream) {
17789       var activeStream = stream, bufferStream = buffer_default(), segments, polygon2, ring, x__, y__, v__, x_, y_, v_, first, clean2;
17790       var clipStream = {
17791         point: point2,
17792         lineStart,
17793         lineEnd,
17794         polygonStart,
17795         polygonEnd
17796       };
17797       function point2(x, y) {
17798         if (visible(x, y))
17799           activeStream.point(x, y);
17800       }
17801       function polygonInside() {
17802         var winding = 0;
17803         for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) {
17804           for (var ring2 = polygon2[i2], j2 = 1, m = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j2 < m; ++j2) {
17805             a0 = b0, a1 = b1, point3 = ring2[j2], b0 = point3[0], b1 = point3[1];
17806             if (a1 <= y12) {
17807               if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x05 - a0))
17808                 ++winding;
17809             } else {
17810               if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x05 - a0))
17811                 --winding;
17812             }
17813           }
17814         }
17815         return winding;
17816       }
17817       function polygonStart() {
17818         activeStream = bufferStream, segments = [], polygon2 = [], clean2 = true;
17819       }
17820       function polygonEnd() {
17821         var startInside = polygonInside(), cleanInside = clean2 && startInside, visible2 = (segments = merge(segments)).length;
17822         if (cleanInside || visible2) {
17823           stream.polygonStart();
17824           if (cleanInside) {
17825             stream.lineStart();
17826             interpolate(null, null, 1, stream);
17827             stream.lineEnd();
17828           }
17829           if (visible2) {
17830             rejoin_default(segments, compareIntersection2, startInside, interpolate, stream);
17831           }
17832           stream.polygonEnd();
17833         }
17834         activeStream = stream, segments = polygon2 = ring = null;
17835       }
17836       function lineStart() {
17837         clipStream.point = linePoint2;
17838         if (polygon2)
17839           polygon2.push(ring = []);
17840         first = true;
17841         v_ = false;
17842         x_ = y_ = NaN;
17843       }
17844       function lineEnd() {
17845         if (segments) {
17846           linePoint2(x__, y__);
17847           if (v__ && v_)
17848             bufferStream.rejoin();
17849           segments.push(bufferStream.result());
17850         }
17851         clipStream.point = point2;
17852         if (v_)
17853           activeStream.lineEnd();
17854       }
17855       function linePoint2(x, y) {
17856         var v = visible(x, y);
17857         if (polygon2)
17858           ring.push([x, y]);
17859         if (first) {
17860           x__ = x, y__ = y, v__ = v;
17861           first = false;
17862           if (v) {
17863             activeStream.lineStart();
17864             activeStream.point(x, y);
17865           }
17866         } else {
17867           if (v && v_)
17868             activeStream.point(x, y);
17869           else {
17870             var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
17871             if (line_default(a, b, x05, y05, x12, y12)) {
17872               if (!v_) {
17873                 activeStream.lineStart();
17874                 activeStream.point(a[0], a[1]);
17875               }
17876               activeStream.point(b[0], b[1]);
17877               if (!v)
17878                 activeStream.lineEnd();
17879               clean2 = false;
17880             } else if (v) {
17881               activeStream.lineStart();
17882               activeStream.point(x, y);
17883               clean2 = false;
17884             }
17885           }
17886         }
17887         x_ = x, y_ = y, v_ = v;
17888       }
17889       return clipStream;
17890     };
17891   }
17892
17893   // node_modules/d3-geo/src/length.js
17894   var lengthSum;
17895   var lambda03;
17896   var sinPhi02;
17897   var cosPhi02;
17898   var lengthStream = {
17899     sphere: noop,
17900     point: noop,
17901     lineStart: lengthLineStart,
17902     lineEnd: noop,
17903     polygonStart: noop,
17904     polygonEnd: noop
17905   };
17906   function lengthLineStart() {
17907     lengthStream.point = lengthPointFirst;
17908     lengthStream.lineEnd = lengthLineEnd;
17909   }
17910   function lengthLineEnd() {
17911     lengthStream.point = lengthStream.lineEnd = noop;
17912   }
17913   function lengthPointFirst(lambda, phi) {
17914     lambda *= radians, phi *= radians;
17915     lambda03 = lambda, sinPhi02 = sin(phi), cosPhi02 = cos(phi);
17916     lengthStream.point = lengthPoint;
17917   }
17918   function lengthPoint(lambda, phi) {
17919     lambda *= radians, phi *= radians;
17920     var sinPhi = sin(phi), cosPhi = cos(phi), delta = abs(lambda - lambda03), cosDelta = cos(delta), sinDelta = sin(delta), x = cosPhi * sinDelta, y = cosPhi02 * sinPhi - sinPhi02 * cosPhi * cosDelta, z = sinPhi02 * sinPhi + cosPhi02 * cosPhi * cosDelta;
17921     lengthSum.add(atan2(sqrt(x * x + y * y), z));
17922     lambda03 = lambda, sinPhi02 = sinPhi, cosPhi02 = cosPhi;
17923   }
17924   function length_default(object) {
17925     lengthSum = new Adder();
17926     stream_default(object, lengthStream);
17927     return +lengthSum;
17928   }
17929
17930   // node_modules/d3-geo/src/identity.js
17931   var identity_default = (x) => x;
17932
17933   // node_modules/d3-geo/src/path/area.js
17934   var areaSum2 = new Adder();
17935   var areaRingSum2 = new Adder();
17936   var x00;
17937   var y00;
17938   var x0;
17939   var y0;
17940   var areaStream2 = {
17941     point: noop,
17942     lineStart: noop,
17943     lineEnd: noop,
17944     polygonStart: function() {
17945       areaStream2.lineStart = areaRingStart2;
17946       areaStream2.lineEnd = areaRingEnd2;
17947     },
17948     polygonEnd: function() {
17949       areaStream2.lineStart = areaStream2.lineEnd = areaStream2.point = noop;
17950       areaSum2.add(abs(areaRingSum2));
17951       areaRingSum2 = new Adder();
17952     },
17953     result: function() {
17954       var area = areaSum2 / 2;
17955       areaSum2 = new Adder();
17956       return area;
17957     }
17958   };
17959   function areaRingStart2() {
17960     areaStream2.point = areaPointFirst2;
17961   }
17962   function areaPointFirst2(x, y) {
17963     areaStream2.point = areaPoint2;
17964     x00 = x0 = x, y00 = y0 = y;
17965   }
17966   function areaPoint2(x, y) {
17967     areaRingSum2.add(y0 * x - x0 * y);
17968     x0 = x, y0 = y;
17969   }
17970   function areaRingEnd2() {
17971     areaPoint2(x00, y00);
17972   }
17973   var area_default2 = areaStream2;
17974
17975   // node_modules/d3-geo/src/path/bounds.js
17976   var x02 = Infinity;
17977   var y02 = x02;
17978   var x1 = -x02;
17979   var y1 = x1;
17980   var boundsStream2 = {
17981     point: boundsPoint2,
17982     lineStart: noop,
17983     lineEnd: noop,
17984     polygonStart: noop,
17985     polygonEnd: noop,
17986     result: function() {
17987       var bounds = [[x02, y02], [x1, y1]];
17988       x1 = y1 = -(y02 = x02 = Infinity);
17989       return bounds;
17990     }
17991   };
17992   function boundsPoint2(x, y) {
17993     if (x < x02)
17994       x02 = x;
17995     if (x > x1)
17996       x1 = x;
17997     if (y < y02)
17998       y02 = y;
17999     if (y > y1)
18000       y1 = y;
18001   }
18002   var bounds_default2 = boundsStream2;
18003
18004   // node_modules/d3-geo/src/path/centroid.js
18005   var X0 = 0;
18006   var Y0 = 0;
18007   var Z0 = 0;
18008   var X1 = 0;
18009   var Y1 = 0;
18010   var Z1 = 0;
18011   var X2 = 0;
18012   var Y2 = 0;
18013   var Z2 = 0;
18014   var x002;
18015   var y002;
18016   var x03;
18017   var y03;
18018   var centroidStream = {
18019     point: centroidPoint,
18020     lineStart: centroidLineStart,
18021     lineEnd: centroidLineEnd,
18022     polygonStart: function() {
18023       centroidStream.lineStart = centroidRingStart;
18024       centroidStream.lineEnd = centroidRingEnd;
18025     },
18026     polygonEnd: function() {
18027       centroidStream.point = centroidPoint;
18028       centroidStream.lineStart = centroidLineStart;
18029       centroidStream.lineEnd = centroidLineEnd;
18030     },
18031     result: function() {
18032       var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];
18033       X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;
18034       return centroid;
18035     }
18036   };
18037   function centroidPoint(x, y) {
18038     X0 += x;
18039     Y0 += y;
18040     ++Z0;
18041   }
18042   function centroidLineStart() {
18043     centroidStream.point = centroidPointFirstLine;
18044   }
18045   function centroidPointFirstLine(x, y) {
18046     centroidStream.point = centroidPointLine;
18047     centroidPoint(x03 = x, y03 = y);
18048   }
18049   function centroidPointLine(x, y) {
18050     var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy);
18051     X1 += z * (x03 + x) / 2;
18052     Y1 += z * (y03 + y) / 2;
18053     Z1 += z;
18054     centroidPoint(x03 = x, y03 = y);
18055   }
18056   function centroidLineEnd() {
18057     centroidStream.point = centroidPoint;
18058   }
18059   function centroidRingStart() {
18060     centroidStream.point = centroidPointFirstRing;
18061   }
18062   function centroidRingEnd() {
18063     centroidPointRing(x002, y002);
18064   }
18065   function centroidPointFirstRing(x, y) {
18066     centroidStream.point = centroidPointRing;
18067     centroidPoint(x002 = x03 = x, y002 = y03 = y);
18068   }
18069   function centroidPointRing(x, y) {
18070     var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy);
18071     X1 += z * (x03 + x) / 2;
18072     Y1 += z * (y03 + y) / 2;
18073     Z1 += z;
18074     z = y03 * x - x03 * y;
18075     X2 += z * (x03 + x);
18076     Y2 += z * (y03 + y);
18077     Z2 += z * 3;
18078     centroidPoint(x03 = x, y03 = y);
18079   }
18080   var centroid_default = centroidStream;
18081
18082   // node_modules/d3-geo/src/path/context.js
18083   function PathContext(context) {
18084     this._context = context;
18085   }
18086   PathContext.prototype = {
18087     _radius: 4.5,
18088     pointRadius: function(_) {
18089       return this._radius = _, this;
18090     },
18091     polygonStart: function() {
18092       this._line = 0;
18093     },
18094     polygonEnd: function() {
18095       this._line = NaN;
18096     },
18097     lineStart: function() {
18098       this._point = 0;
18099     },
18100     lineEnd: function() {
18101       if (this._line === 0)
18102         this._context.closePath();
18103       this._point = NaN;
18104     },
18105     point: function(x, y) {
18106       switch (this._point) {
18107         case 0: {
18108           this._context.moveTo(x, y);
18109           this._point = 1;
18110           break;
18111         }
18112         case 1: {
18113           this._context.lineTo(x, y);
18114           break;
18115         }
18116         default: {
18117           this._context.moveTo(x + this._radius, y);
18118           this._context.arc(x, y, this._radius, 0, tau);
18119           break;
18120         }
18121       }
18122     },
18123     result: noop
18124   };
18125
18126   // node_modules/d3-geo/src/path/measure.js
18127   var lengthSum2 = new Adder();
18128   var lengthRing;
18129   var x003;
18130   var y003;
18131   var x04;
18132   var y04;
18133   var lengthStream2 = {
18134     point: noop,
18135     lineStart: function() {
18136       lengthStream2.point = lengthPointFirst2;
18137     },
18138     lineEnd: function() {
18139       if (lengthRing)
18140         lengthPoint2(x003, y003);
18141       lengthStream2.point = noop;
18142     },
18143     polygonStart: function() {
18144       lengthRing = true;
18145     },
18146     polygonEnd: function() {
18147       lengthRing = null;
18148     },
18149     result: function() {
18150       var length = +lengthSum2;
18151       lengthSum2 = new Adder();
18152       return length;
18153     }
18154   };
18155   function lengthPointFirst2(x, y) {
18156     lengthStream2.point = lengthPoint2;
18157     x003 = x04 = x, y003 = y04 = y;
18158   }
18159   function lengthPoint2(x, y) {
18160     x04 -= x, y04 -= y;
18161     lengthSum2.add(sqrt(x04 * x04 + y04 * y04));
18162     x04 = x, y04 = y;
18163   }
18164   var measure_default = lengthStream2;
18165
18166   // node_modules/d3-geo/src/path/string.js
18167   function PathString() {
18168     this._string = [];
18169   }
18170   PathString.prototype = {
18171     _radius: 4.5,
18172     _circle: circle(4.5),
18173     pointRadius: function(_) {
18174       if ((_ = +_) !== this._radius)
18175         this._radius = _, this._circle = null;
18176       return this;
18177     },
18178     polygonStart: function() {
18179       this._line = 0;
18180     },
18181     polygonEnd: function() {
18182       this._line = NaN;
18183     },
18184     lineStart: function() {
18185       this._point = 0;
18186     },
18187     lineEnd: function() {
18188       if (this._line === 0)
18189         this._string.push("Z");
18190       this._point = NaN;
18191     },
18192     point: function(x, y) {
18193       switch (this._point) {
18194         case 0: {
18195           this._string.push("M", x, ",", y);
18196           this._point = 1;
18197           break;
18198         }
18199         case 1: {
18200           this._string.push("L", x, ",", y);
18201           break;
18202         }
18203         default: {
18204           if (this._circle == null)
18205             this._circle = circle(this._radius);
18206           this._string.push("M", x, ",", y, this._circle);
18207           break;
18208         }
18209       }
18210     },
18211     result: function() {
18212       if (this._string.length) {
18213         var result = this._string.join("");
18214         this._string = [];
18215         return result;
18216       } else {
18217         return null;
18218       }
18219     }
18220   };
18221   function circle(radius) {
18222     return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
18223   }
18224
18225   // node_modules/d3-geo/src/path/index.js
18226   function path_default(projection2, context) {
18227     var pointRadius = 4.5, projectionStream, contextStream;
18228     function path(object) {
18229       if (object) {
18230         if (typeof pointRadius === "function")
18231           contextStream.pointRadius(+pointRadius.apply(this, arguments));
18232         stream_default(object, projectionStream(contextStream));
18233       }
18234       return contextStream.result();
18235     }
18236     path.area = function(object) {
18237       stream_default(object, projectionStream(area_default2));
18238       return area_default2.result();
18239     };
18240     path.measure = function(object) {
18241       stream_default(object, projectionStream(measure_default));
18242       return measure_default.result();
18243     };
18244     path.bounds = function(object) {
18245       stream_default(object, projectionStream(bounds_default2));
18246       return bounds_default2.result();
18247     };
18248     path.centroid = function(object) {
18249       stream_default(object, projectionStream(centroid_default));
18250       return centroid_default.result();
18251     };
18252     path.projection = function(_) {
18253       return arguments.length ? (projectionStream = _ == null ? (projection2 = null, identity_default) : (projection2 = _).stream, path) : projection2;
18254     };
18255     path.context = function(_) {
18256       if (!arguments.length)
18257         return context;
18258       contextStream = _ == null ? (context = null, new PathString()) : new PathContext(context = _);
18259       if (typeof pointRadius !== "function")
18260         contextStream.pointRadius(pointRadius);
18261       return path;
18262     };
18263     path.pointRadius = function(_) {
18264       if (!arguments.length)
18265         return pointRadius;
18266       pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
18267       return path;
18268     };
18269     return path.projection(projection2).context(context);
18270   }
18271
18272   // node_modules/d3-geo/src/transform.js
18273   function transform_default(methods2) {
18274     return {
18275       stream: transformer(methods2)
18276     };
18277   }
18278   function transformer(methods2) {
18279     return function(stream) {
18280       var s = new TransformStream();
18281       for (var key in methods2)
18282         s[key] = methods2[key];
18283       s.stream = stream;
18284       return s;
18285     };
18286   }
18287   function TransformStream() {
18288   }
18289   TransformStream.prototype = {
18290     constructor: TransformStream,
18291     point: function(x, y) {
18292       this.stream.point(x, y);
18293     },
18294     sphere: function() {
18295       this.stream.sphere();
18296     },
18297     lineStart: function() {
18298       this.stream.lineStart();
18299     },
18300     lineEnd: function() {
18301       this.stream.lineEnd();
18302     },
18303     polygonStart: function() {
18304       this.stream.polygonStart();
18305     },
18306     polygonEnd: function() {
18307       this.stream.polygonEnd();
18308     }
18309   };
18310
18311   // node_modules/d3-geo/src/projection/fit.js
18312   function fit(projection2, fitBounds, object) {
18313     var clip = projection2.clipExtent && projection2.clipExtent();
18314     projection2.scale(150).translate([0, 0]);
18315     if (clip != null)
18316       projection2.clipExtent(null);
18317     stream_default(object, projection2.stream(bounds_default2));
18318     fitBounds(bounds_default2.result());
18319     if (clip != null)
18320       projection2.clipExtent(clip);
18321     return projection2;
18322   }
18323   function fitExtent(projection2, extent, object) {
18324     return fit(projection2, function(b) {
18325       var w = extent[1][0] - extent[0][0], h = extent[1][1] - extent[0][1], k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
18326       projection2.scale(150 * k).translate([x, y]);
18327     }, object);
18328   }
18329   function fitSize(projection2, size, object) {
18330     return fitExtent(projection2, [[0, 0], size], object);
18331   }
18332   function fitWidth(projection2, width, object) {
18333     return fit(projection2, function(b) {
18334       var w = +width, k = w / (b[1][0] - b[0][0]), x = (w - k * (b[1][0] + b[0][0])) / 2, y = -k * b[0][1];
18335       projection2.scale(150 * k).translate([x, y]);
18336     }, object);
18337   }
18338   function fitHeight(projection2, height, object) {
18339     return fit(projection2, function(b) {
18340       var h = +height, k = h / (b[1][1] - b[0][1]), x = -k * b[0][0], y = (h - k * (b[1][1] + b[0][1])) / 2;
18341       projection2.scale(150 * k).translate([x, y]);
18342     }, object);
18343   }
18344
18345   // node_modules/d3-geo/src/projection/resample.js
18346   var maxDepth = 16;
18347   var cosMinDistance = cos(30 * radians);
18348   function resample_default(project, delta2) {
18349     return +delta2 ? resample(project, delta2) : resampleNone(project);
18350   }
18351   function resampleNone(project) {
18352     return transformer({
18353       point: function(x, y) {
18354         x = project(x, y);
18355         this.stream.point(x[0], x[1]);
18356       }
18357     });
18358   }
18359   function resample(project, delta2) {
18360     function resampleLineTo(x05, y05, lambda04, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream) {
18361       var dx = x12 - x05, dy = y12 - y05, d2 = dx * dx + dy * dy;
18362       if (d2 > 4 * delta2 && depth--) {
18363         var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = sqrt(a * a + b * b + c * c), phi2 = asin(c /= m), lambda22 = abs(abs(c) - 1) < epsilon || abs(lambda04 - lambda12) < epsilon ? (lambda04 + lambda12) / 2 : atan2(b, a), p = project(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x05, dy2 = y2 - y05, dz = dy * dx2 - dx * dy2;
18364         if (dz * dz / d2 > delta2 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
18365           resampleLineTo(x05, y05, lambda04, a0, b0, c0, x2, y2, lambda22, a /= m, b /= m, c, depth, stream);
18366           stream.point(x2, y2);
18367           resampleLineTo(x2, y2, lambda22, a, b, c, x12, y12, lambda12, a1, b1, c1, depth, stream);
18368         }
18369       }
18370     }
18371     return function(stream) {
18372       var lambda003, x004, y004, a00, b00, c00, lambda04, x05, y05, a0, b0, c0;
18373       var resampleStream = {
18374         point: point2,
18375         lineStart,
18376         lineEnd,
18377         polygonStart: function() {
18378           stream.polygonStart();
18379           resampleStream.lineStart = ringStart;
18380         },
18381         polygonEnd: function() {
18382           stream.polygonEnd();
18383           resampleStream.lineStart = lineStart;
18384         }
18385       };
18386       function point2(x, y) {
18387         x = project(x, y);
18388         stream.point(x[0], x[1]);
18389       }
18390       function lineStart() {
18391         x05 = NaN;
18392         resampleStream.point = linePoint2;
18393         stream.lineStart();
18394       }
18395       function linePoint2(lambda, phi) {
18396         var c = cartesian([lambda, phi]), p = project(lambda, phi);
18397         resampleLineTo(x05, y05, lambda04, a0, b0, c0, x05 = p[0], y05 = p[1], lambda04 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
18398         stream.point(x05, y05);
18399       }
18400       function lineEnd() {
18401         resampleStream.point = point2;
18402         stream.lineEnd();
18403       }
18404       function ringStart() {
18405         lineStart();
18406         resampleStream.point = ringPoint;
18407         resampleStream.lineEnd = ringEnd;
18408       }
18409       function ringPoint(lambda, phi) {
18410         linePoint2(lambda003 = lambda, phi), x004 = x05, y004 = y05, a00 = a0, b00 = b0, c00 = c0;
18411         resampleStream.point = linePoint2;
18412       }
18413       function ringEnd() {
18414         resampleLineTo(x05, y05, lambda04, a0, b0, c0, x004, y004, lambda003, a00, b00, c00, maxDepth, stream);
18415         resampleStream.lineEnd = lineEnd;
18416         lineEnd();
18417       }
18418       return resampleStream;
18419     };
18420   }
18421
18422   // node_modules/d3-geo/src/projection/index.js
18423   var transformRadians = transformer({
18424     point: function(x, y) {
18425       this.stream.point(x * radians, y * radians);
18426     }
18427   });
18428   function transformRotate(rotate) {
18429     return transformer({
18430       point: function(x, y) {
18431         var r = rotate(x, y);
18432         return this.stream.point(r[0], r[1]);
18433       }
18434     });
18435   }
18436   function scaleTranslate(k, dx, dy, sx, sy) {
18437     function transform2(x, y) {
18438       x *= sx;
18439       y *= sy;
18440       return [dx + k * x, dy - k * y];
18441     }
18442     transform2.invert = function(x, y) {
18443       return [(x - dx) / k * sx, (dy - y) / k * sy];
18444     };
18445     return transform2;
18446   }
18447   function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {
18448     if (!alpha)
18449       return scaleTranslate(k, dx, dy, sx, sy);
18450     var cosAlpha = cos(alpha), sinAlpha = sin(alpha), a = cosAlpha * k, b = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;
18451     function transform2(x, y) {
18452       x *= sx;
18453       y *= sy;
18454       return [a * x - b * y + dx, dy - b * x - a * y];
18455     }
18456     transform2.invert = function(x, y) {
18457       return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];
18458     };
18459     return transform2;
18460   }
18461   function projection(project) {
18462     return projectionMutator(function() {
18463       return project;
18464     })();
18465   }
18466   function projectionMutator(projectAt) {
18467     var project, k = 150, x = 480, y = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, alpha = 0, sx = 1, sy = 1, theta = null, preclip = antimeridian_default, x05 = null, y05, x12, y12, postclip = identity_default, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache, cacheStream;
18468     function projection2(point2) {
18469       return projectRotateTransform(point2[0] * radians, point2[1] * radians);
18470     }
18471     function invert(point2) {
18472       point2 = projectRotateTransform.invert(point2[0], point2[1]);
18473       return point2 && [point2[0] * degrees, point2[1] * degrees];
18474     }
18475     projection2.stream = function(stream) {
18476       return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
18477     };
18478     projection2.preclip = function(_) {
18479       return arguments.length ? (preclip = _, theta = void 0, reset()) : preclip;
18480     };
18481     projection2.postclip = function(_) {
18482       return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip;
18483     };
18484     projection2.clipAngle = function(_) {
18485       return arguments.length ? (preclip = +_ ? circle_default(theta = _ * radians) : (theta = null, antimeridian_default), reset()) : theta * degrees;
18486     };
18487     projection2.clipExtent = function(_) {
18488       return arguments.length ? (postclip = _ == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]];
18489     };
18490     projection2.scale = function(_) {
18491       return arguments.length ? (k = +_, recenter()) : k;
18492     };
18493     projection2.translate = function(_) {
18494       return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
18495     };
18496     projection2.center = function(_) {
18497       return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];
18498     };
18499     projection2.rotate = function(_) {
18500       return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];
18501     };
18502     projection2.angle = function(_) {
18503       return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;
18504     };
18505     projection2.reflectX = function(_) {
18506       return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;
18507     };
18508     projection2.reflectY = function(_) {
18509       return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;
18510     };
18511     projection2.precision = function(_) {
18512       return arguments.length ? (projectResample = resample_default(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
18513     };
18514     projection2.fitExtent = function(extent, object) {
18515       return fitExtent(projection2, extent, object);
18516     };
18517     projection2.fitSize = function(size, object) {
18518       return fitSize(projection2, size, object);
18519     };
18520     projection2.fitWidth = function(width, object) {
18521       return fitWidth(projection2, width, object);
18522     };
18523     projection2.fitHeight = function(height, object) {
18524       return fitHeight(projection2, height, object);
18525     };
18526     function recenter() {
18527       var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform2 = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);
18528       rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
18529       projectTransform = compose_default(project, transform2);
18530       projectRotateTransform = compose_default(rotate, projectTransform);
18531       projectResample = resample_default(projectTransform, delta2);
18532       return reset();
18533     }
18534     function reset() {
18535       cache = cacheStream = null;
18536       return projection2;
18537     }
18538     return function() {
18539       project = projectAt.apply(this, arguments);
18540       projection2.invert = project.invert && invert;
18541       return recenter();
18542     };
18543   }
18544
18545   // node_modules/d3-geo/src/projection/mercator.js
18546   function mercatorRaw(lambda, phi) {
18547     return [lambda, log(tan((halfPi + phi) / 2))];
18548   }
18549   mercatorRaw.invert = function(x, y) {
18550     return [x, 2 * atan(exp(y)) - halfPi];
18551   };
18552   function mercator_default() {
18553     return mercatorProjection(mercatorRaw).scale(961 / tau);
18554   }
18555   function mercatorProjection(project) {
18556     var m = projection(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x05 = null, y05, x12, y12;
18557     m.scale = function(_) {
18558       return arguments.length ? (scale(_), reclip()) : scale();
18559     };
18560     m.translate = function(_) {
18561       return arguments.length ? (translate(_), reclip()) : translate();
18562     };
18563     m.center = function(_) {
18564       return arguments.length ? (center(_), reclip()) : center();
18565     };
18566     m.clipExtent = function(_) {
18567       return arguments.length ? (_ == null ? x05 = y05 = x12 = y12 = null : (x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x05 == null ? null : [[x05, y05], [x12, y12]];
18568     };
18569     function reclip() {
18570       var k = pi * scale(), t = m(rotation_default(m.rotate()).invert([0, 0]));
18571       return clipExtent(x05 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw ? [[Math.max(t[0] - k, x05), y05], [Math.min(t[0] + k, x12), y12]] : [[x05, Math.max(t[1] - k, y05)], [x12, Math.min(t[1] + k, y12)]]);
18572     }
18573     return reclip();
18574   }
18575
18576   // node_modules/d3-geo/src/projection/identity.js
18577   function identity_default2() {
18578     var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, ca, sa, x05 = null, y05, x12, y12, kx = 1, ky = 1, transform2 = transformer({
18579       point: function(x, y) {
18580         var p = projection2([x, y]);
18581         this.stream.point(p[0], p[1]);
18582       }
18583     }), postclip = identity_default, cache, cacheStream;
18584     function reset() {
18585       kx = k * sx;
18586       ky = k * sy;
18587       cache = cacheStream = null;
18588       return projection2;
18589     }
18590     function projection2(p) {
18591       var x = p[0] * kx, y = p[1] * ky;
18592       if (alpha) {
18593         var t = y * ca - x * sa;
18594         x = x * ca + y * sa;
18595         y = t;
18596       }
18597       return [x + tx, y + ty];
18598     }
18599     projection2.invert = function(p) {
18600       var x = p[0] - tx, y = p[1] - ty;
18601       if (alpha) {
18602         var t = y * ca + x * sa;
18603         x = x * ca - y * sa;
18604         y = t;
18605       }
18606       return [x / kx, y / ky];
18607     };
18608     projection2.stream = function(stream) {
18609       return cache && cacheStream === stream ? cache : cache = transform2(postclip(cacheStream = stream));
18610     };
18611     projection2.postclip = function(_) {
18612       return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip;
18613     };
18614     projection2.clipExtent = function(_) {
18615       return arguments.length ? (postclip = _ == null ? (x05 = y05 = x12 = y12 = null, identity_default) : clipRectangle(x05 = +_[0][0], y05 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset()) : x05 == null ? null : [[x05, y05], [x12, y12]];
18616     };
18617     projection2.scale = function(_) {
18618       return arguments.length ? (k = +_, reset()) : k;
18619     };
18620     projection2.translate = function(_) {
18621       return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty];
18622     };
18623     projection2.angle = function(_) {
18624       return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees;
18625     };
18626     projection2.reflectX = function(_) {
18627       return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;
18628     };
18629     projection2.reflectY = function(_) {
18630       return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;
18631     };
18632     projection2.fitExtent = function(extent, object) {
18633       return fitExtent(projection2, extent, object);
18634     };
18635     projection2.fitSize = function(size, object) {
18636       return fitSize(projection2, size, object);
18637     };
18638     projection2.fitWidth = function(width, object) {
18639       return fitWidth(projection2, width, object);
18640     };
18641     projection2.fitHeight = function(height, object) {
18642       return fitHeight(projection2, height, object);
18643     };
18644     return projection2;
18645   }
18646
18647   // modules/geo/geo.js
18648   var TAU = 2 * Math.PI;
18649   var EQUATORIAL_RADIUS = 6356752314245179e-9;
18650   var POLAR_RADIUS = 6378137;
18651   function geoLatToMeters(dLat) {
18652     return dLat * (TAU * POLAR_RADIUS / 360);
18653   }
18654   function geoLonToMeters(dLon, atLat) {
18655     return Math.abs(atLat) >= 90 ? 0 : dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
18656   }
18657   function geoMetersToLat(m) {
18658     return m / (TAU * POLAR_RADIUS / 360);
18659   }
18660   function geoMetersToLon(m, atLat) {
18661     return Math.abs(atLat) >= 90 ? 0 : m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
18662   }
18663   function geoMetersToOffset(meters, tileSize) {
18664     tileSize = tileSize || 256;
18665     return [
18666       meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
18667       -meters[1] * tileSize / (TAU * POLAR_RADIUS)
18668     ];
18669   }
18670   function geoOffsetToMeters(offset, tileSize) {
18671     tileSize = tileSize || 256;
18672     return [
18673       offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
18674       -offset[1] * TAU * POLAR_RADIUS / tileSize
18675     ];
18676   }
18677   function geoSphericalDistance(a, b) {
18678     var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
18679     var y = geoLatToMeters(a[1] - b[1]);
18680     return Math.sqrt(x * x + y * y);
18681   }
18682   function geoScaleToZoom(k, tileSize) {
18683     tileSize = tileSize || 256;
18684     var log2ts = Math.log(tileSize) * Math.LOG2E;
18685     return Math.log(k * TAU) / Math.LN2 - log2ts;
18686   }
18687   function geoZoomToScale(z, tileSize) {
18688     tileSize = tileSize || 256;
18689     return tileSize * Math.pow(2, z) / TAU;
18690   }
18691   function geoSphericalClosestNode(nodes, point2) {
18692     var minDistance = Infinity, distance;
18693     var indexOfMin;
18694     for (var i2 in nodes) {
18695       distance = geoSphericalDistance(nodes[i2].loc, point2);
18696       if (distance < minDistance) {
18697         minDistance = distance;
18698         indexOfMin = i2;
18699       }
18700     }
18701     if (indexOfMin !== void 0) {
18702       return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
18703     } else {
18704       return null;
18705     }
18706   }
18707
18708   // modules/geo/extent.js
18709   function geoExtent(min3, max3) {
18710     if (!(this instanceof geoExtent)) {
18711       return new geoExtent(min3, max3);
18712     } else if (min3 instanceof geoExtent) {
18713       return min3;
18714     } else if (min3 && min3.length === 2 && min3[0].length === 2 && min3[1].length === 2) {
18715       this[0] = min3[0];
18716       this[1] = min3[1];
18717     } else {
18718       this[0] = min3 || [Infinity, Infinity];
18719       this[1] = max3 || min3 || [-Infinity, -Infinity];
18720     }
18721   }
18722   geoExtent.prototype = new Array(2);
18723   Object.assign(geoExtent.prototype, {
18724     equals: function(obj) {
18725       return this[0][0] === obj[0][0] && this[0][1] === obj[0][1] && this[1][0] === obj[1][0] && this[1][1] === obj[1][1];
18726     },
18727     extend: function(obj) {
18728       if (!(obj instanceof geoExtent))
18729         obj = new geoExtent(obj);
18730       return geoExtent(
18731         [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
18732         [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
18733       );
18734     },
18735     _extend: function(extent) {
18736       this[0][0] = Math.min(extent[0][0], this[0][0]);
18737       this[0][1] = Math.min(extent[0][1], this[0][1]);
18738       this[1][0] = Math.max(extent[1][0], this[1][0]);
18739       this[1][1] = Math.max(extent[1][1], this[1][1]);
18740     },
18741     area: function() {
18742       return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
18743     },
18744     center: function() {
18745       return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
18746     },
18747     rectangle: function() {
18748       return [this[0][0], this[0][1], this[1][0], this[1][1]];
18749     },
18750     bbox: function() {
18751       return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
18752     },
18753     polygon: function() {
18754       return [
18755         [this[0][0], this[0][1]],
18756         [this[0][0], this[1][1]],
18757         [this[1][0], this[1][1]],
18758         [this[1][0], this[0][1]],
18759         [this[0][0], this[0][1]]
18760       ];
18761     },
18762     contains: function(obj) {
18763       if (!(obj instanceof geoExtent))
18764         obj = new geoExtent(obj);
18765       return obj[0][0] >= this[0][0] && obj[0][1] >= this[0][1] && obj[1][0] <= this[1][0] && obj[1][1] <= this[1][1];
18766     },
18767     intersects: function(obj) {
18768       if (!(obj instanceof geoExtent))
18769         obj = new geoExtent(obj);
18770       return obj[0][0] <= this[1][0] && obj[0][1] <= this[1][1] && obj[1][0] >= this[0][0] && obj[1][1] >= this[0][1];
18771     },
18772     intersection: function(obj) {
18773       if (!this.intersects(obj))
18774         return new geoExtent();
18775       return new geoExtent(
18776         [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
18777         [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
18778       );
18779     },
18780     percentContainedIn: function(obj) {
18781       if (!(obj instanceof geoExtent))
18782         obj = new geoExtent(obj);
18783       var a1 = this.intersection(obj).area();
18784       var a2 = this.area();
18785       if (a1 === Infinity || a2 === Infinity) {
18786         return 0;
18787       } else if (a1 === 0 || a2 === 0) {
18788         if (obj.contains(this)) {
18789           return 1;
18790         }
18791         return 0;
18792       } else {
18793         return a1 / a2;
18794       }
18795     },
18796     padByMeters: function(meters) {
18797       var dLat = geoMetersToLat(meters);
18798       var dLon = geoMetersToLon(meters, this.center()[1]);
18799       return geoExtent(
18800         [this[0][0] - dLon, this[0][1] - dLat],
18801         [this[1][0] + dLon, this[1][1] + dLat]
18802       );
18803     },
18804     toParam: function() {
18805       return this.rectangle().join(",");
18806     }
18807   });
18808
18809   // node_modules/d3-polygon/src/area.js
18810   function area_default3(polygon2) {
18811     var i2 = -1, n2 = polygon2.length, a, b = polygon2[n2 - 1], area = 0;
18812     while (++i2 < n2) {
18813       a = b;
18814       b = polygon2[i2];
18815       area += a[1] * b[0] - a[0] * b[1];
18816     }
18817     return area / 2;
18818   }
18819
18820   // node_modules/d3-polygon/src/centroid.js
18821   function centroid_default2(polygon2) {
18822     var i2 = -1, n2 = polygon2.length, x = 0, y = 0, a, b = polygon2[n2 - 1], c, k = 0;
18823     while (++i2 < n2) {
18824       a = b;
18825       b = polygon2[i2];
18826       k += c = a[0] * b[1] - b[0] * a[1];
18827       x += (a[0] + b[0]) * c;
18828       y += (a[1] + b[1]) * c;
18829     }
18830     return k *= 3, [x / k, y / k];
18831   }
18832
18833   // node_modules/d3-polygon/src/cross.js
18834   function cross_default(a, b, c) {
18835     return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
18836   }
18837
18838   // node_modules/d3-polygon/src/hull.js
18839   function lexicographicOrder(a, b) {
18840     return a[0] - b[0] || a[1] - b[1];
18841   }
18842   function computeUpperHullIndexes(points) {
18843     const n2 = points.length, indexes = [0, 1];
18844     let size = 2, i2;
18845     for (i2 = 2; i2 < n2; ++i2) {
18846       while (size > 1 && cross_default(points[indexes[size - 2]], points[indexes[size - 1]], points[i2]) <= 0)
18847         --size;
18848       indexes[size++] = i2;
18849     }
18850     return indexes.slice(0, size);
18851   }
18852   function hull_default(points) {
18853     if ((n2 = points.length) < 3)
18854       return null;
18855     var i2, n2, sortedPoints = new Array(n2), flippedPoints = new Array(n2);
18856     for (i2 = 0; i2 < n2; ++i2)
18857       sortedPoints[i2] = [+points[i2][0], +points[i2][1], i2];
18858     sortedPoints.sort(lexicographicOrder);
18859     for (i2 = 0; i2 < n2; ++i2)
18860       flippedPoints[i2] = [sortedPoints[i2][0], -sortedPoints[i2][1]];
18861     var upperIndexes = computeUpperHullIndexes(sortedPoints), lowerIndexes = computeUpperHullIndexes(flippedPoints);
18862     var skipLeft = lowerIndexes[0] === upperIndexes[0], skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], hull = [];
18863     for (i2 = upperIndexes.length - 1; i2 >= 0; --i2)
18864       hull.push(points[sortedPoints[upperIndexes[i2]][2]]);
18865     for (i2 = +skipLeft; i2 < lowerIndexes.length - skipRight; ++i2)
18866       hull.push(points[sortedPoints[lowerIndexes[i2]][2]]);
18867     return hull;
18868   }
18869
18870   // modules/geo/vector.js
18871   function geoVecEqual(a, b, epsilon3) {
18872     if (epsilon3) {
18873       return Math.abs(a[0] - b[0]) <= epsilon3 && Math.abs(a[1] - b[1]) <= epsilon3;
18874     } else {
18875       return a[0] === b[0] && a[1] === b[1];
18876     }
18877   }
18878   function geoVecAdd(a, b) {
18879     return [a[0] + b[0], a[1] + b[1]];
18880   }
18881   function geoVecSubtract(a, b) {
18882     return [a[0] - b[0], a[1] - b[1]];
18883   }
18884   function geoVecScale(a, mag) {
18885     return [a[0] * mag, a[1] * mag];
18886   }
18887   function geoVecFloor(a) {
18888     return [Math.floor(a[0]), Math.floor(a[1])];
18889   }
18890   function geoVecInterp(a, b, t) {
18891     return [
18892       a[0] + (b[0] - a[0]) * t,
18893       a[1] + (b[1] - a[1]) * t
18894     ];
18895   }
18896   function geoVecLength(a, b) {
18897     return Math.sqrt(geoVecLengthSquare(a, b));
18898   }
18899   function geoVecLengthSquare(a, b) {
18900     b = b || [0, 0];
18901     var x = a[0] - b[0];
18902     var y = a[1] - b[1];
18903     return x * x + y * y;
18904   }
18905   function geoVecNormalize(a) {
18906     var length = Math.sqrt(a[0] * a[0] + a[1] * a[1]);
18907     if (length !== 0) {
18908       return geoVecScale(a, 1 / length);
18909     }
18910     return [0, 0];
18911   }
18912   function geoVecAngle(a, b) {
18913     return Math.atan2(b[1] - a[1], b[0] - a[0]);
18914   }
18915   function geoVecDot(a, b, origin) {
18916     origin = origin || [0, 0];
18917     var p = geoVecSubtract(a, origin);
18918     var q = geoVecSubtract(b, origin);
18919     return p[0] * q[0] + p[1] * q[1];
18920   }
18921   function geoVecNormalizedDot(a, b, origin) {
18922     origin = origin || [0, 0];
18923     var p = geoVecNormalize(geoVecSubtract(a, origin));
18924     var q = geoVecNormalize(geoVecSubtract(b, origin));
18925     return geoVecDot(p, q);
18926   }
18927   function geoVecCross(a, b, origin) {
18928     origin = origin || [0, 0];
18929     var p = geoVecSubtract(a, origin);
18930     var q = geoVecSubtract(b, origin);
18931     return p[0] * q[1] - p[1] * q[0];
18932   }
18933   function geoVecProject(a, points) {
18934     var min3 = Infinity;
18935     var idx;
18936     var target;
18937     for (var i2 = 0; i2 < points.length - 1; i2++) {
18938       var o = points[i2];
18939       var s = geoVecSubtract(points[i2 + 1], o);
18940       var v = geoVecSubtract(a, o);
18941       var proj = geoVecDot(v, s) / geoVecDot(s, s);
18942       var p;
18943       if (proj < 0) {
18944         p = o;
18945       } else if (proj > 1) {
18946         p = points[i2 + 1];
18947       } else {
18948         p = [o[0] + proj * s[0], o[1] + proj * s[1]];
18949       }
18950       var dist = geoVecLength(p, a);
18951       if (dist < min3) {
18952         min3 = dist;
18953         idx = i2 + 1;
18954         target = p;
18955       }
18956     }
18957     if (idx !== void 0) {
18958       return { index: idx, distance: min3, target };
18959     } else {
18960       return null;
18961     }
18962   }
18963
18964   // modules/geo/geom.js
18965   function geoAngle(a, b, projection2) {
18966     return geoVecAngle(projection2(a.loc), projection2(b.loc));
18967   }
18968   function geoEdgeEqual(a, b) {
18969     return a[0] === b[0] && a[1] === b[1] || a[0] === b[1] && a[1] === b[0];
18970   }
18971   function geoRotate(points, angle2, around) {
18972     return points.map(function(point2) {
18973       var radial = geoVecSubtract(point2, around);
18974       return [
18975         radial[0] * Math.cos(angle2) - radial[1] * Math.sin(angle2) + around[0],
18976         radial[0] * Math.sin(angle2) + radial[1] * Math.cos(angle2) + around[1]
18977       ];
18978     });
18979   }
18980   function geoChooseEdge(nodes, point2, projection2, activeID) {
18981     var dist = geoVecLength;
18982     var points = nodes.map(function(n2) {
18983       return projection2(n2.loc);
18984     });
18985     var ids = nodes.map(function(n2) {
18986       return n2.id;
18987     });
18988     var min3 = Infinity;
18989     var idx;
18990     var loc;
18991     for (var i2 = 0; i2 < points.length - 1; i2++) {
18992       if (ids[i2] === activeID || ids[i2 + 1] === activeID)
18993         continue;
18994       var o = points[i2];
18995       var s = geoVecSubtract(points[i2 + 1], o);
18996       var v = geoVecSubtract(point2, o);
18997       var proj = geoVecDot(v, s) / geoVecDot(s, s);
18998       var p;
18999       if (proj < 0) {
19000         p = o;
19001       } else if (proj > 1) {
19002         p = points[i2 + 1];
19003       } else {
19004         p = [o[0] + proj * s[0], o[1] + proj * s[1]];
19005       }
19006       var d = dist(p, point2);
19007       if (d < min3) {
19008         min3 = d;
19009         idx = i2 + 1;
19010         loc = projection2.invert(p);
19011       }
19012     }
19013     if (idx !== void 0) {
19014       return { index: idx, distance: min3, loc };
19015     } else {
19016       return null;
19017     }
19018   }
19019   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
19020     var actives = [];
19021     var inactives = [];
19022     var j2, k, n1, n2, segment;
19023     for (j2 = 0; j2 < activeNodes.length - 1; j2++) {
19024       n1 = activeNodes[j2];
19025       n2 = activeNodes[j2 + 1];
19026       segment = [n1.loc, n2.loc];
19027       if (n1.id === activeID || n2.id === activeID) {
19028         actives.push(segment);
19029       }
19030     }
19031     for (j2 = 0; j2 < inactiveNodes.length - 1; j2++) {
19032       n1 = inactiveNodes[j2];
19033       n2 = inactiveNodes[j2 + 1];
19034       segment = [n1.loc, n2.loc];
19035       inactives.push(segment);
19036     }
19037     for (j2 = 0; j2 < actives.length; j2++) {
19038       for (k = 0; k < inactives.length; k++) {
19039         var p = actives[j2];
19040         var q = inactives[k];
19041         var hit = geoLineIntersection(p, q);
19042         if (hit) {
19043           return true;
19044         }
19045       }
19046     }
19047     return false;
19048   }
19049   function geoHasSelfIntersections(nodes, activeID) {
19050     var actives = [];
19051     var inactives = [];
19052     var j2, k;
19053     for (j2 = 0; j2 < nodes.length - 1; j2++) {
19054       var n1 = nodes[j2];
19055       var n2 = nodes[j2 + 1];
19056       var segment = [n1.loc, n2.loc];
19057       if (n1.id === activeID || n2.id === activeID) {
19058         actives.push(segment);
19059       } else {
19060         inactives.push(segment);
19061       }
19062     }
19063     for (j2 = 0; j2 < actives.length; j2++) {
19064       for (k = 0; k < inactives.length; k++) {
19065         var p = actives[j2];
19066         var q = inactives[k];
19067         if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1])) {
19068           continue;
19069         }
19070         var hit = geoLineIntersection(p, q);
19071         if (hit) {
19072           var epsilon3 = 1e-8;
19073           if (geoVecEqual(p[1], hit, epsilon3) || geoVecEqual(p[0], hit, epsilon3) || geoVecEqual(q[1], hit, epsilon3) || geoVecEqual(q[0], hit, epsilon3)) {
19074             continue;
19075           } else {
19076             return true;
19077           }
19078         }
19079       }
19080     }
19081     return false;
19082   }
19083   function geoLineIntersection(a, b) {
19084     var p = [a[0][0], a[0][1]];
19085     var p2 = [a[1][0], a[1][1]];
19086     var q = [b[0][0], b[0][1]];
19087     var q2 = [b[1][0], b[1][1]];
19088     var r = geoVecSubtract(p2, p);
19089     var s = geoVecSubtract(q2, q);
19090     var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
19091     var denominator = geoVecCross(r, s);
19092     if (uNumerator && denominator) {
19093       var u = uNumerator / denominator;
19094       var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
19095       if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {
19096         return geoVecInterp(p, p2, t);
19097       }
19098     }
19099     return null;
19100   }
19101   function geoPathIntersections(path1, path2) {
19102     var intersections = [];
19103     for (var i2 = 0; i2 < path1.length - 1; i2++) {
19104       for (var j2 = 0; j2 < path2.length - 1; j2++) {
19105         var a = [path1[i2], path1[i2 + 1]];
19106         var b = [path2[j2], path2[j2 + 1]];
19107         var hit = geoLineIntersection(a, b);
19108         if (hit) {
19109           intersections.push(hit);
19110         }
19111       }
19112     }
19113     return intersections;
19114   }
19115   function geoPathHasIntersections(path1, path2) {
19116     for (var i2 = 0; i2 < path1.length - 1; i2++) {
19117       for (var j2 = 0; j2 < path2.length - 1; j2++) {
19118         var a = [path1[i2], path1[i2 + 1]];
19119         var b = [path2[j2], path2[j2 + 1]];
19120         var hit = geoLineIntersection(a, b);
19121         if (hit) {
19122           return true;
19123         }
19124       }
19125     }
19126     return false;
19127   }
19128   function geoPointInPolygon(point2, polygon2) {
19129     var x = point2[0];
19130     var y = point2[1];
19131     var inside = false;
19132     for (var i2 = 0, j2 = polygon2.length - 1; i2 < polygon2.length; j2 = i2++) {
19133       var xi = polygon2[i2][0];
19134       var yi = polygon2[i2][1];
19135       var xj = polygon2[j2][0];
19136       var yj = polygon2[j2][1];
19137       var intersect2 = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
19138       if (intersect2)
19139         inside = !inside;
19140     }
19141     return inside;
19142   }
19143   function geoPolygonContainsPolygon(outer, inner) {
19144     return inner.every(function(point2) {
19145       return geoPointInPolygon(point2, outer);
19146     });
19147   }
19148   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
19149     function testPoints(outer2, inner2) {
19150       return inner2.some(function(point2) {
19151         return geoPointInPolygon(point2, outer2);
19152       });
19153     }
19154     return testPoints(outer, inner) || !!checkSegments && geoPathHasIntersections(outer, inner);
19155   }
19156   function geoGetSmallestSurroundingRectangle(points) {
19157     var hull = hull_default(points);
19158     var centroid = centroid_default2(hull);
19159     var minArea = Infinity;
19160     var ssrExtent = [];
19161     var ssrAngle = 0;
19162     var c1 = hull[0];
19163     for (var i2 = 0; i2 <= hull.length - 1; i2++) {
19164       var c2 = i2 === hull.length - 1 ? hull[0] : hull[i2 + 1];
19165       var angle2 = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
19166       var poly = geoRotate(hull, -angle2, centroid);
19167       var extent = poly.reduce(function(extent2, point2) {
19168         return extent2.extend(geoExtent(point2));
19169       }, geoExtent());
19170       var area = extent.area();
19171       if (area < minArea) {
19172         minArea = area;
19173         ssrExtent = extent;
19174         ssrAngle = angle2;
19175       }
19176       c1 = c2;
19177     }
19178     return {
19179       poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
19180       angle: ssrAngle
19181     };
19182   }
19183   function geoPathLength(path) {
19184     var length = 0;
19185     for (var i2 = 0; i2 < path.length - 1; i2++) {
19186       length += geoVecLength(path[i2], path[i2 + 1]);
19187     }
19188     return length;
19189   }
19190   function geoViewportEdge(point2, dimensions) {
19191     var pad2 = [80, 20, 50, 20];
19192     var x = 0;
19193     var y = 0;
19194     if (point2[0] > dimensions[0] - pad2[1]) {
19195       x = -10;
19196     }
19197     if (point2[0] < pad2[3]) {
19198       x = 10;
19199     }
19200     if (point2[1] > dimensions[1] - pad2[2]) {
19201       y = -10;
19202     }
19203     if (point2[1] < pad2[0]) {
19204       y = 10;
19205     }
19206     if (x || y) {
19207       return [x, y];
19208     } else {
19209       return null;
19210     }
19211   }
19212
19213   // node_modules/d3-dispatch/src/dispatch.js
19214   var noop2 = { value: () => {
19215   } };
19216   function dispatch() {
19217     for (var i2 = 0, n2 = arguments.length, _ = {}, t; i2 < n2; ++i2) {
19218       if (!(t = arguments[i2] + "") || t in _ || /[\s.]/.test(t))
19219         throw new Error("illegal type: " + t);
19220       _[t] = [];
19221     }
19222     return new Dispatch(_);
19223   }
19224   function Dispatch(_) {
19225     this._ = _;
19226   }
19227   function parseTypenames(typenames, types) {
19228     return typenames.trim().split(/^|\s+/).map(function(t) {
19229       var name = "", i2 = t.indexOf(".");
19230       if (i2 >= 0)
19231         name = t.slice(i2 + 1), t = t.slice(0, i2);
19232       if (t && !types.hasOwnProperty(t))
19233         throw new Error("unknown type: " + t);
19234       return { type: t, name };
19235     });
19236   }
19237   Dispatch.prototype = dispatch.prototype = {
19238     constructor: Dispatch,
19239     on: function(typename, callback) {
19240       var _ = this._, T = parseTypenames(typename + "", _), t, i2 = -1, n2 = T.length;
19241       if (arguments.length < 2) {
19242         while (++i2 < n2)
19243           if ((t = (typename = T[i2]).type) && (t = get(_[t], typename.name)))
19244             return t;
19245         return;
19246       }
19247       if (callback != null && typeof callback !== "function")
19248         throw new Error("invalid callback: " + callback);
19249       while (++i2 < n2) {
19250         if (t = (typename = T[i2]).type)
19251           _[t] = set(_[t], typename.name, callback);
19252         else if (callback == null)
19253           for (t in _)
19254             _[t] = set(_[t], typename.name, null);
19255       }
19256       return this;
19257     },
19258     copy: function() {
19259       var copy2 = {}, _ = this._;
19260       for (var t in _)
19261         copy2[t] = _[t].slice();
19262       return new Dispatch(copy2);
19263     },
19264     call: function(type2, that) {
19265       if ((n2 = arguments.length - 2) > 0)
19266         for (var args = new Array(n2), i2 = 0, n2, t; i2 < n2; ++i2)
19267           args[i2] = arguments[i2 + 2];
19268       if (!this._.hasOwnProperty(type2))
19269         throw new Error("unknown type: " + type2);
19270       for (t = this._[type2], i2 = 0, n2 = t.length; i2 < n2; ++i2)
19271         t[i2].value.apply(that, args);
19272     },
19273     apply: function(type2, that, args) {
19274       if (!this._.hasOwnProperty(type2))
19275         throw new Error("unknown type: " + type2);
19276       for (var t = this._[type2], i2 = 0, n2 = t.length; i2 < n2; ++i2)
19277         t[i2].value.apply(that, args);
19278     }
19279   };
19280   function get(type2, name) {
19281     for (var i2 = 0, n2 = type2.length, c; i2 < n2; ++i2) {
19282       if ((c = type2[i2]).name === name) {
19283         return c.value;
19284       }
19285     }
19286   }
19287   function set(type2, name, callback) {
19288     for (var i2 = 0, n2 = type2.length; i2 < n2; ++i2) {
19289       if (type2[i2].name === name) {
19290         type2[i2] = noop2, type2 = type2.slice(0, i2).concat(type2.slice(i2 + 1));
19291         break;
19292       }
19293     }
19294     if (callback != null)
19295       type2.push({ name, value: callback });
19296     return type2;
19297   }
19298   var dispatch_default = dispatch;
19299
19300   // node_modules/d3-selection/src/namespaces.js
19301   var xhtml = "http://www.w3.org/1999/xhtml";
19302   var namespaces_default = {
19303     svg: "http://www.w3.org/2000/svg",
19304     xhtml,
19305     xlink: "http://www.w3.org/1999/xlink",
19306     xml: "http://www.w3.org/XML/1998/namespace",
19307     xmlns: "http://www.w3.org/2000/xmlns/"
19308   };
19309
19310   // node_modules/d3-selection/src/namespace.js
19311   function namespace_default(name) {
19312     var prefix = name += "", i2 = prefix.indexOf(":");
19313     if (i2 >= 0 && (prefix = name.slice(0, i2)) !== "xmlns")
19314       name = name.slice(i2 + 1);
19315     return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name;
19316   }
19317
19318   // node_modules/d3-selection/src/creator.js
19319   function creatorInherit(name) {
19320     return function() {
19321       var document2 = this.ownerDocument, uri = this.namespaceURI;
19322       return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name);
19323     };
19324   }
19325   function creatorFixed(fullname) {
19326     return function() {
19327       return this.ownerDocument.createElementNS(fullname.space, fullname.local);
19328     };
19329   }
19330   function creator_default(name) {
19331     var fullname = namespace_default(name);
19332     return (fullname.local ? creatorFixed : creatorInherit)(fullname);
19333   }
19334
19335   // node_modules/d3-selection/src/selector.js
19336   function none() {
19337   }
19338   function selector_default(selector) {
19339     return selector == null ? none : function() {
19340       return this.querySelector(selector);
19341     };
19342   }
19343
19344   // node_modules/d3-selection/src/selection/select.js
19345   function select_default(select) {
19346     if (typeof select !== "function")
19347       select = selector_default(select);
19348     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
19349       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) {
19350         if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) {
19351           if ("__data__" in node)
19352             subnode.__data__ = node.__data__;
19353           subgroup[i2] = subnode;
19354         }
19355       }
19356     }
19357     return new Selection(subgroups, this._parents);
19358   }
19359
19360   // node_modules/d3-selection/src/array.js
19361   function array(x) {
19362     return x == null ? [] : Array.isArray(x) ? x : Array.from(x);
19363   }
19364
19365   // node_modules/d3-selection/src/selectorAll.js
19366   function empty() {
19367     return [];
19368   }
19369   function selectorAll_default(selector) {
19370     return selector == null ? empty : function() {
19371       return this.querySelectorAll(selector);
19372     };
19373   }
19374
19375   // node_modules/d3-selection/src/selection/selectAll.js
19376   function arrayAll(select) {
19377     return function() {
19378       return array(select.apply(this, arguments));
19379     };
19380   }
19381   function selectAll_default(select) {
19382     if (typeof select === "function")
19383       select = arrayAll(select);
19384     else
19385       select = selectorAll_default(select);
19386     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) {
19387       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
19388         if (node = group[i2]) {
19389           subgroups.push(select.call(node, node.__data__, i2, group));
19390           parents.push(node);
19391         }
19392       }
19393     }
19394     return new Selection(subgroups, parents);
19395   }
19396
19397   // node_modules/d3-selection/src/matcher.js
19398   function matcher_default(selector) {
19399     return function() {
19400       return this.matches(selector);
19401     };
19402   }
19403   function childMatcher(selector) {
19404     return function(node) {
19405       return node.matches(selector);
19406     };
19407   }
19408
19409   // node_modules/d3-selection/src/selection/selectChild.js
19410   var find = Array.prototype.find;
19411   function childFind(match) {
19412     return function() {
19413       return find.call(this.children, match);
19414     };
19415   }
19416   function childFirst() {
19417     return this.firstElementChild;
19418   }
19419   function selectChild_default(match) {
19420     return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
19421   }
19422
19423   // node_modules/d3-selection/src/selection/selectChildren.js
19424   var filter = Array.prototype.filter;
19425   function children() {
19426     return Array.from(this.children);
19427   }
19428   function childrenFilter(match) {
19429     return function() {
19430       return filter.call(this.children, match);
19431     };
19432   }
19433   function selectChildren_default(match) {
19434     return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
19435   }
19436
19437   // node_modules/d3-selection/src/selection/filter.js
19438   function filter_default(match) {
19439     if (typeof match !== "function")
19440       match = matcher_default(match);
19441     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
19442       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) {
19443         if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) {
19444           subgroup.push(node);
19445         }
19446       }
19447     }
19448     return new Selection(subgroups, this._parents);
19449   }
19450
19451   // node_modules/d3-selection/src/selection/sparse.js
19452   function sparse_default(update) {
19453     return new Array(update.length);
19454   }
19455
19456   // node_modules/d3-selection/src/selection/enter.js
19457   function enter_default() {
19458     return new Selection(this._enter || this._groups.map(sparse_default), this._parents);
19459   }
19460   function EnterNode(parent, datum2) {
19461     this.ownerDocument = parent.ownerDocument;
19462     this.namespaceURI = parent.namespaceURI;
19463     this._next = null;
19464     this._parent = parent;
19465     this.__data__ = datum2;
19466   }
19467   EnterNode.prototype = {
19468     constructor: EnterNode,
19469     appendChild: function(child) {
19470       return this._parent.insertBefore(child, this._next);
19471     },
19472     insertBefore: function(child, next) {
19473       return this._parent.insertBefore(child, next);
19474     },
19475     querySelector: function(selector) {
19476       return this._parent.querySelector(selector);
19477     },
19478     querySelectorAll: function(selector) {
19479       return this._parent.querySelectorAll(selector);
19480     }
19481   };
19482
19483   // node_modules/d3-selection/src/constant.js
19484   function constant_default(x) {
19485     return function() {
19486       return x;
19487     };
19488   }
19489
19490   // node_modules/d3-selection/src/selection/data.js
19491   function bindIndex(parent, group, enter, update, exit, data) {
19492     var i2 = 0, node, groupLength = group.length, dataLength = data.length;
19493     for (; i2 < dataLength; ++i2) {
19494       if (node = group[i2]) {
19495         node.__data__ = data[i2];
19496         update[i2] = node;
19497       } else {
19498         enter[i2] = new EnterNode(parent, data[i2]);
19499       }
19500     }
19501     for (; i2 < groupLength; ++i2) {
19502       if (node = group[i2]) {
19503         exit[i2] = node;
19504       }
19505     }
19506   }
19507   function bindKey(parent, group, enter, update, exit, data, key) {
19508     var i2, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue;
19509     for (i2 = 0; i2 < groupLength; ++i2) {
19510       if (node = group[i2]) {
19511         keyValues[i2] = keyValue = key.call(node, node.__data__, i2, group) + "";
19512         if (nodeByKeyValue.has(keyValue)) {
19513           exit[i2] = node;
19514         } else {
19515           nodeByKeyValue.set(keyValue, node);
19516         }
19517       }
19518     }
19519     for (i2 = 0; i2 < dataLength; ++i2) {
19520       keyValue = key.call(parent, data[i2], i2, data) + "";
19521       if (node = nodeByKeyValue.get(keyValue)) {
19522         update[i2] = node;
19523         node.__data__ = data[i2];
19524         nodeByKeyValue.delete(keyValue);
19525       } else {
19526         enter[i2] = new EnterNode(parent, data[i2]);
19527       }
19528     }
19529     for (i2 = 0; i2 < groupLength; ++i2) {
19530       if ((node = group[i2]) && nodeByKeyValue.get(keyValues[i2]) === node) {
19531         exit[i2] = node;
19532       }
19533     }
19534   }
19535   function datum(node) {
19536     return node.__data__;
19537   }
19538   function data_default(value, key) {
19539     if (!arguments.length)
19540       return Array.from(this, datum);
19541     var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups;
19542     if (typeof value !== "function")
19543       value = constant_default(value);
19544     for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j2 = 0; j2 < m; ++j2) {
19545       var parent = parents[j2], group = groups[j2], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j2, parents)), dataLength = data.length, enterGroup = enter[j2] = new Array(dataLength), updateGroup = update[j2] = new Array(dataLength), exitGroup = exit[j2] = new Array(groupLength);
19546       bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
19547       for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
19548         if (previous = enterGroup[i0]) {
19549           if (i0 >= i1)
19550             i1 = i0 + 1;
19551           while (!(next = updateGroup[i1]) && ++i1 < dataLength)
19552             ;
19553           previous._next = next || null;
19554         }
19555       }
19556     }
19557     update = new Selection(update, parents);
19558     update._enter = enter;
19559     update._exit = exit;
19560     return update;
19561   }
19562   function arraylike(data) {
19563     return typeof data === "object" && "length" in data ? data : Array.from(data);
19564   }
19565
19566   // node_modules/d3-selection/src/selection/exit.js
19567   function exit_default() {
19568     return new Selection(this._exit || this._groups.map(sparse_default), this._parents);
19569   }
19570
19571   // node_modules/d3-selection/src/selection/join.js
19572   function join_default(onenter, onupdate, onexit) {
19573     var enter = this.enter(), update = this, exit = this.exit();
19574     if (typeof onenter === "function") {
19575       enter = onenter(enter);
19576       if (enter)
19577         enter = enter.selection();
19578     } else {
19579       enter = enter.append(onenter + "");
19580     }
19581     if (onupdate != null) {
19582       update = onupdate(update);
19583       if (update)
19584         update = update.selection();
19585     }
19586     if (onexit == null)
19587       exit.remove();
19588     else
19589       onexit(exit);
19590     return enter && update ? enter.merge(update).order() : update;
19591   }
19592
19593   // node_modules/d3-selection/src/selection/merge.js
19594   function merge_default(context) {
19595     var selection2 = context.selection ? context.selection() : context;
19596     for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j2 = 0; j2 < m; ++j2) {
19597       for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge3 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
19598         if (node = group0[i2] || group1[i2]) {
19599           merge3[i2] = node;
19600         }
19601       }
19602     }
19603     for (; j2 < m0; ++j2) {
19604       merges[j2] = groups0[j2];
19605     }
19606     return new Selection(merges, this._parents);
19607   }
19608
19609   // node_modules/d3-selection/src/selection/order.js
19610   function order_default() {
19611     for (var groups = this._groups, j2 = -1, m = groups.length; ++j2 < m; ) {
19612       for (var group = groups[j2], i2 = group.length - 1, next = group[i2], node; --i2 >= 0; ) {
19613         if (node = group[i2]) {
19614           if (next && node.compareDocumentPosition(next) ^ 4)
19615             next.parentNode.insertBefore(node, next);
19616           next = node;
19617         }
19618       }
19619     }
19620     return this;
19621   }
19622
19623   // node_modules/d3-selection/src/selection/sort.js
19624   function sort_default(compare) {
19625     if (!compare)
19626       compare = ascending2;
19627     function compareNode(a, b) {
19628       return a && b ? compare(a.__data__, b.__data__) : !a - !b;
19629     }
19630     for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
19631       for (var group = groups[j2], n2 = group.length, sortgroup = sortgroups[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
19632         if (node = group[i2]) {
19633           sortgroup[i2] = node;
19634         }
19635       }
19636       sortgroup.sort(compareNode);
19637     }
19638     return new Selection(sortgroups, this._parents).order();
19639   }
19640   function ascending2(a, b) {
19641     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
19642   }
19643
19644   // node_modules/d3-selection/src/selection/call.js
19645   function call_default() {
19646     var callback = arguments[0];
19647     arguments[0] = this;
19648     callback.apply(null, arguments);
19649     return this;
19650   }
19651
19652   // node_modules/d3-selection/src/selection/nodes.js
19653   function nodes_default() {
19654     return Array.from(this);
19655   }
19656
19657   // node_modules/d3-selection/src/selection/node.js
19658   function node_default() {
19659     for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
19660       for (var group = groups[j2], i2 = 0, n2 = group.length; i2 < n2; ++i2) {
19661         var node = group[i2];
19662         if (node)
19663           return node;
19664       }
19665     }
19666     return null;
19667   }
19668
19669   // node_modules/d3-selection/src/selection/size.js
19670   function size_default() {
19671     let size = 0;
19672     for (const node of this)
19673       ++size;
19674     return size;
19675   }
19676
19677   // node_modules/d3-selection/src/selection/empty.js
19678   function empty_default() {
19679     return !this.node();
19680   }
19681
19682   // node_modules/d3-selection/src/selection/each.js
19683   function each_default(callback) {
19684     for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
19685       for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) {
19686         if (node = group[i2])
19687           callback.call(node, node.__data__, i2, group);
19688       }
19689     }
19690     return this;
19691   }
19692
19693   // node_modules/d3-selection/src/selection/attr.js
19694   function attrRemove(name) {
19695     return function() {
19696       this.removeAttribute(name);
19697     };
19698   }
19699   function attrRemoveNS(fullname) {
19700     return function() {
19701       this.removeAttributeNS(fullname.space, fullname.local);
19702     };
19703   }
19704   function attrConstant(name, value) {
19705     return function() {
19706       this.setAttribute(name, value);
19707     };
19708   }
19709   function attrConstantNS(fullname, value) {
19710     return function() {
19711       this.setAttributeNS(fullname.space, fullname.local, value);
19712     };
19713   }
19714   function attrFunction(name, value) {
19715     return function() {
19716       var v = value.apply(this, arguments);
19717       if (v == null)
19718         this.removeAttribute(name);
19719       else
19720         this.setAttribute(name, v);
19721     };
19722   }
19723   function attrFunctionNS(fullname, value) {
19724     return function() {
19725       var v = value.apply(this, arguments);
19726       if (v == null)
19727         this.removeAttributeNS(fullname.space, fullname.local);
19728       else
19729         this.setAttributeNS(fullname.space, fullname.local, v);
19730     };
19731   }
19732   function attr_default(name, value) {
19733     var fullname = namespace_default(name);
19734     if (arguments.length < 2) {
19735       var node = this.node();
19736       return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
19737     }
19738     return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
19739   }
19740
19741   // node_modules/d3-selection/src/window.js
19742   function window_default(node) {
19743     return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView;
19744   }
19745
19746   // node_modules/d3-selection/src/selection/style.js
19747   function styleRemove(name) {
19748     return function() {
19749       this.style.removeProperty(name);
19750     };
19751   }
19752   function styleConstant(name, value, priority) {
19753     return function() {
19754       this.style.setProperty(name, value, priority);
19755     };
19756   }
19757   function styleFunction(name, value, priority) {
19758     return function() {
19759       var v = value.apply(this, arguments);
19760       if (v == null)
19761         this.style.removeProperty(name);
19762       else
19763         this.style.setProperty(name, v, priority);
19764     };
19765   }
19766   function style_default(name, value, priority) {
19767     return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
19768   }
19769   function styleValue(node, name) {
19770     return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name);
19771   }
19772
19773   // node_modules/d3-selection/src/selection/property.js
19774   function propertyRemove(name) {
19775     return function() {
19776       delete this[name];
19777     };
19778   }
19779   function propertyConstant(name, value) {
19780     return function() {
19781       this[name] = value;
19782     };
19783   }
19784   function propertyFunction(name, value) {
19785     return function() {
19786       var v = value.apply(this, arguments);
19787       if (v == null)
19788         delete this[name];
19789       else
19790         this[name] = v;
19791     };
19792   }
19793   function property_default(name, value) {
19794     return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name];
19795   }
19796
19797   // node_modules/d3-selection/src/selection/classed.js
19798   function classArray(string) {
19799     return string.trim().split(/^|\s+/);
19800   }
19801   function classList(node) {
19802     return node.classList || new ClassList(node);
19803   }
19804   function ClassList(node) {
19805     this._node = node;
19806     this._names = classArray(node.getAttribute("class") || "");
19807   }
19808   ClassList.prototype = {
19809     add: function(name) {
19810       var i2 = this._names.indexOf(name);
19811       if (i2 < 0) {
19812         this._names.push(name);
19813         this._node.setAttribute("class", this._names.join(" "));
19814       }
19815     },
19816     remove: function(name) {
19817       var i2 = this._names.indexOf(name);
19818       if (i2 >= 0) {
19819         this._names.splice(i2, 1);
19820         this._node.setAttribute("class", this._names.join(" "));
19821       }
19822     },
19823     contains: function(name) {
19824       return this._names.indexOf(name) >= 0;
19825     }
19826   };
19827   function classedAdd(node, names) {
19828     var list = classList(node), i2 = -1, n2 = names.length;
19829     while (++i2 < n2)
19830       list.add(names[i2]);
19831   }
19832   function classedRemove(node, names) {
19833     var list = classList(node), i2 = -1, n2 = names.length;
19834     while (++i2 < n2)
19835       list.remove(names[i2]);
19836   }
19837   function classedTrue(names) {
19838     return function() {
19839       classedAdd(this, names);
19840     };
19841   }
19842   function classedFalse(names) {
19843     return function() {
19844       classedRemove(this, names);
19845     };
19846   }
19847   function classedFunction(names, value) {
19848     return function() {
19849       (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
19850     };
19851   }
19852   function classed_default(name, value) {
19853     var names = classArray(name + "");
19854     if (arguments.length < 2) {
19855       var list = classList(this.node()), i2 = -1, n2 = names.length;
19856       while (++i2 < n2)
19857         if (!list.contains(names[i2]))
19858           return false;
19859       return true;
19860     }
19861     return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value));
19862   }
19863
19864   // node_modules/d3-selection/src/selection/text.js
19865   function textRemove() {
19866     this.textContent = "";
19867   }
19868   function textConstant(value) {
19869     return function() {
19870       this.textContent = value;
19871     };
19872   }
19873   function textFunction(value) {
19874     return function() {
19875       var v = value.apply(this, arguments);
19876       this.textContent = v == null ? "" : v;
19877     };
19878   }
19879   function text_default(value) {
19880     return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent;
19881   }
19882
19883   // node_modules/d3-selection/src/selection/html.js
19884   function htmlRemove() {
19885     this.innerHTML = "";
19886   }
19887   function htmlConstant(value) {
19888     return function() {
19889       this.innerHTML = value;
19890     };
19891   }
19892   function htmlFunction(value) {
19893     return function() {
19894       var v = value.apply(this, arguments);
19895       this.innerHTML = v == null ? "" : v;
19896     };
19897   }
19898   function html_default(value) {
19899     return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
19900   }
19901
19902   // node_modules/d3-selection/src/selection/raise.js
19903   function raise() {
19904     if (this.nextSibling)
19905       this.parentNode.appendChild(this);
19906   }
19907   function raise_default() {
19908     return this.each(raise);
19909   }
19910
19911   // node_modules/d3-selection/src/selection/lower.js
19912   function lower() {
19913     if (this.previousSibling)
19914       this.parentNode.insertBefore(this, this.parentNode.firstChild);
19915   }
19916   function lower_default() {
19917     return this.each(lower);
19918   }
19919
19920   // node_modules/d3-selection/src/selection/append.js
19921   function append_default(name) {
19922     var create2 = typeof name === "function" ? name : creator_default(name);
19923     return this.select(function() {
19924       return this.appendChild(create2.apply(this, arguments));
19925     });
19926   }
19927
19928   // node_modules/d3-selection/src/selection/insert.js
19929   function constantNull() {
19930     return null;
19931   }
19932   function insert_default(name, before) {
19933     var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before);
19934     return this.select(function() {
19935       return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null);
19936     });
19937   }
19938
19939   // node_modules/d3-selection/src/selection/remove.js
19940   function remove() {
19941     var parent = this.parentNode;
19942     if (parent)
19943       parent.removeChild(this);
19944   }
19945   function remove_default() {
19946     return this.each(remove);
19947   }
19948
19949   // node_modules/d3-selection/src/selection/clone.js
19950   function selection_cloneShallow() {
19951     var clone = this.cloneNode(false), parent = this.parentNode;
19952     return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
19953   }
19954   function selection_cloneDeep() {
19955     var clone = this.cloneNode(true), parent = this.parentNode;
19956     return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
19957   }
19958   function clone_default(deep) {
19959     return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
19960   }
19961
19962   // node_modules/d3-selection/src/selection/datum.js
19963   function datum_default(value) {
19964     return arguments.length ? this.property("__data__", value) : this.node().__data__;
19965   }
19966
19967   // node_modules/d3-selection/src/selection/on.js
19968   function contextListener(listener) {
19969     return function(event) {
19970       listener.call(this, event, this.__data__);
19971     };
19972   }
19973   function parseTypenames2(typenames) {
19974     return typenames.trim().split(/^|\s+/).map(function(t) {
19975       var name = "", i2 = t.indexOf(".");
19976       if (i2 >= 0)
19977         name = t.slice(i2 + 1), t = t.slice(0, i2);
19978       return { type: t, name };
19979     });
19980   }
19981   function onRemove(typename) {
19982     return function() {
19983       var on = this.__on;
19984       if (!on)
19985         return;
19986       for (var j2 = 0, i2 = -1, m = on.length, o; j2 < m; ++j2) {
19987         if (o = on[j2], (!typename.type || o.type === typename.type) && o.name === typename.name) {
19988           this.removeEventListener(o.type, o.listener, o.options);
19989         } else {
19990           on[++i2] = o;
19991         }
19992       }
19993       if (++i2)
19994         on.length = i2;
19995       else
19996         delete this.__on;
19997     };
19998   }
19999   function onAdd(typename, value, options2) {
20000     return function() {
20001       var on = this.__on, o, listener = contextListener(value);
20002       if (on)
20003         for (var j2 = 0, m = on.length; j2 < m; ++j2) {
20004           if ((o = on[j2]).type === typename.type && o.name === typename.name) {
20005             this.removeEventListener(o.type, o.listener, o.options);
20006             this.addEventListener(o.type, o.listener = listener, o.options = options2);
20007             o.value = value;
20008             return;
20009           }
20010         }
20011       this.addEventListener(typename.type, listener, options2);
20012       o = { type: typename.type, name: typename.name, value, listener, options: options2 };
20013       if (!on)
20014         this.__on = [o];
20015       else
20016         on.push(o);
20017     };
20018   }
20019   function on_default(typename, value, options2) {
20020     var typenames = parseTypenames2(typename + ""), i2, n2 = typenames.length, t;
20021     if (arguments.length < 2) {
20022       var on = this.node().__on;
20023       if (on)
20024         for (var j2 = 0, m = on.length, o; j2 < m; ++j2) {
20025           for (i2 = 0, o = on[j2]; i2 < n2; ++i2) {
20026             if ((t = typenames[i2]).type === o.type && t.name === o.name) {
20027               return o.value;
20028             }
20029           }
20030         }
20031       return;
20032     }
20033     on = value ? onAdd : onRemove;
20034     for (i2 = 0; i2 < n2; ++i2)
20035       this.each(on(typenames[i2], value, options2));
20036     return this;
20037   }
20038
20039   // node_modules/d3-selection/src/selection/dispatch.js
20040   function dispatchEvent(node, type2, params) {
20041     var window2 = window_default(node), event = window2.CustomEvent;
20042     if (typeof event === "function") {
20043       event = new event(type2, params);
20044     } else {
20045       event = window2.document.createEvent("Event");
20046       if (params)
20047         event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail;
20048       else
20049         event.initEvent(type2, false, false);
20050     }
20051     node.dispatchEvent(event);
20052   }
20053   function dispatchConstant(type2, params) {
20054     return function() {
20055       return dispatchEvent(this, type2, params);
20056     };
20057   }
20058   function dispatchFunction(type2, params) {
20059     return function() {
20060       return dispatchEvent(this, type2, params.apply(this, arguments));
20061     };
20062   }
20063   function dispatch_default2(type2, params) {
20064     return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params));
20065   }
20066
20067   // node_modules/d3-selection/src/selection/iterator.js
20068   function* iterator_default() {
20069     for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
20070       for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) {
20071         if (node = group[i2])
20072           yield node;
20073       }
20074     }
20075   }
20076
20077   // node_modules/d3-selection/src/selection/index.js
20078   var root = [null];
20079   function Selection(groups, parents) {
20080     this._groups = groups;
20081     this._parents = parents;
20082   }
20083   function selection() {
20084     return new Selection([[document.documentElement]], root);
20085   }
20086   function selection_selection() {
20087     return this;
20088   }
20089   Selection.prototype = selection.prototype = {
20090     constructor: Selection,
20091     select: select_default,
20092     selectAll: selectAll_default,
20093     selectChild: selectChild_default,
20094     selectChildren: selectChildren_default,
20095     filter: filter_default,
20096     data: data_default,
20097     enter: enter_default,
20098     exit: exit_default,
20099     join: join_default,
20100     merge: merge_default,
20101     selection: selection_selection,
20102     order: order_default,
20103     sort: sort_default,
20104     call: call_default,
20105     nodes: nodes_default,
20106     node: node_default,
20107     size: size_default,
20108     empty: empty_default,
20109     each: each_default,
20110     attr: attr_default,
20111     style: style_default,
20112     property: property_default,
20113     classed: classed_default,
20114     text: text_default,
20115     html: html_default,
20116     raise: raise_default,
20117     lower: lower_default,
20118     append: append_default,
20119     insert: insert_default,
20120     remove: remove_default,
20121     clone: clone_default,
20122     datum: datum_default,
20123     on: on_default,
20124     dispatch: dispatch_default2,
20125     [Symbol.iterator]: iterator_default
20126   };
20127   var selection_default = selection;
20128
20129   // node_modules/d3-selection/src/select.js
20130   function select_default2(selector) {
20131     return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root);
20132   }
20133
20134   // node_modules/d3-selection/src/sourceEvent.js
20135   function sourceEvent_default(event) {
20136     let sourceEvent;
20137     while (sourceEvent = event.sourceEvent)
20138       event = sourceEvent;
20139     return event;
20140   }
20141
20142   // node_modules/d3-selection/src/pointer.js
20143   function pointer_default(event, node) {
20144     event = sourceEvent_default(event);
20145     if (node === void 0)
20146       node = event.currentTarget;
20147     if (node) {
20148       var svg2 = node.ownerSVGElement || node;
20149       if (svg2.createSVGPoint) {
20150         var point2 = svg2.createSVGPoint();
20151         point2.x = event.clientX, point2.y = event.clientY;
20152         point2 = point2.matrixTransform(node.getScreenCTM().inverse());
20153         return [point2.x, point2.y];
20154       }
20155       if (node.getBoundingClientRect) {
20156         var rect = node.getBoundingClientRect();
20157         return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
20158       }
20159     }
20160     return [event.pageX, event.pageY];
20161   }
20162
20163   // node_modules/d3-selection/src/selectAll.js
20164   function selectAll_default2(selector) {
20165     return typeof selector === "string" ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) : new Selection([array(selector)], root);
20166   }
20167
20168   // node_modules/d3-drag/src/noevent.js
20169   var nonpassive = { passive: false };
20170   var nonpassivecapture = { capture: true, passive: false };
20171   function nopropagation(event) {
20172     event.stopImmediatePropagation();
20173   }
20174   function noevent_default(event) {
20175     event.preventDefault();
20176     event.stopImmediatePropagation();
20177   }
20178
20179   // node_modules/d3-drag/src/nodrag.js
20180   function nodrag_default(view) {
20181     var root3 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture);
20182     if ("onselectstart" in root3) {
20183       selection2.on("selectstart.drag", noevent_default, nonpassivecapture);
20184     } else {
20185       root3.__noselect = root3.style.MozUserSelect;
20186       root3.style.MozUserSelect = "none";
20187     }
20188   }
20189   function yesdrag(view, noclick) {
20190     var root3 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null);
20191     if (noclick) {
20192       selection2.on("click.drag", noevent_default, nonpassivecapture);
20193       setTimeout(function() {
20194         selection2.on("click.drag", null);
20195       }, 0);
20196     }
20197     if ("onselectstart" in root3) {
20198       selection2.on("selectstart.drag", null);
20199     } else {
20200       root3.style.MozUserSelect = root3.__noselect;
20201       delete root3.__noselect;
20202     }
20203   }
20204
20205   // node_modules/d3-drag/src/constant.js
20206   var constant_default2 = (x) => () => x;
20207
20208   // node_modules/d3-drag/src/event.js
20209   function DragEvent(type2, {
20210     sourceEvent,
20211     subject,
20212     target,
20213     identifier,
20214     active,
20215     x,
20216     y,
20217     dx,
20218     dy,
20219     dispatch: dispatch10
20220   }) {
20221     Object.defineProperties(this, {
20222       type: { value: type2, enumerable: true, configurable: true },
20223       sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
20224       subject: { value: subject, enumerable: true, configurable: true },
20225       target: { value: target, enumerable: true, configurable: true },
20226       identifier: { value: identifier, enumerable: true, configurable: true },
20227       active: { value: active, enumerable: true, configurable: true },
20228       x: { value: x, enumerable: true, configurable: true },
20229       y: { value: y, enumerable: true, configurable: true },
20230       dx: { value: dx, enumerable: true, configurable: true },
20231       dy: { value: dy, enumerable: true, configurable: true },
20232       _: { value: dispatch10 }
20233     });
20234   }
20235   DragEvent.prototype.on = function() {
20236     var value = this._.on.apply(this._, arguments);
20237     return value === this._ ? this : value;
20238   };
20239
20240   // node_modules/d3-drag/src/drag.js
20241   function defaultFilter(event) {
20242     return !event.ctrlKey && !event.button;
20243   }
20244   function defaultContainer() {
20245     return this.parentNode;
20246   }
20247   function defaultSubject(event, d) {
20248     return d == null ? { x: event.x, y: event.y } : d;
20249   }
20250   function defaultTouchable() {
20251     return navigator.maxTouchPoints || "ontouchstart" in this;
20252   }
20253   function drag_default() {
20254     var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0;
20255     function drag(selection2) {
20256       selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
20257     }
20258     function mousedowned(event, d) {
20259       if (touchending || !filter2.call(this, event, d))
20260         return;
20261       var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
20262       if (!gesture)
20263         return;
20264       select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture);
20265       nodrag_default(event.view);
20266       nopropagation(event);
20267       mousemoving = false;
20268       mousedownx = event.clientX;
20269       mousedowny = event.clientY;
20270       gesture("start", event);
20271     }
20272     function mousemoved(event) {
20273       noevent_default(event);
20274       if (!mousemoving) {
20275         var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
20276         mousemoving = dx * dx + dy * dy > clickDistance2;
20277       }
20278       gestures.mouse("drag", event);
20279     }
20280     function mouseupped(event) {
20281       select_default2(event.view).on("mousemove.drag mouseup.drag", null);
20282       yesdrag(event.view, mousemoving);
20283       noevent_default(event);
20284       gestures.mouse("end", event);
20285     }
20286     function touchstarted(event, d) {
20287       if (!filter2.call(this, event, d))
20288         return;
20289       var touches = event.changedTouches, c = container.call(this, event, d), n2 = touches.length, i2, gesture;
20290       for (i2 = 0; i2 < n2; ++i2) {
20291         if (gesture = beforestart(this, c, event, d, touches[i2].identifier, touches[i2])) {
20292           nopropagation(event);
20293           gesture("start", event, touches[i2]);
20294         }
20295       }
20296     }
20297     function touchmoved(event) {
20298       var touches = event.changedTouches, n2 = touches.length, i2, gesture;
20299       for (i2 = 0; i2 < n2; ++i2) {
20300         if (gesture = gestures[touches[i2].identifier]) {
20301           noevent_default(event);
20302           gesture("drag", event, touches[i2]);
20303         }
20304       }
20305     }
20306     function touchended(event) {
20307       var touches = event.changedTouches, n2 = touches.length, i2, gesture;
20308       if (touchending)
20309         clearTimeout(touchending);
20310       touchending = setTimeout(function() {
20311         touchending = null;
20312       }, 500);
20313       for (i2 = 0; i2 < n2; ++i2) {
20314         if (gesture = gestures[touches[i2].identifier]) {
20315           nopropagation(event);
20316           gesture("end", event, touches[i2]);
20317         }
20318       }
20319     }
20320     function beforestart(that, container2, event, d, identifier, touch) {
20321       var dispatch10 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s;
20322       if ((s = subject.call(that, new DragEvent("beforestart", {
20323         sourceEvent: event,
20324         target: drag,
20325         identifier,
20326         active,
20327         x: p[0],
20328         y: p[1],
20329         dx: 0,
20330         dy: 0,
20331         dispatch: dispatch10
20332       }), d)) == null)
20333         return;
20334       dx = s.x - p[0] || 0;
20335       dy = s.y - p[1] || 0;
20336       return function gesture(type2, event2, touch2) {
20337         var p02 = p, n2;
20338         switch (type2) {
20339           case "start":
20340             gestures[identifier] = gesture, n2 = active++;
20341             break;
20342           case "end":
20343             delete gestures[identifier], --active;
20344           case "drag":
20345             p = pointer_default(touch2 || event2, container2), n2 = active;
20346             break;
20347         }
20348         dispatch10.call(
20349           type2,
20350           that,
20351           new DragEvent(type2, {
20352             sourceEvent: event2,
20353             subject: s,
20354             target: drag,
20355             identifier,
20356             active: n2,
20357             x: p[0] + dx,
20358             y: p[1] + dy,
20359             dx: p[0] - p02[0],
20360             dy: p[1] - p02[1],
20361             dispatch: dispatch10
20362           }),
20363           d
20364         );
20365       };
20366     }
20367     drag.filter = function(_) {
20368       return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2;
20369     };
20370     drag.container = function(_) {
20371       return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container;
20372     };
20373     drag.subject = function(_) {
20374       return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject;
20375     };
20376     drag.touchable = function(_) {
20377       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable;
20378     };
20379     drag.on = function() {
20380       var value = listeners.on.apply(listeners, arguments);
20381       return value === listeners ? drag : value;
20382     };
20383     drag.clickDistance = function(_) {
20384       return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
20385     };
20386     return drag;
20387   }
20388
20389   // node_modules/d3-color/src/define.js
20390   function define_default(constructor, factory, prototype) {
20391     constructor.prototype = factory.prototype = prototype;
20392     prototype.constructor = constructor;
20393   }
20394   function extend(parent, definition) {
20395     var prototype = Object.create(parent.prototype);
20396     for (var key in definition)
20397       prototype[key] = definition[key];
20398     return prototype;
20399   }
20400
20401   // node_modules/d3-color/src/color.js
20402   function Color() {
20403   }
20404   var darker = 0.7;
20405   var brighter = 1 / darker;
20406   var reI = "\\s*([+-]?\\d+)\\s*";
20407   var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*";
20408   var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
20409   var reHex = /^#([0-9a-f]{3,8})$/;
20410   var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`);
20411   var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`);
20412   var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`);
20413   var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`);
20414   var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`);
20415   var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
20416   var named = {
20417     aliceblue: 15792383,
20418     antiquewhite: 16444375,
20419     aqua: 65535,
20420     aquamarine: 8388564,
20421     azure: 15794175,
20422     beige: 16119260,
20423     bisque: 16770244,
20424     black: 0,
20425     blanchedalmond: 16772045,
20426     blue: 255,
20427     blueviolet: 9055202,
20428     brown: 10824234,
20429     burlywood: 14596231,
20430     cadetblue: 6266528,
20431     chartreuse: 8388352,
20432     chocolate: 13789470,
20433     coral: 16744272,
20434     cornflowerblue: 6591981,
20435     cornsilk: 16775388,
20436     crimson: 14423100,
20437     cyan: 65535,
20438     darkblue: 139,
20439     darkcyan: 35723,
20440     darkgoldenrod: 12092939,
20441     darkgray: 11119017,
20442     darkgreen: 25600,
20443     darkgrey: 11119017,
20444     darkkhaki: 12433259,
20445     darkmagenta: 9109643,
20446     darkolivegreen: 5597999,
20447     darkorange: 16747520,
20448     darkorchid: 10040012,
20449     darkred: 9109504,
20450     darksalmon: 15308410,
20451     darkseagreen: 9419919,
20452     darkslateblue: 4734347,
20453     darkslategray: 3100495,
20454     darkslategrey: 3100495,
20455     darkturquoise: 52945,
20456     darkviolet: 9699539,
20457     deeppink: 16716947,
20458     deepskyblue: 49151,
20459     dimgray: 6908265,
20460     dimgrey: 6908265,
20461     dodgerblue: 2003199,
20462     firebrick: 11674146,
20463     floralwhite: 16775920,
20464     forestgreen: 2263842,
20465     fuchsia: 16711935,
20466     gainsboro: 14474460,
20467     ghostwhite: 16316671,
20468     gold: 16766720,
20469     goldenrod: 14329120,
20470     gray: 8421504,
20471     green: 32768,
20472     greenyellow: 11403055,
20473     grey: 8421504,
20474     honeydew: 15794160,
20475     hotpink: 16738740,
20476     indianred: 13458524,
20477     indigo: 4915330,
20478     ivory: 16777200,
20479     khaki: 15787660,
20480     lavender: 15132410,
20481     lavenderblush: 16773365,
20482     lawngreen: 8190976,
20483     lemonchiffon: 16775885,
20484     lightblue: 11393254,
20485     lightcoral: 15761536,
20486     lightcyan: 14745599,
20487     lightgoldenrodyellow: 16448210,
20488     lightgray: 13882323,
20489     lightgreen: 9498256,
20490     lightgrey: 13882323,
20491     lightpink: 16758465,
20492     lightsalmon: 16752762,
20493     lightseagreen: 2142890,
20494     lightskyblue: 8900346,
20495     lightslategray: 7833753,
20496     lightslategrey: 7833753,
20497     lightsteelblue: 11584734,
20498     lightyellow: 16777184,
20499     lime: 65280,
20500     limegreen: 3329330,
20501     linen: 16445670,
20502     magenta: 16711935,
20503     maroon: 8388608,
20504     mediumaquamarine: 6737322,
20505     mediumblue: 205,
20506     mediumorchid: 12211667,
20507     mediumpurple: 9662683,
20508     mediumseagreen: 3978097,
20509     mediumslateblue: 8087790,
20510     mediumspringgreen: 64154,
20511     mediumturquoise: 4772300,
20512     mediumvioletred: 13047173,
20513     midnightblue: 1644912,
20514     mintcream: 16121850,
20515     mistyrose: 16770273,
20516     moccasin: 16770229,
20517     navajowhite: 16768685,
20518     navy: 128,
20519     oldlace: 16643558,
20520     olive: 8421376,
20521     olivedrab: 7048739,
20522     orange: 16753920,
20523     orangered: 16729344,
20524     orchid: 14315734,
20525     palegoldenrod: 15657130,
20526     palegreen: 10025880,
20527     paleturquoise: 11529966,
20528     palevioletred: 14381203,
20529     papayawhip: 16773077,
20530     peachpuff: 16767673,
20531     peru: 13468991,
20532     pink: 16761035,
20533     plum: 14524637,
20534     powderblue: 11591910,
20535     purple: 8388736,
20536     rebeccapurple: 6697881,
20537     red: 16711680,
20538     rosybrown: 12357519,
20539     royalblue: 4286945,
20540     saddlebrown: 9127187,
20541     salmon: 16416882,
20542     sandybrown: 16032864,
20543     seagreen: 3050327,
20544     seashell: 16774638,
20545     sienna: 10506797,
20546     silver: 12632256,
20547     skyblue: 8900331,
20548     slateblue: 6970061,
20549     slategray: 7372944,
20550     slategrey: 7372944,
20551     snow: 16775930,
20552     springgreen: 65407,
20553     steelblue: 4620980,
20554     tan: 13808780,
20555     teal: 32896,
20556     thistle: 14204888,
20557     tomato: 16737095,
20558     turquoise: 4251856,
20559     violet: 15631086,
20560     wheat: 16113331,
20561     white: 16777215,
20562     whitesmoke: 16119285,
20563     yellow: 16776960,
20564     yellowgreen: 10145074
20565   };
20566   define_default(Color, color, {
20567     copy(channels) {
20568       return Object.assign(new this.constructor(), this, channels);
20569     },
20570     displayable() {
20571       return this.rgb().displayable();
20572     },
20573     hex: color_formatHex,
20574     // Deprecated! Use color.formatHex.
20575     formatHex: color_formatHex,
20576     formatHex8: color_formatHex8,
20577     formatHsl: color_formatHsl,
20578     formatRgb: color_formatRgb,
20579     toString: color_formatRgb
20580   });
20581   function color_formatHex() {
20582     return this.rgb().formatHex();
20583   }
20584   function color_formatHex8() {
20585     return this.rgb().formatHex8();
20586   }
20587   function color_formatHsl() {
20588     return hslConvert(this).formatHsl();
20589   }
20590   function color_formatRgb() {
20591     return this.rgb().formatRgb();
20592   }
20593   function color(format2) {
20594     var m, l;
20595     format2 = (format2 + "").trim().toLowerCase();
20596     return (m = reHex.exec(format2)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) : l === 3 ? new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, (m & 15) << 4 | m & 15, 1) : l === 8 ? rgba(m >> 24 & 255, m >> 16 & 255, m >> 8 & 255, (m & 255) / 255) : l === 4 ? rgba(m >> 12 & 15 | m >> 8 & 240, m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, ((m & 15) << 4 | m & 15) / 255) : null) : (m = reRgbInteger.exec(format2)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format2)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) : (m = reRgbaInteger.exec(format2)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format2)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) : (m = reHslPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format2)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null;
20597   }
20598   function rgbn(n2) {
20599     return new Rgb(n2 >> 16 & 255, n2 >> 8 & 255, n2 & 255, 1);
20600   }
20601   function rgba(r, g, b, a) {
20602     if (a <= 0)
20603       r = g = b = NaN;
20604     return new Rgb(r, g, b, a);
20605   }
20606   function rgbConvert(o) {
20607     if (!(o instanceof Color))
20608       o = color(o);
20609     if (!o)
20610       return new Rgb();
20611     o = o.rgb();
20612     return new Rgb(o.r, o.g, o.b, o.opacity);
20613   }
20614   function rgb(r, g, b, opacity) {
20615     return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
20616   }
20617   function Rgb(r, g, b, opacity) {
20618     this.r = +r;
20619     this.g = +g;
20620     this.b = +b;
20621     this.opacity = +opacity;
20622   }
20623   define_default(Rgb, rgb, extend(Color, {
20624     brighter(k) {
20625       k = k == null ? brighter : Math.pow(brighter, k);
20626       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
20627     },
20628     darker(k) {
20629       k = k == null ? darker : Math.pow(darker, k);
20630       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
20631     },
20632     rgb() {
20633       return this;
20634     },
20635     clamp() {
20636       return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
20637     },
20638     displayable() {
20639       return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);
20640     },
20641     hex: rgb_formatHex,
20642     // Deprecated! Use color.formatHex.
20643     formatHex: rgb_formatHex,
20644     formatHex8: rgb_formatHex8,
20645     formatRgb: rgb_formatRgb,
20646     toString: rgb_formatRgb
20647   }));
20648   function rgb_formatHex() {
20649     return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
20650   }
20651   function rgb_formatHex8() {
20652     return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
20653   }
20654   function rgb_formatRgb() {
20655     const a = clampa(this.opacity);
20656     return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;
20657   }
20658   function clampa(opacity) {
20659     return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
20660   }
20661   function clampi(value) {
20662     return Math.max(0, Math.min(255, Math.round(value) || 0));
20663   }
20664   function hex(value) {
20665     value = clampi(value);
20666     return (value < 16 ? "0" : "") + value.toString(16);
20667   }
20668   function hsla(h, s, l, a) {
20669     if (a <= 0)
20670       h = s = l = NaN;
20671     else if (l <= 0 || l >= 1)
20672       h = s = NaN;
20673     else if (s <= 0)
20674       h = NaN;
20675     return new Hsl(h, s, l, a);
20676   }
20677   function hslConvert(o) {
20678     if (o instanceof Hsl)
20679       return new Hsl(o.h, o.s, o.l, o.opacity);
20680     if (!(o instanceof Color))
20681       o = color(o);
20682     if (!o)
20683       return new Hsl();
20684     if (o instanceof Hsl)
20685       return o;
20686     o = o.rgb();
20687     var r = o.r / 255, g = o.g / 255, b = o.b / 255, min3 = Math.min(r, g, b), max3 = Math.max(r, g, b), h = NaN, s = max3 - min3, l = (max3 + min3) / 2;
20688     if (s) {
20689       if (r === max3)
20690         h = (g - b) / s + (g < b) * 6;
20691       else if (g === max3)
20692         h = (b - r) / s + 2;
20693       else
20694         h = (r - g) / s + 4;
20695       s /= l < 0.5 ? max3 + min3 : 2 - max3 - min3;
20696       h *= 60;
20697     } else {
20698       s = l > 0 && l < 1 ? 0 : h;
20699     }
20700     return new Hsl(h, s, l, o.opacity);
20701   }
20702   function hsl(h, s, l, opacity) {
20703     return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
20704   }
20705   function Hsl(h, s, l, opacity) {
20706     this.h = +h;
20707     this.s = +s;
20708     this.l = +l;
20709     this.opacity = +opacity;
20710   }
20711   define_default(Hsl, hsl, extend(Color, {
20712     brighter(k) {
20713       k = k == null ? brighter : Math.pow(brighter, k);
20714       return new Hsl(this.h, this.s, this.l * k, this.opacity);
20715     },
20716     darker(k) {
20717       k = k == null ? darker : Math.pow(darker, k);
20718       return new Hsl(this.h, this.s, this.l * k, this.opacity);
20719     },
20720     rgb() {
20721       var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;
20722       return new Rgb(
20723         hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
20724         hsl2rgb(h, m1, m2),
20725         hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
20726         this.opacity
20727       );
20728     },
20729     clamp() {
20730       return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
20731     },
20732     displayable() {
20733       return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);
20734     },
20735     formatHsl() {
20736       const a = clampa(this.opacity);
20737       return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;
20738     }
20739   }));
20740   function clamph(value) {
20741     value = (value || 0) % 360;
20742     return value < 0 ? value + 360 : value;
20743   }
20744   function clampt(value) {
20745     return Math.max(0, Math.min(1, value || 0));
20746   }
20747   function hsl2rgb(h, m1, m2) {
20748     return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
20749   }
20750
20751   // node_modules/d3-interpolate/src/basis.js
20752   function basis(t1, v0, v1, v2, v3) {
20753     var t2 = t1 * t1, t3 = t2 * t1;
20754     return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;
20755   }
20756   function basis_default(values) {
20757     var n2 = values.length - 1;
20758     return function(t) {
20759       var i2 = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n2 - 1) : Math.floor(t * n2), v1 = values[i2], v2 = values[i2 + 1], v0 = i2 > 0 ? values[i2 - 1] : 2 * v1 - v2, v3 = i2 < n2 - 1 ? values[i2 + 2] : 2 * v2 - v1;
20760       return basis((t - i2 / n2) * n2, v0, v1, v2, v3);
20761     };
20762   }
20763
20764   // node_modules/d3-interpolate/src/basisClosed.js
20765   function basisClosed_default(values) {
20766     var n2 = values.length;
20767     return function(t) {
20768       var i2 = Math.floor(((t %= 1) < 0 ? ++t : t) * n2), v0 = values[(i2 + n2 - 1) % n2], v1 = values[i2 % n2], v2 = values[(i2 + 1) % n2], v3 = values[(i2 + 2) % n2];
20769       return basis((t - i2 / n2) * n2, v0, v1, v2, v3);
20770     };
20771   }
20772
20773   // node_modules/d3-interpolate/src/constant.js
20774   var constant_default3 = (x) => () => x;
20775
20776   // node_modules/d3-interpolate/src/color.js
20777   function linear(a, d) {
20778     return function(t) {
20779       return a + t * d;
20780     };
20781   }
20782   function exponential(a, b, y) {
20783     return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
20784       return Math.pow(a + t * b, y);
20785     };
20786   }
20787   function gamma(y) {
20788     return (y = +y) === 1 ? nogamma : function(a, b) {
20789       return b - a ? exponential(a, b, y) : constant_default3(isNaN(a) ? b : a);
20790     };
20791   }
20792   function nogamma(a, b) {
20793     var d = b - a;
20794     return d ? linear(a, d) : constant_default3(isNaN(a) ? b : a);
20795   }
20796
20797   // node_modules/d3-interpolate/src/rgb.js
20798   var rgb_default = function rgbGamma(y) {
20799     var color2 = gamma(y);
20800     function rgb2(start2, end) {
20801       var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity);
20802       return function(t) {
20803         start2.r = r(t);
20804         start2.g = g(t);
20805         start2.b = b(t);
20806         start2.opacity = opacity(t);
20807         return start2 + "";
20808       };
20809     }
20810     rgb2.gamma = rgbGamma;
20811     return rgb2;
20812   }(1);
20813   function rgbSpline(spline) {
20814     return function(colors) {
20815       var n2 = colors.length, r = new Array(n2), g = new Array(n2), b = new Array(n2), i2, color2;
20816       for (i2 = 0; i2 < n2; ++i2) {
20817         color2 = rgb(colors[i2]);
20818         r[i2] = color2.r || 0;
20819         g[i2] = color2.g || 0;
20820         b[i2] = color2.b || 0;
20821       }
20822       r = spline(r);
20823       g = spline(g);
20824       b = spline(b);
20825       color2.opacity = 1;
20826       return function(t) {
20827         color2.r = r(t);
20828         color2.g = g(t);
20829         color2.b = b(t);
20830         return color2 + "";
20831       };
20832     };
20833   }
20834   var rgbBasis = rgbSpline(basis_default);
20835   var rgbBasisClosed = rgbSpline(basisClosed_default);
20836
20837   // node_modules/d3-interpolate/src/numberArray.js
20838   function numberArray_default(a, b) {
20839     if (!b)
20840       b = [];
20841     var n2 = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i2;
20842     return function(t) {
20843       for (i2 = 0; i2 < n2; ++i2)
20844         c[i2] = a[i2] * (1 - t) + b[i2] * t;
20845       return c;
20846     };
20847   }
20848   function isNumberArray(x) {
20849     return ArrayBuffer.isView(x) && !(x instanceof DataView);
20850   }
20851
20852   // node_modules/d3-interpolate/src/array.js
20853   function genericArray(a, b) {
20854     var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i2;
20855     for (i2 = 0; i2 < na; ++i2)
20856       x[i2] = value_default(a[i2], b[i2]);
20857     for (; i2 < nb; ++i2)
20858       c[i2] = b[i2];
20859     return function(t) {
20860       for (i2 = 0; i2 < na; ++i2)
20861         c[i2] = x[i2](t);
20862       return c;
20863     };
20864   }
20865
20866   // node_modules/d3-interpolate/src/date.js
20867   function date_default(a, b) {
20868     var d = new Date();
20869     return a = +a, b = +b, function(t) {
20870       return d.setTime(a * (1 - t) + b * t), d;
20871     };
20872   }
20873
20874   // node_modules/d3-interpolate/src/number.js
20875   function number_default(a, b) {
20876     return a = +a, b = +b, function(t) {
20877       return a * (1 - t) + b * t;
20878     };
20879   }
20880
20881   // node_modules/d3-interpolate/src/object.js
20882   function object_default(a, b) {
20883     var i2 = {}, c = {}, k;
20884     if (a === null || typeof a !== "object")
20885       a = {};
20886     if (b === null || typeof b !== "object")
20887       b = {};
20888     for (k in b) {
20889       if (k in a) {
20890         i2[k] = value_default(a[k], b[k]);
20891       } else {
20892         c[k] = b[k];
20893       }
20894     }
20895     return function(t) {
20896       for (k in i2)
20897         c[k] = i2[k](t);
20898       return c;
20899     };
20900   }
20901
20902   // node_modules/d3-interpolate/src/string.js
20903   var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
20904   var reB = new RegExp(reA.source, "g");
20905   function zero2(b) {
20906     return function() {
20907       return b;
20908     };
20909   }
20910   function one(b) {
20911     return function(t) {
20912       return b(t) + "";
20913     };
20914   }
20915   function string_default(a, b) {
20916     var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i2 = -1, s = [], q = [];
20917     a = a + "", b = b + "";
20918     while ((am = reA.exec(a)) && (bm = reB.exec(b))) {
20919       if ((bs = bm.index) > bi) {
20920         bs = b.slice(bi, bs);
20921         if (s[i2])
20922           s[i2] += bs;
20923         else
20924           s[++i2] = bs;
20925       }
20926       if ((am = am[0]) === (bm = bm[0])) {
20927         if (s[i2])
20928           s[i2] += bm;
20929         else
20930           s[++i2] = bm;
20931       } else {
20932         s[++i2] = null;
20933         q.push({ i: i2, x: number_default(am, bm) });
20934       }
20935       bi = reB.lastIndex;
20936     }
20937     if (bi < b.length) {
20938       bs = b.slice(bi);
20939       if (s[i2])
20940         s[i2] += bs;
20941       else
20942         s[++i2] = bs;
20943     }
20944     return s.length < 2 ? q[0] ? one(q[0].x) : zero2(b) : (b = q.length, function(t) {
20945       for (var i3 = 0, o; i3 < b; ++i3)
20946         s[(o = q[i3]).i] = o.x(t);
20947       return s.join("");
20948     });
20949   }
20950
20951   // node_modules/d3-interpolate/src/value.js
20952   function value_default(a, b) {
20953     var t = typeof b, c;
20954     return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default : t === "string" ? (c = color(b)) ? (b = c, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a, b);
20955   }
20956
20957   // node_modules/d3-interpolate/src/round.js
20958   function round_default(a, b) {
20959     return a = +a, b = +b, function(t) {
20960       return Math.round(a * (1 - t) + b * t);
20961     };
20962   }
20963
20964   // node_modules/d3-interpolate/src/transform/decompose.js
20965   var degrees2 = 180 / Math.PI;
20966   var identity = {
20967     translateX: 0,
20968     translateY: 0,
20969     rotate: 0,
20970     skewX: 0,
20971     scaleX: 1,
20972     scaleY: 1
20973   };
20974   function decompose_default(a, b, c, d, e, f2) {
20975     var scaleX, scaleY, skewX;
20976     if (scaleX = Math.sqrt(a * a + b * b))
20977       a /= scaleX, b /= scaleX;
20978     if (skewX = a * c + b * d)
20979       c -= a * skewX, d -= b * skewX;
20980     if (scaleY = Math.sqrt(c * c + d * d))
20981       c /= scaleY, d /= scaleY, skewX /= scaleY;
20982     if (a * d < b * c)
20983       a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
20984     return {
20985       translateX: e,
20986       translateY: f2,
20987       rotate: Math.atan2(b, a) * degrees2,
20988       skewX: Math.atan(skewX) * degrees2,
20989       scaleX,
20990       scaleY
20991     };
20992   }
20993
20994   // node_modules/d3-interpolate/src/transform/parse.js
20995   var svgNode;
20996   function parseCss(value) {
20997     const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
20998     return m.isIdentity ? identity : decompose_default(m.a, m.b, m.c, m.d, m.e, m.f);
20999   }
21000   function parseSvg(value) {
21001     if (value == null)
21002       return identity;
21003     if (!svgNode)
21004       svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
21005     svgNode.setAttribute("transform", value);
21006     if (!(value = svgNode.transform.baseVal.consolidate()))
21007       return identity;
21008     value = value.matrix;
21009     return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f);
21010   }
21011
21012   // node_modules/d3-interpolate/src/transform/index.js
21013   function interpolateTransform(parse, pxComma, pxParen, degParen) {
21014     function pop(s) {
21015       return s.length ? s.pop() + " " : "";
21016     }
21017     function translate(xa, ya, xb, yb, s, q) {
21018       if (xa !== xb || ya !== yb) {
21019         var i2 = s.push("translate(", null, pxComma, null, pxParen);
21020         q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) });
21021       } else if (xb || yb) {
21022         s.push("translate(" + xb + pxComma + yb + pxParen);
21023       }
21024     }
21025     function rotate(a, b, s, q) {
21026       if (a !== b) {
21027         if (a - b > 180)
21028           b += 360;
21029         else if (b - a > 180)
21030           a += 360;
21031         q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a, b) });
21032       } else if (b) {
21033         s.push(pop(s) + "rotate(" + b + degParen);
21034       }
21035     }
21036     function skewX(a, b, s, q) {
21037       if (a !== b) {
21038         q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a, b) });
21039       } else if (b) {
21040         s.push(pop(s) + "skewX(" + b + degParen);
21041       }
21042     }
21043     function scale(xa, ya, xb, yb, s, q) {
21044       if (xa !== xb || ya !== yb) {
21045         var i2 = s.push(pop(s) + "scale(", null, ",", null, ")");
21046         q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) });
21047       } else if (xb !== 1 || yb !== 1) {
21048         s.push(pop(s) + "scale(" + xb + "," + yb + ")");
21049       }
21050     }
21051     return function(a, b) {
21052       var s = [], q = [];
21053       a = parse(a), b = parse(b);
21054       translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
21055       rotate(a.rotate, b.rotate, s, q);
21056       skewX(a.skewX, b.skewX, s, q);
21057       scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
21058       a = b = null;
21059       return function(t) {
21060         var i2 = -1, n2 = q.length, o;
21061         while (++i2 < n2)
21062           s[(o = q[i2]).i] = o.x(t);
21063         return s.join("");
21064       };
21065     };
21066   }
21067   var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
21068   var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
21069
21070   // node_modules/d3-interpolate/src/zoom.js
21071   var epsilon22 = 1e-12;
21072   function cosh(x) {
21073     return ((x = Math.exp(x)) + 1 / x) / 2;
21074   }
21075   function sinh(x) {
21076     return ((x = Math.exp(x)) - 1 / x) / 2;
21077   }
21078   function tanh(x) {
21079     return ((x = Math.exp(2 * x)) - 1) / (x + 1);
21080   }
21081   var zoom_default = function zoomRho(rho, rho2, rho4) {
21082     function zoom(p02, p1) {
21083       var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i2, S;
21084       if (d2 < epsilon22) {
21085         S = Math.log(w1 / w0) / rho;
21086         i2 = function(t) {
21087           return [
21088             ux0 + t * dx,
21089             uy0 + t * dy,
21090             w0 * Math.exp(rho * t * S)
21091           ];
21092         };
21093       } else {
21094         var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
21095         S = (r1 - r0) / rho;
21096         i2 = function(t) {
21097           var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
21098           return [
21099             ux0 + u * dx,
21100             uy0 + u * dy,
21101             w0 * coshr0 / cosh(rho * s + r0)
21102           ];
21103         };
21104       }
21105       i2.duration = S * 1e3 * rho / Math.SQRT2;
21106       return i2;
21107     }
21108     zoom.rho = function(_) {
21109       var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;
21110       return zoomRho(_1, _2, _4);
21111     };
21112     return zoom;
21113   }(Math.SQRT2, 2, 4);
21114
21115   // node_modules/d3-interpolate/src/quantize.js
21116   function quantize_default(interpolator, n2) {
21117     var samples = new Array(n2);
21118     for (var i2 = 0; i2 < n2; ++i2)
21119       samples[i2] = interpolator(i2 / (n2 - 1));
21120     return samples;
21121   }
21122
21123   // node_modules/d3-timer/src/timer.js
21124   var frame = 0;
21125   var timeout = 0;
21126   var interval = 0;
21127   var pokeDelay = 1e3;
21128   var taskHead;
21129   var taskTail;
21130   var clockLast = 0;
21131   var clockNow = 0;
21132   var clockSkew = 0;
21133   var clock = typeof performance === "object" && performance.now ? performance : Date;
21134   var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f2) {
21135     setTimeout(f2, 17);
21136   };
21137   function now() {
21138     return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
21139   }
21140   function clearNow() {
21141     clockNow = 0;
21142   }
21143   function Timer() {
21144     this._call = this._time = this._next = null;
21145   }
21146   Timer.prototype = timer.prototype = {
21147     constructor: Timer,
21148     restart: function(callback, delay, time) {
21149       if (typeof callback !== "function")
21150         throw new TypeError("callback is not a function");
21151       time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
21152       if (!this._next && taskTail !== this) {
21153         if (taskTail)
21154           taskTail._next = this;
21155         else
21156           taskHead = this;
21157         taskTail = this;
21158       }
21159       this._call = callback;
21160       this._time = time;
21161       sleep();
21162     },
21163     stop: function() {
21164       if (this._call) {
21165         this._call = null;
21166         this._time = Infinity;
21167         sleep();
21168       }
21169     }
21170   };
21171   function timer(callback, delay, time) {
21172     var t = new Timer();
21173     t.restart(callback, delay, time);
21174     return t;
21175   }
21176   function timerFlush() {
21177     now();
21178     ++frame;
21179     var t = taskHead, e;
21180     while (t) {
21181       if ((e = clockNow - t._time) >= 0)
21182         t._call.call(void 0, e);
21183       t = t._next;
21184     }
21185     --frame;
21186   }
21187   function wake() {
21188     clockNow = (clockLast = clock.now()) + clockSkew;
21189     frame = timeout = 0;
21190     try {
21191       timerFlush();
21192     } finally {
21193       frame = 0;
21194       nap();
21195       clockNow = 0;
21196     }
21197   }
21198   function poke() {
21199     var now3 = clock.now(), delay = now3 - clockLast;
21200     if (delay > pokeDelay)
21201       clockSkew -= delay, clockLast = now3;
21202   }
21203   function nap() {
21204     var t0, t1 = taskHead, t2, time = Infinity;
21205     while (t1) {
21206       if (t1._call) {
21207         if (time > t1._time)
21208           time = t1._time;
21209         t0 = t1, t1 = t1._next;
21210       } else {
21211         t2 = t1._next, t1._next = null;
21212         t1 = t0 ? t0._next = t2 : taskHead = t2;
21213       }
21214     }
21215     taskTail = t0;
21216     sleep(time);
21217   }
21218   function sleep(time) {
21219     if (frame)
21220       return;
21221     if (timeout)
21222       timeout = clearTimeout(timeout);
21223     var delay = time - clockNow;
21224     if (delay > 24) {
21225       if (time < Infinity)
21226         timeout = setTimeout(wake, time - clock.now() - clockSkew);
21227       if (interval)
21228         interval = clearInterval(interval);
21229     } else {
21230       if (!interval)
21231         clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
21232       frame = 1, setFrame(wake);
21233     }
21234   }
21235
21236   // node_modules/d3-timer/src/timeout.js
21237   function timeout_default(callback, delay, time) {
21238     var t = new Timer();
21239     delay = delay == null ? 0 : +delay;
21240     t.restart((elapsed) => {
21241       t.stop();
21242       callback(elapsed + delay);
21243     }, delay, time);
21244     return t;
21245   }
21246
21247   // node_modules/d3-transition/src/transition/schedule.js
21248   var emptyOn = dispatch_default("start", "end", "cancel", "interrupt");
21249   var emptyTween = [];
21250   var CREATED = 0;
21251   var SCHEDULED = 1;
21252   var STARTING = 2;
21253   var STARTED = 3;
21254   var RUNNING = 4;
21255   var ENDING = 5;
21256   var ENDED = 6;
21257   function schedule_default(node, name, id2, index, group, timing) {
21258     var schedules = node.__transition;
21259     if (!schedules)
21260       node.__transition = {};
21261     else if (id2 in schedules)
21262       return;
21263     create(node, id2, {
21264       name,
21265       index,
21266       // For context during callback.
21267       group,
21268       // For context during callback.
21269       on: emptyOn,
21270       tween: emptyTween,
21271       time: timing.time,
21272       delay: timing.delay,
21273       duration: timing.duration,
21274       ease: timing.ease,
21275       timer: null,
21276       state: CREATED
21277     });
21278   }
21279   function init(node, id2) {
21280     var schedule = get2(node, id2);
21281     if (schedule.state > CREATED)
21282       throw new Error("too late; already scheduled");
21283     return schedule;
21284   }
21285   function set2(node, id2) {
21286     var schedule = get2(node, id2);
21287     if (schedule.state > STARTED)
21288       throw new Error("too late; already running");
21289     return schedule;
21290   }
21291   function get2(node, id2) {
21292     var schedule = node.__transition;
21293     if (!schedule || !(schedule = schedule[id2]))
21294       throw new Error("transition not found");
21295     return schedule;
21296   }
21297   function create(node, id2, self2) {
21298     var schedules = node.__transition, tween;
21299     schedules[id2] = self2;
21300     self2.timer = timer(schedule, 0, self2.time);
21301     function schedule(elapsed) {
21302       self2.state = SCHEDULED;
21303       self2.timer.restart(start2, self2.delay, self2.time);
21304       if (self2.delay <= elapsed)
21305         start2(elapsed - self2.delay);
21306     }
21307     function start2(elapsed) {
21308       var i2, j2, n2, o;
21309       if (self2.state !== SCHEDULED)
21310         return stop();
21311       for (i2 in schedules) {
21312         o = schedules[i2];
21313         if (o.name !== self2.name)
21314           continue;
21315         if (o.state === STARTED)
21316           return timeout_default(start2);
21317         if (o.state === RUNNING) {
21318           o.state = ENDED;
21319           o.timer.stop();
21320           o.on.call("interrupt", node, node.__data__, o.index, o.group);
21321           delete schedules[i2];
21322         } else if (+i2 < id2) {
21323           o.state = ENDED;
21324           o.timer.stop();
21325           o.on.call("cancel", node, node.__data__, o.index, o.group);
21326           delete schedules[i2];
21327         }
21328       }
21329       timeout_default(function() {
21330         if (self2.state === STARTED) {
21331           self2.state = RUNNING;
21332           self2.timer.restart(tick, self2.delay, self2.time);
21333           tick(elapsed);
21334         }
21335       });
21336       self2.state = STARTING;
21337       self2.on.call("start", node, node.__data__, self2.index, self2.group);
21338       if (self2.state !== STARTING)
21339         return;
21340       self2.state = STARTED;
21341       tween = new Array(n2 = self2.tween.length);
21342       for (i2 = 0, j2 = -1; i2 < n2; ++i2) {
21343         if (o = self2.tween[i2].value.call(node, node.__data__, self2.index, self2.group)) {
21344           tween[++j2] = o;
21345         }
21346       }
21347       tween.length = j2 + 1;
21348     }
21349     function tick(elapsed) {
21350       var t = elapsed < self2.duration ? self2.ease.call(null, elapsed / self2.duration) : (self2.timer.restart(stop), self2.state = ENDING, 1), i2 = -1, n2 = tween.length;
21351       while (++i2 < n2) {
21352         tween[i2].call(node, t);
21353       }
21354       if (self2.state === ENDING) {
21355         self2.on.call("end", node, node.__data__, self2.index, self2.group);
21356         stop();
21357       }
21358     }
21359     function stop() {
21360       self2.state = ENDED;
21361       self2.timer.stop();
21362       delete schedules[id2];
21363       for (var i2 in schedules)
21364         return;
21365       delete node.__transition;
21366     }
21367   }
21368
21369   // node_modules/d3-transition/src/interrupt.js
21370   function interrupt_default(node, name) {
21371     var schedules = node.__transition, schedule, active, empty2 = true, i2;
21372     if (!schedules)
21373       return;
21374     name = name == null ? null : name + "";
21375     for (i2 in schedules) {
21376       if ((schedule = schedules[i2]).name !== name) {
21377         empty2 = false;
21378         continue;
21379       }
21380       active = schedule.state > STARTING && schedule.state < ENDING;
21381       schedule.state = ENDED;
21382       schedule.timer.stop();
21383       schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
21384       delete schedules[i2];
21385     }
21386     if (empty2)
21387       delete node.__transition;
21388   }
21389
21390   // node_modules/d3-transition/src/selection/interrupt.js
21391   function interrupt_default2(name) {
21392     return this.each(function() {
21393       interrupt_default(this, name);
21394     });
21395   }
21396
21397   // node_modules/d3-transition/src/transition/tween.js
21398   function tweenRemove(id2, name) {
21399     var tween0, tween1;
21400     return function() {
21401       var schedule = set2(this, id2), tween = schedule.tween;
21402       if (tween !== tween0) {
21403         tween1 = tween0 = tween;
21404         for (var i2 = 0, n2 = tween1.length; i2 < n2; ++i2) {
21405           if (tween1[i2].name === name) {
21406             tween1 = tween1.slice();
21407             tween1.splice(i2, 1);
21408             break;
21409           }
21410         }
21411       }
21412       schedule.tween = tween1;
21413     };
21414   }
21415   function tweenFunction(id2, name, value) {
21416     var tween0, tween1;
21417     if (typeof value !== "function")
21418       throw new Error();
21419     return function() {
21420       var schedule = set2(this, id2), tween = schedule.tween;
21421       if (tween !== tween0) {
21422         tween1 = (tween0 = tween).slice();
21423         for (var t = { name, value }, i2 = 0, n2 = tween1.length; i2 < n2; ++i2) {
21424           if (tween1[i2].name === name) {
21425             tween1[i2] = t;
21426             break;
21427           }
21428         }
21429         if (i2 === n2)
21430           tween1.push(t);
21431       }
21432       schedule.tween = tween1;
21433     };
21434   }
21435   function tween_default(name, value) {
21436     var id2 = this._id;
21437     name += "";
21438     if (arguments.length < 2) {
21439       var tween = get2(this.node(), id2).tween;
21440       for (var i2 = 0, n2 = tween.length, t; i2 < n2; ++i2) {
21441         if ((t = tween[i2]).name === name) {
21442           return t.value;
21443         }
21444       }
21445       return null;
21446     }
21447     return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value));
21448   }
21449   function tweenValue(transition2, name, value) {
21450     var id2 = transition2._id;
21451     transition2.each(function() {
21452       var schedule = set2(this, id2);
21453       (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
21454     });
21455     return function(node) {
21456       return get2(node, id2).value[name];
21457     };
21458   }
21459
21460   // node_modules/d3-transition/src/transition/interpolate.js
21461   function interpolate_default(a, b) {
21462     var c;
21463     return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c = color(b)) ? (b = c, rgb_default) : string_default)(a, b);
21464   }
21465
21466   // node_modules/d3-transition/src/transition/attr.js
21467   function attrRemove2(name) {
21468     return function() {
21469       this.removeAttribute(name);
21470     };
21471   }
21472   function attrRemoveNS2(fullname) {
21473     return function() {
21474       this.removeAttributeNS(fullname.space, fullname.local);
21475     };
21476   }
21477   function attrConstant2(name, interpolate, value1) {
21478     var string00, string1 = value1 + "", interpolate0;
21479     return function() {
21480       var string0 = this.getAttribute(name);
21481       return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
21482     };
21483   }
21484   function attrConstantNS2(fullname, interpolate, value1) {
21485     var string00, string1 = value1 + "", interpolate0;
21486     return function() {
21487       var string0 = this.getAttributeNS(fullname.space, fullname.local);
21488       return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
21489     };
21490   }
21491   function attrFunction2(name, interpolate, value) {
21492     var string00, string10, interpolate0;
21493     return function() {
21494       var string0, value1 = value(this), string1;
21495       if (value1 == null)
21496         return void this.removeAttribute(name);
21497       string0 = this.getAttribute(name);
21498       string1 = value1 + "";
21499       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
21500     };
21501   }
21502   function attrFunctionNS2(fullname, interpolate, value) {
21503     var string00, string10, interpolate0;
21504     return function() {
21505       var string0, value1 = value(this), string1;
21506       if (value1 == null)
21507         return void this.removeAttributeNS(fullname.space, fullname.local);
21508       string0 = this.getAttributeNS(fullname.space, fullname.local);
21509       string1 = value1 + "";
21510       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
21511     };
21512   }
21513   function attr_default2(name, value) {
21514     var fullname = namespace_default(name), i2 = fullname === "transform" ? interpolateTransformSvg : interpolate_default;
21515     return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i2, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i2, value));
21516   }
21517
21518   // node_modules/d3-transition/src/transition/attrTween.js
21519   function attrInterpolate(name, i2) {
21520     return function(t) {
21521       this.setAttribute(name, i2.call(this, t));
21522     };
21523   }
21524   function attrInterpolateNS(fullname, i2) {
21525     return function(t) {
21526       this.setAttributeNS(fullname.space, fullname.local, i2.call(this, t));
21527     };
21528   }
21529   function attrTweenNS(fullname, value) {
21530     var t0, i0;
21531     function tween() {
21532       var i2 = value.apply(this, arguments);
21533       if (i2 !== i0)
21534         t0 = (i0 = i2) && attrInterpolateNS(fullname, i2);
21535       return t0;
21536     }
21537     tween._value = value;
21538     return tween;
21539   }
21540   function attrTween(name, value) {
21541     var t0, i0;
21542     function tween() {
21543       var i2 = value.apply(this, arguments);
21544       if (i2 !== i0)
21545         t0 = (i0 = i2) && attrInterpolate(name, i2);
21546       return t0;
21547     }
21548     tween._value = value;
21549     return tween;
21550   }
21551   function attrTween_default(name, value) {
21552     var key = "attr." + name;
21553     if (arguments.length < 2)
21554       return (key = this.tween(key)) && key._value;
21555     if (value == null)
21556       return this.tween(key, null);
21557     if (typeof value !== "function")
21558       throw new Error();
21559     var fullname = namespace_default(name);
21560     return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
21561   }
21562
21563   // node_modules/d3-transition/src/transition/delay.js
21564   function delayFunction(id2, value) {
21565     return function() {
21566       init(this, id2).delay = +value.apply(this, arguments);
21567     };
21568   }
21569   function delayConstant(id2, value) {
21570     return value = +value, function() {
21571       init(this, id2).delay = value;
21572     };
21573   }
21574   function delay_default(value) {
21575     var id2 = this._id;
21576     return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay;
21577   }
21578
21579   // node_modules/d3-transition/src/transition/duration.js
21580   function durationFunction(id2, value) {
21581     return function() {
21582       set2(this, id2).duration = +value.apply(this, arguments);
21583     };
21584   }
21585   function durationConstant(id2, value) {
21586     return value = +value, function() {
21587       set2(this, id2).duration = value;
21588     };
21589   }
21590   function duration_default(value) {
21591     var id2 = this._id;
21592     return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration;
21593   }
21594
21595   // node_modules/d3-transition/src/transition/ease.js
21596   function easeConstant(id2, value) {
21597     if (typeof value !== "function")
21598       throw new Error();
21599     return function() {
21600       set2(this, id2).ease = value;
21601     };
21602   }
21603   function ease_default(value) {
21604     var id2 = this._id;
21605     return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease;
21606   }
21607
21608   // node_modules/d3-transition/src/transition/easeVarying.js
21609   function easeVarying(id2, value) {
21610     return function() {
21611       var v = value.apply(this, arguments);
21612       if (typeof v !== "function")
21613         throw new Error();
21614       set2(this, id2).ease = v;
21615     };
21616   }
21617   function easeVarying_default(value) {
21618     if (typeof value !== "function")
21619       throw new Error();
21620     return this.each(easeVarying(this._id, value));
21621   }
21622
21623   // node_modules/d3-transition/src/transition/filter.js
21624   function filter_default2(match) {
21625     if (typeof match !== "function")
21626       match = matcher_default(match);
21627     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
21628       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) {
21629         if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) {
21630           subgroup.push(node);
21631         }
21632       }
21633     }
21634     return new Transition(subgroups, this._parents, this._name, this._id);
21635   }
21636
21637   // node_modules/d3-transition/src/transition/merge.js
21638   function merge_default2(transition2) {
21639     if (transition2._id !== this._id)
21640       throw new Error();
21641     for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j2 = 0; j2 < m; ++j2) {
21642       for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge3 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
21643         if (node = group0[i2] || group1[i2]) {
21644           merge3[i2] = node;
21645         }
21646       }
21647     }
21648     for (; j2 < m0; ++j2) {
21649       merges[j2] = groups0[j2];
21650     }
21651     return new Transition(merges, this._parents, this._name, this._id);
21652   }
21653
21654   // node_modules/d3-transition/src/transition/on.js
21655   function start(name) {
21656     return (name + "").trim().split(/^|\s+/).every(function(t) {
21657       var i2 = t.indexOf(".");
21658       if (i2 >= 0)
21659         t = t.slice(0, i2);
21660       return !t || t === "start";
21661     });
21662   }
21663   function onFunction(id2, name, listener) {
21664     var on0, on1, sit = start(name) ? init : set2;
21665     return function() {
21666       var schedule = sit(this, id2), on = schedule.on;
21667       if (on !== on0)
21668         (on1 = (on0 = on).copy()).on(name, listener);
21669       schedule.on = on1;
21670     };
21671   }
21672   function on_default2(name, listener) {
21673     var id2 = this._id;
21674     return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener));
21675   }
21676
21677   // node_modules/d3-transition/src/transition/remove.js
21678   function removeFunction(id2) {
21679     return function() {
21680       var parent = this.parentNode;
21681       for (var i2 in this.__transition)
21682         if (+i2 !== id2)
21683           return;
21684       if (parent)
21685         parent.removeChild(this);
21686     };
21687   }
21688   function remove_default2() {
21689     return this.on("end.remove", removeFunction(this._id));
21690   }
21691
21692   // node_modules/d3-transition/src/transition/select.js
21693   function select_default3(select) {
21694     var name = this._name, id2 = this._id;
21695     if (typeof select !== "function")
21696       select = selector_default(select);
21697     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
21698       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) {
21699         if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) {
21700           if ("__data__" in node)
21701             subnode.__data__ = node.__data__;
21702           subgroup[i2] = subnode;
21703           schedule_default(subgroup[i2], name, id2, i2, subgroup, get2(node, id2));
21704         }
21705       }
21706     }
21707     return new Transition(subgroups, this._parents, name, id2);
21708   }
21709
21710   // node_modules/d3-transition/src/transition/selectAll.js
21711   function selectAll_default3(select) {
21712     var name = this._name, id2 = this._id;
21713     if (typeof select !== "function")
21714       select = selectorAll_default(select);
21715     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) {
21716       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
21717         if (node = group[i2]) {
21718           for (var children2 = select.call(node, node.__data__, i2, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) {
21719             if (child = children2[k]) {
21720               schedule_default(child, name, id2, k, children2, inherit2);
21721             }
21722           }
21723           subgroups.push(children2);
21724           parents.push(node);
21725         }
21726       }
21727     }
21728     return new Transition(subgroups, parents, name, id2);
21729   }
21730
21731   // node_modules/d3-transition/src/transition/selection.js
21732   var Selection2 = selection_default.prototype.constructor;
21733   function selection_default2() {
21734     return new Selection2(this._groups, this._parents);
21735   }
21736
21737   // node_modules/d3-transition/src/transition/style.js
21738   function styleNull(name, interpolate) {
21739     var string00, string10, interpolate0;
21740     return function() {
21741       var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name));
21742       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1);
21743     };
21744   }
21745   function styleRemove2(name) {
21746     return function() {
21747       this.style.removeProperty(name);
21748     };
21749   }
21750   function styleConstant2(name, interpolate, value1) {
21751     var string00, string1 = value1 + "", interpolate0;
21752     return function() {
21753       var string0 = styleValue(this, name);
21754       return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
21755     };
21756   }
21757   function styleFunction2(name, interpolate, value) {
21758     var string00, string10, interpolate0;
21759     return function() {
21760       var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + "";
21761       if (value1 == null)
21762         string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
21763       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
21764     };
21765   }
21766   function styleMaybeRemove(id2, name) {
21767     var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2;
21768     return function() {
21769       var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0;
21770       if (on !== on0 || listener0 !== listener)
21771         (on1 = (on0 = on).copy()).on(event, listener0 = listener);
21772       schedule.on = on1;
21773     };
21774   }
21775   function style_default2(name, value, priority) {
21776     var i2 = (name += "") === "transform" ? interpolateTransformCss : interpolate_default;
21777     return value == null ? this.styleTween(name, styleNull(name, i2)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i2, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i2, value), priority).on("end.style." + name, null);
21778   }
21779
21780   // node_modules/d3-transition/src/transition/styleTween.js
21781   function styleInterpolate(name, i2, priority) {
21782     return function(t) {
21783       this.style.setProperty(name, i2.call(this, t), priority);
21784     };
21785   }
21786   function styleTween(name, value, priority) {
21787     var t, i0;
21788     function tween() {
21789       var i2 = value.apply(this, arguments);
21790       if (i2 !== i0)
21791         t = (i0 = i2) && styleInterpolate(name, i2, priority);
21792       return t;
21793     }
21794     tween._value = value;
21795     return tween;
21796   }
21797   function styleTween_default(name, value, priority) {
21798     var key = "style." + (name += "");
21799     if (arguments.length < 2)
21800       return (key = this.tween(key)) && key._value;
21801     if (value == null)
21802       return this.tween(key, null);
21803     if (typeof value !== "function")
21804       throw new Error();
21805     return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
21806   }
21807
21808   // node_modules/d3-transition/src/transition/text.js
21809   function textConstant2(value) {
21810     return function() {
21811       this.textContent = value;
21812     };
21813   }
21814   function textFunction2(value) {
21815     return function() {
21816       var value1 = value(this);
21817       this.textContent = value1 == null ? "" : value1;
21818     };
21819   }
21820   function text_default2(value) {
21821     return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + ""));
21822   }
21823
21824   // node_modules/d3-transition/src/transition/textTween.js
21825   function textInterpolate(i2) {
21826     return function(t) {
21827       this.textContent = i2.call(this, t);
21828     };
21829   }
21830   function textTween(value) {
21831     var t0, i0;
21832     function tween() {
21833       var i2 = value.apply(this, arguments);
21834       if (i2 !== i0)
21835         t0 = (i0 = i2) && textInterpolate(i2);
21836       return t0;
21837     }
21838     tween._value = value;
21839     return tween;
21840   }
21841   function textTween_default(value) {
21842     var key = "text";
21843     if (arguments.length < 1)
21844       return (key = this.tween(key)) && key._value;
21845     if (value == null)
21846       return this.tween(key, null);
21847     if (typeof value !== "function")
21848       throw new Error();
21849     return this.tween(key, textTween(value));
21850   }
21851
21852   // node_modules/d3-transition/src/transition/transition.js
21853   function transition_default() {
21854     var name = this._name, id0 = this._id, id1 = newId();
21855     for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) {
21856       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
21857         if (node = group[i2]) {
21858           var inherit2 = get2(node, id0);
21859           schedule_default(node, name, id1, i2, group, {
21860             time: inherit2.time + inherit2.delay + inherit2.duration,
21861             delay: 0,
21862             duration: inherit2.duration,
21863             ease: inherit2.ease
21864           });
21865         }
21866       }
21867     }
21868     return new Transition(groups, this._parents, name, id1);
21869   }
21870
21871   // node_modules/d3-transition/src/transition/end.js
21872   function end_default() {
21873     var on0, on1, that = this, id2 = that._id, size = that.size();
21874     return new Promise(function(resolve, reject) {
21875       var cancel = { value: reject }, end = { value: function() {
21876         if (--size === 0)
21877           resolve();
21878       } };
21879       that.each(function() {
21880         var schedule = set2(this, id2), on = schedule.on;
21881         if (on !== on0) {
21882           on1 = (on0 = on).copy();
21883           on1._.cancel.push(cancel);
21884           on1._.interrupt.push(cancel);
21885           on1._.end.push(end);
21886         }
21887         schedule.on = on1;
21888       });
21889       if (size === 0)
21890         resolve();
21891     });
21892   }
21893
21894   // node_modules/d3-transition/src/transition/index.js
21895   var id = 0;
21896   function Transition(groups, parents, name, id2) {
21897     this._groups = groups;
21898     this._parents = parents;
21899     this._name = name;
21900     this._id = id2;
21901   }
21902   function transition(name) {
21903     return selection_default().transition(name);
21904   }
21905   function newId() {
21906     return ++id;
21907   }
21908   var selection_prototype = selection_default.prototype;
21909   Transition.prototype = transition.prototype = {
21910     constructor: Transition,
21911     select: select_default3,
21912     selectAll: selectAll_default3,
21913     selectChild: selection_prototype.selectChild,
21914     selectChildren: selection_prototype.selectChildren,
21915     filter: filter_default2,
21916     merge: merge_default2,
21917     selection: selection_default2,
21918     transition: transition_default,
21919     call: selection_prototype.call,
21920     nodes: selection_prototype.nodes,
21921     node: selection_prototype.node,
21922     size: selection_prototype.size,
21923     empty: selection_prototype.empty,
21924     each: selection_prototype.each,
21925     on: on_default2,
21926     attr: attr_default2,
21927     attrTween: attrTween_default,
21928     style: style_default2,
21929     styleTween: styleTween_default,
21930     text: text_default2,
21931     textTween: textTween_default,
21932     remove: remove_default2,
21933     tween: tween_default,
21934     delay: delay_default,
21935     duration: duration_default,
21936     ease: ease_default,
21937     easeVarying: easeVarying_default,
21938     end: end_default,
21939     [Symbol.iterator]: selection_prototype[Symbol.iterator]
21940   };
21941
21942   // node_modules/d3-ease/src/linear.js
21943   var linear2 = (t) => +t;
21944
21945   // node_modules/d3-ease/src/cubic.js
21946   function cubicInOut(t) {
21947     return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
21948   }
21949
21950   // node_modules/d3-transition/src/selection/transition.js
21951   var defaultTiming = {
21952     time: null,
21953     // Set on use.
21954     delay: 0,
21955     duration: 250,
21956     ease: cubicInOut
21957   };
21958   function inherit(node, id2) {
21959     var timing;
21960     while (!(timing = node.__transition) || !(timing = timing[id2])) {
21961       if (!(node = node.parentNode)) {
21962         throw new Error(`transition ${id2} not found`);
21963       }
21964     }
21965     return timing;
21966   }
21967   function transition_default2(name) {
21968     var id2, timing;
21969     if (name instanceof Transition) {
21970       id2 = name._id, name = name._name;
21971     } else {
21972       id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
21973     }
21974     for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) {
21975       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
21976         if (node = group[i2]) {
21977           schedule_default(node, name, id2, i2, group, timing || inherit(node, id2));
21978         }
21979       }
21980     }
21981     return new Transition(groups, this._parents, name, id2);
21982   }
21983
21984   // node_modules/d3-transition/src/selection/index.js
21985   selection_default.prototype.interrupt = interrupt_default2;
21986   selection_default.prototype.transition = transition_default2;
21987
21988   // node_modules/d3-zoom/src/constant.js
21989   var constant_default4 = (x) => () => x;
21990
21991   // node_modules/d3-zoom/src/event.js
21992   function ZoomEvent(type2, {
21993     sourceEvent,
21994     target,
21995     transform: transform2,
21996     dispatch: dispatch10
21997   }) {
21998     Object.defineProperties(this, {
21999       type: { value: type2, enumerable: true, configurable: true },
22000       sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
22001       target: { value: target, enumerable: true, configurable: true },
22002       transform: { value: transform2, enumerable: true, configurable: true },
22003       _: { value: dispatch10 }
22004     });
22005   }
22006
22007   // node_modules/d3-zoom/src/transform.js
22008   function Transform(k, x, y) {
22009     this.k = k;
22010     this.x = x;
22011     this.y = y;
22012   }
22013   Transform.prototype = {
22014     constructor: Transform,
22015     scale: function(k) {
22016       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22017     },
22018     translate: function(x, y) {
22019       return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22020     },
22021     apply: function(point2) {
22022       return [point2[0] * this.k + this.x, point2[1] * this.k + this.y];
22023     },
22024     applyX: function(x) {
22025       return x * this.k + this.x;
22026     },
22027     applyY: function(y) {
22028       return y * this.k + this.y;
22029     },
22030     invert: function(location) {
22031       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22032     },
22033     invertX: function(x) {
22034       return (x - this.x) / this.k;
22035     },
22036     invertY: function(y) {
22037       return (y - this.y) / this.k;
22038     },
22039     rescaleX: function(x) {
22040       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22041     },
22042     rescaleY: function(y) {
22043       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22044     },
22045     toString: function() {
22046       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22047     }
22048   };
22049   var identity2 = new Transform(1, 0, 0);
22050   transform.prototype = Transform.prototype;
22051   function transform(node) {
22052     while (!node.__zoom)
22053       if (!(node = node.parentNode))
22054         return identity2;
22055     return node.__zoom;
22056   }
22057
22058   // node_modules/d3-zoom/src/noevent.js
22059   function nopropagation2(event) {
22060     event.stopImmediatePropagation();
22061   }
22062   function noevent_default2(event) {
22063     event.preventDefault();
22064     event.stopImmediatePropagation();
22065   }
22066
22067   // node_modules/d3-zoom/src/zoom.js
22068   function defaultFilter2(event) {
22069     return (!event.ctrlKey || event.type === "wheel") && !event.button;
22070   }
22071   function defaultExtent() {
22072     var e = this;
22073     if (e instanceof SVGElement) {
22074       e = e.ownerSVGElement || e;
22075       if (e.hasAttribute("viewBox")) {
22076         e = e.viewBox.baseVal;
22077         return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
22078       }
22079       return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
22080     }
22081     return [[0, 0], [e.clientWidth, e.clientHeight]];
22082   }
22083   function defaultTransform() {
22084     return this.__zoom || identity2;
22085   }
22086   function defaultWheelDelta(event) {
22087     return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1);
22088   }
22089   function defaultTouchable2() {
22090     return navigator.maxTouchPoints || "ontouchstart" in this;
22091   }
22092   function defaultConstrain(transform2, extent, translateExtent) {
22093     var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1];
22094     return transform2.translate(
22095       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22096       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22097     );
22098   }
22099   function zoom_default2() {
22100     var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10;
22101     function zoom(selection2) {
22102       selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
22103     }
22104     zoom.transform = function(collection, transform2, point2, event) {
22105       var selection2 = collection.selection ? collection.selection() : collection;
22106       selection2.property("__zoom", defaultTransform);
22107       if (collection !== selection2) {
22108         schedule(collection, transform2, point2, event);
22109       } else {
22110         selection2.interrupt().each(function() {
22111           gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end();
22112         });
22113       }
22114     };
22115     zoom.scaleBy = function(selection2, k, p, event) {
22116       zoom.scaleTo(selection2, function() {
22117         var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22118         return k0 * k1;
22119       }, p, event);
22120     };
22121     zoom.scaleTo = function(selection2, k, p, event) {
22122       zoom.transform(selection2, function() {
22123         var e = extent.apply(this, arguments), t0 = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p02), k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22124         return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent);
22125       }, p, event);
22126     };
22127     zoom.translateBy = function(selection2, x, y, event) {
22128       zoom.transform(selection2, function() {
22129         return constrain(this.__zoom.translate(
22130           typeof x === "function" ? x.apply(this, arguments) : x,
22131           typeof y === "function" ? y.apply(this, arguments) : y
22132         ), extent.apply(this, arguments), translateExtent);
22133       }, null, event);
22134     };
22135     zoom.translateTo = function(selection2, x, y, p, event) {
22136       zoom.transform(selection2, function() {
22137         var e = extent.apply(this, arguments), t = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
22138         return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate(
22139           typeof x === "function" ? -x.apply(this, arguments) : -x,
22140           typeof y === "function" ? -y.apply(this, arguments) : -y
22141         ), e, translateExtent);
22142       }, p, event);
22143     };
22144     function scale(transform2, k) {
22145       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22146       return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
22147     }
22148     function translate(transform2, p02, p1) {
22149       var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k;
22150       return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y);
22151     }
22152     function centroid(extent2) {
22153       return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
22154     }
22155     function schedule(transition2, transform2, point2, event) {
22156       transition2.on("start.zoom", function() {
22157         gesture(this, arguments).event(event).start();
22158       }).on("interrupt.zoom end.zoom", function() {
22159         gesture(this, arguments).event(event).end();
22160       }).tween("zoom", function() {
22161         var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point2 == null ? centroid(e) : typeof point2 === "function" ? point2.apply(that, args) : point2, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i2 = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
22162         return function(t) {
22163           if (t === 1)
22164             t = b;
22165           else {
22166             var l = i2(t), k = w / l[2];
22167             t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
22168           }
22169           g.zoom(null, t);
22170         };
22171       });
22172     }
22173     function gesture(that, args, clean2) {
22174       return !clean2 && that.__zooming || new Gesture(that, args);
22175     }
22176     function Gesture(that, args) {
22177       this.that = that;
22178       this.args = args;
22179       this.active = 0;
22180       this.sourceEvent = null;
22181       this.extent = extent.apply(that, args);
22182       this.taps = 0;
22183     }
22184     Gesture.prototype = {
22185       event: function(event) {
22186         if (event)
22187           this.sourceEvent = event;
22188         return this;
22189       },
22190       start: function() {
22191         if (++this.active === 1) {
22192           this.that.__zooming = this;
22193           this.emit("start");
22194         }
22195         return this;
22196       },
22197       zoom: function(key, transform2) {
22198         if (this.mouse && key !== "mouse")
22199           this.mouse[1] = transform2.invert(this.mouse[0]);
22200         if (this.touch0 && key !== "touch")
22201           this.touch0[1] = transform2.invert(this.touch0[0]);
22202         if (this.touch1 && key !== "touch")
22203           this.touch1[1] = transform2.invert(this.touch1[0]);
22204         this.that.__zoom = transform2;
22205         this.emit("zoom");
22206         return this;
22207       },
22208       end: function() {
22209         if (--this.active === 0) {
22210           delete this.that.__zooming;
22211           this.emit("end");
22212         }
22213         return this;
22214       },
22215       emit: function(type2) {
22216         var d = select_default2(this.that).datum();
22217         listeners.call(
22218           type2,
22219           this.that,
22220           new ZoomEvent(type2, {
22221             sourceEvent: this.sourceEvent,
22222             target: zoom,
22223             type: type2,
22224             transform: this.that.__zoom,
22225             dispatch: listeners
22226           }),
22227           d
22228         );
22229       }
22230     };
22231     function wheeled(event, ...args) {
22232       if (!filter2.apply(this, arguments))
22233         return;
22234       var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event);
22235       if (g.wheel) {
22236         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22237           g.mouse[1] = t.invert(g.mouse[0] = p);
22238         }
22239         clearTimeout(g.wheel);
22240       } else if (t.k === k)
22241         return;
22242       else {
22243         g.mouse = [p, t.invert(p)];
22244         interrupt_default(this);
22245         g.start();
22246       }
22247       noevent_default2(event);
22248       g.wheel = setTimeout(wheelidled, wheelDelay);
22249       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22250       function wheelidled() {
22251         g.wheel = null;
22252         g.end();
22253       }
22254     }
22255     function mousedowned(event, ...args) {
22256       if (touchending || !filter2.apply(this, arguments))
22257         return;
22258       var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x05 = event.clientX, y05 = event.clientY;
22259       nodrag_default(event.view);
22260       nopropagation2(event);
22261       g.mouse = [p, this.__zoom.invert(p)];
22262       interrupt_default(this);
22263       g.start();
22264       function mousemoved(event2) {
22265         noevent_default2(event2);
22266         if (!g.moved) {
22267           var dx = event2.clientX - x05, dy = event2.clientY - y05;
22268           g.moved = dx * dx + dy * dy > clickDistance2;
22269         }
22270         g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent));
22271       }
22272       function mouseupped(event2) {
22273         v.on("mousemove.zoom mouseup.zoom", null);
22274         yesdrag(event2.view, g.moved);
22275         noevent_default2(event2);
22276         g.event(event2).end();
22277       }
22278     }
22279     function dblclicked(event, ...args) {
22280       if (!filter2.apply(this, arguments))
22281         return;
22282       var t0 = this.__zoom, p02 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p02), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p02, p1), extent.apply(this, args), translateExtent);
22283       noevent_default2(event);
22284       if (duration > 0)
22285         select_default2(this).transition().duration(duration).call(schedule, t1, p02, event);
22286       else
22287         select_default2(this).call(zoom.transform, t1, p02, event);
22288     }
22289     function touchstarted(event, ...args) {
22290       if (!filter2.apply(this, arguments))
22291         return;
22292       var touches = event.touches, n2 = touches.length, g = gesture(this, args, event.changedTouches.length === n2).event(event), started, i2, t, p;
22293       nopropagation2(event);
22294       for (i2 = 0; i2 < n2; ++i2) {
22295         t = touches[i2], p = pointer_default(t, this);
22296         p = [p, this.__zoom.invert(p), t.identifier];
22297         if (!g.touch0)
22298           g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
22299         else if (!g.touch1 && g.touch0[2] !== p[2])
22300           g.touch1 = p, g.taps = 0;
22301       }
22302       if (touchstarting)
22303         touchstarting = clearTimeout(touchstarting);
22304       if (started) {
22305         if (g.taps < 2)
22306           touchfirst = p[0], touchstarting = setTimeout(function() {
22307             touchstarting = null;
22308           }, touchDelay);
22309         interrupt_default(this);
22310         g.start();
22311       }
22312     }
22313     function touchmoved(event, ...args) {
22314       if (!this.__zooming)
22315         return;
22316       var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t, p, l;
22317       noevent_default2(event);
22318       for (i2 = 0; i2 < n2; ++i2) {
22319         t = touches[i2], p = pointer_default(t, this);
22320         if (g.touch0 && g.touch0[2] === t.identifier)
22321           g.touch0[0] = p;
22322         else if (g.touch1 && g.touch1[2] === t.identifier)
22323           g.touch1[0] = p;
22324       }
22325       t = g.that.__zoom;
22326       if (g.touch1) {
22327         var p02 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
22328         t = scale(t, Math.sqrt(dp / dl));
22329         p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2];
22330         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
22331       } else if (g.touch0)
22332         p = g.touch0[0], l = g.touch0[1];
22333       else
22334         return;
22335       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
22336     }
22337     function touchended(event, ...args) {
22338       if (!this.__zooming)
22339         return;
22340       var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t;
22341       nopropagation2(event);
22342       if (touchending)
22343         clearTimeout(touchending);
22344       touchending = setTimeout(function() {
22345         touchending = null;
22346       }, touchDelay);
22347       for (i2 = 0; i2 < n2; ++i2) {
22348         t = touches[i2];
22349         if (g.touch0 && g.touch0[2] === t.identifier)
22350           delete g.touch0;
22351         else if (g.touch1 && g.touch1[2] === t.identifier)
22352           delete g.touch1;
22353       }
22354       if (g.touch1 && !g.touch0)
22355         g.touch0 = g.touch1, delete g.touch1;
22356       if (g.touch0)
22357         g.touch0[1] = this.__zoom.invert(g.touch0[0]);
22358       else {
22359         g.end();
22360         if (g.taps === 2) {
22361           t = pointer_default(t, this);
22362           if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
22363             var p = select_default2(this).on("dblclick.zoom");
22364             if (p)
22365               p.apply(this, arguments);
22366           }
22367         }
22368       }
22369     }
22370     zoom.wheelDelta = function(_) {
22371       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default4(+_), zoom) : wheelDelta;
22372     };
22373     zoom.filter = function(_) {
22374       return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : filter2;
22375     };
22376     zoom.touchable = function(_) {
22377       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : touchable;
22378     };
22379     zoom.extent = function(_) {
22380       return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
22381     };
22382     zoom.scaleExtent = function(_) {
22383       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
22384     };
22385     zoom.translateExtent = function(_) {
22386       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]]];
22387     };
22388     zoom.constrain = function(_) {
22389       return arguments.length ? (constrain = _, zoom) : constrain;
22390     };
22391     zoom.duration = function(_) {
22392       return arguments.length ? (duration = +_, zoom) : duration;
22393     };
22394     zoom.interpolate = function(_) {
22395       return arguments.length ? (interpolate = _, zoom) : interpolate;
22396     };
22397     zoom.on = function() {
22398       var value = listeners.on.apply(listeners, arguments);
22399       return value === listeners ? zoom : value;
22400     };
22401     zoom.clickDistance = function(_) {
22402       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
22403     };
22404     zoom.tapDistance = function(_) {
22405       return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
22406     };
22407     return zoom;
22408   }
22409
22410   // modules/geo/raw_mercator.js
22411   function geoRawMercator() {
22412     var project = mercatorRaw;
22413     var k = 512 / Math.PI;
22414     var x = 0;
22415     var y = 0;
22416     var clipExtent = [[0, 0], [0, 0]];
22417     function projection2(point2) {
22418       point2 = project(point2[0] * Math.PI / 180, point2[1] * Math.PI / 180);
22419       return [point2[0] * k + x, y - point2[1] * k];
22420     }
22421     projection2.invert = function(point2) {
22422       point2 = project.invert((point2[0] - x) / k, (y - point2[1]) / k);
22423       return point2 && [point2[0] * 180 / Math.PI, point2[1] * 180 / Math.PI];
22424     };
22425     projection2.scale = function(_) {
22426       if (!arguments.length)
22427         return k;
22428       k = +_;
22429       return projection2;
22430     };
22431     projection2.translate = function(_) {
22432       if (!arguments.length)
22433         return [x, y];
22434       x = +_[0];
22435       y = +_[1];
22436       return projection2;
22437     };
22438     projection2.clipExtent = function(_) {
22439       if (!arguments.length)
22440         return clipExtent;
22441       clipExtent = _;
22442       return projection2;
22443     };
22444     projection2.transform = function(obj) {
22445       if (!arguments.length)
22446         return identity2.translate(x, y).scale(k);
22447       x = +obj.x;
22448       y = +obj.y;
22449       k = +obj.k;
22450       return projection2;
22451     };
22452     projection2.stream = transform_default({
22453       point: function(x2, y2) {
22454         var vec = projection2([x2, y2]);
22455         this.stream.point(vec[0], vec[1]);
22456       }
22457     }).stream;
22458     return projection2;
22459   }
22460
22461   // modules/geo/ortho.js
22462   function geoOrthoNormalizedDotProduct(a, b, origin) {
22463     if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
22464       return 1;
22465     }
22466     return geoVecNormalizedDot(a, b, origin);
22467   }
22468   function geoOrthoFilterDotProduct(dotp, epsilon3, lowerThreshold, upperThreshold, allowStraightAngles) {
22469     var val = Math.abs(dotp);
22470     if (val < epsilon3) {
22471       return 0;
22472     } else if (allowStraightAngles && Math.abs(val - 1) < epsilon3) {
22473       return 0;
22474     } else if (val < lowerThreshold || val > upperThreshold) {
22475       return dotp;
22476     } else {
22477       return null;
22478     }
22479   }
22480   function geoOrthoCalcScore(points, isClosed, epsilon3, threshold) {
22481     var score = 0;
22482     var first = isClosed ? 0 : 1;
22483     var last = isClosed ? points.length : points.length - 1;
22484     var coords = points.map(function(p) {
22485       return p.coord;
22486     });
22487     var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
22488     var upperThreshold = Math.cos(threshold * Math.PI / 180);
22489     for (var i2 = first; i2 < last; i2++) {
22490       var a = coords[(i2 - 1 + coords.length) % coords.length];
22491       var origin = coords[i2];
22492       var b = coords[(i2 + 1) % coords.length];
22493       var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold);
22494       if (dotp === null)
22495         continue;
22496       score = score + 2 * Math.min(Math.abs(dotp - 1), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
22497     }
22498     return score;
22499   }
22500   function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
22501     var max3 = -Infinity;
22502     var first = isClosed ? 0 : 1;
22503     var last = isClosed ? coords.length : coords.length - 1;
22504     for (var i2 = first; i2 < last; i2++) {
22505       var a = coords[(i2 - 1 + coords.length) % coords.length];
22506       var origin = coords[i2];
22507       var b = coords[(i2 + 1) % coords.length];
22508       var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
22509       var angle2 = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
22510       if (angle2 > 45)
22511         angle2 = 90 - angle2;
22512       if (angle2 >= lessThan)
22513         continue;
22514       if (angle2 > max3)
22515         max3 = angle2;
22516     }
22517     if (max3 === -Infinity)
22518       return null;
22519     return max3;
22520   }
22521   function geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles) {
22522     var score = null;
22523     var first = isClosed ? 0 : 1;
22524     var last = isClosed ? coords.length : coords.length - 1;
22525     var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
22526     var upperThreshold = Math.cos(threshold * Math.PI / 180);
22527     for (var i2 = first; i2 < last; i2++) {
22528       var a = coords[(i2 - 1 + coords.length) % coords.length];
22529       var origin = coords[i2];
22530       var b = coords[(i2 + 1) % coords.length];
22531       var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold, allowStraightAngles);
22532       if (dotp === null)
22533         continue;
22534       if (Math.abs(dotp) > 0)
22535         return 1;
22536       score = 0;
22537     }
22538     return score;
22539   }
22540
22541   // modules/util/array.js
22542   function utilArrayIdentical(a, b) {
22543     if (a === b)
22544       return true;
22545     var i2 = a.length;
22546     if (i2 !== b.length)
22547       return false;
22548     while (i2--) {
22549       if (a[i2] !== b[i2])
22550         return false;
22551     }
22552     return true;
22553   }
22554   function utilArrayDifference(a, b) {
22555     var other = new Set(b);
22556     return Array.from(new Set(a)).filter(function(v) {
22557       return !other.has(v);
22558     });
22559   }
22560   function utilArrayIntersection(a, b) {
22561     var other = new Set(b);
22562     return Array.from(new Set(a)).filter(function(v) {
22563       return other.has(v);
22564     });
22565   }
22566   function utilArrayUnion(a, b) {
22567     var result = new Set(a);
22568     b.forEach(function(v) {
22569       result.add(v);
22570     });
22571     return Array.from(result);
22572   }
22573   function utilArrayUniq(a) {
22574     return Array.from(new Set(a));
22575   }
22576   function utilArrayChunk(a, chunkSize) {
22577     if (!chunkSize || chunkSize < 0)
22578       return [a.slice()];
22579     var result = new Array(Math.ceil(a.length / chunkSize));
22580     return Array.from(result, function(item, i2) {
22581       return a.slice(i2 * chunkSize, i2 * chunkSize + chunkSize);
22582     });
22583   }
22584   function utilArrayFlatten(a) {
22585     return a.reduce(function(acc, val) {
22586       return acc.concat(val);
22587     }, []);
22588   }
22589   function utilArrayGroupBy(a, key) {
22590     return a.reduce(function(acc, item) {
22591       var group = typeof key === "function" ? key(item) : item[key];
22592       (acc[group] = acc[group] || []).push(item);
22593       return acc;
22594     }, {});
22595   }
22596   function utilArrayUniqBy(a, key) {
22597     var seen = /* @__PURE__ */ new Set();
22598     return a.reduce(function(acc, item) {
22599       var val = typeof key === "function" ? key(item) : item[key];
22600       if (val && !seen.has(val)) {
22601         seen.add(val);
22602         acc.push(item);
22603       }
22604       return acc;
22605     }, []);
22606   }
22607
22608   // modules/util/util.js
22609   var import_diacritics = __toESM(require_diacritics());
22610
22611   // modules/util/svg_paths_rtl_fix.js
22612   var import_alif_toolkit = __toESM(require_lib());
22613   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0–\u08BF]/;
22614   function fixRTLTextForSvg(inputText) {
22615     var ret = "", rtlBuffer = [];
22616     var arabicRegex = /[\u0600-\u06FF]/g;
22617     var arabicDiacritics = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06ED]/g;
22618     var arabicMath = /[\u0660-\u066C\u06F0-\u06F9]+/g;
22619     var thaanaVowel = /[\u07A6-\u07B0]/;
22620     var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
22621     if (arabicRegex.test(inputText)) {
22622       inputText = (0, import_alif_toolkit.WordShaper)(inputText);
22623     }
22624     for (var n2 = 0; n2 < inputText.length; n2++) {
22625       var c = inputText[n2];
22626       if (arabicMath.test(c)) {
22627         ret += rtlBuffer.reverse().join("");
22628         rtlBuffer = [c];
22629       } else {
22630         if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) {
22631           ret += rtlBuffer.reverse().join("");
22632           rtlBuffer = [];
22633         }
22634         if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) {
22635           rtlBuffer[rtlBuffer.length - 1] += c;
22636         } else if (rtlRegex.test(c) || c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023 || c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279) {
22637           rtlBuffer.push(c);
22638         } else if (c === " " && rtlBuffer.length) {
22639           rtlBuffer = [rtlBuffer.reverse().join("") + " "];
22640         } else {
22641           ret += rtlBuffer.reverse().join("") + c;
22642           rtlBuffer = [];
22643         }
22644       }
22645     }
22646     ret += rtlBuffer.reverse().join("");
22647     return ret;
22648   }
22649
22650   // modules/core/preferences.js
22651   var _storage;
22652   try {
22653     _storage = localStorage;
22654   } catch (e) {
22655   }
22656   _storage = _storage || (() => {
22657     let s = {};
22658     return {
22659       getItem: (k) => s[k],
22660       setItem: (k, v) => s[k] = v,
22661       removeItem: (k) => delete s[k]
22662     };
22663   })();
22664   var _listeners = {};
22665   function corePreferences(k, v) {
22666     try {
22667       if (v === void 0)
22668         return _storage.getItem(k);
22669       else if (v === null)
22670         _storage.removeItem(k);
22671       else
22672         _storage.setItem(k, v);
22673       if (_listeners[k]) {
22674         _listeners[k].forEach((handler) => handler(v));
22675       }
22676       return true;
22677     } catch (e) {
22678       if (typeof console !== "undefined") {
22679         console.error("localStorage quota exceeded");
22680       }
22681       return false;
22682     }
22683   }
22684   corePreferences.onChange = function(k, handler) {
22685     _listeners[k] = _listeners[k] || [];
22686     _listeners[k].push(handler);
22687   };
22688
22689   // modules/core/file_fetcher.js
22690   var import_vparse = __toESM(require_vparse());
22691
22692   // config/id.js
22693   var presetsCdnUrl = "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@{presets_version}/";
22694   var ociCdnUrl = "https://cdn.jsdelivr.net/npm/osm-community-index@{version}/";
22695   var wmfSitematrixCdnUrl = "https://cdn.jsdelivr.net/npm/wmf-sitematrix@{version}/";
22696   var nsiCdnUrl = "https://cdn.jsdelivr.net/npm/name-suggestion-index@{version}/";
22697   var osmApiConnections = [
22698     {
22699       // "live" db
22700       url: "https://www.openstreetmap.org",
22701       client_id: "0tmNTmd0Jo1dQp4AUmMBLtGiD9YpMuXzHefitcuVStc",
22702       client_secret: "BTlNrNxIPitHdL4sP2clHw5KLoee9aKkA7dQbc0Bj7Q"
22703     },
22704     {
22705       // "dev" db
22706       url: "https://api06.dev.openstreetmap.org",
22707       client_id: "Ee1wWJ6UlpERbF6BfTNOpwn0R8k_06mvMXdDUkeHMgw",
22708       client_secret: "OnfWFC-JkZNHyYdr_viNn_h_RTZXRslKcUxllOXqf5g"
22709     }
22710   ];
22711   var taginfoApiUrl = "https://taginfo.openstreetmap.org/api/4/";
22712   var nominatimApiUrl = "https://nominatim.openstreetmap.org/";
22713
22714   // package.json
22715   var package_default = {
22716     name: "iD",
22717     version: "2.24.0",
22718     description: "A friendly editor for OpenStreetMap",
22719     main: "dist/iD.min.js",
22720     repository: "github:openstreetmap/iD",
22721     homepage: "https://github.com/openstreetmap/iD",
22722     bugs: "https://github.com/openstreetmap/iD/issues",
22723     keywords: [
22724       "editor",
22725       "openstreetmap"
22726     ],
22727     license: "ISC",
22728     scripts: {
22729       all: "run-s clean build dist",
22730       build: "run-s build:css build:data build:js",
22731       "build:css": "node scripts/build_css.js",
22732       "build:data": "shx mkdir -p dist/data && node scripts/build_data.js",
22733       "build:stats": "node config/esbuild.config.mjs --stats && esbuild-visualizer --metadata dist/esbuild.json --exclude *.png --filename docs/statistics.html && shx rm dist/esbuild.json",
22734       "build:js": "node config/esbuild.config.mjs",
22735       "build:js:watch": "node config/esbuild.config.mjs --watch",
22736       clean: "shx rm -f dist/esbuild.json dist/*.js dist/*.map dist/*.css dist/img/*.svg",
22737       dist: "run-p dist:**",
22738       "dist:mapillary": "shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/",
22739       "dist:pannellum": "shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/",
22740       "dist:min": "node config/esbuild.config.min.mjs",
22741       "dist:svg:iD": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "iD-%s" --symbol-sprite dist/img/iD-sprite.svg "svg/iD-sprite/**/*.svg"',
22742       "dist:svg:community": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "community-%s" --symbol-sprite dist/img/community-sprite.svg node_modules/osm-community-index/dist/img/*.svg',
22743       "dist:svg:fa": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/fa-sprite.svg svg/fontawesome/*.svg",
22744       "dist:svg:maki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "maki-%s" --symbol-sprite dist/img/maki-sprite.svg node_modules/@mapbox/maki/icons/*.svg',
22745       "dist:svg:mapillary:signs": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg",
22746       "dist:svg:mapillary:objects": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-object-sprite.svg node_modules/mapillary_sprite_source/package_objects/*.svg",
22747       "dist:svg:temaki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "temaki-%s" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@ideditor/temaki/icons/*.svg',
22748       imagery: "node scripts/update_imagery.js",
22749       lint: "eslint scripts test/spec modules",
22750       "lint:fix": "eslint scripts test/spec modules --fix",
22751       start: "run-s build:js start:server",
22752       "start:watch": "run-p build:js:watch start:server",
22753       "start:server": "node scripts/server.js",
22754       test: "npm-run-all -s lint build test:spec",
22755       "test:spec": "karma start config/karma.conf.js",
22756       translations: "node scripts/update_locales.js"
22757     },
22758     dependencies: {
22759       "@ideditor/country-coder": "~5.1.0",
22760       "@ideditor/location-conflation": "~1.1.0",
22761       "@mapbox/geojson-area": "^0.2.2",
22762       "@mapbox/sexagesimal": "1.2.0",
22763       "@mapbox/vector-tile": "^1.3.1",
22764       "@tmcw/togeojson": "^5.2.1",
22765       "@turf/bbox": "^6.0.0",
22766       "@turf/bbox-clip": "^6.0.0",
22767       "abortcontroller-polyfill": "^1.4.0",
22768       "aes-js": "^3.1.2",
22769       "alif-toolkit": "^1.2.9",
22770       "core-js-bundle": "^3.19.0",
22771       diacritics: "1.3.0",
22772       "fast-deep-equal": "~3.1.1",
22773       "fast-json-stable-stringify": "2.1.0",
22774       "lodash-es": "~4.17.15",
22775       marked: "~4.2.2",
22776       "node-diff3": "~3.1.0",
22777       "osm-auth": "~2.0.0",
22778       pannellum: "2.5.6",
22779       pbf: "^3.2.1",
22780       "polygon-clipping": "~0.15.1",
22781       rbush: "3.0.1",
22782       "whatwg-fetch": "^3.4.1",
22783       "which-polygon": "2.2.0"
22784     },
22785     devDependencies: {
22786       "@fortawesome/fontawesome-svg-core": "~6.2.0",
22787       "@fortawesome/free-brands-svg-icons": "~6.2.0",
22788       "@fortawesome/free-regular-svg-icons": "~6.2.0",
22789       "@fortawesome/free-solid-svg-icons": "~6.2.0",
22790       "@ideditor/temaki": "~5.2.0",
22791       "@mapbox/maki": "^8.0.0",
22792       "@openstreetmap/id-tagging-schema": "^5.0.1",
22793       "@transifex/api": "^5.0.1",
22794       autoprefixer: "^10.0.1",
22795       chai: "^4.3.4",
22796       chalk: "^4.1.2",
22797       "cldr-core": "^41.0.0",
22798       "cldr-localenames-full": "^41.0.0",
22799       "concat-files": "^0.1.1",
22800       d3: "~7.8.1",
22801       "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages",
22802       esbuild: "^0.17.3",
22803       "esbuild-visualizer": "^0.4.0",
22804       eslint: "^8.8.0",
22805       "fetch-mock": "^9.11.0",
22806       gaze: "^1.1.3",
22807       glob: "^8.0.3",
22808       happen: "^0.3.2",
22809       "js-yaml": "^4.0.0",
22810       "json-stringify-pretty-compact": "^3.0.0",
22811       karma: "^6.3.5",
22812       "karma-chrome-launcher": "^3.1.0",
22813       "karma-coverage": "2.1.1",
22814       "karma-mocha": "^2.0.1",
22815       "karma-remap-istanbul": "^0.6.0",
22816       mapillary_sprite_source: "^1.8.0",
22817       "mapillary-js": "4.1.1",
22818       minimist: "^1.2.3",
22819       mocha: "^10.0.0",
22820       "name-suggestion-index": "~6.0",
22821       "node-fetch": "^2.6.1",
22822       "npm-run-all": "^4.0.0",
22823       "osm-community-index": "~5.5.0",
22824       postcss: "^8.1.1",
22825       "postcss-selector-prepend": "^0.5.0",
22826       shelljs: "^0.8.0",
22827       shx: "^0.3.0",
22828       sinon: "^11.1.2",
22829       "sinon-chai": "^3.7.0",
22830       smash: "0.0",
22831       "static-server": "^2.2.1",
22832       "svg-sprite": "2.0.2",
22833       vparse: "~1.1.0"
22834     },
22835     engines: {
22836       node: ">=16.14"
22837     },
22838     browserslist: [
22839       "> 0.2%, last 6 major versions, Firefox ESR, maintained node versions"
22840     ]
22841   };
22842
22843   // modules/core/file_fetcher.js
22844   var _mainFileFetcher = coreFileFetcher();
22845   function coreFileFetcher() {
22846     const ociVersion = package_default.dependencies["osm-community-index"] || package_default.devDependencies["osm-community-index"];
22847     const v = (0, import_vparse.default)(ociVersion);
22848     const ociVersionMinor = `${v.major}.${v.minor}`;
22849     const presetsVersion = package_default.devDependencies["@openstreetmap/id-tagging-schema"];
22850     let _this = {};
22851     let _inflight4 = {};
22852     let _fileMap = {
22853       "address_formats": "data/address_formats.min.json",
22854       "imagery": "data/imagery.min.json",
22855       "intro_graph": "data/intro_graph.min.json",
22856       "keepRight": "data/keepRight.min.json",
22857       "languages": "data/languages.min.json",
22858       "locales": "locales/index.min.json",
22859       "phone_formats": "data/phone_formats.min.json",
22860       "qa_data": "data/qa_data.min.json",
22861       "shortcuts": "data/shortcuts.min.json",
22862       "territory_languages": "data/territory_languages.min.json",
22863       "oci_defaults": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/defaults.min.json",
22864       "oci_features": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/featureCollection.min.json",
22865       "oci_resources": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/resources.min.json",
22866       "presets_package": presetsCdnUrl.replace("{presets_version}", presetsVersion) + "package.json",
22867       "deprecated": presetsCdnUrl + "dist/deprecated.min.json",
22868       "discarded": presetsCdnUrl + "dist/discarded.min.json",
22869       "preset_categories": presetsCdnUrl + "dist/preset_categories.min.json",
22870       "preset_defaults": presetsCdnUrl + "dist/preset_defaults.min.json",
22871       "preset_fields": presetsCdnUrl + "dist/fields.min.json",
22872       "preset_presets": presetsCdnUrl + "dist/presets.min.json",
22873       "wmf_sitematrix": wmfSitematrixCdnUrl.replace("{version}", "0.1") + "wikipedia.min.json"
22874     };
22875     let _cachedData = {};
22876     _this.cache = () => _cachedData;
22877     _this.get = (which) => {
22878       if (_cachedData[which]) {
22879         return Promise.resolve(_cachedData[which]);
22880       }
22881       const file = _fileMap[which];
22882       const url = file && _this.asset(file);
22883       if (!url) {
22884         return Promise.reject(`Unknown data file for "${which}"`);
22885       }
22886       if (url.includes("{presets_version}")) {
22887         return _this.get("presets_package").then((result) => {
22888           const presetsVersion2 = result.version;
22889           return getUrl(url.replace("{presets_version}", presetsVersion2), which);
22890         });
22891       } else {
22892         return getUrl(url);
22893       }
22894     };
22895     function getUrl(url, which) {
22896       let prom = _inflight4[url];
22897       if (!prom) {
22898         _inflight4[url] = prom = fetch(url).then((response) => {
22899           if (!response.ok || !response.json) {
22900             throw new Error(response.status + " " + response.statusText);
22901           }
22902           if (response.status === 204 || response.status === 205)
22903             return;
22904           return response.json();
22905         }).then((result) => {
22906           delete _inflight4[url];
22907           if (!result) {
22908             throw new Error(`No data loaded for "${which}"`);
22909           }
22910           _cachedData[which] = result;
22911           return result;
22912         }).catch((err) => {
22913           delete _inflight4[url];
22914           throw err;
22915         });
22916       }
22917       return prom;
22918     }
22919     _this.fileMap = function(val) {
22920       if (!arguments.length)
22921         return _fileMap;
22922       _fileMap = val;
22923       return _this;
22924     };
22925     let _assetPath = "";
22926     _this.assetPath = function(val) {
22927       if (!arguments.length)
22928         return _assetPath;
22929       _assetPath = val;
22930       return _this;
22931     };
22932     let _assetMap = {};
22933     _this.assetMap = function(val) {
22934       if (!arguments.length)
22935         return _assetMap;
22936       _assetMap = val;
22937       return _this;
22938     };
22939     _this.asset = (val) => {
22940       if (/^http(s)?:\/\//i.test(val))
22941         return val;
22942       const filename = _assetPath + val;
22943       return _assetMap[filename] || filename;
22944     };
22945     return _this;
22946   }
22947
22948   // node_modules/@ideditor/country-coder/dist/country-coder.mjs
22949   var import_which_polygon = __toESM(require_which_polygon(), 1);
22950   var borders_default = { type: "FeatureCollection", features: [
22951     { type: "Feature", properties: { wikidata: "Q21", nameEn: "England", aliases: ["GB-ENG"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.03913, 51.13217], [-7.74976, 48.64773], [1.17405, 50.74239], [2.18458, 51.52087], [2.56575, 51.85301], [0.792, 57.56437], [-2.30613, 55.62698], [-2.17058, 55.45916], [-2.6095, 55.28488], [-2.63532, 55.19452], [-3.02906, 55.04606], [-3.09361, 54.94924], [-3.38407, 54.94278], [-4.1819, 54.57861], [-3.5082, 53.54318], [-3.08228, 53.25526], [-3.03675, 53.25092], [-2.92329, 53.19383], [-2.92022, 53.17685], [-2.98598, 53.15589], [-2.90649, 53.10964], [-2.87469, 53.12337], [-2.89131, 53.09374], [-2.83133, 52.99184], [-2.7251, 52.98389], [-2.72221, 52.92969], [-2.80549, 52.89428], [-2.85897, 52.94487], [-2.92401, 52.93836], [-2.97243, 52.9651], [-3.13576, 52.895], [-3.15744, 52.84947], [-3.16105, 52.79599], [-3.08734, 52.77504], [-3.01001, 52.76636], [-2.95581, 52.71794], [-3.01724, 52.72083], [-3.04398, 52.65435], [-3.13648, 52.58208], [-3.12926, 52.5286], [-3.09746, 52.53077], [-3.08662, 52.54811], [-3.00929, 52.57774], [-2.99701, 52.551], [-3.03603, 52.49969], [-3.13359, 52.49174], [-3.22971, 52.45344], [-3.22754, 52.42526], [-3.04687, 52.34504], [-2.95364, 52.3501], [-2.99701, 52.323], [-3.00785, 52.2753], [-3.09289, 52.20546], [-3.12638, 52.08114], [-2.97111, 51.90456], [-2.8818, 51.93196], [-2.78742, 51.88833], [-2.74277, 51.84367], [-2.66234, 51.83555], [-2.66336, 51.59504], [-3.20563, 51.31615], [-6.03913, 51.13217]]]] } },
22952     { type: "Feature", properties: { wikidata: "Q22", nameEn: "Scotland", aliases: ["GB-SCT"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.792, 57.56437], [-0.3751, 61.32236], [-14.78497, 57.60709], [-6.82333, 55.83103], [-4.69044, 54.3629], [-3.38407, 54.94278], [-3.09361, 54.94924], [-3.02906, 55.04606], [-2.63532, 55.19452], [-2.6095, 55.28488], [-2.17058, 55.45916], [-2.30613, 55.62698], [0.792, 57.56437]]]] } },
22953     { type: "Feature", properties: { wikidata: "Q25", nameEn: "Wales", aliases: ["GB-WLS"], country: "GB", groups: ["Q23666", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.5082, 53.54318], [-5.37267, 53.63269], [-6.03913, 51.13217], [-3.20563, 51.31615], [-2.66336, 51.59504], [-2.66234, 51.83555], [-2.74277, 51.84367], [-2.78742, 51.88833], [-2.8818, 51.93196], [-2.97111, 51.90456], [-3.12638, 52.08114], [-3.09289, 52.20546], [-3.00785, 52.2753], [-2.99701, 52.323], [-2.95364, 52.3501], [-3.04687, 52.34504], [-3.22754, 52.42526], [-3.22971, 52.45344], [-3.13359, 52.49174], [-3.03603, 52.49969], [-2.99701, 52.551], [-3.00929, 52.57774], [-3.08662, 52.54811], [-3.09746, 52.53077], [-3.12926, 52.5286], [-3.13648, 52.58208], [-3.04398, 52.65435], [-3.01724, 52.72083], [-2.95581, 52.71794], [-3.01001, 52.76636], [-3.08734, 52.77504], [-3.16105, 52.79599], [-3.15744, 52.84947], [-3.13576, 52.895], [-2.97243, 52.9651], [-2.92401, 52.93836], [-2.85897, 52.94487], [-2.80549, 52.89428], [-2.72221, 52.92969], [-2.7251, 52.98389], [-2.83133, 52.99184], [-2.89131, 53.09374], [-2.87469, 53.12337], [-2.90649, 53.10964], [-2.98598, 53.15589], [-2.92022, 53.17685], [-2.92329, 53.19383], [-3.03675, 53.25092], [-3.08228, 53.25526], [-3.5082, 53.54318]]]] } },
22954     { type: "Feature", properties: { wikidata: "Q26", nameEn: "Northern Ireland", aliases: ["GB-NIR"], country: "GB", groups: ["Q22890", "Q3336843", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-6.34755, 55.49206], [-7.2471, 55.06933], [-7.34464, 55.04688], [-7.4033, 55.00391], [-7.40004, 54.94498], [-7.44404, 54.9403], [-7.4473, 54.87003], [-7.47626, 54.83084], [-7.54508, 54.79401], [-7.54671, 54.74606], [-7.64449, 54.75265], [-7.75041, 54.7103], [-7.83352, 54.73854], [-7.93293, 54.66603], [-7.70315, 54.62077], [-7.8596, 54.53671], [-7.99812, 54.54427], [-8.04538, 54.48941], [-8.179, 54.46763], [-8.04555, 54.36292], [-7.87101, 54.29299], [-7.8596, 54.21779], [-7.81397, 54.20159], [-7.69501, 54.20731], [-7.55812, 54.12239], [-7.4799, 54.12239], [-7.44567, 54.1539], [-7.32834, 54.11475], [-7.30553, 54.11869], [-7.34005, 54.14698], [-7.29157, 54.17191], [-7.28017, 54.16714], [-7.29687, 54.1354], [-7.29493, 54.12013], [-7.26316, 54.13863], [-7.25012, 54.20063], [-7.14908, 54.22732], [-7.19145, 54.31296], [-7.02034, 54.4212], [-6.87775, 54.34682], [-6.85179, 54.29176], [-6.81583, 54.22791], [-6.74575, 54.18788], [-6.70175, 54.20218], [-6.6382, 54.17071], [-6.66264, 54.0666], [-6.62842, 54.03503], [-6.47849, 54.06947], [-6.36605, 54.07234], [-6.36279, 54.11248], [-6.32694, 54.09337], [-6.29003, 54.11278], [-6.26218, 54.09785], [-5.83481, 53.87749], [-4.69044, 54.3629], [-6.34755, 55.49206]]]] } },
22955     { type: "Feature", properties: { wikidata: "Q35", nameEn: "Denmark", country: "DK", groups: ["EU", "154", "150", "UN"], callingCodes: ["45"] }, geometry: { type: "MultiPolygon", coordinates: [[[[12.16597, 56.60205], [10.40861, 58.38489], [7.28637, 57.35913], [8.02459, 55.09613], [8.45719, 55.06747], [8.55769, 54.91837], [8.63979, 54.91069], [8.76387, 54.8948], [8.81178, 54.90518], [8.92795, 54.90452], [9.04629, 54.87249], [9.14275, 54.87421], [9.20571, 54.85841], [9.24631, 54.84726], [9.23445, 54.83432], [9.2474, 54.8112], [9.32771, 54.80602], [9.33849, 54.80233], [9.36496, 54.81749], [9.38532, 54.83968], [9.41213, 54.84254], [9.43155, 54.82586], [9.4659, 54.83131], [9.58937, 54.88785], [9.62734, 54.88057], [9.61187, 54.85548], [9.73563, 54.8247], [9.89314, 54.84171], [10.16755, 54.73883], [10.31111, 54.65968], [11.00303, 54.63689], [11.90309, 54.38543], [12.85844, 54.82438], [13.93395, 54.84044], [15.36991, 54.73263], [15.79951, 55.54655], [14.89259, 55.5623], [14.28399, 55.1553], [12.84405, 55.13257], [12.60345, 55.42675], [12.88472, 55.63369], [12.6372, 55.91371], [12.65312, 56.04345], [12.07466, 56.29488], [12.16597, 56.60205]]]] } },
22956     { type: "Feature", properties: { wikidata: "Q55", nameEn: "Netherlands", country: "NL", groups: ["EU", "155", "150", "UN"], callingCodes: ["31"] }, geometry: { type: "MultiPolygon", coordinates: [[[[5.45168, 54.20039], [2.56575, 51.85301], [3.36263, 51.37112], [3.38696, 51.33436], [3.35847, 51.31572], [3.38289, 51.27331], [3.41704, 51.25933], [3.43488, 51.24135], [3.52698, 51.2458], [3.51502, 51.28697], [3.58939, 51.30064], [3.78999, 51.25766], [3.78783, 51.2151], [3.90125, 51.20371], [3.97889, 51.22537], [4.01957, 51.24504], [4.05165, 51.24171], [4.16721, 51.29348], [4.24024, 51.35371], [4.21923, 51.37443], [4.33265, 51.37687], [4.34086, 51.35738], [4.39292, 51.35547], [4.43777, 51.36989], [4.38064, 51.41965], [4.39747, 51.43316], [4.38122, 51.44905], [4.47736, 51.4778], [4.5388, 51.48184], [4.54675, 51.47265], [4.52846, 51.45002], [4.53521, 51.4243], [4.57489, 51.4324], [4.65442, 51.42352], [4.72935, 51.48424], [4.74578, 51.48937], [4.77321, 51.50529], [4.78803, 51.50284], [4.84139, 51.4799], [4.82409, 51.44736], [4.82946, 51.4213], [4.78314, 51.43319], [4.76577, 51.43046], [4.77229, 51.41337], [4.78941, 51.41102], [4.84988, 51.41502], [4.90016, 51.41404], [4.92152, 51.39487], [5.00393, 51.44406], [5.0106, 51.47167], [5.03281, 51.48679], [5.04774, 51.47022], [5.07891, 51.4715], [5.10456, 51.43163], [5.07102, 51.39469], [5.13105, 51.34791], [5.13377, 51.31592], [5.16222, 51.31035], [5.2002, 51.32243], [5.24244, 51.30495], [5.22542, 51.26888], [5.23814, 51.26064], [5.26461, 51.26693], [5.29716, 51.26104], [5.33886, 51.26314], [5.347, 51.27502], [5.41672, 51.26248], [5.4407, 51.28169], [5.46519, 51.2849], [5.48476, 51.30053], [5.515, 51.29462], [5.5569, 51.26544], [5.5603, 51.22249], [5.65145, 51.19788], [5.65528, 51.18736], [5.70344, 51.1829], [5.74617, 51.18928], [5.77735, 51.17845], [5.77697, 51.1522], [5.82564, 51.16753], [5.85508, 51.14445], [5.80798, 51.11661], [5.8109, 51.10861], [5.83226, 51.10585], [5.82921, 51.09328], [5.79903, 51.09371], [5.79835, 51.05834], [5.77258, 51.06196], [5.75961, 51.03113], [5.77688, 51.02483], [5.76242, 50.99703], [5.71864, 50.96092], [5.72875, 50.95428], [5.74752, 50.96202], [5.75927, 50.95601], [5.74644, 50.94723], [5.72545, 50.92312], [5.72644, 50.91167], [5.71626, 50.90796], [5.69858, 50.91046], [5.67886, 50.88142], [5.64504, 50.87107], [5.64009, 50.84742], [5.65259, 50.82309], [5.70118, 50.80764], [5.68995, 50.79641], [5.70107, 50.7827], [5.68091, 50.75804], [5.69469, 50.75529], [5.72216, 50.76398], [5.73904, 50.75674], [5.74356, 50.7691], [5.76533, 50.78159], [5.77513, 50.78308], [5.80673, 50.7558], [5.84548, 50.76542], [5.84888, 50.75448], [5.88734, 50.77092], [5.89129, 50.75125], [5.89132, 50.75124], [5.95942, 50.7622], [5.97545, 50.75441], [6.01976, 50.75398], [6.02624, 50.77453], [5.97497, 50.79992], [5.98404, 50.80988], [6.00462, 50.80065], [6.02328, 50.81694], [6.01921, 50.84435], [6.05623, 50.8572], [6.05702, 50.85179], [6.07431, 50.84674], [6.07693, 50.86025], [6.08805, 50.87223], [6.07486, 50.89307], [6.09297, 50.92066], [6.01615, 50.93367], [6.02697, 50.98303], [5.95282, 50.98728], [5.90296, 50.97356], [5.90493, 51.00198], [5.87849, 51.01969], [5.86735, 51.05182], [5.9134, 51.06736], [5.9541, 51.03496], [5.98292, 51.07469], [6.16706, 51.15677], [6.17384, 51.19589], [6.07889, 51.17038], [6.07889, 51.24432], [6.16977, 51.33169], [6.22674, 51.36135], [6.22641, 51.39948], [6.20654, 51.40049], [6.21724, 51.48568], [6.18017, 51.54096], [6.09055, 51.60564], [6.11759, 51.65609], [6.02767, 51.6742], [6.04091, 51.71821], [5.95003, 51.7493], [5.98665, 51.76944], [5.94568, 51.82786], [5.99848, 51.83195], [6.06705, 51.86136], [6.10337, 51.84829], [6.16902, 51.84094], [6.11551, 51.89769], [6.15349, 51.90439], [6.21443, 51.86801], [6.29872, 51.86801], [6.30593, 51.84998], [6.40704, 51.82771], [6.38815, 51.87257], [6.47179, 51.85395], [6.50231, 51.86313], [6.58556, 51.89386], [6.68386, 51.91861], [6.72319, 51.89518], [6.82357, 51.96711], [6.83035, 51.9905], [6.68128, 52.05052], [6.76117, 52.11895], [6.83984, 52.11728], [6.97189, 52.20329], [6.9897, 52.2271], [7.03729, 52.22695], [7.06365, 52.23789], [7.02703, 52.27941], [7.07044, 52.37805], [7.03417, 52.40237], [6.99041, 52.47235], [6.94293, 52.43597], [6.69507, 52.488], [6.71641, 52.62905], [6.77307, 52.65375], [7.04557, 52.63318], [7.07253, 52.81083], [7.21694, 53.00742], [7.17898, 53.13817], [7.22681, 53.18165], [7.21679, 53.20058], [7.19052, 53.31866], [7.00198, 53.32672], [6.91025, 53.44221], [5.45168, 54.20039]], [[4.93295, 51.44945], [4.95244, 51.45207], [4.9524, 51.45014], [4.93909, 51.44632], [4.93295, 51.44945]], [[4.91493, 51.4353], [4.91935, 51.43634], [4.92227, 51.44252], [4.91811, 51.44621], [4.92287, 51.44741], [4.92811, 51.4437], [4.92566, 51.44273], [4.92815, 51.43856], [4.92879, 51.44161], [4.93544, 51.44634], [4.94025, 51.44193], [4.93416, 51.44185], [4.93471, 51.43861], [4.94265, 51.44003], [4.93986, 51.43064], [4.92952, 51.42984], [4.92652, 51.43329], [4.91493, 51.4353]]]] } },
22957     { type: "Feature", properties: { wikidata: "Q782", nameEn: "Hawaii", aliases: ["US-HI"], country: "US", groups: ["Q35657", "061", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-177.8563, 29.18961], [-179.49839, 27.86265], [-151.6784, 9.55515], [-154.05867, 45.51124], [-177.5224, 27.7635], [-177.8563, 29.18961]]]] } },
22958     { type: "Feature", properties: { wikidata: "Q797", nameEn: "Alaska", aliases: ["US-AK"], country: "US", groups: ["Q35657", "021", "003", "019", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169.34848, 52.47228], [180, 51.0171], [179.84401, 55.10087], [169.34848, 52.47228]]], [[[-168.95635, 65.98512], [-169.03888, 65.48473], [-172.76104, 63.77445], [-179.55295, 57.62081], [-179.55295, 50.81807], [-133.92876, 54.62289], [-130.61931, 54.70835], [-130.64499, 54.76912], [-130.44184, 54.85377], [-130.27203, 54.97174], [-130.18765, 55.07744], [-130.08035, 55.21556], [-129.97513, 55.28029], [-130.15373, 55.74895], [-130.00857, 55.91344], [-130.00093, 56.00325], [-130.10173, 56.12178], [-130.33965, 56.10849], [-130.77769, 56.36185], [-131.8271, 56.62247], [-133.38523, 58.42773], [-133.84645, 58.73543], [-134.27175, 58.8634], [-134.48059, 59.13231], [-134.55699, 59.1297], [-134.7047, 59.2458], [-135.00267, 59.28745], [-135.03069, 59.56208], [-135.48007, 59.79937], [-136.31566, 59.59083], [-136.22381, 59.55526], [-136.33727, 59.44466], [-136.47323, 59.46617], [-136.52365, 59.16752], [-136.82619, 59.16198], [-137.4925, 58.89415], [-137.60623, 59.24465], [-138.62145, 59.76431], [-138.71149, 59.90728], [-139.05365, 59.99655], [-139.20603, 60.08896], [-139.05831, 60.35205], [-139.68991, 60.33693], [-139.98024, 60.18027], [-140.45648, 60.30919], [-140.5227, 60.22077], [-141.00116, 60.30648], [-140.97446, 84.39275], [-168.25765, 71.99091], [-168.95635, 65.98512]]]] } },
22959     { type: "Feature", properties: { wikidata: "Q3492", nameEn: "Sumatra", aliases: ["ID-SM"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[109.82788, 2.86812], [110.90339, 7.52694], [105.01437, 3.24936], [104.56723, 1.44271], [104.34728, 1.33529], [104.12282, 1.27714], [104.03085, 1.26954], [103.74084, 1.12902], [103.66049, 1.18825], [103.56591, 1.19719], [103.03657, 1.30383], [96.11174, 6.69841], [74.28481, -3.17525], [102.92489, -8.17146], [106.32259, -5.50116], [106.38511, -5.16715], [109.17017, -4.07401], [109.3962, -2.07276], [108.50935, -2.01066], [107.94791, 1.06924], [109.82788, 2.86812]]]] } },
22960     { type: "Feature", properties: { wikidata: "Q3757", nameEn: "Java", aliases: ["ID-JW"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[109.17017, -4.07401], [106.38511, -5.16715], [106.32259, -5.50116], [102.92489, -8.17146], [116.22542, -10.49172], [114.39575, -8.2889], [114.42235, -8.09762], [114.92859, -7.49253], [116.33992, -7.56171], [116.58433, -5.30385], [109.17017, -4.07401]]]] } },
22961     { type: "Feature", properties: { wikidata: "Q3795", nameEn: "Kalimantan", aliases: ["ID-KA"], country: "ID", groups: ["Q36117", "035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[120.02464, 2.83703], [118.06469, 4.16638], [117.67641, 4.16535], [117.47313, 4.18857], [117.25801, 4.35108], [115.90217, 4.37708], [115.58276, 3.93499], [115.53713, 3.14776], [115.11343, 2.82879], [115.1721, 2.49671], [114.80706, 2.21665], [114.80706, 1.92351], [114.57892, 1.5], [114.03788, 1.44787], [113.64677, 1.23933], [113.01448, 1.42832], [113.021, 1.57819], [112.48648, 1.56516], [112.2127, 1.44135], [112.15679, 1.17004], [111.94553, 1.12016], [111.82846, 0.99349], [111.55434, 0.97864], [111.22979, 1.08326], [110.62374, 0.873], [110.49182, 0.88088], [110.35354, 0.98869], [109.66397, 1.60425], [109.66397, 1.79972], [109.57923, 1.80624], [109.53794, 1.91771], [109.62558, 1.99182], [109.82788, 2.86812], [107.94791, 1.06924], [108.50935, -2.01066], [109.3962, -2.07276], [109.17017, -4.07401], [116.58433, -5.30385], [120.02464, 2.83703]]]] } },
22962     { type: "Feature", properties: { wikidata: "Q3803", nameEn: "Lesser Sunda Islands", aliases: ["ID-NU"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[116.96967, -8.01483], [114.92859, -7.49253], [114.42235, -8.09762], [114.39575, -8.2889], [116.22542, -10.49172], [122.14954, -11.52517], [125.68138, -9.85176], [125.09025, -9.46406], [124.97892, -9.19281], [125.04044, -9.17093], [125.09434, -9.19669], [125.18907, -9.16434], [125.18632, -9.03142], [125.11764, -8.96359], [124.97742, -9.08128], [124.94011, -8.85617], [124.46701, -9.13002], [124.45971, -9.30263], [124.38554, -9.3582], [124.35258, -9.43002], [124.3535, -9.48493], [124.28115, -9.50453], [124.28115, -9.42189], [124.21247, -9.36904], [124.14517, -9.42324], [124.10539, -9.41206], [124.04286, -9.34243], [124.04628, -9.22671], [124.33472, -9.11416], [124.92337, -8.75859], [125.87688, -7.49892], [116.96967, -8.01483]]]] } },
22963     { type: "Feature", properties: { wikidata: "Q3812", nameEn: "Sulawesi", aliases: ["ID-SL"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[128.34321, 3.90322], [126.69413, 6.02692], [119.56457, 0.90759], [116.58433, -5.30385], [116.33992, -7.56171], [116.96967, -8.01483], [125.87688, -7.49892], [123.78965, -0.86805], [128.34321, 3.90322]]]] } },
22964     { type: "Feature", properties: { wikidata: "Q3827", nameEn: "Maluku Islands", aliases: ["ID-ML"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[129.63187, 2.21409], [128.34321, 3.90322], [123.78965, -0.86805], [125.87688, -7.49892], [125.58506, -7.95311], [125.87691, -8.31789], [127.42116, -8.22471], [127.55165, -9.05052], [135.49042, -9.2276], [135.35517, -5.01442], [132.8312, -4.70282], [130.8468, -2.61103], [128.40647, -2.30349], [129.71519, -0.24692], [129.63187, 2.21409]]]] } },
22965     { type: "Feature", properties: { wikidata: "Q3845", nameEn: "Western New Guinea", aliases: ["ID-PP"], country: "ID", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["62"] }, geometry: { type: "MultiPolygon", coordinates: [[[[135.49042, -9.2276], [141.01842, -9.35091], [141.01763, -6.90181], [140.90448, -6.85033], [140.85295, -6.72996], [140.99813, -6.3233], [141.02352, 0.08993], [129.63187, 2.21409], [129.71519, -0.24692], [128.40647, -2.30349], [130.8468, -2.61103], [132.8312, -4.70282], [135.35517, -5.01442], [135.49042, -9.2276]]]] } },
22966     { type: "Feature", properties: { wikidata: "Q5765", nameEn: "Balearic Islands", aliases: ["ES-IB"], country: "ES", groups: ["EU", "039", "150", "UN"], callingCodes: ["34 971"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.27707, 35.35051], [5.10072, 39.89531], [3.75438, 42.33445], [-2.27707, 35.35051]]]] } },
22967     { type: "Feature", properties: { wikidata: "Q5823", nameEn: "Ceuta", aliases: ["ES-CE"], country: "ES", groups: ["EA", "EU", "015", "002", "UN"], level: "subterritory", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-5.38491, 35.92591], [-5.37338, 35.88417], [-5.35844, 35.87375], [-5.34379, 35.8711], [-5.21179, 35.90091], [-5.38491, 35.92591]]]] } },
22968     { type: "Feature", properties: { wikidata: "Q5831", nameEn: "Melilla", aliases: ["ES-ML"], country: "ES", groups: ["EA", "EU", "015", "002", "UN"], level: "subterritory", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.91909, 35.33927], [-2.96038, 35.31609], [-2.96648, 35.30475], [-2.96978, 35.29459], [-2.97035, 35.28852], [-2.96507, 35.28801], [-2.96826, 35.28296], [-2.96516, 35.27967], [-2.95431, 35.2728], [-2.95065, 35.26576], [-2.93893, 35.26737], [-2.92272, 35.27509], [-2.91909, 35.33927]]]] } },
22969     { type: "Feature", properties: { wikidata: "Q7835", nameEn: "Crimea", country: "RU", groups: ["151", "150", "UN"], level: "subterritory", callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.5, 44], [36.4883, 45.0488], [36.475, 45.2411], [36.5049, 45.3136], [36.6545, 45.3417], [36.6645, 45.4514], [35.0498, 45.7683], [34.9601, 45.7563], [34.7991, 45.8101], [34.8015, 45.9005], [34.7548, 45.907], [34.6668, 45.9714], [34.6086, 45.9935], [34.5589, 45.9935], [34.5201, 45.951], [34.4873, 45.9427], [34.4415, 45.9599], [34.4122, 46.0025], [34.3391, 46.0611], [34.2511, 46.0532], [34.181, 46.068], [34.1293, 46.1049], [34.0731, 46.1177], [34.0527, 46.1084], [33.9155, 46.1594], [33.8523, 46.1986], [33.7972, 46.2048], [33.7405, 46.1855], [33.646, 46.2303], [33.6152, 46.2261], [33.6385, 46.1415], [33.6147, 46.1356], [33.5732, 46.1032], [33.5909, 46.0601], [33.5597, 46.0307], [31.5, 45.5], [33.5, 44]]]] } },
22970     { type: "Feature", properties: { wikidata: "Q12837", nameEn: "Iberia", level: "sharedLandform" }, geometry: null },
22971     { type: "Feature", properties: { wikidata: "Q14056", nameEn: "Jan Mayen", aliases: ["NO-22"], country: "NO", groups: ["SJ", "154", "150", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-9.18243, 72.23144], [-10.71459, 70.09565], [-5.93364, 70.76368], [-9.18243, 72.23144]]]] } },
22972     { type: "Feature", properties: { wikidata: "Q19188", nameEn: "Mainland China", country: "CN", groups: ["030", "142", "UN"], callingCodes: ["86"] }, geometry: { type: "MultiPolygon", coordinates: [[[[125.6131, 53.07229], [125.17522, 53.20225], [124.46078, 53.21881], [123.86158, 53.49391], [123.26989, 53.54843], [122.85966, 53.47395], [122.35063, 53.49565], [121.39213, 53.31888], [120.85633, 53.28499], [120.0451, 52.7359], [120.04049, 52.58773], [120.46454, 52.63811], [120.71673, 52.54099], [120.61346, 52.32447], [120.77337, 52.20805], [120.65907, 51.93544], [120.10963, 51.671], [119.13553, 50.37412], [119.38598, 50.35162], [119.27996, 50.13348], [119.11003, 50.00276], [118.61623, 49.93809], [117.82343, 49.52696], [117.48208, 49.62324], [117.27597, 49.62544], [116.71193, 49.83813], [116.03781, 48.87014], [116.06565, 48.81716], [115.78876, 48.51781], [115.811, 48.25699], [115.52082, 48.15367], [115.57128, 47.91988], [115.94296, 47.67741], [116.21879, 47.88505], [116.4465, 47.83662], [116.67405, 47.89039], [116.9723, 47.87285], [117.37875, 47.63627], [117.50181, 47.77216], [117.80196, 48.01661], [118.03676, 48.00982], [118.11009, 48.04], [118.22677, 48.03853], [118.29654, 48.00246], [118.55766, 47.99277], [118.7564, 47.76947], [119.12343, 47.66458], [119.13995, 47.53997], [119.35892, 47.48104], [119.31964, 47.42617], [119.54918, 47.29505], [119.56019, 47.24874], [119.62403, 47.24575], [119.71209, 47.19192], [119.85518, 46.92196], [119.91242, 46.90091], [119.89261, 46.66423], [119.80455, 46.67631], [119.77373, 46.62947], [119.68127, 46.59015], [119.65265, 46.62342], [119.42827, 46.63783], [119.32827, 46.61433], [119.24978, 46.64761], [119.10448, 46.65516], [119.00541, 46.74273], [118.92616, 46.72765], [118.89974, 46.77139], [118.8337, 46.77742], [118.78747, 46.68689], [118.30534, 46.73519], [117.69554, 46.50991], [117.60748, 46.59771], [117.41782, 46.57862], [117.36609, 46.36335], [116.83166, 46.38637], [116.75551, 46.33083], [116.58612, 46.30211], [116.26678, 45.96479], [116.24012, 45.8778], [116.27366, 45.78637], [116.16989, 45.68603], [115.60329, 45.44717], [114.94546, 45.37377], [114.74612, 45.43585], [114.54801, 45.38337], [114.5166, 45.27189], [113.70918, 44.72891], [112.74662, 44.86297], [112.4164, 45.06858], [111.98695, 45.09074], [111.76275, 44.98032], [111.40498, 44.3461], [111.96289, 43.81596], [111.93776, 43.68709], [111.79758, 43.6637], [111.59087, 43.51207], [111.0149, 43.3289], [110.4327, 42.78293], [110.08401, 42.6411], [109.89402, 42.63111], [109.452, 42.44842], [109.00679, 42.45302], [108.84489, 42.40246], [107.57258, 42.40898], [107.49681, 42.46221], [107.29755, 42.41395], [107.24774, 42.36107], [106.76517, 42.28741], [105.0123, 41.63188], [104.51667, 41.66113], [104.52258, 41.8706], [103.92804, 41.78246], [102.72403, 42.14675], [102.07645, 42.22519], [101.80515, 42.50074], [100.84979, 42.67087], [100.33297, 42.68231], [99.50671, 42.56535], [97.1777, 42.7964], [96.37926, 42.72055], [96.35658, 42.90363], [95.89543, 43.2528], [95.52594, 43.99353], [95.32891, 44.02407], [95.39772, 44.2805], [95.01191, 44.25274], [94.71959, 44.35284], [94.10003, 44.71016], [93.51161, 44.95964], [91.64048, 45.07408], [90.89169, 45.19667], [90.65114, 45.49314], [90.70907, 45.73437], [91.03026, 46.04194], [90.99672, 46.14207], [90.89639, 46.30711], [91.07696, 46.57315], [91.0147, 46.58171], [91.03649, 46.72916], [90.84035, 46.99525], [90.76108, 46.99399], [90.48542, 47.30438], [90.48854, 47.41826], [90.33598, 47.68303], [90.10871, 47.7375], [90.06512, 47.88177], [89.76624, 47.82745], [89.55453, 48.0423], [89.0711, 47.98528], [88.93186, 48.10263], [88.8011, 48.11302], [88.58316, 48.21893], [88.58939, 48.34531], [87.96361, 48.58478], [88.0788, 48.71436], [87.73822, 48.89582], [87.88171, 48.95853], [87.81333, 49.17354], [87.48983, 49.13794], [87.478, 49.07403], [87.28386, 49.11626], [86.87238, 49.12432], [86.73568, 48.99918], [86.75343, 48.70331], [86.38069, 48.46064], [85.73581, 48.3939], [85.5169, 48.05493], [85.61067, 47.49753], [85.69696, 47.2898], [85.54294, 47.06171], [85.22443, 47.04816], [84.93995, 46.87399], [84.73077, 47.01394], [83.92184, 46.98912], [83.04622, 47.19053], [82.21792, 45.56619], [82.58474, 45.40027], [82.51374, 45.1755], [81.73278, 45.3504], [80.11169, 45.03352], [79.8987, 44.89957], [80.38384, 44.63073], [80.40229, 44.23319], [80.40031, 44.10986], [80.75156, 43.44948], [80.69718, 43.32589], [80.77771, 43.30065], [80.78817, 43.14235], [80.62913, 43.141], [80.3735, 43.01557], [80.58999, 42.9011], [80.38169, 42.83142], [80.26886, 42.8366], [80.16892, 42.61137], [80.26841, 42.23797], [80.17807, 42.21166], [80.17842, 42.03211], [79.92977, 42.04113], [78.3732, 41.39603], [78.15757, 41.38565], [78.12873, 41.23091], [77.81287, 41.14307], [77.76206, 41.01574], [77.52723, 41.00227], [77.3693, 41.0375], [77.28004, 41.0033], [76.99302, 41.0696], [76.75681, 40.95354], [76.5261, 40.46114], [76.33659, 40.3482], [75.96168, 40.38064], [75.91361, 40.2948], [75.69663, 40.28642], [75.5854, 40.66874], [75.22834, 40.45382], [75.08243, 40.43945], [74.82013, 40.52197], [74.78168, 40.44886], [74.85996, 40.32857], [74.69875, 40.34668], [74.35063, 40.09742], [74.25533, 40.13191], [73.97049, 40.04378], [73.83006, 39.76136], [73.9051, 39.75073], [73.92354, 39.69565], [73.94683, 39.60733], [73.87018, 39.47879], [73.59831, 39.46425], [73.59241, 39.40843], [73.5004, 39.38402], [73.55396, 39.3543], [73.54572, 39.27567], [73.60638, 39.24534], [73.75823, 39.023], [73.81728, 39.04007], [73.82964, 38.91517], [73.7445, 38.93867], [73.7033, 38.84782], [73.80656, 38.66449], [73.79806, 38.61106], [73.97933, 38.52945], [74.17022, 38.65504], [74.51217, 38.47034], [74.69619, 38.42947], [74.69894, 38.22155], [74.80331, 38.19889], [74.82665, 38.07359], [74.9063, 38.03033], [74.92416, 37.83428], [75.00935, 37.77486], [74.8912, 37.67576], [74.94338, 37.55501], [75.06011, 37.52779], [75.15899, 37.41443], [75.09719, 37.37297], [75.12328, 37.31839], [74.88887, 37.23275], [74.80605, 37.21565], [74.49981, 37.24518], [74.56453, 37.03023], [75.13839, 37.02622], [75.40481, 36.95382], [75.45562, 36.71971], [75.72737, 36.7529], [75.92391, 36.56986], [76.0324, 36.41198], [76.00906, 36.17511], [75.93028, 36.13136], [76.15325, 35.9264], [76.14913, 35.82848], [76.33453, 35.84296], [76.50961, 35.8908], [76.77323, 35.66062], [76.84539, 35.67356], [76.96624, 35.5932], [77.44277, 35.46132], [77.70232, 35.46244], [77.80532, 35.52058], [78.11664, 35.48022], [78.03466, 35.3785], [78.00033, 35.23954], [78.22692, 34.88771], [78.18435, 34.7998], [78.27781, 34.61484], [78.54964, 34.57283], [78.56475, 34.50835], [78.74465, 34.45174], [79.05364, 34.32482], [78.99802, 34.3027], [78.91769, 34.15452], [78.66225, 34.08858], [78.65657, 34.03195], [78.73367, 34.01121], [78.77349, 33.73871], [78.67599, 33.66445], [78.73636, 33.56521], [79.15252, 33.17156], [79.14016, 33.02545], [79.46562, 32.69668], [79.26768, 32.53277], [79.13174, 32.47766], [79.0979, 32.38051], [78.99322, 32.37948], [78.96713, 32.33655], [78.7831, 32.46873], [78.73916, 32.69438], [78.38897, 32.53938], [78.4645, 32.45367], [78.49609, 32.2762], [78.68754, 32.10256], [78.74404, 32.00384], [78.78036, 31.99478], [78.69933, 31.78723], [78.84516, 31.60631], [78.71032, 31.50197], [78.77898, 31.31209], [78.89344, 31.30481], [79.01931, 31.42817], [79.14016, 31.43403], [79.30694, 31.17357], [79.59884, 30.93943], [79.93255, 30.88288], [80.20721, 30.58541], [80.54504, 30.44936], [80.83343, 30.32023], [81.03953, 30.20059], [81.12842, 30.01395], [81.24362, 30.0126], [81.29032, 30.08806], [81.2623, 30.14596], [81.33355, 30.15303], [81.39928, 30.21862], [81.41018, 30.42153], [81.5459, 30.37688], [81.62033, 30.44703], [81.99082, 30.33423], [82.10135, 30.35439], [82.10757, 30.23745], [82.19475, 30.16884], [82.16984, 30.0692], [82.38622, 30.02608], [82.5341, 29.9735], [82.73024, 29.81695], [83.07116, 29.61957], [83.28131, 29.56813], [83.44787, 29.30513], [83.63156, 29.16249], [83.82303, 29.30513], [83.97559, 29.33091], [84.18107, 29.23451], [84.24801, 29.02783], [84.2231, 28.89571], [84.47528, 28.74023], [84.62317, 28.73887], [84.85511, 28.58041], [85.06059, 28.68562], [85.19135, 28.62825], [85.18668, 28.54076], [85.10729, 28.34092], [85.38127, 28.28336], [85.4233, 28.32996], [85.59765, 28.30529], [85.60854, 28.25045], [85.69105, 28.38475], [85.71907, 28.38064], [85.74864, 28.23126], [85.84672, 28.18187], [85.90743, 28.05144], [85.97813, 27.99023], [85.94946, 27.9401], [86.06309, 27.90021], [86.12069, 27.93047], [86.08333, 28.02121], [86.088, 28.09264], [86.18607, 28.17364], [86.22966, 27.9786], [86.42736, 27.91122], [86.51609, 27.96623], [86.56265, 28.09569], [86.74181, 28.10638], [86.75582, 28.04182], [87.03757, 27.94835], [87.11696, 27.84104], [87.56996, 27.84517], [87.72718, 27.80938], [87.82681, 27.95248], [88.13378, 27.88015], [88.1278, 27.95417], [88.25332, 27.9478], [88.54858, 28.06057], [88.63235, 28.12356], [88.83559, 28.01936], [88.88091, 27.85192], [88.77517, 27.45415], [88.82981, 27.38814], [88.91901, 27.32483], [88.93678, 27.33777], [88.96947, 27.30319], [89.00216, 27.32532], [88.95355, 27.4106], [88.97213, 27.51671], [89.0582, 27.60985], [89.12825, 27.62502], [89.59525, 28.16433], [89.79762, 28.23979], [90.13387, 28.19178], [90.58842, 28.02838], [90.69894, 28.07784], [91.20019, 27.98715], [91.25779, 28.07509], [91.46327, 28.0064], [91.48973, 27.93903], [91.5629, 27.84823], [91.6469, 27.76358], [91.84722, 27.76325], [91.87057, 27.7195], [92.27432, 27.89077], [92.32101, 27.79363], [92.42538, 27.80092], [92.7275, 27.98662], [92.73025, 28.05814], [92.65472, 28.07632], [92.67486, 28.15018], [92.93075, 28.25671], [93.14635, 28.37035], [93.18069, 28.50319], [93.44621, 28.67189], [93.72797, 28.68821], [94.35897, 29.01965], [94.2752, 29.11687], [94.69318, 29.31739], [94.81353, 29.17804], [95.0978, 29.14446], [95.11291, 29.09527], [95.2214, 29.10727], [95.26122, 29.07727], [95.3038, 29.13847], [95.41091, 29.13007], [95.50842, 29.13487], [95.72086, 29.20797], [95.75149, 29.32063], [95.84899, 29.31464], [96.05361, 29.38167], [96.31316, 29.18643], [96.18682, 29.11087], [96.20467, 29.02325], [96.3626, 29.10607], [96.61391, 28.72742], [96.40929, 28.51526], [96.48895, 28.42955], [96.6455, 28.61657], [96.85561, 28.4875], [96.88445, 28.39452], [96.98882, 28.32564], [97.1289, 28.3619], [97.34547, 28.21385], [97.41729, 28.29783], [97.47085, 28.2688], [97.50518, 28.49716], [97.56835, 28.55628], [97.70705, 28.5056], [97.79632, 28.33168], [97.90069, 28.3776], [98.15337, 28.12114], [98.13964, 27.9478], [98.32641, 27.51385], [98.42529, 27.55404], [98.43353, 27.67086], [98.69582, 27.56499], [98.7333, 26.85615], [98.77547, 26.61994], [98.72741, 26.36183], [98.67797, 26.24487], [98.7329, 26.17218], [98.66884, 26.09165], [98.63128, 26.15492], [98.57085, 26.11547], [98.60763, 26.01512], [98.70818, 25.86241], [98.63128, 25.79937], [98.54064, 25.85129], [98.40606, 25.61129], [98.31268, 25.55307], [98.25774, 25.6051], [98.16848, 25.62739], [98.18084, 25.56298], [98.12591, 25.50722], [98.14925, 25.41547], [97.92541, 25.20815], [97.83614, 25.2715], [97.77023, 25.11492], [97.72216, 25.08508], [97.72903, 24.91332], [97.79949, 24.85655], [97.76481, 24.8289], [97.73127, 24.83015], [97.70181, 24.84557], [97.64354, 24.79171], [97.56648, 24.76475], [97.56383, 24.75535], [97.5542, 24.74943], [97.54675, 24.74202], [97.56525, 24.72838], [97.56286, 24.54535], [97.52757, 24.43748], [97.60029, 24.4401], [97.66998, 24.45288], [97.7098, 24.35658], [97.65624, 24.33781], [97.66723, 24.30027], [97.71941, 24.29652], [97.76799, 24.26365], [97.72998, 24.2302], [97.72799, 24.18883], [97.75305, 24.16902], [97.72903, 24.12606], [97.62363, 24.00506], [97.5247, 23.94032], [97.64667, 23.84574], [97.72302, 23.89288], [97.79456, 23.94836], [97.79416, 23.95663], [97.84328, 23.97603], [97.86545, 23.97723], [97.88811, 23.97446], [97.8955, 23.97758], [97.89676, 23.97931], [97.89683, 23.98389], [97.88814, 23.98605], [97.88414, 23.99405], [97.88616, 24.00463], [97.90998, 24.02094], [97.93951, 24.01953], [97.98691, 24.03897], [97.99583, 24.04932], [98.04709, 24.07616], [98.05302, 24.07408], [98.05671, 24.07961], [98.0607, 24.07812], [98.06703, 24.08028], [98.07806, 24.07988], [98.20666, 24.11406], [98.54476, 24.13119], [98.59256, 24.08371], [98.85319, 24.13042], [98.87998, 24.15624], [98.89632, 24.10612], [98.67797, 23.9644], [98.68209, 23.80492], [98.79607, 23.77947], [98.82933, 23.72921], [98.81775, 23.694], [98.88396, 23.59555], [98.80294, 23.5345], [98.82877, 23.47908], [98.87683, 23.48995], [98.92104, 23.36946], [98.87573, 23.33038], [98.93958, 23.31414], [98.92515, 23.29535], [98.88597, 23.18656], [99.05975, 23.16382], [99.04601, 23.12215], [99.25741, 23.09025], [99.34127, 23.13099], [99.52214, 23.08218], [99.54218, 22.90014], [99.43537, 22.94086], [99.45654, 22.85726], [99.31243, 22.73893], [99.38247, 22.57544], [99.37972, 22.50188], [99.28771, 22.4105], [99.17318, 22.18025], [99.19176, 22.16983], [99.1552, 22.15874], [99.33166, 22.09656], [99.47585, 22.13345], [99.85351, 22.04183], [99.96612, 22.05965], [99.99084, 21.97053], [99.94003, 21.82782], [99.98654, 21.71064], [100.04956, 21.66843], [100.12679, 21.70539], [100.17486, 21.65306], [100.10757, 21.59945], [100.12542, 21.50365], [100.1625, 21.48704], [100.18447, 21.51898], [100.25863, 21.47043], [100.35201, 21.53176], [100.42892, 21.54325], [100.4811, 21.46148], [100.57861, 21.45637], [100.72143, 21.51898], [100.87265, 21.67396], [101.11744, 21.77659], [101.15156, 21.56129], [101.2124, 21.56422], [101.19349, 21.41959], [101.26912, 21.36482], [101.2229, 21.23271], [101.29326, 21.17254], [101.54563, 21.25668], [101.6068, 21.23329], [101.59491, 21.18621], [101.60886, 21.17947], [101.66977, 21.20004], [101.70548, 21.14911], [101.7622, 21.14813], [101.79266, 21.19025], [101.76745, 21.21571], [101.83887, 21.20983], [101.84412, 21.25291], [101.74014, 21.30967], [101.74224, 21.48276], [101.7727, 21.51794], [101.7475, 21.5873], [101.80001, 21.57461], [101.83257, 21.61562], [101.74555, 21.72852], [101.7791, 21.83019], [101.62566, 21.96574], [101.57525, 22.13026], [101.60675, 22.13513], [101.53638, 22.24794], [101.56789, 22.28876], [101.61306, 22.27515], [101.68973, 22.46843], [101.7685, 22.50337], [101.86828, 22.38397], [101.90714, 22.38688], [101.91344, 22.44417], [101.98487, 22.42766], [102.03633, 22.46164], [102.1245, 22.43372], [102.14099, 22.40092], [102.16621, 22.43336], [102.26428, 22.41321], [102.25339, 22.4607], [102.41061, 22.64184], [102.38415, 22.67919], [102.42618, 22.69212], [102.46665, 22.77108], [102.51802, 22.77969], [102.57095, 22.7036], [102.60675, 22.73376], [102.8636, 22.60735], [102.9321, 22.48659], [103.0722, 22.44775], [103.07843, 22.50097], [103.17961, 22.55705], [103.15782, 22.59873], [103.18895, 22.64471], [103.28079, 22.68063], [103.32282, 22.8127], [103.43179, 22.75816], [103.43646, 22.70648], [103.52675, 22.59155], [103.57812, 22.65764], [103.56255, 22.69499], [103.64506, 22.79979], [103.87904, 22.56683], [103.93286, 22.52703], [103.94513, 22.52553], [103.95191, 22.5134], [103.96352, 22.50584], [103.96783, 22.51173], [103.97384, 22.50634], [103.99247, 22.51958], [104.01088, 22.51823], [104.03734, 22.72945], [104.11384, 22.80363], [104.27084, 22.8457], [104.25683, 22.76534], [104.35593, 22.69353], [104.47225, 22.75813], [104.58122, 22.85571], [104.60457, 22.81841], [104.65283, 22.83419], [104.72755, 22.81984], [104.77114, 22.90017], [104.84942, 22.93631], [104.86765, 22.95178], [104.8334, 23.01484], [104.79478, 23.12934], [104.87382, 23.12854], [104.87992, 23.17141], [104.91435, 23.18666], [104.9486, 23.17235], [104.96532, 23.20463], [104.98712, 23.19176], [105.07002, 23.26248], [105.11672, 23.25247], [105.17276, 23.28679], [105.22569, 23.27249], [105.32376, 23.39684], [105.40782, 23.28107], [105.42805, 23.30824], [105.49966, 23.20669], [105.56037, 23.16806], [105.57594, 23.075], [105.72382, 23.06641], [105.8726, 22.92756], [105.90119, 22.94168], [105.99568, 22.94178], [106.00179, 22.99049], [106.19705, 22.98475], [106.27022, 22.87722], [106.34961, 22.86718], [106.49749, 22.91164], [106.51306, 22.94891], [106.55976, 22.92311], [106.60179, 22.92884], [106.6516, 22.86862], [106.6734, 22.89587], [106.71387, 22.88296], [106.71128, 22.85982], [106.78422, 22.81532], [106.81271, 22.8226], [106.83685, 22.8098], [106.82404, 22.7881], [106.76293, 22.73491], [106.72321, 22.63606], [106.71698, 22.58432], [106.65316, 22.5757], [106.61269, 22.60301], [106.58395, 22.474], [106.55665, 22.46498], [106.57221, 22.37], [106.55976, 22.34841], [106.6516, 22.33977], [106.69986, 22.22309], [106.67495, 22.1885], [106.6983, 22.15102], [106.70142, 22.02409], [106.68274, 21.99811], [106.69276, 21.96013], [106.72551, 21.97923], [106.74345, 22.00965], [106.81038, 21.97934], [106.9178, 21.97357], [106.92714, 21.93459], [106.97228, 21.92592], [106.99252, 21.95191], [107.05634, 21.92303], [107.06101, 21.88982], [107.00964, 21.85948], [107.02615, 21.81981], [107.10771, 21.79879], [107.20734, 21.71493], [107.24625, 21.7077], [107.29296, 21.74674], [107.35834, 21.6672], [107.35989, 21.60063], [107.38636, 21.59774], [107.41593, 21.64839], [107.47197, 21.6672], [107.49532, 21.62958], [107.49065, 21.59774], [107.54047, 21.5934], [107.56537, 21.61945], [107.66967, 21.60787], [107.80355, 21.66141], [107.86114, 21.65128], [107.90006, 21.5905], [107.92652, 21.58906], [107.95232, 21.5388], [107.96774, 21.53601], [107.97074, 21.54072], [107.97383, 21.53961], [107.97932, 21.54503], [108.02926, 21.54997], [108.0569, 21.53604], [108.10003, 21.47338], [108.00365, 17.98159], [111.60491, 13.57105], [118.41371, 24.06775], [118.11703, 24.39734], [118.28244, 24.51231], [118.35291, 24.51645], [118.42453, 24.54644], [118.56434, 24.49266], [120.49232, 25.22863], [121.03532, 26.8787], [123.5458, 31.01942], [122.29378, 31.76513], [122.80525, 33.30571], [123.85601, 37.49093], [123.90497, 38.79949], [124.17532, 39.8232], [124.23201, 39.9248], [124.35029, 39.95639], [124.37089, 40.03004], [124.3322, 40.05573], [124.38556, 40.11047], [124.40719, 40.13655], [124.86913, 40.45387], [125.71172, 40.85223], [125.76869, 40.87908], [126.00335, 40.92835], [126.242, 41.15454], [126.53189, 41.35206], [126.60631, 41.65565], [126.90729, 41.79955], [127.17841, 41.59714], [127.29712, 41.49473], [127.92943, 41.44291], [128.02633, 41.42103], [128.03311, 41.39232], [128.12967, 41.37931], [128.18546, 41.41279], [128.20061, 41.40895], [128.30716, 41.60322], [128.15119, 41.74568], [128.04487, 42.01769], [128.94007, 42.03537], [128.96068, 42.06657], [129.15178, 42.17224], [129.22285, 42.26491], [129.22423, 42.3553], [129.28541, 42.41574], [129.42882, 42.44702], [129.54701, 42.37254], [129.60482, 42.44461], [129.72541, 42.43739], [129.75294, 42.59409], [129.77183, 42.69435], [129.7835, 42.76521], [129.80719, 42.79218], [129.83277, 42.86746], [129.85261, 42.96494], [129.8865, 43.00395], [129.95082, 43.01051], [129.96409, 42.97306], [130.12957, 42.98361], [130.09764, 42.91425], [130.26095, 42.9027], [130.23068, 42.80125], [130.2385, 42.71127], [130.41826, 42.6011], [130.44361, 42.54849], [130.50123, 42.61636], [130.55143, 42.52158], [130.62107, 42.58413], [130.56576, 42.68925], [130.40213, 42.70788], [130.44361, 42.76205], [130.66524, 42.84753], [131.02438, 42.86518], [131.02668, 42.91246], [131.135, 42.94114], [131.10274, 43.04734], [131.20414, 43.13654], [131.19031, 43.21385], [131.30324, 43.39498], [131.29402, 43.46695], [131.19492, 43.53047], [131.21105, 43.82383], [131.26176, 43.94011], [131.23583, 43.96085], [131.25484, 44.03131], [131.30365, 44.04262], [131.1108, 44.70266], [130.95639, 44.85154], [131.48415, 44.99513], [131.68466, 45.12374], [131.66852, 45.2196], [131.76532, 45.22609], [131.86903, 45.33636], [131.99417, 45.2567], [132.83978, 45.05916], [132.96373, 45.0212], [133.12293, 45.1332], [133.09279, 45.25693], [133.19419, 45.51913], [133.41083, 45.57723], [133.48457, 45.86203], [133.60442, 45.90053], [133.67569, 45.9759], [133.72695, 46.05576], [133.68047, 46.14697], [133.88097, 46.25066], [133.91496, 46.4274], [133.84104, 46.46681], [134.03538, 46.75668], [134.20016, 47.33458], [134.50898, 47.4812], [134.7671, 47.72051], [134.55508, 47.98651], [134.67098, 48.1564], [134.75328, 48.36763], [134.49516, 48.42884], [132.66989, 47.96491], [132.57309, 47.71741], [131.90448, 47.68011], [131.2635, 47.73325], [131.09871, 47.6852], [130.95985, 47.6957], [130.90915, 47.90623], [130.65103, 48.10052], [130.84462, 48.30942], [130.52147, 48.61745], [130.66946, 48.88251], [130.43232, 48.90844], [130.2355, 48.86741], [129.85416, 49.11067], [129.67598, 49.29596], [129.50685, 49.42398], [129.40398, 49.44194], [129.35317, 49.3481], [129.23232, 49.40353], [129.11153, 49.36813], [128.72896, 49.58676], [127.83476, 49.5748], [127.53516, 49.84306], [127.49299, 50.01251], [127.60515, 50.23503], [127.37384, 50.28393], [127.36009, 50.43787], [127.28765, 50.46585], [127.36335, 50.58306], [127.28165, 50.72075], [127.14586, 50.91152], [126.93135, 51.0841], [126.90369, 51.3238], [126.68349, 51.70607], [126.44606, 51.98254], [126.558, 52.13738], [125.6131, 53.07229]], [[113.56865, 22.20973], [113.57123, 22.20416], [113.60504, 22.20464], [113.63011, 22.10782], [113.57191, 22.07696], [113.54839, 22.10909], [113.54942, 22.14519], [113.54093, 22.15497], [113.52659, 22.18271], [113.53552, 22.20607], [113.53301, 22.21235], [113.53591, 22.21369], [113.54093, 22.21314], [113.54333, 22.21688], [113.5508, 22.21672], [113.56865, 22.20973]], [[114.50148, 22.15017], [113.92195, 22.13873], [113.83338, 22.1826], [113.81621, 22.2163], [113.86771, 22.42972], [114.03113, 22.5065], [114.05438, 22.5026], [114.05729, 22.51104], [114.06272, 22.51617], [114.07267, 22.51855], [114.07817, 22.52997], [114.08606, 22.53276], [114.09048, 22.53716], [114.09692, 22.53435], [114.1034, 22.5352], [114.11181, 22.52878], [114.11656, 22.53415], [114.12665, 22.54003], [114.13823, 22.54319], [114.1482, 22.54091], [114.15123, 22.55163], [114.1597, 22.56041], [114.17247, 22.55944], [114.18338, 22.55444], [114.20655, 22.55706], [114.22185, 22.55343], [114.22888, 22.5436], [114.25154, 22.55977], [114.44998, 22.55977], [114.50148, 22.15017]]]] } },
22973     { type: "Feature", properties: { wikidata: "Q22890", nameEn: "Ireland", level: "sharedLandform" }, geometry: null },
22974     { type: "Feature", properties: { wikidata: "Q23666", nameEn: "Great Britain", country: "GB", level: "sharedLandform" }, geometry: null },
22975     { type: "Feature", properties: { wikidata: "Q23681", nameEn: "Northern Cyprus", groups: ["Q644636", "145", "142"], driveSide: "left", callingCodes: ["90 392"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.67678, 35.03866], [33.67742, 35.05963], [33.68474, 35.06602], [33.69095, 35.06237], [33.70861, 35.07644], [33.7161, 35.07279], [33.70209, 35.04882], [33.71482, 35.03722], [33.73824, 35.05321], [33.76106, 35.04253], [33.78581, 35.05104], [33.82067, 35.07826], [33.84168, 35.06823], [33.8541, 35.07201], [33.87479, 35.08881], [33.87097, 35.09389], [33.87622, 35.10457], [33.87224, 35.12293], [33.88561, 35.12449], [33.88943, 35.12007], [33.88737, 35.11408], [33.89853, 35.11377], [33.91789, 35.08688], [33.91299, 35.07579], [33.90247, 35.07686], [33.89485, 35.06873], [33.88367, 35.07877], [33.85261, 35.0574], [33.8355, 35.05777], [33.82051, 35.0667], [33.8012, 35.04786], [33.81524, 35.04192], [33.83055, 35.02865], [33.82875, 35.01685], [33.84045, 35.00616], [33.85216, 35.00579], [33.85891, 35.001], [33.85621, 34.98956], [33.83505, 34.98108], [33.84811, 34.97075], [33.86432, 34.97592], [33.90075, 34.96623], [33.98684, 34.76642], [35.48515, 34.70851], [35.51152, 36.10954], [32.82353, 35.70297], [32.46489, 35.48584], [32.60361, 35.16647], [32.64864, 35.19967], [32.70947, 35.18328], [32.70779, 35.14127], [32.85733, 35.07742], [32.86406, 35.1043], [32.94471, 35.09422], [33.01192, 35.15639], [33.08249, 35.17319], [33.11105, 35.15639], [33.15138, 35.19504], [33.27068, 35.16815], [33.3072, 35.16816], [33.31955, 35.18096], [33.35056, 35.18328], [33.34964, 35.17803], [33.35596, 35.17942], [33.35612, 35.17402], [33.36569, 35.17479], [33.3717, 35.1788], [33.37248, 35.18698], [33.38575, 35.2018], [33.4076, 35.20062], [33.41675, 35.16325], [33.46813, 35.10564], [33.48136, 35.0636], [33.47825, 35.04103], [33.45178, 35.02078], [33.45256, 35.00288], [33.47666, 35.00701], [33.48915, 35.06594], [33.53975, 35.08151], [33.57478, 35.06049], [33.567, 35.04803], [33.59658, 35.03635], [33.61215, 35.0527], [33.63765, 35.03869], [33.67678, 35.03866]]]] } },
22976     { type: "Feature", properties: { wikidata: "Q25231", nameEn: "Svalbard", aliases: ["NO-21"], country: "NO", groups: ["SJ", "154", "150", "UN"], level: "subterritory", callingCodes: ["47 79"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-7.49892, 77.24208], [32.07813, 72.01005], [36.85549, 84.09565], [-7.49892, 77.24208]]]] } },
22977     { type: "Feature", properties: { wikidata: "Q25263", nameEn: "Azores", aliases: ["PT-20"], country: "PT", groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"], callingCodes: ["351"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-23.12984, 40.26428], [-36.43765, 41.39418], [-22.54767, 33.34416], [-23.12984, 40.26428]]]] } },
22978     { type: "Feature", properties: { wikidata: "Q25359", nameEn: "Navassa Island", aliases: ["UM-76"], country: "US", groups: ["UM", "Q1352230", "029", "003", "419", "019", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-74.7289, 18.71009], [-75.71816, 18.46438], [-74.76465, 18.06252], [-74.7289, 18.71009]]]] } },
22979     { type: "Feature", properties: { wikidata: "Q25396", nameEn: "Bonaire", aliases: ["BQ-BO", "NL-BQ1"], country: "NL", groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], level: "subterritory", callingCodes: ["599 7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-67.89186, 12.4116], [-68.90012, 12.62309], [-68.33524, 11.78151], [-68.01417, 11.77722], [-67.89186, 12.4116]]]] } },
22980     { type: "Feature", properties: { wikidata: "Q25528", nameEn: "Saba", aliases: ["BQ-SA", "NL-BQ2"], country: "NL", groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], level: "subterritory", callingCodes: ["599 4"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.07669, 17.79659], [-63.81314, 17.95045], [-63.22932, 17.32592], [-63.07669, 17.79659]]]] } },
22981     { type: "Feature", properties: { wikidata: "Q26180", nameEn: "Sint Eustatius", aliases: ["BQ-SE", "NL-BQ3"], country: "NL", groups: ["Q1451600", "BQ", "029", "003", "419", "019", "UN"], level: "subterritory", callingCodes: ["599 3"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.07669, 17.79659], [-63.34999, 16.94218], [-62.76692, 17.64353], [-63.07669, 17.79659]]]] } },
22982     { type: "Feature", properties: { wikidata: "Q26253", nameEn: "Madeira", aliases: ["PT-30"], country: "PT", groups: ["Q3320166", "Q2914565", "Q105472", "EU", "039", "150", "UN"], callingCodes: ["351"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-19.30302, 33.65304], [-16.04789, 29.65076], [-11.68307, 33.12333], [-19.30302, 33.65304]]]] } },
22983     { type: "Feature", properties: { wikidata: "Q26927", nameEn: "Lakshadweep", aliases: ["IN-LD"], country: "IN", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["91"] }, geometry: { type: "MultiPolygon", coordinates: [[[[67.64074, 11.57295], [76.59015, 5.591], [72.67494, 13.58102], [67.64074, 11.57295]]]] } },
22984     { type: "Feature", properties: { wikidata: "Q27329", nameEn: "Asian Russia", country: "RU", groups: ["142", "UN"], callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-179.99933, 64.74703], [-172.76104, 63.77445], [-169.03888, 65.48473], [-168.95635, 65.98512], [-168.25765, 71.99091], [-179.9843, 71.90735], [-179.99933, 64.74703]]], [[[59.99809, 51.98263], [60.19925, 51.99173], [60.48915, 52.15175], [60.72581, 52.15538], [60.78201, 52.22067], [61.05417, 52.35096], [60.98021, 52.50068], [60.84709, 52.52228], [60.84118, 52.63912], [60.71693, 52.66245], [60.71989, 52.75923], [61.05842, 52.92217], [61.23462, 53.03227], [62.0422, 52.96105], [62.12799, 52.99133], [62.14574, 53.09626], [61.19024, 53.30536], [61.14291, 53.41481], [61.29082, 53.50992], [61.37957, 53.45887], [61.57185, 53.50112], [61.55706, 53.57144], [60.90626, 53.62937], [61.22574, 53.80268], [61.14283, 53.90063], [60.99796, 53.93699], [61.26863, 53.92797], [61.3706, 54.08464], [61.47603, 54.08048], [61.56941, 53.95703], [61.65318, 54.02445], [62.03913, 53.94768], [62.00966, 54.04134], [62.38535, 54.03961], [62.45931, 53.90737], [62.56876, 53.94047], [62.58651, 54.05871], [63.80604, 54.27079], [63.91224, 54.20013], [64.02715, 54.22679], [63.97686, 54.29763], [64.97216, 54.4212], [65.11033, 54.33028], [65.24663, 54.35721], [65.20174, 54.55216], [68.21308, 54.98645], [68.26661, 55.09226], [68.19206, 55.18823], [68.90865, 55.38148], [69.34224, 55.36344], [69.74917, 55.35545], [70.19179, 55.1476], [70.76493, 55.3027], [70.96009, 55.10558], [71.08288, 54.71253], [71.24185, 54.64965], [71.08706, 54.33376], [71.10379, 54.13326], [71.96141, 54.17736], [72.17477, 54.36303], [72.43415, 53.92685], [72.71026, 54.1161], [73.37963, 53.96132], [73.74778, 54.07194], [73.68921, 53.86522], [73.25412, 53.61532], [73.39218, 53.44623], [75.07405, 53.80831], [75.43398, 53.98652], [75.3668, 54.07439], [76.91052, 54.4677], [76.82266, 54.1798], [76.44076, 54.16017], [76.54243, 53.99329], [77.90383, 53.29807], [79.11255, 52.01171], [80.08138, 50.77658], [80.4127, 50.95581], [80.44819, 51.20855], [80.80318, 51.28262], [81.16999, 51.15662], [81.06091, 50.94833], [81.41248, 50.97524], [81.46581, 50.77658], [81.94999, 50.79307], [82.55443, 50.75412], [83.14607, 51.00796], [83.8442, 50.87375], [84.29385, 50.27257], [84.99198, 50.06793], [85.24047, 49.60239], [86.18709, 49.50259], [86.63674, 49.80136], [86.79056, 49.74787], [86.61307, 49.60239], [86.82606, 49.51796], [87.03071, 49.25142], [87.31465, 49.23603], [87.28386, 49.11626], [87.478, 49.07403], [87.48983, 49.13794], [87.81333, 49.17354], [87.98977, 49.18147], [88.15543, 49.30314], [88.17223, 49.46934], [88.42449, 49.48821], [88.82499, 49.44808], [89.70687, 49.72535], [89.59711, 49.90851], [91.86048, 50.73734], [92.07173, 50.69585], [92.44714, 50.78762], [93.01109, 50.79001], [92.99595, 50.63183], [94.30823, 50.57498], [94.39258, 50.22193], [94.49477, 50.17832], [94.6121, 50.04239], [94.97166, 50.04725], [95.02465, 49.96941], [95.74757, 49.97915], [95.80056, 50.04239], [96.97388, 49.88413], [97.24639, 49.74737], [97.56811, 49.84265], [97.56432, 49.92801], [97.76871, 49.99861], [97.85197, 49.91339], [98.29481, 50.33561], [98.31373, 50.4996], [98.06393, 50.61262], [97.9693, 50.78044], [98.01472, 50.86652], [97.83305, 51.00248], [98.05257, 51.46696], [98.22053, 51.46579], [98.33222, 51.71832], [98.74142, 51.8637], [98.87768, 52.14563], [99.27888, 51.96876], [99.75578, 51.90108], [99.89203, 51.74903], [100.61116, 51.73028], [101.39085, 51.45753], [101.5044, 51.50467], [102.14032, 51.35566], [102.32194, 50.67982], [102.71178, 50.38873], [103.70343, 50.13952], [105.32528, 50.4648], [106.05562, 50.40582], [106.07865, 50.33474], [106.47156, 50.31909], [106.49628, 50.32436], [106.51122, 50.34408], [106.58373, 50.34044], [106.80326, 50.30177], [107.00007, 50.1977], [107.1174, 50.04239], [107.36407, 49.97612], [107.96116, 49.93191], [107.95387, 49.66659], [108.27937, 49.53167], [108.53969, 49.32325], [109.18017, 49.34709], [109.51325, 49.22859], [110.24373, 49.16676], [110.39891, 49.25083], [110.64493, 49.1816], [113.02647, 49.60772], [113.20216, 49.83356], [114.325, 50.28098], [114.9703, 50.19254], [115.26068, 49.97367], [115.73602, 49.87688], [116.22402, 50.04477], [116.62502, 49.92919], [116.71193, 49.83813], [117.27597, 49.62544], [117.48208, 49.62324], [117.82343, 49.52696], [118.61623, 49.93809], [119.11003, 50.00276], [119.27996, 50.13348], [119.38598, 50.35162], [119.13553, 50.37412], [120.10963, 51.671], [120.65907, 51.93544], [120.77337, 52.20805], [120.61346, 52.32447], [120.71673, 52.54099], [120.46454, 52.63811], [120.04049, 52.58773], [120.0451, 52.7359], [120.85633, 53.28499], [121.39213, 53.31888], [122.35063, 53.49565], [122.85966, 53.47395], [123.26989, 53.54843], [123.86158, 53.49391], [124.46078, 53.21881], [125.17522, 53.20225], [125.6131, 53.07229], [126.558, 52.13738], [126.44606, 51.98254], [126.68349, 51.70607], [126.90369, 51.3238], [126.93135, 51.0841], [127.14586, 50.91152], [127.28165, 50.72075], [127.36335, 50.58306], [127.28765, 50.46585], [127.36009, 50.43787], [127.37384, 50.28393], [127.60515, 50.23503], [127.49299, 50.01251], [127.53516, 49.84306], [127.83476, 49.5748], [128.72896, 49.58676], [129.11153, 49.36813], [129.23232, 49.40353], [129.35317, 49.3481], [129.40398, 49.44194], [129.50685, 49.42398], [129.67598, 49.29596], [129.85416, 49.11067], [130.2355, 48.86741], [130.43232, 48.90844], [130.66946, 48.88251], [130.52147, 48.61745], [130.84462, 48.30942], [130.65103, 48.10052], [130.90915, 47.90623], [130.95985, 47.6957], [131.09871, 47.6852], [131.2635, 47.73325], [131.90448, 47.68011], [132.57309, 47.71741], [132.66989, 47.96491], [134.49516, 48.42884], [134.75328, 48.36763], [134.67098, 48.1564], [134.55508, 47.98651], [134.7671, 47.72051], [134.50898, 47.4812], [134.20016, 47.33458], [134.03538, 46.75668], [133.84104, 46.46681], [133.91496, 46.4274], [133.88097, 46.25066], [133.68047, 46.14697], [133.72695, 46.05576], [133.67569, 45.9759], [133.60442, 45.90053], [133.48457, 45.86203], [133.41083, 45.57723], [133.19419, 45.51913], [133.09279, 45.25693], [133.12293, 45.1332], [132.96373, 45.0212], [132.83978, 45.05916], [131.99417, 45.2567], [131.86903, 45.33636], [131.76532, 45.22609], [131.66852, 45.2196], [131.68466, 45.12374], [131.48415, 44.99513], [130.95639, 44.85154], [131.1108, 44.70266], [131.30365, 44.04262], [131.25484, 44.03131], [131.23583, 43.96085], [131.26176, 43.94011], [131.21105, 43.82383], [131.19492, 43.53047], [131.29402, 43.46695], [131.30324, 43.39498], [131.19031, 43.21385], [131.20414, 43.13654], [131.10274, 43.04734], [131.135, 42.94114], [131.02668, 42.91246], [131.02438, 42.86518], [130.66524, 42.84753], [130.44361, 42.76205], [130.40213, 42.70788], [130.56576, 42.68925], [130.62107, 42.58413], [130.55143, 42.52158], [130.56835, 42.43281], [130.60805, 42.4317], [130.64181, 42.41422], [130.66367, 42.38024], [130.65022, 42.32281], [131.95041, 41.5445], [140.9182, 45.92937], [145.82343, 44.571], [145.23667, 43.76813], [153.94307, 38.42848], [180, 62.52334], [180, 71.53642], [155.31937, 81.93282], [76.13964, 83.37843], [64.18965, 69.94255], [66.1708, 67.61252], [61.98014, 65.72191], [60.74386, 64.95767], [59.63945, 64.78384], [59.80579, 64.13948], [59.24834, 63.01859], [59.61398, 62.44915], [59.36223, 61.3882], [59.50685, 60.91162], [58.3853, 59.487], [59.15636, 59.14682], [59.40376, 58.45822], [58.71104, 58.07475], [58.81412, 57.71602], [58.13789, 57.68097], [58.07604, 57.08308], [57.28024, 56.87898], [57.51527, 56.08729], [59.28419, 56.15739], [59.49035, 55.60486], [58.81825, 55.03378], [57.25137, 55.26262], [57.14829, 54.84204], [57.95234, 54.39672], [59.95217, 54.85853], [59.70487, 54.14846], [58.94336, 53.953], [58.79644, 52.43392], [59.22409, 52.28437], [59.25033, 52.46803], [60.17516, 52.39457], [60.17253, 52.25814], [59.91279, 52.06924], [59.99809, 51.98263]]]] } },
22985     { type: "Feature", properties: { wikidata: "Q34366", nameEn: "Tasmania", aliases: ["AU-TAS"], country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[123.64533, -39.13605], [159.69067, -56.28945], [159.74028, -39.1978], [123.64533, -39.13605]]]] } },
22986     { type: "Feature", properties: { wikidata: "Q34497", nameEn: "Saint Helena", aliases: ["SH-HL"], country: "GB", groups: ["SH", "BOTS", "011", "202", "002", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["290"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.3824, -13.9131], [-6.17428, -19.07236], [-3.29308, -15.22647], [-8.3824, -13.9131]]]] } },
22987     { type: "Feature", properties: { wikidata: "Q35657", nameEn: "US States", country: "US", level: "subcountryGroup" }, geometry: null },
22988     { type: "Feature", properties: { wikidata: "Q36117", nameEn: "Borneo", level: "sharedLandform" }, geometry: null },
22989     { type: "Feature", properties: { wikidata: "Q36678", nameEn: "West Bank", country: "PS", groups: ["145", "142"], callingCodes: ["970"] }, geometry: { type: "MultiPolygon", coordinates: [[[[35.47672, 31.49578], [35.55941, 31.76535], [35.52758, 31.9131], [35.54375, 31.96587], [35.52012, 32.04076], [35.57111, 32.21877], [35.55807, 32.38674], [35.42078, 32.41562], [35.41048, 32.43706], [35.41598, 32.45593], [35.42034, 32.46009], [35.40224, 32.50136], [35.35212, 32.52047], [35.30685, 32.51024], [35.29306, 32.50947], [35.25049, 32.52453], [35.2244, 32.55289], [35.15937, 32.50466], [35.10882, 32.4757], [35.10024, 32.47856], [35.09236, 32.47614], [35.08564, 32.46948], [35.07059, 32.4585], [35.05423, 32.41754], [35.05311, 32.4024], [35.0421, 32.38242], [35.05142, 32.3667], [35.04243, 32.35008], [35.01772, 32.33863], [35.01119, 32.28684], [35.02939, 32.2671], [35.01841, 32.23981], [34.98885, 32.20758], [34.95703, 32.19522], [34.96009, 32.17503], [34.99039, 32.14626], [34.98507, 32.12606], [34.99437, 32.10962], [34.9863, 32.09551], [35.00261, 32.027], [34.98682, 31.96935], [35.00124, 31.93264], [35.03489, 31.92448], [35.03978, 31.89276], [35.03489, 31.85919], [34.99712, 31.85569], [34.9724, 31.83352], [35.01978, 31.82944], [35.05617, 31.85685], [35.07677, 31.85627], [35.14174, 31.81325], [35.18603, 31.80901], [35.18169, 31.82542], [35.19461, 31.82687], [35.21469, 31.81835], [35.216, 31.83894], [35.21128, 31.863], [35.20381, 31.86716], [35.20673, 31.88151], [35.20791, 31.8821], [35.20945, 31.8815], [35.21016, 31.88237], [35.21276, 31.88153], [35.2136, 31.88241], [35.22014, 31.88264], [35.22294, 31.87889], [35.22567, 31.86745], [35.22817, 31.8638], [35.2249, 31.85433], [35.2304, 31.84222], [35.24816, 31.8458], [35.25753, 31.8387], [35.251, 31.83085], [35.26404, 31.82567], [35.25573, 31.81362], [35.26058, 31.79064], [35.25225, 31.7678], [35.26319, 31.74846], [35.25182, 31.73945], [35.24981, 31.72543], [35.2438, 31.7201], [35.24315, 31.71244], [35.23972, 31.70896], [35.22392, 31.71899], [35.21937, 31.71578], [35.20538, 31.72388], [35.18023, 31.72067], [35.16478, 31.73242], [35.15474, 31.73352], [35.15119, 31.73634], [35.13931, 31.73012], [35.12933, 31.7325], [35.11895, 31.71454], [35.10782, 31.71594], [35.08226, 31.69107], [35.00879, 31.65426], [34.95249, 31.59813], [34.9415, 31.55601], [34.94356, 31.50743], [34.93258, 31.47816], [34.89756, 31.43891], [34.87833, 31.39321], [34.88932, 31.37093], [34.92571, 31.34337], [35.02459, 31.35979], [35.13033, 31.3551], [35.22921, 31.37445], [35.39675, 31.49572], [35.47672, 31.49578]]]] } },
22990     { type: "Feature", properties: { wikidata: "Q37362", nameEn: "Akrotiri and Dhekelia", aliases: ["SBA"], country: "GB" }, geometry: null },
22991     { type: "Feature", properties: { wikidata: "Q38095", nameEn: "Gal\xE1pagos Islands", aliases: ["EC-W"], country: "EC", groups: ["005", "419", "019", "UN"], callingCodes: ["593"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-93.12365, 2.64343], [-92.46744, -2.52874], [-87.07749, -0.8849], [-93.12365, 2.64343]]]] } },
22992     { type: "Feature", properties: { wikidata: "Q39760", nameEn: "Gaza Strip", country: "PS", groups: ["145", "142"], callingCodes: ["970"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.052, 31.46619], [34.21853, 31.32363], [34.23572, 31.2966], [34.24012, 31.29591], [34.26742, 31.21998], [34.29417, 31.24194], [34.36523, 31.28963], [34.37381, 31.30598], [34.36505, 31.36404], [34.40077, 31.40926], [34.48892, 31.48365], [34.56797, 31.54197], [34.48681, 31.59711], [34.29262, 31.70393], [34.052, 31.46619]]]] } },
22993     { type: "Feature", properties: { wikidata: "Q40888", nameEn: "Andaman and Nicobar Islands", aliases: ["IN-AN"], country: "IN", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["91"] }, geometry: { type: "MultiPolygon", coordinates: [[[[94.42132, 5.96581], [94.6371, 13.81803], [86.7822, 13.41052], [94.42132, 5.96581]]]] } },
22994     { type: "Feature", properties: { wikidata: "Q41684", nameEn: "Stewart Island", country: "NZ", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[166.59185, -47.61313], [169.70504, -47.56021], [167.52103, -46.41337], [166.59185, -47.61313]]]] } },
22995     { type: "Feature", properties: { wikidata: "Q43296", nameEn: "Wake Island", aliases: ["WK", "WAK", "WKUM", "872", "UM-79"], country: "US", groups: ["UM", "Q1352230", "057", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[167.34779, 18.97692], [166.67967, 20.14834], [165.82549, 18.97692], [167.34779, 18.97692]]]] } },
22996     { type: "Feature", properties: { wikidata: "Q46275", nameEn: "New Zealand Subantarctic Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[164.30551, -47.88072], [161.96603, -56.07661], [179.49541, -50.04657], [179.49541, -47.2902], [169.91032, -47.66283], [164.30551, -47.88072]]]] } },
22997     { type: "Feature", properties: { wikidata: "Q46395", nameEn: "British Overseas Territories", aliases: ["BOTS", "UKOTS"], country: "GB", level: "subcountryGroup" }, geometry: null },
22998     { type: "Feature", properties: { wikidata: "Q46772", nameEn: "Kerguelen Islands", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[61.9216, -49.39746], [70.67507, -51.14192], [74.25129, -45.45074], [61.9216, -49.39746]]]] } },
22999     { type: "Feature", properties: { wikidata: "Q46879", nameEn: "Baker Island", aliases: ["UM-81"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-175.33482, -1.40631], [-175.31323, 0.5442], [-177.91421, 0.39582], [-175.33482, -1.40631]]]] } },
23000     { type: "Feature", properties: { wikidata: "Q47863", nameEn: "Midway Atoll", aliases: ["MI", "MID", "MIUM", "488", "UM-71"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-176.29741, 29.09786], [-177.77531, 29.29793], [-177.5224, 27.7635], [-176.29741, 29.09786]]]] } },
23001     { type: "Feature", properties: { wikidata: "Q62218", nameEn: "Jarvis Island", aliases: ["UM-86"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-160.42921, -1.4364], [-159.12443, 0.19975], [-160.38779, 0.30331], [-160.42921, -1.4364]]]] } },
23002     { type: "Feature", properties: { wikidata: "Q105472", nameEn: "Macaronesia", level: "sharedLandform" }, geometry: null },
23003     { type: "Feature", properties: { wikidata: "Q114935", nameEn: "Kermadec Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-174.40891, -29.09438], [-180, -24.21376], [-179.96512, -35.00791], [-174.40891, -29.09438]]]] } },
23004     { type: "Feature", properties: { wikidata: "Q115459", nameEn: "Chatham Islands", aliases: ["NZ-CIT"], country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-179.93224, -45.18423], [-172.47015, -45.17912], [-176.30998, -41.38382], [-179.93224, -45.18423]]]] } },
23005     { type: "Feature", properties: { wikidata: "Q118863", nameEn: "North Island", country: "NZ", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[179.49541, -47.2902], [179.49541, -36.79303], [174.17679, -32.62487], [170.27492, -36.38133], [174.58663, -40.80446], [174.46634, -41.55028], [179.49541, -47.2902]]]] } },
23006     { type: "Feature", properties: { wikidata: "Q120755", nameEn: "South Island", country: "NZ", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169.70504, -47.56021], [179.49541, -47.2902], [174.46634, -41.55028], [174.58663, -40.80446], [170.27492, -36.38133], [166.56976, -39.94841], [164.8365, -46.0205], [167.52103, -46.41337], [169.70504, -47.56021]]]] } },
23007     { type: "Feature", properties: { wikidata: "Q123076", nameEn: "Palmyra Atoll", aliases: ["UM-95"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-161.06795, 5.2462], [-161.0731, 7.1291], [-163.24478, 5.24198], [-161.06795, 5.2462]]]] } },
23008     { type: "Feature", properties: { wikidata: "Q130574", nameEn: "Chafarinas Islands", country: "ES", groups: ["EU", "Q191011", "015", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.40316, 35.16893], [-2.43262, 35.20652], [-2.45965, 35.16527], [-2.40316, 35.16893]]]] } },
23009     { type: "Feature", properties: { wikidata: "Q130895", nameEn: "Kingman Reef", aliases: ["UM-89"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-161.0731, 7.1291], [-163.16627, 7.15036], [-163.24478, 5.24198], [-161.0731, 7.1291]]]] } },
23010     { type: "Feature", properties: { wikidata: "Q131008", nameEn: "Johnston Atoll", aliases: ["JT", "JTN", "JTUM", "396", "UM-67"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-170.65691, 16.57199], [-168.87689, 16.01159], [-169.2329, 17.4933], [-170.65691, 16.57199]]]] } },
23011     { type: "Feature", properties: { wikidata: "Q131305", nameEn: "Howland Island", aliases: ["UM-84"], country: "US", groups: ["UM", "Q1352230", "061", "009", "UN"], level: "subterritory", roadSpeedUnit: "mph", roadHeightUnit: "ft" }, geometry: { type: "MultiPolygon", coordinates: [[[[-177.91421, 0.39582], [-175.31323, 0.5442], [-176.74464, 2.28109], [-177.91421, 0.39582]]]] } },
23012     { type: "Feature", properties: { wikidata: "Q133888", nameEn: "Ashmore and Cartier Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[123.7463, -11.1783], [120.6877, -13.59408], [125.29076, -12.33139], [123.7463, -11.1783]]]] } },
23013     { type: "Feature", properties: { wikidata: "Q153732", nameEn: "Mariana Islands", level: "sharedLandform" }, geometry: null },
23014     { type: "Feature", properties: { wikidata: "Q172216", nameEn: "Coral Sea Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[159.77159, -28.41151], [156.73836, -14.50464], [145.2855, -9.62524], [147.69992, -17.5933], [152.93188, -20.92631], [154.02855, -24.43238], [159.77159, -28.41151]]]] } },
23015     { type: "Feature", properties: { wikidata: "Q179313", nameEn: "Alderney", country: "GB", groups: ["GG", "830", "Q185086", "154", "150", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01481"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.36485, 49.48223], [-2.09454, 49.46288], [-2.02963, 49.91866], [-2.49556, 49.79012], [-2.36485, 49.48223]]]] } },
23016     { type: "Feature", properties: { wikidata: "Q185086", nameEn: "Crown Dependencies", country: "GB", level: "subcountryGroup" }, geometry: null },
23017     { type: "Feature", properties: { wikidata: "Q190571", nameEn: "Scattered Islands", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[53.53458, -16.36909], [54.96649, -16.28353], [54.61476, -15.02273], [53.53458, -16.36909]]], [[[38.55969, -20.75596], [40.68027, -23.38889], [43.52893, -15.62903], [38.55969, -20.75596]]], [[[47.03092, -11.05648], [47.11593, -12.08552], [47.96702, -11.46447], [47.03092, -11.05648]]]] } },
23018     { type: "Feature", properties: { wikidata: "Q191011", nameEn: "Plazas de soberan\xEDa", country: "ES" }, geometry: null },
23019     { type: "Feature", properties: { wikidata: "Q191146", nameEn: "Pe\xF1\xF3n de V\xE9lez de la Gomera", country: "ES", groups: ["EU", "Q191011", "015", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-4.30191, 35.17419], [-4.30112, 35.17058], [-4.29436, 35.17149], [-4.30191, 35.17419]]]] } },
23020     { type: "Feature", properties: { wikidata: "Q201698", nameEn: "Crozet Islands", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[55.03425, -43.65017], [46.31615, -46.28749], [54.5587, -47.93013], [55.03425, -43.65017]]]] } },
23021     { type: "Feature", properties: { wikidata: "Q578170", nameEn: "Contiguous United States", aliases: ["CONUS"], country: "US", groups: ["Q35657", "021", "003", "019", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-97.13927, 25.96583], [-96.92418, 25.97377], [-80.57035, 24.0565], [-78.91214, 27.76553], [-61.98255, 37.34815], [-67.16117, 44.20069], [-66.93432, 44.82597], [-66.96824, 44.83078], [-66.98249, 44.87071], [-66.96824, 44.90965], [-67.0216, 44.95333], [-67.11316, 45.11176], [-67.15965, 45.16179], [-67.19603, 45.16771], [-67.20349, 45.1722], [-67.22751, 45.16344], [-67.27039, 45.1934], [-67.29748, 45.18173], [-67.29754, 45.14865], [-67.34927, 45.122], [-67.48201, 45.27351], [-67.42394, 45.37969], [-67.50578, 45.48971], [-67.42144, 45.50584], [-67.43815, 45.59162], [-67.6049, 45.60725], [-67.80705, 45.69528], [-67.80653, 45.80022], [-67.75654, 45.82324], [-67.80961, 45.87531], [-67.75196, 45.91814], [-67.78111, 45.9392], [-67.78578, 47.06473], [-67.87993, 47.10377], [-67.94843, 47.1925], [-68.23244, 47.35712], [-68.37458, 47.35851], [-68.38332, 47.28723], [-68.57914, 47.28431], [-68.60575, 47.24659], [-68.70125, 47.24399], [-68.89222, 47.1807], [-69.05039, 47.2456], [-69.05073, 47.30076], [-69.05148, 47.42012], [-69.22119, 47.46461], [-69.99966, 46.69543], [-70.05812, 46.41768], [-70.18547, 46.35357], [-70.29078, 46.18832], [-70.23855, 46.1453], [-70.31025, 45.96424], [-70.24694, 45.95138], [-70.25976, 45.89675], [-70.41523, 45.79497], [-70.38934, 45.73215], [-70.54019, 45.67291], [-70.68516, 45.56964], [-70.72651, 45.49771], [-70.62518, 45.42286], [-70.65383, 45.37592], [-70.78372, 45.43269], [-70.82638, 45.39828], [-70.80236, 45.37444], [-70.84816, 45.22698], [-70.89864, 45.2398], [-70.91169, 45.29849], [-70.95193, 45.33895], [-71.0107, 45.34819], [-71.01866, 45.31573], [-71.08364, 45.30623], [-71.14568, 45.24128], [-71.19723, 45.25438], [-71.22338, 45.25184], [-71.29371, 45.29996], [-71.37133, 45.24624], [-71.44252, 45.2361], [-71.40364, 45.21382], [-71.42778, 45.12624], [-71.48735, 45.07784], [-71.50067, 45.01357], [-73.35025, 45.00942], [-74.32699, 44.99029], [-74.66689, 45.00646], [-74.8447, 45.00606], [-74.99101, 44.98051], [-75.01363, 44.95608], [-75.2193, 44.87821], [-75.41441, 44.76614], [-75.76813, 44.51537], [-75.8217, 44.43176], [-75.95947, 44.34463], [-76.00018, 44.34896], [-76.16285, 44.28262], [-76.1664, 44.23051], [-76.244, 44.19643], [-76.31222, 44.19894], [-76.35324, 44.13493], [-76.43859, 44.09393], [-76.79706, 43.63099], [-79.25796, 43.54052], [-79.06921, 43.26183], [-79.05512, 43.25375], [-79.05544, 43.21224], [-79.05002, 43.20133], [-79.05384, 43.17418], [-79.04652, 43.16396], [-79.0427, 43.13934], [-79.06881, 43.12029], [-79.05671, 43.10937], [-79.07486, 43.07845], [-79.01055, 43.06659], [-78.99941, 43.05612], [-79.02424, 43.01983], [-79.02074, 42.98444], [-78.98126, 42.97], [-78.96312, 42.95509], [-78.93224, 42.95229], [-78.90905, 42.93022], [-78.90712, 42.89733], [-78.93684, 42.82887], [-82.67862, 41.67615], [-83.11184, 41.95671], [-83.14962, 42.04089], [-83.12724, 42.2376], [-83.09837, 42.28877], [-83.07837, 42.30978], [-83.02253, 42.33045], [-82.82964, 42.37355], [-82.64242, 42.55594], [-82.58873, 42.54984], [-82.57583, 42.5718], [-82.51858, 42.611], [-82.51063, 42.66025], [-82.46613, 42.76615], [-82.4826, 42.8068], [-82.45331, 42.93139], [-82.4253, 42.95423], [-82.4146, 42.97626], [-82.42469, 42.992], [-82.48419, 45.30225], [-83.59589, 45.82131], [-83.43746, 45.99749], [-83.57017, 46.105], [-83.83329, 46.12169], [-83.90453, 46.05922], [-83.95399, 46.05634], [-84.1096, 46.23987], [-84.09756, 46.25512], [-84.11615, 46.2681], [-84.11254, 46.32329], [-84.13451, 46.39218], [-84.11196, 46.50248], [-84.12885, 46.53068], [-84.17723, 46.52753], [-84.1945, 46.54061], [-84.2264, 46.53337], [-84.26351, 46.49508], [-84.29893, 46.49127], [-84.34174, 46.50683], [-84.42101, 46.49853], [-84.4481, 46.48972], [-84.47607, 46.45225], [-84.55635, 46.45974], [-84.85871, 46.88881], [-88.37033, 48.30586], [-89.48837, 48.01412], [-89.57972, 48.00023], [-89.77248, 48.02607], [-89.89974, 47.98109], [-90.07418, 48.11043], [-90.56312, 48.09488], [-90.56444, 48.12184], [-90.75045, 48.09143], [-90.87588, 48.2484], [-91.08016, 48.18096], [-91.25025, 48.08522], [-91.43248, 48.04912], [-91.45829, 48.07454], [-91.58025, 48.04339], [-91.55649, 48.10611], [-91.70451, 48.11805], [-91.71231, 48.19875], [-91.86125, 48.21278], [-91.98929, 48.25409], [-92.05339, 48.35958], [-92.14732, 48.36578], [-92.202, 48.35252], [-92.26662, 48.35651], [-92.30939, 48.31251], [-92.27167, 48.25046], [-92.37185, 48.22259], [-92.48147, 48.36609], [-92.45588, 48.40624], [-92.50712, 48.44921], [-92.65606, 48.43471], [-92.71323, 48.46081], [-92.69927, 48.49573], [-92.62747, 48.50278], [-92.6342, 48.54133], [-92.7287, 48.54005], [-92.94973, 48.60866], [-93.25391, 48.64266], [-93.33946, 48.62787], [-93.3712, 48.60599], [-93.39758, 48.60364], [-93.40693, 48.60948], [-93.44472, 48.59147], [-93.47022, 48.54357], [-93.66382, 48.51845], [-93.79267, 48.51631], [-93.80939, 48.52439], [-93.80676, 48.58232], [-93.83288, 48.62745], [-93.85769, 48.63284], [-94.23215, 48.65202], [-94.25104, 48.65729], [-94.25172, 48.68404], [-94.27153, 48.70232], [-94.4174, 48.71049], [-94.44258, 48.69223], [-94.53826, 48.70216], [-94.54885, 48.71543], [-94.58903, 48.71803], [-94.69335, 48.77883], [-94.69669, 48.80918], [-94.70486, 48.82365], [-94.70087, 48.8339], [-94.687, 48.84077], [-94.75017, 49.09931], [-94.77355, 49.11998], [-94.82487, 49.29483], [-94.8159, 49.32299], [-94.85381, 49.32492], [-94.95681, 49.37035], [-94.99532, 49.36579], [-95.01419, 49.35647], [-95.05825, 49.35311], [-95.12903, 49.37056], [-95.15357, 49.384], [-95.15355, 48.9996], [-123.32163, 49.00419], [-123.0093, 48.83186], [-123.0093, 48.76586], [-123.26565, 48.6959], [-123.15614, 48.35395], [-123.50039, 48.21223], [-125.03842, 48.53282], [-133.98258, 38.06389], [-118.48109, 32.5991], [-117.1243, 32.53427], [-115.88053, 32.63624], [-114.71871, 32.71894], [-114.76736, 32.64094], [-114.80584, 32.62028], [-114.81141, 32.55543], [-114.79524, 32.55731], [-114.82011, 32.49609], [-111.07523, 31.33232], [-108.20979, 31.33316], [-108.20899, 31.78534], [-106.529, 31.784], [-106.52266, 31.77509], [-106.51251, 31.76922], [-106.50962, 31.76155], [-106.50111, 31.75714], [-106.48815, 31.74769], [-106.47298, 31.75054], [-106.46726, 31.75998], [-106.45244, 31.76523], [-106.43419, 31.75478], [-106.41773, 31.75196], [-106.38003, 31.73151], [-106.3718, 31.71165], [-106.34864, 31.69663], [-106.33419, 31.66303], [-106.30305, 31.62154], [-106.28084, 31.56173], [-106.24612, 31.54193], [-106.23711, 31.51262], [-106.20346, 31.46305], [-106.09025, 31.40569], [-106.00363, 31.39181], [-104.77674, 30.4236], [-104.5171, 29.64671], [-104.3969, 29.57105], [-104.39363, 29.55396], [-104.37752, 29.54255], [-103.15787, 28.93865], [-102.60596, 29.8192], [-101.47277, 29.7744], [-101.05686, 29.44738], [-101.01128, 29.36947], [-100.96725, 29.3477], [-100.94579, 29.34523], [-100.94056, 29.33371], [-100.87982, 29.296], [-100.79696, 29.24688], [-100.67294, 29.09744], [-100.63689, 28.90812], [-100.59809, 28.88197], [-100.52313, 28.75598], [-100.5075, 28.74066], [-100.51222, 28.70679], [-100.50029, 28.66117], [-99.55409, 27.61314], [-99.51478, 27.55836], [-99.52955, 27.49747], [-99.50208, 27.50021], [-99.48045, 27.49016], [-99.482, 27.47128], [-99.49744, 27.43746], [-99.53573, 27.30926], [-99.08477, 26.39849], [-99.03053, 26.41249], [-99.00546, 26.3925], [-98.35126, 26.15129], [-98.30491, 26.10475], [-98.27075, 26.09457], [-98.24603, 26.07191], [-97.97017, 26.05232], [-97.95155, 26.0625], [-97.66511, 26.01708], [-97.52025, 25.88518], [-97.49828, 25.89877], [-97.45669, 25.86874], [-97.42511, 25.83969], [-97.37332, 25.83854], [-97.35946, 25.92189], [-97.13927, 25.96583]]]] } },
23022     { type: "Feature", properties: { wikidata: "Q620634", nameEn: "Bir Tawil", groups: ["015", "002"], level: "territory" }, geometry: { type: "MultiPolygon", coordinates: [[[[33.17563, 22.00405], [33.57251, 21.72406], [33.99686, 21.76784], [34.0765, 22.00501], [33.17563, 22.00405]]]] } },
23023     { type: "Feature", properties: { wikidata: "Q639185", nameEn: "Peros Banhos", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[72.12587, -4.02588], [70.1848, -6.37445], [72.09518, -5.61768], [72.12587, -4.02588]]]] } },
23024     { type: "Feature", properties: { wikidata: "Q644636", nameEn: "Cyprus", level: "sharedLandform" }, geometry: null },
23025     { type: "Feature", properties: { wikidata: "Q851132", nameEn: "New Zealand Outlying Islands", country: "NZ", level: "subcountryGroup" }, geometry: null },
23026     { type: "Feature", properties: { wikidata: "Q875134", nameEn: "European Russia", country: "RU", groups: ["151", "150", "UN"], callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.57853, 55.25302], [19.64312, 54.45423], [19.8038, 54.44203], [20.63871, 54.3706], [21.41123, 54.32395], [22.79705, 54.36264], [22.7253, 54.41732], [22.70208, 54.45312], [22.67788, 54.532], [22.71293, 54.56454], [22.68021, 54.58486], [22.7522, 54.63525], [22.74225, 54.64339], [22.75467, 54.6483], [22.73397, 54.66604], [22.73631, 54.72952], [22.87317, 54.79492], [22.85083, 54.88711], [22.76422, 54.92521], [22.68723, 54.9811], [22.65451, 54.97037], [22.60075, 55.01863], [22.58907, 55.07085], [22.47688, 55.04408], [22.31562, 55.0655], [22.14267, 55.05345], [22.11697, 55.02131], [22.06087, 55.02935], [22.02582, 55.05078], [22.03984, 55.07888], [21.99543, 55.08691], [21.96505, 55.07353], [21.85521, 55.09493], [21.64954, 55.1791], [21.55605, 55.20311], [21.51095, 55.18507], [21.46766, 55.21115], [21.38446, 55.29348], [21.35465, 55.28427], [21.26425, 55.24456], [20.95181, 55.27994], [20.60454, 55.40986], [18.57853, 55.25302]]], [[[26.32936, 60.00121], [26.90044, 59.63819], [27.85643, 59.58538], [28.04187, 59.47017], [28.19061, 59.39962], [28.21137, 59.38058], [28.20537, 59.36491], [28.19284, 59.35791], [28.14215, 59.28934], [28.00689, 59.28351], [27.90911, 59.24353], [27.87978, 59.18097], [27.80482, 59.1116], [27.74429, 58.98351], [27.36366, 58.78381], [27.55489, 58.39525], [27.48541, 58.22615], [27.62393, 58.09462], [27.67282, 57.92627], [27.81841, 57.89244], [27.78526, 57.83963], [27.56689, 57.83356], [27.50171, 57.78842], [27.52615, 57.72843], [27.3746, 57.66834], [27.40393, 57.62125], [27.31919, 57.57672], [27.34698, 57.52242], [27.56832, 57.53728], [27.52453, 57.42826], [27.86101, 57.29402], [27.66511, 56.83921], [27.86101, 56.88204], [28.04768, 56.59004], [28.13526, 56.57989], [28.10069, 56.524], [28.19057, 56.44637], [28.16599, 56.37806], [28.23716, 56.27588], [28.15217, 56.16964], [28.30571, 56.06035], [28.36888, 56.05805], [28.37987, 56.11399], [28.43068, 56.09407], [28.5529, 56.11705], [28.68337, 56.10173], [28.63668, 56.07262], [28.73418, 55.97131], [29.08299, 56.03427], [29.21717, 55.98971], [29.44692, 55.95978], [29.3604, 55.75862], [29.51283, 55.70294], [29.61446, 55.77716], [29.80672, 55.79569], [29.97975, 55.87281], [30.12136, 55.8358], [30.27776, 55.86819], [30.30987, 55.83592], [30.48257, 55.81066], [30.51346, 55.78982], [30.51037, 55.76568], [30.63344, 55.73079], [30.67464, 55.64176], [30.72957, 55.66268], [30.7845, 55.58514], [30.86003, 55.63169], [30.93419, 55.6185], [30.95204, 55.50667], [30.90123, 55.46621], [30.93144, 55.3914], [30.8257, 55.3313], [30.81946, 55.27931], [30.87944, 55.28223], [30.97369, 55.17134], [31.02071, 55.06167], [31.00972, 55.02783], [30.94243, 55.03964], [30.9081, 55.02232], [30.95754, 54.98609], [30.93144, 54.9585], [30.81759, 54.94064], [30.8264, 54.90062], [30.75165, 54.80699], [30.95479, 54.74346], [30.97127, 54.71967], [31.0262, 54.70698], [30.98226, 54.68872], [30.99187, 54.67046], [31.19339, 54.66947], [31.21399, 54.63113], [31.08543, 54.50361], [31.22945, 54.46585], [31.3177, 54.34067], [31.30791, 54.25315], [31.57002, 54.14535], [31.89599, 54.0837], [31.88744, 54.03653], [31.85019, 53.91801], [31.77028, 53.80015], [31.89137, 53.78099], [32.12621, 53.81586], [32.36663, 53.7166], [32.45717, 53.74039], [32.50112, 53.68594], [32.40499, 53.6656], [32.47777, 53.5548], [32.74968, 53.45597], [32.73257, 53.33494], [32.51725, 53.28431], [32.40773, 53.18856], [32.15368, 53.07594], [31.82373, 53.10042], [31.787, 53.18033], [31.62496, 53.22886], [31.56316, 53.19432], [31.40523, 53.21406], [31.36403, 53.13504], [31.3915, 53.09712], [31.33519, 53.08805], [31.32283, 53.04101], [31.24147, 53.031], [31.35667, 52.97854], [31.592, 52.79011], [31.57277, 52.71613], [31.50406, 52.69707], [31.63869, 52.55361], [31.56316, 52.51518], [31.61397, 52.48843], [31.62084, 52.33849], [31.57971, 52.32146], [31.70735, 52.26711], [31.6895, 52.1973], [31.77877, 52.18636], [31.7822, 52.11406], [31.81722, 52.09955], [31.85018, 52.11305], [31.96141, 52.08015], [31.92159, 52.05144], [32.08813, 52.03319], [32.23331, 52.08085], [32.2777, 52.10266], [32.34044, 52.1434], [32.33083, 52.23685], [32.38988, 52.24946], [32.3528, 52.32842], [32.54781, 52.32423], [32.69475, 52.25535], [32.85405, 52.27888], [32.89937, 52.2461], [33.18913, 52.3754], [33.51323, 52.35779], [33.48027, 52.31499], [33.55718, 52.30324], [33.78789, 52.37204], [34.05239, 52.20132], [34.11199, 52.14087], [34.09413, 52.00835], [34.41136, 51.82793], [34.42922, 51.72852], [34.07765, 51.67065], [34.17599, 51.63253], [34.30562, 51.5205], [34.22048, 51.4187], [34.33446, 51.363], [34.23009, 51.26429], [34.31661, 51.23936], [34.38802, 51.2746], [34.6613, 51.25053], [34.6874, 51.18], [34.82472, 51.17483], [34.97304, 51.2342], [35.14058, 51.23162], [35.12685, 51.16191], [35.20375, 51.04723], [35.31774, 51.08434], [35.40837, 51.04119], [35.32598, 50.94524], [35.39307, 50.92145], [35.41367, 50.80227], [35.47704, 50.77274], [35.48116, 50.66405], [35.39464, 50.64751], [35.47463, 50.49247], [35.58003, 50.45117], [35.61711, 50.35707], [35.73659, 50.35489], [35.80388, 50.41356], [35.8926, 50.43829], [36.06893, 50.45205], [36.20763, 50.3943], [36.30101, 50.29088], [36.47817, 50.31457], [36.58371, 50.28563], [36.56655, 50.2413], [36.64571, 50.218], [36.69377, 50.26982], [36.91762, 50.34963], [37.08468, 50.34935], [37.48204, 50.46079], [37.47243, 50.36277], [37.62486, 50.29966], [37.62879, 50.24481], [37.61113, 50.21976], [37.75807, 50.07896], [37.79515, 50.08425], [37.90776, 50.04194], [38.02999, 49.94482], [38.02999, 49.90592], [38.21675, 49.98104], [38.18517, 50.08161], [38.32524, 50.08866], [38.35408, 50.00664], [38.65688, 49.97176], [38.68677, 50.00904], [38.73311, 49.90238], [38.90477, 49.86787], [38.9391, 49.79524], [39.1808, 49.88911], [39.27968, 49.75976], [39.44496, 49.76067], [39.59142, 49.73758], [39.65047, 49.61761], [39.84548, 49.56064], [40.13249, 49.61672], [40.16683, 49.56865], [40.03636, 49.52321], [40.03087, 49.45452], [40.1141, 49.38798], [40.14912, 49.37681], [40.18331, 49.34996], [40.22176, 49.25683], [40.01988, 49.1761], [39.93437, 49.05709], [39.6836, 49.05121], [39.6683, 48.99454], [39.71353, 48.98959], [39.72649, 48.9754], [39.74874, 48.98675], [39.78368, 48.91596], [39.98967, 48.86901], [40.03636, 48.91957], [40.08168, 48.87443], [39.97182, 48.79398], [39.79466, 48.83739], [39.73104, 48.7325], [39.71765, 48.68673], [39.67226, 48.59368], [39.79764, 48.58668], [39.84548, 48.57821], [39.86196, 48.46633], [39.88794, 48.44226], [39.94847, 48.35055], [39.84136, 48.33321], [39.84273, 48.30947], [39.90041, 48.3049], [39.91465, 48.26743], [39.95248, 48.29972], [39.9693, 48.29904], [39.97325, 48.31399], [39.99241, 48.31768], [40.00752, 48.22445], [39.94847, 48.22811], [39.83724, 48.06501], [39.88256, 48.04482], [39.77544, 48.04206], [39.82213, 47.96396], [39.73935, 47.82876], [38.87979, 47.87719], [38.79628, 47.81109], [38.76379, 47.69346], [38.35062, 47.61631], [38.28679, 47.53552], [38.28954, 47.39255], [38.22225, 47.30788], [38.33074, 47.30508], [38.32112, 47.2585], [38.23049, 47.2324], [38.22955, 47.12069], [38.3384, 46.98085], [38.12112, 46.86078], [37.62608, 46.82615], [35.23066, 45.79231], [35.04991, 45.76827], [36.6645, 45.4514], [36.6545, 45.3417], [36.5049, 45.3136], [36.475, 45.2411], [36.4883, 45.0488], [33.5943, 44.03313], [39.81147, 43.06294], [40.0078, 43.38551], [40.00853, 43.40578], [40.01552, 43.42025], [40.01007, 43.42411], [40.03312, 43.44262], [40.04445, 43.47776], [40.10657, 43.57344], [40.65957, 43.56212], [41.64935, 43.22331], [42.40563, 43.23226], [42.66667, 43.13917], [42.75889, 43.19651], [43.03322, 43.08883], [43.0419, 43.02413], [43.81453, 42.74297], [43.73119, 42.62043], [43.95517, 42.55396], [44.54202, 42.75699], [44.70002, 42.74679], [44.80941, 42.61277], [44.88754, 42.74934], [45.15318, 42.70598], [45.36501, 42.55268], [45.78692, 42.48358], [45.61676, 42.20768], [46.42738, 41.91323], [46.5332, 41.87389], [46.58924, 41.80547], [46.75269, 41.8623], [46.8134, 41.76252], [47.00955, 41.63583], [46.99554, 41.59743], [47.03757, 41.55434], [47.10762, 41.59044], [47.34579, 41.27884], [47.49004, 41.26366], [47.54504, 41.20275], [47.62288, 41.22969], [47.75831, 41.19455], [47.87973, 41.21798], [48.07587, 41.49957], [48.22064, 41.51472], [48.2878, 41.56221], [48.40277, 41.60441], [48.42301, 41.65444], [48.55078, 41.77917], [48.5867, 41.84306], [48.80971, 41.95365], [49.2134, 44.84989], [49.88945, 46.04554], [49.32259, 46.26944], [49.16518, 46.38542], [48.54988, 46.56267], [48.51142, 46.69268], [49.01136, 46.72716], [48.52326, 47.4102], [48.45173, 47.40818], [48.15348, 47.74545], [47.64973, 47.76559], [47.41689, 47.83687], [47.38731, 47.68176], [47.12107, 47.83687], [47.11516, 48.27188], [46.49011, 48.43019], [46.78392, 48.95352], [47.00857, 49.04921], [47.04658, 49.19834], [46.78398, 49.34026], [46.9078, 49.86707], [47.18319, 49.93721], [47.34589, 50.09308], [47.30448, 50.30894], [47.58551, 50.47867], [48.10044, 50.09242], [48.24519, 49.86099], [48.42564, 49.82283], [48.68352, 49.89546], [48.90782, 50.02281], [48.57946, 50.63278], [48.86936, 50.61589], [49.12673, 50.78639], [49.41959, 50.85927], [49.39001, 51.09396], [49.76866, 51.11067], [49.97277, 51.2405], [50.26859, 51.28677], [50.59695, 51.61859], [51.26254, 51.68466], [51.301, 51.48799], [51.77431, 51.49536], [51.8246, 51.67916], [52.36119, 51.74161], [52.54329, 51.48444], [53.46165, 51.49445], [53.69299, 51.23466], [54.12248, 51.11542], [54.46331, 50.85554], [54.41894, 50.61214], [54.55797, 50.52006], [54.71476, 50.61214], [54.56685, 51.01958], [54.72067, 51.03261], [55.67774, 50.54508], [56.11398, 50.7471], [56.17906, 50.93204], [57.17302, 51.11253], [57.44221, 50.88354], [57.74986, 50.93017], [57.75578, 51.13852], [58.3208, 51.15151], [58.87974, 50.70852], [59.48928, 50.64216], [59.51886, 50.49937], [59.81172, 50.54451], [60.01288, 50.8163], [60.17262, 50.83312], [60.31914, 50.67705], [60.81833, 50.6629], [61.4431, 50.80679], [61.56889, 51.23679], [61.6813, 51.25716], [61.55114, 51.32746], [61.50677, 51.40687], [60.95655, 51.48615], [60.92401, 51.61124], [60.5424, 51.61675], [60.36787, 51.66815], [60.50986, 51.7964], [60.09867, 51.87135], [59.99809, 51.98263], [59.91279, 52.06924], [60.17253, 52.25814], [60.17516, 52.39457], [59.25033, 52.46803], [59.22409, 52.28437], [58.79644, 52.43392], [58.94336, 53.953], [59.70487, 54.14846], [59.95217, 54.85853], [57.95234, 54.39672], [57.14829, 54.84204], [57.25137, 55.26262], [58.81825, 55.03378], [59.49035, 55.60486], [59.28419, 56.15739], [57.51527, 56.08729], [57.28024, 56.87898], [58.07604, 57.08308], [58.13789, 57.68097], [58.81412, 57.71602], [58.71104, 58.07475], [59.40376, 58.45822], [59.15636, 59.14682], [58.3853, 59.487], [59.50685, 60.91162], [59.36223, 61.3882], [59.61398, 62.44915], [59.24834, 63.01859], [59.80579, 64.13948], [59.63945, 64.78384], [60.74386, 64.95767], [61.98014, 65.72191], [66.1708, 67.61252], [64.18965, 69.94255], [76.13964, 83.37843], [36.85549, 84.09565], [32.07813, 72.01005], [31.59909, 70.16571], [30.84095, 69.80584], [30.95011, 69.54699], [30.52662, 69.54699], [30.16363, 69.65244], [29.97205, 69.41623], [29.27631, 69.2811], [29.26623, 69.13794], [29.0444, 69.0119], [28.91738, 69.04774], [28.45957, 68.91417], [28.78224, 68.86696], [28.43941, 68.53366], [28.62982, 68.19816], [29.34179, 68.06655], [29.66955, 67.79872], [30.02041, 67.67523], [29.91155, 67.51507], [28.9839, 66.94139], [29.91155, 66.13863], [30.16363, 65.66935], [29.97205, 65.70256], [29.74013, 65.64025], [29.84096, 65.56945], [29.68972, 65.31803], [29.61914, 65.23791], [29.8813, 65.22101], [29.84096, 65.1109], [29.61914, 65.05993], [29.68972, 64.80789], [30.05271, 64.79072], [30.12329, 64.64862], [30.01238, 64.57513], [30.06279, 64.35782], [30.4762, 64.25728], [30.55687, 64.09036], [30.25437, 63.83364], [29.98213, 63.75795], [30.49637, 63.46666], [31.23244, 63.22239], [31.29294, 63.09035], [31.58535, 62.91642], [31.38369, 62.66284], [31.10136, 62.43042], [29.01829, 61.17448], [28.82816, 61.1233], [28.47974, 60.93365], [27.77352, 60.52722], [27.71177, 60.3893], [27.44953, 60.22766], [26.32936, 60.00121]]]] } },
23027     { type: "Feature", properties: { wikidata: "Q1083368", nameEn: "Mainland Finland", country: "FI", groups: ["EU", "154", "150", "UN"], callingCodes: ["358"] }, geometry: { type: "MultiPolygon", coordinates: [[[[29.12697, 69.69193], [28.36883, 69.81658], [28.32849, 69.88605], [27.97558, 69.99671], [27.95542, 70.0965], [27.57226, 70.06215], [27.05802, 69.92069], [26.64461, 69.96565], [26.40261, 69.91377], [25.96904, 69.68397], [25.69679, 69.27039], [25.75729, 68.99383], [25.61613, 68.89602], [25.42455, 68.90328], [25.12206, 68.78684], [25.10189, 68.63307], [24.93048, 68.61102], [24.90023, 68.55579], [24.74898, 68.65143], [24.18432, 68.73936], [24.02299, 68.81601], [23.781, 68.84514], [23.68017, 68.70276], [23.13064, 68.64684], [22.53321, 68.74393], [22.38367, 68.71561], [22.27276, 68.89514], [21.63833, 69.27485], [21.27827, 69.31281], [21.00732, 69.22755], [20.98641, 69.18809], [21.11099, 69.10291], [21.05775, 69.0356], [20.72171, 69.11874], [20.55258, 69.06069], [20.78802, 69.03087], [20.91658, 68.96764], [20.85104, 68.93142], [20.90649, 68.89696], [21.03001, 68.88969], [22.00429, 68.50692], [22.73028, 68.40881], [23.10336, 68.26551], [23.15377, 68.14759], [23.26469, 68.15134], [23.40081, 68.05545], [23.65793, 67.9497], [23.45627, 67.85297], [23.54701, 67.59306], [23.39577, 67.46974], [23.75372, 67.43688], [23.75372, 67.29914], [23.54701, 67.25435], [23.58735, 67.20752], [23.56214, 67.17038], [23.98563, 66.84149], [23.98059, 66.79585], [23.89488, 66.772], [23.85959, 66.56434], [23.63776, 66.43568], [23.67591, 66.3862], [23.64982, 66.30603], [23.71339, 66.21299], [23.90497, 66.15802], [24.15791, 65.85385], [24.14798, 65.83466], [24.15107, 65.81427], [24.14112, 65.39731], [20.15877, 63.06556], [19.23413, 60.61414], [20.96741, 60.71528], [21.15143, 60.54555], [21.08159, 60.20167], [21.02509, 60.12142], [21.35468, 59.67511], [20.5104, 59.15546], [26.32936, 60.00121], [27.44953, 60.22766], [27.71177, 60.3893], [27.77352, 60.52722], [28.47974, 60.93365], [28.82816, 61.1233], [29.01829, 61.17448], [31.10136, 62.43042], [31.38369, 62.66284], [31.58535, 62.91642], [31.29294, 63.09035], [31.23244, 63.22239], [30.49637, 63.46666], [29.98213, 63.75795], [30.25437, 63.83364], [30.55687, 64.09036], [30.4762, 64.25728], [30.06279, 64.35782], [30.01238, 64.57513], [30.12329, 64.64862], [30.05271, 64.79072], [29.68972, 64.80789], [29.61914, 65.05993], [29.84096, 65.1109], [29.8813, 65.22101], [29.61914, 65.23791], [29.68972, 65.31803], [29.84096, 65.56945], [29.74013, 65.64025], [29.97205, 65.70256], [30.16363, 65.66935], [29.91155, 66.13863], [28.9839, 66.94139], [29.91155, 67.51507], [30.02041, 67.67523], [29.66955, 67.79872], [29.34179, 68.06655], [28.62982, 68.19816], [28.43941, 68.53366], [28.78224, 68.86696], [28.45957, 68.91417], [28.91738, 69.04774], [28.81248, 69.11997], [28.8629, 69.22395], [29.31664, 69.47994], [29.12697, 69.69193]]]] } },
23028     { type: "Feature", properties: { wikidata: "Q1184963", nameEn: "Alhucemas Islands", country: "ES", groups: ["EU", "Q191011", "015", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.90602, 35.21494], [-3.88372, 35.20767], [-3.89343, 35.22728], [-3.90602, 35.21494]]]] } },
23029     { type: "Feature", properties: { wikidata: "Q1298289", nameEn: "Egmont Islands", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[70.1848, -6.37445], [70.67958, -8.2663], [72.17991, -6.68509], [70.1848, -6.37445]]]] } },
23030     { type: "Feature", properties: { wikidata: "Q1352230", nameEn: "US Territories", country: "US", level: "subcountryGroup" }, geometry: null },
23031     { type: "Feature", properties: { wikidata: "Q1451600", nameEn: "Overseas Countries and Territories of the EU", aliases: ["OCT"], level: "subunion" }, geometry: null },
23032     { type: "Feature", properties: { wikidata: "Q1544253", nameEn: "Great Chagos Bank", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[70.1848, -6.37445], [72.17991, -6.68509], [73.20573, -5.20727], [70.1848, -6.37445]]]] } },
23033     { type: "Feature", properties: { wikidata: "Q1585511", nameEn: "Salomon Atoll", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[72.09518, -5.61768], [73.20573, -5.20727], [72.12587, -4.02588], [72.09518, -5.61768]]]] } },
23034     { type: "Feature", properties: { wikidata: "Q1681727", nameEn: "Saint-Paul and Amsterdam", country: "FR", groups: ["EU", "TF", "Q1451600", "014", "202", "002", "UN"], level: "subterritory" }, geometry: { type: "MultiPolygon", coordinates: [[[[76.31747, -42.16264], [80.15867, -36.04977], [71.22311, -38.75287], [76.31747, -42.16264]]]] } },
23035     { type: "Feature", properties: { wikidata: "Q1901211", nameEn: "East Malaysia", country: "MY", groups: ["Q36117", "035", "142", "UN"], driveSide: "left", callingCodes: ["60"] }, geometry: { type: "MultiPolygon", coordinates: [[[[110.90339, 7.52694], [109.82788, 2.86812], [109.62558, 1.99182], [109.53794, 1.91771], [109.57923, 1.80624], [109.66397, 1.79972], [109.66397, 1.60425], [110.35354, 0.98869], [110.49182, 0.88088], [110.62374, 0.873], [111.22979, 1.08326], [111.55434, 0.97864], [111.82846, 0.99349], [111.94553, 1.12016], [112.15679, 1.17004], [112.2127, 1.44135], [112.48648, 1.56516], [113.021, 1.57819], [113.01448, 1.42832], [113.64677, 1.23933], [114.03788, 1.44787], [114.57892, 1.5], [114.80706, 1.92351], [114.80706, 2.21665], [115.1721, 2.49671], [115.11343, 2.82879], [115.53713, 3.14776], [115.58276, 3.93499], [115.90217, 4.37708], [117.25801, 4.35108], [117.47313, 4.18857], [117.67641, 4.16535], [118.06469, 4.16638], [118.93936, 4.09009], [119.52945, 5.35672], [117.98544, 6.27477], [117.93857, 6.89845], [117.17735, 7.52841], [116.79524, 7.43869], [115.02521, 5.35005], [115.16236, 5.01011], [115.15092, 4.87604], [115.20737, 4.8256], [115.27819, 4.63661], [115.2851, 4.42295], [115.36346, 4.33563], [115.31275, 4.30806], [115.09978, 4.39123], [115.07737, 4.53418], [115.04064, 4.63706], [115.02278, 4.74137], [115.02955, 4.82087], [115.05038, 4.90275], [114.99417, 4.88201], [114.96982, 4.81146], [114.88841, 4.81905], [114.8266, 4.75062], [114.77303, 4.72871], [114.83189, 4.42387], [114.88039, 4.4257], [114.78539, 4.12205], [114.64211, 4.00694], [114.49922, 4.13108], [114.4416, 4.27588], [114.32176, 4.2552], [114.32176, 4.34942], [114.26876, 4.49878], [114.15813, 4.57], [114.07448, 4.58441], [114.10166, 4.76112], [110.90339, 7.52694]]]] } },
23036     { type: "Feature", properties: { wikidata: "Q1973345", nameEn: "Peninsular Malaysia", country: "MY", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["60"] }, geometry: { type: "MultiPolygon", coordinates: [[[[102.46318, 7.22462], [102.09086, 6.23546], [102.08127, 6.22679], [102.07732, 6.193], [102.09182, 6.14161], [102.01835, 6.05407], [101.99209, 6.04075], [101.97114, 6.01992], [101.9714, 6.00575], [101.94712, 5.98421], [101.92819, 5.85511], [101.91776, 5.84269], [101.89188, 5.8386], [101.80144, 5.74505], [101.75074, 5.79091], [101.69773, 5.75881], [101.58019, 5.93534], [101.25524, 5.78633], [101.25755, 5.71065], [101.14062, 5.61613], [100.98815, 5.79464], [101.02708, 5.91013], [101.087, 5.9193], [101.12388, 6.11411], [101.06165, 6.14161], [101.12618, 6.19431], [101.10313, 6.25617], [100.85884, 6.24929], [100.81045, 6.45086], [100.74822, 6.46231], [100.74361, 6.50811], [100.66986, 6.45086], [100.43027, 6.52389], [100.42351, 6.51762], [100.41791, 6.5189], [100.41152, 6.52299], [100.35413, 6.54932], [100.31929, 6.65413], [100.32607, 6.65933], [100.32671, 6.66526], [100.31884, 6.66423], [100.31618, 6.66781], [100.30828, 6.66462], [100.29651, 6.68439], [100.19511, 6.72559], [100.12, 6.42105], [100.0756, 6.4045], [99.91873, 6.50233], [99.50117, 6.44501], [99.31854, 5.99868], [99.75778, 3.86466], [103.03657, 1.30383], [103.56591, 1.19719], [103.62738, 1.35255], [103.67468, 1.43166], [103.7219, 1.46108], [103.74161, 1.4502], [103.76395, 1.45183], [103.81181, 1.47953], [103.86383, 1.46288], [103.89565, 1.42841], [103.93384, 1.42926], [104.00131, 1.42405], [104.02277, 1.4438], [104.04622, 1.44691], [104.07348, 1.43322], [104.08871, 1.42015], [104.09162, 1.39694], [104.08072, 1.35998], [104.12282, 1.27714], [104.34728, 1.33529], [104.56723, 1.44271], [105.01437, 3.24936], [102.46318, 7.22462]]]] } },
23037     { type: "Feature", properties: { wikidata: "Q2093907", nameEn: "Three Kings Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[174.17679, -32.62487], [170.93268, -32.97889], [171.97383, -34.64644], [174.17679, -32.62487]]]] } },
23038     { type: "Feature", properties: { wikidata: "Q2298216", nameEn: "Solander Islands", country: "NZ", groups: ["Q851132", "053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[167.39068, -46.49187], [166.5534, -46.39484], [166.84561, -46.84889], [167.39068, -46.49187]]]] } },
23039     { type: "Feature", properties: { wikidata: "Q2872203", nameEn: "Mainland Australia", country: "AU", groups: ["053", "009", "UN"], level: "subcountryGroup", driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[88.16419, -23.49578], [123.64533, -39.13605], [159.74028, -39.1978], [159.76765, -29.76946], [154.02855, -24.43238], [152.93188, -20.92631], [147.69992, -17.5933], [145.2855, -9.62524], [143.87386, -9.02382], [143.29772, -9.33993], [142.48658, -9.36754], [142.19246, -9.15378], [141.88934, -9.36111], [141.01842, -9.35091], [135.49042, -9.2276], [127.55165, -9.05052], [125.29076, -12.33139], [88.16419, -23.49578]]]] } },
23040     { type: "Feature", properties: { wikidata: "Q2914565", nameEn: "Autonomous Regions of Portugal", country: "PT", level: "subcountryGroup" }, geometry: null },
23041     { type: "Feature", properties: { wikidata: "Q2915956", nameEn: "Mainland Portugal", country: "PT", groups: ["Q12837", "EU", "039", "150", "UN"], level: "subcountryGroup", callingCodes: ["351"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-10.39881, 36.12218], [-7.37282, 36.96896], [-7.39769, 37.16868], [-7.41133, 37.20314], [-7.41854, 37.23813], [-7.43227, 37.25152], [-7.43974, 37.38913], [-7.46878, 37.47127], [-7.51759, 37.56119], [-7.41981, 37.75729], [-7.33441, 37.81193], [-7.27314, 37.90145], [-7.24544, 37.98884], [-7.12648, 38.00296], [-7.10366, 38.04404], [-7.05966, 38.01966], [-7.00375, 38.01914], [-6.93418, 38.21454], [-7.09389, 38.17227], [-7.15581, 38.27597], [-7.32529, 38.44336], [-7.265, 38.61674], [-7.26174, 38.72107], [-7.03848, 38.87221], [-7.051, 38.907], [-6.95211, 39.0243], [-6.97004, 39.07619], [-7.04011, 39.11919], [-7.10692, 39.10275], [-7.14929, 39.11287], [-7.12811, 39.17101], [-7.23566, 39.20132], [-7.23403, 39.27579], [-7.3149, 39.34857], [-7.2927, 39.45847], [-7.49477, 39.58794], [-7.54121, 39.66717], [-7.33507, 39.64569], [-7.24707, 39.66576], [-7.01613, 39.66877], [-6.97492, 39.81488], [-6.91463, 39.86618], [-6.86737, 40.01986], [-6.94233, 40.10716], [-7.00589, 40.12087], [-7.02544, 40.18564], [-7.00426, 40.23169], [-6.86085, 40.26776], [-6.86085, 40.2976], [-6.80218, 40.33239], [-6.78426, 40.36468], [-6.84618, 40.42177], [-6.84944, 40.46394], [-6.7973, 40.51723], [-6.80218, 40.55067], [-6.84292, 40.56801], [-6.79567, 40.65955], [-6.82826, 40.74603], [-6.82337, 40.84472], [-6.79892, 40.84842], [-6.80707, 40.88047], [-6.84292, 40.89771], [-6.8527, 40.93958], [-6.9357, 41.02888], [-6.913, 41.03922], [-6.88843, 41.03027], [-6.84781, 41.02692], [-6.80942, 41.03629], [-6.79241, 41.05397], [-6.75655, 41.10187], [-6.77319, 41.13049], [-6.69711, 41.1858], [-6.68286, 41.21641], [-6.65046, 41.24725], [-6.55937, 41.24417], [-6.38551, 41.35274], [-6.38553, 41.38655], [-6.3306, 41.37677], [-6.26777, 41.48796], [-6.19128, 41.57638], [-6.29863, 41.66432], [-6.44204, 41.68258], [-6.49907, 41.65823], [-6.54633, 41.68623], [-6.56426, 41.74219], [-6.51374, 41.8758], [-6.56752, 41.88429], [-6.5447, 41.94371], [-6.58544, 41.96674], [-6.61967, 41.94008], [-6.75004, 41.94129], [-6.76959, 41.98734], [-6.81196, 41.99097], [-6.82174, 41.94493], [-6.94396, 41.94403], [-6.95537, 41.96553], [-6.98144, 41.9728], [-7.01078, 41.94977], [-7.07596, 41.94977], [-7.08574, 41.97401], [-7.14115, 41.98855], [-7.18549, 41.97515], [-7.18677, 41.88793], [-7.32366, 41.8406], [-7.37092, 41.85031], [-7.42864, 41.80589], [-7.42854, 41.83262], [-7.44759, 41.84451], [-7.45566, 41.86488], [-7.49803, 41.87095], [-7.52737, 41.83939], [-7.62188, 41.83089], [-7.58603, 41.87944], [-7.65774, 41.88308], [-7.69848, 41.90977], [-7.84188, 41.88065], [-7.88055, 41.84571], [-7.88751, 41.92553], [-7.90707, 41.92432], [-7.92336, 41.8758], [-7.9804, 41.87337], [-8.01136, 41.83453], [-8.0961, 41.81024], [-8.16455, 41.81753], [-8.16944, 41.87944], [-8.19551, 41.87459], [-8.2185, 41.91237], [-8.16232, 41.9828], [-8.08796, 42.01398], [-8.08847, 42.05767], [-8.11729, 42.08537], [-8.18178, 42.06436], [-8.19406, 42.12141], [-8.18947, 42.13853], [-8.1986, 42.15402], [-8.22406, 42.1328], [-8.24681, 42.13993], [-8.2732, 42.12396], [-8.29809, 42.106], [-8.32161, 42.10218], [-8.33912, 42.08358], [-8.36353, 42.09065], [-8.38323, 42.07683], [-8.40143, 42.08052], [-8.42512, 42.07199], [-8.44123, 42.08218], [-8.48185, 42.0811], [-8.52837, 42.07658], [-8.5252, 42.06264], [-8.54563, 42.0537], [-8.58086, 42.05147], [-8.59493, 42.05708], [-8.63791, 42.04691], [-8.64626, 42.03668], [-8.65832, 42.02972], [-8.6681, 41.99703], [-8.69071, 41.98862], [-8.7478, 41.96282], [-8.74606, 41.9469], [-8.75712, 41.92833], [-8.81794, 41.90375], [-8.87157, 41.86488], [-11.19304, 41.83075], [-10.39881, 36.12218]]]] } },
23042     { type: "Feature", properties: { wikidata: "Q3311985", nameEn: "Guernsey", country: "GB", groups: ["GG", "830", "Q185086", "154", "150", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01481"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.49556, 49.79012], [-3.28154, 49.57329], [-2.65349, 49.15373], [-2.36485, 49.48223], [-2.49556, 49.79012]]]] } },
23043     { type: "Feature", properties: { wikidata: "Q3320166", nameEn: "Outermost Regions of the EU", aliases: ["OMR"], level: "subunion" }, geometry: null },
23044     { type: "Feature", properties: { wikidata: "Q3336843", nameEn: "Countries of the United Kingdom", aliases: ["GB-UKM"], country: "GB", level: "subcountryGroup" }, geometry: null },
23045     { type: "Feature", properties: { wikidata: "Q6736667", nameEn: "Mainland India", country: "IN", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["91"] }, geometry: { type: "MultiPolygon", coordinates: [[[[89.08044, 21.41871], [89.07114, 22.15335], [88.9367, 22.58527], [88.94614, 22.66941], [88.9151, 22.75228], [88.96713, 22.83346], [88.87063, 22.95235], [88.88327, 23.03885], [88.86377, 23.08759], [88.99148, 23.21134], [88.71133, 23.2492], [88.79254, 23.46028], [88.79351, 23.50535], [88.74841, 23.47361], [88.56507, 23.64044], [88.58087, 23.87105], [88.66189, 23.87607], [88.73743, 23.91751], [88.6976, 24.14703], [88.74841, 24.1959], [88.68801, 24.31464], [88.50934, 24.32474], [88.12296, 24.51301], [88.08786, 24.63232], [88.00683, 24.66477], [88.15515, 24.85806], [88.14004, 24.93529], [88.21832, 24.96642], [88.27325, 24.88796], [88.33917, 24.86803], [88.46277, 25.07468], [88.44766, 25.20149], [88.94067, 25.18534], [89.00463, 25.26583], [89.01105, 25.30303], [88.85278, 25.34679], [88.81296, 25.51546], [88.677, 25.46959], [88.4559, 25.59227], [88.45103, 25.66245], [88.242, 25.80811], [88.13138, 25.78773], [88.08804, 25.91334], [88.16581, 26.0238], [88.1844, 26.14417], [88.34757, 26.22216], [88.35153, 26.29123], [88.51649, 26.35923], [88.48749, 26.45855], [88.36938, 26.48683], [88.35153, 26.45241], [88.33093, 26.48929], [88.41196, 26.63837], [88.4298, 26.54489], [88.62144, 26.46783], [88.69485, 26.38353], [88.67837, 26.26291], [88.78961, 26.31093], [88.85004, 26.23211], [89.05328, 26.2469], [88.91321, 26.37984], [88.92357, 26.40711], [88.95612, 26.4564], [89.08899, 26.38845], [89.15869, 26.13708], [89.35953, 26.0077], [89.53515, 26.00382], [89.57101, 25.9682], [89.63968, 26.22595], [89.70201, 26.15138], [89.73581, 26.15818], [89.77865, 26.08387], [89.77728, 26.04254], [89.86592, 25.93115], [89.80585, 25.82489], [89.84388, 25.70042], [89.86129, 25.61714], [89.81208, 25.37244], [89.84086, 25.31854], [89.83371, 25.29548], [89.87629, 25.28337], [89.90478, 25.31038], [90.1155, 25.22686], [90.40034, 25.1534], [90.65042, 25.17788], [90.87427, 25.15799], [91.25517, 25.20677], [91.63648, 25.12846], [92.0316, 25.1834], [92.33957, 25.07593], [92.39147, 25.01471], [92.49887, 24.88796], [92.38626, 24.86055], [92.25854, 24.9191], [92.15796, 24.54435], [92.11662, 24.38997], [91.96603, 24.3799], [91.89258, 24.14674], [91.82596, 24.22345], [91.76004, 24.23848], [91.73257, 24.14703], [91.65292, 24.22095], [91.63782, 24.1132], [91.55542, 24.08687], [91.37414, 24.10693], [91.35741, 23.99072], [91.29587, 24.0041], [91.22308, 23.89616], [91.25192, 23.83463], [91.15579, 23.6599], [91.28293, 23.37538], [91.36453, 23.06612], [91.40848, 23.07117], [91.4035, 23.27522], [91.46615, 23.2328], [91.54993, 23.01051], [91.61571, 22.93929], [91.7324, 23.00043], [91.81634, 23.08001], [91.76417, 23.26619], [91.84789, 23.42235], [91.95642, 23.47361], [91.95093, 23.73284], [92.04706, 23.64229], [92.15417, 23.73409], [92.26541, 23.70392], [92.38214, 23.28705], [92.37665, 22.9435], [92.5181, 22.71441], [92.60029, 22.1522], [92.56616, 22.13554], [92.60949, 21.97638], [92.67532, 22.03547], [92.70416, 22.16017], [92.86208, 22.05456], [92.89504, 21.95143], [92.93899, 22.02656], [92.99804, 21.98964], [92.99255, 22.05965], [93.04885, 22.20595], [93.15734, 22.18687], [93.14224, 22.24535], [93.19991, 22.25425], [93.18206, 22.43716], [93.13537, 22.45873], [93.11477, 22.54374], [93.134, 22.59573], [93.09417, 22.69459], [93.134, 22.92498], [93.12988, 23.05772], [93.2878, 23.00464], [93.38478, 23.13698], [93.36862, 23.35426], [93.38781, 23.36139], [93.39981, 23.38828], [93.38805, 23.4728], [93.43475, 23.68299], [93.3908, 23.7622], [93.3908, 23.92925], [93.36059, 23.93176], [93.32351, 24.04468], [93.34735, 24.10151], [93.41415, 24.07854], [93.46633, 23.97067], [93.50616, 23.94432], [93.62871, 24.00922], [93.75952, 24.0003], [93.80279, 23.92549], [93.92089, 23.95812], [94.14081, 23.83333], [94.30215, 24.23752], [94.32362, 24.27692], [94.45279, 24.56656], [94.50729, 24.59281], [94.5526, 24.70764], [94.60204, 24.70889], [94.73937, 25.00545], [94.74212, 25.13606], [94.57458, 25.20318], [94.68032, 25.47003], [94.80117, 25.49359], [95.18556, 26.07338], [95.11428, 26.1019], [95.12801, 26.38397], [95.05798, 26.45408], [95.23513, 26.68499], [95.30339, 26.65372], [95.437, 26.7083], [95.81603, 27.01335], [95.93002, 27.04149], [96.04949, 27.19428], [96.15591, 27.24572], [96.40779, 27.29818], [96.55761, 27.29928], [96.73888, 27.36638], [96.88445, 27.25046], [96.85287, 27.2065], [96.89132, 27.17474], [97.14675, 27.09041], [97.17422, 27.14052], [96.91431, 27.45752], [96.90112, 27.62149], [97.29919, 27.92233], [97.35824, 27.87256], [97.38845, 28.01329], [97.35412, 28.06663], [97.31292, 28.06784], [97.34547, 28.21385], [97.1289, 28.3619], [96.98882, 28.32564], [96.88445, 28.39452], [96.85561, 28.4875], [96.6455, 28.61657], [96.48895, 28.42955], [96.40929, 28.51526], [96.61391, 28.72742], [96.3626, 29.10607], [96.20467, 29.02325], [96.18682, 29.11087], [96.31316, 29.18643], [96.05361, 29.38167], [95.84899, 29.31464], [95.75149, 29.32063], [95.72086, 29.20797], [95.50842, 29.13487], [95.41091, 29.13007], [95.3038, 29.13847], [95.26122, 29.07727], [95.2214, 29.10727], [95.11291, 29.09527], [95.0978, 29.14446], [94.81353, 29.17804], [94.69318, 29.31739], [94.2752, 29.11687], [94.35897, 29.01965], [93.72797, 28.68821], [93.44621, 28.67189], [93.18069, 28.50319], [93.14635, 28.37035], [92.93075, 28.25671], [92.67486, 28.15018], [92.65472, 28.07632], [92.73025, 28.05814], [92.7275, 27.98662], [92.42538, 27.80092], [92.32101, 27.79363], [92.27432, 27.89077], [91.87057, 27.7195], [91.84722, 27.76325], [91.6469, 27.76358], [91.55819, 27.6144], [91.65007, 27.48287], [92.01132, 27.47352], [92.12019, 27.27829], [92.04702, 27.26861], [92.03457, 27.07334], [92.11863, 26.893], [92.05523, 26.8692], [91.83181, 26.87318], [91.50067, 26.79223], [90.67715, 26.77215], [90.48504, 26.8594], [90.39271, 26.90704], [90.30402, 26.85098], [90.04535, 26.72422], [89.86124, 26.73307], [89.63369, 26.74402], [89.42349, 26.83727], [89.3901, 26.84225], [89.38319, 26.85963], [89.37913, 26.86224], [89.1926, 26.81329], [89.12825, 26.81661], [89.09554, 26.89089], [88.95807, 26.92668], [88.92301, 26.99286], [88.8714, 26.97488], [88.86984, 27.10937], [88.74219, 27.144], [88.91901, 27.32483], [88.82981, 27.38814], [88.77517, 27.45415], [88.88091, 27.85192], [88.83559, 28.01936], [88.63235, 28.12356], [88.54858, 28.06057], [88.25332, 27.9478], [88.1278, 27.95417], [88.13378, 27.88015], [88.1973, 27.85067], [88.19107, 27.79285], [88.04008, 27.49223], [88.07277, 27.43007], [88.01646, 27.21612], [88.01587, 27.21388], [87.9887, 27.11045], [88.11719, 26.98758], [88.13422, 26.98705], [88.12302, 26.95324], [88.19107, 26.75516], [88.1659, 26.68177], [88.16452, 26.64111], [88.09963, 26.54195], [88.09414, 26.43732], [88.00895, 26.36029], [87.90115, 26.44923], [87.89085, 26.48565], [87.84193, 26.43663], [87.7918, 26.46737], [87.76004, 26.40711], [87.67893, 26.43501], [87.66803, 26.40294], [87.59175, 26.38342], [87.55274, 26.40596], [87.51571, 26.43106], [87.46566, 26.44058], [87.37314, 26.40815], [87.34568, 26.34787], [87.26568, 26.37294], [87.26587, 26.40592], [87.24682, 26.4143], [87.18863, 26.40558], [87.14751, 26.40542], [87.09147, 26.45039], [87.0707, 26.58571], [87.04691, 26.58685], [87.01559, 26.53228], [86.95912, 26.52076], [86.94543, 26.52076], [86.82898, 26.43919], [86.76797, 26.45892], [86.74025, 26.42386], [86.69124, 26.45169], [86.62686, 26.46891], [86.61313, 26.48658], [86.57073, 26.49825], [86.54258, 26.53819], [86.49726, 26.54218], [86.31564, 26.61925], [86.26235, 26.61886], [86.22513, 26.58863], [86.13596, 26.60651], [86.02729, 26.66756], [85.8492, 26.56667], [85.85126, 26.60866], [85.83126, 26.61134], [85.76907, 26.63076], [85.72315, 26.67471], [85.73483, 26.79613], [85.66239, 26.84822], [85.61621, 26.86721], [85.59461, 26.85161], [85.5757, 26.85955], [85.56471, 26.84133], [85.47752, 26.79292], [85.34302, 26.74954], [85.21159, 26.75933], [85.18046, 26.80519], [85.19291, 26.86909], [85.15883, 26.86966], [85.02635, 26.85381], [85.05592, 26.88991], [85.00536, 26.89523], [84.97186, 26.9149], [84.96687, 26.95599], [84.85754, 26.98984], [84.82913, 27.01989], [84.793, 26.9968], [84.64496, 27.04669], [84.69166, 27.21294], [84.62161, 27.33885], [84.29315, 27.39], [84.25735, 27.44941], [84.21376, 27.45218], [84.10791, 27.52399], [84.02229, 27.43836], [83.93306, 27.44939], [83.86182, 27.4241], [83.85595, 27.35797], [83.61288, 27.47013], [83.39495, 27.4798], [83.38872, 27.39276], [83.35136, 27.33885], [83.29999, 27.32778], [83.2673, 27.36235], [83.27197, 27.38309], [83.19413, 27.45632], [82.94938, 27.46036], [82.93261, 27.50328], [82.74119, 27.49838], [82.70378, 27.72122], [82.46405, 27.6716], [82.06554, 27.92222], [81.97214, 27.93322], [81.91223, 27.84995], [81.47867, 28.08303], [81.48179, 28.12148], [81.38683, 28.17638], [81.32923, 28.13521], [81.19847, 28.36284], [81.03471, 28.40054], [80.55142, 28.69182], [80.50575, 28.6706], [80.52443, 28.54897], [80.44504, 28.63098], [80.37188, 28.63371], [80.12125, 28.82346], [80.06957, 28.82763], [80.05743, 28.91479], [80.18085, 29.13649], [80.23178, 29.11626], [80.26602, 29.13938], [80.24112, 29.21414], [80.28626, 29.20327], [80.31428, 29.30784], [80.24322, 29.44299], [80.37939, 29.57098], [80.41858, 29.63581], [80.38428, 29.68513], [80.36803, 29.73865], [80.41554, 29.79451], [80.43458, 29.80466], [80.48997, 29.79566], [80.56247, 29.86661], [80.57179, 29.91422], [80.60226, 29.95732], [80.67076, 29.95732], [80.8778, 30.13384], [80.86673, 30.17321], [80.91143, 30.22173], [80.92547, 30.17193], [81.03953, 30.20059], [80.83343, 30.32023], [80.54504, 30.44936], [80.20721, 30.58541], [79.93255, 30.88288], [79.59884, 30.93943], [79.30694, 31.17357], [79.14016, 31.43403], [79.01931, 31.42817], [78.89344, 31.30481], [78.77898, 31.31209], [78.71032, 31.50197], [78.84516, 31.60631], [78.69933, 31.78723], [78.78036, 31.99478], [78.74404, 32.00384], [78.68754, 32.10256], [78.49609, 32.2762], [78.4645, 32.45367], [78.38897, 32.53938], [78.73916, 32.69438], [78.7831, 32.46873], [78.96713, 32.33655], [78.99322, 32.37948], [79.0979, 32.38051], [79.13174, 32.47766], [79.26768, 32.53277], [79.46562, 32.69668], [79.14016, 33.02545], [79.15252, 33.17156], [78.73636, 33.56521], [78.67599, 33.66445], [78.77349, 33.73871], [78.73367, 34.01121], [78.65657, 34.03195], [78.66225, 34.08858], [78.91769, 34.15452], [78.99802, 34.3027], [79.05364, 34.32482], [78.74465, 34.45174], [78.56475, 34.50835], [78.54964, 34.57283], [78.27781, 34.61484], [78.18435, 34.7998], [78.22692, 34.88771], [78.00033, 35.23954], [78.03466, 35.3785], [78.11664, 35.48022], [77.80532, 35.52058], [77.70232, 35.46244], [77.44277, 35.46132], [76.96624, 35.5932], [76.84539, 35.67356], [76.77323, 35.66062], [76.75475, 35.52617], [76.85088, 35.39754], [76.93465, 35.39866], [77.11796, 35.05419], [76.99251, 34.93349], [76.87193, 34.96906], [76.74514, 34.92488], [76.74377, 34.84039], [76.67648, 34.76371], [76.47186, 34.78965], [76.15463, 34.6429], [76.04614, 34.67566], [75.75438, 34.51827], [75.38009, 34.55021], [75.01479, 34.64629], [74.6663, 34.703], [74.58083, 34.77386], [74.31239, 34.79626], [74.12897, 34.70073], [73.96423, 34.68244], [73.93401, 34.63386], [73.93951, 34.57169], [73.89419, 34.54568], [73.88732, 34.48911], [73.74999, 34.3781], [73.74862, 34.34183], [73.8475, 34.32935], [73.90517, 34.35317], [73.98208, 34.2522], [73.90677, 34.10504], [73.88732, 34.05105], [73.91341, 34.01235], [74.21554, 34.03853], [74.25262, 34.01577], [74.26086, 33.92237], [74.14001, 33.83002], [74.05898, 33.82089], [74.00891, 33.75437], [73.96423, 33.73071], [73.98968, 33.66155], [73.97367, 33.64061], [74.03576, 33.56718], [74.10115, 33.56392], [74.18121, 33.4745], [74.17983, 33.3679], [74.08782, 33.26232], [74.01366, 33.25199], [74.02144, 33.18908], [74.15374, 33.13477], [74.17571, 33.07495], [74.31854, 33.02891], [74.34875, 32.97823], [74.31227, 32.92795], [74.41467, 32.90563], [74.45312, 32.77755], [74.6289, 32.75561], [74.64675, 32.82604], [74.7113, 32.84219], [74.65345, 32.71225], [74.69542, 32.66792], [74.64424, 32.60985], [74.65251, 32.56416], [74.67431, 32.56676], [74.68362, 32.49298], [74.84725, 32.49075], [74.97634, 32.45367], [75.03265, 32.49538], [75.28259, 32.36556], [75.38046, 32.26836], [75.25649, 32.10187], [75.00793, 32.03786], [74.9269, 32.0658], [74.86236, 32.04485], [74.79919, 31.95983], [74.58907, 31.87824], [74.47771, 31.72227], [74.57498, 31.60382], [74.61517, 31.55698], [74.59319, 31.50197], [74.64713, 31.45605], [74.59773, 31.4136], [74.53223, 31.30321], [74.51629, 31.13829], [74.56023, 31.08303], [74.60281, 31.10419], [74.60006, 31.13711], [74.6852, 31.12771], [74.67971, 31.05479], [74.5616, 31.04153], [73.88993, 30.36305], [73.95736, 30.28466], [73.97225, 30.19829], [73.80299, 30.06969], [73.58665, 30.01848], [73.3962, 29.94707], [73.28094, 29.56646], [73.05886, 29.1878], [73.01337, 29.16422], [72.94272, 29.02487], [72.40402, 28.78283], [72.29495, 28.66367], [72.20329, 28.3869], [71.9244, 28.11555], [71.89921, 27.96035], [70.79054, 27.68423], [70.60927, 28.02178], [70.37307, 28.01208], [70.12502, 27.8057], [70.03136, 27.56627], [69.58519, 27.18109], [69.50904, 26.74892], [69.88555, 26.56836], [70.05584, 26.60398], [70.17532, 26.55362], [70.17532, 26.24118], [70.08193, 26.08094], [70.0985, 25.93238], [70.2687, 25.71156], [70.37444, 25.67443], [70.53649, 25.68928], [70.60378, 25.71898], [70.67382, 25.68186], [70.66695, 25.39314], [70.89148, 25.15064], [70.94002, 24.92843], [71.09405, 24.69017], [70.97594, 24.60904], [71.00341, 24.46038], [71.12838, 24.42662], [71.04461, 24.34657], [70.94985, 24.3791], [70.85784, 24.30903], [70.88393, 24.27398], [70.71502, 24.23517], [70.57906, 24.27774], [70.5667, 24.43787], [70.11712, 24.30915], [70.03428, 24.172], [69.73335, 24.17007], [69.59579, 24.29777], [69.29778, 24.28712], [69.19341, 24.25646], [69.07806, 24.29777], [68.97781, 24.26021], [68.90914, 24.33156], [68.7416, 24.31904], [68.74643, 23.97027], [68.39339, 23.96838], [68.20763, 23.85849], [68.11329, 23.53945], [76.59015, 5.591], [79.50447, 8.91876], [79.42124, 9.80115], [80.48418, 10.20786], [89.08044, 21.41871]]]] } },
23046     { type: "Feature", properties: { wikidata: "Q9143535", nameEn: "Akrotiri", country: "GB", groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"], level: "subterritory", driveSide: "left", callingCodes: ["357"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.86014, 34.70585], [32.82717, 34.70622], [32.79433, 34.67883], [32.76136, 34.68318], [32.75515, 34.64985], [32.74412, 34.43926], [33.26744, 34.49942], [33.0138, 34.64424], [32.96968, 34.64046], [32.96718, 34.63446], [32.95891, 34.62919], [32.95323, 34.64075], [32.95471, 34.64528], [32.94976, 34.65204], [32.94796, 34.6587], [32.95325, 34.66462], [32.97079, 34.66112], [32.97736, 34.65277], [32.99014, 34.65518], [32.98668, 34.67268], [32.99135, 34.68061], [32.95539, 34.68471], [32.94683, 34.67907], [32.94379, 34.67111], [32.93693, 34.67027], [32.93449, 34.66241], [32.92807, 34.66736], [32.93043, 34.67091], [32.91398, 34.67343], [32.9068, 34.66102], [32.86167, 34.68734], [32.86014, 34.70585]]]] } },
23047     { type: "Feature", properties: { wikidata: "Q9206745", nameEn: "Dhekelia", country: "GB", groups: ["Q644636", "Q37362", "BOTS", "145", "142", "UN"], level: "subterritory", driveSide: "left", callingCodes: ["357"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.70575, 34.97947], [33.83531, 34.73974], [33.98684, 34.76642], [33.90075, 34.96623], [33.86432, 34.97592], [33.84811, 34.97075], [33.83505, 34.98108], [33.85621, 34.98956], [33.85891, 35.001], [33.85216, 35.00579], [33.84045, 35.00616], [33.82875, 35.01685], [33.83055, 35.02865], [33.81524, 35.04192], [33.8012, 35.04786], [33.82051, 35.0667], [33.8355, 35.05777], [33.85261, 35.0574], [33.88367, 35.07877], [33.89485, 35.06873], [33.90247, 35.07686], [33.91299, 35.07579], [33.91789, 35.08688], [33.89853, 35.11377], [33.88737, 35.11408], [33.88943, 35.12007], [33.88561, 35.12449], [33.87224, 35.12293], [33.87622, 35.10457], [33.87097, 35.09389], [33.87479, 35.08881], [33.8541, 35.07201], [33.84168, 35.06823], [33.82067, 35.07826], [33.78581, 35.05104], [33.76106, 35.04253], [33.73824, 35.05321], [33.71482, 35.03722], [33.70209, 35.04882], [33.7161, 35.07279], [33.70861, 35.07644], [33.69095, 35.06237], [33.68474, 35.06602], [33.67742, 35.05963], [33.67678, 35.03866], [33.69938, 35.03123], [33.69731, 35.01754], [33.71514, 35.00294], [33.70639, 34.99303], [33.70575, 34.97947]], [[33.77312, 34.9976], [33.77553, 34.99518], [33.78516, 34.99582], [33.79191, 34.98914], [33.78917, 34.98854], [33.78571, 34.98951], [33.78318, 34.98699], [33.78149, 34.98854], [33.77843, 34.988], [33.7778, 34.98981], [33.76738, 34.99188], [33.76605, 34.99543], [33.75682, 34.99916], [33.75994, 35.00113], [33.77312, 34.9976]], [[33.74144, 35.01053], [33.7343, 35.01178], [33.73781, 35.02181], [33.74265, 35.02329], [33.74983, 35.02274], [33.7492, 35.01319], [33.74144, 35.01053]]]] } },
23048     { type: "Feature", properties: { wikidata: "Q16390686", nameEn: "Peninsular Spain", country: "ES", groups: ["Q12837", "EU", "039", "150", "UN"], callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[3.75438, 42.33445], [3.17156, 42.43545], [3.11379, 42.43646], [3.10027, 42.42621], [3.08167, 42.42748], [3.03734, 42.47363], [2.96518, 42.46692], [2.94283, 42.48174], [2.92107, 42.4573], [2.88413, 42.45938], [2.86983, 42.46843], [2.85675, 42.45444], [2.84335, 42.45724], [2.77464, 42.41046], [2.75497, 42.42578], [2.72056, 42.42298], [2.65311, 42.38771], [2.6747, 42.33974], [2.57934, 42.35808], [2.55516, 42.35351], [2.54382, 42.33406], [2.48457, 42.33933], [2.43508, 42.37568], [2.43299, 42.39423], [2.38504, 42.39977], [2.25551, 42.43757], [2.20578, 42.41633], [2.16599, 42.42314], [2.12789, 42.41291], [2.11621, 42.38393], [2.06241, 42.35906], [2.00488, 42.35399], [1.96482, 42.37787], [1.9574, 42.42401], [1.94084, 42.43039], [1.94061, 42.43333], [1.94292, 42.44316], [1.93663, 42.45439], [1.88853, 42.4501], [1.83037, 42.48395], [1.76335, 42.48863], [1.72515, 42.50338], [1.70571, 42.48867], [1.66826, 42.50779], [1.65674, 42.47125], [1.58933, 42.46275], [1.57953, 42.44957], [1.55937, 42.45808], [1.55073, 42.43299], [1.5127, 42.42959], [1.44529, 42.43724], [1.43838, 42.47848], [1.41648, 42.48315], [1.46661, 42.50949], [1.44759, 42.54431], [1.41245, 42.53539], [1.4234, 42.55959], [1.44529, 42.56722], [1.42512, 42.58292], [1.44197, 42.60217], [1.35562, 42.71944], [1.15928, 42.71407], [1.0804, 42.78569], [0.98292, 42.78754], [0.96166, 42.80629], [0.93089, 42.79154], [0.711, 42.86372], [0.66121, 42.84021], [0.65421, 42.75872], [0.67873, 42.69458], [0.40214, 42.69779], [0.36251, 42.72282], [0.29407, 42.67431], [0.25336, 42.7174], [0.17569, 42.73424], [-0.02468, 42.68513], [-0.10519, 42.72761], [-0.16141, 42.79535], [-0.17939, 42.78974], [-0.3122, 42.84788], [-0.38833, 42.80132], [-0.41319, 42.80776], [-0.44334, 42.79939], [-0.50863, 42.82713], [-0.55497, 42.77846], [-0.67637, 42.88303], [-0.69837, 42.87945], [-0.72608, 42.89318], [-0.73422, 42.91228], [-0.72037, 42.92541], [-0.75478, 42.96916], [-0.81652, 42.95166], [-0.97133, 42.96239], [-1.00963, 42.99279], [-1.10333, 43.0059], [-1.22881, 43.05534], [-1.25244, 43.04164], [-1.30531, 43.06859], [-1.30052, 43.09581], [-1.27118, 43.11961], [-1.32209, 43.1127], [-1.34419, 43.09665], [-1.35272, 43.02658], [-1.44067, 43.047], [-1.47555, 43.08372], [-1.41562, 43.12815], [-1.3758, 43.24511], [-1.40942, 43.27272], [-1.45289, 43.27049], [-1.50992, 43.29481], [-1.55963, 43.28828], [-1.57674, 43.25269], [-1.61341, 43.25269], [-1.63052, 43.28591], [-1.62481, 43.30726], [-1.69407, 43.31378], [-1.73074, 43.29481], [-1.7397, 43.32979], [-1.75079, 43.3317], [-1.75334, 43.34107], [-1.77068, 43.34396], [-1.78714, 43.35476], [-1.78332, 43.36399], [-1.79319, 43.37497], [-1.77289, 43.38957], [-1.81005, 43.59738], [-10.14298, 44.17365], [-11.19304, 41.83075], [-8.87157, 41.86488], [-8.81794, 41.90375], [-8.75712, 41.92833], [-8.74606, 41.9469], [-8.7478, 41.96282], [-8.69071, 41.98862], [-8.6681, 41.99703], [-8.65832, 42.02972], [-8.64626, 42.03668], [-8.63791, 42.04691], [-8.59493, 42.05708], [-8.58086, 42.05147], [-8.54563, 42.0537], [-8.5252, 42.06264], [-8.52837, 42.07658], [-8.48185, 42.0811], [-8.44123, 42.08218], [-8.42512, 42.07199], [-8.40143, 42.08052], [-8.38323, 42.07683], [-8.36353, 42.09065], [-8.33912, 42.08358], [-8.32161, 42.10218], [-8.29809, 42.106], [-8.2732, 42.12396], [-8.24681, 42.13993], [-8.22406, 42.1328], [-8.1986, 42.15402], [-8.18947, 42.13853], [-8.19406, 42.12141], [-8.18178, 42.06436], [-8.11729, 42.08537], [-8.08847, 42.05767], [-8.08796, 42.01398], [-8.16232, 41.9828], [-8.2185, 41.91237], [-8.19551, 41.87459], [-8.16944, 41.87944], [-8.16455, 41.81753], [-8.0961, 41.81024], [-8.01136, 41.83453], [-7.9804, 41.87337], [-7.92336, 41.8758], [-7.90707, 41.92432], [-7.88751, 41.92553], [-7.88055, 41.84571], [-7.84188, 41.88065], [-7.69848, 41.90977], [-7.65774, 41.88308], [-7.58603, 41.87944], [-7.62188, 41.83089], [-7.52737, 41.83939], [-7.49803, 41.87095], [-7.45566, 41.86488], [-7.44759, 41.84451], [-7.42854, 41.83262], [-7.42864, 41.80589], [-7.37092, 41.85031], [-7.32366, 41.8406], [-7.18677, 41.88793], [-7.18549, 41.97515], [-7.14115, 41.98855], [-7.08574, 41.97401], [-7.07596, 41.94977], [-7.01078, 41.94977], [-6.98144, 41.9728], [-6.95537, 41.96553], [-6.94396, 41.94403], [-6.82174, 41.94493], [-6.81196, 41.99097], [-6.76959, 41.98734], [-6.75004, 41.94129], [-6.61967, 41.94008], [-6.58544, 41.96674], [-6.5447, 41.94371], [-6.56752, 41.88429], [-6.51374, 41.8758], [-6.56426, 41.74219], [-6.54633, 41.68623], [-6.49907, 41.65823], [-6.44204, 41.68258], [-6.29863, 41.66432], [-6.19128, 41.57638], [-6.26777, 41.48796], [-6.3306, 41.37677], [-6.38553, 41.38655], [-6.38551, 41.35274], [-6.55937, 41.24417], [-6.65046, 41.24725], [-6.68286, 41.21641], [-6.69711, 41.1858], [-6.77319, 41.13049], [-6.75655, 41.10187], [-6.79241, 41.05397], [-6.80942, 41.03629], [-6.84781, 41.02692], [-6.88843, 41.03027], [-6.913, 41.03922], [-6.9357, 41.02888], [-6.8527, 40.93958], [-6.84292, 40.89771], [-6.80707, 40.88047], [-6.79892, 40.84842], [-6.82337, 40.84472], [-6.82826, 40.74603], [-6.79567, 40.65955], [-6.84292, 40.56801], [-6.80218, 40.55067], [-6.7973, 40.51723], [-6.84944, 40.46394], [-6.84618, 40.42177], [-6.78426, 40.36468], [-6.80218, 40.33239], [-6.86085, 40.2976], [-6.86085, 40.26776], [-7.00426, 40.23169], [-7.02544, 40.18564], [-7.00589, 40.12087], [-6.94233, 40.10716], [-6.86737, 40.01986], [-6.91463, 39.86618], [-6.97492, 39.81488], [-7.01613, 39.66877], [-7.24707, 39.66576], [-7.33507, 39.64569], [-7.54121, 39.66717], [-7.49477, 39.58794], [-7.2927, 39.45847], [-7.3149, 39.34857], [-7.23403, 39.27579], [-7.23566, 39.20132], [-7.12811, 39.17101], [-7.14929, 39.11287], [-7.10692, 39.10275], [-7.04011, 39.11919], [-6.97004, 39.07619], [-6.95211, 39.0243], [-7.051, 38.907], [-7.03848, 38.87221], [-7.26174, 38.72107], [-7.265, 38.61674], [-7.32529, 38.44336], [-7.15581, 38.27597], [-7.09389, 38.17227], [-6.93418, 38.21454], [-7.00375, 38.01914], [-7.05966, 38.01966], [-7.10366, 38.04404], [-7.12648, 38.00296], [-7.24544, 37.98884], [-7.27314, 37.90145], [-7.33441, 37.81193], [-7.41981, 37.75729], [-7.51759, 37.56119], [-7.46878, 37.47127], [-7.43974, 37.38913], [-7.43227, 37.25152], [-7.41854, 37.23813], [-7.41133, 37.20314], [-7.39769, 37.16868], [-7.37282, 36.96896], [-7.2725, 35.73269], [-5.10878, 36.05227], [-2.27707, 35.35051], [3.75438, 42.33445]], [[-5.27801, 36.14942], [-5.34064, 36.03744], [-5.40526, 36.15488], [-5.34536, 36.15501], [-5.33822, 36.15272], [-5.27801, 36.14942]]], [[[1.99838, 42.44682], [2.01564, 42.45171], [1.99216, 42.46208], [1.98579, 42.47486], [1.99766, 42.4858], [1.98916, 42.49351], [1.98022, 42.49569], [1.97697, 42.48568], [1.97227, 42.48487], [1.97003, 42.48081], [1.96215, 42.47854], [1.95606, 42.45785], [1.96125, 42.45364], [1.98378, 42.44697], [1.99838, 42.44682]]]] } },
23049     { type: "Feature", properties: { wikidata: "Q98059339", nameEn: "Mainland Norway", country: "NO", groups: ["154", "150", "UN"], callingCodes: ["47"] }, geometry: { type: "MultiPolygon", coordinates: [[[[10.40861, 58.38489], [10.64958, 58.89391], [11.08911, 58.98745], [11.15367, 59.07862], [11.34459, 59.11672], [11.4601, 58.99022], [11.45199, 58.89604], [11.65732, 58.90177], [11.8213, 59.24985], [11.69297, 59.59442], [11.92112, 59.69531], [11.87121, 59.86039], [12.15641, 59.8926], [12.36317, 59.99259], [12.52003, 60.13846], [12.59133, 60.50559], [12.2277, 61.02442], [12.69115, 61.06584], [12.86939, 61.35427], [12.57707, 61.56547], [12.40595, 61.57226], [12.14746, 61.7147], [12.29187, 62.25699], [12.07085, 62.6297], [12.19919, 63.00104], [11.98529, 63.27487], [12.19919, 63.47935], [12.14928, 63.59373], [12.74105, 64.02171], [13.23411, 64.09087], [13.98222, 64.00953], [14.16051, 64.18725], [14.11117, 64.46674], [13.64276, 64.58402], [14.50926, 65.31786], [14.53778, 66.12399], [15.05113, 66.15572], [15.49318, 66.28509], [15.37197, 66.48217], [16.35589, 67.06419], [16.39154, 67.21653], [16.09922, 67.4364], [16.12774, 67.52106], [16.38441, 67.52923], [16.7409, 67.91037], [17.30416, 68.11591], [17.90787, 67.96537], [18.13836, 68.20874], [18.1241, 68.53721], [18.39503, 68.58672], [18.63032, 68.50849], [18.97255, 68.52416], [19.93508, 68.35911], [20.22027, 68.48759], [19.95647, 68.55546], [20.22027, 68.67246], [20.33435, 68.80174], [20.28444, 68.93283], [20.0695, 69.04469], [20.55258, 69.06069], [20.72171, 69.11874], [21.05775, 69.0356], [21.11099, 69.10291], [20.98641, 69.18809], [21.00732, 69.22755], [21.27827, 69.31281], [21.63833, 69.27485], [22.27276, 68.89514], [22.38367, 68.71561], [22.53321, 68.74393], [23.13064, 68.64684], [23.68017, 68.70276], [23.781, 68.84514], [24.02299, 68.81601], [24.18432, 68.73936], [24.74898, 68.65143], [24.90023, 68.55579], [24.93048, 68.61102], [25.10189, 68.63307], [25.12206, 68.78684], [25.42455, 68.90328], [25.61613, 68.89602], [25.75729, 68.99383], [25.69679, 69.27039], [25.96904, 69.68397], [26.40261, 69.91377], [26.64461, 69.96565], [27.05802, 69.92069], [27.57226, 70.06215], [27.95542, 70.0965], [27.97558, 69.99671], [28.32849, 69.88605], [28.36883, 69.81658], [29.12697, 69.69193], [29.31664, 69.47994], [28.8629, 69.22395], [28.81248, 69.11997], [28.91738, 69.04774], [29.0444, 69.0119], [29.26623, 69.13794], [29.27631, 69.2811], [29.97205, 69.41623], [30.16363, 69.65244], [30.52662, 69.54699], [30.95011, 69.54699], [30.84095, 69.80584], [31.59909, 70.16571], [32.07813, 72.01005], [-11.60274, 67.73467], [7.28637, 57.35913], [10.40861, 58.38489]]]] } },
23050     { type: "Feature", properties: { wikidata: "Q98543636", nameEn: "Mainland Ecuador", country: "EC", groups: ["005", "419", "019", "UN"], callingCodes: ["593"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-84.52388, -3.36941], [-80.30602, -3.39149], [-80.20647, -3.431], [-80.24123, -3.46124], [-80.24586, -3.48677], [-80.23651, -3.48652], [-80.22629, -3.501], [-80.20535, -3.51667], [-80.21642, -3.5888], [-80.19848, -3.59249], [-80.18741, -3.63994], [-80.19926, -3.68894], [-80.13232, -3.90317], [-80.46386, -4.01342], [-80.4822, -4.05477], [-80.45023, -4.20938], [-80.32114, -4.21323], [-80.46386, -4.41516], [-80.39256, -4.48269], [-80.13945, -4.29786], [-79.79722, -4.47558], [-79.59402, -4.46848], [-79.26248, -4.95167], [-79.1162, -4.97774], [-79.01659, -5.01481], [-78.85149, -4.66795], [-78.68394, -4.60754], [-78.34362, -3.38633], [-78.24589, -3.39907], [-78.22642, -3.51113], [-78.14324, -3.47653], [-78.19369, -3.36431], [-77.94147, -3.05454], [-76.6324, -2.58397], [-76.05203, -2.12179], [-75.57429, -1.55961], [-75.3872, -0.9374], [-75.22862, -0.95588], [-75.22862, -0.60048], [-75.53615, -0.19213], [-75.60169, -0.18708], [-75.61997, -0.10012], [-75.40192, -0.17196], [-75.25764, -0.11943], [-75.82927, 0.09578], [-76.23441, 0.42294], [-76.41215, 0.38228], [-76.4094, 0.24015], [-76.89177, 0.24736], [-77.52001, 0.40782], [-77.49984, 0.64476], [-77.67815, 0.73863], [-77.66416, 0.81604], [-77.68613, 0.83029], [-77.7148, 0.85003], [-77.85677, 0.80197], [-78.42749, 1.15389], [-78.87137, 1.47457], [-82.12561, 4.00341], [-84.52388, -3.36941]]]] } },
23051     { type: "Feature", properties: { m49: "001", wikidata: "Q2", nameEn: "World", aliases: ["Earth", "Planet"], level: "world" }, geometry: null },
23052     { type: "Feature", properties: { m49: "002", wikidata: "Q15", nameEn: "Africa", level: "region" }, geometry: null },
23053     { type: "Feature", properties: { m49: "003", wikidata: "Q49", nameEn: "North America", level: "subregion" }, geometry: null },
23054     { type: "Feature", properties: { m49: "005", wikidata: "Q18", nameEn: "South America", level: "intermediateRegion" }, geometry: null },
23055     { type: "Feature", properties: { m49: "009", wikidata: "Q538", nameEn: "Oceania", level: "region" }, geometry: null },
23056     { type: "Feature", properties: { m49: "011", wikidata: "Q4412", nameEn: "Western Africa", level: "intermediateRegion" }, geometry: null },
23057     { type: "Feature", properties: { m49: "013", wikidata: "Q27611", nameEn: "Central America", level: "intermediateRegion" }, geometry: null },
23058     { type: "Feature", properties: { m49: "014", wikidata: "Q27407", nameEn: "Eastern Africa", level: "intermediateRegion" }, geometry: null },
23059     { type: "Feature", properties: { m49: "015", wikidata: "Q27381", nameEn: "Northern Africa", level: "subregion" }, geometry: null },
23060     { type: "Feature", properties: { m49: "017", wikidata: "Q27433", nameEn: "Middle Africa", level: "intermediateRegion" }, geometry: null },
23061     { type: "Feature", properties: { m49: "018", wikidata: "Q27394", nameEn: "Southern Africa", level: "intermediateRegion" }, geometry: null },
23062     { type: "Feature", properties: { m49: "019", wikidata: "Q828", nameEn: "Americas", level: "region" }, geometry: null },
23063     { type: "Feature", properties: { m49: "021", wikidata: "Q2017699", nameEn: "Northern America", level: "subregion" }, geometry: null },
23064     { type: "Feature", properties: { m49: "029", wikidata: "Q664609", nameEn: "Caribbean", level: "intermediateRegion" }, geometry: null },
23065     { type: "Feature", properties: { m49: "030", wikidata: "Q27231", nameEn: "Eastern Asia", level: "subregion" }, geometry: null },
23066     { type: "Feature", properties: { m49: "034", wikidata: "Q771405", nameEn: "Southern Asia", level: "subregion" }, geometry: null },
23067     { type: "Feature", properties: { m49: "035", wikidata: "Q11708", nameEn: "South-eastern Asia", level: "subregion" }, geometry: null },
23068     { type: "Feature", properties: { m49: "039", wikidata: "Q27449", nameEn: "Southern Europe", level: "subregion" }, geometry: null },
23069     { type: "Feature", properties: { m49: "053", wikidata: "Q45256", nameEn: "Australia and New Zealand", aliases: ["Australasia"], level: "subregion" }, geometry: null },
23070     { type: "Feature", properties: { m49: "054", wikidata: "Q37394", nameEn: "Melanesia", level: "subregion" }, geometry: null },
23071     { type: "Feature", properties: { m49: "057", wikidata: "Q3359409", nameEn: "Micronesia", level: "subregion" }, geometry: null },
23072     { type: "Feature", properties: { m49: "061", wikidata: "Q35942", nameEn: "Polynesia", level: "subregion" }, geometry: null },
23073     { type: "Feature", properties: { m49: "142", wikidata: "Q48", nameEn: "Asia", level: "region" }, geometry: null },
23074     { type: "Feature", properties: { m49: "143", wikidata: "Q27275", nameEn: "Central Asia", level: "subregion" }, geometry: null },
23075     { type: "Feature", properties: { m49: "145", wikidata: "Q27293", nameEn: "Western Asia", level: "subregion" }, geometry: null },
23076     { type: "Feature", properties: { m49: "150", wikidata: "Q46", nameEn: "Europe", level: "region" }, geometry: null },
23077     { type: "Feature", properties: { m49: "151", wikidata: "Q27468", nameEn: "Eastern Europe", level: "subregion" }, geometry: null },
23078     { type: "Feature", properties: { m49: "154", wikidata: "Q27479", nameEn: "Northern Europe", level: "subregion" }, geometry: null },
23079     { type: "Feature", properties: { m49: "155", wikidata: "Q27496", nameEn: "Western Europe", level: "subregion" }, geometry: null },
23080     { type: "Feature", properties: { m49: "202", wikidata: "Q132959", nameEn: "Sub-Saharan Africa", level: "subregion" }, geometry: null },
23081     { type: "Feature", properties: { m49: "419", wikidata: "Q72829598", nameEn: "Latin America and the Caribbean", level: "subregion" }, geometry: null },
23082     { type: "Feature", properties: { m49: "680", wikidata: "Q3405693", nameEn: "Sark", country: "GB", groups: ["GG", "830", "Q185086", "154", "150", "UN"], level: "subterritory", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01481"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.36485, 49.48223], [-2.65349, 49.15373], [-2.09454, 49.46288], [-2.36485, 49.48223]]]] } },
23083     { type: "Feature", properties: { m49: "830", wikidata: "Q42314", nameEn: "Channel Islands", level: "intermediateRegion" }, geometry: null },
23084     { type: "Feature", properties: { iso1A2: "AC", iso1A3: "ASC", wikidata: "Q46197", nameEn: "Ascension Island", aliases: ["SH-AC"], country: "GB", groups: ["SH", "BOTS", "011", "202", "002", "UN"], isoStatus: "excRes", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["247"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-14.82771, -8.70814], [-13.33271, -8.07391], [-14.91926, -6.63386], [-14.82771, -8.70814]]]] } },
23085     { type: "Feature", properties: { iso1A2: "AD", iso1A3: "AND", iso1N3: "020", wikidata: "Q228", nameEn: "Andorra", groups: ["Q12837", "039", "150", "UN"], callingCodes: ["376"] }, geometry: { type: "MultiPolygon", coordinates: [[[[1.72515, 42.50338], [1.73683, 42.55492], [1.7858, 42.57698], [1.72588, 42.59098], [1.73452, 42.61515], [1.68267, 42.62533], [1.6625, 42.61982], [1.63485, 42.62957], [1.60085, 42.62703], [1.55418, 42.65669], [1.50867, 42.64483], [1.48043, 42.65203], [1.46718, 42.63296], [1.47986, 42.61346], [1.44197, 42.60217], [1.42512, 42.58292], [1.44529, 42.56722], [1.4234, 42.55959], [1.41245, 42.53539], [1.44759, 42.54431], [1.46661, 42.50949], [1.41648, 42.48315], [1.43838, 42.47848], [1.44529, 42.43724], [1.5127, 42.42959], [1.55073, 42.43299], [1.55937, 42.45808], [1.57953, 42.44957], [1.58933, 42.46275], [1.65674, 42.47125], [1.66826, 42.50779], [1.70571, 42.48867], [1.72515, 42.50338]]]] } },
23086     { type: "Feature", properties: { iso1A2: "AE", iso1A3: "ARE", iso1N3: "784", wikidata: "Q878", nameEn: "United Arab Emirates", groups: ["145", "142", "UN"], callingCodes: ["971"] }, geometry: { type: "MultiPolygon", coordinates: [[[[56.26534, 25.62825], [56.25341, 25.61443], [56.26636, 25.60643], [56.25365, 25.60211], [56.20473, 25.61119], [56.18363, 25.65508], [56.14826, 25.66351], [56.13579, 25.73524], [56.17416, 25.77239], [56.13963, 25.82765], [56.19334, 25.9795], [56.15498, 26.06828], [56.08666, 26.05038], [55.81777, 26.18798], [55.14145, 25.62624], [53.97892, 24.64436], [52.82259, 25.51697], [52.35509, 25.00368], [52.02277, 24.75635], [51.83108, 24.71675], [51.58834, 24.66608], [51.41644, 24.39615], [51.58871, 24.27256], [51.59617, 24.12041], [52.56622, 22.94341], [55.13599, 22.63334], [55.2137, 22.71065], [55.22634, 23.10378], [55.57358, 23.669], [55.48677, 23.94946], [55.73301, 24.05994], [55.8308, 24.01633], [56.01799, 24.07426], [55.95472, 24.2172], [55.83367, 24.20193], [55.77658, 24.23476], [55.76558, 24.23227], [55.75257, 24.23466], [55.75382, 24.2466], [55.75939, 24.26114], [55.76781, 24.26209], [55.79145, 24.27914], [55.80747, 24.31069], [55.83395, 24.32776], [55.83271, 24.41521], [55.76461, 24.5287], [55.83271, 24.68567], [55.83408, 24.77858], [55.81348, 24.80102], [55.81116, 24.9116], [55.85094, 24.96858], [55.90849, 24.96771], [55.96316, 25.00857], [56.05715, 24.95727], [56.05106, 24.87461], [55.97467, 24.89639], [55.97836, 24.87673], [56.03535, 24.81161], [56.06128, 24.74457], [56.13684, 24.73699], [56.20062, 24.78565], [56.20568, 24.85063], [56.30269, 24.88334], [56.34873, 24.93205], [56.3227, 24.97284], [56.86325, 25.03856], [56.82555, 25.7713], [56.26534, 25.62825]], [[56.26062, 25.33108], [56.3005, 25.31815], [56.3111, 25.30107], [56.35172, 25.30681], [56.34438, 25.26653], [56.27628, 25.23404], [56.24341, 25.22867], [56.20872, 25.24104], [56.20838, 25.25668], [56.24465, 25.27505], [56.25008, 25.28843], [56.23362, 25.31253], [56.26062, 25.33108]]], [[[56.28423, 25.26344], [56.29379, 25.2754], [56.28102, 25.28486], [56.2716, 25.27916], [56.27086, 25.26128], [56.28423, 25.26344]]]] } },
23087     { type: "Feature", properties: { iso1A2: "AF", iso1A3: "AFG", iso1N3: "004", wikidata: "Q889", nameEn: "Afghanistan", groups: ["034", "142", "UN"], callingCodes: ["93"] }, geometry: { type: "MultiPolygon", coordinates: [[[[70.61526, 38.34774], [70.60407, 38.28046], [70.54673, 38.24541], [70.4898, 38.12546], [70.17206, 37.93276], [70.1863, 37.84296], [70.27694, 37.81258], [70.28243, 37.66706], [70.15015, 37.52519], [69.95971, 37.5659], [69.93362, 37.61378], [69.84435, 37.60616], [69.80041, 37.5746], [69.51888, 37.5844], [69.44954, 37.4869], [69.36645, 37.40462], [69.45022, 37.23315], [69.39529, 37.16752], [69.25152, 37.09426], [69.03274, 37.25174], [68.96407, 37.32603], [68.88168, 37.33368], [68.91189, 37.26704], [68.80889, 37.32494], [68.81438, 37.23862], [68.6798, 37.27906], [68.61851, 37.19815], [68.41888, 37.13906], [68.41201, 37.10402], [68.29253, 37.10621], [68.27605, 37.00977], [68.18542, 37.02074], [68.02194, 36.91923], [67.87917, 37.0591], [67.7803, 37.08978], [67.78329, 37.1834], [67.51868, 37.26102], [67.2581, 37.17216], [67.2224, 37.24545], [67.13039, 37.27168], [67.08232, 37.35469], [66.95598, 37.40162], [66.64699, 37.32958], [66.55743, 37.35409], [66.30993, 37.32409], [65.72274, 37.55438], [65.64137, 37.45061], [65.64263, 37.34388], [65.51778, 37.23881], [64.97945, 37.21913], [64.61141, 36.6351], [64.62514, 36.44311], [64.57295, 36.34362], [64.43288, 36.24401], [64.05385, 36.10433], [63.98519, 36.03773], [63.56496, 35.95106], [63.53475, 35.90881], [63.29579, 35.85985], [63.12276, 35.86208], [63.10318, 35.81782], [63.23262, 35.67487], [63.10079, 35.63024], [63.12276, 35.53196], [63.0898, 35.43131], [62.90853, 35.37086], [62.74098, 35.25432], [62.62288, 35.22067], [62.48006, 35.28796], [62.29878, 35.13312], [62.29191, 35.25964], [62.15871, 35.33278], [62.05709, 35.43803], [61.97743, 35.4604], [61.77693, 35.41341], [61.58742, 35.43803], [61.27371, 35.61482], [61.18187, 35.30249], [61.0991, 35.27845], [61.12831, 35.09938], [61.06926, 34.82139], [61.00197, 34.70631], [60.99922, 34.63064], [60.72316, 34.52857], [60.91321, 34.30411], [60.66502, 34.31539], [60.50209, 34.13992], [60.5838, 33.80793], [60.5485, 33.73422], [60.57762, 33.59772], [60.69573, 33.56054], [60.91133, 33.55596], [60.88908, 33.50219], [60.56485, 33.12944], [60.86191, 32.22565], [60.84541, 31.49561], [61.70929, 31.37391], [61.80569, 31.16167], [61.80957, 31.12576], [61.83257, 31.0452], [61.8335, 30.97669], [61.78268, 30.92724], [61.80829, 30.84224], [60.87231, 29.86514], [62.47751, 29.40782], [63.5876, 29.50456], [64.12966, 29.39157], [64.19796, 29.50407], [64.62116, 29.58903], [65.04005, 29.53957], [66.24175, 29.85181], [66.36042, 29.9583], [66.23609, 30.06321], [66.34869, 30.404], [66.28413, 30.57001], [66.39194, 30.9408], [66.42645, 30.95309], [66.58175, 30.97532], [66.68166, 31.07597], [66.72561, 31.20526], [66.83273, 31.26867], [67.04147, 31.31561], [67.03323, 31.24519], [67.29964, 31.19586], [67.78854, 31.33203], [67.7748, 31.4188], [67.62374, 31.40473], [67.58323, 31.52772], [67.72056, 31.52304], [67.86887, 31.63536], [68.00071, 31.6564], [68.1655, 31.82691], [68.25614, 31.80357], [68.27605, 31.75863], [68.44222, 31.76446], [68.57475, 31.83158], [68.6956, 31.75687], [68.79997, 31.61665], [68.91078, 31.59687], [68.95995, 31.64822], [69.00939, 31.62249], [69.11514, 31.70782], [69.20577, 31.85957], [69.3225, 31.93186], [69.27032, 32.14141], [69.27932, 32.29119], [69.23599, 32.45946], [69.2868, 32.53938], [69.38155, 32.56601], [69.44747, 32.6678], [69.43649, 32.7302], [69.38018, 32.76601], [69.47082, 32.85834], [69.5436, 32.8768], [69.49854, 32.88843], [69.49004, 33.01509], [69.57656, 33.09911], [69.71526, 33.09911], [69.79766, 33.13247], [69.85259, 33.09451], [70.02563, 33.14282], [70.07369, 33.22557], [70.13686, 33.21064], [70.32775, 33.34496], [70.17062, 33.53535], [70.20141, 33.64387], [70.14785, 33.6553], [70.14236, 33.71701], [70.00503, 33.73528], [69.85671, 33.93719], [69.87307, 33.9689], [69.90203, 34.04194], [70.54336, 33.9463], [70.88119, 33.97933], [71.07345, 34.06242], [71.06933, 34.10564], [71.09307, 34.11961], [71.09453, 34.13524], [71.13078, 34.16503], [71.12815, 34.26619], [71.17662, 34.36769], [71.02401, 34.44835], [71.0089, 34.54568], [71.11602, 34.63047], [71.08718, 34.69034], [71.28356, 34.80882], [71.29472, 34.87728], [71.50329, 34.97328], [71.49917, 35.00478], [71.55273, 35.02615], [71.52938, 35.09023], [71.67495, 35.21262], [71.5541, 35.28776], [71.54294, 35.31037], [71.65435, 35.4479], [71.49917, 35.6267], [71.55273, 35.71483], [71.37969, 35.95865], [71.19505, 36.04134], [71.60491, 36.39429], [71.80267, 36.49924], [72.18135, 36.71838], [72.6323, 36.84601], [73.82685, 36.91421], [74.04856, 36.82648], [74.43389, 37.00977], [74.53739, 36.96224], [74.56453, 37.03023], [74.49981, 37.24518], [74.80605, 37.21565], [74.88887, 37.23275], [74.8294, 37.3435], [74.68383, 37.3948], [74.56161, 37.37734], [74.41055, 37.3948], [74.23339, 37.41116], [74.20308, 37.34208], [73.8564, 37.26158], [73.82552, 37.22659], [73.64974, 37.23643], [73.61129, 37.27469], [73.76647, 37.33913], [73.77197, 37.4417], [73.29633, 37.46495], [73.06884, 37.31729], [72.79693, 37.22222], [72.66381, 37.02014], [72.54095, 37.00007], [72.31676, 36.98115], [71.83229, 36.68084], [71.67083, 36.67346], [71.57195, 36.74943], [71.51502, 36.89128], [71.48481, 36.93218], [71.46923, 36.99925], [71.45578, 37.03094], [71.43097, 37.05855], [71.44127, 37.11856], [71.4494, 37.18137], [71.4555, 37.21418], [71.47386, 37.2269], [71.48339, 37.23937], [71.4824, 37.24921], [71.48536, 37.26017], [71.50674, 37.31502], [71.49821, 37.31975], [71.4862, 37.33405], [71.47685, 37.40281], [71.49612, 37.4279], [71.5256, 37.47971], [71.50616, 37.50733], [71.49693, 37.53527], [71.5065, 37.60912], [71.51972, 37.61945], [71.54186, 37.69691], [71.55234, 37.73209], [71.53053, 37.76534], [71.54324, 37.77104], [71.55752, 37.78677], [71.59255, 37.79956], [71.58843, 37.92425], [71.51565, 37.95349], [71.32871, 37.88564], [71.296, 37.93403], [71.2809, 37.91995], [71.24969, 37.93031], [71.27278, 37.96496], [71.27622, 37.99946], [71.28922, 38.01272], [71.29878, 38.04429], [71.36444, 38.15358], [71.37803, 38.25641], [71.33869, 38.27335], [71.33114, 38.30339], [71.21291, 38.32797], [71.1451, 38.40106], [71.10957, 38.40671], [71.10592, 38.42077], [71.09542, 38.42517], [71.0556, 38.40176], [71.03545, 38.44779], [70.98693, 38.48862], [70.92728, 38.43021], [70.88719, 38.46826], [70.84376, 38.44688], [70.82538, 38.45394], [70.81697, 38.44507], [70.80521, 38.44447], [70.79766, 38.44944], [70.78702, 38.45031], [70.78581, 38.45502], [70.77132, 38.45548], [70.75455, 38.4252], [70.72485, 38.4131], [70.69807, 38.41861], [70.67438, 38.40597], [70.6761, 38.39144], [70.69189, 38.37031], [70.64966, 38.34999], [70.61526, 38.34774]]]] } },
23088     { type: "Feature", properties: { iso1A2: "AG", iso1A3: "ATG", iso1N3: "028", wikidata: "Q781", nameEn: "Antigua and Barbuda", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 268"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.66959, 18.6782], [-62.58307, 16.68909], [-62.1023, 16.97277], [-61.23098, 16.62484], [-61.66959, 18.6782]]]] } },
23089     { type: "Feature", properties: { iso1A2: "AI", iso1A3: "AIA", iso1N3: "660", wikidata: "Q25228", nameEn: "Anguilla", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 264"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.79029, 19.11219], [-63.35989, 18.06012], [-62.62718, 18.26185], [-63.79029, 19.11219]]]] } },
23090     { type: "Feature", properties: { iso1A2: "AL", iso1A3: "ALB", iso1N3: "008", wikidata: "Q222", nameEn: "Albania", groups: ["039", "150", "UN"], callingCodes: ["355"] }, geometry: { type: "MultiPolygon", coordinates: [[[[20.07761, 42.55582], [20.01834, 42.54622], [20.00842, 42.5109], [19.9324, 42.51699], [19.82333, 42.46581], [19.76549, 42.50237], [19.74731, 42.57422], [19.77375, 42.58517], [19.73244, 42.66299], [19.65972, 42.62774], [19.4836, 42.40831], [19.42352, 42.36546], [19.42, 42.33019], [19.28623, 42.17745], [19.40687, 42.10024], [19.37548, 42.06835], [19.36867, 42.02564], [19.37691, 41.96977], [19.34601, 41.95675], [19.33812, 41.90669], [19.37451, 41.8842], [19.37597, 41.84849], [19.26406, 41.74971], [19.0384, 40.35325], [19.95905, 39.82857], [19.97622, 39.78684], [19.92466, 39.69533], [19.98042, 39.6504], [20.00957, 39.69227], [20.05189, 39.69112], [20.12956, 39.65805], [20.15988, 39.652], [20.22376, 39.64532], [20.22707, 39.67459], [20.27412, 39.69884], [20.31961, 39.72799], [20.29152, 39.80421], [20.30804, 39.81563], [20.38572, 39.78516], [20.41475, 39.81437], [20.41546, 39.82832], [20.31135, 39.99438], [20.37911, 39.99058], [20.42373, 40.06777], [20.48487, 40.06271], [20.51297, 40.08168], [20.55593, 40.06524], [20.61081, 40.07866], [20.62566, 40.0897], [20.67162, 40.09433], [20.71789, 40.27739], [20.78234, 40.35803], [20.7906, 40.42726], [20.83688, 40.47882], [20.94925, 40.46625], [20.96908, 40.51526], [21.03932, 40.56299], [21.05833, 40.66586], [20.98134, 40.76046], [20.95752, 40.76982], [20.98396, 40.79109], [20.97887, 40.85475], [20.97693, 40.90103], [20.94305, 40.92399], [20.83671, 40.92752], [20.81567, 40.89662], [20.73504, 40.9081], [20.71634, 40.91781], [20.65558, 41.08009], [20.63454, 41.0889], [20.59832, 41.09066], [20.58546, 41.11179], [20.59715, 41.13644], [20.51068, 41.2323], [20.49432, 41.33679], [20.52119, 41.34381], [20.55976, 41.4087], [20.51301, 41.442], [20.49039, 41.49277], [20.45331, 41.51436], [20.45809, 41.5549], [20.52103, 41.56473], [20.55508, 41.58113], [20.51769, 41.65975], [20.52937, 41.69292], [20.51301, 41.72433], [20.53405, 41.78099], [20.57144, 41.7897], [20.55976, 41.87068], [20.59524, 41.8818], [20.57946, 41.91593], [20.63069, 41.94913], [20.59434, 42.03879], [20.55633, 42.08173], [20.56955, 42.12097], [20.48857, 42.25444], [20.3819, 42.3029], [20.34479, 42.32656], [20.24399, 42.32168], [20.21797, 42.41237], [20.17127, 42.50469], [20.07761, 42.55582]]]] } },
23091     { type: "Feature", properties: { iso1A2: "AM", iso1A3: "ARM", iso1N3: "051", wikidata: "Q399", nameEn: "Armenia", groups: ["145", "142", "UN"], callingCodes: ["374"] }, geometry: { type: "MultiPolygon", coordinates: [[[[45.0133, 41.29747], [44.93493, 41.25685], [44.81437, 41.30371], [44.80053, 41.25949], [44.81749, 41.23488], [44.84358, 41.23088], [44.89911, 41.21366], [44.87887, 41.20195], [44.82084, 41.21513], [44.72814, 41.20338], [44.61462, 41.24018], [44.59322, 41.1933], [44.46791, 41.18204], [44.34417, 41.2382], [44.34337, 41.20312], [44.32139, 41.2079], [44.18148, 41.24644], [44.16591, 41.19141], [43.84835, 41.16329], [43.74717, 41.1117], [43.67712, 41.13398], [43.4717, 41.12611], [43.44984, 41.0988], [43.47319, 41.02251], [43.58683, 40.98961], [43.67712, 40.93084], [43.67712, 40.84846], [43.74872, 40.7365], [43.7425, 40.66805], [43.63664, 40.54159], [43.54791, 40.47413], [43.60862, 40.43267], [43.59928, 40.34019], [43.71136, 40.16673], [43.65221, 40.14889], [43.65688, 40.11199], [43.92307, 40.01787], [44.1057, 40.03555], [44.1778, 40.02845], [44.26973, 40.04866], [44.46635, 39.97733], [44.61845, 39.8281], [44.75779, 39.7148], [44.88354, 39.74432], [44.92869, 39.72157], [45.06604, 39.79277], [45.18554, 39.67846], [45.17464, 39.58614], [45.21784, 39.58074], [45.23535, 39.61373], [45.30385, 39.61373], [45.29606, 39.57654], [45.46992, 39.49888], [45.70547, 39.60174], [45.80804, 39.56716], [45.83, 39.46487], [45.79225, 39.3695], [45.99774, 39.28931], [46.02303, 39.09978], [46.06973, 39.0744], [46.14785, 38.84206], [46.20601, 38.85262], [46.34059, 38.92076], [46.53497, 38.86548], [46.51805, 38.94982], [46.54296, 39.07078], [46.44022, 39.19636], [46.52584, 39.18912], [46.54141, 39.15895], [46.58032, 39.21204], [46.63481, 39.23013], [46.56476, 39.24942], [46.50093, 39.33736], [46.43244, 39.35181], [46.37795, 39.42039], [46.4013, 39.45405], [46.53051, 39.47809], [46.51027, 39.52373], [46.57721, 39.54414], [46.57098, 39.56694], [46.52117, 39.58734], [46.42465, 39.57534], [46.40286, 39.63651], [46.18493, 39.60533], [45.96543, 39.78859], [45.82533, 39.82925], [45.7833, 39.9475], [45.60895, 39.97733], [45.59806, 40.0131], [45.78642, 40.03218], [45.83779, 39.98925], [45.97944, 40.181], [45.95609, 40.27846], [45.65098, 40.37696], [45.42994, 40.53804], [45.45484, 40.57707], [45.35366, 40.65979], [45.4206, 40.7424], [45.55914, 40.78366], [45.60584, 40.87436], [45.40814, 40.97904], [45.44083, 41.01663], [45.39725, 41.02603], [45.35677, 40.99784], [45.28859, 41.03757], [45.26162, 41.0228], [45.25897, 41.0027], [45.1994, 41.04518], [45.16493, 41.05068], [45.1634, 41.08082], [45.1313, 41.09369], [45.12923, 41.06059], [45.06784, 41.05379], [45.08028, 41.10917], [45.19942, 41.13299], [45.1969, 41.168], [45.11811, 41.19967], [45.05201, 41.19211], [45.02932, 41.2101], [45.05497, 41.2464], [45.0133, 41.29747]], [[45.21324, 40.9817], [45.21219, 40.99001], [45.20518, 40.99348], [45.19312, 40.98998], [45.18382, 41.0066], [45.20625, 41.01484], [45.23487, 41.00226], [45.23095, 40.97828], [45.21324, 40.9817]], [[45.00864, 41.03411], [44.9903, 41.05657], [44.96031, 41.06345], [44.95383, 41.07553], [44.97169, 41.09176], [45.00864, 41.09407], [45.03406, 41.07931], [45.04517, 41.06653], [45.03792, 41.03938], [45.00864, 41.03411]]], [[[45.50279, 40.58424], [45.56071, 40.64765], [45.51825, 40.67382], [45.47927, 40.65023], [45.50279, 40.58424]]]] } },
23092     { type: "Feature", properties: { iso1A2: "AO", iso1A3: "AGO", iso1N3: "024", wikidata: "Q916", nameEn: "Angola", groups: ["017", "202", "002", "UN"], callingCodes: ["244"] }, geometry: { type: "MultiPolygon", coordinates: [[[[16.55507, -5.85631], [13.04371, -5.87078], [12.42245, -6.07585], [11.95767, -5.94705], [12.20376, -5.76338], [12.26557, -5.74031], [12.52318, -5.74353], [12.52301, -5.17481], [12.53599, -5.1618], [12.53586, -5.14658], [12.51589, -5.1332], [12.49815, -5.14058], [12.46297, -5.09408], [12.60251, -5.01715], [12.63465, -4.94632], [12.70868, -4.95505], [12.8733, -4.74346], [13.11195, -4.67745], [13.09648, -4.63739], [12.91489, -4.47907], [12.87096, -4.40315], [12.76844, -4.38709], [12.64835, -4.55937], [12.40964, -4.60609], [12.32324, -4.78415], [12.25587, -4.79437], [12.20901, -4.75642], [12.16068, -4.90089], [12.00924, -5.02627], [11.50888, -5.33417], [10.5065, -17.25284], [11.75063, -17.25013], [12.07076, -17.15165], [12.52111, -17.24495], [12.97145, -16.98567], [13.36212, -16.98048], [13.95896, -17.43141], [14.28743, -17.38814], [18.39229, -17.38927], [18.84226, -17.80375], [21.14283, -17.94318], [21.42741, -18.02787], [23.47474, -17.62877], [23.20038, -17.47563], [22.17217, -16.50269], [22.00323, -16.18028], [21.97988, -13.00148], [24.03339, -12.99091], [23.90937, -12.844], [24.06672, -12.29058], [23.98804, -12.13149], [24.02603, -11.15368], [24.00027, -10.89356], [23.86868, -11.02856], [23.45631, -10.946], [23.16602, -11.10577], [22.54205, -11.05784], [22.25951, -11.24911], [22.17954, -10.85884], [22.32604, -10.76291], [22.19039, -9.94628], [21.84856, -9.59871], [21.79824, -7.29628], [20.56263, -7.28566], [20.61689, -6.90876], [20.31846, -6.91953], [20.30218, -6.98955], [19.5469, -7.00195], [19.33698, -7.99743], [18.33635, -8.00126], [17.5828, -8.13784], [16.96282, -7.21787], [16.55507, -5.85631]]]] } },
23093     { type: "Feature", properties: { iso1A2: "AQ", iso1A3: "ATA", iso1N3: "010", wikidata: "Q51", nameEn: "Antarctica", level: "region", callingCodes: ["672"] }, geometry: { type: "MultiPolygon", coordinates: [[[[180, -60], [-180, -60], [-180, -90], [180, -90], [180, -60]]]] } },
23094     { type: "Feature", properties: { iso1A2: "AR", iso1A3: "ARG", iso1N3: "032", wikidata: "Q414", nameEn: "Argentina", aliases: ["RA"], groups: ["005", "419", "019", "UN"], callingCodes: ["54"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-72.31343, -50.58411], [-72.33873, -51.59954], [-71.99889, -51.98018], [-69.97824, -52.00845], [-68.41683, -52.33516], [-68.60702, -52.65781], [-68.60733, -54.9125], [-68.01394, -54.8753], [-67.46182, -54.92205], [-67.11046, -54.94199], [-66.07313, -55.19618], [-63.67376, -55.11859], [-54.78916, -36.21945], [-57.83001, -34.69099], [-58.34425, -34.15035], [-58.44442, -33.84033], [-58.40475, -33.11777], [-58.1224, -32.98842], [-58.22362, -32.52416], [-58.10036, -32.25338], [-58.20252, -31.86966], [-58.00076, -31.65016], [-58.0023, -31.53084], [-58.07569, -31.44916], [-57.98127, -31.3872], [-57.9908, -31.34924], [-57.86729, -31.06352], [-57.89476, -30.95994], [-57.8024, -30.77193], [-57.89115, -30.49572], [-57.64859, -30.35095], [-57.61478, -30.25165], [-57.65132, -30.19229], [-57.09386, -29.74211], [-56.81251, -29.48154], [-56.62789, -29.18073], [-56.57295, -29.11357], [-56.54171, -29.11447], [-56.05265, -28.62651], [-56.00458, -28.60421], [-56.01729, -28.51223], [-55.65418, -28.18304], [-55.6262, -28.17124], [-55.33303, -27.94661], [-55.16872, -27.86224], [-55.1349, -27.89759], [-54.90805, -27.73149], [-54.90159, -27.63132], [-54.67657, -27.57214], [-54.50416, -27.48232], [-54.41888, -27.40882], [-54.19268, -27.30751], [-54.19062, -27.27639], [-54.15978, -27.2889], [-53.80144, -27.09844], [-53.73372, -26.6131], [-53.68269, -26.33359], [-53.64505, -26.28089], [-53.64186, -26.25976], [-53.64632, -26.24798], [-53.63881, -26.25075], [-53.63739, -26.2496], [-53.65237, -26.23289], [-53.65018, -26.19501], [-53.73968, -26.10012], [-53.73391, -26.07006], [-53.7264, -26.0664], [-53.73086, -26.05842], [-53.73511, -26.04211], [-53.83691, -25.94849], [-53.90831, -25.55513], [-54.52926, -25.62846], [-54.5502, -25.58915], [-54.59398, -25.59224], [-54.62063, -25.91213], [-54.60664, -25.9691], [-54.67359, -25.98607], [-54.69333, -26.37705], [-54.70732, -26.45099], [-54.80868, -26.55669], [-55.00584, -26.78754], [-55.06351, -26.80195], [-55.16948, -26.96068], [-55.25243, -26.93808], [-55.39611, -26.97679], [-55.62322, -27.1941], [-55.59094, -27.32444], [-55.74475, -27.44485], [-55.89195, -27.3467], [-56.18313, -27.29851], [-56.85337, -27.5165], [-58.04205, -27.2387], [-58.59549, -27.29973], [-58.65321, -27.14028], [-58.3198, -26.83443], [-58.1188, -26.16704], [-57.87176, -25.93604], [-57.57431, -25.47269], [-57.80821, -25.13863], [-58.25492, -24.92528], [-58.33055, -24.97099], [-59.33886, -24.49935], [-59.45482, -24.34787], [-60.03367, -24.00701], [-60.28163, -24.04436], [-60.99754, -23.80934], [-61.0782, -23.62932], [-61.9756, -23.0507], [-62.22768, -22.55807], [-62.51761, -22.37684], [-62.64455, -22.25091], [-62.8078, -22.12534], [-62.81124, -21.9987], [-63.66482, -21.99918], [-63.68113, -22.0544], [-63.70963, -21.99934], [-63.93287, -21.99934], [-64.22918, -22.55807], [-64.31489, -22.88824], [-64.35108, -22.73282], [-64.4176, -22.67692], [-64.58888, -22.25035], [-64.67174, -22.18957], [-64.90014, -22.12136], [-64.99524, -22.08255], [-65.47435, -22.08908], [-65.57743, -22.07675], [-65.58694, -22.09794], [-65.61166, -22.09504], [-65.7467, -22.10105], [-65.9261, -21.93335], [-66.04832, -21.9187], [-66.03836, -21.84829], [-66.24077, -21.77837], [-66.29714, -22.08741], [-66.7298, -22.23644], [-67.18382, -22.81525], [-66.99632, -22.99839], [-67.33563, -24.04237], [-68.24825, -24.42596], [-68.56909, -24.69831], [-68.38372, -25.08636], [-68.57622, -25.32505], [-68.38372, -26.15353], [-68.56909, -26.28146], [-68.59048, -26.49861], [-68.27677, -26.90626], [-68.43363, -27.08414], [-68.77586, -27.16029], [-69.22504, -27.95042], [-69.66709, -28.44055], [-69.80969, -29.07185], [-69.99507, -29.28351], [-69.8596, -30.26131], [-70.14479, -30.36595], [-70.55832, -31.51559], [-69.88099, -33.34489], [-69.87386, -34.13344], [-70.49416, -35.24145], [-70.38008, -36.02375], [-70.95047, -36.4321], [-71.24279, -37.20264], [-70.89532, -38.6923], [-71.37826, -38.91474], [-71.92726, -40.72714], [-71.74901, -42.11711], [-72.15541, -42.15941], [-72.14828, -42.85321], [-71.64206, -43.64774], [-71.81318, -44.38097], [-71.16436, -44.46244], [-71.26418, -44.75684], [-72.06985, -44.81756], [-71.35687, -45.22075], [-71.75614, -45.61611], [-71.68577, -46.55385], [-71.94152, -47.13595], [-72.50478, -47.80586], [-72.27662, -48.28727], [-72.54042, -48.52392], [-72.56894, -48.81116], [-73.09655, -49.14342], [-73.45156, -49.79461], [-73.55259, -49.92488], [-73.15765, -50.78337], [-72.31343, -50.58411]]]] } },
23095     { type: "Feature", properties: { iso1A2: "AS", iso1A3: "ASM", iso1N3: "016", wikidata: "Q16641", nameEn: "American Samoa", aliases: ["US-AS"], country: "US", groups: ["Q1352230", "061", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 684"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-171.39864, -10.21587], [-170.99605, -15.1275], [-166.32598, -15.26169], [-171.39864, -10.21587]]]] } },
23096     { type: "Feature", properties: { iso1A2: "AT", iso1A3: "AUT", iso1N3: "040", wikidata: "Q40", nameEn: "Austria", groups: ["EU", "155", "150", "UN"], callingCodes: ["43"] }, geometry: { type: "MultiPolygon", coordinates: [[[[15.34823, 48.98444], [15.28305, 48.98831], [15.26177, 48.95766], [15.16358, 48.94278], [15.15534, 48.99056], [14.99878, 49.01444], [14.97612, 48.96983], [14.98917, 48.90082], [14.95072, 48.79101], [14.98032, 48.77959], [14.9782, 48.7766], [14.98112, 48.77524], [14.9758, 48.76857], [14.95641, 48.75915], [14.94773, 48.76268], [14.81545, 48.7874], [14.80821, 48.77711], [14.80584, 48.73489], [14.72756, 48.69502], [14.71794, 48.59794], [14.66762, 48.58215], [14.60808, 48.62881], [14.56139, 48.60429], [14.4587, 48.64695], [14.43076, 48.58855], [14.33909, 48.55852], [14.20691, 48.5898], [14.09104, 48.5943], [14.01482, 48.63788], [14.06151, 48.66873], [13.84023, 48.76988], [13.82266, 48.75544], [13.81863, 48.73257], [13.79337, 48.71375], [13.81791, 48.69832], [13.81283, 48.68426], [13.81901, 48.6761], [13.82609, 48.62345], [13.80038, 48.59487], [13.80519, 48.58026], [13.76921, 48.55324], [13.7513, 48.5624], [13.74816, 48.53058], [13.72802, 48.51208], [13.66113, 48.53558], [13.65186, 48.55092], [13.62508, 48.55501], [13.59705, 48.57013], [13.57535, 48.55912], [13.51291, 48.59023], [13.50131, 48.58091], [13.50663, 48.57506], [13.46967, 48.55157], [13.45214, 48.56472], [13.43695, 48.55776], [13.45727, 48.51092], [13.42527, 48.45711], [13.43929, 48.43386], [13.40709, 48.37292], [13.30897, 48.31575], [13.26039, 48.29422], [13.18093, 48.29577], [13.126, 48.27867], [13.0851, 48.27711], [13.02083, 48.25689], [12.95306, 48.20629], [12.87126, 48.20318], [12.84475, 48.16556], [12.836, 48.1647], [12.8362, 48.15876], [12.82673, 48.15245], [12.80676, 48.14979], [12.78595, 48.12445], [12.7617, 48.12796], [12.74973, 48.10885], [12.76141, 48.07373], [12.8549, 48.01122], [12.87476, 47.96195], [12.91683, 47.95647], [12.9211, 47.95135], [12.91985, 47.94069], [12.92668, 47.93879], [12.93419, 47.94063], [12.93642, 47.94436], [12.93886, 47.94046], [12.94163, 47.92927], [13.00588, 47.84374], [12.98543, 47.82896], [12.96311, 47.79957], [12.93202, 47.77302], [12.94371, 47.76281], [12.9353, 47.74788], [12.91711, 47.74026], [12.90274, 47.72513], [12.91333, 47.7178], [12.92969, 47.71094], [12.98578, 47.7078], [13.01382, 47.72116], [13.07692, 47.68814], [13.09562, 47.63304], [13.06407, 47.60075], [13.06641, 47.58577], [13.04537, 47.58183], [13.05355, 47.56291], [13.03252, 47.53373], [13.04537, 47.49426], [12.9998, 47.46267], [12.98344, 47.48716], [12.9624, 47.47452], [12.85256, 47.52741], [12.84672, 47.54556], [12.80699, 47.54477], [12.77427, 47.58025], [12.82101, 47.61493], [12.76492, 47.64485], [12.77777, 47.66689], [12.7357, 47.6787], [12.6071, 47.6741], [12.57438, 47.63238], [12.53816, 47.63553], [12.50076, 47.62293], [12.44117, 47.6741], [12.43883, 47.6977], [12.37222, 47.68433], [12.336, 47.69534], [12.27991, 47.68827], [12.26004, 47.67725], [12.24017, 47.69534], [12.26238, 47.73544], [12.2542, 47.7433], [12.22571, 47.71776], [12.18303, 47.70065], [12.16217, 47.70105], [12.16769, 47.68167], [12.18347, 47.66663], [12.18507, 47.65984], [12.19895, 47.64085], [12.20801, 47.61082], [12.20398, 47.60667], [12.18568, 47.6049], [12.17737, 47.60121], [12.18145, 47.61019], [12.17824, 47.61506], [12.13734, 47.60639], [12.05788, 47.61742], [12.02282, 47.61033], [12.0088, 47.62451], [11.85572, 47.60166], [11.84052, 47.58354], [11.63934, 47.59202], [11.60681, 47.57881], [11.58811, 47.55515], [11.58578, 47.52281], [11.52618, 47.50939], [11.4362, 47.51413], [11.38128, 47.47465], [11.4175, 47.44621], [11.33804, 47.44937], [11.29597, 47.42566], [11.27844, 47.39956], [11.22002, 47.3964], [11.25157, 47.43277], [11.20482, 47.43198], [11.12536, 47.41222], [11.11835, 47.39719], [10.97111, 47.39561], [10.97111, 47.41617], [10.98513, 47.42882], [10.92437, 47.46991], [10.93839, 47.48018], [10.90918, 47.48571], [10.87061, 47.4786], [10.86945, 47.5015], [10.91268, 47.51334], [10.88814, 47.53701], [10.77596, 47.51729], [10.7596, 47.53228], [10.6965, 47.54253], [10.68832, 47.55752], [10.63456, 47.5591], [10.60337, 47.56755], [10.56912, 47.53584], [10.48849, 47.54057], [10.47329, 47.58552], [10.43473, 47.58394], [10.44992, 47.5524], [10.4324, 47.50111], [10.44291, 47.48453], [10.46278, 47.47901], [10.47446, 47.43318], [10.4359, 47.41183], [10.4324, 47.38494], [10.39851, 47.37623], [10.33424, 47.30813], [10.23257, 47.27088], [10.17531, 47.27167], [10.17648, 47.29149], [10.2147, 47.31014], [10.19998, 47.32832], [10.23757, 47.37609], [10.22774, 47.38904], [10.2127, 47.38019], [10.17648, 47.38889], [10.16362, 47.36674], [10.11805, 47.37228], [10.09819, 47.35724], [10.06897, 47.40709], [10.1052, 47.4316], [10.09001, 47.46005], [10.07131, 47.45531], [10.03859, 47.48927], [10.00003, 47.48216], [9.96029, 47.53899], [9.92407, 47.53111], [9.87733, 47.54688], [9.87499, 47.52953], [9.8189, 47.54688], [9.82591, 47.58158], [9.80254, 47.59419], [9.76748, 47.5934], [9.72736, 47.53457], [9.55125, 47.53629], [9.56312, 47.49495], [9.58208, 47.48344], [9.59482, 47.46305], [9.60205, 47.46165], [9.60484, 47.46358], [9.60841, 47.47178], [9.62158, 47.45858], [9.62475, 47.45685], [9.6423, 47.45599], [9.65728, 47.45383], [9.65863, 47.44847], [9.64483, 47.43842], [9.6446, 47.43233], [9.65043, 47.41937], [9.65136, 47.40504], [9.6629, 47.39591], [9.67334, 47.39191], [9.67445, 47.38429], [9.6711, 47.37824], [9.66243, 47.37136], [9.65427, 47.36824], [9.62476, 47.36639], [9.59978, 47.34671], [9.58513, 47.31334], [9.55857, 47.29919], [9.54773, 47.2809], [9.53116, 47.27029], [9.56766, 47.24281], [9.55176, 47.22585], [9.56981, 47.21926], [9.58264, 47.20673], [9.56539, 47.17124], [9.62623, 47.14685], [9.63395, 47.08443], [9.61216, 47.07732], [9.60717, 47.06091], [9.87935, 47.01337], [9.88266, 46.93343], [9.98058, 46.91434], [10.10715, 46.84296], [10.22675, 46.86942], [10.24128, 46.93147], [10.30031, 46.92093], [10.36933, 47.00212], [10.48376, 46.93891], [10.47197, 46.85698], [10.54783, 46.84505], [10.66405, 46.87614], [10.75753, 46.82258], [10.72974, 46.78972], [11.00764, 46.76896], [11.10618, 46.92966], [11.33355, 46.99862], [11.50739, 47.00644], [11.74789, 46.98484], [12.19254, 47.09331], [12.21781, 47.03996], [12.11675, 47.01241], [12.2006, 46.88854], [12.27591, 46.88651], [12.38708, 46.71529], [12.59992, 46.6595], [12.94445, 46.60401], [13.27627, 46.56059], [13.64088, 46.53438], [13.7148, 46.5222], [13.89837, 46.52331], [14.00422, 46.48474], [14.04002, 46.49117], [14.12097, 46.47724], [14.15989, 46.43327], [14.28326, 46.44315], [14.314, 46.43327], [14.42608, 46.44614], [14.45877, 46.41717], [14.52176, 46.42617], [14.56463, 46.37208], [14.5942, 46.43434], [14.66892, 46.44936], [14.72185, 46.49974], [14.81836, 46.51046], [14.83549, 46.56614], [14.86419, 46.59411], [14.87129, 46.61], [14.92283, 46.60848], [14.96002, 46.63459], [14.98024, 46.6009], [15.01451, 46.641], [15.14215, 46.66131], [15.23711, 46.63994], [15.41235, 46.65556], [15.45514, 46.63697], [15.46906, 46.61321], [15.54431, 46.6312], [15.55333, 46.64988], [15.54533, 46.66985], [15.59826, 46.68908], [15.62317, 46.67947], [15.63255, 46.68069], [15.6365, 46.6894], [15.6543, 46.69228], [15.6543, 46.70616], [15.67411, 46.70735], [15.69523, 46.69823], [15.72279, 46.69548], [15.73823, 46.70011], [15.76771, 46.69863], [15.78518, 46.70712], [15.8162, 46.71897], [15.87691, 46.7211], [15.94864, 46.68769], [15.98512, 46.68463], [15.99988, 46.67947], [16.04036, 46.6549], [16.04347, 46.68694], [16.02808, 46.71094], [15.99769, 46.7266], [15.98432, 46.74991], [15.99126, 46.78199], [15.99054, 46.82772], [16.05786, 46.83927], [16.10983, 46.867], [16.19904, 46.94134], [16.22403, 46.939], [16.27594, 46.9643], [16.28202, 47.00159], [16.51369, 47.00084], [16.43936, 47.03548], [16.52176, 47.05747], [16.46134, 47.09395], [16.52863, 47.13974], [16.44932, 47.14418], [16.46442, 47.16845], [16.4523, 47.18812], [16.42801, 47.18422], [16.41739, 47.20649], [16.43663, 47.21127], [16.44142, 47.25079], [16.47782, 47.25918], [16.45104, 47.41181], [16.49908, 47.39416], [16.52414, 47.41007], [16.57152, 47.40868], [16.6718, 47.46139], [16.64821, 47.50155], [16.71059, 47.52692], [16.64193, 47.63114], [16.58699, 47.61772], [16.4222, 47.66537], [16.55129, 47.72268], [16.53514, 47.73837], [16.54779, 47.75074], [16.61183, 47.76171], [16.65679, 47.74197], [16.72089, 47.73469], [16.7511, 47.67878], [16.82938, 47.68432], [16.86509, 47.72268], [16.87538, 47.68895], [17.08893, 47.70928], [17.05048, 47.79377], [17.07039, 47.81129], [17.00997, 47.86245], [17.08275, 47.87719], [17.11022, 47.92461], [17.09786, 47.97336], [17.16001, 48.00636], [17.07039, 48.0317], [17.09168, 48.09366], [17.05735, 48.14179], [17.02919, 48.13996], [16.97701, 48.17385], [16.89461, 48.31332], [16.90903, 48.32519], [16.84243, 48.35258], [16.83317, 48.38138], [16.83588, 48.3844], [16.8497, 48.38321], [16.85204, 48.44968], [16.94611, 48.53614], [16.93955, 48.60371], [16.90354, 48.71541], [16.79779, 48.70998], [16.71883, 48.73806], [16.68518, 48.7281], [16.67008, 48.77699], [16.46134, 48.80865], [16.40915, 48.74576], [16.37345, 48.729], [16.06034, 48.75436], [15.84404, 48.86921], [15.78087, 48.87644], [15.75341, 48.8516], [15.6921, 48.85973], [15.61622, 48.89541], [15.51357, 48.91549], [15.48027, 48.94481], [15.34823, 48.98444]]]] } },
23097     { type: "Feature", properties: { iso1A2: "AU", iso1A3: "AUS", iso1N3: "036", wikidata: "Q408", nameEn: "Australia" }, geometry: null },
23098     { type: "Feature", properties: { iso1A2: "AW", iso1A3: "ABW", iso1N3: "533", wikidata: "Q21203", nameEn: "Aruba", aliases: ["NL-AW"], country: "NL", groups: ["Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["297"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-70.00823, 12.98375], [-70.35625, 12.58277], [-69.60231, 12.17], [-70.00823, 12.98375]]]] } },
23099     { type: "Feature", properties: { iso1A2: "AX", iso1A3: "ALA", iso1N3: "248", wikidata: "Q5689", nameEn: "\xC5land Islands", country: "FI", groups: ["EU", "154", "150", "UN"], callingCodes: ["358 18", "358 457"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.08191, 60.19152], [20.5104, 59.15546], [21.35468, 59.67511], [21.02509, 60.12142], [21.08159, 60.20167], [21.15143, 60.54555], [20.96741, 60.71528], [19.23413, 60.61414], [19.08191, 60.19152]]]] } },
23100     { type: "Feature", properties: { iso1A2: "AZ", iso1A3: "AZE", iso1N3: "031", wikidata: "Q227", nameEn: "Azerbaijan", groups: ["145", "142", "UN"], callingCodes: ["994"] }, geometry: { type: "MultiPolygon", coordinates: [[[[46.42738, 41.91323], [46.3984, 41.84399], [46.30863, 41.79133], [46.23962, 41.75811], [46.20538, 41.77205], [46.17891, 41.72094], [46.19759, 41.62327], [46.24429, 41.59883], [46.26531, 41.63339], [46.28182, 41.60089], [46.3253, 41.60912], [46.34039, 41.5947], [46.34126, 41.57454], [46.29794, 41.5724], [46.33925, 41.4963], [46.40307, 41.48464], [46.4669, 41.43331], [46.63658, 41.37727], [46.72375, 41.28609], [46.66148, 41.20533], [46.63969, 41.09515], [46.55096, 41.1104], [46.48558, 41.0576], [46.456, 41.09984], [46.37661, 41.10805], [46.27698, 41.19011], [46.13221, 41.19479], [45.95786, 41.17956], [45.80842, 41.2229], [45.69946, 41.29545], [45.75705, 41.35157], [45.71035, 41.36208], [45.68389, 41.3539], [45.45973, 41.45898], [45.4006, 41.42402], [45.31352, 41.47168], [45.26285, 41.46433], [45.1797, 41.42231], [45.09867, 41.34065], [45.0133, 41.29747], [45.05497, 41.2464], [45.02932, 41.2101], [45.05201, 41.19211], [45.11811, 41.19967], [45.1969, 41.168], [45.19942, 41.13299], [45.08028, 41.10917], [45.06784, 41.05379], [45.12923, 41.06059], [45.1313, 41.09369], [45.1634, 41.08082], [45.16493, 41.05068], [45.1994, 41.04518], [45.25897, 41.0027], [45.26162, 41.0228], [45.28859, 41.03757], [45.35677, 40.99784], [45.39725, 41.02603], [45.44083, 41.01663], [45.40814, 40.97904], [45.60584, 40.87436], [45.55914, 40.78366], [45.4206, 40.7424], [45.35366, 40.65979], [45.45484, 40.57707], [45.42994, 40.53804], [45.65098, 40.37696], [45.95609, 40.27846], [45.97944, 40.181], [45.83779, 39.98925], [45.78642, 40.03218], [45.59806, 40.0131], [45.60895, 39.97733], [45.7833, 39.9475], [45.82533, 39.82925], [45.96543, 39.78859], [46.18493, 39.60533], [46.40286, 39.63651], [46.42465, 39.57534], [46.52117, 39.58734], [46.57098, 39.56694], [46.57721, 39.54414], [46.51027, 39.52373], [46.53051, 39.47809], [46.4013, 39.45405], [46.37795, 39.42039], [46.43244, 39.35181], [46.50093, 39.33736], [46.56476, 39.24942], [46.63481, 39.23013], [46.58032, 39.21204], [46.54141, 39.15895], [46.52584, 39.18912], [46.44022, 39.19636], [46.54296, 39.07078], [46.51805, 38.94982], [46.53497, 38.86548], [46.75752, 39.03231], [46.83822, 39.13143], [46.92539, 39.16644], [46.95341, 39.13505], [47.05771, 39.20143], [47.05927, 39.24846], [47.31301, 39.37492], [47.38978, 39.45999], [47.50099, 39.49615], [47.84774, 39.66285], [47.98977, 39.70999], [48.34264, 39.42935], [48.37385, 39.37584], [48.15984, 39.30028], [48.12404, 39.25208], [48.15361, 39.19419], [48.31239, 39.09278], [48.33884, 39.03022], [48.28437, 38.97186], [48.08627, 38.94434], [48.07734, 38.91616], [48.01409, 38.90333], [48.02581, 38.82705], [48.24773, 38.71883], [48.3146, 38.59958], [48.45084, 38.61013], [48.58793, 38.45076], [48.62217, 38.40198], [48.70001, 38.40564], [48.78979, 38.45026], [48.81072, 38.44853], [48.84969, 38.45015], [48.88288, 38.43975], [52.39847, 39.43556], [48.80971, 41.95365], [48.5867, 41.84306], [48.55078, 41.77917], [48.42301, 41.65444], [48.40277, 41.60441], [48.2878, 41.56221], [48.22064, 41.51472], [48.07587, 41.49957], [47.87973, 41.21798], [47.75831, 41.19455], [47.62288, 41.22969], [47.54504, 41.20275], [47.49004, 41.26366], [47.34579, 41.27884], [47.10762, 41.59044], [47.03757, 41.55434], [46.99554, 41.59743], [47.00955, 41.63583], [46.8134, 41.76252], [46.75269, 41.8623], [46.58924, 41.80547], [46.5332, 41.87389], [46.42738, 41.91323]], [[45.50279, 40.58424], [45.47927, 40.65023], [45.51825, 40.67382], [45.56071, 40.64765], [45.50279, 40.58424]]], [[[45.00864, 41.03411], [45.03792, 41.03938], [45.04517, 41.06653], [45.03406, 41.07931], [45.00864, 41.09407], [44.97169, 41.09176], [44.95383, 41.07553], [44.96031, 41.06345], [44.9903, 41.05657], [45.00864, 41.03411]]], [[[45.21324, 40.9817], [45.23095, 40.97828], [45.23487, 41.00226], [45.20625, 41.01484], [45.18382, 41.0066], [45.19312, 40.98998], [45.20518, 40.99348], [45.21219, 40.99001], [45.21324, 40.9817]]], [[[45.46992, 39.49888], [45.29606, 39.57654], [45.30385, 39.61373], [45.23535, 39.61373], [45.21784, 39.58074], [45.17464, 39.58614], [45.18554, 39.67846], [45.06604, 39.79277], [44.92869, 39.72157], [44.88354, 39.74432], [44.75779, 39.7148], [44.80977, 39.65768], [44.81043, 39.62677], [44.88916, 39.59653], [44.96746, 39.42998], [45.05932, 39.36435], [45.08751, 39.35052], [45.16168, 39.21952], [45.30489, 39.18333], [45.40148, 39.09007], [45.40452, 39.07224], [45.44811, 39.04927], [45.44966, 38.99243], [45.6131, 38.964], [45.6155, 38.94304], [45.65172, 38.95199], [45.83883, 38.90768], [45.90266, 38.87739], [45.94624, 38.89072], [46.00228, 38.87376], [46.06766, 38.87861], [46.14785, 38.84206], [46.06973, 39.0744], [46.02303, 39.09978], [45.99774, 39.28931], [45.79225, 39.3695], [45.83, 39.46487], [45.80804, 39.56716], [45.70547, 39.60174], [45.46992, 39.49888]]]] } },
23101     { type: "Feature", properties: { iso1A2: "BA", iso1A3: "BIH", iso1N3: "070", wikidata: "Q225", nameEn: "Bosnia and Herzegovina", groups: ["039", "150", "UN"], callingCodes: ["387"] }, geometry: { type: "MultiPolygon", coordinates: [[[[17.84826, 45.04489], [17.66571, 45.13408], [17.59104, 45.10816], [17.51469, 45.10791], [17.47589, 45.12656], [17.45615, 45.12523], [17.4498, 45.16119], [17.41229, 45.13335], [17.33573, 45.14521], [17.32092, 45.16246], [17.26815, 45.18444], [17.25131, 45.14957], [17.24325, 45.146], [17.18438, 45.14764], [17.0415, 45.20759], [16.9385, 45.22742], [16.92405, 45.27607], [16.83804, 45.18951], [16.81137, 45.18434], [16.78219, 45.19002], [16.74845, 45.20393], [16.64962, 45.20714], [16.60194, 45.23042], [16.56559, 45.22307], [16.5501, 45.2212], [16.52982, 45.22713], [16.49155, 45.21153], [16.4634, 45.14522], [16.40023, 45.1147], [16.38309, 45.05955], [16.38219, 45.05139], [16.3749, 45.05206], [16.35863, 45.03529], [16.35404, 45.00241], [16.29036, 44.99732], [16.12153, 45.09616], [15.98412, 45.23088], [15.83512, 45.22459], [15.76371, 45.16508], [15.78842, 45.11519], [15.74585, 45.0638], [15.78568, 44.97401], [15.74723, 44.96818], [15.76096, 44.87045], [15.79472, 44.8455], [15.72584, 44.82334], [15.8255, 44.71501], [15.89348, 44.74964], [16.05828, 44.61538], [16.00884, 44.58605], [16.03012, 44.55572], [16.10566, 44.52586], [16.16814, 44.40679], [16.12969, 44.38275], [16.21346, 44.35231], [16.18688, 44.27012], [16.36864, 44.08263], [16.43662, 44.07523], [16.43629, 44.02826], [16.50528, 44.0244], [16.55472, 43.95326], [16.70922, 43.84887], [16.75316, 43.77157], [16.80736, 43.76011], [17.00585, 43.58037], [17.15828, 43.49376], [17.24411, 43.49376], [17.29699, 43.44542], [17.25579, 43.40353], [17.286, 43.33065], [17.46986, 43.16559], [17.64268, 43.08595], [17.70879, 42.97223], [17.5392, 42.92787], [17.6444, 42.88641], [17.68151, 42.92725], [17.7948, 42.89556], [17.80854, 42.9182], [17.88201, 42.83668], [18.24318, 42.6112], [18.36197, 42.61423], [18.43735, 42.55921], [18.49778, 42.58409], [18.53751, 42.57376], [18.55504, 42.58409], [18.52232, 42.62279], [18.57373, 42.64429], [18.54841, 42.68328], [18.54603, 42.69171], [18.55221, 42.69045], [18.56789, 42.72074], [18.47324, 42.74992], [18.45921, 42.81682], [18.47633, 42.85829], [18.4935, 42.86433], [18.49661, 42.89306], [18.49076, 42.95553], [18.52232, 43.01451], [18.66254, 43.03928], [18.64735, 43.14766], [18.66605, 43.2056], [18.71747, 43.2286], [18.6976, 43.25243], [18.76538, 43.29838], [18.85342, 43.32426], [18.84794, 43.33735], [18.83912, 43.34795], [18.90911, 43.36383], [18.95819, 43.32899], [18.95001, 43.29327], [19.00844, 43.24988], [19.04233, 43.30008], [19.08206, 43.29668], [19.08673, 43.31453], [19.04071, 43.397], [19.01078, 43.43854], [18.96053, 43.45042], [18.95469, 43.49367], [18.91379, 43.50299], [19.01078, 43.55806], [19.04934, 43.50384], [19.13933, 43.5282], [19.15685, 43.53943], [19.22807, 43.5264], [19.24774, 43.53061], [19.2553, 43.5938], [19.33426, 43.58833], [19.36653, 43.60921], [19.41941, 43.54056], [19.42696, 43.57987], [19.50455, 43.58385], [19.5176, 43.71403], [19.3986, 43.79668], [19.23465, 43.98764], [19.24363, 44.01502], [19.38439, 43.96611], [19.52515, 43.95573], [19.56498, 43.99922], [19.61836, 44.01464], [19.61991, 44.05254], [19.57467, 44.04716], [19.55999, 44.06894], [19.51167, 44.08158], [19.47321, 44.1193], [19.48386, 44.14332], [19.47338, 44.15034], [19.43905, 44.13088], [19.40927, 44.16722], [19.3588, 44.18353], [19.34773, 44.23244], [19.32464, 44.27185], [19.26945, 44.26957], [19.23306, 44.26097], [19.20508, 44.2917], [19.18328, 44.28383], [19.16741, 44.28648], [19.13332, 44.31492], [19.13556, 44.338], [19.11547, 44.34218], [19.1083, 44.3558], [19.11865, 44.36712], [19.10298, 44.36924], [19.10365, 44.37795], [19.10704, 44.38249], [19.10749, 44.39421], [19.11785, 44.40313], [19.14681, 44.41463], [19.14837, 44.45253], [19.12278, 44.50132], [19.13369, 44.52521], [19.16699, 44.52197], [19.26388, 44.65412], [19.32543, 44.74058], [19.36722, 44.88164], [19.18183, 44.92055], [19.01994, 44.85493], [18.8704, 44.85097], [18.76347, 44.90669], [18.76369, 44.93707], [18.80661, 44.93561], [18.78357, 44.97741], [18.65723, 45.07544], [18.47939, 45.05871], [18.41896, 45.11083], [18.32077, 45.1021], [18.24387, 45.13699], [18.1624, 45.07654], [18.03121, 45.12632], [18.01594, 45.15163], [17.99479, 45.14958], [17.97834, 45.13831], [17.97336, 45.12245], [17.93706, 45.08016], [17.87148, 45.04645], [17.84826, 45.04489]]]] } },
23102     { type: "Feature", properties: { iso1A2: "BB", iso1A3: "BRB", iso1N3: "052", wikidata: "Q244", nameEn: "Barbados", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 246"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-58.56442, 13.24471], [-59.80731, 13.87556], [-59.82929, 12.70644], [-58.56442, 13.24471]]]] } },
23103     { type: "Feature", properties: { iso1A2: "BD", iso1A3: "BGD", iso1N3: "050", wikidata: "Q902", nameEn: "Bangladesh", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["880"] }, geometry: { type: "MultiPolygon", coordinates: [[[[89.15869, 26.13708], [89.08899, 26.38845], [88.95612, 26.4564], [88.92357, 26.40711], [88.91321, 26.37984], [89.05328, 26.2469], [88.85004, 26.23211], [88.78961, 26.31093], [88.67837, 26.26291], [88.69485, 26.38353], [88.62144, 26.46783], [88.4298, 26.54489], [88.41196, 26.63837], [88.33093, 26.48929], [88.35153, 26.45241], [88.36938, 26.48683], [88.48749, 26.45855], [88.51649, 26.35923], [88.35153, 26.29123], [88.34757, 26.22216], [88.1844, 26.14417], [88.16581, 26.0238], [88.08804, 25.91334], [88.13138, 25.78773], [88.242, 25.80811], [88.45103, 25.66245], [88.4559, 25.59227], [88.677, 25.46959], [88.81296, 25.51546], [88.85278, 25.34679], [89.01105, 25.30303], [89.00463, 25.26583], [88.94067, 25.18534], [88.44766, 25.20149], [88.46277, 25.07468], [88.33917, 24.86803], [88.27325, 24.88796], [88.21832, 24.96642], [88.14004, 24.93529], [88.15515, 24.85806], [88.00683, 24.66477], [88.08786, 24.63232], [88.12296, 24.51301], [88.50934, 24.32474], [88.68801, 24.31464], [88.74841, 24.1959], [88.6976, 24.14703], [88.73743, 23.91751], [88.66189, 23.87607], [88.58087, 23.87105], [88.56507, 23.64044], [88.74841, 23.47361], [88.79351, 23.50535], [88.79254, 23.46028], [88.71133, 23.2492], [88.99148, 23.21134], [88.86377, 23.08759], [88.88327, 23.03885], [88.87063, 22.95235], [88.96713, 22.83346], [88.9151, 22.75228], [88.94614, 22.66941], [88.9367, 22.58527], [89.07114, 22.15335], [89.08044, 21.41871], [92.47409, 20.38654], [92.26071, 21.05697], [92.17752, 21.17445], [92.20087, 21.337], [92.37939, 21.47764], [92.43158, 21.37025], [92.55105, 21.3856], [92.60187, 21.24615], [92.68152, 21.28454], [92.59775, 21.6092], [92.62187, 21.87037], [92.60949, 21.97638], [92.56616, 22.13554], [92.60029, 22.1522], [92.5181, 22.71441], [92.37665, 22.9435], [92.38214, 23.28705], [92.26541, 23.70392], [92.15417, 23.73409], [92.04706, 23.64229], [91.95093, 23.73284], [91.95642, 23.47361], [91.84789, 23.42235], [91.76417, 23.26619], [91.81634, 23.08001], [91.7324, 23.00043], [91.61571, 22.93929], [91.54993, 23.01051], [91.46615, 23.2328], [91.4035, 23.27522], [91.40848, 23.07117], [91.36453, 23.06612], [91.28293, 23.37538], [91.15579, 23.6599], [91.25192, 23.83463], [91.22308, 23.89616], [91.29587, 24.0041], [91.35741, 23.99072], [91.37414, 24.10693], [91.55542, 24.08687], [91.63782, 24.1132], [91.65292, 24.22095], [91.73257, 24.14703], [91.76004, 24.23848], [91.82596, 24.22345], [91.89258, 24.14674], [91.96603, 24.3799], [92.11662, 24.38997], [92.15796, 24.54435], [92.25854, 24.9191], [92.38626, 24.86055], [92.49887, 24.88796], [92.39147, 25.01471], [92.33957, 25.07593], [92.0316, 25.1834], [91.63648, 25.12846], [91.25517, 25.20677], [90.87427, 25.15799], [90.65042, 25.17788], [90.40034, 25.1534], [90.1155, 25.22686], [89.90478, 25.31038], [89.87629, 25.28337], [89.83371, 25.29548], [89.84086, 25.31854], [89.81208, 25.37244], [89.86129, 25.61714], [89.84388, 25.70042], [89.80585, 25.82489], [89.86592, 25.93115], [89.77728, 26.04254], [89.77865, 26.08387], [89.73581, 26.15818], [89.70201, 26.15138], [89.63968, 26.22595], [89.57101, 25.9682], [89.53515, 26.00382], [89.35953, 26.0077], [89.15869, 26.13708]]]] } },
23104     { type: "Feature", properties: { iso1A2: "BE", iso1A3: "BEL", iso1N3: "056", wikidata: "Q31", nameEn: "Belgium", groups: ["EU", "155", "150", "UN"], callingCodes: ["32"] }, geometry: { type: "MultiPolygon", coordinates: [[[[4.93295, 51.44945], [4.93909, 51.44632], [4.9524, 51.45014], [4.95244, 51.45207], [4.93295, 51.44945]]], [[[4.91493, 51.4353], [4.92652, 51.43329], [4.92952, 51.42984], [4.93986, 51.43064], [4.94265, 51.44003], [4.93471, 51.43861], [4.93416, 51.44185], [4.94025, 51.44193], [4.93544, 51.44634], [4.92879, 51.44161], [4.92815, 51.43856], [4.92566, 51.44273], [4.92811, 51.4437], [4.92287, 51.44741], [4.91811, 51.44621], [4.92227, 51.44252], [4.91935, 51.43634], [4.91493, 51.4353]]], [[[4.82946, 51.4213], [4.82409, 51.44736], [4.84139, 51.4799], [4.78803, 51.50284], [4.77321, 51.50529], [4.74578, 51.48937], [4.72935, 51.48424], [4.65442, 51.42352], [4.57489, 51.4324], [4.53521, 51.4243], [4.52846, 51.45002], [4.54675, 51.47265], [4.5388, 51.48184], [4.47736, 51.4778], [4.38122, 51.44905], [4.39747, 51.43316], [4.38064, 51.41965], [4.43777, 51.36989], [4.39292, 51.35547], [4.34086, 51.35738], [4.33265, 51.37687], [4.21923, 51.37443], [4.24024, 51.35371], [4.16721, 51.29348], [4.05165, 51.24171], [4.01957, 51.24504], [3.97889, 51.22537], [3.90125, 51.20371], [3.78783, 51.2151], [3.78999, 51.25766], [3.58939, 51.30064], [3.51502, 51.28697], [3.52698, 51.2458], [3.43488, 51.24135], [3.41704, 51.25933], [3.38289, 51.27331], [3.35847, 51.31572], [3.38696, 51.33436], [3.36263, 51.37112], [2.56575, 51.85301], [2.18458, 51.52087], [2.55904, 51.07014], [2.57551, 51.00326], [2.63074, 50.94746], [2.59093, 50.91751], [2.63331, 50.81457], [2.71165, 50.81295], [2.81056, 50.71773], [2.8483, 50.72276], [2.86985, 50.7033], [2.87937, 50.70298], [2.88504, 50.70656], [2.90069, 50.69263], [2.91036, 50.6939], [2.90873, 50.702], [2.95019, 50.75138], [2.96778, 50.75242], [3.00537, 50.76588], [3.04314, 50.77674], [3.09163, 50.77717], [3.10614, 50.78303], [3.11206, 50.79416], [3.11987, 50.79188], [3.1257, 50.78603], [3.15017, 50.79031], [3.16476, 50.76843], [3.18339, 50.74981], [3.18811, 50.74025], [3.20064, 50.73547], [3.19017, 50.72569], [3.20845, 50.71662], [3.22042, 50.71019], [3.24593, 50.71389], [3.26063, 50.70086], [3.26141, 50.69151], [3.2536, 50.68977], [3.264, 50.67668], [3.23951, 50.6585], [3.2729, 50.60718], [3.28575, 50.52724], [3.37693, 50.49538], [3.44629, 50.51009], [3.47385, 50.53397], [3.51564, 50.5256], [3.49509, 50.48885], [3.5683, 50.50192], [3.58361, 50.49049], [3.61014, 50.49568], [3.64426, 50.46275], [3.66153, 50.45165], [3.67494, 50.40239], [3.67262, 50.38663], [3.65709, 50.36873], [3.66976, 50.34563], [3.71009, 50.30305], [3.70987, 50.3191], [3.73911, 50.34809], [3.84314, 50.35219], [3.90781, 50.32814], [3.96771, 50.34989], [4.0268, 50.35793], [4.0689, 50.3254], [4.10237, 50.31247], [4.10957, 50.30234], [4.11954, 50.30425], [4.13665, 50.25609], [4.16808, 50.25786], [4.15524, 50.2833], [4.17347, 50.28838], [4.17861, 50.27443], [4.20651, 50.27333], [4.21945, 50.25539], [4.15524, 50.21103], [4.16014, 50.19239], [4.13561, 50.13078], [4.20147, 50.13535], [4.23101, 50.06945], [4.16294, 50.04719], [4.13508, 50.01976], [4.14239, 49.98034], [4.20532, 49.95803], [4.31963, 49.97043], [4.35051, 49.95315], [4.43488, 49.94122], [4.51098, 49.94659], [4.5414, 49.96911], [4.68695, 49.99685], [4.70064, 50.09384], [4.75237, 50.11314], [4.82438, 50.16878], [4.83279, 50.15331], [4.88602, 50.15182], [4.8382, 50.06738], [4.78827, 49.95609], [4.88529, 49.9236], [4.85134, 49.86457], [4.86965, 49.82271], [4.85464, 49.78995], [4.96714, 49.79872], [5.09249, 49.76193], [5.14545, 49.70287], [5.26232, 49.69456], [5.31465, 49.66846], [5.33039, 49.6555], [5.30214, 49.63055], [5.3137, 49.61225], [5.33851, 49.61599], [5.34837, 49.62889], [5.3974, 49.61596], [5.43713, 49.5707], [5.46734, 49.52648], [5.46541, 49.49825], [5.55001, 49.52729], [5.60909, 49.51228], [5.64505, 49.55146], [5.75649, 49.54321], [5.7577, 49.55915], [5.77435, 49.56298], [5.79195, 49.55228], [5.81838, 49.54777], [5.84143, 49.5533], [5.84692, 49.55663], [5.8424, 49.56082], [5.87256, 49.57539], [5.86986, 49.58756], [5.84971, 49.58674], [5.84826, 49.5969], [5.8762, 49.60898], [5.87609, 49.62047], [5.88393, 49.62802], [5.88552, 49.63507], [5.90599, 49.63853], [5.90164, 49.6511], [5.9069, 49.66377], [5.86175, 49.67862], [5.86527, 49.69291], [5.88677, 49.70951], [5.86503, 49.72739], [5.84193, 49.72161], [5.82562, 49.72395], [5.83149, 49.74729], [5.82245, 49.75048], [5.78871, 49.7962], [5.75409, 49.79239], [5.74953, 49.81428], [5.74364, 49.82058], [5.74844, 49.82435], [5.7404, 49.83452], [5.74076, 49.83823], [5.74975, 49.83933], [5.74953, 49.84709], [5.75884, 49.84811], [5.74567, 49.85368], [5.75861, 49.85631], [5.75269, 49.8711], [5.78415, 49.87922], [5.73621, 49.89796], [5.77314, 49.93646], [5.77291, 49.96056], [5.80833, 49.96451], [5.81163, 49.97142], [5.83467, 49.97823], [5.83968, 49.9892], [5.82331, 49.99662], [5.81866, 50.01286], [5.8551, 50.02683], [5.86904, 50.04614], [5.85474, 50.06342], [5.8857, 50.07824], [5.89488, 50.11476], [5.95929, 50.13295], [5.96453, 50.17259], [6.02488, 50.18283], [6.03093, 50.16362], [6.06406, 50.15344], [6.08577, 50.17246], [6.12028, 50.16374], [6.1137, 50.13668], [6.1379, 50.12964], [6.15298, 50.14126], [6.14132, 50.14971], [6.14588, 50.17106], [6.18739, 50.1822], [6.18364, 50.20815], [6.16853, 50.2234], [6.208, 50.25179], [6.28797, 50.27458], [6.29949, 50.30887], [6.32488, 50.32333], [6.35701, 50.31139], [6.40641, 50.32425], [6.40785, 50.33557], [6.3688, 50.35898], [6.34406, 50.37994], [6.36852, 50.40776], [6.37219, 50.45397], [6.34005, 50.46083], [6.3465, 50.48833], [6.30809, 50.50058], [6.26637, 50.50272], [6.22335, 50.49578], [6.20599, 50.52089], [6.19193, 50.5212], [6.18716, 50.52653], [6.19579, 50.5313], [6.19735, 50.53576], [6.17802, 50.54179], [6.17739, 50.55875], [6.20281, 50.56952], [6.22581, 50.5907], [6.24005, 50.58732], [6.24888, 50.59869], [6.2476, 50.60392], [6.26957, 50.62444], [6.17852, 50.6245], [6.11707, 50.72231], [6.04428, 50.72861], [6.0406, 50.71848], [6.0326, 50.72647], [6.03889, 50.74618], [6.01976, 50.75398], [5.97545, 50.75441], [5.95942, 50.7622], [5.89132, 50.75124], [5.89129, 50.75125], [5.88734, 50.77092], [5.84888, 50.75448], [5.84548, 50.76542], [5.80673, 50.7558], [5.77513, 50.78308], [5.76533, 50.78159], [5.74356, 50.7691], [5.73904, 50.75674], [5.72216, 50.76398], [5.69469, 50.75529], [5.68091, 50.75804], [5.70107, 50.7827], [5.68995, 50.79641], [5.70118, 50.80764], [5.65259, 50.82309], [5.64009, 50.84742], [5.64504, 50.87107], [5.67886, 50.88142], [5.69858, 50.91046], [5.71626, 50.90796], [5.72644, 50.91167], [5.72545, 50.92312], [5.74644, 50.94723], [5.75927, 50.95601], [5.74752, 50.96202], [5.72875, 50.95428], [5.71864, 50.96092], [5.76242, 50.99703], [5.77688, 51.02483], [5.75961, 51.03113], [5.77258, 51.06196], [5.79835, 51.05834], [5.79903, 51.09371], [5.82921, 51.09328], [5.83226, 51.10585], [5.8109, 51.10861], [5.80798, 51.11661], [5.85508, 51.14445], [5.82564, 51.16753], [5.77697, 51.1522], [5.77735, 51.17845], [5.74617, 51.18928], [5.70344, 51.1829], [5.65528, 51.18736], [5.65145, 51.19788], [5.5603, 51.22249], [5.5569, 51.26544], [5.515, 51.29462], [5.48476, 51.30053], [5.46519, 51.2849], [5.4407, 51.28169], [5.41672, 51.26248], [5.347, 51.27502], [5.33886, 51.26314], [5.29716, 51.26104], [5.26461, 51.26693], [5.23814, 51.26064], [5.22542, 51.26888], [5.24244, 51.30495], [5.2002, 51.32243], [5.16222, 51.31035], [5.13377, 51.31592], [5.13105, 51.34791], [5.07102, 51.39469], [5.10456, 51.43163], [5.07891, 51.4715], [5.04774, 51.47022], [5.03281, 51.48679], [5.0106, 51.47167], [5.00393, 51.44406], [4.92152, 51.39487], [4.90016, 51.41404], [4.84988, 51.41502], [4.78941, 51.41102], [4.77229, 51.41337], [4.76577, 51.43046], [4.78314, 51.43319], [4.82946, 51.4213]]]] } },
23105     { type: "Feature", properties: { iso1A2: "BF", iso1A3: "BFA", iso1N3: "854", wikidata: "Q965", nameEn: "Burkina Faso", groups: ["011", "202", "002", "UN"], callingCodes: ["226"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.23859, 15.00135], [0.06588, 14.96961], [-0.24673, 15.07805], [-0.72004, 15.08655], [-1.05875, 14.7921], [-1.32166, 14.72774], [-1.68083, 14.50023], [-1.97945, 14.47709], [-1.9992, 14.19011], [-2.10223, 14.14878], [-2.47587, 14.29671], [-2.66175, 14.14713], [-2.84667, 14.05532], [-2.90831, 13.81174], [-2.88189, 13.64921], [-3.26407, 13.70699], [-3.28396, 13.5422], [-3.23599, 13.29035], [-3.43507, 13.27272], [-3.4313, 13.1588], [-3.54454, 13.1781], [-3.7911, 13.36665], [-3.96282, 13.38164], [-3.90558, 13.44375], [-3.96501, 13.49778], [-4.34477, 13.12927], [-4.21819, 12.95722], [-4.238, 12.71467], [-4.47356, 12.71252], [-4.41412, 12.31922], [-4.57703, 12.19875], [-4.54841, 12.1385], [-4.62546, 12.13204], [-4.62987, 12.06531], [-4.70692, 12.06746], [-4.72893, 12.01579], [-5.07897, 11.97918], [-5.26389, 11.84778], [-5.40258, 11.8327], [-5.26389, 11.75728], [-5.29251, 11.61715], [-5.22867, 11.60421], [-5.20665, 11.43811], [-5.25509, 11.36905], [-5.25949, 11.24816], [-5.32553, 11.21578], [-5.32994, 11.13371], [-5.49284, 11.07538], [-5.41579, 10.84628], [-5.47083, 10.75329], [-5.46643, 10.56074], [-5.51058, 10.43177], [-5.39602, 10.2929], [-5.12465, 10.29788], [-4.96453, 9.99923], [-4.96621, 9.89132], [-4.6426, 9.70696], [-4.31392, 9.60062], [-4.25999, 9.76012], [-3.69703, 9.94279], [-3.31779, 9.91125], [-3.27228, 9.84981], [-3.19306, 9.93781], [-3.16609, 9.85147], [-3.00765, 9.74019], [-2.93012, 9.57403], [-2.76494, 9.40778], [-2.68802, 9.49343], [-2.76534, 9.56589], [-2.74174, 9.83172], [-2.83108, 10.40252], [-2.94232, 10.64281], [-2.83373, 11.0067], [-0.67143, 10.99811], [-0.61937, 10.91305], [-0.44298, 11.04292], [-0.42391, 11.11661], [-0.38219, 11.12596], [-0.35955, 11.07801], [-0.28566, 11.12713], [-0.27374, 11.17157], [-0.13493, 11.14075], [0.50388, 11.01011], [0.48852, 10.98561], [0.50521, 10.98035], [0.4958, 10.93269], [0.66104, 10.99964], [0.91245, 10.99597], [0.9813, 11.08876], [1.03409, 11.04719], [1.42823, 11.46822], [2.00988, 11.42227], [2.29983, 11.68254], [2.39723, 11.89473], [2.05785, 12.35539], [2.26349, 12.41915], [0.99167, 13.10727], [0.99253, 13.37515], [1.18873, 13.31771], [1.21217, 13.37853], [1.24516, 13.33968], [1.28509, 13.35488], [1.24429, 13.39373], [1.20088, 13.38951], [1.02813, 13.46635], [0.99514, 13.5668], [0.77637, 13.64442], [0.77377, 13.6866], [0.61924, 13.68491], [0.38051, 14.05575], [0.16936, 14.51654], [0.23859, 15.00135]]]] } },
23106     { type: "Feature", properties: { iso1A2: "BG", iso1A3: "BGR", iso1N3: "100", wikidata: "Q219", nameEn: "Bulgaria", groups: ["EU", "151", "150", "UN"], callingCodes: ["359"] }, geometry: { type: "MultiPolygon", coordinates: [[[[23.05288, 43.79494], [22.85314, 43.84452], [22.83753, 43.88055], [22.87873, 43.9844], [23.01674, 44.01946], [23.04988, 44.07694], [22.67173, 44.21564], [22.61711, 44.16938], [22.61688, 44.06534], [22.41449, 44.00514], [22.35558, 43.81281], [22.41043, 43.69566], [22.47582, 43.6558], [22.53397, 43.47225], [22.82036, 43.33665], [22.89727, 43.22417], [23.00806, 43.19279], [22.98104, 43.11199], [22.89521, 43.03625], [22.78397, 42.98253], [22.74826, 42.88701], [22.54302, 42.87774], [22.43309, 42.82057], [22.4997, 42.74144], [22.43983, 42.56851], [22.55669, 42.50144], [22.51961, 42.3991], [22.47498, 42.3915], [22.45919, 42.33822], [22.34773, 42.31725], [22.38136, 42.30339], [22.47251, 42.20393], [22.50289, 42.19527], [22.51224, 42.15457], [22.67701, 42.06614], [22.86749, 42.02275], [22.90254, 41.87587], [22.96682, 41.77137], [23.01239, 41.76527], [23.03342, 41.71034], [22.95513, 41.63265], [22.96331, 41.35782], [22.93334, 41.34104], [23.1833, 41.31755], [23.21953, 41.33773], [23.22771, 41.37106], [23.31301, 41.40525], [23.33639, 41.36317], [23.40416, 41.39999], [23.52453, 41.40262], [23.63203, 41.37632], [23.67644, 41.41139], [23.76525, 41.40175], [23.80148, 41.43943], [23.89613, 41.45257], [23.91483, 41.47971], [23.96975, 41.44118], [24.06908, 41.46132], [24.06323, 41.53222], [24.10063, 41.54796], [24.18126, 41.51735], [24.27124, 41.57682], [24.30513, 41.51297], [24.52599, 41.56808], [24.61129, 41.42278], [24.71529, 41.41928], [24.8041, 41.34913], [24.82514, 41.4035], [24.86136, 41.39298], [24.90928, 41.40876], [24.942, 41.38685], [25.11611, 41.34212], [25.28322, 41.23411], [25.48187, 41.28506], [25.52394, 41.2798], [25.55082, 41.31667], [25.61042, 41.30614], [25.66183, 41.31316], [25.70507, 41.29209], [25.8266, 41.34563], [25.87919, 41.30526], [26.12926, 41.35878], [26.16548, 41.42278], [26.20288, 41.43943], [26.14796, 41.47533], [26.176, 41.50072], [26.17951, 41.55409], [26.14328, 41.55496], [26.15146, 41.60828], [26.07083, 41.64584], [26.06148, 41.70345], [26.16841, 41.74858], [26.21325, 41.73223], [26.22888, 41.74139], [26.2654, 41.71544], [26.30255, 41.70925], [26.35957, 41.71149], [26.32952, 41.73637], [26.33589, 41.76802], [26.36952, 41.82265], [26.53968, 41.82653], [26.57961, 41.90024], [26.56051, 41.92995], [26.62996, 41.97644], [26.79143, 41.97386], [26.95638, 42.00741], [27.03277, 42.0809], [27.08486, 42.08735], [27.19251, 42.06028], [27.22376, 42.10152], [27.27411, 42.10409], [27.45478, 41.96591], [27.52379, 41.93756], [27.55191, 41.90928], [27.69949, 41.97515], [27.81235, 41.94803], [27.83492, 41.99709], [27.91479, 41.97902], [28.02971, 41.98066], [28.32297, 41.98371], [29.24336, 43.70874], [28.23293, 43.76], [27.99558, 43.84193], [27.92008, 44.00761], [27.73468, 43.95326], [27.64542, 44.04958], [27.60834, 44.01206], [27.39757, 44.0141], [27.26845, 44.12602], [26.95141, 44.13555], [26.62712, 44.05698], [26.38764, 44.04356], [26.10115, 43.96908], [26.05584, 43.90925], [25.94911, 43.85745], [25.72792, 43.69263], [25.39528, 43.61866], [25.17144, 43.70261], [25.10718, 43.6831], [24.96682, 43.72693], [24.73542, 43.68523], [24.62281, 43.74082], [24.50264, 43.76314], [24.35364, 43.70211], [24.18149, 43.68218], [23.73978, 43.80627], [23.61687, 43.79289], [23.4507, 43.84936], [23.26772, 43.84843], [23.05288, 43.79494]]]] } },
23107     { type: "Feature", properties: { iso1A2: "BH", iso1A3: "BHR", iso1N3: "048", wikidata: "Q398", nameEn: "Bahrain", groups: ["145", "142", "UN"], callingCodes: ["973"] }, geometry: { type: "MultiPolygon", coordinates: [[[[50.93865, 26.30758], [50.71771, 26.73086], [50.38162, 26.53976], [50.26923, 26.08243], [50.302, 25.87592], [50.57069, 25.57887], [50.80824, 25.54641], [50.7801, 25.595], [50.86149, 25.6965], [50.81266, 25.88946], [50.93865, 26.30758]]]] } },
23108     { type: "Feature", properties: { iso1A2: "BI", iso1A3: "BDI", iso1N3: "108", wikidata: "Q967", nameEn: "Burundi", groups: ["014", "202", "002", "UN"], callingCodes: ["257"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.54501, -2.41404], [30.42933, -2.31064], [30.14034, -2.43626], [29.95911, -2.33348], [29.88237, -2.75105], [29.36805, -2.82933], [29.32234, -2.6483], [29.0562, -2.58632], [29.04081, -2.7416], [29.00167, -2.78523], [29.00404, -2.81978], [29.0505, -2.81774], [29.09119, -2.87871], [29.09797, -2.91935], [29.16037, -2.95457], [29.17258, -2.99385], [29.25633, -3.05471], [29.21463, -3.3514], [29.23708, -3.75856], [29.43673, -4.44845], [29.63827, -4.44681], [29.75109, -4.45836], [29.77289, -4.41733], [29.82885, -4.36153], [29.88172, -4.35743], [30.03323, -4.26631], [30.22042, -4.01738], [30.45915, -3.56532], [30.84165, -3.25152], [30.83823, -2.97837], [30.6675, -2.98987], [30.57926, -2.89791], [30.4987, -2.9573], [30.40662, -2.86151], [30.52747, -2.65841], [30.41789, -2.66266], [30.54501, -2.41404]]]] } },
23109     { type: "Feature", properties: { iso1A2: "BJ", iso1A3: "BEN", iso1N3: "204", wikidata: "Q962", nameEn: "Benin", aliases: ["DY"], groups: ["011", "202", "002", "UN"], callingCodes: ["229"] }, geometry: { type: "MultiPolygon", coordinates: [[[[3.59375, 11.70269], [3.48187, 11.86092], [3.31613, 11.88495], [3.25352, 12.01467], [2.83978, 12.40585], [2.6593, 12.30631], [2.37783, 12.24804], [2.39657, 12.10952], [2.45824, 11.98672], [2.39723, 11.89473], [2.29983, 11.68254], [2.00988, 11.42227], [1.42823, 11.46822], [1.03409, 11.04719], [0.9813, 11.08876], [0.91245, 10.99597], [0.8804, 10.803], [0.80358, 10.71459], [0.77666, 10.37665], [1.35507, 9.99525], [1.36624, 9.5951], [1.33675, 9.54765], [1.41746, 9.3226], [1.5649, 9.16941], [1.61838, 9.0527], [1.64249, 6.99562], [1.55877, 6.99737], [1.61812, 6.74843], [1.58105, 6.68619], [1.76906, 6.43189], [1.79826, 6.28221], [1.62913, 6.24075], [1.67336, 6.02702], [2.74181, 6.13349], [2.70566, 6.38038], [2.70464, 6.50831], [2.74334, 6.57291], [2.7325, 6.64057], [2.78204, 6.70514], [2.78823, 6.76356], [2.73405, 6.78508], [2.74024, 6.92802], [2.71702, 6.95722], [2.76965, 7.13543], [2.74489, 7.42565], [2.79442, 7.43486], [2.78668, 7.5116], [2.73405, 7.5423], [2.73095, 7.7755], [2.67523, 7.87825], [2.77907, 9.06924], [3.08017, 9.10006], [3.14147, 9.28375], [3.13928, 9.47167], [3.25093, 9.61632], [3.34726, 9.70696], [3.32099, 9.78032], [3.35383, 9.83641], [3.54429, 9.87739], [3.66908, 10.18136], [3.57275, 10.27185], [3.6844, 10.46351], [3.78292, 10.40538], [3.84243, 10.59316], [3.71505, 11.13015], [3.49175, 11.29765], [3.59375, 11.70269]]]] } },
23110     { type: "Feature", properties: { iso1A2: "BL", iso1A3: "BLM", iso1N3: "652", wikidata: "Q25362", nameEn: "Saint-Barth\xE9lemy", country: "FR", groups: ["EU", "Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["590"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.62718, 18.26185], [-63.1055, 17.86651], [-62.34423, 17.49165], [-62.62718, 18.26185]]]] } },
23111     { type: "Feature", properties: { iso1A2: "BM", iso1A3: "BMU", iso1N3: "060", wikidata: "Q23635", nameEn: "Bermuda", country: "GB", groups: ["BOTS", "021", "003", "019", "UN"], driveSide: "left", callingCodes: ["1 441"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.20987, 32.6953], [-65.31453, 32.68437], [-65.63955, 31.43417], [-63.20987, 32.6953]]]] } },
23112     { type: "Feature", properties: { iso1A2: "BN", iso1A3: "BRN", iso1N3: "096", wikidata: "Q921", nameEn: "Brunei", groups: ["Q36117", "035", "142", "UN"], driveSide: "left", callingCodes: ["673"] }, geometry: { type: "MultiPolygon", coordinates: [[[[115.16236, 5.01011], [115.02521, 5.35005], [114.10166, 4.76112], [114.07448, 4.58441], [114.15813, 4.57], [114.26876, 4.49878], [114.32176, 4.34942], [114.32176, 4.2552], [114.4416, 4.27588], [114.49922, 4.13108], [114.64211, 4.00694], [114.78539, 4.12205], [114.88039, 4.4257], [114.83189, 4.42387], [114.77303, 4.72871], [114.8266, 4.75062], [114.88841, 4.81905], [114.96982, 4.81146], [114.99417, 4.88201], [115.05038, 4.90275], [115.02955, 4.82087], [115.02278, 4.74137], [115.04064, 4.63706], [115.07737, 4.53418], [115.09978, 4.39123], [115.31275, 4.30806], [115.36346, 4.33563], [115.2851, 4.42295], [115.27819, 4.63661], [115.20737, 4.8256], [115.15092, 4.87604], [115.16236, 5.01011]]]] } },
23113     { type: "Feature", properties: { iso1A2: "BO", iso1A3: "BOL", iso1N3: "068", wikidata: "Q750", nameEn: "Bolivia", groups: ["005", "419", "019", "UN"], callingCodes: ["591"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.90248, -12.52544], [-64.22539, -12.45267], [-64.30708, -12.46398], [-64.99778, -11.98604], [-65.30027, -11.48749], [-65.28141, -10.86289], [-65.35402, -10.78685], [-65.37923, -10.35141], [-65.29019, -9.86253], [-65.40615, -9.63894], [-65.56244, -9.84266], [-65.68343, -9.75323], [-67.17784, -10.34016], [-68.71533, -11.14749], [-68.7651, -11.0496], [-68.75179, -11.03688], [-68.75265, -11.02383], [-68.74802, -11.00891], [-69.42792, -10.93451], [-69.47839, -10.95254], [-69.57156, -10.94555], [-68.98115, -11.8979], [-68.65044, -12.50689], [-68.85615, -12.87769], [-68.8864, -13.40792], [-69.05265, -13.68546], [-68.88135, -14.18639], [-69.36254, -14.94634], [-69.14856, -15.23478], [-69.40336, -15.61358], [-69.20291, -16.16668], [-69.09986, -16.22693], [-68.96238, -16.194], [-68.79464, -16.33272], [-68.98358, -16.42165], [-69.04027, -16.57214], [-69.00853, -16.66769], [-69.16896, -16.72233], [-69.62883, -17.28142], [-69.46863, -17.37466], [-69.46897, -17.4988], [-69.46623, -17.60518], [-69.34126, -17.72753], [-69.28671, -17.94844], [-69.07496, -18.03715], [-69.14807, -18.16893], [-69.07432, -18.28259], [-68.94987, -18.93302], [-68.87082, -19.06003], [-68.80602, -19.08355], [-68.61989, -19.27584], [-68.41218, -19.40499], [-68.66761, -19.72118], [-68.54611, -19.84651], [-68.57132, -20.03134], [-68.74273, -20.08817], [-68.7276, -20.46178], [-68.44023, -20.62701], [-68.55383, -20.7355], [-68.53957, -20.91542], [-68.40403, -20.94562], [-68.18816, -21.28614], [-67.85114, -22.87076], [-67.54284, -22.89771], [-67.18382, -22.81525], [-66.7298, -22.23644], [-66.29714, -22.08741], [-66.24077, -21.77837], [-66.03836, -21.84829], [-66.04832, -21.9187], [-65.9261, -21.93335], [-65.7467, -22.10105], [-65.61166, -22.09504], [-65.58694, -22.09794], [-65.57743, -22.07675], [-65.47435, -22.08908], [-64.99524, -22.08255], [-64.90014, -22.12136], [-64.67174, -22.18957], [-64.58888, -22.25035], [-64.4176, -22.67692], [-64.35108, -22.73282], [-64.31489, -22.88824], [-64.22918, -22.55807], [-63.93287, -21.99934], [-63.70963, -21.99934], [-63.68113, -22.0544], [-63.66482, -21.99918], [-62.81124, -21.9987], [-62.8078, -22.12534], [-62.64455, -22.25091], [-62.2757, -21.06657], [-62.26883, -20.55311], [-61.93912, -20.10053], [-61.73723, -19.63958], [-60.00638, -19.2981], [-59.06965, -19.29148], [-58.23216, -19.80058], [-58.16225, -20.16193], [-57.8496, -19.98346], [-58.14215, -19.76276], [-57.78463, -19.03259], [-57.71113, -19.03161], [-57.69134, -19.00544], [-57.71995, -18.97546], [-57.71995, -18.89573], [-57.76764, -18.90087], [-57.56807, -18.25655], [-57.48237, -18.24219], [-57.69877, -17.8431], [-57.73949, -17.56095], [-57.90082, -17.44555], [-57.99661, -17.5273], [-58.32935, -17.28195], [-58.5058, -16.80958], [-58.30918, -16.3699], [-58.32431, -16.25861], [-58.41506, -16.32636], [-60.16069, -16.26479], [-60.23797, -15.50267], [-60.58224, -15.09887], [-60.23968, -15.09515], [-60.27887, -14.63021], [-60.46037, -14.22496], [-60.48053, -13.77981], [-61.05527, -13.50054], [-61.81151, -13.49564], [-63.76259, -12.42952], [-63.90248, -12.52544]]]] } },
23114     { type: "Feature", properties: { iso1A2: "BQ", iso1A3: "BES", iso1N3: "535", wikidata: "Q27561", nameEn: "Caribbean Netherlands", country: "NL" }, geometry: null },
23115     { type: "Feature", properties: { iso1A2: "BR", iso1A3: "BRA", iso1N3: "076", wikidata: "Q155", nameEn: "Brazil", groups: ["005", "419", "019", "UN"], callingCodes: ["55"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-59.69361, 4.34069], [-59.78878, 4.45637], [-60.15953, 4.53456], [-60.04189, 4.69801], [-59.98129, 5.07097], [-60.20944, 5.28754], [-60.32352, 5.21299], [-60.73204, 5.20931], [-60.5802, 4.94312], [-60.86539, 4.70512], [-60.98303, 4.54167], [-61.15703, 4.49839], [-61.31457, 4.54167], [-61.29675, 4.44216], [-61.48569, 4.43149], [-61.54629, 4.2822], [-62.13094, 4.08309], [-62.44822, 4.18621], [-62.57656, 4.04754], [-62.74411, 4.03331], [-62.7655, 3.73099], [-62.98296, 3.59935], [-63.21111, 3.96219], [-63.4464, 3.9693], [-63.42233, 3.89995], [-63.50611, 3.83592], [-63.67099, 4.01731], [-63.70218, 3.91417], [-63.86082, 3.94796], [-63.99183, 3.90172], [-64.14512, 4.12932], [-64.57648, 4.12576], [-64.72977, 4.28931], [-64.84028, 4.24665], [-64.48379, 3.7879], [-64.02908, 2.79797], [-64.0257, 2.48156], [-63.39114, 2.4317], [-63.39827, 2.16098], [-64.06135, 1.94722], [-64.08274, 1.64792], [-64.34654, 1.35569], [-64.38932, 1.5125], [-65.11657, 1.12046], [-65.57288, 0.62856], [-65.50158, 0.92086], [-65.6727, 1.01353], [-66.28507, 0.74585], [-66.85795, 1.22998], [-67.08222, 1.17441], [-67.15784, 1.80439], [-67.299, 1.87494], [-67.40488, 2.22258], [-67.9292, 1.82455], [-68.18632, 2.00091], [-68.26699, 1.83463], [-68.18128, 1.72881], [-69.38621, 1.70865], [-69.53746, 1.76408], [-69.83491, 1.69353], [-69.82987, 1.07864], [-69.26017, 1.06856], [-69.14422, 0.84172], [-69.20976, 0.57958], [-69.47696, 0.71065], [-70.04162, 0.55437], [-70.03658, -0.19681], [-69.603, -0.51947], [-69.59796, -0.75136], [-69.4215, -1.01853], [-69.43395, -1.42219], [-69.94708, -4.2431], [-70.00888, -4.37833], [-70.11305, -4.27281], [-70.19582, -4.3607], [-70.33236, -4.15214], [-70.77601, -4.15717], [-70.96814, -4.36915], [-71.87003, -4.51661], [-72.64391, -5.0391], [-72.83973, -5.14765], [-73.24579, -6.05764], [-73.12983, -6.43852], [-73.73986, -6.87919], [-73.77011, -7.28944], [-73.96938, -7.58465], [-73.65485, -7.77897], [-73.76576, -7.89884], [-72.92886, -9.04074], [-73.21498, -9.40904], [-72.72216, -9.41397], [-72.31883, -9.5184], [-72.14742, -9.98049], [-71.23394, -9.9668], [-70.53373, -9.42628], [-70.58453, -9.58303], [-70.55429, -9.76692], [-70.62487, -9.80666], [-70.64134, -11.0108], [-70.51395, -10.92249], [-70.38791, -11.07096], [-69.90896, -10.92744], [-69.57835, -10.94051], [-69.57156, -10.94555], [-69.47839, -10.95254], [-69.42792, -10.93451], [-68.74802, -11.00891], [-68.75265, -11.02383], [-68.75179, -11.03688], [-68.7651, -11.0496], [-68.71533, -11.14749], [-67.17784, -10.34016], [-65.68343, -9.75323], [-65.56244, -9.84266], [-65.40615, -9.63894], [-65.29019, -9.86253], [-65.37923, -10.35141], [-65.35402, -10.78685], [-65.28141, -10.86289], [-65.30027, -11.48749], [-64.99778, -11.98604], [-64.30708, -12.46398], [-64.22539, -12.45267], [-63.90248, -12.52544], [-63.76259, -12.42952], [-61.81151, -13.49564], [-61.05527, -13.50054], [-60.48053, -13.77981], [-60.46037, -14.22496], [-60.27887, -14.63021], [-60.23968, -15.09515], [-60.58224, -15.09887], [-60.23797, -15.50267], [-60.16069, -16.26479], [-58.41506, -16.32636], [-58.32431, -16.25861], [-58.30918, -16.3699], [-58.5058, -16.80958], [-58.32935, -17.28195], [-57.99661, -17.5273], [-57.90082, -17.44555], [-57.73949, -17.56095], [-57.69877, -17.8431], [-57.48237, -18.24219], [-57.56807, -18.25655], [-57.76764, -18.90087], [-57.71995, -18.89573], [-57.71995, -18.97546], [-57.69134, -19.00544], [-57.71113, -19.03161], [-57.78463, -19.03259], [-58.14215, -19.76276], [-57.8496, -19.98346], [-58.16225, -20.16193], [-57.84536, -20.93155], [-57.93492, -21.65505], [-57.88239, -21.6868], [-57.94642, -21.73799], [-57.98625, -22.09157], [-56.6508, -22.28387], [-56.5212, -22.11556], [-56.45893, -22.08072], [-56.23206, -22.25347], [-55.8331, -22.29008], [-55.74941, -22.46436], [-55.741, -22.52018], [-55.72366, -22.5519], [-55.6986, -22.56268], [-55.68742, -22.58407], [-55.62493, -22.62765], [-55.63849, -22.95122], [-55.5446, -23.22811], [-55.52288, -23.2595], [-55.5555, -23.28237], [-55.43585, -23.87157], [-55.44117, -23.9185], [-55.41784, -23.9657], [-55.12292, -23.99669], [-55.0518, -23.98666], [-55.02691, -23.97317], [-54.6238, -23.83078], [-54.32807, -24.01865], [-54.28207, -24.07305], [-54.4423, -25.13381], [-54.62033, -25.46026], [-54.60196, -25.48397], [-54.59509, -25.53696], [-54.59398, -25.59224], [-54.5502, -25.58915], [-54.52926, -25.62846], [-53.90831, -25.55513], [-53.83691, -25.94849], [-53.73511, -26.04211], [-53.73086, -26.05842], [-53.7264, -26.0664], [-53.73391, -26.07006], [-53.73968, -26.10012], [-53.65018, -26.19501], [-53.65237, -26.23289], [-53.63739, -26.2496], [-53.63881, -26.25075], [-53.64632, -26.24798], [-53.64186, -26.25976], [-53.64505, -26.28089], [-53.68269, -26.33359], [-53.73372, -26.6131], [-53.80144, -27.09844], [-54.15978, -27.2889], [-54.19062, -27.27639], [-54.19268, -27.30751], [-54.41888, -27.40882], [-54.50416, -27.48232], [-54.67657, -27.57214], [-54.90159, -27.63132], [-54.90805, -27.73149], [-55.1349, -27.89759], [-55.16872, -27.86224], [-55.33303, -27.94661], [-55.6262, -28.17124], [-55.65418, -28.18304], [-56.01729, -28.51223], [-56.00458, -28.60421], [-56.05265, -28.62651], [-56.54171, -29.11447], [-56.57295, -29.11357], [-56.62789, -29.18073], [-56.81251, -29.48154], [-57.09386, -29.74211], [-57.65132, -30.19229], [-57.22502, -30.26121], [-56.90236, -30.02578], [-56.49267, -30.39471], [-56.4795, -30.3899], [-56.4619, -30.38457], [-55.87388, -31.05053], [-55.58866, -30.84117], [-55.5634, -30.8686], [-55.55373, -30.8732], [-55.55218, -30.88193], [-55.54572, -30.89051], [-55.53431, -30.89714], [-55.53276, -30.90218], [-55.52712, -30.89997], [-55.51862, -30.89828], [-55.50841, -30.9027], [-55.50821, -30.91349], [-54.17384, -31.86168], [-53.76024, -32.0751], [-53.39572, -32.58596], [-53.37671, -32.57005], [-53.1111, -32.71147], [-53.53459, -33.16843], [-53.52794, -33.68908], [-53.44031, -33.69344], [-53.39593, -33.75169], [-53.37138, -33.74313], [-52.83257, -34.01481], [-28.34015, -20.99094], [-28.99601, 1.86593], [-51.35485, 4.8383], [-51.63798, 4.51394], [-51.61983, 4.14596], [-51.79599, 3.89336], [-51.82312, 3.85825], [-51.85573, 3.83427], [-52.31787, 3.17896], [-52.6906, 2.37298], [-52.96539, 2.1881], [-53.78743, 2.34412], [-54.16286, 2.10779], [-54.6084, 2.32856], [-55.01919, 2.564], [-55.71493, 2.40342], [-55.96292, 2.53188], [-56.13054, 2.27723], [-55.92159, 2.05236], [-55.89863, 1.89861], [-55.99278, 1.83137], [-56.47045, 1.95135], [-56.7659, 1.89509], [-57.07092, 1.95304], [-57.09109, 2.01854], [-57.23981, 1.95808], [-57.35073, 1.98327], [-57.55743, 1.69605], [-57.77281, 1.73344], [-57.97336, 1.64566], [-58.01873, 1.51966], [-58.33887, 1.58014], [-58.4858, 1.48399], [-58.53571, 1.29154], [-58.84229, 1.17749], [-58.92072, 1.31293], [-59.25583, 1.40559], [-59.74066, 1.87596], [-59.7264, 2.27497], [-59.91177, 2.36759], [-59.99733, 2.92312], [-59.79769, 3.37162], [-59.86899, 3.57089], [-59.51963, 3.91951], [-59.73353, 4.20399], [-59.69361, 4.34069]]]] } },
23116     { type: "Feature", properties: { iso1A2: "BS", iso1A3: "BHS", iso1N3: "044", wikidata: "Q778", nameEn: "The Bahamas", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 242"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-72.98446, 20.4801], [-71.70065, 25.7637], [-78.91214, 27.76553], [-80.65727, 23.71953], [-72.98446, 20.4801]]]] } },
23117     { type: "Feature", properties: { iso1A2: "BT", iso1A3: "BTN", iso1N3: "064", wikidata: "Q917", nameEn: "Bhutan", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["975"] }, geometry: { type: "MultiPolygon", coordinates: [[[[91.6469, 27.76358], [91.5629, 27.84823], [91.48973, 27.93903], [91.46327, 28.0064], [91.25779, 28.07509], [91.20019, 27.98715], [90.69894, 28.07784], [90.58842, 28.02838], [90.13387, 28.19178], [89.79762, 28.23979], [89.59525, 28.16433], [89.12825, 27.62502], [89.0582, 27.60985], [88.97213, 27.51671], [88.95355, 27.4106], [89.00216, 27.32532], [88.96947, 27.30319], [88.93678, 27.33777], [88.91901, 27.32483], [88.74219, 27.144], [88.86984, 27.10937], [88.8714, 26.97488], [88.92301, 26.99286], [88.95807, 26.92668], [89.09554, 26.89089], [89.12825, 26.81661], [89.1926, 26.81329], [89.37913, 26.86224], [89.38319, 26.85963], [89.3901, 26.84225], [89.42349, 26.83727], [89.63369, 26.74402], [89.86124, 26.73307], [90.04535, 26.72422], [90.30402, 26.85098], [90.39271, 26.90704], [90.48504, 26.8594], [90.67715, 26.77215], [91.50067, 26.79223], [91.83181, 26.87318], [92.05523, 26.8692], [92.11863, 26.893], [92.03457, 27.07334], [92.04702, 27.26861], [92.12019, 27.27829], [92.01132, 27.47352], [91.65007, 27.48287], [91.55819, 27.6144], [91.6469, 27.76358]]]] } },
23118     { type: "Feature", properties: { iso1A2: "BV", iso1A3: "BVT", iso1N3: "074", wikidata: "Q23408", nameEn: "Bouvet Island", country: "NO", groups: ["005", "419", "019", "UN"] }, geometry: { type: "MultiPolygon", coordinates: [[[[4.54042, -54.0949], [2.28941, -54.13089], [3.35353, -55.17558], [4.54042, -54.0949]]]] } },
23119     { type: "Feature", properties: { iso1A2: "BW", iso1A3: "BWA", iso1N3: "072", wikidata: "Q963", nameEn: "Botswana", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["267"] }, geometry: { type: "MultiPolygon", coordinates: [[[[25.26433, -17.79571], [25.16882, -17.78253], [25.05895, -17.84452], [24.95586, -17.79674], [24.73364, -17.89338], [24.71887, -17.9218], [24.6303, -17.9863], [24.57485, -18.07151], [24.40577, -17.95726], [24.19416, -18.01919], [23.61088, -18.4881], [23.29618, -17.99855], [23.0996, -18.00075], [21.45556, -18.31795], [20.99904, -18.31743], [20.99751, -22.00026], [19.99912, -21.99991], [19.99817, -24.76768], [20.02809, -24.78725], [20.03678, -24.81004], [20.29826, -24.94869], [20.64795, -25.47827], [20.86081, -26.14892], [20.61754, -26.4692], [20.63275, -26.78181], [20.68596, -26.9039], [20.87031, -26.80047], [21.13353, -26.86661], [21.37869, -26.82083], [21.69322, -26.86152], [21.7854, -26.79199], [21.77114, -26.69015], [21.83291, -26.65959], [21.90703, -26.66808], [22.06192, -26.61882], [22.21206, -26.3773], [22.41921, -26.23078], [22.56365, -26.19668], [22.70808, -25.99186], [22.86012, -25.50572], [23.03497, -25.29971], [23.47588, -25.29971], [23.9244, -25.64286], [24.18287, -25.62916], [24.36531, -25.773], [24.44703, -25.73021], [24.67319, -25.81749], [24.8946, -25.80723], [25.01718, -25.72507], [25.12266, -25.75931], [25.33076, -25.76616], [25.58543, -25.6343], [25.6643, -25.4491], [25.69661, -25.29284], [25.72702, -25.25503], [25.88571, -24.87802], [25.84295, -24.78661], [25.8515, -24.75727], [26.39409, -24.63468], [26.46346, -24.60358], [26.51667, -24.47219], [26.84165, -24.24885], [26.99749, -23.65486], [27.33768, -23.40917], [27.52393, -23.37952], [27.6066, -23.21894], [27.74154, -23.2137], [27.93539, -23.04941], [27.93729, -22.96194], [28.04752, -22.90243], [28.04562, -22.8394], [28.34874, -22.5694], [28.63287, -22.55887], [28.91889, -22.44299], [29.0151, -22.22907], [29.10881, -22.21202], [29.15268, -22.21399], [29.18974, -22.18599], [29.21955, -22.17771], [29.37703, -22.19581], [29.3533, -22.18363], [29.24648, -22.05967], [29.1974, -22.07472], [29.14501, -22.07275], [29.08495, -22.04867], [29.04108, -22.00563], [29.02191, -21.95665], [29.02191, -21.90647], [29.04023, -21.85864], [29.07763, -21.81877], [28.58114, -21.63455], [28.49942, -21.66634], [28.29416, -21.59037], [28.01669, -21.57624], [27.91407, -21.31621], [27.69171, -21.08409], [27.72972, -20.51735], [27.69361, -20.48531], [27.28865, -20.49873], [27.29831, -20.28935], [27.21278, -20.08244], [26.72246, -19.92707], [26.17227, -19.53709], [25.96226, -19.08152], [25.99837, -19.02943], [25.94326, -18.90362], [25.82353, -18.82808], [25.79217, -18.6355], [25.68859, -18.56165], [25.53465, -18.39041], [25.39972, -18.12691], [25.31799, -18.07091], [25.23909, -17.90832], [25.26433, -17.79571]]]] } },
23120     { type: "Feature", properties: { iso1A2: "BY", iso1A3: "BLR", iso1N3: "112", wikidata: "Q184", nameEn: "Belarus", groups: ["151", "150", "UN"], callingCodes: ["375"] }, geometry: { type: "MultiPolygon", coordinates: [[[[28.15217, 56.16964], [27.97865, 56.11849], [27.63065, 55.89687], [27.61683, 55.78558], [27.3541, 55.8089], [27.27804, 55.78299], [27.1559, 55.85032], [26.97153, 55.8102], [26.87448, 55.7172], [26.76872, 55.67658], [26.71802, 55.70645], [26.64888, 55.70515], [26.63231, 55.67968], [26.63167, 55.57887], [26.55094, 55.5093], [26.5522, 55.40277], [26.44937, 55.34832], [26.5709, 55.32572], [26.6714, 55.33902], [26.80929, 55.31642], [26.83266, 55.30444], [26.835, 55.28182], [26.73017, 55.24226], [26.72983, 55.21788], [26.68075, 55.19787], [26.69243, 55.16718], [26.54753, 55.14181], [26.51481, 55.16051], [26.46249, 55.12814], [26.35121, 55.1525], [26.30628, 55.12536], [26.23202, 55.10439], [26.26941, 55.08032], [26.20397, 54.99729], [26.13386, 54.98924], [26.05907, 54.94631], [25.99129, 54.95705], [25.89462, 54.93438], [25.74122, 54.80108], [25.75977, 54.57252], [25.68045, 54.5321], [25.64813, 54.48704], [25.62203, 54.4656], [25.63371, 54.42075], [25.5376, 54.33158], [25.55425, 54.31591], [25.68513, 54.31727], [25.78553, 54.23327], [25.78563, 54.15747], [25.71084, 54.16704], [25.64875, 54.1259], [25.54724, 54.14925], [25.51452, 54.17799], [25.56823, 54.25212], [25.509, 54.30267], [25.35559, 54.26544], [25.22705, 54.26271], [25.19199, 54.219], [25.0728, 54.13419], [24.991, 54.14241], [24.96894, 54.17589], [24.77131, 54.11091], [24.85311, 54.02862], [24.74279, 53.96663], [24.69185, 53.96543], [24.69652, 54.01901], [24.62275, 54.00217], [24.44411, 53.90076], [24.34128, 53.90076], [24.19638, 53.96405], [23.98837, 53.92554], [23.95098, 53.9613], [23.81309, 53.94205], [23.80543, 53.89558], [23.71726, 53.93379], [23.61677, 53.92691], [23.51284, 53.95052], [23.62004, 53.60942], [23.81995, 53.24131], [23.85657, 53.22923], [23.91393, 53.16469], [23.87548, 53.0831], [23.92184, 53.02079], [23.94689, 52.95919], [23.91805, 52.94016], [23.93763, 52.71332], [23.73615, 52.6149], [23.58296, 52.59868], [23.45112, 52.53774], [23.34141, 52.44845], [23.18196, 52.28812], [23.20071, 52.22848], [23.47859, 52.18215], [23.54314, 52.12148], [23.61, 52.11264], [23.64066, 52.07626], [23.68733, 51.9906], [23.61523, 51.92066], [23.62691, 51.78208], [23.53198, 51.74298], [23.57053, 51.55938], [23.56236, 51.53673], [23.62751, 51.50512], [23.6736, 51.50255], [23.60906, 51.62122], [23.7766, 51.66809], [23.91118, 51.63316], [23.8741, 51.59734], [23.99907, 51.58369], [24.13075, 51.66979], [24.3163, 51.75063], [24.29021, 51.80841], [24.37123, 51.88222], [24.98784, 51.91273], [25.20228, 51.97143], [25.46163, 51.92205], [25.73673, 51.91973], [25.80574, 51.94556], [25.83217, 51.92587], [26.00408, 51.92967], [26.19084, 51.86781], [26.39367, 51.87315], [26.46962, 51.80501], [26.69759, 51.82284], [26.80043, 51.75777], [26.9489, 51.73788], [26.99422, 51.76933], [27.20602, 51.77291], [27.20948, 51.66713], [27.26613, 51.65957], [27.24828, 51.60161], [27.47212, 51.61184], [27.51058, 51.5854], [27.55727, 51.63486], [27.71932, 51.60672], [27.67125, 51.50854], [27.76052, 51.47604], [27.85253, 51.62293], [27.91844, 51.61952], [27.95827, 51.56065], [28.10658, 51.57857], [28.23452, 51.66988], [28.37592, 51.54505], [28.47051, 51.59734], [28.64429, 51.5664], [28.69161, 51.44695], [28.73143, 51.46236], [28.75615, 51.41442], [28.78224, 51.45294], [28.76027, 51.48802], [28.81795, 51.55552], [28.95528, 51.59222], [28.99098, 51.56833], [29.1187, 51.65872], [29.16402, 51.64679], [29.20659, 51.56918], [29.25603, 51.57089], [29.25191, 51.49828], [29.32881, 51.37843], [29.42357, 51.4187], [29.49773, 51.39814], [29.54372, 51.48372], [29.7408, 51.53417], [29.77376, 51.4461], [30.17888, 51.51025], [30.34642, 51.42555], [30.36153, 51.33984], [30.56203, 51.25655], [30.64992, 51.35014], [30.51946, 51.59649], [30.68804, 51.82806], [30.76443, 51.89739], [30.90897, 52.00699], [30.95589, 52.07775], [31.13332, 52.1004], [31.25142, 52.04131], [31.38326, 52.12991], [31.7822, 52.11406], [31.77877, 52.18636], [31.6895, 52.1973], [31.70735, 52.26711], [31.57971, 52.32146], [31.62084, 52.33849], [31.61397, 52.48843], [31.56316, 52.51518], [31.63869, 52.55361], [31.50406, 52.69707], [31.57277, 52.71613], [31.592, 52.79011], [31.35667, 52.97854], [31.24147, 53.031], [31.32283, 53.04101], [31.33519, 53.08805], [31.3915, 53.09712], [31.36403, 53.13504], [31.40523, 53.21406], [31.56316, 53.19432], [31.62496, 53.22886], [31.787, 53.18033], [31.82373, 53.10042], [32.15368, 53.07594], [32.40773, 53.18856], [32.51725, 53.28431], [32.73257, 53.33494], [32.74968, 53.45597], [32.47777, 53.5548], [32.40499, 53.6656], [32.50112, 53.68594], [32.45717, 53.74039], [32.36663, 53.7166], [32.12621, 53.81586], [31.89137, 53.78099], [31.77028, 53.80015], [31.85019, 53.91801], [31.88744, 54.03653], [31.89599, 54.0837], [31.57002, 54.14535], [31.30791, 54.25315], [31.3177, 54.34067], [31.22945, 54.46585], [31.08543, 54.50361], [31.21399, 54.63113], [31.19339, 54.66947], [30.99187, 54.67046], [30.98226, 54.68872], [31.0262, 54.70698], [30.97127, 54.71967], [30.95479, 54.74346], [30.75165, 54.80699], [30.8264, 54.90062], [30.81759, 54.94064], [30.93144, 54.9585], [30.95754, 54.98609], [30.9081, 55.02232], [30.94243, 55.03964], [31.00972, 55.02783], [31.02071, 55.06167], [30.97369, 55.17134], [30.87944, 55.28223], [30.81946, 55.27931], [30.8257, 55.3313], [30.93144, 55.3914], [30.90123, 55.46621], [30.95204, 55.50667], [30.93419, 55.6185], [30.86003, 55.63169], [30.7845, 55.58514], [30.72957, 55.66268], [30.67464, 55.64176], [30.63344, 55.73079], [30.51037, 55.76568], [30.51346, 55.78982], [30.48257, 55.81066], [30.30987, 55.83592], [30.27776, 55.86819], [30.12136, 55.8358], [29.97975, 55.87281], [29.80672, 55.79569], [29.61446, 55.77716], [29.51283, 55.70294], [29.3604, 55.75862], [29.44692, 55.95978], [29.21717, 55.98971], [29.08299, 56.03427], [28.73418, 55.97131], [28.63668, 56.07262], [28.68337, 56.10173], [28.5529, 56.11705], [28.43068, 56.09407], [28.37987, 56.11399], [28.36888, 56.05805], [28.30571, 56.06035], [28.15217, 56.16964]]]] } },
23121     { type: "Feature", properties: { iso1A2: "BZ", iso1A3: "BLZ", iso1N3: "084", wikidata: "Q242", nameEn: "Belize", groups: ["013", "003", "419", "019", "UN"], roadSpeedUnit: "mph", callingCodes: ["501"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-88.3268, 18.49048], [-88.48242, 18.49164], [-88.71505, 18.0707], [-88.8716, 17.89535], [-89.03839, 18.0067], [-89.15105, 17.95104], [-89.14985, 17.81563], [-89.15025, 17.04813], [-89.22683, 15.88619], [-89.17418, 15.90898], [-89.02415, 15.9063], [-88.95358, 15.88698], [-88.40779, 16.09624], [-86.92368, 17.61462], [-87.84815, 18.18511], [-87.85693, 18.18266], [-87.86657, 18.19971], [-87.87604, 18.18313], [-87.90671, 18.15213], [-88.03165, 18.16657], [-88.03238, 18.41778], [-88.26593, 18.47617], [-88.29909, 18.47591], [-88.3268, 18.49048]]]] } },
23122     { type: "Feature", properties: { iso1A2: "CA", iso1A3: "CAN", iso1N3: "124", wikidata: "Q16", nameEn: "Canada", groups: ["021", "003", "019", "UN"], callingCodes: ["1"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-67.20349, 45.1722], [-67.19603, 45.16771], [-67.15965, 45.16179], [-67.11316, 45.11176], [-67.0216, 44.95333], [-66.96824, 44.90965], [-66.98249, 44.87071], [-66.96824, 44.83078], [-66.93432, 44.82597], [-67.16117, 44.20069], [-61.98255, 37.34815], [-56.27503, 47.39728], [-53.12387, 41.40385], [-46.37635, 57.3249], [-77.52957, 77.23408], [-68.21821, 80.48551], [-49.33696, 84.57952], [-140.97446, 84.39275], [-141.00116, 60.30648], [-140.5227, 60.22077], [-140.45648, 60.30919], [-139.98024, 60.18027], [-139.68991, 60.33693], [-139.05831, 60.35205], [-139.20603, 60.08896], [-139.05365, 59.99655], [-138.71149, 59.90728], [-138.62145, 59.76431], [-137.60623, 59.24465], [-137.4925, 58.89415], [-136.82619, 59.16198], [-136.52365, 59.16752], [-136.47323, 59.46617], [-136.33727, 59.44466], [-136.22381, 59.55526], [-136.31566, 59.59083], [-135.48007, 59.79937], [-135.03069, 59.56208], [-135.00267, 59.28745], [-134.7047, 59.2458], [-134.55699, 59.1297], [-134.48059, 59.13231], [-134.27175, 58.8634], [-133.84645, 58.73543], [-133.38523, 58.42773], [-131.8271, 56.62247], [-130.77769, 56.36185], [-130.33965, 56.10849], [-130.10173, 56.12178], [-130.00093, 56.00325], [-130.00857, 55.91344], [-130.15373, 55.74895], [-129.97513, 55.28029], [-130.08035, 55.21556], [-130.18765, 55.07744], [-130.27203, 54.97174], [-130.44184, 54.85377], [-130.64499, 54.76912], [-130.61931, 54.70835], [-133.92876, 54.62289], [-133.36909, 48.51151], [-125.03842, 48.53282], [-123.50039, 48.21223], [-123.15614, 48.35395], [-123.26565, 48.6959], [-123.0093, 48.76586], [-123.0093, 48.83186], [-123.32163, 49.00419], [-95.15355, 48.9996], [-95.15357, 49.384], [-95.12903, 49.37056], [-95.05825, 49.35311], [-95.01419, 49.35647], [-94.99532, 49.36579], [-94.95681, 49.37035], [-94.85381, 49.32492], [-94.8159, 49.32299], [-94.82487, 49.29483], [-94.77355, 49.11998], [-94.75017, 49.09931], [-94.687, 48.84077], [-94.70087, 48.8339], [-94.70486, 48.82365], [-94.69669, 48.80918], [-94.69335, 48.77883], [-94.58903, 48.71803], [-94.54885, 48.71543], [-94.53826, 48.70216], [-94.44258, 48.69223], [-94.4174, 48.71049], [-94.27153, 48.70232], [-94.25172, 48.68404], [-94.25104, 48.65729], [-94.23215, 48.65202], [-93.85769, 48.63284], [-93.83288, 48.62745], [-93.80676, 48.58232], [-93.80939, 48.52439], [-93.79267, 48.51631], [-93.66382, 48.51845], [-93.47022, 48.54357], [-93.44472, 48.59147], [-93.40693, 48.60948], [-93.39758, 48.60364], [-93.3712, 48.60599], [-93.33946, 48.62787], [-93.25391, 48.64266], [-92.94973, 48.60866], [-92.7287, 48.54005], [-92.6342, 48.54133], [-92.62747, 48.50278], [-92.69927, 48.49573], [-92.71323, 48.46081], [-92.65606, 48.43471], [-92.50712, 48.44921], [-92.45588, 48.40624], [-92.48147, 48.36609], [-92.37185, 48.22259], [-92.27167, 48.25046], [-92.30939, 48.31251], [-92.26662, 48.35651], [-92.202, 48.35252], [-92.14732, 48.36578], [-92.05339, 48.35958], [-91.98929, 48.25409], [-91.86125, 48.21278], [-91.71231, 48.19875], [-91.70451, 48.11805], [-91.55649, 48.10611], [-91.58025, 48.04339], [-91.45829, 48.07454], [-91.43248, 48.04912], [-91.25025, 48.08522], [-91.08016, 48.18096], [-90.87588, 48.2484], [-90.75045, 48.09143], [-90.56444, 48.12184], [-90.56312, 48.09488], [-90.07418, 48.11043], [-89.89974, 47.98109], [-89.77248, 48.02607], [-89.57972, 48.00023], [-89.48837, 48.01412], [-88.37033, 48.30586], [-84.85871, 46.88881], [-84.55635, 46.45974], [-84.47607, 46.45225], [-84.4481, 46.48972], [-84.42101, 46.49853], [-84.34174, 46.50683], [-84.29893, 46.49127], [-84.26351, 46.49508], [-84.2264, 46.53337], [-84.1945, 46.54061], [-84.17723, 46.52753], [-84.12885, 46.53068], [-84.11196, 46.50248], [-84.13451, 46.39218], [-84.11254, 46.32329], [-84.11615, 46.2681], [-84.09756, 46.25512], [-84.1096, 46.23987], [-83.95399, 46.05634], [-83.90453, 46.05922], [-83.83329, 46.12169], [-83.57017, 46.105], [-83.43746, 45.99749], [-83.59589, 45.82131], [-82.48419, 45.30225], [-82.42469, 42.992], [-82.4146, 42.97626], [-82.4253, 42.95423], [-82.45331, 42.93139], [-82.4826, 42.8068], [-82.46613, 42.76615], [-82.51063, 42.66025], [-82.51858, 42.611], [-82.57583, 42.5718], [-82.58873, 42.54984], [-82.64242, 42.55594], [-82.82964, 42.37355], [-83.02253, 42.33045], [-83.07837, 42.30978], [-83.09837, 42.28877], [-83.12724, 42.2376], [-83.14962, 42.04089], [-83.11184, 41.95671], [-82.67862, 41.67615], [-78.93684, 42.82887], [-78.90712, 42.89733], [-78.90905, 42.93022], [-78.93224, 42.95229], [-78.96312, 42.95509], [-78.98126, 42.97], [-79.02074, 42.98444], [-79.02424, 43.01983], [-78.99941, 43.05612], [-79.01055, 43.06659], [-79.07486, 43.07845], [-79.05671, 43.10937], [-79.06881, 43.12029], [-79.0427, 43.13934], [-79.04652, 43.16396], [-79.05384, 43.17418], [-79.05002, 43.20133], [-79.05544, 43.21224], [-79.05512, 43.25375], [-79.06921, 43.26183], [-79.25796, 43.54052], [-76.79706, 43.63099], [-76.43859, 44.09393], [-76.35324, 44.13493], [-76.31222, 44.19894], [-76.244, 44.19643], [-76.1664, 44.23051], [-76.16285, 44.28262], [-76.00018, 44.34896], [-75.95947, 44.34463], [-75.8217, 44.43176], [-75.76813, 44.51537], [-75.41441, 44.76614], [-75.2193, 44.87821], [-75.01363, 44.95608], [-74.99101, 44.98051], [-74.8447, 45.00606], [-74.66689, 45.00646], [-74.32699, 44.99029], [-73.35025, 45.00942], [-71.50067, 45.01357], [-71.48735, 45.07784], [-71.42778, 45.12624], [-71.40364, 45.21382], [-71.44252, 45.2361], [-71.37133, 45.24624], [-71.29371, 45.29996], [-71.22338, 45.25184], [-71.19723, 45.25438], [-71.14568, 45.24128], [-71.08364, 45.30623], [-71.01866, 45.31573], [-71.0107, 45.34819], [-70.95193, 45.33895], [-70.91169, 45.29849], [-70.89864, 45.2398], [-70.84816, 45.22698], [-70.80236, 45.37444], [-70.82638, 45.39828], [-70.78372, 45.43269], [-70.65383, 45.37592], [-70.62518, 45.42286], [-70.72651, 45.49771], [-70.68516, 45.56964], [-70.54019, 45.67291], [-70.38934, 45.73215], [-70.41523, 45.79497], [-70.25976, 45.89675], [-70.24694, 45.95138], [-70.31025, 45.96424], [-70.23855, 46.1453], [-70.29078, 46.18832], [-70.18547, 46.35357], [-70.05812, 46.41768], [-69.99966, 46.69543], [-69.22119, 47.46461], [-69.05148, 47.42012], [-69.05073, 47.30076], [-69.05039, 47.2456], [-68.89222, 47.1807], [-68.70125, 47.24399], [-68.60575, 47.24659], [-68.57914, 47.28431], [-68.38332, 47.28723], [-68.37458, 47.35851], [-68.23244, 47.35712], [-67.94843, 47.1925], [-67.87993, 47.10377], [-67.78578, 47.06473], [-67.78111, 45.9392], [-67.75196, 45.91814], [-67.80961, 45.87531], [-67.75654, 45.82324], [-67.80653, 45.80022], [-67.80705, 45.69528], [-67.6049, 45.60725], [-67.43815, 45.59162], [-67.42144, 45.50584], [-67.50578, 45.48971], [-67.42394, 45.37969], [-67.48201, 45.27351], [-67.34927, 45.122], [-67.29754, 45.14865], [-67.29748, 45.18173], [-67.27039, 45.1934], [-67.22751, 45.16344], [-67.20349, 45.1722]]]] } },
23123     { type: "Feature", properties: { iso1A2: "CC", iso1A3: "CCK", iso1N3: "166", wikidata: "Q36004", nameEn: "Cocos (Keeling) Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[96.61846, -10.82438], [96.02343, -12.68334], [97.93979, -12.33309], [96.61846, -10.82438]]]] } },
23124     { type: "Feature", properties: { iso1A2: "CD", iso1A3: "COD", iso1N3: "180", wikidata: "Q974", nameEn: "Democratic Republic of the Congo", aliases: ["ZR"], groups: ["017", "202", "002", "UN"], callingCodes: ["243"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.44012, 5.07349], [27.09575, 5.22305], [26.93064, 5.13535], [26.85579, 5.03887], [26.74572, 5.10685], [26.48595, 5.04984], [26.13371, 5.25594], [25.86073, 5.19455], [25.53271, 5.37431], [25.34558, 5.29101], [25.31256, 5.03668], [24.71816, 4.90509], [24.46719, 5.0915], [23.38847, 4.60013], [22.94817, 4.82392], [22.89094, 4.79321], [22.84691, 4.69887], [22.78526, 4.71423], [22.6928, 4.47285], [22.60915, 4.48821], [22.5431, 4.22041], [22.45504, 4.13039], [22.27682, 4.11347], [22.10721, 4.20723], [21.6405, 4.317], [21.55904, 4.25553], [21.25744, 4.33676], [21.21341, 4.29285], [21.11214, 4.33895], [21.08793, 4.39603], [20.90383, 4.44877], [20.60184, 4.42394], [18.62755, 3.47564], [18.63857, 3.19342], [18.10683, 2.26876], [18.08034, 1.58553], [17.85887, 1.04327], [17.86989, 0.58873], [17.95255, 0.48128], [17.93877, 0.32424], [17.81204, 0.23884], [17.66051, -0.26535], [17.72112, -0.52707], [17.32438, -0.99265], [16.97999, -1.12762], [16.70724, -1.45815], [16.50336, -1.8795], [16.16173, -2.16586], [16.22785, -2.59528], [16.1755, -3.25014], [16.21407, -3.2969], [15.89448, -3.9513], [15.53081, -4.042], [15.48121, -4.22062], [15.41785, -4.28381], [15.32693, -4.27282], [15.25411, -4.31121], [15.1978, -4.32388], [14.83101, -4.80838], [14.67948, -4.92093], [14.5059, -4.84956], [14.41499, -4.8825], [14.37366, -4.56125], [14.47284, -4.42941], [14.3957, -4.36623], [14.40672, -4.28381], [13.9108, -4.50906], [13.81162, -4.41842], [13.71794, -4.44864], [13.70417, -4.72601], [13.50305, -4.77818], [13.41764, -4.89897], [13.11182, -4.5942], [13.09648, -4.63739], [13.11195, -4.67745], [12.8733, -4.74346], [12.70868, -4.95505], [12.63465, -4.94632], [12.60251, -5.01715], [12.46297, -5.09408], [12.49815, -5.14058], [12.51589, -5.1332], [12.53586, -5.14658], [12.53599, -5.1618], [12.52301, -5.17481], [12.52318, -5.74353], [12.26557, -5.74031], [12.20376, -5.76338], [11.95767, -5.94705], [12.42245, -6.07585], [13.04371, -5.87078], [16.55507, -5.85631], [16.96282, -7.21787], [17.5828, -8.13784], [18.33635, -8.00126], [19.33698, -7.99743], [19.5469, -7.00195], [20.30218, -6.98955], [20.31846, -6.91953], [20.61689, -6.90876], [20.56263, -7.28566], [21.79824, -7.29628], [21.84856, -9.59871], [22.19039, -9.94628], [22.32604, -10.76291], [22.17954, -10.85884], [22.25951, -11.24911], [22.54205, -11.05784], [23.16602, -11.10577], [23.45631, -10.946], [23.86868, -11.02856], [24.00027, -10.89356], [24.34528, -11.06816], [24.42612, -11.44975], [25.34069, -11.19707], [25.33058, -11.65767], [26.01777, -11.91488], [26.88687, -12.01868], [27.04351, -11.61312], [27.22541, -11.60323], [27.21025, -11.76157], [27.59932, -12.22123], [28.33199, -12.41375], [29.01918, -13.41353], [29.60531, -13.21685], [29.65078, -13.41844], [29.81551, -13.44683], [29.8139, -12.14898], [29.48404, -12.23604], [29.4992, -12.43843], [29.18592, -12.37921], [28.48357, -11.87532], [28.37241, -11.57848], [28.65032, -10.65133], [28.62795, -9.92942], [28.68532, -9.78], [28.56208, -9.49122], [28.51627, -9.44726], [28.52636, -9.35379], [28.36562, -9.30091], [28.38526, -9.23393], [28.9711, -8.66935], [28.88917, -8.4831], [30.79243, -8.27382], [30.2567, -7.14121], [29.52552, -6.2731], [29.43673, -4.44845], [29.23708, -3.75856], [29.21463, -3.3514], [29.25633, -3.05471], [29.17258, -2.99385], [29.16037, -2.95457], [29.09797, -2.91935], [29.09119, -2.87871], [29.0505, -2.81774], [29.00404, -2.81978], [29.00167, -2.78523], [29.04081, -2.7416], [29.00357, -2.70596], [28.94346, -2.69124], [28.89793, -2.66111], [28.90226, -2.62385], [28.89288, -2.55848], [28.87943, -2.55165], [28.86193, -2.53185], [28.86209, -2.5231], [28.87497, -2.50887], [28.88846, -2.50493], [28.89342, -2.49017], [28.89132, -2.47557], [28.86846, -2.44866], [28.86826, -2.41888], [28.89601, -2.37321], [28.95642, -2.37321], [29.00051, -2.29001], [29.105, -2.27043], [29.17562, -2.12278], [29.11847, -1.90576], [29.24458, -1.69663], [29.24323, -1.66826], [29.36322, -1.50887], [29.45038, -1.5054], [29.53062, -1.40499], [29.59061, -1.39016], [29.58388, -0.89821], [29.63006, -0.8997], [29.62708, -0.71055], [29.67176, -0.55714], [29.67474, -0.47969], [29.65091, -0.46777], [29.72687, -0.08051], [29.7224, 0.07291], [29.77454, 0.16675], [29.81922, 0.16824], [29.87284, 0.39166], [29.97413, 0.52124], [29.95477, 0.64486], [29.98307, 0.84295], [30.1484, 0.89805], [30.22139, 0.99635], [30.24671, 1.14974], [30.48503, 1.21675], [31.30127, 2.11006], [31.28042, 2.17853], [31.20148, 2.2217], [31.1985, 2.29462], [31.12104, 2.27676], [31.07934, 2.30207], [31.06593, 2.35862], [30.96911, 2.41071], [30.91102, 2.33332], [30.83059, 2.42559], [30.74271, 2.43601], [30.75612, 2.5863], [30.8857, 2.83923], [30.8574, 2.9508], [30.77101, 3.04897], [30.84251, 3.26908], [30.93486, 3.40737], [30.94081, 3.50847], [30.85153, 3.48867], [30.85997, 3.5743], [30.80713, 3.60506], [30.78512, 3.67097], [30.56277, 3.62703], [30.57378, 3.74567], [30.55396, 3.84451], [30.47691, 3.83353], [30.27658, 3.95653], [30.22374, 3.93896], [30.1621, 4.10586], [30.06964, 4.13221], [29.79666, 4.37809], [29.82087, 4.56246], [29.49726, 4.7007], [29.43341, 4.50101], [29.22207, 4.34297], [29.03054, 4.48784], [28.8126, 4.48784], [28.6651, 4.42638], [28.20719, 4.35614], [27.79551, 4.59976], [27.76469, 4.79284], [27.65462, 4.89375], [27.56656, 4.89375], [27.44012, 5.07349]]]] } },
23125     { type: "Feature", properties: { iso1A2: "CF", iso1A3: "CAF", iso1N3: "140", wikidata: "Q929", nameEn: "Central African Republic", groups: ["017", "202", "002", "UN"], callingCodes: ["236"] }, geometry: { type: "MultiPolygon", coordinates: [[[[22.87758, 10.91915], [22.45889, 11.00246], [21.72139, 10.64136], [21.71479, 10.29932], [21.63553, 10.217], [21.52766, 10.2105], [21.34934, 9.95907], [21.26348, 9.97642], [20.82979, 9.44696], [20.36748, 9.11019], [19.06421, 9.00367], [18.86388, 8.87971], [19.11044, 8.68172], [18.79783, 8.25929], [18.67455, 8.22226], [18.62612, 8.14163], [18.64153, 8.08714], [18.6085, 8.05009], [18.02731, 8.01085], [17.93926, 7.95853], [17.67288, 7.98905], [16.8143, 7.53971], [16.6668, 7.67281], [16.658, 7.75353], [16.59415, 7.76444], [16.58315, 7.88657], [16.41583, 7.77971], [16.40703, 7.68809], [15.79942, 7.44149], [15.73118, 7.52006], [15.49743, 7.52179], [15.23397, 7.25135], [15.04717, 6.77085], [14.96311, 6.75693], [14.79966, 6.39043], [14.80122, 6.34866], [14.74206, 6.26356], [14.56149, 6.18928], [14.43073, 6.08867], [14.42917, 6.00508], [14.49455, 5.91683], [14.60974, 5.91838], [14.62375, 5.70466], [14.58951, 5.59777], [14.62531, 5.51411], [14.52724, 5.28319], [14.57083, 5.23979], [14.65489, 5.21343], [14.73383, 4.6135], [15.00825, 4.41458], [15.08609, 4.30282], [15.10644, 4.1362], [15.17482, 4.05131], [15.07686, 4.01805], [15.73522, 3.24348], [15.77725, 3.26835], [16.05449, 3.02306], [16.08252, 2.45708], [16.19357, 2.21537], [16.50126, 2.84739], [16.46701, 2.92512], [16.57598, 3.47999], [16.68283, 3.54257], [17.01746, 3.55136], [17.35649, 3.63045], [17.46876, 3.70515], [17.60966, 3.63705], [17.83421, 3.61068], [17.85842, 3.53378], [18.05656, 3.56893], [18.14902, 3.54476], [18.17323, 3.47665], [18.24148, 3.50302], [18.2723, 3.57992], [18.39558, 3.58212], [18.49245, 3.63924], [18.58711, 3.49423], [18.62755, 3.47564], [20.60184, 4.42394], [20.90383, 4.44877], [21.08793, 4.39603], [21.11214, 4.33895], [21.21341, 4.29285], [21.25744, 4.33676], [21.55904, 4.25553], [21.6405, 4.317], [22.10721, 4.20723], [22.27682, 4.11347], [22.45504, 4.13039], [22.5431, 4.22041], [22.60915, 4.48821], [22.6928, 4.47285], [22.78526, 4.71423], [22.84691, 4.69887], [22.89094, 4.79321], [22.94817, 4.82392], [23.38847, 4.60013], [24.46719, 5.0915], [24.71816, 4.90509], [25.31256, 5.03668], [25.34558, 5.29101], [25.53271, 5.37431], [25.86073, 5.19455], [26.13371, 5.25594], [26.48595, 5.04984], [26.74572, 5.10685], [26.85579, 5.03887], [26.93064, 5.13535], [27.09575, 5.22305], [27.44012, 5.07349], [27.26886, 5.25876], [27.23017, 5.37167], [27.28621, 5.56382], [27.22705, 5.62889], [27.22705, 5.71254], [26.51721, 6.09655], [26.58259, 6.1987], [26.32729, 6.36272], [26.38022, 6.63493], [25.90076, 7.09549], [25.37461, 7.33024], [25.35281, 7.42595], [25.20337, 7.50312], [25.20649, 7.61115], [25.29214, 7.66675], [25.25319, 7.8487], [24.98855, 7.96588], [24.85156, 8.16933], [24.35965, 8.26177], [24.13238, 8.36959], [24.25691, 8.69288], [23.51905, 8.71749], [23.59065, 8.99743], [23.44744, 8.99128], [23.4848, 9.16959], [23.56263, 9.19418], [23.64358, 9.28637], [23.64981, 9.44303], [23.62179, 9.53823], [23.69155, 9.67566], [23.67164, 9.86923], [23.3128, 10.45214], [23.02221, 10.69235], [22.87758, 10.91915]]]] } },
23126     { type: "Feature", properties: { iso1A2: "CG", iso1A3: "COG", iso1N3: "178", wikidata: "Q971", nameEn: "Republic of the Congo", groups: ["017", "202", "002", "UN"], callingCodes: ["242"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.62755, 3.47564], [18.58711, 3.49423], [18.49245, 3.63924], [18.39558, 3.58212], [18.2723, 3.57992], [18.24148, 3.50302], [18.17323, 3.47665], [18.14902, 3.54476], [18.05656, 3.56893], [17.85842, 3.53378], [17.83421, 3.61068], [17.60966, 3.63705], [17.46876, 3.70515], [17.35649, 3.63045], [17.01746, 3.55136], [16.68283, 3.54257], [16.57598, 3.47999], [16.46701, 2.92512], [16.50126, 2.84739], [16.19357, 2.21537], [16.15568, 2.18955], [16.08563, 2.19733], [16.05294, 1.9811], [16.14634, 1.70259], [16.02647, 1.65591], [16.02959, 1.76483], [15.48942, 1.98265], [15.34776, 1.91264], [15.22634, 2.03243], [15.00996, 1.98887], [14.61145, 2.17866], [13.29457, 2.16106], [13.13461, 1.57238], [13.25447, 1.32339], [13.15519, 1.23368], [13.89582, 1.4261], [14.25186, 1.39842], [14.48179, 0.9152], [14.26066, 0.57255], [14.10909, 0.58563], [13.88648, 0.26652], [13.90632, -0.2287], [14.06862, -0.20826], [14.2165, -0.38261], [14.41887, -0.44799], [14.52569, -0.57818], [14.41838, -1.89412], [14.25932, -1.97624], [14.23518, -2.15671], [14.16202, -2.23916], [14.23829, -2.33715], [14.10442, -2.49268], [13.85846, -2.46935], [13.92073, -2.35581], [13.75884, -2.09293], [13.47977, -2.43224], [13.02759, -2.33098], [12.82172, -1.91091], [12.61312, -1.8129], [12.44656, -1.92025], [12.47925, -2.32626], [12.04895, -2.41704], [11.96866, -2.33559], [11.74605, -2.39936], [11.57637, -2.33379], [11.64487, -2.61865], [11.5359, -2.85654], [11.64798, -2.81146], [11.80365, -3.00424], [11.70558, -3.0773], [11.70227, -3.17465], [11.96554, -3.30267], [11.8318, -3.5812], [11.92719, -3.62768], [11.87083, -3.71571], [11.68608, -3.68942], [11.57949, -3.52798], [11.48764, -3.51089], [11.22301, -3.69888], [11.12647, -3.94169], [10.75913, -4.39519], [11.50888, -5.33417], [12.00924, -5.02627], [12.16068, -4.90089], [12.20901, -4.75642], [12.25587, -4.79437], [12.32324, -4.78415], [12.40964, -4.60609], [12.64835, -4.55937], [12.76844, -4.38709], [12.87096, -4.40315], [12.91489, -4.47907], [13.09648, -4.63739], [13.11182, -4.5942], [13.41764, -4.89897], [13.50305, -4.77818], [13.70417, -4.72601], [13.71794, -4.44864], [13.81162, -4.41842], [13.9108, -4.50906], [14.40672, -4.28381], [14.3957, -4.36623], [14.47284, -4.42941], [14.37366, -4.56125], [14.41499, -4.8825], [14.5059, -4.84956], [14.67948, -4.92093], [14.83101, -4.80838], [15.1978, -4.32388], [15.25411, -4.31121], [15.32693, -4.27282], [15.41785, -4.28381], [15.48121, -4.22062], [15.53081, -4.042], [15.89448, -3.9513], [16.21407, -3.2969], [16.1755, -3.25014], [16.22785, -2.59528], [16.16173, -2.16586], [16.50336, -1.8795], [16.70724, -1.45815], [16.97999, -1.12762], [17.32438, -0.99265], [17.72112, -0.52707], [17.66051, -0.26535], [17.81204, 0.23884], [17.93877, 0.32424], [17.95255, 0.48128], [17.86989, 0.58873], [17.85887, 1.04327], [18.08034, 1.58553], [18.10683, 2.26876], [18.63857, 3.19342], [18.62755, 3.47564]]]] } },
23127     { type: "Feature", geometry: { type: "MultiPolygon", coordinates: [[[[8.72809, 47.69282], [8.72617, 47.69651], [8.73671, 47.7169], [8.70543, 47.73121], [8.74251, 47.75168], [8.71778, 47.76571], [8.68985, 47.75686], [8.68022, 47.78599], [8.65292, 47.80066], [8.64425, 47.76398], [8.62408, 47.7626], [8.61657, 47.79998], [8.56415, 47.80633], [8.56814, 47.78001], [8.48868, 47.77215], [8.45771, 47.7493], [8.44807, 47.72426], [8.40569, 47.69855], [8.4211, 47.68407], [8.40473, 47.67499], [8.41346, 47.66676], [8.42264, 47.66667], [8.44711, 47.65379], [8.4667, 47.65747], [8.46605, 47.64103], [8.49656, 47.64709], [8.5322, 47.64687], [8.52801, 47.66059], [8.56141, 47.67088], [8.57683, 47.66158], [8.6052, 47.67258], [8.61113, 47.66332], [8.62884, 47.65098], [8.62049, 47.63757], [8.60412, 47.63735], [8.61471, 47.64514], [8.60701, 47.65271], [8.59545, 47.64298], [8.60348, 47.61204], [8.57586, 47.59537], [8.55756, 47.62394], [8.51686, 47.63476], [8.50747, 47.61897], [8.45578, 47.60121], [8.46637, 47.58389], [8.48949, 47.588], [8.49431, 47.58107], [8.43235, 47.56617], [8.39477, 47.57826], [8.38273, 47.56608], [8.35512, 47.57014], [8.32735, 47.57133], [8.30277, 47.58607], [8.29524, 47.5919], [8.29722, 47.60603], [8.2824, 47.61225], [8.26313, 47.6103], [8.25863, 47.61571], [8.23809, 47.61204], [8.22577, 47.60385], [8.22011, 47.6181], [8.20617, 47.62141], [8.19378, 47.61636], [8.1652, 47.5945], [8.14947, 47.59558], [8.13823, 47.59147], [8.13662, 47.58432], [8.11543, 47.5841], [8.10395, 47.57918], [8.10002, 47.56504], [8.08557, 47.55768], [8.06663, 47.56374], [8.04383, 47.55443], [8.02136, 47.55096], [8.00113, 47.55616], [7.97581, 47.55493], [7.95682, 47.55789], [7.94494, 47.54511], [7.91251, 47.55031], [7.90673, 47.57674], [7.88664, 47.58854], [7.84412, 47.5841], [7.81901, 47.58798], [7.79486, 47.55691], [7.75261, 47.54599], [7.71961, 47.54219], [7.69642, 47.53297], [7.68101, 47.53232], [7.6656, 47.53752], [7.66174, 47.54554], [7.65083, 47.54662], [7.63338, 47.56256], [7.67655, 47.56435], [7.68904, 47.57133], [7.67115, 47.5871], [7.68486, 47.59601], [7.69385, 47.60099], [7.68229, 47.59905], [7.67395, 47.59212], [7.64599, 47.59695], [7.64213, 47.5944], [7.64309, 47.59151], [7.61929, 47.57683], [7.60459, 47.57869], [7.60523, 47.58519], [7.58945, 47.59017], [7.58386, 47.57536], [7.56684, 47.57785], [7.56548, 47.57617], [7.55689, 47.57232], [7.55652, 47.56779], [7.53634, 47.55553], [7.52831, 47.55347], [7.51723, 47.54578], [7.50873, 47.54546], [7.49691, 47.53821], [7.50588, 47.52856], [7.51904, 47.53515], [7.53199, 47.5284], [7.5229, 47.51644], [7.49804, 47.51798], [7.51076, 47.49651], [7.47534, 47.47932], [7.43356, 47.49712], [7.42923, 47.48628], [7.4583, 47.47216], [7.4462, 47.46264], [7.43088, 47.45846], [7.40308, 47.43638], [7.35603, 47.43432], [7.33526, 47.44186], [7.24669, 47.4205], [7.17026, 47.44312], [7.19583, 47.49455], [7.16249, 47.49025], [7.12781, 47.50371], [7.07425, 47.48863], [7.0231, 47.50522], [6.98425, 47.49432], [7.0024, 47.45264], [6.93953, 47.43388], [6.93744, 47.40714], [6.88542, 47.37262], [6.87959, 47.35335], [7.03125, 47.36996], [7.0564, 47.35134], [7.05305, 47.33304], [6.94316, 47.28747], [6.95108, 47.26428], [6.9508, 47.24338], [6.8489, 47.15933], [6.76788, 47.1208], [6.68823, 47.06616], [6.71531, 47.0494], [6.43341, 46.92703], [6.46456, 46.88865], [6.43216, 46.80336], [6.45209, 46.77502], [6.38351, 46.73171], [6.27135, 46.68251], [6.11084, 46.57649], [6.1567, 46.54402], [6.07269, 46.46244], [6.08427, 46.44305], [6.06407, 46.41676], [6.09926, 46.40768], [6.15016, 46.3778], [6.15985, 46.37721], [6.16987, 46.36759], [6.15738, 46.3491], [6.13876, 46.33844], [6.1198, 46.31157], [6.11697, 46.29547], [6.1013, 46.28512], [6.11926, 46.2634], [6.12446, 46.25059], [6.10071, 46.23772], [6.08563, 46.24651], [6.07072, 46.24085], [6.0633, 46.24583], [6.05029, 46.23518], [6.04602, 46.23127], [6.03342, 46.2383], [6.02461, 46.23313], [5.97542, 46.21525], [5.96515, 46.19638], [5.99573, 46.18587], [5.98846, 46.17046], [5.98188, 46.17392], [5.97508, 46.15863], [5.9641, 46.14412], [5.95781, 46.12925], [5.97893, 46.13303], [5.9871, 46.14499], [6.01791, 46.14228], [6.03614, 46.13712], [6.04564, 46.14031], [6.05203, 46.15191], [6.07491, 46.14879], [6.09199, 46.15191], [6.09926, 46.14373], [6.13397, 46.1406], [6.15305, 46.15194], [6.18116, 46.16187], [6.18871, 46.16644], [6.18707, 46.17999], [6.19552, 46.18401], [6.19807, 46.18369], [6.20539, 46.19163], [6.21114, 46.1927], [6.21273, 46.19409], [6.21603, 46.19507], [6.21844, 46.19837], [6.22222, 46.19888], [6.22175, 46.20045], [6.23544, 46.20714], [6.23913, 46.20511], [6.24821, 46.20531], [6.26007, 46.21165], [6.27694, 46.21566], [6.29663, 46.22688], [6.31041, 46.24417], [6.29474, 46.26221], [6.26749, 46.24745], [6.24952, 46.26255], [6.23775, 46.27822], [6.25137, 46.29014], [6.24826, 46.30175], [6.21981, 46.31304], [6.25432, 46.3632], [6.53358, 46.45431], [6.82312, 46.42661], [6.8024, 46.39171], [6.77152, 46.34784], [6.86052, 46.28512], [6.78968, 46.14058], [6.89321, 46.12548], [6.87868, 46.03855], [6.93862, 46.06502], [7.00946, 45.9944], [7.04151, 45.92435], [7.10685, 45.85653], [7.56343, 45.97421], [7.85949, 45.91485], [7.9049, 45.99945], [7.98881, 45.99867], [8.02906, 46.10331], [8.11383, 46.11577], [8.16866, 46.17817], [8.08814, 46.26692], [8.31162, 46.38044], [8.30648, 46.41587], [8.42464, 46.46367], [8.46317, 46.43712], [8.45032, 46.26869], [8.62242, 46.12112], [8.75697, 46.10395], [8.80778, 46.10085], [8.85617, 46.0748], [8.79414, 46.00913], [8.78585, 45.98973], [8.79362, 45.99207], [8.8319, 45.9879], [8.85121, 45.97239], [8.86688, 45.96135], [8.88904, 45.95465], [8.93649, 45.86775], [8.94372, 45.86587], [8.93504, 45.86245], [8.91129, 45.8388], [8.94737, 45.84285], [8.9621, 45.83707], [8.99663, 45.83466], [9.00324, 45.82055], [9.0298, 45.82127], [9.03279, 45.82865], [9.03793, 45.83548], [9.03505, 45.83976], [9.04059, 45.8464], [9.04546, 45.84968], [9.06642, 45.8761], [9.09065, 45.89906], [8.99257, 45.9698], [9.01618, 46.04928], [9.24503, 46.23616], [9.29226, 46.32717], [9.25502, 46.43743], [9.28136, 46.49685], [9.36128, 46.5081], [9.40487, 46.46621], [9.45936, 46.50873], [9.46117, 46.37481], [9.57015, 46.2958], [9.71273, 46.29266], [9.73086, 46.35071], [9.95249, 46.38045], [10.07055, 46.21668], [10.14439, 46.22992], [10.17862, 46.25626], [10.10506, 46.3372], [10.165, 46.41051], [10.03715, 46.44479], [10.10307, 46.61003], [10.23674, 46.63484], [10.25309, 46.57432], [10.46136, 46.53164], [10.49375, 46.62049], [10.44686, 46.64162], [10.40475, 46.63671], [10.38659, 46.67847], [10.47197, 46.85698], [10.48376, 46.93891], [10.36933, 47.00212], [10.30031, 46.92093], [10.24128, 46.93147], [10.22675, 46.86942], [10.10715, 46.84296], [9.98058, 46.91434], [9.88266, 46.93343], [9.87935, 47.01337], [9.60717, 47.06091], [9.55721, 47.04762], [9.54041, 47.06495], [9.47548, 47.05257], [9.47139, 47.06402], [9.51362, 47.08505], [9.52089, 47.10019], [9.51044, 47.13727], [9.48774, 47.17402], [9.4891, 47.19346], [9.50318, 47.22153], [9.52406, 47.24959], [9.53116, 47.27029], [9.54773, 47.2809], [9.55857, 47.29919], [9.58513, 47.31334], [9.59978, 47.34671], [9.62476, 47.36639], [9.65427, 47.36824], [9.66243, 47.37136], [9.6711, 47.37824], [9.67445, 47.38429], [9.67334, 47.39191], [9.6629, 47.39591], [9.65136, 47.40504], [9.65043, 47.41937], [9.6446, 47.43233], [9.64483, 47.43842], [9.65863, 47.44847], [9.65728, 47.45383], [9.6423, 47.45599], [9.62475, 47.45685], [9.62158, 47.45858], [9.60841, 47.47178], [9.60484, 47.46358], [9.60205, 47.46165], [9.59482, 47.46305], [9.58208, 47.48344], [9.56312, 47.49495], [9.55125, 47.53629], [9.25619, 47.65939], [9.18203, 47.65598], [9.17593, 47.65399], [9.1755, 47.65584], [9.1705, 47.65513], [9.15181, 47.66904], [9.13845, 47.66389], [9.09891, 47.67801], [9.02093, 47.6868], [8.94093, 47.65596], [8.89946, 47.64769], [8.87625, 47.65441], [8.87383, 47.67045], [8.85065, 47.68209], [8.86989, 47.70504], [8.82002, 47.71458], [8.80663, 47.73821], [8.77309, 47.72059], [8.76965, 47.7075], [8.79966, 47.70222], [8.79511, 47.67462], [8.75856, 47.68969], [8.72809, 47.69282]], [[8.95861, 45.96485], [8.96668, 45.98436], [8.97741, 45.98317], [8.97604, 45.96151], [8.95861, 45.96485]], [[8.70847, 47.68904], [8.68985, 47.69552], [8.66837, 47.68437], [8.65769, 47.68928], [8.67508, 47.6979], [8.66416, 47.71367], [8.70237, 47.71453], [8.71773, 47.69088], [8.70847, 47.68904]]]] }, properties: { iso1A2: "CH", iso1A3: "CHE", iso1N3: "756", wikidata: "Q39", nameEn: "Switzerland", groups: ["155", "150", "UN"], callingCodes: ["41"] } },
23128     { type: "Feature", properties: { iso1A2: "CI", iso1A3: "CIV", iso1N3: "384", wikidata: "Q1008", nameEn: "C\xF4te d'Ivoire", groups: ["011", "202", "002", "UN"], callingCodes: ["225"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-7.52774, 3.7105], [-3.34019, 4.17519], [-3.10675, 5.08515], [-3.11073, 5.12675], [-3.063, 5.13665], [-2.96554, 5.10397], [-2.95261, 5.12477], [-2.75502, 5.10657], [-2.73074, 5.1364], [-2.77625, 5.34621], [-2.72737, 5.34789], [-2.76614, 5.60963], [-2.85378, 5.65156], [-2.93132, 5.62137], [-2.96671, 5.6415], [-2.95323, 5.71865], [-3.01896, 5.71697], [-3.25999, 6.62521], [-3.21954, 6.74407], [-3.23327, 6.81744], [-2.95438, 7.23737], [-2.97822, 7.27165], [-2.92339, 7.60847], [-2.79467, 7.86002], [-2.78395, 7.94974], [-2.74819, 7.92613], [-2.67787, 8.02055], [-2.61232, 8.02645], [-2.62901, 8.11495], [-2.49037, 8.20872], [-2.58243, 8.7789], [-2.66357, 9.01771], [-2.77799, 9.04949], [-2.69814, 9.22717], [-2.68802, 9.49343], [-2.76494, 9.40778], [-2.93012, 9.57403], [-3.00765, 9.74019], [-3.16609, 9.85147], [-3.19306, 9.93781], [-3.27228, 9.84981], [-3.31779, 9.91125], [-3.69703, 9.94279], [-4.25999, 9.76012], [-4.31392, 9.60062], [-4.6426, 9.70696], [-4.96621, 9.89132], [-4.96453, 9.99923], [-5.12465, 10.29788], [-5.39602, 10.2929], [-5.51058, 10.43177], [-5.65135, 10.46767], [-5.78124, 10.43952], [-5.99478, 10.19694], [-6.18851, 10.24244], [-6.1731, 10.46983], [-6.24795, 10.74248], [-6.325, 10.68624], [-6.40646, 10.69922], [-6.42847, 10.5694], [-6.52974, 10.59104], [-6.63541, 10.66893], [-6.68164, 10.35074], [-6.93921, 10.35291], [-7.01186, 10.25111], [-6.97444, 10.21644], [-7.00966, 10.15794], [-7.0603, 10.14711], [-7.13331, 10.24877], [-7.3707, 10.24677], [-7.44555, 10.44602], [-7.52261, 10.4655], [-7.54462, 10.40921], [-7.63048, 10.46334], [-7.92107, 10.15577], [-7.97971, 10.17117], [-8.01225, 10.1021], [-8.11921, 10.04577], [-8.15652, 9.94288], [-8.09434, 9.86936], [-8.14657, 9.55062], [-8.03463, 9.39604], [-7.85056, 9.41812], [-7.90777, 9.20456], [-7.73862, 9.08422], [-7.92518, 8.99332], [-7.95503, 8.81146], [-7.69882, 8.66148], [-7.65653, 8.36873], [-7.92518, 8.50652], [-8.22991, 8.48438], [-8.2411, 8.24196], [-8.062, 8.16071], [-7.98675, 8.20134], [-7.99919, 8.11023], [-7.94695, 8.00925], [-8.06449, 8.04989], [-8.13414, 7.87991], [-8.09931, 7.78626], [-8.21374, 7.54466], [-8.4003, 7.6285], [-8.47114, 7.55676], [-8.41935, 7.51203], [-8.37458, 7.25794], [-8.29249, 7.1691], [-8.31736, 6.82837], [-8.59456, 6.50612], [-8.48652, 6.43797], [-8.45666, 6.49977], [-8.38453, 6.35887], [-8.3298, 6.36381], [-8.17557, 6.28222], [-8.00642, 6.31684], [-7.90692, 6.27728], [-7.83478, 6.20309], [-7.8497, 6.08932], [-7.79747, 6.07696], [-7.78254, 5.99037], [-7.70294, 5.90625], [-7.67309, 5.94337], [-7.48155, 5.80974], [-7.46165, 5.84934], [-7.43677, 5.84687], [-7.43926, 5.74787], [-7.37209, 5.61173], [-7.43428, 5.42355], [-7.36463, 5.32944], [-7.46165, 5.26256], [-7.48901, 5.14118], [-7.55369, 5.08667], [-7.53876, 4.94294], [-7.59349, 4.8909], [-7.53259, 4.35145], [-7.52774, 3.7105]]]] } },
23129     { type: "Feature", properties: { iso1A2: "CK", iso1A3: "COK", iso1N3: "184", wikidata: "Q26988", nameEn: "Cook Islands", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["682"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-168.15106, -10.26955], [-156.45576, -31.75456], [-156.48634, -15.52824], [-156.50903, -7.4975], [-168.15106, -10.26955]]]] } },
23130     { type: "Feature", properties: { iso1A2: "CL", iso1A3: "CHL", iso1N3: "152", wikidata: "Q298", nameEn: "Chile", groups: ["005", "419", "019", "UN"], callingCodes: ["56"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-68.60702, -52.65781], [-68.41683, -52.33516], [-69.97824, -52.00845], [-71.99889, -51.98018], [-72.33873, -51.59954], [-72.31343, -50.58411], [-73.15765, -50.78337], [-73.55259, -49.92488], [-73.45156, -49.79461], [-73.09655, -49.14342], [-72.56894, -48.81116], [-72.54042, -48.52392], [-72.27662, -48.28727], [-72.50478, -47.80586], [-71.94152, -47.13595], [-71.68577, -46.55385], [-71.75614, -45.61611], [-71.35687, -45.22075], [-72.06985, -44.81756], [-71.26418, -44.75684], [-71.16436, -44.46244], [-71.81318, -44.38097], [-71.64206, -43.64774], [-72.14828, -42.85321], [-72.15541, -42.15941], [-71.74901, -42.11711], [-71.92726, -40.72714], [-71.37826, -38.91474], [-70.89532, -38.6923], [-71.24279, -37.20264], [-70.95047, -36.4321], [-70.38008, -36.02375], [-70.49416, -35.24145], [-69.87386, -34.13344], [-69.88099, -33.34489], [-70.55832, -31.51559], [-70.14479, -30.36595], [-69.8596, -30.26131], [-69.99507, -29.28351], [-69.80969, -29.07185], [-69.66709, -28.44055], [-69.22504, -27.95042], [-68.77586, -27.16029], [-68.43363, -27.08414], [-68.27677, -26.90626], [-68.59048, -26.49861], [-68.56909, -26.28146], [-68.38372, -26.15353], [-68.57622, -25.32505], [-68.38372, -25.08636], [-68.56909, -24.69831], [-68.24825, -24.42596], [-67.33563, -24.04237], [-66.99632, -22.99839], [-67.18382, -22.81525], [-67.54284, -22.89771], [-67.85114, -22.87076], [-68.18816, -21.28614], [-68.40403, -20.94562], [-68.53957, -20.91542], [-68.55383, -20.7355], [-68.44023, -20.62701], [-68.7276, -20.46178], [-68.74273, -20.08817], [-68.57132, -20.03134], [-68.54611, -19.84651], [-68.66761, -19.72118], [-68.41218, -19.40499], [-68.61989, -19.27584], [-68.80602, -19.08355], [-68.87082, -19.06003], [-68.94987, -18.93302], [-69.07432, -18.28259], [-69.14807, -18.16893], [-69.07496, -18.03715], [-69.28671, -17.94844], [-69.34126, -17.72753], [-69.46623, -17.60518], [-69.46897, -17.4988], [-69.66483, -17.65083], [-69.79087, -17.65563], [-69.82868, -17.72048], [-69.75305, -17.94605], [-69.81607, -18.12582], [-69.96732, -18.25992], [-70.16394, -18.31737], [-70.31267, -18.31258], [-70.378, -18.3495], [-70.59118, -18.35072], [-113.52687, -26.52828], [-68.11646, -58.14883], [-66.07313, -55.19618], [-67.11046, -54.94199], [-67.46182, -54.92205], [-68.01394, -54.8753], [-68.60733, -54.9125], [-68.60702, -52.65781]]]] } },
23131     { type: "Feature", properties: { iso1A2: "CM", iso1A3: "CMR", iso1N3: "120", wikidata: "Q1009", nameEn: "Cameroon", groups: ["017", "202", "002", "UN"], callingCodes: ["237"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.83314, 12.62963], [14.55058, 12.78256], [14.56101, 12.91036], [14.46881, 13.08259], [14.08251, 13.0797], [14.20204, 12.53405], [14.17523, 12.41916], [14.22215, 12.36533], [14.4843, 12.35223], [14.6474, 12.17466], [14.61612, 11.7798], [14.55207, 11.72001], [14.64591, 11.66166], [14.6124, 11.51283], [14.17821, 11.23831], [13.97489, 11.30258], [13.78945, 11.00154], [13.7403, 11.00593], [13.70753, 10.94451], [13.73434, 10.9255], [13.54964, 10.61236], [13.5705, 10.53183], [13.43644, 10.13326], [13.34111, 10.12299], [13.25025, 10.03647], [13.25323, 10.00127], [13.286, 9.9822], [13.27409, 9.93232], [13.24132, 9.91031], [13.25025, 9.86042], [13.29941, 9.8296], [13.25472, 9.76795], [13.22642, 9.57266], [13.02385, 9.49334], [12.85628, 9.36698], [12.91958, 9.33905], [12.90022, 9.11411], [12.81085, 8.91992], [12.79, 8.75361], [12.71701, 8.7595], [12.68722, 8.65938], [12.44146, 8.6152], [12.4489, 8.52536], [12.26123, 8.43696], [12.24782, 8.17904], [12.19271, 8.10826], [12.20909, 7.97553], [11.99908, 7.67302], [12.01844, 7.52981], [11.93205, 7.47812], [11.84864, 7.26098], [11.87396, 7.09398], [11.63117, 6.9905], [11.55818, 6.86186], [11.57755, 6.74059], [11.51499, 6.60892], [11.42264, 6.5882], [11.42041, 6.53789], [11.09495, 6.51717], [11.09644, 6.68437], [10.94302, 6.69325], [10.8179, 6.83377], [10.83727, 6.9358], [10.60789, 7.06885], [10.59746, 7.14719], [10.57214, 7.16345], [10.53639, 6.93432], [10.21466, 6.88996], [10.15135, 7.03781], [9.86314, 6.77756], [9.77824, 6.79088], [9.70674, 6.51717], [9.51757, 6.43874], [8.84209, 5.82562], [8.88156, 5.78857], [8.83687, 5.68483], [8.92029, 5.58403], [8.78027, 5.1243], [8.60302, 4.87353], [8.34397, 4.30689], [9.22018, 3.72052], [9.81162, 2.33797], [9.82123, 2.35097], [9.83754, 2.32428], [9.83238, 2.29079], [9.84716, 2.24676], [9.89012, 2.20457], [9.90749, 2.20049], [9.991, 2.16561], [11.3561, 2.17217], [11.37116, 2.29975], [13.28534, 2.25716], [13.29457, 2.16106], [14.61145, 2.17866], [15.00996, 1.98887], [15.22634, 2.03243], [15.34776, 1.91264], [15.48942, 1.98265], [16.02959, 1.76483], [16.02647, 1.65591], [16.14634, 1.70259], [16.05294, 1.9811], [16.08563, 2.19733], [16.15568, 2.18955], [16.19357, 2.21537], [16.08252, 2.45708], [16.05449, 3.02306], [15.77725, 3.26835], [15.73522, 3.24348], [15.07686, 4.01805], [15.17482, 4.05131], [15.10644, 4.1362], [15.08609, 4.30282], [15.00825, 4.41458], [14.73383, 4.6135], [14.65489, 5.21343], [14.57083, 5.23979], [14.52724, 5.28319], [14.62531, 5.51411], [14.58951, 5.59777], [14.62375, 5.70466], [14.60974, 5.91838], [14.49455, 5.91683], [14.42917, 6.00508], [14.43073, 6.08867], [14.56149, 6.18928], [14.74206, 6.26356], [14.80122, 6.34866], [14.79966, 6.39043], [14.96311, 6.75693], [15.04717, 6.77085], [15.23397, 7.25135], [15.49743, 7.52179], [15.56964, 7.58936], [15.59272, 7.7696], [15.50743, 7.79302], [15.20426, 8.50892], [15.09484, 8.65982], [14.83566, 8.80557], [14.35707, 9.19611], [14.37094, 9.2954], [13.97544, 9.6365], [14.01793, 9.73169], [14.1317, 9.82413], [14.20411, 10.00055], [14.4673, 10.00264], [14.80082, 9.93818], [14.95722, 9.97926], [15.05999, 9.94845], [15.14043, 9.99246], [15.24618, 9.99246], [15.41408, 9.92876], [15.68761, 9.99344], [15.50535, 10.1098], [15.30874, 10.31063], [15.23724, 10.47764], [15.14936, 10.53915], [15.15532, 10.62846], [15.06737, 10.80921], [15.09127, 10.87431], [15.04957, 11.02347], [15.10021, 11.04101], [15.0585, 11.40481], [15.13149, 11.5537], [15.06595, 11.71126], [15.11579, 11.79313], [15.04808, 11.8731], [15.05786, 12.0608], [15.0349, 12.10698], [15.00146, 12.1223], [14.96952, 12.0925], [14.89019, 12.16593], [14.90827, 12.3269], [14.83314, 12.62963]]]] } },
23132     { type: "Feature", properties: { iso1A2: "CN", iso1A3: "CHN", iso1N3: "156", wikidata: "Q148", nameEn: "People's Republic of China" }, geometry: null },
23133     { type: "Feature", properties: { iso1A2: "CO", iso1A3: "COL", iso1N3: "170", wikidata: "Q739", nameEn: "Colombia", groups: ["005", "419", "019", "UN"], callingCodes: ["57"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.19849, 12.65801], [-81.58685, 18.0025], [-82.06974, 14.49418], [-82.56142, 11.91792], [-78.79327, 9.93766], [-77.58292, 9.22278], [-77.32389, 8.81247], [-77.45064, 8.49991], [-77.17257, 7.97422], [-77.57185, 7.51147], [-77.72514, 7.72348], [-77.72157, 7.47612], [-77.81426, 7.48319], [-77.89178, 7.22681], [-78.06168, 7.07793], [-82.12561, 4.00341], [-78.87137, 1.47457], [-78.42749, 1.15389], [-77.85677, 0.80197], [-77.7148, 0.85003], [-77.68613, 0.83029], [-77.66416, 0.81604], [-77.67815, 0.73863], [-77.49984, 0.64476], [-77.52001, 0.40782], [-76.89177, 0.24736], [-76.4094, 0.24015], [-76.41215, 0.38228], [-76.23441, 0.42294], [-75.82927, 0.09578], [-75.25764, -0.11943], [-75.18513, -0.0308], [-74.42701, -0.50218], [-74.26675, -0.97229], [-73.65312, -1.26222], [-72.92587, -2.44514], [-71.75223, -2.15058], [-70.94377, -2.23142], [-70.04609, -2.73906], [-70.71396, -3.7921], [-70.52393, -3.87553], [-70.3374, -3.79505], [-69.94708, -4.2431], [-69.43395, -1.42219], [-69.4215, -1.01853], [-69.59796, -0.75136], [-69.603, -0.51947], [-70.03658, -0.19681], [-70.04162, 0.55437], [-69.47696, 0.71065], [-69.20976, 0.57958], [-69.14422, 0.84172], [-69.26017, 1.06856], [-69.82987, 1.07864], [-69.83491, 1.69353], [-69.53746, 1.76408], [-69.38621, 1.70865], [-68.18128, 1.72881], [-68.26699, 1.83463], [-68.18632, 2.00091], [-67.9292, 1.82455], [-67.40488, 2.22258], [-67.299, 1.87494], [-67.15784, 1.80439], [-67.08222, 1.17441], [-66.85795, 1.22998], [-67.21967, 2.35778], [-67.65696, 2.81691], [-67.85862, 2.79173], [-67.85862, 2.86727], [-67.30945, 3.38393], [-67.50067, 3.75812], [-67.62671, 3.74303], [-67.85358, 4.53249], [-67.83341, 5.31104], [-67.59141, 5.5369], [-67.63914, 5.64963], [-67.58558, 5.84537], [-67.43513, 5.98835], [-67.4625, 6.20625], [-67.60654, 6.2891], [-69.41843, 6.1072], [-70.10716, 6.96516], [-70.7596, 7.09799], [-71.03941, 6.98163], [-71.37234, 7.01588], [-71.42212, 7.03854], [-71.44118, 7.02116], [-71.82441, 7.04314], [-72.04895, 7.03837], [-72.19437, 7.37034], [-72.43132, 7.40034], [-72.47415, 7.48928], [-72.45321, 7.57232], [-72.47827, 7.65604], [-72.46763, 7.79518], [-72.44454, 7.86031], [-72.46183, 7.90682], [-72.45806, 7.91141], [-72.47042, 7.92306], [-72.48183, 7.92909], [-72.48801, 7.94329], [-72.47213, 7.96106], [-72.39137, 8.03534], [-72.35163, 8.01163], [-72.36987, 8.19976], [-72.4042, 8.36513], [-72.65474, 8.61428], [-72.77415, 9.10165], [-72.94052, 9.10663], [-73.02119, 9.27584], [-73.36905, 9.16636], [-72.98085, 9.85253], [-72.88002, 10.44309], [-72.4767, 11.1117], [-72.24983, 11.14138], [-71.9675, 11.65536], [-71.3275, 11.85], [-70.92579, 11.96275], [-71.19849, 12.65801]]]] } },
23134     { type: "Feature", properties: { iso1A2: "CP", iso1A3: "CPT", wikidata: "Q161258", nameEn: "Clipperton Island", country: "FR", groups: ["EU", "013", "003", "019", "UN"], isoStatus: "excRes" }, geometry: { type: "MultiPolygon", coordinates: [[[[-110.36279, 9.79626], [-108.755, 9.84085], [-109.04145, 11.13245], [-110.36279, 9.79626]]]] } },
23135     { type: "Feature", properties: { iso1A2: "CR", iso1A3: "CRI", iso1N3: "188", wikidata: "Q800", nameEn: "Costa Rica", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["506"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-83.68276, 11.01562], [-83.66597, 10.79916], [-83.90838, 10.71161], [-84.68197, 11.07568], [-84.92439, 10.9497], [-85.60529, 11.22607], [-85.71223, 11.06868], [-86.14524, 11.09059], [-87.41779, 5.02401], [-82.94503, 7.93865], [-82.89978, 8.04083], [-82.89137, 8.05755], [-82.88641, 8.10219], [-82.9388, 8.26634], [-83.05209, 8.33394], [-82.93056, 8.43465], [-82.8679, 8.44042], [-82.8382, 8.48117], [-82.83322, 8.52464], [-82.83975, 8.54755], [-82.82739, 8.60153], [-82.8794, 8.6981], [-82.92068, 8.74832], [-82.91377, 8.774], [-82.88253, 8.83331], [-82.72126, 8.97125], [-82.93516, 9.07687], [-82.93516, 9.46741], [-82.84871, 9.4973], [-82.87919, 9.62645], [-82.77206, 9.59573], [-82.66667, 9.49746], [-82.61345, 9.49881], [-82.56507, 9.57279], [-82.51044, 9.65379], [-83.54024, 10.96805], [-83.68276, 11.01562]]]] } },
23136     { type: "Feature", properties: { iso1A2: "CU", iso1A3: "CUB", iso1N3: "192", wikidata: "Q241", nameEn: "Cuba", groups: ["029", "003", "419", "019", "UN"], callingCodes: ["53"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-73.62304, 20.6935], [-82.02215, 24.23074], [-85.77883, 21.92705], [-74.81171, 18.82201], [-73.62304, 20.6935]]]] } },
23137     { type: "Feature", properties: { iso1A2: "CV", iso1A3: "CPV", iso1N3: "132", wikidata: "Q1011", nameEn: "Cape Verde", groups: ["Q105472", "011", "202", "002", "UN"], callingCodes: ["238"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-28.81604, 14.57305], [-20.39702, 14.12816], [-23.37101, 19.134], [-28.81604, 14.57305]]]] } },
23138     { type: "Feature", properties: { iso1A2: "CW", iso1A3: "CUW", iso1N3: "531", wikidata: "Q25279", nameEn: "Cura\xE7ao", aliases: ["NL-CW"], country: "NL", groups: ["Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["599"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-68.90012, 12.62309], [-69.59009, 12.46019], [-68.99639, 11.79035], [-68.33524, 11.78151], [-68.90012, 12.62309]]]] } },
23139     { type: "Feature", properties: { iso1A2: "CX", iso1A3: "CXR", iso1N3: "162", wikidata: "Q31063", nameEn: "Christmas Island", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["61"] }, geometry: { type: "MultiPolygon", coordinates: [[[[105.66835, -9.31927], [104.67494, -11.2566], [106.66176, -11.14349], [105.66835, -9.31927]]]] } },
23140     { type: "Feature", properties: { iso1A2: "CY", iso1A3: "CYP", iso1N3: "196", wikidata: "Q229", nameEn: "Republic of Cyprus", groups: ["Q644636", "EU", "145", "142", "UN"], driveSide: "left", callingCodes: ["357"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.46489, 35.48584], [30.15137, 34.08517], [32.74412, 34.43926], [32.75515, 34.64985], [32.76136, 34.68318], [32.79433, 34.67883], [32.82717, 34.70622], [32.86014, 34.70585], [32.86167, 34.68734], [32.9068, 34.66102], [32.91398, 34.67343], [32.93043, 34.67091], [32.92807, 34.66736], [32.93449, 34.66241], [32.93693, 34.67027], [32.94379, 34.67111], [32.94683, 34.67907], [32.95539, 34.68471], [32.99135, 34.68061], [32.98668, 34.67268], [32.99014, 34.65518], [32.97736, 34.65277], [32.97079, 34.66112], [32.95325, 34.66462], [32.94796, 34.6587], [32.94976, 34.65204], [32.95471, 34.64528], [32.95323, 34.64075], [32.95891, 34.62919], [32.96718, 34.63446], [32.96968, 34.64046], [33.0138, 34.64424], [33.26744, 34.49942], [33.83531, 34.73974], [33.70575, 34.97947], [33.70639, 34.99303], [33.71514, 35.00294], [33.69731, 35.01754], [33.69938, 35.03123], [33.67678, 35.03866], [33.63765, 35.03869], [33.61215, 35.0527], [33.59658, 35.03635], [33.567, 35.04803], [33.57478, 35.06049], [33.53975, 35.08151], [33.48915, 35.06594], [33.47666, 35.00701], [33.45256, 35.00288], [33.45178, 35.02078], [33.47825, 35.04103], [33.48136, 35.0636], [33.46813, 35.10564], [33.41675, 35.16325], [33.4076, 35.20062], [33.38575, 35.2018], [33.37248, 35.18698], [33.3717, 35.1788], [33.36569, 35.17479], [33.35612, 35.17402], [33.35596, 35.17942], [33.34964, 35.17803], [33.35056, 35.18328], [33.31955, 35.18096], [33.3072, 35.16816], [33.27068, 35.16815], [33.15138, 35.19504], [33.11105, 35.15639], [33.08249, 35.17319], [33.01192, 35.15639], [32.94471, 35.09422], [32.86406, 35.1043], [32.85733, 35.07742], [32.70779, 35.14127], [32.70947, 35.18328], [32.64864, 35.19967], [32.60361, 35.16647], [32.46489, 35.48584]]], [[[33.74144, 35.01053], [33.7492, 35.01319], [33.74983, 35.02274], [33.74265, 35.02329], [33.73781, 35.02181], [33.7343, 35.01178], [33.74144, 35.01053]]], [[[33.77312, 34.9976], [33.75994, 35.00113], [33.75682, 34.99916], [33.76605, 34.99543], [33.76738, 34.99188], [33.7778, 34.98981], [33.77843, 34.988], [33.78149, 34.98854], [33.78318, 34.98699], [33.78571, 34.98951], [33.78917, 34.98854], [33.79191, 34.98914], [33.78516, 34.99582], [33.77553, 34.99518], [33.77312, 34.9976]]]] } },
23141     { type: "Feature", properties: { iso1A2: "CZ", iso1A3: "CZE", iso1N3: "203", wikidata: "Q213", nameEn: "Czechia", groups: ["EU", "151", "150", "UN"], callingCodes: ["420"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.82803, 50.86966], [14.79139, 50.81438], [14.70661, 50.84096], [14.61993, 50.86049], [14.63434, 50.8883], [14.65259, 50.90513], [14.64802, 50.93241], [14.58024, 50.91443], [14.56374, 50.922], [14.59702, 50.96148], [14.59908, 50.98685], [14.58215, 50.99306], [14.56432, 51.01008], [14.53438, 51.00374], [14.53321, 51.01679], [14.49873, 51.02242], [14.50809, 51.0427], [14.49991, 51.04692], [14.49154, 51.04382], [14.49202, 51.02286], [14.45827, 51.03712], [14.41335, 51.02086], [14.30098, 51.05515], [14.25665, 50.98935], [14.28776, 50.97718], [14.32353, 50.98556], [14.32793, 50.97379], [14.30251, 50.96606], [14.31422, 50.95243], [14.39848, 50.93866], [14.38691, 50.89907], [14.30098, 50.88448], [14.27123, 50.89386], [14.24314, 50.88761], [14.22331, 50.86049], [14.02982, 50.80662], [13.98864, 50.8177], [13.89113, 50.78533], [13.89444, 50.74142], [13.82942, 50.7251], [13.76316, 50.73487], [13.70204, 50.71771], [13.65977, 50.73096], [13.52474, 50.70394], [13.53748, 50.67654], [13.5226, 50.64721], [13.49742, 50.63133], [13.46413, 50.60102], [13.42189, 50.61243], [13.37485, 50.64931], [13.37805, 50.627], [13.32264, 50.60317], [13.32594, 50.58009], [13.29454, 50.57904], [13.25158, 50.59268], [13.19043, 50.50237], [13.13424, 50.51709], [13.08301, 50.50132], [13.0312, 50.50944], [13.02038, 50.4734], [13.02147, 50.44763], [12.98433, 50.42016], [12.94058, 50.40944], [12.82465, 50.45738], [12.73476, 50.43237], [12.73044, 50.42268], [12.70731, 50.39948], [12.67261, 50.41949], [12.51356, 50.39694], [12.48747, 50.37278], [12.49214, 50.35228], [12.48256, 50.34784], [12.46643, 50.35527], [12.43722, 50.33774], [12.43371, 50.32506], [12.39924, 50.32302], [12.40158, 50.29521], [12.36594, 50.28289], [12.35425, 50.23993], [12.33263, 50.24367], [12.32445, 50.20442], [12.33847, 50.19432], [12.32596, 50.17146], [12.29232, 50.17524], [12.28063, 50.19544], [12.28755, 50.22429], [12.23943, 50.24594], [12.24791, 50.25525], [12.26953, 50.25189], [12.25119, 50.27079], [12.20823, 50.2729], [12.18013, 50.32146], [12.10907, 50.32041], [12.13716, 50.27396], [12.09287, 50.25032], [12.19335, 50.19997], [12.21484, 50.16399], [12.1917, 50.13434], [12.2073, 50.10315], [12.23709, 50.10213], [12.27433, 50.0771], [12.26111, 50.06331], [12.30798, 50.05719], [12.49908, 49.97305], [12.47264, 49.94222], [12.55197, 49.92094], [12.48256, 49.83575], [12.46603, 49.78882], [12.40489, 49.76321], [12.4462, 49.70233], [12.52553, 49.68415], [12.53544, 49.61888], [12.56188, 49.6146], [12.60155, 49.52887], [12.64782, 49.52565], [12.64121, 49.47628], [12.669, 49.42935], [12.71227, 49.42363], [12.75854, 49.3989], [12.78168, 49.34618], [12.88414, 49.33541], [12.88249, 49.35479], [12.94859, 49.34079], [13.03618, 49.30417], [13.02957, 49.27399], [13.05883, 49.26259], [13.17665, 49.16713], [13.17019, 49.14339], [13.20405, 49.12303], [13.23689, 49.11412], [13.28242, 49.1228], [13.39479, 49.04812], [13.40802, 48.98851], [13.50221, 48.93752], [13.50552, 48.97441], [13.58319, 48.96899], [13.61624, 48.9462], [13.67739, 48.87886], [13.73854, 48.88538], [13.76994, 48.83537], [13.78977, 48.83319], [13.8096, 48.77877], [13.84023, 48.76988], [14.06151, 48.66873], [14.01482, 48.63788], [14.09104, 48.5943], [14.20691, 48.5898], [14.33909, 48.55852], [14.43076, 48.58855], [14.4587, 48.64695], [14.56139, 48.60429], [14.60808, 48.62881], [14.66762, 48.58215], [14.71794, 48.59794], [14.72756, 48.69502], [14.80584, 48.73489], [14.80821, 48.77711], [14.81545, 48.7874], [14.94773, 48.76268], [14.95641, 48.75915], [14.9758, 48.76857], [14.98112, 48.77524], [14.9782, 48.7766], [14.98032, 48.77959], [14.95072, 48.79101], [14.98917, 48.90082], [14.97612, 48.96983], [14.99878, 49.01444], [15.15534, 48.99056], [15.16358, 48.94278], [15.26177, 48.95766], [15.28305, 48.98831], [15.34823, 48.98444], [15.48027, 48.94481], [15.51357, 48.91549], [15.61622, 48.89541], [15.6921, 48.85973], [15.75341, 48.8516], [15.78087, 48.87644], [15.84404, 48.86921], [16.06034, 48.75436], [16.37345, 48.729], [16.40915, 48.74576], [16.46134, 48.80865], [16.67008, 48.77699], [16.68518, 48.7281], [16.71883, 48.73806], [16.79779, 48.70998], [16.90354, 48.71541], [16.93955, 48.60371], [17.00215, 48.70887], [17.11202, 48.82925], [17.19355, 48.87602], [17.29054, 48.85546], [17.3853, 48.80936], [17.45671, 48.85004], [17.5295, 48.81117], [17.7094, 48.86721], [17.73126, 48.87885], [17.77944, 48.92318], [17.87831, 48.92679], [17.91814, 49.01784], [18.06885, 49.03157], [18.1104, 49.08624], [18.15022, 49.24518], [18.18456, 49.28909], [18.36446, 49.3267], [18.4139, 49.36517], [18.4084, 49.40003], [18.44686, 49.39467], [18.54848, 49.47059], [18.53063, 49.49022], [18.57183, 49.51162], [18.6144, 49.49824], [18.67757, 49.50895], [18.74761, 49.492], [18.84521, 49.51672], [18.84786, 49.5446], [18.80479, 49.6815], [18.72838, 49.68163], [18.69817, 49.70473], [18.62676, 49.71983], [18.62943, 49.74603], [18.62645, 49.75002], [18.61368, 49.75426], [18.61278, 49.7618], [18.57183, 49.83334], [18.60341, 49.86256], [18.57045, 49.87849], [18.57697, 49.91565], [18.54299, 49.92537], [18.54495, 49.9079], [18.53423, 49.89906], [18.41604, 49.93498], [18.33562, 49.94747], [18.33278, 49.92415], [18.31914, 49.91565], [18.27794, 49.93863], [18.27107, 49.96779], [18.21752, 49.97309], [18.20241, 49.99958], [18.10628, 50.00223], [18.07898, 50.04535], [18.03212, 50.06574], [18.00396, 50.04954], [18.04585, 50.03311], [18.04585, 50.01194], [18.00191, 50.01723], [17.86886, 49.97452], [17.77669, 50.02253], [17.7506, 50.07896], [17.6888, 50.12037], [17.66683, 50.10275], [17.59404, 50.16437], [17.70528, 50.18812], [17.76296, 50.23382], [17.72176, 50.25665], [17.74648, 50.29966], [17.69292, 50.32859], [17.67764, 50.28977], [17.58889, 50.27837], [17.3702, 50.28123], [17.34548, 50.2628], [17.34273, 50.32947], [17.27681, 50.32246], [17.19991, 50.3654], [17.19579, 50.38817], [17.14498, 50.38117], [17.1224, 50.39494], [16.89229, 50.45117], [16.85933, 50.41093], [16.90877, 50.38642], [16.94448, 50.31281], [16.99803, 50.30316], [17.02138, 50.27772], [16.99803, 50.25753], [17.02825, 50.23118], [17.00353, 50.21449], [16.98018, 50.24172], [16.8456, 50.20834], [16.7014, 50.09659], [16.63137, 50.1142], [16.55446, 50.16613], [16.56407, 50.21009], [16.42674, 50.32509], [16.39379, 50.3207], [16.3622, 50.34875], [16.36495, 50.37679], [16.30289, 50.38292], [16.28118, 50.36891], [16.22821, 50.41054], [16.21585, 50.40627], [16.19526, 50.43291], [16.31413, 50.50274], [16.34572, 50.49575], [16.44597, 50.58041], [16.33611, 50.66579], [16.23174, 50.67101], [16.20839, 50.63096], [16.10265, 50.66405], [16.02437, 50.60046], [15.98317, 50.61528], [16.0175, 50.63009], [15.97219, 50.69799], [15.87331, 50.67188], [15.81683, 50.75666], [15.73186, 50.73885], [15.43798, 50.80833], [15.3803, 50.77187], [15.36656, 50.83956], [15.2773, 50.8907], [15.27043, 50.97724], [15.2361, 50.99886], [15.1743, 50.9833], [15.16744, 51.01959], [15.11937, 50.99021], [15.10152, 51.01095], [15.06218, 51.02269], [15.03895, 51.0123], [15.02433, 51.0242], [14.96419, 50.99108], [15.01088, 50.97984], [14.99852, 50.86817], [14.82803, 50.86966]]]] } },
23142     { type: "Feature", properties: { iso1A2: "DE", iso1A3: "DEU", iso1N3: "276", wikidata: "Q183", nameEn: "Germany", groups: ["EU", "155", "150", "UN"], callingCodes: ["49"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.70847, 47.68904], [8.71773, 47.69088], [8.70237, 47.71453], [8.66416, 47.71367], [8.67508, 47.6979], [8.65769, 47.68928], [8.66837, 47.68437], [8.68985, 47.69552], [8.70847, 47.68904]]], [[[8.72617, 47.69651], [8.72809, 47.69282], [8.75856, 47.68969], [8.79511, 47.67462], [8.79966, 47.70222], [8.76965, 47.7075], [8.77309, 47.72059], [8.80663, 47.73821], [8.82002, 47.71458], [8.86989, 47.70504], [8.85065, 47.68209], [8.87383, 47.67045], [8.87625, 47.65441], [8.89946, 47.64769], [8.94093, 47.65596], [9.02093, 47.6868], [9.09891, 47.67801], [9.13845, 47.66389], [9.15181, 47.66904], [9.1705, 47.65513], [9.1755, 47.65584], [9.17593, 47.65399], [9.18203, 47.65598], [9.25619, 47.65939], [9.55125, 47.53629], [9.72736, 47.53457], [9.76748, 47.5934], [9.80254, 47.59419], [9.82591, 47.58158], [9.8189, 47.54688], [9.87499, 47.52953], [9.87733, 47.54688], [9.92407, 47.53111], [9.96029, 47.53899], [10.00003, 47.48216], [10.03859, 47.48927], [10.07131, 47.45531], [10.09001, 47.46005], [10.1052, 47.4316], [10.06897, 47.40709], [10.09819, 47.35724], [10.11805, 47.37228], [10.16362, 47.36674], [10.17648, 47.38889], [10.2127, 47.38019], [10.22774, 47.38904], [10.23757, 47.37609], [10.19998, 47.32832], [10.2147, 47.31014], [10.17648, 47.29149], [10.17531, 47.27167], [10.23257, 47.27088], [10.33424, 47.30813], [10.39851, 47.37623], [10.4324, 47.38494], [10.4359, 47.41183], [10.47446, 47.43318], [10.46278, 47.47901], [10.44291, 47.48453], [10.4324, 47.50111], [10.44992, 47.5524], [10.43473, 47.58394], [10.47329, 47.58552], [10.48849, 47.54057], [10.56912, 47.53584], [10.60337, 47.56755], [10.63456, 47.5591], [10.68832, 47.55752], [10.6965, 47.54253], [10.7596, 47.53228], [10.77596, 47.51729], [10.88814, 47.53701], [10.91268, 47.51334], [10.86945, 47.5015], [10.87061, 47.4786], [10.90918, 47.48571], [10.93839, 47.48018], [10.92437, 47.46991], [10.98513, 47.42882], [10.97111, 47.41617], [10.97111, 47.39561], [11.11835, 47.39719], [11.12536, 47.41222], [11.20482, 47.43198], [11.25157, 47.43277], [11.22002, 47.3964], [11.27844, 47.39956], [11.29597, 47.42566], [11.33804, 47.44937], [11.4175, 47.44621], [11.38128, 47.47465], [11.4362, 47.51413], [11.52618, 47.50939], [11.58578, 47.52281], [11.58811, 47.55515], [11.60681, 47.57881], [11.63934, 47.59202], [11.84052, 47.58354], [11.85572, 47.60166], [12.0088, 47.62451], [12.02282, 47.61033], [12.05788, 47.61742], [12.13734, 47.60639], [12.17824, 47.61506], [12.18145, 47.61019], [12.17737, 47.60121], [12.18568, 47.6049], [12.20398, 47.60667], [12.20801, 47.61082], [12.19895, 47.64085], [12.18507, 47.65984], [12.18347, 47.66663], [12.16769, 47.68167], [12.16217, 47.70105], [12.18303, 47.70065], [12.22571, 47.71776], [12.2542, 47.7433], [12.26238, 47.73544], [12.24017, 47.69534], [12.26004, 47.67725], [12.27991, 47.68827], [12.336, 47.69534], [12.37222, 47.68433], [12.43883, 47.6977], [12.44117, 47.6741], [12.50076, 47.62293], [12.53816, 47.63553], [12.57438, 47.63238], [12.6071, 47.6741], [12.7357, 47.6787], [12.77777, 47.66689], [12.76492, 47.64485], [12.82101, 47.61493], [12.77427, 47.58025], [12.80699, 47.54477], [12.84672, 47.54556], [12.85256, 47.52741], [12.9624, 47.47452], [12.98344, 47.48716], [12.9998, 47.46267], [13.04537, 47.49426], [13.03252, 47.53373], [13.05355, 47.56291], [13.04537, 47.58183], [13.06641, 47.58577], [13.06407, 47.60075], [13.09562, 47.63304], [13.07692, 47.68814], [13.01382, 47.72116], [12.98578, 47.7078], [12.92969, 47.71094], [12.91333, 47.7178], [12.90274, 47.72513], [12.91711, 47.74026], [12.9353, 47.74788], [12.94371, 47.76281], [12.93202, 47.77302], [12.96311, 47.79957], [12.98543, 47.82896], [13.00588, 47.84374], [12.94163, 47.92927], [12.93886, 47.94046], [12.93642, 47.94436], [12.93419, 47.94063], [12.92668, 47.93879], [12.91985, 47.94069], [12.9211, 47.95135], [12.91683, 47.95647], [12.87476, 47.96195], [12.8549, 48.01122], [12.76141, 48.07373], [12.74973, 48.10885], [12.7617, 48.12796], [12.78595, 48.12445], [12.80676, 48.14979], [12.82673, 48.15245], [12.8362, 48.15876], [12.836, 48.1647], [12.84475, 48.16556], [12.87126, 48.20318], [12.95306, 48.20629], [13.02083, 48.25689], [13.0851, 48.27711], [13.126, 48.27867], [13.18093, 48.29577], [13.26039, 48.29422], [13.30897, 48.31575], [13.40709, 48.37292], [13.43929, 48.43386], [13.42527, 48.45711], [13.45727, 48.51092], [13.43695, 48.55776], [13.45214, 48.56472], [13.46967, 48.55157], [13.50663, 48.57506], [13.50131, 48.58091], [13.51291, 48.59023], [13.57535, 48.55912], [13.59705, 48.57013], [13.62508, 48.55501], [13.65186, 48.55092], [13.66113, 48.53558], [13.72802, 48.51208], [13.74816, 48.53058], [13.7513, 48.5624], [13.76921, 48.55324], [13.80519, 48.58026], [13.80038, 48.59487], [13.82609, 48.62345], [13.81901, 48.6761], [13.81283, 48.68426], [13.81791, 48.69832], [13.79337, 48.71375], [13.81863, 48.73257], [13.82266, 48.75544], [13.84023, 48.76988], [13.8096, 48.77877], [13.78977, 48.83319], [13.76994, 48.83537], [13.73854, 48.88538], [13.67739, 48.87886], [13.61624, 48.9462], [13.58319, 48.96899], [13.50552, 48.97441], [13.50221, 48.93752], [13.40802, 48.98851], [13.39479, 49.04812], [13.28242, 49.1228], [13.23689, 49.11412], [13.20405, 49.12303], [13.17019, 49.14339], [13.17665, 49.16713], [13.05883, 49.26259], [13.02957, 49.27399], [13.03618, 49.30417], [12.94859, 49.34079], [12.88249, 49.35479], [12.88414, 49.33541], [12.78168, 49.34618], [12.75854, 49.3989], [12.71227, 49.42363], [12.669, 49.42935], [12.64121, 49.47628], [12.64782, 49.52565], [12.60155, 49.52887], [12.56188, 49.6146], [12.53544, 49.61888], [12.52553, 49.68415], [12.4462, 49.70233], [12.40489, 49.76321], [12.46603, 49.78882], [12.48256, 49.83575], [12.55197, 49.92094], [12.47264, 49.94222], [12.49908, 49.97305], [12.30798, 50.05719], [12.26111, 50.06331], [12.27433, 50.0771], [12.23709, 50.10213], [12.2073, 50.10315], [12.1917, 50.13434], [12.21484, 50.16399], [12.19335, 50.19997], [12.09287, 50.25032], [12.13716, 50.27396], [12.10907, 50.32041], [12.18013, 50.32146], [12.20823, 50.2729], [12.25119, 50.27079], [12.26953, 50.25189], [12.24791, 50.25525], [12.23943, 50.24594], [12.28755, 50.22429], [12.28063, 50.19544], [12.29232, 50.17524], [12.32596, 50.17146], [12.33847, 50.19432], [12.32445, 50.20442], [12.33263, 50.24367], [12.35425, 50.23993], [12.36594, 50.28289], [12.40158, 50.29521], [12.39924, 50.32302], [12.43371, 50.32506], [12.43722, 50.33774], [12.46643, 50.35527], [12.48256, 50.34784], [12.49214, 50.35228], [12.48747, 50.37278], [12.51356, 50.39694], [12.67261, 50.41949], [12.70731, 50.39948], [12.73044, 50.42268], [12.73476, 50.43237], [12.82465, 50.45738], [12.94058, 50.40944], [12.98433, 50.42016], [13.02147, 50.44763], [13.02038, 50.4734], [13.0312, 50.50944], [13.08301, 50.50132], [13.13424, 50.51709], [13.19043, 50.50237], [13.25158, 50.59268], [13.29454, 50.57904], [13.32594, 50.58009], [13.32264, 50.60317], [13.37805, 50.627], [13.37485, 50.64931], [13.42189, 50.61243], [13.46413, 50.60102], [13.49742, 50.63133], [13.5226, 50.64721], [13.53748, 50.67654], [13.52474, 50.70394], [13.65977, 50.73096], [13.70204, 50.71771], [13.76316, 50.73487], [13.82942, 50.7251], [13.89444, 50.74142], [13.89113, 50.78533], [13.98864, 50.8177], [14.02982, 50.80662], [14.22331, 50.86049], [14.24314, 50.88761], [14.27123, 50.89386], [14.30098, 50.88448], [14.38691, 50.89907], [14.39848, 50.93866], [14.31422, 50.95243], [14.30251, 50.96606], [14.32793, 50.97379], [14.32353, 50.98556], [14.28776, 50.97718], [14.25665, 50.98935], [14.30098, 51.05515], [14.41335, 51.02086], [14.45827, 51.03712], [14.49202, 51.02286], [14.49154, 51.04382], [14.49991, 51.04692], [14.50809, 51.0427], [14.49873, 51.02242], [14.53321, 51.01679], [14.53438, 51.00374], [14.56432, 51.01008], [14.58215, 50.99306], [14.59908, 50.98685], [14.59702, 50.96148], [14.56374, 50.922], [14.58024, 50.91443], [14.64802, 50.93241], [14.65259, 50.90513], [14.63434, 50.8883], [14.61993, 50.86049], [14.70661, 50.84096], [14.79139, 50.81438], [14.82803, 50.86966], [14.81664, 50.88148], [14.89681, 50.9422], [14.89252, 50.94999], [14.92942, 50.99744], [14.95529, 51.04552], [14.97938, 51.07742], [14.98229, 51.11354], [14.99689, 51.12205], [14.99079, 51.14284], [14.99646, 51.14365], [15.00083, 51.14974], [14.99414, 51.15813], [14.99311, 51.16249], [15.0047, 51.16874], [15.01242, 51.21285], [15.04288, 51.28387], [14.98008, 51.33449], [14.96899, 51.38367], [14.9652, 51.44793], [14.94749, 51.47155], [14.73219, 51.52922], [14.72652, 51.53902], [14.73047, 51.54606], [14.71125, 51.56209], [14.7727, 51.61263], [14.75759, 51.62318], [14.75392, 51.67445], [14.69065, 51.70842], [14.66386, 51.73282], [14.64625, 51.79472], [14.60493, 51.80473], [14.59089, 51.83302], [14.6588, 51.88359], [14.6933, 51.9044], [14.70601, 51.92944], [14.7177, 51.94048], [14.72163, 51.95188], [14.71836, 51.95606], [14.7139, 51.95643], [14.70488, 51.97679], [14.71339, 52.00337], [14.76026, 52.06624], [14.72971, 52.09167], [14.6917, 52.10283], [14.67683, 52.13936], [14.70616, 52.16927], [14.68344, 52.19612], [14.71319, 52.22144], [14.70139, 52.25038], [14.58149, 52.28007], [14.56378, 52.33838], [14.55228, 52.35264], [14.54423, 52.42568], [14.63056, 52.48993], [14.60081, 52.53116], [14.6289, 52.57136], [14.61073, 52.59847], [14.22071, 52.81175], [14.13806, 52.82392], [14.12256, 52.84311], [14.15873, 52.87715], [14.14056, 52.95786], [14.25954, 53.00264], [14.35044, 53.05829], [14.38679, 53.13669], [14.36696, 53.16444], [14.37853, 53.20405], [14.40662, 53.21098], [14.45125, 53.26241], [14.44133, 53.27427], [14.4215, 53.27724], [14.35209, 53.49506], [14.3273, 53.50587], [14.30416, 53.55499], [14.31904, 53.61581], [14.2853, 53.63392], [14.28477, 53.65955], [14.27133, 53.66613], [14.2836, 53.67721], [14.26782, 53.69866], [14.27249, 53.74464], [14.21323, 53.8664], [14.20823, 53.90776], [14.18544, 53.91258], [14.20647, 53.91671], [14.22634, 53.9291], [14.20811, 54.12784], [13.93395, 54.84044], [12.85844, 54.82438], [11.90309, 54.38543], [11.00303, 54.63689], [10.31111, 54.65968], [10.16755, 54.73883], [9.89314, 54.84171], [9.73563, 54.8247], [9.61187, 54.85548], [9.62734, 54.88057], [9.58937, 54.88785], [9.4659, 54.83131], [9.43155, 54.82586], [9.41213, 54.84254], [9.38532, 54.83968], [9.36496, 54.81749], [9.33849, 54.80233], [9.32771, 54.80602], [9.2474, 54.8112], [9.23445, 54.83432], [9.24631, 54.84726], [9.20571, 54.85841], [9.14275, 54.87421], [9.04629, 54.87249], [8.92795, 54.90452], [8.81178, 54.90518], [8.76387, 54.8948], [8.63979, 54.91069], [8.55769, 54.91837], [8.45719, 55.06747], [8.02459, 55.09613], [5.45168, 54.20039], [6.91025, 53.44221], [7.00198, 53.32672], [7.19052, 53.31866], [7.21679, 53.20058], [7.22681, 53.18165], [7.17898, 53.13817], [7.21694, 53.00742], [7.07253, 52.81083], [7.04557, 52.63318], [6.77307, 52.65375], [6.71641, 52.62905], [6.69507, 52.488], [6.94293, 52.43597], [6.99041, 52.47235], [7.03417, 52.40237], [7.07044, 52.37805], [7.02703, 52.27941], [7.06365, 52.23789], [7.03729, 52.22695], [6.9897, 52.2271], [6.97189, 52.20329], [6.83984, 52.11728], [6.76117, 52.11895], [6.68128, 52.05052], [6.83035, 51.9905], [6.82357, 51.96711], [6.72319, 51.89518], [6.68386, 51.91861], [6.58556, 51.89386], [6.50231, 51.86313], [6.47179, 51.85395], [6.38815, 51.87257], [6.40704, 51.82771], [6.30593, 51.84998], [6.29872, 51.86801], [6.21443, 51.86801], [6.15349, 51.90439], [6.11551, 51.89769], [6.16902, 51.84094], [6.10337, 51.84829], [6.06705, 51.86136], [5.99848, 51.83195], [5.94568, 51.82786], [5.98665, 51.76944], [5.95003, 51.7493], [6.04091, 51.71821], [6.02767, 51.6742], [6.11759, 51.65609], [6.09055, 51.60564], [6.18017, 51.54096], [6.21724, 51.48568], [6.20654, 51.40049], [6.22641, 51.39948], [6.22674, 51.36135], [6.16977, 51.33169], [6.07889, 51.24432], [6.07889, 51.17038], [6.17384, 51.19589], [6.16706, 51.15677], [5.98292, 51.07469], [5.9541, 51.03496], [5.9134, 51.06736], [5.86735, 51.05182], [5.87849, 51.01969], [5.90493, 51.00198], [5.90296, 50.97356], [5.95282, 50.98728], [6.02697, 50.98303], [6.01615, 50.93367], [6.09297, 50.92066], [6.07486, 50.89307], [6.08805, 50.87223], [6.07693, 50.86025], [6.07431, 50.84674], [6.05702, 50.85179], [6.05623, 50.8572], [6.01921, 50.84435], [6.02328, 50.81694], [6.00462, 50.80065], [5.98404, 50.80988], [5.97497, 50.79992], [6.02624, 50.77453], [6.01976, 50.75398], [6.03889, 50.74618], [6.0326, 50.72647], [6.0406, 50.71848], [6.04428, 50.72861], [6.11707, 50.72231], [6.17852, 50.6245], [6.26957, 50.62444], [6.2476, 50.60392], [6.24888, 50.59869], [6.24005, 50.58732], [6.22581, 50.5907], [6.20281, 50.56952], [6.17739, 50.55875], [6.17802, 50.54179], [6.19735, 50.53576], [6.19579, 50.5313], [6.18716, 50.52653], [6.19193, 50.5212], [6.20599, 50.52089], [6.22335, 50.49578], [6.26637, 50.50272], [6.30809, 50.50058], [6.3465, 50.48833], [6.34005, 50.46083], [6.37219, 50.45397], [6.36852, 50.40776], [6.34406, 50.37994], [6.3688, 50.35898], [6.40785, 50.33557], [6.40641, 50.32425], [6.35701, 50.31139], [6.32488, 50.32333], [6.29949, 50.30887], [6.28797, 50.27458], [6.208, 50.25179], [6.16853, 50.2234], [6.18364, 50.20815], [6.18739, 50.1822], [6.14588, 50.17106], [6.14132, 50.14971], [6.15298, 50.14126], [6.1379, 50.12964], [6.12055, 50.09171], [6.11274, 50.05916], [6.13458, 50.04141], [6.13044, 50.02929], [6.14666, 50.02207], [6.13794, 50.01466], [6.13273, 50.02019], [6.1295, 50.01849], [6.13806, 50.01056], [6.14948, 50.00908], [6.14147, 49.99563], [6.1701, 49.98518], [6.16466, 49.97086], [6.17872, 49.9537], [6.18554, 49.95622], [6.18045, 49.96611], [6.19089, 49.96991], [6.19856, 49.95053], [6.22094, 49.94955], [6.22608, 49.929], [6.21882, 49.92403], [6.22926, 49.92096], [6.23496, 49.89972], [6.26146, 49.88203], [6.28874, 49.87592], [6.29692, 49.86685], [6.30963, 49.87021], [6.32303, 49.85133], [6.32098, 49.83728], [6.33585, 49.83785], [6.34267, 49.84974], [6.36576, 49.85032], [6.40022, 49.82029], [6.42521, 49.81591], [6.42905, 49.81091], [6.44131, 49.81443], [6.45425, 49.81164], [6.47111, 49.82263], [6.48718, 49.81267], [6.50647, 49.80916], [6.51215, 49.80124], [6.52121, 49.81338], [6.53122, 49.80666], [6.52169, 49.79787], [6.50534, 49.78952], [6.51669, 49.78336], [6.51056, 49.77515], [6.51828, 49.76855], [6.51646, 49.75961], [6.50174, 49.75292], [6.50193, 49.73291], [6.51805, 49.72425], [6.51397, 49.72058], [6.50261, 49.72718], [6.49535, 49.72645], [6.49694, 49.72205], [6.5042, 49.71808], [6.50647, 49.71353], [6.49785, 49.71118], [6.48014, 49.69767], [6.46048, 49.69092], [6.44654, 49.67799], [6.42937, 49.66857], [6.42726, 49.66078], [6.43768, 49.66021], [6.4413, 49.65722], [6.41861, 49.61723], [6.39822, 49.60081], [6.385, 49.59946], [6.37464, 49.58886], [6.38342, 49.5799], [6.38024, 49.57593], [6.36676, 49.57813], [6.35825, 49.57053], [6.38228, 49.55855], [6.38072, 49.55171], [6.35666, 49.52931], [6.36788, 49.50377], [6.36907, 49.48931], [6.36778, 49.46937], [6.38352, 49.46463], [6.39168, 49.4667], [6.40274, 49.46546], [6.42432, 49.47683], [6.55404, 49.42464], [6.533, 49.40748], [6.60091, 49.36864], [6.58807, 49.35358], [6.572, 49.35027], [6.60186, 49.31055], [6.66583, 49.28065], [6.69274, 49.21661], [6.71843, 49.2208], [6.73256, 49.20486], [6.71137, 49.18808], [6.73765, 49.16375], [6.78265, 49.16793], [6.83385, 49.15162], [6.84703, 49.15734], [6.86225, 49.18185], [6.85016, 49.19354], [6.85119, 49.20038], [6.83555, 49.21249], [6.85939, 49.22376], [6.89298, 49.20863], [6.91875, 49.22261], [6.93831, 49.2223], [6.94028, 49.21641], [6.95963, 49.203], [6.97273, 49.2099], [7.01318, 49.19018], [7.03459, 49.19096], [7.0274, 49.17042], [7.03178, 49.15734], [7.04662, 49.13724], [7.04409, 49.12123], [7.04843, 49.11422], [7.05548, 49.11185], [7.06642, 49.11415], [7.07162, 49.1255], [7.09007, 49.13094], [7.07859, 49.15031], [7.10715, 49.15631], [7.10384, 49.13787], [7.12504, 49.14253], [7.1358, 49.1282], [7.1593, 49.1204], [7.23473, 49.12971], [7.29514, 49.11426], [7.3195, 49.14231], [7.35995, 49.14399], [7.3662, 49.17308], [7.44052, 49.18354], [7.44455, 49.16765], [7.49473, 49.17], [7.49172, 49.13915], [7.53012, 49.09818], [7.56416, 49.08136], [7.62575, 49.07654], [7.63618, 49.05428], [7.75948, 49.04562], [7.79557, 49.06583], [7.86386, 49.03499], [7.93641, 49.05544], [7.97783, 49.03161], [8.14189, 48.97833], [8.22604, 48.97352], [8.20031, 48.95856], [8.19989, 48.95825], [8.12813, 48.87985], [8.10253, 48.81829], [8.06802, 48.78957], [8.0326, 48.79017], [8.01534, 48.76085], [7.96994, 48.75606], [7.96812, 48.72491], [7.89002, 48.66317], [7.84098, 48.64217], [7.80057, 48.5857], [7.80167, 48.54758], [7.80647, 48.51239], [7.76833, 48.48945], [7.73109, 48.39192], [7.74562, 48.32736], [7.69022, 48.30018], [7.6648, 48.22219], [7.57137, 48.12292], [7.56966, 48.03265], [7.62302, 47.97898], [7.55673, 47.87371], [7.52921, 47.77747], [7.54761, 47.72912], [7.53722, 47.71635], [7.51266, 47.70197], [7.51915, 47.68335], [7.52067, 47.66437], [7.53384, 47.65115], [7.5591, 47.63849], [7.57423, 47.61628], [7.58851, 47.60794], [7.59301, 47.60058], [7.58945, 47.59017], [7.60523, 47.58519], [7.60459, 47.57869], [7.61929, 47.57683], [7.64309, 47.59151], [7.64213, 47.5944], [7.64599, 47.59695], [7.67395, 47.59212], [7.68229, 47.59905], [7.69385, 47.60099], [7.68486, 47.59601], [7.67115, 47.5871], [7.68904, 47.57133], [7.67655, 47.56435], [7.63338, 47.56256], [7.65083, 47.54662], [7.66174, 47.54554], [7.6656, 47.53752], [7.68101, 47.53232], [7.69642, 47.53297], [7.71961, 47.54219], [7.75261, 47.54599], [7.79486, 47.55691], [7.81901, 47.58798], [7.84412, 47.5841], [7.88664, 47.58854], [7.90673, 47.57674], [7.91251, 47.55031], [7.94494, 47.54511], [7.95682, 47.55789], [7.97581, 47.55493], [8.00113, 47.55616], [8.02136, 47.55096], [8.04383, 47.55443], [8.06663, 47.56374], [8.08557, 47.55768], [8.10002, 47.56504], [8.10395, 47.57918], [8.11543, 47.5841], [8.13662, 47.58432], [8.13823, 47.59147], [8.14947, 47.59558], [8.1652, 47.5945], [8.19378, 47.61636], [8.20617, 47.62141], [8.22011, 47.6181], [8.22577, 47.60385], [8.23809, 47.61204], [8.25863, 47.61571], [8.26313, 47.6103], [8.2824, 47.61225], [8.29722, 47.60603], [8.29524, 47.5919], [8.30277, 47.58607], [8.32735, 47.57133], [8.35512, 47.57014], [8.38273, 47.56608], [8.39477, 47.57826], [8.43235, 47.56617], [8.49431, 47.58107], [8.48949, 47.588], [8.46637, 47.58389], [8.45578, 47.60121], [8.50747, 47.61897], [8.51686, 47.63476], [8.55756, 47.62394], [8.57586, 47.59537], [8.60348, 47.61204], [8.59545, 47.64298], [8.60701, 47.65271], [8.61471, 47.64514], [8.60412, 47.63735], [8.62049, 47.63757], [8.62884, 47.65098], [8.61113, 47.66332], [8.6052, 47.67258], [8.57683, 47.66158], [8.56141, 47.67088], [8.52801, 47.66059], [8.5322, 47.64687], [8.49656, 47.64709], [8.46605, 47.64103], [8.4667, 47.65747], [8.44711, 47.65379], [8.42264, 47.66667], [8.41346, 47.66676], [8.40473, 47.67499], [8.4211, 47.68407], [8.40569, 47.69855], [8.44807, 47.72426], [8.45771, 47.7493], [8.48868, 47.77215], [8.56814, 47.78001], [8.56415, 47.80633], [8.61657, 47.79998], [8.62408, 47.7626], [8.64425, 47.76398], [8.65292, 47.80066], [8.68022, 47.78599], [8.68985, 47.75686], [8.71778, 47.76571], [8.74251, 47.75168], [8.70543, 47.73121], [8.73671, 47.7169], [8.72617, 47.69651]]]] } },
23143     { type: "Feature", properties: { iso1A2: "DG", iso1A3: "DGA", wikidata: "Q184851", nameEn: "Diego Garcia", country: "GB", groups: ["IO", "BOTS", "014", "202", "002", "UN"], isoStatus: "excRes", callingCodes: ["246"] }, geometry: { type: "MultiPolygon", coordinates: [[[[73.14823, -7.76302], [73.09982, -6.07324], [71.43792, -7.73904], [73.14823, -7.76302]]]] } },
23144     { type: "Feature", properties: { iso1A2: "DJ", iso1A3: "DJI", iso1N3: "262", wikidata: "Q977", nameEn: "Djibouti", groups: ["014", "202", "002", "UN"], callingCodes: ["253"] }, geometry: { type: "MultiPolygon", coordinates: [[[[43.90659, 12.3823], [43.90659, 12.3823], [43.32909, 12.59711], [43.29075, 12.79154], [42.86195, 12.58747], [42.7996, 12.42629], [42.6957, 12.36201], [42.46941, 12.52661], [42.4037, 12.46478], [41.95461, 11.81157], [41.82878, 11.72361], [41.77727, 11.49902], [41.8096, 11.33606], [41.80056, 10.97127], [42.06302, 10.92599], [42.13691, 10.97586], [42.42669, 10.98493], [42.62989, 11.09711], [42.75111, 11.06992], [42.79037, 10.98493], [42.95776, 10.98533], [43.90659, 12.3823]]]] } },
23145     { type: "Feature", properties: { iso1A2: "DK", iso1A3: "DNK", iso1N3: "208", wikidata: "Q756617", nameEn: "Kingdom of Denmark" }, geometry: null },
23146     { type: "Feature", properties: { iso1A2: "DM", iso1A3: "DMA", iso1N3: "212", wikidata: "Q784", nameEn: "Dominica", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 767"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.32485, 14.91445], [-60.86656, 15.82603], [-61.95646, 15.5094], [-61.32485, 14.91445]]]] } },
23147     { type: "Feature", properties: { iso1A2: "DO", iso1A3: "DOM", iso1N3: "214", wikidata: "Q786", nameEn: "Dominican Republic", groups: ["029", "003", "419", "019", "UN"], callingCodes: ["1 809", "1 829", "1 849"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-67.87844, 21.7938], [-72.38946, 20.27111], [-71.77419, 19.73128], [-71.75865, 19.70231], [-71.7429, 19.58445], [-71.71449, 19.55364], [-71.71268, 19.53374], [-71.6802, 19.45008], [-71.69448, 19.37866], [-71.77766, 19.33823], [-71.73229, 19.26686], [-71.62642, 19.21212], [-71.65337, 19.11759], [-71.69938, 19.10916], [-71.71088, 19.08353], [-71.74088, 19.0437], [-71.88102, 18.95007], [-71.77766, 18.95007], [-71.72624, 18.87802], [-71.71885, 18.78423], [-71.82556, 18.62551], [-71.95412, 18.64939], [-72.00201, 18.62312], [-71.88102, 18.50125], [-71.90875, 18.45821], [-71.69952, 18.34101], [-71.78271, 18.18302], [-71.75465, 18.14405], [-71.74994, 18.11115], [-71.73783, 18.07177], [-71.75671, 18.03456], [-72.29523, 17.48026], [-68.39466, 16.14167], [-67.87844, 21.7938]]]] } },
23148     { type: "Feature", properties: { iso1A2: "DZ", iso1A3: "DZA", iso1N3: "012", wikidata: "Q262", nameEn: "Algeria", groups: ["015", "002", "UN"], callingCodes: ["213"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.59123, 37.14286], [5.10072, 39.89531], [-2.27707, 35.35051], [-2.21248, 35.08532], [-2.21445, 35.04378], [-2.04734, 34.93218], [-1.97833, 34.93218], [-1.97469, 34.886], [-1.73707, 34.74226], [-1.84569, 34.61907], [-1.69788, 34.48056], [-1.78042, 34.39018], [-1.64666, 34.10405], [-1.73494, 33.71721], [-1.59508, 33.59929], [-1.67067, 33.27084], [-1.46249, 33.0499], [-1.54244, 32.95499], [-1.37794, 32.73628], [-0.9912, 32.52467], [-1.24998, 32.32993], [-1.24453, 32.1917], [-1.15735, 32.12096], [-1.22829, 32.07832], [-2.46166, 32.16603], [-2.93873, 32.06557], [-2.82784, 31.79459], [-3.66314, 31.6339], [-3.66386, 31.39202], [-3.77647, 31.31912], [-3.77103, 31.14984], [-3.54944, 31.0503], [-3.65418, 30.85566], [-3.64735, 30.67539], [-4.31774, 30.53229], [-4.6058, 30.28343], [-5.21671, 29.95253], [-5.58831, 29.48103], [-5.72121, 29.52322], [-5.75616, 29.61407], [-6.69965, 29.51623], [-6.78351, 29.44634], [-6.95824, 29.50924], [-7.61585, 29.36252], [-8.6715, 28.71194], [-8.66879, 27.6666], [-8.66674, 27.31569], [-4.83423, 24.99935], [1.15698, 21.12843], [1.20992, 20.73533], [3.24648, 19.81703], [3.12501, 19.1366], [3.36082, 18.9745], [4.26651, 19.14224], [5.8153, 19.45101], [7.38361, 20.79165], [7.48273, 20.87258], [11.96886, 23.51735], [11.62498, 24.26669], [11.41061, 24.21456], [10.85323, 24.5595], [10.33159, 24.5465], [10.02432, 24.98124], [10.03146, 25.35635], [9.38834, 26.19288], [9.51696, 26.39148], [9.89569, 26.57696], [9.78136, 29.40961], [9.3876, 30.16738], [9.55544, 30.23971], [9.07483, 32.07865], [8.35999, 32.50101], [8.31895, 32.83483], [8.1179, 33.05086], [8.11433, 33.10175], [7.83028, 33.18851], [7.73687, 33.42114], [7.54088, 33.7726], [7.52851, 34.06493], [7.66174, 34.20167], [7.74207, 34.16492], [7.81242, 34.21841], [7.86264, 34.3987], [8.20482, 34.57575], [8.29655, 34.72798], [8.25189, 34.92009], [8.30727, 34.95378], [8.3555, 35.10007], [8.47318, 35.23376], [8.30329, 35.29884], [8.36086, 35.47774], [8.35371, 35.66373], [8.26472, 35.73669], [8.2626, 35.91733], [8.40731, 36.42208], [8.18936, 36.44939], [8.16167, 36.48817], [8.47609, 36.66607], [8.46537, 36.7706], [8.57613, 36.78062], [8.67706, 36.8364], [8.62972, 36.86499], [8.64044, 36.9401], [8.59123, 37.14286]]]] } },
23149     { type: "Feature", properties: { iso1A2: "EA", wikidata: "Q28868874", nameEn: "Ceuta, Melilla", country: "ES", level: "territory", isoStatus: "excRes" }, geometry: null },
23150     { type: "Feature", properties: { iso1A2: "EC", iso1A3: "ECU", iso1N3: "218", wikidata: "Q736", nameEn: "Ecuador" }, geometry: null },
23151     { type: "Feature", properties: { iso1A2: "EE", iso1A3: "EST", iso1N3: "233", wikidata: "Q191", nameEn: "Estonia", aliases: ["EW"], groups: ["EU", "154", "150", "UN"], callingCodes: ["372"] }, geometry: { type: "MultiPolygon", coordinates: [[[[26.32936, 60.00121], [20.5104, 59.15546], [19.84909, 57.57876], [22.80496, 57.87798], [23.20055, 57.56697], [24.26221, 57.91787], [24.3579, 57.87471], [25.19484, 58.0831], [25.28237, 57.98539], [25.29581, 58.08288], [25.73499, 57.90193], [26.05949, 57.84744], [26.0324, 57.79037], [26.02456, 57.78342], [26.027, 57.78158], [26.0266, 57.77441], [26.02069, 57.77169], [26.02415, 57.76865], [26.03332, 57.7718], [26.0543, 57.76105], [26.08098, 57.76619], [26.2029, 57.7206], [26.1866, 57.6849], [26.29253, 57.59244], [26.46527, 57.56885], [26.54675, 57.51813], [26.90364, 57.62823], [27.34698, 57.52242], [27.31919, 57.57672], [27.40393, 57.62125], [27.3746, 57.66834], [27.52615, 57.72843], [27.50171, 57.78842], [27.56689, 57.83356], [27.78526, 57.83963], [27.81841, 57.89244], [27.67282, 57.92627], [27.62393, 58.09462], [27.48541, 58.22615], [27.55489, 58.39525], [27.36366, 58.78381], [27.74429, 58.98351], [27.80482, 59.1116], [27.87978, 59.18097], [27.90911, 59.24353], [28.00689, 59.28351], [28.14215, 59.28934], [28.19284, 59.35791], [28.20537, 59.36491], [28.21137, 59.38058], [28.19061, 59.39962], [28.04187, 59.47017], [27.85643, 59.58538], [26.90044, 59.63819], [26.32936, 60.00121]]]] } },
23152     { type: "Feature", properties: { iso1A2: "EG", iso1A3: "EGY", iso1N3: "818", wikidata: "Q79", nameEn: "Egypt", groups: ["015", "002", "UN"], callingCodes: ["20"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.62659, 31.82938], [26.92891, 33.39516], [24.8458, 31.39877], [25.01077, 30.73861], [24.71117, 30.17441], [24.99968, 29.24574], [24.99885, 21.99535], [33.17563, 22.00405], [34.0765, 22.00501], [37.8565, 22.00903], [34.4454, 27.91479], [34.8812, 29.36878], [34.92298, 29.45305], [34.26742, 31.21998], [34.24012, 31.29591], [34.23572, 31.2966], [34.21853, 31.32363], [34.052, 31.46619], [33.62659, 31.82938]]]] } },
23153     { type: "Feature", properties: { iso1A2: "EH", iso1A3: "ESH", iso1N3: "732", wikidata: "Q6250", nameEn: "Western Sahara", groups: ["015", "002"], callingCodes: ["212"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.66879, 27.6666], [-8.77527, 27.66663], [-8.71787, 26.9898], [-9.08698, 26.98639], [-9.56957, 26.90042], [-9.81998, 26.71379], [-10.68417, 26.90984], [-11.35695, 26.8505], [-11.23622, 26.72023], [-11.38635, 26.611], [-11.62052, 26.05229], [-12.06001, 26.04442], [-12.12281, 25.13682], [-12.92147, 24.39502], [-13.00628, 24.01923], [-13.75627, 23.77231], [-14.10361, 22.75501], [-14.1291, 22.41636], [-14.48112, 22.00886], [-14.47329, 21.63839], [-14.78487, 21.36587], [-16.44269, 21.39745], [-16.9978, 21.36239], [-17.02707, 21.34022], [-17.21511, 21.34226], [-17.35589, 20.80492], [-17.0471, 20.76408], [-17.0695, 20.85742], [-17.06781, 20.92697], [-17.0396, 20.9961], [-17.0357, 21.05368], [-16.99806, 21.12142], [-16.95474, 21.33997], [-13.01525, 21.33343], [-13.08438, 22.53866], [-13.15313, 22.75649], [-13.10753, 22.89493], [-13.00412, 23.02297], [-12.5741, 23.28975], [-12.36213, 23.3187], [-12.14969, 23.41935], [-12.00251, 23.4538], [-12.0002, 25.9986], [-8.66721, 25.99918], [-8.66674, 27.31569], [-8.66879, 27.6666]]]] } },
23154     { type: "Feature", properties: { iso1A2: "ER", iso1A3: "ERI", iso1N3: "232", wikidata: "Q986", nameEn: "Eritrea", groups: ["014", "202", "002", "UN"], callingCodes: ["291"] }, geometry: { type: "MultiPolygon", coordinates: [[[[40.99158, 15.81743], [39.63762, 18.37348], [38.57727, 17.98125], [38.45916, 17.87167], [38.37133, 17.66269], [38.13362, 17.53906], [37.50967, 17.32199], [37.42694, 17.04041], [36.99777, 17.07172], [36.92193, 16.23451], [36.76371, 15.80831], [36.69761, 15.75323], [36.54276, 15.23478], [36.44337, 15.14963], [36.54376, 14.25597], [36.56536, 14.26177], [36.55659, 14.28237], [36.63364, 14.31172], [36.85787, 14.32201], [37.01622, 14.2561], [37.09486, 14.27155], [37.13206, 14.40746], [37.3106, 14.44657], [37.47319, 14.2149], [37.528, 14.18413], [37.91287, 14.89447], [38.0364, 14.72745], [38.25562, 14.67287], [38.3533, 14.51323], [38.45748, 14.41445], [38.78306, 14.4754], [38.98058, 14.54895], [39.02834, 14.63717], [39.16074, 14.65187], [39.14772, 14.61827], [39.19547, 14.56996], [39.23888, 14.56365], [39.26927, 14.48801], [39.2302, 14.44598], [39.2519, 14.40393], [39.37685, 14.54402], [39.52756, 14.49011], [39.50585, 14.55735], [39.58182, 14.60987], [39.76632, 14.54264], [39.9443, 14.41024], [40.07236, 14.54264], [40.14649, 14.53969], [40.21128, 14.39342], [40.25686, 14.41445], [40.9167, 14.11152], [41.25097, 13.60787], [41.62864, 13.38626], [42.05841, 12.80912], [42.21469, 12.75832], [42.2798, 12.6355], [42.4037, 12.46478], [42.46941, 12.52661], [42.6957, 12.36201], [42.7996, 12.42629], [42.86195, 12.58747], [43.29075, 12.79154], [40.99158, 15.81743]]]] } },
23155     { type: "Feature", properties: { iso1A2: "ES", iso1A3: "ESP", iso1N3: "724", wikidata: "Q29", nameEn: "Spain" }, geometry: null },
23156     { type: "Feature", properties: { iso1A2: "ET", iso1A3: "ETH", iso1N3: "231", wikidata: "Q115", nameEn: "Ethiopia", groups: ["014", "202", "002", "UN"], callingCodes: ["251"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.4037, 12.46478], [42.2798, 12.6355], [42.21469, 12.75832], [42.05841, 12.80912], [41.62864, 13.38626], [41.25097, 13.60787], [40.9167, 14.11152], [40.25686, 14.41445], [40.21128, 14.39342], [40.14649, 14.53969], [40.07236, 14.54264], [39.9443, 14.41024], [39.76632, 14.54264], [39.58182, 14.60987], [39.50585, 14.55735], [39.52756, 14.49011], [39.37685, 14.54402], [39.2519, 14.40393], [39.2302, 14.44598], [39.26927, 14.48801], [39.23888, 14.56365], [39.19547, 14.56996], [39.14772, 14.61827], [39.16074, 14.65187], [39.02834, 14.63717], [38.98058, 14.54895], [38.78306, 14.4754], [38.45748, 14.41445], [38.3533, 14.51323], [38.25562, 14.67287], [38.0364, 14.72745], [37.91287, 14.89447], [37.528, 14.18413], [37.47319, 14.2149], [37.3106, 14.44657], [37.13206, 14.40746], [37.09486, 14.27155], [37.01622, 14.2561], [36.85787, 14.32201], [36.63364, 14.31172], [36.55659, 14.28237], [36.56536, 14.26177], [36.54376, 14.25597], [36.44653, 13.95666], [36.48824, 13.83954], [36.38993, 13.56459], [36.24545, 13.36759], [36.13374, 12.92665], [36.16651, 12.88019], [36.14268, 12.70879], [36.01458, 12.72478], [35.70476, 12.67101], [35.24302, 11.91132], [35.11492, 11.85156], [35.05832, 11.71158], [35.09556, 11.56278], [34.95704, 11.24448], [35.01215, 11.19626], [34.93172, 10.95946], [34.97789, 10.91559], [34.97491, 10.86147], [34.86916, 10.78832], [34.86618, 10.74588], [34.77532, 10.69027], [34.77383, 10.74588], [34.59062, 10.89072], [34.4372, 10.781], [34.2823, 10.53508], [34.34783, 10.23914], [34.32102, 10.11599], [34.22718, 10.02506], [34.20484, 9.9033], [34.13186, 9.7492], [34.08717, 9.55243], [34.10229, 9.50238], [34.14304, 9.04654], [34.14453, 8.60204], [34.01346, 8.50041], [33.89579, 8.4842], [33.87195, 8.41938], [33.71407, 8.3678], [33.66938, 8.44442], [33.54575, 8.47094], [33.3119, 8.45474], [33.19721, 8.40317], [33.1853, 8.29264], [33.18083, 8.13047], [33.08401, 8.05822], [33.0006, 7.90333], [33.04944, 7.78989], [33.24637, 7.77939], [33.32531, 7.71297], [33.44745, 7.7543], [33.71407, 7.65983], [33.87642, 7.5491], [34.02984, 7.36449], [34.03878, 7.27437], [34.01495, 7.25664], [34.19369, 7.12807], [34.19369, 7.04382], [34.35753, 6.91963], [34.47669, 6.91076], [34.53925, 6.82794], [34.53776, 6.74808], [34.65096, 6.72589], [34.77459, 6.5957], [34.87736, 6.60161], [35.01738, 6.46991], [34.96227, 6.26415], [35.00546, 5.89387], [35.12611, 5.68937], [35.13058, 5.62118], [35.31188, 5.50106], [35.29938, 5.34042], [35.50792, 5.42431], [35.8576, 5.33413], [35.81968, 5.10757], [35.82118, 4.77382], [35.9419, 4.61933], [35.95449, 4.53244], [36.03924, 4.44406], [36.84474, 4.44518], [37.07724, 4.33503], [38.14168, 3.62487], [38.45812, 3.60445], [38.52336, 3.62551], [38.91938, 3.51198], [39.07736, 3.5267], [39.19954, 3.47834], [39.49444, 3.45521], [39.51551, 3.40895], [39.55132, 3.39634], [39.58339, 3.47434], [39.76808, 3.67058], [39.86043, 3.86974], [40.77498, 4.27683], [41.1754, 3.94079], [41.89488, 3.97375], [42.07619, 4.17667], [42.55853, 4.20518], [42.84526, 4.28357], [42.97746, 4.44032], [43.04177, 4.57923], [43.40263, 4.79289], [44.02436, 4.9451], [44.98104, 4.91821], [47.97917, 8.00124], [47.92477, 8.00111], [46.99339, 7.9989], [44.19222, 8.93028], [43.32613, 9.59205], [43.23518, 9.84605], [43.0937, 9.90579], [42.87643, 10.18441], [42.69452, 10.62672], [42.95776, 10.98533], [42.79037, 10.98493], [42.75111, 11.06992], [42.62989, 11.09711], [42.42669, 10.98493], [42.13691, 10.97586], [42.06302, 10.92599], [41.80056, 10.97127], [41.8096, 11.33606], [41.77727, 11.49902], [41.82878, 11.72361], [41.95461, 11.81157], [42.4037, 12.46478]]]] } },
23157     { type: "Feature", properties: { iso1A2: "EU", iso1A3: "EUE", wikidata: "Q458", nameEn: "European Union", level: "union", isoStatus: "excRes" }, geometry: null },
23158     { type: "Feature", properties: { iso1A2: "FI", iso1A3: "FIN", iso1N3: "246", wikidata: "Q33", nameEn: "Finland", aliases: ["SF"] }, geometry: null },
23159     { type: "Feature", properties: { iso1A2: "FJ", iso1A3: "FJI", iso1N3: "242", wikidata: "Q712", nameEn: "Fiji", groups: ["054", "009", "UN"], driveSide: "left", callingCodes: ["679"] }, geometry: { type: "MultiPolygon", coordinates: [[[[174.245, -23.1974], [179.99999, -22.5], [179.99999, -11.5], [174, -11.5], [174.245, -23.1974]]], [[[-176.76826, -14.95183], [-180, -14.96041], [-180, -22.90585], [-176.74538, -22.89767], [-176.76826, -14.95183]]]] } },
23160     { type: "Feature", properties: { iso1A2: "FK", iso1A3: "FLK", iso1N3: "238", wikidata: "Q9648", nameEn: "Falkland Islands", country: "GB", groups: ["BOTS", "005", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["500"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.67376, -55.11859], [-54.56126, -51.26248], [-61.26735, -50.63919], [-63.67376, -55.11859]]]] } },
23161     { type: "Feature", properties: { iso1A2: "FM", iso1A3: "FSM", iso1N3: "583", wikidata: "Q702", nameEn: "Federated States of Micronesia", groups: ["057", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["691"] }, geometry: { type: "MultiPolygon", coordinates: [[[[138.20583, 13.3783], [136.27107, 6.73747], [156.88247, -1.39237], [165.19726, 6.22546], [138.20583, 13.3783]]]] } },
23162     { type: "Feature", properties: { iso1A2: "FO", iso1A3: "FRO", iso1N3: "234", wikidata: "Q4628", nameEn: "Faroe Islands", country: "DK", groups: ["154", "150", "UN"], callingCodes: ["298"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.51774, 62.35338], [-6.51083, 60.95272], [-5.70102, 62.77194], [-8.51774, 62.35338]]]] } },
23163     { type: "Feature", properties: { iso1A2: "FR", iso1A3: "FRA", iso1N3: "250", wikidata: "Q142", nameEn: "France" }, geometry: null },
23164     { type: "Feature", properties: { iso1A2: "FX", iso1A3: "FXX", iso1N3: "249", wikidata: "Q212429", nameEn: "Metropolitan France", country: "FR", groups: ["EU", "155", "150", "UN"], isoStatus: "excRes", callingCodes: ["33"] }, geometry: { type: "MultiPolygon", coordinates: [[[[2.55904, 51.07014], [2.18458, 51.52087], [1.17405, 50.74239], [-2.02963, 49.91866], [-2.09454, 49.46288], [-1.83944, 49.23037], [-2.00491, 48.86706], [-2.65349, 49.15373], [-6.28985, 48.93406], [-1.81005, 43.59738], [-1.77289, 43.38957], [-1.79319, 43.37497], [-1.78332, 43.36399], [-1.78714, 43.35476], [-1.77068, 43.34396], [-1.75334, 43.34107], [-1.75079, 43.3317], [-1.7397, 43.32979], [-1.73074, 43.29481], [-1.69407, 43.31378], [-1.62481, 43.30726], [-1.63052, 43.28591], [-1.61341, 43.25269], [-1.57674, 43.25269], [-1.55963, 43.28828], [-1.50992, 43.29481], [-1.45289, 43.27049], [-1.40942, 43.27272], [-1.3758, 43.24511], [-1.41562, 43.12815], [-1.47555, 43.08372], [-1.44067, 43.047], [-1.35272, 43.02658], [-1.34419, 43.09665], [-1.32209, 43.1127], [-1.27118, 43.11961], [-1.30052, 43.09581], [-1.30531, 43.06859], [-1.25244, 43.04164], [-1.22881, 43.05534], [-1.10333, 43.0059], [-1.00963, 42.99279], [-0.97133, 42.96239], [-0.81652, 42.95166], [-0.75478, 42.96916], [-0.72037, 42.92541], [-0.73422, 42.91228], [-0.72608, 42.89318], [-0.69837, 42.87945], [-0.67637, 42.88303], [-0.55497, 42.77846], [-0.50863, 42.82713], [-0.44334, 42.79939], [-0.41319, 42.80776], [-0.38833, 42.80132], [-0.3122, 42.84788], [-0.17939, 42.78974], [-0.16141, 42.79535], [-0.10519, 42.72761], [-0.02468, 42.68513], [0.17569, 42.73424], [0.25336, 42.7174], [0.29407, 42.67431], [0.36251, 42.72282], [0.40214, 42.69779], [0.67873, 42.69458], [0.65421, 42.75872], [0.66121, 42.84021], [0.711, 42.86372], [0.93089, 42.79154], [0.96166, 42.80629], [0.98292, 42.78754], [1.0804, 42.78569], [1.15928, 42.71407], [1.35562, 42.71944], [1.44197, 42.60217], [1.47986, 42.61346], [1.46718, 42.63296], [1.48043, 42.65203], [1.50867, 42.64483], [1.55418, 42.65669], [1.60085, 42.62703], [1.63485, 42.62957], [1.6625, 42.61982], [1.68267, 42.62533], [1.73452, 42.61515], [1.72588, 42.59098], [1.7858, 42.57698], [1.73683, 42.55492], [1.72515, 42.50338], [1.76335, 42.48863], [1.83037, 42.48395], [1.88853, 42.4501], [1.93663, 42.45439], [1.94292, 42.44316], [1.94061, 42.43333], [1.94084, 42.43039], [1.9574, 42.42401], [1.96482, 42.37787], [2.00488, 42.35399], [2.06241, 42.35906], [2.11621, 42.38393], [2.12789, 42.41291], [2.16599, 42.42314], [2.20578, 42.41633], [2.25551, 42.43757], [2.38504, 42.39977], [2.43299, 42.39423], [2.43508, 42.37568], [2.48457, 42.33933], [2.54382, 42.33406], [2.55516, 42.35351], [2.57934, 42.35808], [2.6747, 42.33974], [2.65311, 42.38771], [2.72056, 42.42298], [2.75497, 42.42578], [2.77464, 42.41046], [2.84335, 42.45724], [2.85675, 42.45444], [2.86983, 42.46843], [2.88413, 42.45938], [2.92107, 42.4573], [2.94283, 42.48174], [2.96518, 42.46692], [3.03734, 42.47363], [3.08167, 42.42748], [3.10027, 42.42621], [3.11379, 42.43646], [3.17156, 42.43545], [3.75438, 42.33445], [7.60802, 41.05927], [10.09675, 41.44089], [9.56115, 43.20816], [7.50102, 43.51859], [7.42422, 43.72209], [7.40903, 43.7296], [7.41113, 43.73156], [7.41291, 43.73168], [7.41298, 43.73311], [7.41233, 43.73439], [7.42062, 43.73977], [7.42299, 43.74176], [7.42443, 43.74087], [7.42809, 43.74396], [7.43013, 43.74895], [7.43624, 43.75014], [7.43708, 43.75197], [7.4389, 43.75151], [7.4379, 43.74963], [7.47823, 43.73341], [7.53006, 43.78405], [7.50423, 43.84345], [7.49355, 43.86551], [7.51162, 43.88301], [7.56075, 43.89932], [7.56858, 43.94506], [7.60771, 43.95772], [7.65266, 43.9763], [7.66848, 43.99943], [7.6597, 44.03009], [7.72508, 44.07578], [7.66878, 44.12795], [7.68694, 44.17487], [7.63245, 44.17877], [7.62155, 44.14881], [7.36364, 44.11882], [7.34547, 44.14359], [7.27827, 44.1462], [7.16929, 44.20352], [7.00764, 44.23736], [6.98221, 44.28289], [6.89171, 44.36637], [6.88784, 44.42043], [6.94504, 44.43112], [6.86233, 44.49834], [6.85507, 44.53072], [6.96042, 44.62129], [6.95133, 44.66264], [7.00582, 44.69364], [7.07484, 44.68073], [7.00401, 44.78782], [7.02217, 44.82519], [6.93499, 44.8664], [6.90774, 44.84322], [6.75518, 44.89915], [6.74519, 44.93661], [6.74791, 45.01939], [6.66981, 45.02324], [6.62803, 45.11175], [6.7697, 45.16044], [6.85144, 45.13226], [6.96706, 45.20841], [7.07074, 45.21228], [7.13115, 45.25386], [7.10572, 45.32924], [7.18019, 45.40071], [7.00037, 45.509], [6.98948, 45.63869], [6.80785, 45.71864], [6.80785, 45.83265], [6.95315, 45.85163], [7.04151, 45.92435], [7.00946, 45.9944], [6.93862, 46.06502], [6.87868, 46.03855], [6.89321, 46.12548], [6.78968, 46.14058], [6.86052, 46.28512], [6.77152, 46.34784], [6.8024, 46.39171], [6.82312, 46.42661], [6.53358, 46.45431], [6.25432, 46.3632], [6.21981, 46.31304], [6.24826, 46.30175], [6.25137, 46.29014], [6.23775, 46.27822], [6.24952, 46.26255], [6.26749, 46.24745], [6.29474, 46.26221], [6.31041, 46.24417], [6.29663, 46.22688], [6.27694, 46.21566], [6.26007, 46.21165], [6.24821, 46.20531], [6.23913, 46.20511], [6.23544, 46.20714], [6.22175, 46.20045], [6.22222, 46.19888], [6.21844, 46.19837], [6.21603, 46.19507], [6.21273, 46.19409], [6.21114, 46.1927], [6.20539, 46.19163], [6.19807, 46.18369], [6.19552, 46.18401], [6.18707, 46.17999], [6.18871, 46.16644], [6.18116, 46.16187], [6.15305, 46.15194], [6.13397, 46.1406], [6.09926, 46.14373], [6.09199, 46.15191], [6.07491, 46.14879], [6.05203, 46.15191], [6.04564, 46.14031], [6.03614, 46.13712], [6.01791, 46.14228], [5.9871, 46.14499], [5.97893, 46.13303], [5.95781, 46.12925], [5.9641, 46.14412], [5.97508, 46.15863], [5.98188, 46.17392], [5.98846, 46.17046], [5.99573, 46.18587], [5.96515, 46.19638], [5.97542, 46.21525], [6.02461, 46.23313], [6.03342, 46.2383], [6.04602, 46.23127], [6.05029, 46.23518], [6.0633, 46.24583], [6.07072, 46.24085], [6.08563, 46.24651], [6.10071, 46.23772], [6.12446, 46.25059], [6.11926, 46.2634], [6.1013, 46.28512], [6.11697, 46.29547], [6.1198, 46.31157], [6.13876, 46.33844], [6.15738, 46.3491], [6.16987, 46.36759], [6.15985, 46.37721], [6.15016, 46.3778], [6.09926, 46.40768], [6.06407, 46.41676], [6.08427, 46.44305], [6.07269, 46.46244], [6.1567, 46.54402], [6.11084, 46.57649], [6.27135, 46.68251], [6.38351, 46.73171], [6.45209, 46.77502], [6.43216, 46.80336], [6.46456, 46.88865], [6.43341, 46.92703], [6.71531, 47.0494], [6.68823, 47.06616], [6.76788, 47.1208], [6.8489, 47.15933], [6.9508, 47.24338], [6.95108, 47.26428], [6.94316, 47.28747], [7.05305, 47.33304], [7.0564, 47.35134], [7.03125, 47.36996], [6.87959, 47.35335], [6.88542, 47.37262], [6.93744, 47.40714], [6.93953, 47.43388], [7.0024, 47.45264], [6.98425, 47.49432], [7.0231, 47.50522], [7.07425, 47.48863], [7.12781, 47.50371], [7.16249, 47.49025], [7.19583, 47.49455], [7.17026, 47.44312], [7.24669, 47.4205], [7.33526, 47.44186], [7.35603, 47.43432], [7.40308, 47.43638], [7.43088, 47.45846], [7.4462, 47.46264], [7.4583, 47.47216], [7.42923, 47.48628], [7.43356, 47.49712], [7.47534, 47.47932], [7.51076, 47.49651], [7.49804, 47.51798], [7.5229, 47.51644], [7.53199, 47.5284], [7.51904, 47.53515], [7.50588, 47.52856], [7.49691, 47.53821], [7.50873, 47.54546], [7.51723, 47.54578], [7.52831, 47.55347], [7.53634, 47.55553], [7.55652, 47.56779], [7.55689, 47.57232], [7.56548, 47.57617], [7.56684, 47.57785], [7.58386, 47.57536], [7.58945, 47.59017], [7.59301, 47.60058], [7.58851, 47.60794], [7.57423, 47.61628], [7.5591, 47.63849], [7.53384, 47.65115], [7.52067, 47.66437], [7.51915, 47.68335], [7.51266, 47.70197], [7.53722, 47.71635], [7.54761, 47.72912], [7.52921, 47.77747], [7.55673, 47.87371], [7.62302, 47.97898], [7.56966, 48.03265], [7.57137, 48.12292], [7.6648, 48.22219], [7.69022, 48.30018], [7.74562, 48.32736], [7.73109, 48.39192], [7.76833, 48.48945], [7.80647, 48.51239], [7.80167, 48.54758], [7.80057, 48.5857], [7.84098, 48.64217], [7.89002, 48.66317], [7.96812, 48.72491], [7.96994, 48.75606], [8.01534, 48.76085], [8.0326, 48.79017], [8.06802, 48.78957], [8.10253, 48.81829], [8.12813, 48.87985], [8.19989, 48.95825], [8.20031, 48.95856], [8.22604, 48.97352], [8.14189, 48.97833], [7.97783, 49.03161], [7.93641, 49.05544], [7.86386, 49.03499], [7.79557, 49.06583], [7.75948, 49.04562], [7.63618, 49.05428], [7.62575, 49.07654], [7.56416, 49.08136], [7.53012, 49.09818], [7.49172, 49.13915], [7.49473, 49.17], [7.44455, 49.16765], [7.44052, 49.18354], [7.3662, 49.17308], [7.35995, 49.14399], [7.3195, 49.14231], [7.29514, 49.11426], [7.23473, 49.12971], [7.1593, 49.1204], [7.1358, 49.1282], [7.12504, 49.14253], [7.10384, 49.13787], [7.10715, 49.15631], [7.07859, 49.15031], [7.09007, 49.13094], [7.07162, 49.1255], [7.06642, 49.11415], [7.05548, 49.11185], [7.04843, 49.11422], [7.04409, 49.12123], [7.04662, 49.13724], [7.03178, 49.15734], [7.0274, 49.17042], [7.03459, 49.19096], [7.01318, 49.19018], [6.97273, 49.2099], [6.95963, 49.203], [6.94028, 49.21641], [6.93831, 49.2223], [6.91875, 49.22261], [6.89298, 49.20863], [6.85939, 49.22376], [6.83555, 49.21249], [6.85119, 49.20038], [6.85016, 49.19354], [6.86225, 49.18185], [6.84703, 49.15734], [6.83385, 49.15162], [6.78265, 49.16793], [6.73765, 49.16375], [6.71137, 49.18808], [6.73256, 49.20486], [6.71843, 49.2208], [6.69274, 49.21661], [6.66583, 49.28065], [6.60186, 49.31055], [6.572, 49.35027], [6.58807, 49.35358], [6.60091, 49.36864], [6.533, 49.40748], [6.55404, 49.42464], [6.42432, 49.47683], [6.40274, 49.46546], [6.39168, 49.4667], [6.38352, 49.46463], [6.36778, 49.46937], [6.3687, 49.4593], [6.28818, 49.48465], [6.27875, 49.503], [6.25029, 49.50609], [6.2409, 49.51408], [6.19543, 49.50536], [6.17386, 49.50934], [6.15366, 49.50226], [6.16115, 49.49297], [6.14321, 49.48796], [6.12814, 49.49365], [6.12346, 49.4735], [6.10325, 49.4707], [6.09845, 49.46351], [6.10072, 49.45268], [6.08373, 49.45594], [6.07887, 49.46399], [6.05553, 49.46663], [6.04176, 49.44801], [6.02743, 49.44845], [6.02648, 49.45451], [5.97693, 49.45513], [5.96876, 49.49053], [5.94224, 49.49608], [5.94128, 49.50034], [5.86571, 49.50015], [5.83389, 49.52152], [5.83467, 49.52717], [5.84466, 49.53027], [5.83648, 49.5425], [5.81664, 49.53775], [5.80871, 49.5425], [5.81838, 49.54777], [5.79195, 49.55228], [5.77435, 49.56298], [5.7577, 49.55915], [5.75649, 49.54321], [5.64505, 49.55146], [5.60909, 49.51228], [5.55001, 49.52729], [5.46541, 49.49825], [5.46734, 49.52648], [5.43713, 49.5707], [5.3974, 49.61596], [5.34837, 49.62889], [5.33851, 49.61599], [5.3137, 49.61225], [5.30214, 49.63055], [5.33039, 49.6555], [5.31465, 49.66846], [5.26232, 49.69456], [5.14545, 49.70287], [5.09249, 49.76193], [4.96714, 49.79872], [4.85464, 49.78995], [4.86965, 49.82271], [4.85134, 49.86457], [4.88529, 49.9236], [4.78827, 49.95609], [4.8382, 50.06738], [4.88602, 50.15182], [4.83279, 50.15331], [4.82438, 50.16878], [4.75237, 50.11314], [4.70064, 50.09384], [4.68695, 49.99685], [4.5414, 49.96911], [4.51098, 49.94659], [4.43488, 49.94122], [4.35051, 49.95315], [4.31963, 49.97043], [4.20532, 49.95803], [4.14239, 49.98034], [4.13508, 50.01976], [4.16294, 50.04719], [4.23101, 50.06945], [4.20147, 50.13535], [4.13561, 50.13078], [4.16014, 50.19239], [4.15524, 50.21103], [4.21945, 50.25539], [4.20651, 50.27333], [4.17861, 50.27443], [4.17347, 50.28838], [4.15524, 50.2833], [4.16808, 50.25786], [4.13665, 50.25609], [4.11954, 50.30425], [4.10957, 50.30234], [4.10237, 50.31247], [4.0689, 50.3254], [4.0268, 50.35793], [3.96771, 50.34989], [3.90781, 50.32814], [3.84314, 50.35219], [3.73911, 50.34809], [3.70987, 50.3191], [3.71009, 50.30305], [3.66976, 50.34563], [3.65709, 50.36873], [3.67262, 50.38663], [3.67494, 50.40239], [3.66153, 50.45165], [3.64426, 50.46275], [3.61014, 50.49568], [3.58361, 50.49049], [3.5683, 50.50192], [3.49509, 50.48885], [3.51564, 50.5256], [3.47385, 50.53397], [3.44629, 50.51009], [3.37693, 50.49538], [3.28575, 50.52724], [3.2729, 50.60718], [3.23951, 50.6585], [3.264, 50.67668], [3.2536, 50.68977], [3.26141, 50.69151], [3.26063, 50.70086], [3.24593, 50.71389], [3.22042, 50.71019], [3.20845, 50.71662], [3.19017, 50.72569], [3.20064, 50.73547], [3.18811, 50.74025], [3.18339, 50.74981], [3.16476, 50.76843], [3.15017, 50.79031], [3.1257, 50.78603], [3.11987, 50.79188], [3.11206, 50.79416], [3.10614, 50.78303], [3.09163, 50.77717], [3.04314, 50.77674], [3.00537, 50.76588], [2.96778, 50.75242], [2.95019, 50.75138], [2.90873, 50.702], [2.91036, 50.6939], [2.90069, 50.69263], [2.88504, 50.70656], [2.87937, 50.70298], [2.86985, 50.7033], [2.8483, 50.72276], [2.81056, 50.71773], [2.71165, 50.81295], [2.63331, 50.81457], [2.59093, 50.91751], [2.63074, 50.94746], [2.57551, 51.00326], [2.55904, 51.07014]], [[1.99838, 42.44682], [1.98378, 42.44697], [1.96125, 42.45364], [1.95606, 42.45785], [1.96215, 42.47854], [1.97003, 42.48081], [1.97227, 42.48487], [1.97697, 42.48568], [1.98022, 42.49569], [1.98916, 42.49351], [1.99766, 42.4858], [1.98579, 42.47486], [1.99216, 42.46208], [2.01564, 42.45171], [1.99838, 42.44682]]]] } },
23165     { type: "Feature", properties: { iso1A2: "GA", iso1A3: "GAB", iso1N3: "266", wikidata: "Q1000", nameEn: "Gabon", groups: ["017", "202", "002", "UN"], callingCodes: ["241"] }, geometry: { type: "MultiPolygon", coordinates: [[[[13.29457, 2.16106], [13.28534, 2.25716], [11.37116, 2.29975], [11.3561, 2.17217], [11.35307, 1.00251], [9.79648, 1.0019], [9.75065, 1.06753], [9.66433, 1.06723], [7.24416, -0.64092], [10.75913, -4.39519], [11.12647, -3.94169], [11.22301, -3.69888], [11.48764, -3.51089], [11.57949, -3.52798], [11.68608, -3.68942], [11.87083, -3.71571], [11.92719, -3.62768], [11.8318, -3.5812], [11.96554, -3.30267], [11.70227, -3.17465], [11.70558, -3.0773], [11.80365, -3.00424], [11.64798, -2.81146], [11.5359, -2.85654], [11.64487, -2.61865], [11.57637, -2.33379], [11.74605, -2.39936], [11.96866, -2.33559], [12.04895, -2.41704], [12.47925, -2.32626], [12.44656, -1.92025], [12.61312, -1.8129], [12.82172, -1.91091], [13.02759, -2.33098], [13.47977, -2.43224], [13.75884, -2.09293], [13.92073, -2.35581], [13.85846, -2.46935], [14.10442, -2.49268], [14.23829, -2.33715], [14.16202, -2.23916], [14.23518, -2.15671], [14.25932, -1.97624], [14.41838, -1.89412], [14.52569, -0.57818], [14.41887, -0.44799], [14.2165, -0.38261], [14.06862, -0.20826], [13.90632, -0.2287], [13.88648, 0.26652], [14.10909, 0.58563], [14.26066, 0.57255], [14.48179, 0.9152], [14.25186, 1.39842], [13.89582, 1.4261], [13.15519, 1.23368], [13.25447, 1.32339], [13.13461, 1.57238], [13.29457, 2.16106]]]] } },
23166     { type: "Feature", properties: { iso1A2: "GB", iso1A3: "GBR", iso1N3: "826", wikidata: "Q145", ccTLD: ".uk", nameEn: "United Kingdom", aliases: ["UK"] }, geometry: null },
23167     { type: "Feature", properties: { iso1A2: "GD", iso1A3: "GRD", iso1N3: "308", wikidata: "Q769", nameEn: "Grenada", aliases: ["WG"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 473"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.64026, 12.69984], [-61.77886, 11.36496], [-59.94058, 12.34011], [-62.64026, 12.69984]]]] } },
23168     { type: "Feature", properties: { iso1A2: "GE", iso1A3: "GEO", iso1N3: "268", wikidata: "Q230", nameEn: "Georgia", groups: ["145", "142", "UN"], callingCodes: ["995"] }, geometry: { type: "MultiPolygon", coordinates: [[[[46.42738, 41.91323], [45.61676, 42.20768], [45.78692, 42.48358], [45.36501, 42.55268], [45.15318, 42.70598], [44.88754, 42.74934], [44.80941, 42.61277], [44.70002, 42.74679], [44.54202, 42.75699], [43.95517, 42.55396], [43.73119, 42.62043], [43.81453, 42.74297], [43.0419, 43.02413], [43.03322, 43.08883], [42.75889, 43.19651], [42.66667, 43.13917], [42.40563, 43.23226], [41.64935, 43.22331], [40.65957, 43.56212], [40.10657, 43.57344], [40.04445, 43.47776], [40.03312, 43.44262], [40.01007, 43.42411], [40.01552, 43.42025], [40.00853, 43.40578], [40.0078, 43.38551], [39.81147, 43.06294], [40.89217, 41.72528], [41.54366, 41.52185], [41.7148, 41.4932], [41.7124, 41.47417], [41.81939, 41.43621], [41.95134, 41.52466], [42.26387, 41.49346], [42.51772, 41.43606], [42.59202, 41.58183], [42.72794, 41.59714], [42.84471, 41.58912], [42.78995, 41.50126], [42.84899, 41.47265], [42.8785, 41.50516], [43.02956, 41.37891], [43.21707, 41.30331], [43.13373, 41.25503], [43.1945, 41.25242], [43.23096, 41.17536], [43.36118, 41.2028], [43.44973, 41.17666], [43.4717, 41.12611], [43.67712, 41.13398], [43.74717, 41.1117], [43.84835, 41.16329], [44.16591, 41.19141], [44.18148, 41.24644], [44.32139, 41.2079], [44.34337, 41.20312], [44.34417, 41.2382], [44.46791, 41.18204], [44.59322, 41.1933], [44.61462, 41.24018], [44.72814, 41.20338], [44.82084, 41.21513], [44.87887, 41.20195], [44.89911, 41.21366], [44.84358, 41.23088], [44.81749, 41.23488], [44.80053, 41.25949], [44.81437, 41.30371], [44.93493, 41.25685], [45.0133, 41.29747], [45.09867, 41.34065], [45.1797, 41.42231], [45.26285, 41.46433], [45.31352, 41.47168], [45.4006, 41.42402], [45.45973, 41.45898], [45.68389, 41.3539], [45.71035, 41.36208], [45.75705, 41.35157], [45.69946, 41.29545], [45.80842, 41.2229], [45.95786, 41.17956], [46.13221, 41.19479], [46.27698, 41.19011], [46.37661, 41.10805], [46.456, 41.09984], [46.48558, 41.0576], [46.55096, 41.1104], [46.63969, 41.09515], [46.66148, 41.20533], [46.72375, 41.28609], [46.63658, 41.37727], [46.4669, 41.43331], [46.40307, 41.48464], [46.33925, 41.4963], [46.29794, 41.5724], [46.34126, 41.57454], [46.34039, 41.5947], [46.3253, 41.60912], [46.28182, 41.60089], [46.26531, 41.63339], [46.24429, 41.59883], [46.19759, 41.62327], [46.17891, 41.72094], [46.20538, 41.77205], [46.23962, 41.75811], [46.30863, 41.79133], [46.3984, 41.84399], [46.42738, 41.91323]]]] } },
23169     { type: "Feature", properties: { iso1A2: "GF", iso1A3: "GUF", iso1N3: "254", wikidata: "Q3769", nameEn: "French Guiana", country: "FR", groups: ["Q3320166", "EU", "005", "419", "019", "UN"], callingCodes: ["594"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-51.35485, 4.8383], [-53.7094, 6.2264], [-54.01074, 5.68785], [-54.01877, 5.52789], [-54.26916, 5.26909], [-54.4717, 4.91964], [-54.38444, 4.13222], [-54.19367, 3.84387], [-54.05128, 3.63557], [-53.98914, 3.627], [-53.9849, 3.58697], [-54.28534, 2.67798], [-54.42864, 2.42442], [-54.6084, 2.32856], [-54.16286, 2.10779], [-53.78743, 2.34412], [-52.96539, 2.1881], [-52.6906, 2.37298], [-52.31787, 3.17896], [-51.85573, 3.83427], [-51.82312, 3.85825], [-51.79599, 3.89336], [-51.61983, 4.14596], [-51.63798, 4.51394], [-51.35485, 4.8383]]]] } },
23170     { type: "Feature", properties: { iso1A2: "GG", iso1A3: "GGY", iso1N3: "831", wikidata: "Q25230", nameEn: "Bailiwick of Guernsey", country: "GB" }, geometry: null },
23171     { type: "Feature", properties: { iso1A2: "GH", iso1A3: "GHA", iso1N3: "288", wikidata: "Q117", nameEn: "Ghana", groups: ["011", "202", "002", "UN"], callingCodes: ["233"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-0.13493, 11.14075], [-0.27374, 11.17157], [-0.28566, 11.12713], [-0.35955, 11.07801], [-0.38219, 11.12596], [-0.42391, 11.11661], [-0.44298, 11.04292], [-0.61937, 10.91305], [-0.67143, 10.99811], [-2.83373, 11.0067], [-2.94232, 10.64281], [-2.83108, 10.40252], [-2.74174, 9.83172], [-2.76534, 9.56589], [-2.68802, 9.49343], [-2.69814, 9.22717], [-2.77799, 9.04949], [-2.66357, 9.01771], [-2.58243, 8.7789], [-2.49037, 8.20872], [-2.62901, 8.11495], [-2.61232, 8.02645], [-2.67787, 8.02055], [-2.74819, 7.92613], [-2.78395, 7.94974], [-2.79467, 7.86002], [-2.92339, 7.60847], [-2.97822, 7.27165], [-2.95438, 7.23737], [-3.23327, 6.81744], [-3.21954, 6.74407], [-3.25999, 6.62521], [-3.01896, 5.71697], [-2.95323, 5.71865], [-2.96671, 5.6415], [-2.93132, 5.62137], [-2.85378, 5.65156], [-2.76614, 5.60963], [-2.72737, 5.34789], [-2.77625, 5.34621], [-2.73074, 5.1364], [-2.75502, 5.10657], [-2.95261, 5.12477], [-2.96554, 5.10397], [-3.063, 5.13665], [-3.11073, 5.12675], [-3.10675, 5.08515], [-3.34019, 4.17519], [1.07031, 5.15655], [1.27574, 5.93551], [1.19771, 6.11522], [1.19966, 6.17069], [1.09187, 6.17074], [1.05969, 6.22998], [1.03108, 6.24064], [0.99652, 6.33779], [0.89283, 6.33779], [0.71048, 6.53083], [0.74862, 6.56517], [0.63659, 6.63857], [0.6497, 6.73682], [0.58176, 6.76049], [0.57406, 6.80348], [0.52853, 6.82921], [0.56508, 6.92971], [0.52098, 6.94391], [0.52217, 6.9723], [0.59606, 7.01252], [0.65327, 7.31643], [0.62943, 7.41099], [0.57223, 7.39326], [0.52455, 7.45354], [0.51979, 7.58706], [0.58295, 7.62368], [0.62943, 7.85751], [0.58891, 8.12779], [0.6056, 8.13959], [0.61156, 8.18324], [0.5913, 8.19622], [0.63897, 8.25873], [0.73432, 8.29529], [0.64731, 8.48866], [0.47211, 8.59945], [0.37319, 8.75262], [0.52455, 8.87746], [0.45424, 9.04581], [0.56388, 9.40697], [0.49118, 9.48339], [0.36485, 9.49749], [0.33148, 9.44812], [0.25758, 9.42696], [0.2254, 9.47869], [0.31241, 9.50337], [0.30406, 9.521], [0.2409, 9.52335], [0.23851, 9.57389], [0.38153, 9.58682], [0.36008, 9.6256], [0.29334, 9.59387], [0.26712, 9.66437], [0.28261, 9.69022], [0.32313, 9.6491], [0.34816, 9.66907], [0.34816, 9.71607], [0.32075, 9.72781], [0.36366, 10.03309], [0.41252, 10.02018], [0.41371, 10.06361], [0.35293, 10.09412], [0.39584, 10.31112], [0.33028, 10.30408], [0.29453, 10.41546], [0.18846, 10.4096], [0.12886, 10.53149], [-0.05945, 10.63458], [-0.09141, 10.7147], [-0.07327, 10.71845], [-0.07183, 10.76794], [-0.0228, 10.81916], [-0.02685, 10.8783], [-908e-5, 10.91644], [-63e-4, 10.96417], [0.03355, 10.9807], [0.02395, 11.06229], [342e-5, 11.08317], [-514e-5, 11.10763], [-0.0275, 11.11202], [-0.05733, 11.08628], [-0.14462, 11.10811], [-0.13493, 11.14075]]]] } },
23172     { type: "Feature", properties: { iso1A2: "GI", iso1A3: "GIB", iso1N3: "292", wikidata: "Q1410", nameEn: "Gibraltar", country: "GB", groups: ["Q12837", "BOTS", "039", "150", "UN"], callingCodes: ["350"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-5.34064, 36.03744], [-5.27801, 36.14942], [-5.33822, 36.15272], [-5.34536, 36.15501], [-5.40526, 36.15488], [-5.34064, 36.03744]]]] } },
23173     { type: "Feature", properties: { iso1A2: "GL", iso1A3: "GRL", iso1N3: "304", wikidata: "Q223", nameEn: "Greenland", country: "DK", groups: ["Q1451600", "021", "003", "019", "UN"], callingCodes: ["299"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-49.33696, 84.57952], [-68.21821, 80.48551], [-77.52957, 77.23408], [-46.37635, 57.3249], [-9.68082, 72.73731], [-5.7106, 84.28058], [-49.33696, 84.57952]]]] } },
23174     { type: "Feature", properties: { iso1A2: "GM", iso1A3: "GMB", iso1N3: "270", wikidata: "Q1005", nameEn: "The Gambia", groups: ["011", "202", "002", "UN"], callingCodes: ["220"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-15.14917, 13.57989], [-14.36795, 13.23033], [-13.79409, 13.34472], [-13.8955, 13.59126], [-14.34721, 13.46578], [-14.93719, 13.80173], [-15.36504, 13.79313], [-15.47902, 13.58758], [-17.43598, 13.59273], [-17.43966, 13.04579], [-16.74676, 13.06025], [-16.69343, 13.16791], [-15.80355, 13.16729], [-15.80478, 13.34832], [-15.26908, 13.37768], [-15.14917, 13.57989]]]] } },
23175     { type: "Feature", properties: { iso1A2: "GN", iso1A3: "GIN", iso1N3: "324", wikidata: "Q1006", nameEn: "Guinea", groups: ["011", "202", "002", "UN"], callingCodes: ["224"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-11.37536, 12.40788], [-11.46267, 12.44559], [-11.91331, 12.42008], [-12.35415, 12.32758], [-12.87336, 12.51892], [-13.06603, 12.49342], [-13.05296, 12.64003], [-13.70523, 12.68013], [-13.7039, 12.60313], [-13.65089, 12.49515], [-13.64168, 12.42764], [-13.70851, 12.24978], [-13.92745, 12.24077], [-13.94589, 12.16869], [-13.7039, 12.00869], [-13.7039, 11.70195], [-14.09799, 11.63649], [-14.26623, 11.67486], [-14.31513, 11.60713], [-14.51173, 11.49708], [-14.66677, 11.51188], [-14.77786, 11.36323], [-14.95993, 10.99244], [-15.07174, 10.89557], [-15.96748, 10.162], [-14.36218, 8.64107], [-13.29911, 9.04245], [-13.18586, 9.0925], [-13.08953, 9.0409], [-12.94095, 9.26335], [-12.76788, 9.3133], [-12.47254, 9.86834], [-12.24262, 9.92386], [-12.12634, 9.87203], [-11.91023, 9.93927], [-11.89624, 9.99763], [-11.2118, 10.00098], [-10.6534, 9.29919], [-10.74484, 9.07998], [-10.5783, 9.06386], [-10.56197, 8.81225], [-10.47707, 8.67669], [-10.61422, 8.5314], [-10.70565, 8.29235], [-10.63934, 8.35326], [-10.54891, 8.31174], [-10.37257, 8.48941], [-10.27575, 8.48711], [-10.203, 8.47991], [-10.14579, 8.52665], [-10.05375, 8.50697], [-10.05873, 8.42578], [-9.77763, 8.54633], [-9.47415, 8.35195], [-9.50898, 8.18455], [-9.41445, 8.02448], [-9.44928, 7.9284], [-9.35724, 7.74111], [-9.37465, 7.62032], [-9.48161, 7.37122], [-9.41943, 7.41809], [-9.305, 7.42056], [-9.20798, 7.38109], [-9.18311, 7.30461], [-9.09107, 7.1985], [-8.93435, 7.2824], [-8.85724, 7.26019], [-8.8448, 7.35149], [-8.72789, 7.51429], [-8.67814, 7.69428], [-8.55874, 7.70167], [-8.55874, 7.62525], [-8.47114, 7.55676], [-8.4003, 7.6285], [-8.21374, 7.54466], [-8.09931, 7.78626], [-8.13414, 7.87991], [-8.06449, 8.04989], [-7.94695, 8.00925], [-7.99919, 8.11023], [-7.98675, 8.20134], [-8.062, 8.16071], [-8.2411, 8.24196], [-8.22991, 8.48438], [-7.92518, 8.50652], [-7.65653, 8.36873], [-7.69882, 8.66148], [-7.95503, 8.81146], [-7.92518, 8.99332], [-7.73862, 9.08422], [-7.90777, 9.20456], [-7.85056, 9.41812], [-8.03463, 9.39604], [-8.14657, 9.55062], [-8.09434, 9.86936], [-8.15652, 9.94288], [-8.11921, 10.04577], [-8.01225, 10.1021], [-7.97971, 10.17117], [-7.9578, 10.2703], [-8.10207, 10.44649], [-8.22711, 10.41722], [-8.32614, 10.69273], [-8.2667, 10.91762], [-8.35083, 11.06234], [-8.66923, 10.99397], [-8.40058, 11.37466], [-8.80854, 11.66715], [-8.94784, 12.34842], [-9.13689, 12.50875], [-9.38067, 12.48446], [-9.32097, 12.29009], [-9.63938, 12.18312], [-9.714, 12.0226], [-10.30604, 12.24634], [-10.71897, 11.91552], [-10.80355, 12.1053], [-10.99758, 12.24634], [-11.24136, 12.01286], [-11.50006, 12.17826], [-11.37536, 12.40788]]]] } },
23176     { type: "Feature", properties: { iso1A2: "GP", iso1A3: "GLP", iso1N3: "312", wikidata: "Q17012", nameEn: "Guadeloupe", country: "FR", groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], callingCodes: ["590"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-60.03183, 16.1129], [-61.60296, 16.73066], [-63.00549, 15.26166], [-60.03183, 16.1129]]]] } },
23177     { type: "Feature", properties: { iso1A2: "GQ", iso1A3: "GNQ", iso1N3: "226", wikidata: "Q983", nameEn: "Equatorial Guinea", groups: ["017", "202", "002", "UN"], callingCodes: ["240"] }, geometry: { type: "MultiPolygon", coordinates: [[[[9.22018, 3.72052], [8.34397, 4.30689], [7.71762, 0.6674], [3.35016, -3.29031], [9.66433, 1.06723], [9.75065, 1.06753], [9.79648, 1.0019], [11.35307, 1.00251], [11.3561, 2.17217], [9.991, 2.16561], [9.90749, 2.20049], [9.89012, 2.20457], [9.84716, 2.24676], [9.83238, 2.29079], [9.83754, 2.32428], [9.82123, 2.35097], [9.81162, 2.33797], [9.22018, 3.72052]]]] } },
23178     { type: "Feature", properties: { iso1A2: "GR", iso1A3: "GRC", iso1N3: "300", wikidata: "Q41", nameEn: "Greece", aliases: ["EL"], groups: ["EU", "039", "150", "UN"], callingCodes: ["30"] }, geometry: { type: "MultiPolygon", coordinates: [[[[26.03489, 40.73051], [26.0754, 40.72772], [26.08638, 40.73214], [26.12495, 40.74283], [26.12854, 40.77339], [26.15685, 40.80709], [26.21351, 40.83298], [26.20856, 40.86048], [26.26169, 40.9168], [26.29441, 40.89119], [26.28623, 40.93005], [26.32259, 40.94042], [26.35894, 40.94292], [26.33297, 40.98388], [26.3606, 41.02027], [26.31928, 41.07386], [26.32259, 41.24929], [26.39861, 41.25053], [26.5209, 41.33993], [26.5837, 41.32131], [26.62997, 41.34613], [26.61767, 41.42281], [26.59742, 41.48058], [26.59196, 41.60491], [26.5209, 41.62592], [26.47958, 41.67037], [26.35957, 41.71149], [26.30255, 41.70925], [26.2654, 41.71544], [26.22888, 41.74139], [26.21325, 41.73223], [26.16841, 41.74858], [26.06148, 41.70345], [26.07083, 41.64584], [26.15146, 41.60828], [26.14328, 41.55496], [26.17951, 41.55409], [26.176, 41.50072], [26.14796, 41.47533], [26.20288, 41.43943], [26.16548, 41.42278], [26.12926, 41.35878], [25.87919, 41.30526], [25.8266, 41.34563], [25.70507, 41.29209], [25.66183, 41.31316], [25.61042, 41.30614], [25.55082, 41.31667], [25.52394, 41.2798], [25.48187, 41.28506], [25.28322, 41.23411], [25.11611, 41.34212], [24.942, 41.38685], [24.90928, 41.40876], [24.86136, 41.39298], [24.82514, 41.4035], [24.8041, 41.34913], [24.71529, 41.41928], [24.61129, 41.42278], [24.52599, 41.56808], [24.30513, 41.51297], [24.27124, 41.57682], [24.18126, 41.51735], [24.10063, 41.54796], [24.06323, 41.53222], [24.06908, 41.46132], [23.96975, 41.44118], [23.91483, 41.47971], [23.89613, 41.45257], [23.80148, 41.43943], [23.76525, 41.40175], [23.67644, 41.41139], [23.63203, 41.37632], [23.52453, 41.40262], [23.40416, 41.39999], [23.33639, 41.36317], [23.31301, 41.40525], [23.22771, 41.37106], [23.21953, 41.33773], [23.1833, 41.31755], [22.93334, 41.34104], [22.81199, 41.3398], [22.76408, 41.32225], [22.74538, 41.16321], [22.71266, 41.13945], [22.65306, 41.18168], [22.62852, 41.14385], [22.58295, 41.11568], [22.5549, 41.13065], [22.42285, 41.11921], [22.26744, 41.16409], [22.17629, 41.15969], [22.1424, 41.12449], [22.06527, 41.15617], [21.90869, 41.09191], [21.91102, 41.04786], [21.7556, 40.92525], [21.69601, 40.9429], [21.57448, 40.86076], [21.53007, 40.90759], [21.41555, 40.9173], [21.35595, 40.87578], [21.25779, 40.86165], [21.21105, 40.8855], [21.15262, 40.85546], [20.97887, 40.85475], [20.98396, 40.79109], [20.95752, 40.76982], [20.98134, 40.76046], [21.05833, 40.66586], [21.03932, 40.56299], [20.96908, 40.51526], [20.94925, 40.46625], [20.83688, 40.47882], [20.7906, 40.42726], [20.78234, 40.35803], [20.71789, 40.27739], [20.67162, 40.09433], [20.62566, 40.0897], [20.61081, 40.07866], [20.55593, 40.06524], [20.51297, 40.08168], [20.48487, 40.06271], [20.42373, 40.06777], [20.37911, 39.99058], [20.31135, 39.99438], [20.41546, 39.82832], [20.41475, 39.81437], [20.38572, 39.78516], [20.30804, 39.81563], [20.29152, 39.80421], [20.31961, 39.72799], [20.27412, 39.69884], [20.22707, 39.67459], [20.22376, 39.64532], [20.15988, 39.652], [20.12956, 39.65805], [20.05189, 39.69112], [20.00957, 39.69227], [19.98042, 39.6504], [19.92466, 39.69533], [19.97622, 39.78684], [19.95905, 39.82857], [19.0384, 40.35325], [19.20409, 39.7532], [22.5213, 33.45682], [29.73302, 35.92555], [29.69611, 36.10365], [29.61805, 36.14179], [29.61002, 36.1731], [29.48192, 36.18377], [29.30783, 36.01033], [28.23708, 36.56812], [27.95037, 36.46155], [27.89482, 36.69898], [27.46117, 36.53789], [27.24613, 36.71622], [27.45627, 36.9008], [27.20312, 36.94571], [27.14757, 37.32], [26.95583, 37.64989], [26.99377, 37.69034], [27.16428, 37.72343], [27.05537, 37.9131], [26.21136, 38.17558], [26.24183, 38.44695], [26.32173, 38.48731], [26.21136, 38.65436], [26.61814, 38.81372], [26.70773, 39.0312], [26.43357, 39.43096], [25.94257, 39.39358], [25.61285, 40.17161], [26.04292, 40.3958], [25.94795, 40.72797], [26.03489, 40.73051]]]] } },
23179     { type: "Feature", properties: { iso1A2: "GS", iso1A3: "SGS", iso1N3: "239", wikidata: "Q35086", nameEn: "South Georgia and South Sandwich Islands", country: "GB", groups: ["BOTS", "005", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["500"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-35.26394, -43.68272], [-53.39656, -59.87088], [-22.31757, -59.85974], [-35.26394, -43.68272]]]] } },
23180     { type: "Feature", properties: { iso1A2: "GT", iso1A3: "GTM", iso1N3: "320", wikidata: "Q774", nameEn: "Guatemala", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["502"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-89.14985, 17.81563], [-90.98678, 17.81655], [-90.99199, 17.25192], [-91.43809, 17.25373], [-91.04436, 16.92175], [-90.69064, 16.70697], [-90.61212, 16.49832], [-90.40499, 16.40524], [-90.44567, 16.07573], [-91.73182, 16.07371], [-92.20983, 15.26077], [-92.0621, 15.07406], [-92.1454, 14.98143], [-92.1423, 14.88647], [-92.18161, 14.84147], [-92.1454, 14.6804], [-92.2261, 14.53423], [-92.37213, 14.39277], [-90.55276, 12.8866], [-90.11344, 13.73679], [-90.10505, 13.85104], [-89.88937, 14.0396], [-89.81807, 14.07073], [-89.76103, 14.02923], [-89.73251, 14.04133], [-89.75569, 14.07073], [-89.70756, 14.1537], [-89.61844, 14.21937], [-89.52397, 14.22628], [-89.50614, 14.26084], [-89.58814, 14.33165], [-89.57441, 14.41637], [-89.39028, 14.44561], [-89.34776, 14.43013], [-89.35189, 14.47553], [-89.23719, 14.58046], [-89.15653, 14.57802], [-89.13132, 14.71582], [-89.23467, 14.85596], [-89.15149, 14.97775], [-89.18048, 14.99967], [-89.15149, 15.07392], [-88.97343, 15.14039], [-88.32467, 15.63665], [-88.31459, 15.66942], [-88.24022, 15.69247], [-88.22552, 15.72294], [-88.20359, 16.03858], [-88.40779, 16.09624], [-88.95358, 15.88698], [-89.02415, 15.9063], [-89.17418, 15.90898], [-89.22683, 15.88619], [-89.15025, 17.04813], [-89.14985, 17.81563]]]] } },
23181     { type: "Feature", properties: { iso1A2: "GU", iso1A3: "GUM", iso1N3: "316", wikidata: "Q16635", nameEn: "Guam", aliases: ["US-GU"], country: "US", groups: ["Q1352230", "Q153732", "057", "009", "UN"], roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 671"] }, geometry: { type: "MultiPolygon", coordinates: [[[[146.25931, 13.85876], [143.82485, 13.92273], [144.61642, 12.82462], [146.25931, 13.85876]]]] } },
23182     { type: "Feature", properties: { iso1A2: "GW", iso1A3: "GNB", iso1N3: "624", wikidata: "Q1007", nameEn: "Guinea-Bissau", groups: ["011", "202", "002", "UN"], callingCodes: ["245"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-14.31513, 11.60713], [-14.26623, 11.67486], [-14.09799, 11.63649], [-13.7039, 11.70195], [-13.7039, 12.00869], [-13.94589, 12.16869], [-13.92745, 12.24077], [-13.70851, 12.24978], [-13.64168, 12.42764], [-13.65089, 12.49515], [-13.7039, 12.60313], [-13.70523, 12.68013], [-15.17582, 12.6847], [-15.67302, 12.42974], [-16.20591, 12.46157], [-16.38191, 12.36449], [-16.70562, 12.34803], [-17.4623, 11.92379], [-15.96748, 10.162], [-15.07174, 10.89557], [-14.95993, 10.99244], [-14.77786, 11.36323], [-14.66677, 11.51188], [-14.51173, 11.49708], [-14.31513, 11.60713]]]] } },
23183     { type: "Feature", properties: { iso1A2: "GY", iso1A3: "GUY", iso1N3: "328", wikidata: "Q734", nameEn: "Guyana", groups: ["005", "419", "019", "UN"], driveSide: "left", callingCodes: ["592"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-56.84822, 6.73257], [-59.54058, 8.6862], [-59.98508, 8.53046], [-59.85562, 8.35213], [-59.80661, 8.28906], [-59.83156, 8.23261], [-59.97059, 8.20791], [-60.02407, 8.04557], [-60.38056, 7.8302], [-60.51959, 7.83373], [-60.64793, 7.56877], [-60.71923, 7.55817], [-60.59802, 7.33194], [-60.63367, 7.25061], [-60.54098, 7.14804], [-60.44116, 7.20817], [-60.28074, 7.1162], [-60.39419, 6.94847], [-60.54873, 6.8631], [-61.13632, 6.70922], [-61.20762, 6.58174], [-61.15058, 6.19558], [-61.4041, 5.95304], [-60.73204, 5.20931], [-60.32352, 5.21299], [-60.20944, 5.28754], [-59.98129, 5.07097], [-60.04189, 4.69801], [-60.15953, 4.53456], [-59.78878, 4.45637], [-59.69361, 4.34069], [-59.73353, 4.20399], [-59.51963, 3.91951], [-59.86899, 3.57089], [-59.79769, 3.37162], [-59.99733, 2.92312], [-59.91177, 2.36759], [-59.7264, 2.27497], [-59.74066, 1.87596], [-59.25583, 1.40559], [-58.92072, 1.31293], [-58.84229, 1.17749], [-58.53571, 1.29154], [-58.4858, 1.48399], [-58.33887, 1.58014], [-58.01873, 1.51966], [-57.97336, 1.64566], [-57.77281, 1.73344], [-57.55743, 1.69605], [-57.35073, 1.98327], [-57.23981, 1.95808], [-57.09109, 2.01854], [-57.07092, 1.95304], [-56.7659, 1.89509], [-56.47045, 1.95135], [-56.55439, 2.02003], [-56.70519, 2.02964], [-57.35891, 3.32121], [-58.0307, 3.95513], [-57.8699, 4.89394], [-57.37442, 5.0208], [-57.22536, 5.15605], [-57.31629, 5.33714], [-56.84822, 6.73257]]]] } },
23184     { type: "Feature", properties: { iso1A2: "HK", iso1A3: "HKG", iso1N3: "344", wikidata: "Q8646", nameEn: "Hong Kong", country: "CN", groups: ["030", "142", "UN"], driveSide: "left", callingCodes: ["852"] }, geometry: { type: "MultiPolygon", coordinates: [[[[113.92195, 22.13873], [114.50148, 22.15017], [114.44998, 22.55977], [114.25154, 22.55977], [114.22888, 22.5436], [114.22185, 22.55343], [114.20655, 22.55706], [114.18338, 22.55444], [114.17247, 22.55944], [114.1597, 22.56041], [114.15123, 22.55163], [114.1482, 22.54091], [114.13823, 22.54319], [114.12665, 22.54003], [114.11656, 22.53415], [114.11181, 22.52878], [114.1034, 22.5352], [114.09692, 22.53435], [114.09048, 22.53716], [114.08606, 22.53276], [114.07817, 22.52997], [114.07267, 22.51855], [114.06272, 22.51617], [114.05729, 22.51104], [114.05438, 22.5026], [114.03113, 22.5065], [113.86771, 22.42972], [113.81621, 22.2163], [113.83338, 22.1826], [113.92195, 22.13873]]]] } },
23185     { type: "Feature", properties: { iso1A2: "HM", iso1A3: "HMD", iso1N3: "334", wikidata: "Q131198", nameEn: "Heard Island and McDonald Islands", country: "AU", groups: ["053", "009", "UN"], driveSide: "left" }, geometry: { type: "MultiPolygon", coordinates: [[[[71.08716, -53.87687], [75.44182, -53.99822], [72.87012, -51.48322], [71.08716, -53.87687]]]] } },
23186     { type: "Feature", properties: { iso1A2: "HN", iso1A3: "HND", iso1N3: "340", wikidata: "Q783", nameEn: "Honduras", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["504"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-83.86109, 17.73736], [-88.20359, 16.03858], [-88.22552, 15.72294], [-88.24022, 15.69247], [-88.31459, 15.66942], [-88.32467, 15.63665], [-88.97343, 15.14039], [-89.15149, 15.07392], [-89.18048, 14.99967], [-89.15149, 14.97775], [-89.23467, 14.85596], [-89.13132, 14.71582], [-89.15653, 14.57802], [-89.23719, 14.58046], [-89.35189, 14.47553], [-89.34776, 14.43013], [-89.04187, 14.33644], [-88.94608, 14.20207], [-88.85785, 14.17763], [-88.815, 14.11652], [-88.73182, 14.10919], [-88.70661, 14.04317], [-88.49738, 13.97224], [-88.48982, 13.86458], [-88.25791, 13.91108], [-88.23018, 13.99915], [-88.07641, 13.98447], [-88.00331, 13.86948], [-87.7966, 13.91353], [-87.68821, 13.80829], [-87.73106, 13.75443], [-87.78148, 13.52906], [-87.71657, 13.50577], [-87.72115, 13.46083], [-87.73841, 13.44169], [-87.77354, 13.45767], [-87.83467, 13.44655], [-87.84675, 13.41078], [-87.80177, 13.35689], [-87.73714, 13.32715], [-87.69751, 13.25228], [-87.55124, 13.12523], [-87.37107, 12.98646], [-87.06306, 13.00892], [-87.03785, 12.98682], [-86.93197, 13.05313], [-86.93383, 13.18677], [-86.87066, 13.30641], [-86.71267, 13.30348], [-86.76812, 13.79605], [-86.35219, 13.77157], [-86.14801, 14.04317], [-86.00685, 14.08474], [-86.03458, 13.99181], [-85.75477, 13.8499], [-85.73964, 13.9698], [-85.45762, 14.11304], [-85.32149, 14.2562], [-85.18602, 14.24929], [-85.1575, 14.53934], [-84.90082, 14.80489], [-84.82596, 14.82212], [-84.70119, 14.68078], [-84.48373, 14.63249], [-84.10584, 14.76353], [-83.89551, 14.76697], [-83.62101, 14.89448], [-83.49268, 15.01158], [-83.13724, 15.00002], [-83.04763, 15.03256], [-82.06974, 14.49418], [-81.58685, 18.0025], [-83.86109, 17.73736]]]] } },
23187     { type: "Feature", properties: { iso1A2: "HR", iso1A3: "HRV", iso1N3: "191", wikidata: "Q224", nameEn: "Croatia", groups: ["EU", "039", "150", "UN"], callingCodes: ["385"] }, geometry: { type: "MultiPolygon", coordinates: [[[[17.6444, 42.88641], [17.5392, 42.92787], [17.70879, 42.97223], [17.64268, 43.08595], [17.46986, 43.16559], [17.286, 43.33065], [17.25579, 43.40353], [17.29699, 43.44542], [17.24411, 43.49376], [17.15828, 43.49376], [17.00585, 43.58037], [16.80736, 43.76011], [16.75316, 43.77157], [16.70922, 43.84887], [16.55472, 43.95326], [16.50528, 44.0244], [16.43629, 44.02826], [16.43662, 44.07523], [16.36864, 44.08263], [16.18688, 44.27012], [16.21346, 44.35231], [16.12969, 44.38275], [16.16814, 44.40679], [16.10566, 44.52586], [16.03012, 44.55572], [16.00884, 44.58605], [16.05828, 44.61538], [15.89348, 44.74964], [15.8255, 44.71501], [15.72584, 44.82334], [15.79472, 44.8455], [15.76096, 44.87045], [15.74723, 44.96818], [15.78568, 44.97401], [15.74585, 45.0638], [15.78842, 45.11519], [15.76371, 45.16508], [15.83512, 45.22459], [15.98412, 45.23088], [16.12153, 45.09616], [16.29036, 44.99732], [16.35404, 45.00241], [16.35863, 45.03529], [16.3749, 45.05206], [16.38219, 45.05139], [16.38309, 45.05955], [16.40023, 45.1147], [16.4634, 45.14522], [16.49155, 45.21153], [16.52982, 45.22713], [16.5501, 45.2212], [16.56559, 45.22307], [16.60194, 45.23042], [16.64962, 45.20714], [16.74845, 45.20393], [16.78219, 45.19002], [16.81137, 45.18434], [16.83804, 45.18951], [16.92405, 45.27607], [16.9385, 45.22742], [17.0415, 45.20759], [17.18438, 45.14764], [17.24325, 45.146], [17.25131, 45.14957], [17.26815, 45.18444], [17.32092, 45.16246], [17.33573, 45.14521], [17.41229, 45.13335], [17.4498, 45.16119], [17.45615, 45.12523], [17.47589, 45.12656], [17.51469, 45.10791], [17.59104, 45.10816], [17.66571, 45.13408], [17.84826, 45.04489], [17.87148, 45.04645], [17.93706, 45.08016], [17.97336, 45.12245], [17.97834, 45.13831], [17.99479, 45.14958], [18.01594, 45.15163], [18.03121, 45.12632], [18.1624, 45.07654], [18.24387, 45.13699], [18.32077, 45.1021], [18.41896, 45.11083], [18.47939, 45.05871], [18.65723, 45.07544], [18.78357, 44.97741], [18.80661, 44.93561], [18.76369, 44.93707], [18.76347, 44.90669], [18.8704, 44.85097], [19.01994, 44.85493], [18.98957, 44.90645], [19.02871, 44.92541], [19.06853, 44.89915], [19.15573, 44.95409], [19.05205, 44.97692], [19.1011, 45.01191], [19.07952, 45.14668], [19.14063, 45.12972], [19.19144, 45.17863], [19.43589, 45.17137], [19.41941, 45.23475], [19.28208, 45.23813], [19.10774, 45.29547], [18.97446, 45.37528], [18.99918, 45.49333], [19.08364, 45.48804], [19.07471, 45.53086], [18.94562, 45.53712], [18.88776, 45.57253], [18.96691, 45.66731], [18.90305, 45.71863], [18.85783, 45.85493], [18.81394, 45.91329], [18.80211, 45.87995], [18.6792, 45.92057], [18.57483, 45.80772], [18.44368, 45.73972], [18.12439, 45.78905], [18.08869, 45.76511], [17.99805, 45.79671], [17.87377, 45.78522], [17.66545, 45.84207], [17.56821, 45.93728], [17.35672, 45.95209], [17.14592, 46.16697], [16.8903, 46.28122], [16.8541, 46.36255], [16.7154, 46.39523], [16.6639, 46.45203], [16.59527, 46.47524], [16.52604, 46.47831], [16.5007, 46.49644], [16.44036, 46.5171], [16.38771, 46.53608], [16.37193, 46.55008], [16.29793, 46.5121], [16.26733, 46.51505], [16.26759, 46.50566], [16.23961, 46.49653], [16.25124, 46.48067], [16.27398, 46.42875], [16.27329, 46.41467], [16.30162, 46.40437], [16.30233, 46.37837], [16.18824, 46.38282], [16.14859, 46.40547], [16.05281, 46.39141], [16.05065, 46.3833], [16.07314, 46.36458], [16.07616, 46.3463], [15.97965, 46.30652], [15.79284, 46.25811], [15.78817, 46.21719], [15.75479, 46.20336], [15.75436, 46.21969], [15.67395, 46.22478], [15.6434, 46.21396], [15.64904, 46.19229], [15.59909, 46.14761], [15.6083, 46.11992], [15.62317, 46.09103], [15.72977, 46.04682], [15.71246, 46.01196], [15.70327, 46.00015], [15.70636, 45.92116], [15.67967, 45.90455], [15.68383, 45.88867], [15.68232, 45.86819], [15.70411, 45.8465], [15.66662, 45.84085], [15.64185, 45.82915], [15.57952, 45.84953], [15.52234, 45.82195], [15.47325, 45.8253], [15.47531, 45.79802], [15.40836, 45.79491], [15.25423, 45.72275], [15.30872, 45.69014], [15.34919, 45.71623], [15.4057, 45.64727], [15.38952, 45.63682], [15.34214, 45.64702], [15.34695, 45.63382], [15.31027, 45.6303], [15.27747, 45.60504], [15.29837, 45.5841], [15.30249, 45.53224], [15.38188, 45.48752], [15.33051, 45.45258], [15.27758, 45.46678], [15.16862, 45.42309], [15.05187, 45.49079], [15.02385, 45.48533], [14.92266, 45.52788], [14.90554, 45.47769], [14.81992, 45.45913], [14.80124, 45.49515], [14.71718, 45.53442], [14.68605, 45.53006], [14.69694, 45.57366], [14.59576, 45.62812], [14.60977, 45.66403], [14.57397, 45.67165], [14.53816, 45.6205], [14.5008, 45.60852], [14.49769, 45.54424], [14.36693, 45.48642], [14.32487, 45.47142], [14.27681, 45.4902], [14.26611, 45.48239], [14.24239, 45.50607], [14.22371, 45.50388], [14.20348, 45.46896], [14.07116, 45.48752], [14.00578, 45.52352], [13.96063, 45.50825], [13.99488, 45.47551], [13.97309, 45.45258], [13.90771, 45.45149], [13.88124, 45.42637], [13.81742, 45.43729], [13.7785, 45.46787], [13.67398, 45.4436], [13.62902, 45.45898], [13.56979, 45.4895], [13.45644, 45.59464], [13.05142, 45.33128], [13.12821, 44.48877], [16.15283, 42.18525], [18.45131, 42.21682], [18.54128, 42.39171], [18.52152, 42.42302], [18.43588, 42.48556], [18.44307, 42.51077], [18.43735, 42.55921], [18.36197, 42.61423], [18.24318, 42.6112], [17.88201, 42.83668], [17.80854, 42.9182], [17.7948, 42.89556], [17.68151, 42.92725], [17.6444, 42.88641]]]] } },
23188     { type: "Feature", properties: { iso1A2: "HT", iso1A3: "HTI", iso1N3: "332", wikidata: "Q790", nameEn: "Haiti", aliases: ["RH"], groups: ["029", "003", "419", "019", "UN"], callingCodes: ["509"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.71885, 18.78423], [-71.72624, 18.87802], [-71.77766, 18.95007], [-71.88102, 18.95007], [-71.74088, 19.0437], [-71.71088, 19.08353], [-71.69938, 19.10916], [-71.65337, 19.11759], [-71.62642, 19.21212], [-71.73229, 19.26686], [-71.77766, 19.33823], [-71.69448, 19.37866], [-71.6802, 19.45008], [-71.71268, 19.53374], [-71.71449, 19.55364], [-71.7429, 19.58445], [-71.75865, 19.70231], [-71.77419, 19.73128], [-72.38946, 20.27111], [-73.37289, 20.43199], [-74.7289, 18.71009], [-74.76465, 18.06252], [-72.29523, 17.48026], [-71.75671, 18.03456], [-71.73783, 18.07177], [-71.74994, 18.11115], [-71.75465, 18.14405], [-71.78271, 18.18302], [-71.69952, 18.34101], [-71.90875, 18.45821], [-71.88102, 18.50125], [-72.00201, 18.62312], [-71.95412, 18.64939], [-71.82556, 18.62551], [-71.71885, 18.78423]]]] } },
23189     { type: "Feature", properties: { iso1A2: "HU", iso1A3: "HUN", iso1N3: "348", wikidata: "Q28", nameEn: "Hungary", groups: ["EU", "151", "150", "UN"], callingCodes: ["36"] }, geometry: { type: "MultiPolygon", coordinates: [[[[21.72525, 48.34628], [21.67134, 48.3989], [21.6068, 48.50365], [21.44063, 48.58456], [21.11516, 48.49546], [20.83248, 48.5824], [20.5215, 48.53336], [20.29943, 48.26104], [20.24312, 48.2784], [19.92452, 48.1283], [19.63338, 48.25006], [19.52489, 48.19791], [19.47957, 48.09437], [19.28182, 48.08336], [19.23924, 48.0595], [19.01952, 48.07052], [18.82176, 48.04206], [18.76134, 47.97499], [18.76821, 47.87469], [18.8506, 47.82308], [18.74074, 47.8157], [18.66521, 47.76772], [18.56496, 47.76588], [18.29305, 47.73541], [18.02938, 47.75665], [17.71215, 47.7548], [17.23699, 48.02094], [17.16001, 48.00636], [17.09786, 47.97336], [17.11022, 47.92461], [17.08275, 47.87719], [17.00997, 47.86245], [17.07039, 47.81129], [17.05048, 47.79377], [17.08893, 47.70928], [16.87538, 47.68895], [16.86509, 47.72268], [16.82938, 47.68432], [16.7511, 47.67878], [16.72089, 47.73469], [16.65679, 47.74197], [16.61183, 47.76171], [16.54779, 47.75074], [16.53514, 47.73837], [16.55129, 47.72268], [16.4222, 47.66537], [16.58699, 47.61772], [16.64193, 47.63114], [16.71059, 47.52692], [16.64821, 47.50155], [16.6718, 47.46139], [16.57152, 47.40868], [16.52414, 47.41007], [16.49908, 47.39416], [16.45104, 47.41181], [16.47782, 47.25918], [16.44142, 47.25079], [16.43663, 47.21127], [16.41739, 47.20649], [16.42801, 47.18422], [16.4523, 47.18812], [16.46442, 47.16845], [16.44932, 47.14418], [16.52863, 47.13974], [16.46134, 47.09395], [16.52176, 47.05747], [16.43936, 47.03548], [16.51369, 47.00084], [16.28202, 47.00159], [16.27594, 46.9643], [16.22403, 46.939], [16.19904, 46.94134], [16.10983, 46.867], [16.14365, 46.8547], [16.15711, 46.85434], [16.21892, 46.86961], [16.2365, 46.87775], [16.2941, 46.87137], [16.34547, 46.83836], [16.3408, 46.80641], [16.31303, 46.79838], [16.30966, 46.7787], [16.37816, 46.69975], [16.42641, 46.69228], [16.41863, 46.66238], [16.38594, 46.6549], [16.39217, 46.63673], [16.50139, 46.56684], [16.52885, 46.53303], [16.52604, 46.5051], [16.59527, 46.47524], [16.6639, 46.45203], [16.7154, 46.39523], [16.8541, 46.36255], [16.8903, 46.28122], [17.14592, 46.16697], [17.35672, 45.95209], [17.56821, 45.93728], [17.66545, 45.84207], [17.87377, 45.78522], [17.99805, 45.79671], [18.08869, 45.76511], [18.12439, 45.78905], [18.44368, 45.73972], [18.57483, 45.80772], [18.6792, 45.92057], [18.80211, 45.87995], [18.81394, 45.91329], [18.99712, 45.93537], [19.01284, 45.96529], [19.0791, 45.96458], [19.10388, 46.04015], [19.14543, 45.9998], [19.28826, 45.99694], [19.52473, 46.1171], [19.56113, 46.16824], [19.66007, 46.19005], [19.81491, 46.1313], [19.93508, 46.17553], [20.01816, 46.17696], [20.03533, 46.14509], [20.09713, 46.17315], [20.26068, 46.12332], [20.28324, 46.1438], [20.35573, 46.16629], [20.45377, 46.14405], [20.49718, 46.18721], [20.63863, 46.12728], [20.76085, 46.21002], [20.74574, 46.25467], [20.86797, 46.28884], [21.06572, 46.24897], [21.16872, 46.30118], [21.28061, 46.44941], [21.26929, 46.4993], [21.33214, 46.63035], [21.43926, 46.65109], [21.5151, 46.72147], [21.48935, 46.7577], [21.52028, 46.84118], [21.59307, 46.86935], [21.59581, 46.91628], [21.68645, 46.99595], [21.648, 47.03902], [21.78395, 47.11104], [21.94463, 47.38046], [22.01055, 47.37767], [22.03389, 47.42508], [22.00917, 47.50492], [22.31816, 47.76126], [22.41979, 47.7391], [22.46559, 47.76583], [22.67247, 47.7871], [22.76617, 47.8417], [22.77991, 47.87211], [22.89849, 47.95851], [22.84276, 47.98602], [22.87847, 48.04665], [22.81804, 48.11363], [22.73427, 48.12005], [22.66835, 48.09162], [22.58733, 48.10813], [22.59007, 48.15121], [22.49806, 48.25189], [22.38133, 48.23726], [22.2083, 48.42534], [22.14689, 48.4005], [21.83339, 48.36242], [21.8279, 48.33321], [21.72525, 48.34628]]]] } },
23190     { type: "Feature", properties: { iso1A2: "IC", wikidata: "Q5813", nameEn: "Canary Islands", country: "ES", groups: ["Q3320166", "Q105472", "EU", "039", "150", "UN"], isoStatus: "excRes", callingCodes: ["34"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-12.00985, 30.24121], [-25.3475, 27.87574], [-14.43883, 27.02969], [-12.00985, 30.24121]]]] } },
23191     { type: "Feature", properties: { iso1A2: "ID", iso1A3: "IDN", iso1N3: "360", wikidata: "Q252", nameEn: "Indonesia", aliases: ["RI"] }, geometry: null },
23192     { type: "Feature", geometry: { type: "MultiPolygon", coordinates: [[[[-6.26218, 54.09785], [-6.29003, 54.11278], [-6.32694, 54.09337], [-6.36279, 54.11248], [-6.36605, 54.07234], [-6.47849, 54.06947], [-6.62842, 54.03503], [-6.66264, 54.0666], [-6.6382, 54.17071], [-6.70175, 54.20218], [-6.74575, 54.18788], [-6.81583, 54.22791], [-6.85179, 54.29176], [-6.87775, 54.34682], [-7.02034, 54.4212], [-7.19145, 54.31296], [-7.14908, 54.22732], [-7.25012, 54.20063], [-7.26316, 54.13863], [-7.29493, 54.12013], [-7.29687, 54.1354], [-7.28017, 54.16714], [-7.29157, 54.17191], [-7.34005, 54.14698], [-7.30553, 54.11869], [-7.32834, 54.11475], [-7.44567, 54.1539], [-7.4799, 54.12239], [-7.55812, 54.12239], [-7.69501, 54.20731], [-7.81397, 54.20159], [-7.8596, 54.21779], [-7.87101, 54.29299], [-8.04555, 54.36292], [-8.179, 54.46763], [-8.04538, 54.48941], [-7.99812, 54.54427], [-7.8596, 54.53671], [-7.70315, 54.62077], [-7.93293, 54.66603], [-7.83352, 54.73854], [-7.75041, 54.7103], [-7.64449, 54.75265], [-7.54671, 54.74606], [-7.54508, 54.79401], [-7.47626, 54.83084], [-7.4473, 54.87003], [-7.44404, 54.9403], [-7.40004, 54.94498], [-7.4033, 55.00391], [-7.34464, 55.04688], [-7.2471, 55.06933], [-6.34755, 55.49206], [-7.75229, 55.93854], [-11.75, 54], [-11, 51], [-6.03913, 51.13217], [-5.37267, 53.63269], [-6.26218, 54.09785]]]] }, properties: { iso1A2: "IE", iso1A3: "IRL", iso1N3: "372", wikidata: "Q27", nameEn: "Republic of Ireland", groups: ["EU", "Q22890", "154", "150", "UN"], driveSide: "left", callingCodes: ["353"] } },
23193     { type: "Feature", properties: { iso1A2: "IL", iso1A3: "ISR", iso1N3: "376", wikidata: "Q801", nameEn: "Israel", groups: ["145", "142", "UN"], callingCodes: ["972"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.052, 31.46619], [34.29262, 31.70393], [34.48681, 31.59711], [34.56797, 31.54197], [34.48892, 31.48365], [34.40077, 31.40926], [34.36505, 31.36404], [34.37381, 31.30598], [34.36523, 31.28963], [34.29417, 31.24194], [34.26742, 31.21998], [34.92298, 29.45305], [34.97718, 29.54294], [34.98207, 29.58147], [35.02147, 29.66343], [35.14108, 30.07374], [35.19183, 30.34636], [35.16218, 30.43535], [35.19595, 30.50297], [35.21379, 30.60401], [35.29311, 30.71365], [35.33456, 30.81224], [35.33984, 30.8802], [35.41371, 30.95565], [35.43658, 31.12444], [35.40316, 31.25535], [35.47672, 31.49578], [35.39675, 31.49572], [35.22921, 31.37445], [35.13033, 31.3551], [35.02459, 31.35979], [34.92571, 31.34337], [34.88932, 31.37093], [34.87833, 31.39321], [34.89756, 31.43891], [34.93258, 31.47816], [34.94356, 31.50743], [34.9415, 31.55601], [34.95249, 31.59813], [35.00879, 31.65426], [35.08226, 31.69107], [35.10782, 31.71594], [35.11895, 31.71454], [35.12933, 31.7325], [35.13931, 31.73012], [35.15119, 31.73634], [35.15474, 31.73352], [35.16478, 31.73242], [35.18023, 31.72067], [35.20538, 31.72388], [35.21937, 31.71578], [35.22392, 31.71899], [35.23972, 31.70896], [35.24315, 31.71244], [35.2438, 31.7201], [35.24981, 31.72543], [35.25182, 31.73945], [35.26319, 31.74846], [35.25225, 31.7678], [35.26058, 31.79064], [35.25573, 31.81362], [35.26404, 31.82567], [35.251, 31.83085], [35.25753, 31.8387], [35.24816, 31.8458], [35.2304, 31.84222], [35.2249, 31.85433], [35.22817, 31.8638], [35.22567, 31.86745], [35.22294, 31.87889], [35.22014, 31.88264], [35.2136, 31.88241], [35.21276, 31.88153], [35.21016, 31.88237], [35.20945, 31.8815], [35.20791, 31.8821], [35.20673, 31.88151], [35.20381, 31.86716], [35.21128, 31.863], [35.216, 31.83894], [35.21469, 31.81835], [35.19461, 31.82687], [35.18169, 31.82542], [35.18603, 31.80901], [35.14174, 31.81325], [35.07677, 31.85627], [35.05617, 31.85685], [35.01978, 31.82944], [34.9724, 31.83352], [34.99712, 31.85569], [35.03489, 31.85919], [35.03978, 31.89276], [35.03489, 31.92448], [35.00124, 31.93264], [34.98682, 31.96935], [35.00261, 32.027], [34.9863, 32.09551], [34.99437, 32.10962], [34.98507, 32.12606], [34.99039, 32.14626], [34.96009, 32.17503], [34.95703, 32.19522], [34.98885, 32.20758], [35.01841, 32.23981], [35.02939, 32.2671], [35.01119, 32.28684], [35.01772, 32.33863], [35.04243, 32.35008], [35.05142, 32.3667], [35.0421, 32.38242], [35.05311, 32.4024], [35.05423, 32.41754], [35.07059, 32.4585], [35.08564, 32.46948], [35.09236, 32.47614], [35.10024, 32.47856], [35.10882, 32.4757], [35.15937, 32.50466], [35.2244, 32.55289], [35.25049, 32.52453], [35.29306, 32.50947], [35.30685, 32.51024], [35.35212, 32.52047], [35.40224, 32.50136], [35.42034, 32.46009], [35.41598, 32.45593], [35.41048, 32.43706], [35.42078, 32.41562], [35.55807, 32.38674], [35.55494, 32.42687], [35.57485, 32.48669], [35.56614, 32.64393], [35.59813, 32.65159], [35.61669, 32.67999], [35.66527, 32.681], [35.68467, 32.70715], [35.75983, 32.74803], [35.78745, 32.77938], [35.83758, 32.82817], [35.84021, 32.8725], [35.87012, 32.91976], [35.89298, 32.9456], [35.87188, 32.98028], [35.84802, 33.1031], [35.81911, 33.11077], [35.81911, 33.1336], [35.84285, 33.16673], [35.83846, 33.19397], [35.81647, 33.2028], [35.81295, 33.24841], [35.77513, 33.27342], [35.813, 33.3172], [35.77477, 33.33609], [35.62019, 33.27278], [35.62283, 33.24226], [35.58502, 33.26653], [35.58326, 33.28381], [35.56523, 33.28969], [35.55555, 33.25844], [35.54544, 33.25513], [35.54808, 33.236], [35.5362, 33.23196], [35.54228, 33.19865], [35.52573, 33.11921], [35.50335, 33.114], [35.50272, 33.09056], [35.448, 33.09264], [35.43059, 33.06659], [35.35223, 33.05617], [35.31429, 33.10515], [35.1924, 33.08743], [35.10645, 33.09318], [34.78515, 33.20368], [33.62659, 31.82938], [34.052, 31.46619]]]] } },
23194     { type: "Feature", properties: { iso1A2: "IM", iso1A3: "IMN", iso1N3: "833", wikidata: "Q9676", nameEn: "Isle of Man", country: "GB", groups: ["Q185086", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01624", "44 07624", "44 07524", "44 07924"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-3.98763, 54.07351], [-4.1819, 54.57861], [-5.6384, 53.81157], [-3.98763, 54.07351]]]] } },
23195     { type: "Feature", properties: { iso1A2: "IN", iso1A3: "IND", iso1N3: "356", wikidata: "Q668", nameEn: "India" }, geometry: null },
23196     { type: "Feature", properties: { iso1A2: "IO", iso1A3: "IOT", iso1N3: "086", wikidata: "Q43448", nameEn: "British Indian Ocean Territory", country: "GB" }, geometry: null },
23197     { type: "Feature", properties: { iso1A2: "IQ", iso1A3: "IRQ", iso1N3: "368", wikidata: "Q796", nameEn: "Iraq", groups: ["145", "142", "UN"], callingCodes: ["964"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.78887, 37.38615], [42.56725, 37.14878], [42.35724, 37.10998], [42.36697, 37.0627], [41.81736, 36.58782], [41.40058, 36.52502], [41.28864, 36.35368], [41.2564, 36.06012], [41.37027, 35.84095], [41.38184, 35.62502], [41.26569, 35.42708], [41.21654, 35.1508], [41.2345, 34.80049], [41.12388, 34.65742], [40.97676, 34.39788], [40.64314, 34.31604], [38.79171, 33.37328], [39.08202, 32.50304], [38.98762, 32.47694], [39.04251, 32.30203], [39.26157, 32.35555], [39.29903, 32.23259], [40.01521, 32.05667], [42.97601, 30.72204], [42.97796, 30.48295], [44.72255, 29.19736], [46.42415, 29.05947], [46.5527, 29.10283], [46.89695, 29.50584], [47.15166, 30.01044], [47.37192, 30.10421], [47.7095, 30.10453], [48.01114, 29.98906], [48.06782, 30.02906], [48.17332, 30.02448], [48.40479, 29.85763], [48.59531, 29.66815], [48.83867, 29.78572], [48.61441, 29.93675], [48.51011, 29.96238], [48.44785, 30.00148], [48.4494, 30.04456], [48.43384, 30.08233], [48.38869, 30.11062], [48.38714, 30.13485], [48.41671, 30.17254], [48.41117, 30.19846], [48.26393, 30.3408], [48.24385, 30.33846], [48.21279, 30.31644], [48.19425, 30.32796], [48.18321, 30.39703], [48.14585, 30.44133], [48.02443, 30.4789], [48.03221, 30.9967], [47.68219, 31.00004], [47.6804, 31.39086], [47.86337, 31.78422], [47.64771, 32.07666], [47.52474, 32.15972], [47.57144, 32.20583], [47.37529, 32.47808], [47.17218, 32.45393], [46.46788, 32.91992], [46.32298, 32.9731], [46.17198, 32.95612], [46.09103, 32.98354], [46.15175, 33.07229], [46.03966, 33.09577], [46.05367, 33.13097], [46.11905, 33.11924], [46.20623, 33.20395], [45.99919, 33.5082], [45.86687, 33.49263], [45.96183, 33.55751], [45.89801, 33.63661], [45.77814, 33.60938], [45.50261, 33.94968], [45.42789, 33.9458], [45.41077, 33.97421], [45.47264, 34.03099], [45.56176, 34.15088], [45.58667, 34.30147], [45.53552, 34.35148], [45.49171, 34.3439], [45.46697, 34.38221], [45.43879, 34.45949], [45.51883, 34.47692], [45.53219, 34.60441], [45.59074, 34.55558], [45.60224, 34.55057], [45.73923, 34.54416], [45.70031, 34.69277], [45.65672, 34.7222], [45.68284, 34.76624], [45.70031, 34.82322], [45.73641, 34.83975], [45.79682, 34.85133], [45.78904, 34.91135], [45.86532, 34.89858], [45.89477, 34.95805], [45.87864, 35.03441], [45.92173, 35.0465], [45.92203, 35.09538], [45.93108, 35.08148], [45.94756, 35.09188], [46.06508, 35.03699], [46.07747, 35.0838], [46.11763, 35.07551], [46.19116, 35.11097], [46.15642, 35.1268], [46.16229, 35.16984], [46.19738, 35.18536], [46.18457, 35.22561], [46.11367, 35.23729], [46.15474, 35.2883], [46.13152, 35.32548], [46.05358, 35.38568], [45.98453, 35.49848], [46.01518, 35.52012], [45.97584, 35.58132], [46.03028, 35.57416], [46.01307, 35.59756], [46.0165, 35.61501], [45.99452, 35.63574], [46.0117, 35.65059], [46.01631, 35.69139], [46.23736, 35.71414], [46.34166, 35.78363], [46.32921, 35.82655], [46.17198, 35.8013], [46.08325, 35.8581], [45.94711, 35.82218], [45.89784, 35.83708], [45.81442, 35.82107], [45.76145, 35.79898], [45.6645, 35.92872], [45.60018, 35.96069], [45.55245, 35.99943], [45.46594, 36.00042], [45.38275, 35.97156], [45.33916, 35.99424], [45.37652, 36.06222], [45.37312, 36.09917], [45.32235, 36.17383], [45.30038, 36.27769], [45.26261, 36.3001], [45.27394, 36.35846], [45.23953, 36.43257], [45.11811, 36.40751], [45.00759, 36.5402], [45.06985, 36.62645], [45.06985, 36.6814], [45.01537, 36.75128], [44.84725, 36.77622], [44.83479, 36.81362], [44.90173, 36.86096], [44.91199, 36.91468], [44.89862, 37.01897], [44.81611, 37.04383], [44.75229, 37.11958], [44.78319, 37.1431], [44.76698, 37.16162], [44.63179, 37.19229], [44.42631, 37.05825], [44.38117, 37.05825], [44.35315, 37.04955], [44.35937, 37.02843], [44.30645, 36.97373], [44.25975, 36.98119], [44.18503, 37.09551], [44.22239, 37.15756], [44.27998, 37.16501], [44.2613, 37.25055], [44.13521, 37.32486], [44.02002, 37.33229], [43.90949, 37.22453], [43.84878, 37.22205], [43.82699, 37.19477], [43.8052, 37.22825], [43.7009, 37.23692], [43.63085, 37.21957], [43.56702, 37.25675], [43.50787, 37.24436], [43.33508, 37.33105], [43.30083, 37.30629], [43.11403, 37.37436], [42.93705, 37.32015], [42.78887, 37.38615]]]] } },
23198     { type: "Feature", properties: { iso1A2: "IR", iso1A3: "IRN", iso1N3: "364", wikidata: "Q794", nameEn: "Iran", groups: ["034", "142", "UN"], callingCodes: ["98"] }, geometry: { type: "MultiPolygon", coordinates: [[[[44.96746, 39.42998], [44.88916, 39.59653], [44.81043, 39.62677], [44.71806, 39.71124], [44.65422, 39.72163], [44.6137, 39.78393], [44.47298, 39.68788], [44.48111, 39.61579], [44.41849, 39.56659], [44.42832, 39.4131], [44.37921, 39.4131], [44.29818, 39.378], [44.22452, 39.4169], [44.03667, 39.39223], [44.1043, 39.19842], [44.20946, 39.13975], [44.18863, 38.93881], [44.30322, 38.81581], [44.26155, 38.71427], [44.28065, 38.6465], [44.32058, 38.62752], [44.3207, 38.49799], [44.3119, 38.37887], [44.38309, 38.36117], [44.44386, 38.38295], [44.50115, 38.33939], [44.42476, 38.25763], [44.22509, 37.88859], [44.3883, 37.85433], [44.45948, 37.77065], [44.55498, 37.783], [44.62096, 37.71985], [44.56887, 37.6429], [44.61401, 37.60165], [44.58449, 37.45018], [44.81021, 37.2915], [44.75986, 37.21549], [44.7868, 37.16644], [44.78319, 37.1431], [44.75229, 37.11958], [44.81611, 37.04383], [44.89862, 37.01897], [44.91199, 36.91468], [44.90173, 36.86096], [44.83479, 36.81362], [44.84725, 36.77622], [45.01537, 36.75128], [45.06985, 36.6814], [45.06985, 36.62645], [45.00759, 36.5402], [45.11811, 36.40751], [45.23953, 36.43257], [45.27394, 36.35846], [45.26261, 36.3001], [45.30038, 36.27769], [45.32235, 36.17383], [45.37312, 36.09917], [45.37652, 36.06222], [45.33916, 35.99424], [45.38275, 35.97156], [45.46594, 36.00042], [45.55245, 35.99943], [45.60018, 35.96069], [45.6645, 35.92872], [45.76145, 35.79898], [45.81442, 35.82107], [45.89784, 35.83708], [45.94711, 35.82218], [46.08325, 35.8581], [46.17198, 35.8013], [46.32921, 35.82655], [46.34166, 35.78363], [46.23736, 35.71414], [46.01631, 35.69139], [46.0117, 35.65059], [45.99452, 35.63574], [46.0165, 35.61501], [46.01307, 35.59756], [46.03028, 35.57416], [45.97584, 35.58132], [46.01518, 35.52012], [45.98453, 35.49848], [46.05358, 35.38568], [46.13152, 35.32548], [46.15474, 35.2883], [46.11367, 35.23729], [46.18457, 35.22561], [46.19738, 35.18536], [46.16229, 35.16984], [46.15642, 35.1268], [46.19116, 35.11097], [46.11763, 35.07551], [46.07747, 35.0838], [46.06508, 35.03699], [45.94756, 35.09188], [45.93108, 35.08148], [45.92203, 35.09538], [45.92173, 35.0465], [45.87864, 35.03441], [45.89477, 34.95805], [45.86532, 34.89858], [45.78904, 34.91135], [45.79682, 34.85133], [45.73641, 34.83975], [45.70031, 34.82322], [45.68284, 34.76624], [45.65672, 34.7222], [45.70031, 34.69277], [45.73923, 34.54416], [45.60224, 34.55057], [45.59074, 34.55558], [45.53219, 34.60441], [45.51883, 34.47692], [45.43879, 34.45949], [45.46697, 34.38221], [45.49171, 34.3439], [45.53552, 34.35148], [45.58667, 34.30147], [45.56176, 34.15088], [45.47264, 34.03099], [45.41077, 33.97421], [45.42789, 33.9458], [45.50261, 33.94968], [45.77814, 33.60938], [45.89801, 33.63661], [45.96183, 33.55751], [45.86687, 33.49263], [45.99919, 33.5082], [46.20623, 33.20395], [46.11905, 33.11924], [46.05367, 33.13097], [46.03966, 33.09577], [46.15175, 33.07229], [46.09103, 32.98354], [46.17198, 32.95612], [46.32298, 32.9731], [46.46788, 32.91992], [47.17218, 32.45393], [47.37529, 32.47808], [47.57144, 32.20583], [47.52474, 32.15972], [47.64771, 32.07666], [47.86337, 31.78422], [47.6804, 31.39086], [47.68219, 31.00004], [48.03221, 30.9967], [48.02443, 30.4789], [48.14585, 30.44133], [48.18321, 30.39703], [48.19425, 30.32796], [48.21279, 30.31644], [48.24385, 30.33846], [48.26393, 30.3408], [48.41117, 30.19846], [48.41671, 30.17254], [48.38714, 30.13485], [48.38869, 30.11062], [48.43384, 30.08233], [48.4494, 30.04456], [48.44785, 30.00148], [48.51011, 29.96238], [48.61441, 29.93675], [48.83867, 29.78572], [49.98877, 27.87827], [50.37726, 27.89227], [54.39838, 25.68383], [55.14145, 25.62624], [55.81777, 26.18798], [56.2644, 26.58649], [56.68954, 26.76645], [56.79239, 26.41236], [56.82555, 25.7713], [56.86325, 25.03856], [61.46682, 24.57869], [61.6433, 25.27541], [61.683, 25.66638], [61.83968, 25.7538], [61.83831, 26.07249], [61.89391, 26.26251], [62.05117, 26.31647], [62.21304, 26.26601], [62.31484, 26.528], [62.77352, 26.64099], [63.1889, 26.65072], [63.18688, 26.83844], [63.25005, 26.84212], [63.25005, 27.08692], [63.32283, 27.14437], [63.19649, 27.25674], [62.80604, 27.22412], [62.79684, 27.34381], [62.84905, 27.47627], [62.7638, 28.02992], [62.79412, 28.28108], [62.59499, 28.24842], [62.40259, 28.42703], [61.93581, 28.55284], [61.65978, 28.77937], [61.53765, 29.00507], [61.31508, 29.38903], [60.87231, 29.86514], [61.80829, 30.84224], [61.78268, 30.92724], [61.8335, 30.97669], [61.83257, 31.0452], [61.80957, 31.12576], [61.80569, 31.16167], [61.70929, 31.37391], [60.84541, 31.49561], [60.86191, 32.22565], [60.56485, 33.12944], [60.88908, 33.50219], [60.91133, 33.55596], [60.69573, 33.56054], [60.57762, 33.59772], [60.5485, 33.73422], [60.5838, 33.80793], [60.50209, 34.13992], [60.66502, 34.31539], [60.91321, 34.30411], [60.72316, 34.52857], [60.99922, 34.63064], [61.00197, 34.70631], [61.06926, 34.82139], [61.12831, 35.09938], [61.0991, 35.27845], [61.18187, 35.30249], [61.27371, 35.61482], [61.22719, 35.67038], [61.26152, 35.80749], [61.22444, 35.92879], [61.12007, 35.95992], [61.22719, 36.12759], [61.1393, 36.38782], [61.18187, 36.55348], [61.14516, 36.64644], [60.34767, 36.63214], [60.00768, 37.04102], [59.74678, 37.12499], [59.55178, 37.13594], [59.39385, 37.34257], [59.39797, 37.47892], [59.33507, 37.53146], [59.22905, 37.51161], [58.9338, 37.67374], [58.6921, 37.64548], [58.5479, 37.70526], [58.47786, 37.6433], [58.39959, 37.63134], [58.22999, 37.6856], [58.21399, 37.77281], [57.79534, 37.89299], [57.35042, 37.98546], [57.37236, 38.09321], [57.21169, 38.28965], [57.03453, 38.18717], [56.73928, 38.27887], [56.62255, 38.24005], [56.43303, 38.26054], [56.32454, 38.18502], [56.33278, 38.08132], [55.97847, 38.08024], [55.76561, 38.12238], [55.44152, 38.08564], [55.13412, 37.94705], [54.851, 37.75739], [54.77684, 37.62264], [54.81804, 37.61285], [54.77822, 37.51597], [54.67247, 37.43532], [54.58664, 37.45809], [54.36211, 37.34912], [54.24565, 37.32047], [53.89734, 37.3464], [48.88288, 38.43975], [48.84969, 38.45015], [48.81072, 38.44853], [48.78979, 38.45026], [48.70001, 38.40564], [48.62217, 38.40198], [48.58793, 38.45076], [48.45084, 38.61013], [48.3146, 38.59958], [48.24773, 38.71883], [48.02581, 38.82705], [48.01409, 38.90333], [48.07734, 38.91616], [48.08627, 38.94434], [48.28437, 38.97186], [48.33884, 39.03022], [48.31239, 39.09278], [48.15361, 39.19419], [48.12404, 39.25208], [48.15984, 39.30028], [48.37385, 39.37584], [48.34264, 39.42935], [47.98977, 39.70999], [47.84774, 39.66285], [47.50099, 39.49615], [47.38978, 39.45999], [47.31301, 39.37492], [47.05927, 39.24846], [47.05771, 39.20143], [46.95341, 39.13505], [46.92539, 39.16644], [46.83822, 39.13143], [46.75752, 39.03231], [46.53497, 38.86548], [46.34059, 38.92076], [46.20601, 38.85262], [46.14785, 38.84206], [46.06766, 38.87861], [46.00228, 38.87376], [45.94624, 38.89072], [45.90266, 38.87739], [45.83883, 38.90768], [45.65172, 38.95199], [45.6155, 38.94304], [45.6131, 38.964], [45.44966, 38.99243], [45.44811, 39.04927], [45.40452, 39.07224], [45.40148, 39.09007], [45.30489, 39.18333], [45.16168, 39.21952], [45.08751, 39.35052], [45.05932, 39.36435], [44.96746, 39.42998]]]] } },
23199     { type: "Feature", properties: { iso1A2: "IS", iso1A3: "ISL", iso1N3: "352", wikidata: "Q189", nameEn: "Iceland", groups: ["154", "150", "UN"], callingCodes: ["354"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-33.15676, 62.62995], [-8.25539, 63.0423], [-15.70914, 69.67442], [-33.15676, 62.62995]]]] } },
23200     { type: "Feature", properties: { iso1A2: "IT", iso1A3: "ITA", iso1N3: "380", wikidata: "Q38", nameEn: "Italy", groups: ["EU", "039", "150", "UN"], callingCodes: ["39"] }, geometry: { type: "MultiPolygon", coordinates: [[[[8.95861, 45.96485], [8.97604, 45.96151], [8.97741, 45.98317], [8.96668, 45.98436], [8.95861, 45.96485]]], [[[7.63035, 43.57419], [9.56115, 43.20816], [10.09675, 41.44089], [7.60802, 41.05927], [7.89009, 38.19924], [11.2718, 37.6713], [12.13667, 34.20326], [14.02721, 36.53141], [17.67657, 35.68918], [18.83516, 40.36999], [16.15283, 42.18525], [13.12821, 44.48877], [13.05142, 45.33128], [13.45644, 45.59464], [13.6076, 45.64761], [13.7198, 45.59352], [13.74587, 45.59811], [13.78445, 45.5825], [13.84106, 45.58185], [13.86771, 45.59898], [13.8695, 45.60835], [13.9191, 45.6322], [13.87933, 45.65207], [13.83422, 45.68703], [13.83332, 45.70855], [13.8235, 45.7176], [13.66986, 45.79955], [13.59784, 45.8072], [13.58858, 45.83503], [13.57563, 45.8425], [13.58644, 45.88173], [13.59565, 45.89446], [13.60857, 45.89907], [13.61931, 45.91782], [13.63815, 45.93607], [13.6329, 45.94894], [13.64307, 45.98326], [13.63458, 45.98947], [13.62074, 45.98388], [13.58903, 45.99009], [13.56759, 45.96991], [13.52963, 45.96588], [13.50104, 45.98078], [13.47474, 46.00546], [13.49702, 46.01832], [13.50998, 46.04498], [13.49568, 46.04839], [13.50104, 46.05986], [13.57072, 46.09022], [13.64053, 46.13587], [13.66472, 46.17392], [13.64451, 46.18966], [13.56682, 46.18703], [13.56114, 46.2054], [13.47587, 46.22725], [13.42218, 46.20758], [13.37671, 46.29668], [13.44808, 46.33507], [13.43418, 46.35992], [13.47019, 46.3621], [13.5763, 46.40915], [13.5763, 46.42613], [13.59777, 46.44137], [13.68684, 46.43881], [13.7148, 46.5222], [13.64088, 46.53438], [13.27627, 46.56059], [12.94445, 46.60401], [12.59992, 46.6595], [12.38708, 46.71529], [12.27591, 46.88651], [12.2006, 46.88854], [12.11675, 47.01241], [12.21781, 47.03996], [12.19254, 47.09331], [11.74789, 46.98484], [11.50739, 47.00644], [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.54783, 46.84505], [10.47197, 46.85698], [10.38659, 46.67847], [10.40475, 46.63671], [10.44686, 46.64162], [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.14439, 46.22992], [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.25502, 46.43743], [9.29226, 46.32717], [9.24503, 46.23616], [9.01618, 46.04928], [8.99257, 45.9698], [9.09065, 45.89906], [9.06642, 45.8761], [9.04546, 45.84968], [9.04059, 45.8464], [9.03505, 45.83976], [9.03793, 45.83548], [9.03279, 45.82865], [9.0298, 45.82127], [9.00324, 45.82055], [8.99663, 45.83466], [8.9621, 45.83707], [8.94737, 45.84285], [8.91129, 45.8388], [8.93504, 45.86245], [8.94372, 45.86587], [8.93649, 45.86775], [8.88904, 45.95465], [8.86688, 45.96135], [8.85121, 45.97239], [8.8319, 45.9879], [8.79362, 45.99207], [8.78585, 45.98973], [8.79414, 46.00913], [8.85617, 46.0748], [8.80778, 46.10085], [8.75697, 46.10395], [8.62242, 46.12112], [8.45032, 46.26869], [8.46317, 46.43712], [8.42464, 46.46367], [8.30648, 46.41587], [8.31162, 46.38044], [8.08814, 46.26692], [8.16866, 46.17817], [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], [7.07074, 45.21228], [6.96706, 45.20841], [6.85144, 45.13226], [6.7697, 45.16044], [6.62803, 45.11175], [6.66981, 45.02324], [6.74791, 45.01939], [6.74519, 44.93661], [6.75518, 44.89915], [6.90774, 44.84322], [6.93499, 44.8664], [7.02217, 44.82519], [7.00401, 44.78782], [7.07484, 44.68073], [7.00582, 44.69364], [6.95133, 44.66264], [6.96042, 44.62129], [6.85507, 44.53072], [6.86233, 44.49834], [6.94504, 44.43112], [6.88784, 44.42043], [6.89171, 44.36637], [6.98221, 44.28289], [7.00764, 44.23736], [7.16929, 44.20352], [7.27827, 44.1462], [7.34547, 44.14359], [7.36364, 44.11882], [7.62155, 44.14881], [7.63245, 44.17877], [7.68694, 44.17487], [7.66878, 44.12795], [7.72508, 44.07578], [7.6597, 44.03009], [7.66848, 43.99943], [7.65266, 43.9763], [7.60771, 43.95772], [7.56858, 43.94506], [7.56075, 43.89932], [7.51162, 43.88301], [7.49355, 43.86551], [7.50423, 43.84345], [7.53006, 43.78405], [7.63035, 43.57419]], [[12.45181, 41.90056], [12.44834, 41.90095], [12.44582, 41.90194], [12.44815, 41.90326], [12.44984, 41.90545], [12.45091, 41.90625], [12.45543, 41.90738], [12.45561, 41.90629], [12.45762, 41.9058], [12.45755, 41.9033], [12.45826, 41.90281], [12.45834, 41.90174], [12.4577, 41.90115], [12.45691, 41.90125], [12.45626, 41.90172], [12.45435, 41.90143], [12.45446, 41.90028], [12.45181, 41.90056]], [[12.45648, 43.89369], [12.44184, 43.90498], [12.41641, 43.89991], [12.40935, 43.9024], [12.41233, 43.90956], [12.40733, 43.92379], [12.41551, 43.92984], [12.41165, 43.93769], [12.40506, 43.94325], [12.40415, 43.95485], [12.41414, 43.95273], [12.42005, 43.9578], [12.43662, 43.95698], [12.44684, 43.96597], [12.46205, 43.97463], [12.47853, 43.98052], [12.49406, 43.98492], [12.50678, 43.99113], [12.51463, 43.99122], [12.5154, 43.98508], [12.51064, 43.98165], [12.51109, 43.97201], [12.50622, 43.97131], [12.50875, 43.96198], [12.50655, 43.95796], [12.51427, 43.94897], [12.51553, 43.94096], [12.50496, 43.93017], [12.50269, 43.92363], [12.49724, 43.92248], [12.49247, 43.91774], [12.49429, 43.90973], [12.48771, 43.89706], [12.45648, 43.89369]]]] } },
23201     { type: "Feature", properties: { iso1A2: "JE", iso1A3: "JEY", iso1N3: "832", wikidata: "Q785", nameEn: "Bailiwick of Jersey", country: "GB", groups: ["830", "Q185086", "154", "150", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["44 01534"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.00491, 48.86706], [-1.83944, 49.23037], [-2.09454, 49.46288], [-2.65349, 49.15373], [-2.00491, 48.86706]]]] } },
23202     { type: "Feature", properties: { iso1A2: "JM", iso1A3: "JAM", iso1N3: "388", wikidata: "Q766", nameEn: "Jamaica", aliases: ["JA"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 876", "1 658"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-74.09729, 17.36817], [-78.9741, 19.59515], [-78.34606, 16.57862], [-74.09729, 17.36817]]]] } },
23203     { type: "Feature", properties: { iso1A2: "JO", iso1A3: "JOR", iso1N3: "400", wikidata: "Q810", nameEn: "Jordan", groups: ["145", "142", "UN"], callingCodes: ["962"] }, geometry: { type: "MultiPolygon", coordinates: [[[[39.04251, 32.30203], [38.98762, 32.47694], [39.08202, 32.50304], [38.79171, 33.37328], [36.83946, 32.31293], [36.40959, 32.37908], [36.23948, 32.50108], [36.20875, 32.49529], [36.20379, 32.52751], [36.08074, 32.51463], [36.02239, 32.65911], [35.96633, 32.66237], [35.93307, 32.71966], [35.88405, 32.71321], [35.75983, 32.74803], [35.68467, 32.70715], [35.66527, 32.681], [35.61669, 32.67999], [35.59813, 32.65159], [35.56614, 32.64393], [35.57485, 32.48669], [35.55494, 32.42687], [35.55807, 32.38674], [35.57111, 32.21877], [35.52012, 32.04076], [35.54375, 31.96587], [35.52758, 31.9131], [35.55941, 31.76535], [35.47672, 31.49578], [35.40316, 31.25535], [35.43658, 31.12444], [35.41371, 30.95565], [35.33984, 30.8802], [35.33456, 30.81224], [35.29311, 30.71365], [35.21379, 30.60401], [35.19595, 30.50297], [35.16218, 30.43535], [35.19183, 30.34636], [35.14108, 30.07374], [35.02147, 29.66343], [34.98207, 29.58147], [34.97718, 29.54294], [34.92298, 29.45305], [34.8812, 29.36878], [36.07081, 29.18469], [36.50005, 29.49696], [36.75083, 29.86903], [37.4971, 29.99949], [37.66395, 30.33245], [37.99354, 30.49998], [36.99791, 31.50081], [38.99233, 31.99721], [39.29903, 32.23259], [39.26157, 32.35555], [39.04251, 32.30203]]]] } },
23204     { type: "Feature", properties: { iso1A2: "JP", iso1A3: "JPN", iso1N3: "392", wikidata: "Q17", nameEn: "Japan", groups: ["030", "142", "UN"], driveSide: "left", callingCodes: ["81"] }, geometry: { type: "MultiPolygon", coordinates: [[[[145.82361, 43.38904], [145.23667, 43.76813], [145.82343, 44.571], [140.9182, 45.92937], [133.61399, 37.41], [129.2669, 34.87122], [122.26612, 25.98197], [123.92912, 17.8782], [155.16731, 23.60141], [145.82361, 43.38904]]]] } },
23205     { type: "Feature", properties: { iso1A2: "KE", iso1A3: "KEN", iso1N3: "404", wikidata: "Q114", nameEn: "Kenya", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["254"] }, geometry: { type: "MultiPolygon", coordinates: [[[[35.9419, 4.61933], [35.51424, 4.61643], [35.42366, 4.76969], [35.47843, 4.91872], [35.30992, 4.90402], [35.34151, 5.02364], [34.47601, 4.72162], [33.9873, 4.23316], [34.06046, 4.15235], [34.15429, 3.80464], [34.45815, 3.67385], [34.44922, 3.51627], [34.39112, 3.48802], [34.41794, 3.44342], [34.40006, 3.37949], [34.45815, 3.18319], [34.56242, 3.11478], [34.60114, 2.93034], [34.65774, 2.8753], [34.73967, 2.85447], [34.78137, 2.76223], [34.77244, 2.70272], [34.95267, 2.47209], [34.90947, 2.42447], [34.98692, 1.97348], [34.9899, 1.6668], [34.92734, 1.56109], [34.87819, 1.5596], [34.7918, 1.36752], [34.82606, 1.30944], [34.82606, 1.26626], [34.80223, 1.22754], [34.67562, 1.21265], [34.58029, 1.14712], [34.57427, 1.09868], [34.52369, 1.10692], [34.43349, 0.85254], [34.40041, 0.80266], [34.31516, 0.75693], [34.27345, 0.63182], [34.20196, 0.62289], [34.13493, 0.58118], [34.11408, 0.48884], [34.08727, 0.44713], [34.10067, 0.36372], [33.90936, 0.10581], [33.98449, -0.13079], [33.9264, -0.54188], [33.93107, -0.99298], [34.02286, -1.00779], [34.03084, -1.05101], [34.0824, -1.02264], [37.67199, -3.06222], [37.71745, -3.304], [37.5903, -3.42735], [37.63099, -3.50723], [37.75036, -3.54243], [37.81321, -3.69179], [39.21631, -4.67835], [39.44306, -4.93877], [39.62121, -4.68136], [41.75542, -1.85308], [41.56362, -1.66375], [41.56, -1.59812], [41.00099, -0.83068], [40.98767, 2.82959], [41.31368, 3.14314], [41.89488, 3.97375], [41.1754, 3.94079], [40.77498, 4.27683], [39.86043, 3.86974], [39.76808, 3.67058], [39.58339, 3.47434], [39.55132, 3.39634], [39.51551, 3.40895], [39.49444, 3.45521], [39.19954, 3.47834], [39.07736, 3.5267], [38.91938, 3.51198], [38.52336, 3.62551], [38.45812, 3.60445], [38.14168, 3.62487], [37.07724, 4.33503], [36.84474, 4.44518], [36.03924, 4.44406], [35.95449, 4.53244], [35.9419, 4.61933]]]] } },
23206     { type: "Feature", properties: { iso1A2: "KG", iso1A3: "KGZ", iso1N3: "417", wikidata: "Q813", nameEn: "Kyrgyzstan", groups: ["143", "142", "UN"], callingCodes: ["996"] }, geometry: { type: "MultiPolygon", coordinates: [[[[74.88756, 42.98612], [74.75, 42.99029], [74.70331, 43.02519], [74.64615, 43.05881], [74.57491, 43.13702], [74.22489, 43.24657], [73.55634, 43.03071], [73.50992, 42.82356], [73.44393, 42.43098], [71.88792, 42.83578], [71.62405, 42.76613], [71.53272, 42.8014], [71.2724, 42.77853], [71.22785, 42.69248], [71.17807, 42.67381], [71.15232, 42.60486], [70.97717, 42.50147], [70.85973, 42.30188], [70.94483, 42.26238], [71.13263, 42.28356], [71.28719, 42.18033], [70.69777, 41.92554], [70.17682, 41.5455], [70.48909, 41.40335], [70.67586, 41.47953], [70.78572, 41.36419], [70.77885, 41.24813], [70.86263, 41.23833], [70.9615, 41.16393], [71.02193, 41.19494], [71.11806, 41.15359], [71.25813, 41.18796], [71.27187, 41.11015], [71.34877, 41.16807], [71.40198, 41.09436], [71.46148, 41.13958], [71.43814, 41.19644], [71.46688, 41.31883], [71.57227, 41.29175], [71.6787, 41.42111], [71.65914, 41.49599], [71.73054, 41.54713], [71.71132, 41.43012], [71.76625, 41.4466], [71.83914, 41.3546], [71.91457, 41.2982], [71.85964, 41.19081], [72.07249, 41.11739], [72.10745, 41.15483], [72.16433, 41.16483], [72.17594, 41.15522], [72.14864, 41.13363], [72.1792, 41.10621], [72.21061, 41.05607], [72.17594, 41.02377], [72.18339, 40.99571], [72.324, 41.03381], [72.34026, 41.04539], [72.34757, 41.06104], [72.36138, 41.04384], [72.38511, 41.02785], [72.45206, 41.03018], [72.48742, 40.97136], [72.55109, 40.96046], [72.59136, 40.86947], [72.68157, 40.84942], [72.84291, 40.85512], [72.94454, 40.8094], [73.01869, 40.84681], [73.13267, 40.83512], [73.13412, 40.79122], [73.0612, 40.76678], [72.99133, 40.76457], [72.93296, 40.73089], [72.8722, 40.71111], [72.85372, 40.7116], [72.84754, 40.67229], [72.80137, 40.67856], [72.74866, 40.60873], [72.74894, 40.59592], [72.75982, 40.57273], [72.74862, 40.57131], [72.74768, 40.58051], [72.73995, 40.58409], [72.69579, 40.59778], [72.66713, 40.59076], [72.66713, 40.5219], [72.47795, 40.5532], [72.40517, 40.61917], [72.34406, 40.60144], [72.41714, 40.55736], [72.38384, 40.51535], [72.41513, 40.50856], [72.44191, 40.48222], [72.40346, 40.4007], [72.24368, 40.46091], [72.18648, 40.49893], [71.96401, 40.31907], [72.05464, 40.27586], [71.85002, 40.25647], [71.82646, 40.21872], [71.73054, 40.14818], [71.71719, 40.17886], [71.69621, 40.18492], [71.70569, 40.20391], [71.68386, 40.26984], [71.61931, 40.26775], [71.61725, 40.20615], [71.51549, 40.22986], [71.51215, 40.26943], [71.4246, 40.28619], [71.36663, 40.31593], [71.13042, 40.34106], [71.05901, 40.28765], [70.95789, 40.28761], [70.9818, 40.22392], [70.80495, 40.16813], [70.7928, 40.12797], [70.65827, 40.0981], [70.65946, 39.9878], [70.58912, 39.95211], [70.55033, 39.96619], [70.47557, 39.93216], [70.57384, 39.99394], [70.58297, 40.00891], [70.01283, 40.23288], [69.67001, 40.10639], [69.64704, 40.12165], [69.57615, 40.10524], [69.55555, 40.12296], [69.53794, 40.11833], [69.53855, 40.0887], [69.5057, 40.03277], [69.53615, 39.93991], [69.43557, 39.92877], [69.43134, 39.98431], [69.35649, 40.01994], [69.26938, 39.8127], [69.3594, 39.52516], [69.68677, 39.59281], [69.87491, 39.53882], [70.11111, 39.58223], [70.2869, 39.53141], [70.44757, 39.60128], [70.64087, 39.58792], [70.7854, 39.38933], [71.06418, 39.41586], [71.08752, 39.50704], [71.49814, 39.61397], [71.55856, 39.57588], [71.5517, 39.45722], [71.62688, 39.44056], [71.76816, 39.45456], [71.80164, 39.40631], [71.7522, 39.32031], [71.79202, 39.27355], [71.90601, 39.27674], [72.04059, 39.36704], [72.09689, 39.26823], [72.17242, 39.2661], [72.23834, 39.17248], [72.33173, 39.33093], [72.62027, 39.39696], [72.85934, 39.35116], [73.18454, 39.35536], [73.31912, 39.38615], [73.45096, 39.46677], [73.59831, 39.46425], [73.87018, 39.47879], [73.94683, 39.60733], [73.92354, 39.69565], [73.9051, 39.75073], [73.83006, 39.76136], [73.97049, 40.04378], [74.25533, 40.13191], [74.35063, 40.09742], [74.69875, 40.34668], [74.85996, 40.32857], [74.78168, 40.44886], [74.82013, 40.52197], [75.08243, 40.43945], [75.22834, 40.45382], [75.5854, 40.66874], [75.69663, 40.28642], [75.91361, 40.2948], [75.96168, 40.38064], [76.33659, 40.3482], [76.5261, 40.46114], [76.75681, 40.95354], [76.99302, 41.0696], [77.28004, 41.0033], [77.3693, 41.0375], [77.52723, 41.00227], [77.76206, 41.01574], [77.81287, 41.14307], [78.12873, 41.23091], [78.15757, 41.38565], [78.3732, 41.39603], [79.92977, 42.04113], [80.17842, 42.03211], [80.17807, 42.21166], [79.97364, 42.42816], [79.52921, 42.44778], [79.19763, 42.804], [78.91502, 42.76839], [78.48469, 42.89649], [75.82823, 42.94848], [75.72174, 42.79672], [75.29966, 42.86183], [75.22619, 42.85528], [74.88756, 42.98612]], [[70.74189, 39.86319], [70.63105, 39.77923], [70.59667, 39.83542], [70.54998, 39.85137], [70.52631, 39.86989], [70.53651, 39.89155], [70.74189, 39.86319]], [[71.86463, 39.98598], [71.84316, 39.95582], [71.7504, 39.93701], [71.71511, 39.96348], [71.78838, 40.01404], [71.86463, 39.98598]], [[71.21139, 40.03369], [71.1427, 39.95026], [71.23067, 39.93581], [71.16101, 39.88423], [71.10531, 39.91354], [71.04979, 39.89808], [71.10501, 39.95568], [71.09063, 39.99], [71.11668, 39.99291], [71.11037, 40.01984], [71.01035, 40.05481], [71.00236, 40.18154], [71.06305, 40.1771], [71.12218, 40.03052], [71.21139, 40.03369]]]] } },
23207     { type: "Feature", properties: { iso1A2: "KH", iso1A3: "KHM", iso1N3: "116", wikidata: "Q424", nameEn: "Cambodia", groups: ["035", "142", "UN"], callingCodes: ["855"] }, geometry: { type: "MultiPolygon", coordinates: [[[[105.87328, 11.55953], [105.81645, 11.56876], [105.80867, 11.60536], [105.8507, 11.66635], [105.88962, 11.67854], [105.95188, 11.63738], [106.00792, 11.7197], [106.02038, 11.77457], [106.06708, 11.77761], [106.13158, 11.73283], [106.18539, 11.75171], [106.26478, 11.72122], [106.30525, 11.67549], [106.37219, 11.69836], [106.44691, 11.66787], [106.45158, 11.68616], [106.41577, 11.76999], [106.44535, 11.8279], [106.44068, 11.86294], [106.4687, 11.86751], [106.4111, 11.97413], [106.70687, 11.96956], [106.79405, 12.0807], [106.92325, 12.06548], [106.99953, 12.08983], [107.15831, 12.27547], [107.34511, 12.33327], [107.42917, 12.24657], [107.4463, 12.29373], [107.55059, 12.36824], [107.5755, 12.52177], [107.55993, 12.7982], [107.49611, 12.88926], [107.49144, 13.01215], [107.62843, 13.3668], [107.61909, 13.52577], [107.53503, 13.73908], [107.45252, 13.78897], [107.46498, 13.91593], [107.44318, 13.99751], [107.38247, 13.99147], [107.35757, 14.02319], [107.37158, 14.07906], [107.33577, 14.11832], [107.40427, 14.24509], [107.39493, 14.32655], [107.44941, 14.41552], [107.48521, 14.40346], [107.52569, 14.54665], [107.52102, 14.59034], [107.55371, 14.628], [107.54361, 14.69092], [107.47238, 14.61523], [107.44435, 14.52785], [107.37897, 14.54443], [107.3276, 14.58812], [107.29803, 14.58963], [107.26534, 14.54292], [107.256, 14.48716], [107.21241, 14.48716], [107.17038, 14.41782], [107.09722, 14.3937], [107.03962, 14.45099], [107.04585, 14.41782], [106.98825, 14.36806], [106.9649, 14.3198], [106.90574, 14.33639], [106.8497, 14.29416], [106.80767, 14.31226], [106.73762, 14.42687], [106.63333, 14.44194], [106.59908, 14.50977], [106.57106, 14.50525], [106.54148, 14.59565], [106.50723, 14.58963], [106.45898, 14.55045], [106.47766, 14.50977], [106.43874, 14.52032], [106.40916, 14.45249], [106.32355, 14.44043], [106.25194, 14.48415], [106.21302, 14.36203], [106.00131, 14.36957], [105.99509, 14.32734], [106.02311, 14.30623], [106.04801, 14.20363], [106.10872, 14.18401], [106.11962, 14.11307], [106.18656, 14.06324], [106.16632, 14.01794], [106.10094, 13.98471], [106.10405, 13.9137], [105.90791, 13.92881], [105.78182, 14.02247], [105.78338, 14.08438], [105.5561, 14.15684], [105.44869, 14.10703], [105.36775, 14.09948], [105.2759, 14.17496], [105.20894, 14.34967], [105.17748, 14.34432], [105.14012, 14.23873], [105.08408, 14.20402], [105.02804, 14.23722], [104.97667, 14.38806], [104.69335, 14.42726], [104.55014, 14.36091], [104.27616, 14.39861], [103.93836, 14.3398], [103.70175, 14.38052], [103.71109, 14.4348], [103.53518, 14.42575], [103.39353, 14.35639], [103.16469, 14.33075], [102.93275, 14.19044], [102.91251, 14.01531], [102.77864, 13.93374], [102.72727, 13.77806], [102.56848, 13.69366], [102.5481, 13.6589], [102.58635, 13.6286], [102.62483, 13.60883], [102.57573, 13.60461], [102.5358, 13.56933], [102.44601, 13.5637], [102.36859, 13.57488], [102.33828, 13.55613], [102.361, 13.50551], [102.35563, 13.47307], [102.35692, 13.38274], [102.34611, 13.35618], [102.36001, 13.31142], [102.36146, 13.26006], [102.43422, 13.09061], [102.46011, 13.08057], [102.52275, 12.99813], [102.48694, 12.97537], [102.49335, 12.92711], [102.53053, 12.77506], [102.4994, 12.71736], [102.51963, 12.66117], [102.57567, 12.65358], [102.7796, 12.43781], [102.78116, 12.40284], [102.73134, 12.37091], [102.70176, 12.1686], [102.77026, 12.06815], [102.78427, 11.98746], [102.83957, 11.8519], [102.90973, 11.75613], [102.91449, 11.65512], [102.52395, 11.25257], [102.47649, 9.66162], [103.99198, 10.48391], [104.43778, 10.42386], [104.47963, 10.43046], [104.49869, 10.4057], [104.59018, 10.53073], [104.87933, 10.52833], [104.95094, 10.64003], [105.09571, 10.72722], [105.02722, 10.89236], [105.08326, 10.95656], [105.11449, 10.96332], [105.34011, 10.86179], [105.42884, 10.96878], [105.50045, 10.94586], [105.77751, 11.03671], [105.86376, 10.89839], [105.84603, 10.85873], [105.93403, 10.83853], [105.94535, 10.9168], [106.06708, 10.8098], [106.18539, 10.79451], [106.14301, 10.98176], [106.20095, 10.97795], [106.1757, 11.07301], [106.1527, 11.10476], [106.10444, 11.07879], [105.86782, 11.28343], [105.88962, 11.43605], [105.87328, 11.55953]]]] } },
23208     { type: "Feature", properties: { iso1A2: "KI", iso1A3: "KIR", iso1N3: "296", wikidata: "Q710", nameEn: "Kiribati", groups: ["057", "009", "UN"], driveSide: "left", callingCodes: ["686"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169, 3.9], [169, -3.5], [178, -3.5], [178, 3.9], [169, 3.9]]], [[[-161.06795, 5.2462], [-158.12991, -1.86122], [-175.33482, -1.40631], [-175.31804, -7.54825], [-156.50903, -7.4975], [-156.48634, -15.52824], [-135.59706, -4.70473], [-161.06795, 5.2462]]]] } },
23209     { type: "Feature", properties: { iso1A2: "KM", iso1A3: "COM", iso1N3: "174", wikidata: "Q970", nameEn: "Comoros", groups: ["014", "202", "002", "UN"], callingCodes: ["269"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.63904, -10.02522], [43.28731, -13.97126], [45.4971, -11.75965], [42.63904, -10.02522]]]] } },
23210     { type: "Feature", properties: { iso1A2: "KN", iso1A3: "KNA", iso1N3: "659", wikidata: "Q763", nameEn: "St. Kitts and Nevis", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 869"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.29333, 17.43155], [-62.76692, 17.64353], [-63.09677, 17.21372], [-62.63813, 16.65446], [-62.29333, 17.43155]]]] } },
23211     { type: "Feature", properties: { iso1A2: "KP", iso1A3: "PRK", iso1N3: "408", wikidata: "Q423", nameEn: "North Korea", groups: ["030", "142", "UN"], callingCodes: ["850"] }, geometry: { type: "MultiPolygon", coordinates: [[[[130.26095, 42.9027], [130.09764, 42.91425], [130.12957, 42.98361], [129.96409, 42.97306], [129.95082, 43.01051], [129.8865, 43.00395], [129.85261, 42.96494], [129.83277, 42.86746], [129.80719, 42.79218], [129.7835, 42.76521], [129.77183, 42.69435], [129.75294, 42.59409], [129.72541, 42.43739], [129.60482, 42.44461], [129.54701, 42.37254], [129.42882, 42.44702], [129.28541, 42.41574], [129.22423, 42.3553], [129.22285, 42.26491], [129.15178, 42.17224], [128.96068, 42.06657], [128.94007, 42.03537], [128.04487, 42.01769], [128.15119, 41.74568], [128.30716, 41.60322], [128.20061, 41.40895], [128.18546, 41.41279], [128.12967, 41.37931], [128.03311, 41.39232], [128.02633, 41.42103], [127.92943, 41.44291], [127.29712, 41.49473], [127.17841, 41.59714], [126.90729, 41.79955], [126.60631, 41.65565], [126.53189, 41.35206], [126.242, 41.15454], [126.00335, 40.92835], [125.76869, 40.87908], [125.71172, 40.85223], [124.86913, 40.45387], [124.40719, 40.13655], [124.38556, 40.11047], [124.3322, 40.05573], [124.37089, 40.03004], [124.35029, 39.95639], [124.23201, 39.9248], [124.17532, 39.8232], [123.90497, 38.79949], [123.85601, 37.49093], [124.67666, 38.05679], [124.84224, 37.977], [124.87921, 37.80827], [125.06408, 37.66334], [125.37112, 37.62643], [125.81159, 37.72949], [126.13074, 37.70512], [126.18776, 37.74728], [126.19097, 37.81462], [126.24402, 37.83113], [126.43239, 37.84095], [126.46818, 37.80873], [126.56709, 37.76857], [126.59918, 37.76364], [126.66067, 37.7897], [126.68793, 37.83728], [126.68793, 37.9175], [126.67023, 37.95852], [126.84961, 38.0344], [126.88106, 38.10246], [126.95887, 38.1347], [126.95338, 38.17735], [127.04479, 38.25518], [127.15749, 38.30722], [127.38727, 38.33227], [127.49672, 38.30647], [127.55013, 38.32257], [128.02917, 38.31861], [128.27652, 38.41657], [128.31105, 38.58462], [128.37487, 38.62345], [128.65655, 38.61914], [131.95041, 41.5445], [130.65022, 42.32281], [130.66367, 42.38024], [130.64181, 42.41422], [130.60805, 42.4317], [130.56835, 42.43281], [130.55143, 42.52158], [130.50123, 42.61636], [130.44361, 42.54849], [130.41826, 42.6011], [130.2385, 42.71127], [130.23068, 42.80125], [130.26095, 42.9027]]]] } },
23212     { type: "Feature", properties: { iso1A2: "KR", iso1A3: "KOR", iso1N3: "410", wikidata: "Q884", nameEn: "South Korea", groups: ["030", "142", "UN"], callingCodes: ["82"] }, geometry: { type: "MultiPolygon", coordinates: [[[[133.11729, 37.53115], [128.65655, 38.61914], [128.37487, 38.62345], [128.31105, 38.58462], [128.27652, 38.41657], [128.02917, 38.31861], [127.55013, 38.32257], [127.49672, 38.30647], [127.38727, 38.33227], [127.15749, 38.30722], [127.04479, 38.25518], [126.95338, 38.17735], [126.95887, 38.1347], [126.88106, 38.10246], [126.84961, 38.0344], [126.67023, 37.95852], [126.68793, 37.9175], [126.68793, 37.83728], [126.66067, 37.7897], [126.59918, 37.76364], [126.56709, 37.76857], [126.46818, 37.80873], [126.43239, 37.84095], [126.24402, 37.83113], [126.19097, 37.81462], [126.18776, 37.74728], [126.13074, 37.70512], [125.81159, 37.72949], [125.37112, 37.62643], [125.06408, 37.66334], [124.87921, 37.80827], [124.84224, 37.977], [124.67666, 38.05679], [123.85601, 37.49093], [122.80525, 33.30571], [125.99728, 32.63328], [129.2669, 34.87122], [133.11729, 37.53115]]]] } },
23213     { type: "Feature", properties: { iso1A2: "KW", iso1A3: "KWT", iso1N3: "414", wikidata: "Q817", nameEn: "Kuwait", groups: ["145", "142", "UN"], callingCodes: ["965"] }, geometry: { type: "MultiPolygon", coordinates: [[[[49.00421, 28.81495], [48.59531, 29.66815], [48.40479, 29.85763], [48.17332, 30.02448], [48.06782, 30.02906], [48.01114, 29.98906], [47.7095, 30.10453], [47.37192, 30.10421], [47.15166, 30.01044], [46.89695, 29.50584], [46.5527, 29.10283], [47.46202, 29.0014], [47.58376, 28.83382], [47.59863, 28.66798], [47.70561, 28.5221], [48.42991, 28.53628], [49.00421, 28.81495]]]] } },
23214     { type: "Feature", properties: { iso1A2: "KY", iso1A3: "CYM", iso1N3: "136", wikidata: "Q5785", nameEn: "Cayman Islands", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 345"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-82.11509, 19.60401], [-80.36068, 18.11751], [-79.32727, 20.06742], [-82.11509, 19.60401]]]] } },
23215     { type: "Feature", properties: { iso1A2: "KZ", iso1A3: "KAZ", iso1N3: "398", wikidata: "Q232", nameEn: "Kazakhstan", groups: ["143", "142", "UN"], callingCodes: ["7"] }, geometry: { type: "MultiPolygon", coordinates: [[[[68.90865, 55.38148], [68.19206, 55.18823], [68.26661, 55.09226], [68.21308, 54.98645], [65.20174, 54.55216], [65.24663, 54.35721], [65.11033, 54.33028], [64.97216, 54.4212], [63.97686, 54.29763], [64.02715, 54.22679], [63.91224, 54.20013], [63.80604, 54.27079], [62.58651, 54.05871], [62.56876, 53.94047], [62.45931, 53.90737], [62.38535, 54.03961], [62.00966, 54.04134], [62.03913, 53.94768], [61.65318, 54.02445], [61.56941, 53.95703], [61.47603, 54.08048], [61.3706, 54.08464], [61.26863, 53.92797], [60.99796, 53.93699], [61.14283, 53.90063], [61.22574, 53.80268], [60.90626, 53.62937], [61.55706, 53.57144], [61.57185, 53.50112], [61.37957, 53.45887], [61.29082, 53.50992], [61.14291, 53.41481], [61.19024, 53.30536], [62.14574, 53.09626], [62.12799, 52.99133], [62.0422, 52.96105], [61.23462, 53.03227], [61.05842, 52.92217], [60.71989, 52.75923], [60.71693, 52.66245], [60.84118, 52.63912], [60.84709, 52.52228], [60.98021, 52.50068], [61.05417, 52.35096], [60.78201, 52.22067], [60.72581, 52.15538], [60.48915, 52.15175], [60.19925, 51.99173], [59.99809, 51.98263], [60.09867, 51.87135], [60.50986, 51.7964], [60.36787, 51.66815], [60.5424, 51.61675], [60.92401, 51.61124], [60.95655, 51.48615], [61.50677, 51.40687], [61.55114, 51.32746], [61.6813, 51.25716], [61.56889, 51.23679], [61.4431, 50.80679], [60.81833, 50.6629], [60.31914, 50.67705], [60.17262, 50.83312], [60.01288, 50.8163], [59.81172, 50.54451], [59.51886, 50.49937], [59.48928, 50.64216], [58.87974, 50.70852], [58.3208, 51.15151], [57.75578, 51.13852], [57.74986, 50.93017], [57.44221, 50.88354], [57.17302, 51.11253], [56.17906, 50.93204], [56.11398, 50.7471], [55.67774, 50.54508], [54.72067, 51.03261], [54.56685, 51.01958], [54.71476, 50.61214], [54.55797, 50.52006], [54.41894, 50.61214], [54.46331, 50.85554], [54.12248, 51.11542], [53.69299, 51.23466], [53.46165, 51.49445], [52.54329, 51.48444], [52.36119, 51.74161], [51.8246, 51.67916], [51.77431, 51.49536], [51.301, 51.48799], [51.26254, 51.68466], [50.59695, 51.61859], [50.26859, 51.28677], [49.97277, 51.2405], [49.76866, 51.11067], [49.39001, 51.09396], [49.41959, 50.85927], [49.12673, 50.78639], [48.86936, 50.61589], [48.57946, 50.63278], [48.90782, 50.02281], [48.68352, 49.89546], [48.42564, 49.82283], [48.24519, 49.86099], [48.10044, 50.09242], [47.58551, 50.47867], [47.30448, 50.30894], [47.34589, 50.09308], [47.18319, 49.93721], [46.9078, 49.86707], [46.78398, 49.34026], [47.04658, 49.19834], [47.00857, 49.04921], [46.78392, 48.95352], [46.49011, 48.43019], [47.11516, 48.27188], [47.12107, 47.83687], [47.38731, 47.68176], [47.41689, 47.83687], [47.64973, 47.76559], [48.15348, 47.74545], [48.45173, 47.40818], [48.52326, 47.4102], [49.01136, 46.72716], [48.51142, 46.69268], [48.54988, 46.56267], [49.16518, 46.38542], [49.32259, 46.26944], [49.88945, 46.04554], [49.2134, 44.84989], [52.26048, 41.69249], [52.47884, 41.78034], [52.97575, 42.1308], [54.20635, 42.38477], [54.95182, 41.92424], [55.45471, 41.25609], [56.00314, 41.32584], [55.97584, 44.99322], [55.97584, 44.99328], [55.97584, 44.99338], [55.97584, 44.99343], [55.97584, 44.99348], [55.97584, 44.99353], [55.97584, 44.99359], [55.97584, 44.99369], [55.97584, 44.99374], [55.97584, 44.99384], [55.97584, 44.9939], [55.97584, 44.994], [55.97584, 44.99405], [55.97584, 44.99415], [55.97584, 44.99421], [55.97584, 44.99426], [55.97584, 44.99431], [55.97584, 44.99436], [55.97584, 44.99441], [55.97594, 44.99446], [55.97605, 44.99452], [55.97605, 44.99457], [55.97605, 44.99462], [55.97605, 44.99467], [55.97605, 44.99477], [55.97615, 44.99477], [55.97615, 44.99483], [55.97615, 44.99493], [55.97615, 44.99498], [55.97615, 44.99503], [55.97615, 44.99508], [55.97625, 44.99514], [55.97636, 44.99519], [55.97636, 44.99524], [55.97646, 44.99529], [55.97646, 44.99534], [55.97656, 44.99539], [55.97667, 44.99545], [55.97677, 44.9955], [55.97677, 44.99555], [55.97677, 44.9956], [55.97687, 44.9956], [55.97698, 44.99565], [55.97698, 44.9957], [55.97708, 44.99576], [55.97718, 44.99581], [55.97729, 44.99586], [55.97739, 44.99586], [55.97739, 44.99591], [55.97749, 44.99591], [55.9776, 44.99591], [55.9777, 44.99596], [55.9777, 44.99601], [55.9778, 44.99607], [55.97791, 44.99607], [55.97801, 44.99607], [55.97801, 44.99612], [55.97811, 44.99617], [55.97822, 44.99617], [55.97832, 44.99622], [55.97842, 44.99622], [58.59711, 45.58671], [61.01475, 44.41383], [62.01711, 43.51008], [63.34656, 43.64003], [64.53885, 43.56941], [64.96464, 43.74748], [65.18666, 43.48835], [65.53277, 43.31856], [65.85194, 42.85481], [66.09482, 42.93426], [66.00546, 41.94455], [66.53302, 41.87388], [66.69129, 41.1311], [67.9644, 41.14611], [67.98511, 41.02794], [68.08273, 41.08148], [68.1271, 41.0324], [67.96736, 40.83798], [68.49983, 40.56437], [68.63, 40.59358], [68.58444, 40.91447], [68.49983, 40.99669], [68.62221, 41.03019], [68.65662, 40.93861], [68.73945, 40.96989], [68.7217, 41.05025], [69.01308, 41.22804], [69.05006, 41.36183], [69.15137, 41.43078], [69.17701, 41.43769], [69.18528, 41.45175], [69.20439, 41.45391], [69.22671, 41.46298], [69.23332, 41.45847], [69.25059, 41.46693], [69.29778, 41.43673], [69.35554, 41.47211], [69.37468, 41.46555], [69.45081, 41.46246], [69.39485, 41.51518], [69.45751, 41.56863], [69.49545, 41.545], [70.94483, 42.26238], [70.85973, 42.30188], [70.97717, 42.50147], [71.15232, 42.60486], [71.17807, 42.67381], [71.22785, 42.69248], [71.2724, 42.77853], [71.53272, 42.8014], [71.62405, 42.76613], [71.88792, 42.83578], [73.44393, 42.43098], [73.50992, 42.82356], [73.55634, 43.03071], [74.22489, 43.24657], [74.57491, 43.13702], [74.64615, 43.05881], [74.70331, 43.02519], [74.75, 42.99029], [74.88756, 42.98612], [75.22619, 42.85528], [75.29966, 42.86183], [75.72174, 42.79672], [75.82823, 42.94848], [78.48469, 42.89649], [78.91502, 42.76839], [79.19763, 42.804], [79.52921, 42.44778], [79.97364, 42.42816], [80.17807, 42.21166], [80.26841, 42.23797], [80.16892, 42.61137], [80.26886, 42.8366], [80.38169, 42.83142], [80.58999, 42.9011], [80.3735, 43.01557], [80.62913, 43.141], [80.78817, 43.14235], [80.77771, 43.30065], [80.69718, 43.32589], [80.75156, 43.44948], [80.40031, 44.10986], [80.40229, 44.23319], [80.38384, 44.63073], [79.8987, 44.89957], [80.11169, 45.03352], [81.73278, 45.3504], [82.51374, 45.1755], [82.58474, 45.40027], [82.21792, 45.56619], [83.04622, 47.19053], [83.92184, 46.98912], [84.73077, 47.01394], [84.93995, 46.87399], [85.22443, 47.04816], [85.54294, 47.06171], [85.69696, 47.2898], [85.61067, 47.49753], [85.5169, 48.05493], [85.73581, 48.3939], [86.38069, 48.46064], [86.75343, 48.70331], [86.73568, 48.99918], [86.87238, 49.12432], [87.28386, 49.11626], [87.31465, 49.23603], [87.03071, 49.25142], [86.82606, 49.51796], [86.61307, 49.60239], [86.79056, 49.74787], [86.63674, 49.80136], [86.18709, 49.50259], [85.24047, 49.60239], [84.99198, 50.06793], [84.29385, 50.27257], [83.8442, 50.87375], [83.14607, 51.00796], [82.55443, 50.75412], [81.94999, 50.79307], [81.46581, 50.77658], [81.41248, 50.97524], [81.06091, 50.94833], [81.16999, 51.15662], [80.80318, 51.28262], [80.44819, 51.20855], [80.4127, 50.95581], [80.08138, 50.77658], [79.11255, 52.01171], [77.90383, 53.29807], [76.54243, 53.99329], [76.44076, 54.16017], [76.82266, 54.1798], [76.91052, 54.4677], [75.3668, 54.07439], [75.43398, 53.98652], [75.07405, 53.80831], [73.39218, 53.44623], [73.25412, 53.61532], [73.68921, 53.86522], [73.74778, 54.07194], [73.37963, 53.96132], [72.71026, 54.1161], [72.43415, 53.92685], [72.17477, 54.36303], [71.96141, 54.17736], [71.10379, 54.13326], [71.08706, 54.33376], [71.24185, 54.64965], [71.08288, 54.71253], [70.96009, 55.10558], [70.76493, 55.3027], [70.19179, 55.1476], [69.74917, 55.35545], [69.34224, 55.36344], [68.90865, 55.38148]]]] } },
23216     { type: "Feature", properties: { iso1A2: "LA", iso1A3: "LAO", iso1N3: "418", wikidata: "Q819", nameEn: "Laos", groups: ["035", "142", "UN"], callingCodes: ["856"] }, geometry: { type: "MultiPolygon", coordinates: [[[[102.1245, 22.43372], [102.03633, 22.46164], [101.98487, 22.42766], [101.91344, 22.44417], [101.90714, 22.38688], [101.86828, 22.38397], [101.7685, 22.50337], [101.68973, 22.46843], [101.61306, 22.27515], [101.56789, 22.28876], [101.53638, 22.24794], [101.60675, 22.13513], [101.57525, 22.13026], [101.62566, 21.96574], [101.7791, 21.83019], [101.74555, 21.72852], [101.83257, 21.61562], [101.80001, 21.57461], [101.7475, 21.5873], [101.7727, 21.51794], [101.74224, 21.48276], [101.74014, 21.30967], [101.84412, 21.25291], [101.83887, 21.20983], [101.76745, 21.21571], [101.79266, 21.19025], [101.7622, 21.14813], [101.70548, 21.14911], [101.66977, 21.20004], [101.60886, 21.17947], [101.59491, 21.18621], [101.6068, 21.23329], [101.54563, 21.25668], [101.29326, 21.17254], [101.2229, 21.23271], [101.26912, 21.36482], [101.19349, 21.41959], [101.2124, 21.56422], [101.15156, 21.56129], [101.16198, 21.52808], [101.00234, 21.39612], [100.80173, 21.2934], [100.72716, 21.31786], [100.63578, 21.05639], [100.55281, 21.02796], [100.50974, 20.88574], [100.64628, 20.88279], [100.60112, 20.8347], [100.51079, 20.82194], [100.36375, 20.82783], [100.1957, 20.68247], [100.08404, 20.36626], [100.09999, 20.31614], [100.09337, 20.26293], [100.11785, 20.24787], [100.1712, 20.24324], [100.16668, 20.2986], [100.22076, 20.31598], [100.25769, 20.3992], [100.33383, 20.4028], [100.37439, 20.35156], [100.41473, 20.25625], [100.44992, 20.23644], [100.4537, 20.19971], [100.47567, 20.19133], [100.51052, 20.14928], [100.55218, 20.17741], [100.58808, 20.15791], [100.5094, 19.87904], [100.398, 19.75047], [100.49604, 19.53504], [100.58219, 19.49164], [100.64606, 19.55884], [100.77231, 19.48324], [100.90302, 19.61901], [101.08928, 19.59748], [101.26545, 19.59242], [101.26991, 19.48324], [101.21347, 19.46223], [101.20604, 19.35296], [101.24911, 19.33334], [101.261, 19.12717], [101.35606, 19.04716], [101.25803, 18.89545], [101.22832, 18.73377], [101.27585, 18.68875], [101.06047, 18.43247], [101.18227, 18.34367], [101.15108, 18.25624], [101.19118, 18.2125], [101.1793, 18.0544], [101.02185, 17.87637], [100.96541, 17.57926], [101.15108, 17.47586], [101.44667, 17.7392], [101.72294, 17.92867], [101.78087, 18.07559], [101.88485, 18.02474], [102.11359, 18.21532], [102.45523, 17.97106], [102.59234, 17.96127], [102.60971, 17.95411], [102.61432, 17.92273], [102.5896, 17.84889], [102.59485, 17.83537], [102.68194, 17.80151], [102.69946, 17.81686], [102.67543, 17.84529], [102.68538, 17.86653], [102.75954, 17.89561], [102.79044, 17.93612], [102.81988, 17.94233], [102.86323, 17.97531], [102.95812, 18.0054], [102.9912, 17.9949], [103.01998, 17.97095], [103.0566, 18.00144], [103.07823, 18.03833], [103.07343, 18.12351], [103.1493, 18.17799], [103.14994, 18.23172], [103.17093, 18.2618], [103.29757, 18.30475], [103.23818, 18.34875], [103.24779, 18.37807], [103.30977, 18.4341], [103.41044, 18.4486], [103.47773, 18.42841], [103.60957, 18.40528], [103.699, 18.34125], [103.82449, 18.33979], [103.85642, 18.28666], [103.93916, 18.33914], [103.97725, 18.33631], [104.06533, 18.21656], [104.10927, 18.10826], [104.21776, 17.99335], [104.2757, 17.86139], [104.35432, 17.82871], [104.45404, 17.66788], [104.69867, 17.53038], [104.80061, 17.39367], [104.80716, 17.19025], [104.73712, 17.01404], [104.7373, 16.91125], [104.76442, 16.84752], [104.7397, 16.81005], [104.76099, 16.69302], [104.73349, 16.565], [104.88057, 16.37311], [105.00262, 16.25627], [105.06204, 16.09792], [105.42001, 16.00657], [105.38508, 15.987], [105.34115, 15.92737], [105.37959, 15.84074], [105.42285, 15.76971], [105.46573, 15.74742], [105.61756, 15.68792], [105.60446, 15.53301], [105.58191, 15.41031], [105.47635, 15.3796], [105.4692, 15.33709], [105.50662, 15.32054], [105.58043, 15.32724], [105.46661, 15.13132], [105.61162, 15.00037], [105.5121, 14.80802], [105.53864, 14.55731], [105.43783, 14.43865], [105.20894, 14.34967], [105.2759, 14.17496], [105.36775, 14.09948], [105.44869, 14.10703], [105.5561, 14.15684], [105.78338, 14.08438], [105.78182, 14.02247], [105.90791, 13.92881], [106.10405, 13.9137], [106.10094, 13.98471], [106.16632, 14.01794], [106.18656, 14.06324], [106.11962, 14.11307], [106.10872, 14.18401], [106.04801, 14.20363], [106.02311, 14.30623], [105.99509, 14.32734], [106.00131, 14.36957], [106.21302, 14.36203], [106.25194, 14.48415], [106.32355, 14.44043], [106.40916, 14.45249], [106.43874, 14.52032], [106.47766, 14.50977], [106.45898, 14.55045], [106.50723, 14.58963], [106.54148, 14.59565], [106.57106, 14.50525], [106.59908, 14.50977], [106.63333, 14.44194], [106.73762, 14.42687], [106.80767, 14.31226], [106.8497, 14.29416], [106.90574, 14.33639], [106.9649, 14.3198], [106.98825, 14.36806], [107.04585, 14.41782], [107.03962, 14.45099], [107.09722, 14.3937], [107.17038, 14.41782], [107.21241, 14.48716], [107.256, 14.48716], [107.26534, 14.54292], [107.29803, 14.58963], [107.3276, 14.58812], [107.37897, 14.54443], [107.44435, 14.52785], [107.47238, 14.61523], [107.54361, 14.69092], [107.51579, 14.79282], [107.59285, 14.87795], [107.48277, 14.93751], [107.46516, 15.00982], [107.61486, 15.0566], [107.61926, 15.13949], [107.58844, 15.20111], [107.62587, 15.2266], [107.60605, 15.37524], [107.62367, 15.42193], [107.53341, 15.40496], [107.50699, 15.48771], [107.3815, 15.49832], [107.34408, 15.62345], [107.27583, 15.62769], [107.27143, 15.71459], [107.21859, 15.74638], [107.21419, 15.83747], [107.34188, 15.89464], [107.39471, 15.88829], [107.46296, 16.01106], [107.44975, 16.08511], [107.33968, 16.05549], [107.25822, 16.13587], [107.14595, 16.17816], [107.15035, 16.26271], [107.09091, 16.3092], [107.02597, 16.31132], [106.97385, 16.30204], [106.96638, 16.34938], [106.88067, 16.43594], [106.88727, 16.52671], [106.84104, 16.55415], [106.74418, 16.41904], [106.65832, 16.47816], [106.66052, 16.56892], [106.61477, 16.60713], [106.58267, 16.6012], [106.59013, 16.62259], [106.55485, 16.68704], [106.55265, 16.86831], [106.52183, 16.87884], [106.51963, 16.92097], [106.54824, 16.92729], [106.55045, 17.0031], [106.50862, 16.9673], [106.43597, 17.01362], [106.31929, 17.20509], [106.29287, 17.3018], [106.24444, 17.24714], [106.18991, 17.28227], [106.09019, 17.36399], [105.85744, 17.63221], [105.76612, 17.67147], [105.60381, 17.89356], [105.64784, 17.96687], [105.46292, 18.22008], [105.38366, 18.15315], [105.15942, 18.38691], [105.10408, 18.43533], [105.1327, 18.58355], [105.19654, 18.64196], [105.12829, 18.70453], [104.64617, 18.85668], [104.5361, 18.97747], [103.87125, 19.31854], [104.06058, 19.43484], [104.10832, 19.51575], [104.05617, 19.61743], [104.06498, 19.66926], [104.23229, 19.70242], [104.41281, 19.70035], [104.53169, 19.61743], [104.64837, 19.62365], [104.68359, 19.72729], [104.8355, 19.80395], [104.8465, 19.91783], [104.9874, 20.09573], [104.91695, 20.15567], [104.86852, 20.14121], [104.61315, 20.24452], [104.62195, 20.36633], [104.72102, 20.40554], [104.66158, 20.47774], [104.47886, 20.37459], [104.40621, 20.3849], [104.38199, 20.47155], [104.63957, 20.6653], [104.27412, 20.91433], [104.11121, 20.96779], [103.98024, 20.91531], [103.82282, 20.8732], [103.73478, 20.6669], [103.68633, 20.66324], [103.45737, 20.82382], [103.38032, 20.79501], [103.21497, 20.89832], [103.12055, 20.89994], [103.03469, 21.05821], [102.97745, 21.05821], [102.89825, 21.24707], [102.80794, 21.25736], [102.88939, 21.3107], [102.94223, 21.46034], [102.86297, 21.4255], [102.98846, 21.58936], [102.97965, 21.74076], [102.86077, 21.71213], [102.85637, 21.84501], [102.81894, 21.83888], [102.82115, 21.73667], [102.74189, 21.66713], [102.67145, 21.65894], [102.62301, 21.91447], [102.49092, 21.99002], [102.51734, 22.02676], [102.18712, 22.30403], [102.14099, 22.40092], [102.1245, 22.43372]]]] } },
23217     { type: "Feature", properties: { iso1A2: "LB", iso1A3: "LBN", iso1N3: "422", wikidata: "Q822", nameEn: "Lebanon", aliases: ["RL"], groups: ["145", "142", "UN"], callingCodes: ["961"] }, geometry: { type: "MultiPolygon", coordinates: [[[[35.94816, 33.47886], [35.94465, 33.52774], [36.05723, 33.57904], [35.9341, 33.6596], [36.06778, 33.82927], [36.14517, 33.85118], [36.3967, 33.83365], [36.38263, 33.86579], [36.28589, 33.91981], [36.41078, 34.05253], [36.50576, 34.05982], [36.5128, 34.09916], [36.62537, 34.20251], [36.59195, 34.2316], [36.58667, 34.27667], [36.60778, 34.31009], [36.56556, 34.31881], [36.53039, 34.3798], [36.55853, 34.41609], [36.46179, 34.46541], [36.4442, 34.50165], [36.34745, 34.5002], [36.3369, 34.52629], [36.39846, 34.55672], [36.41429, 34.61175], [36.45299, 34.59438], [36.46003, 34.6378], [36.42941, 34.62505], [36.35384, 34.65447], [36.35135, 34.68516], [36.32399, 34.69334], [36.29165, 34.62991], [35.98718, 34.64977], [35.97386, 34.63322], [35.48515, 34.70851], [34.78515, 33.20368], [35.10645, 33.09318], [35.1924, 33.08743], [35.31429, 33.10515], [35.35223, 33.05617], [35.43059, 33.06659], [35.448, 33.09264], [35.50272, 33.09056], [35.50335, 33.114], [35.52573, 33.11921], [35.54228, 33.19865], [35.5362, 33.23196], [35.54808, 33.236], [35.54544, 33.25513], [35.55555, 33.25844], [35.56523, 33.28969], [35.58326, 33.28381], [35.58502, 33.26653], [35.62283, 33.24226], [35.62019, 33.27278], [35.77477, 33.33609], [35.81324, 33.36354], [35.82577, 33.40479], [35.88668, 33.43183], [35.94816, 33.47886]]]] } },
23218     { type: "Feature", properties: { iso1A2: "LC", iso1A3: "LCA", iso1N3: "662", wikidata: "Q760", nameEn: "St. Lucia", aliases: ["WL"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 758"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-59.95997, 14.20285], [-61.69315, 14.26451], [-59.94058, 12.34011], [-59.95997, 14.20285]]]] } },
23219     { type: "Feature", properties: { iso1A2: "LI", iso1A3: "LIE", iso1N3: "438", wikidata: "Q347", nameEn: "Liechtenstein", aliases: ["FL"], groups: ["155", "150", "UN"], callingCodes: ["423"] }, geometry: { type: "MultiPolygon", coordinates: [[[[9.60717, 47.06091], [9.61216, 47.07732], [9.63395, 47.08443], [9.62623, 47.14685], [9.56539, 47.17124], [9.58264, 47.20673], [9.56981, 47.21926], [9.55176, 47.22585], [9.56766, 47.24281], [9.53116, 47.27029], [9.52406, 47.24959], [9.50318, 47.22153], [9.4891, 47.19346], [9.48774, 47.17402], [9.51044, 47.13727], [9.52089, 47.10019], [9.51362, 47.08505], [9.47139, 47.06402], [9.47548, 47.05257], [9.54041, 47.06495], [9.55721, 47.04762], [9.60717, 47.06091]]]] } },
23220     { type: "Feature", properties: { iso1A2: "LK", iso1A3: "LKA", iso1N3: "144", wikidata: "Q854", nameEn: "Sri Lanka", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["94"] }, geometry: { type: "MultiPolygon", coordinates: [[[[76.59015, 5.591], [85.15017, 5.21497], [80.48418, 10.20786], [79.42124, 9.80115], [79.50447, 8.91876], [76.59015, 5.591]]]] } },
23221     { type: "Feature", properties: { iso1A2: "LR", iso1A3: "LBR", iso1N3: "430", wikidata: "Q1014", nameEn: "Liberia", groups: ["011", "202", "002", "UN"], callingCodes: ["231"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-8.47114, 7.55676], [-8.55874, 7.62525], [-8.55874, 7.70167], [-8.67814, 7.69428], [-8.72789, 7.51429], [-8.8448, 7.35149], [-8.85724, 7.26019], [-8.93435, 7.2824], [-9.09107, 7.1985], [-9.18311, 7.30461], [-9.20798, 7.38109], [-9.305, 7.42056], [-9.41943, 7.41809], [-9.48161, 7.37122], [-9.37465, 7.62032], [-9.35724, 7.74111], [-9.44928, 7.9284], [-9.41445, 8.02448], [-9.50898, 8.18455], [-9.47415, 8.35195], [-9.77763, 8.54633], [-10.05873, 8.42578], [-10.05375, 8.50697], [-10.14579, 8.52665], [-10.203, 8.47991], [-10.27575, 8.48711], [-10.30084, 8.30008], [-10.31635, 8.28554], [-10.29839, 8.21283], [-10.35227, 8.15223], [-10.45023, 8.15627], [-10.51554, 8.1393], [-10.57523, 8.04829], [-10.60492, 8.04072], [-10.60422, 7.7739], [-11.29417, 7.21576], [-11.4027, 6.97746], [-11.50429, 6.92704], [-12.15048, 6.15992], [-7.52774, 3.7105], [-7.53259, 4.35145], [-7.59349, 4.8909], [-7.53876, 4.94294], [-7.55369, 5.08667], [-7.48901, 5.14118], [-7.46165, 5.26256], [-7.36463, 5.32944], [-7.43428, 5.42355], [-7.37209, 5.61173], [-7.43926, 5.74787], [-7.43677, 5.84687], [-7.46165, 5.84934], [-7.48155, 5.80974], [-7.67309, 5.94337], [-7.70294, 5.90625], [-7.78254, 5.99037], [-7.79747, 6.07696], [-7.8497, 6.08932], [-7.83478, 6.20309], [-7.90692, 6.27728], [-8.00642, 6.31684], [-8.17557, 6.28222], [-8.3298, 6.36381], [-8.38453, 6.35887], [-8.45666, 6.49977], [-8.48652, 6.43797], [-8.59456, 6.50612], [-8.31736, 6.82837], [-8.29249, 7.1691], [-8.37458, 7.25794], [-8.41935, 7.51203], [-8.47114, 7.55676]]]] } },
23222     { type: "Feature", properties: { iso1A2: "LS", iso1A3: "LSO", iso1N3: "426", wikidata: "Q1013", nameEn: "Lesotho", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["266"] }, geometry: { type: "MultiPolygon", coordinates: [[[[29.33204, -29.45598], [29.44883, -29.3772], [29.40524, -29.21246], [28.68043, -28.58744], [28.65091, -28.57025], [28.40612, -28.6215], [28.30518, -28.69531], [28.2348, -28.69471], [28.1317, -28.7293], [28.02503, -28.85991], [27.98675, -28.8787], [27.9392, -28.84864], [27.88933, -28.88156], [27.8907, -28.91612], [27.75458, -28.89839], [27.55974, -29.18954], [27.5158, -29.2261], [27.54258, -29.25575], [27.48679, -29.29349], [27.45125, -29.29708], [27.47254, -29.31968], [27.4358, -29.33465], [27.33464, -29.48161], [27.01016, -29.65439], [27.09489, -29.72796], [27.22719, -30.00718], [27.29603, -30.05473], [27.32555, -30.14785], [27.40778, -30.14577], [27.37293, -30.19401], [27.36649, -30.27246], [27.38108, -30.33456], [27.45452, -30.32239], [27.56901, -30.42504], [27.56781, -30.44562], [27.62137, -30.50509], [27.6521, -30.51707], [27.67819, -30.53437], [27.69467, -30.55862], [27.74814, -30.60635], [28.12073, -30.68072], [28.2319, -30.28476], [28.399, -30.1592], [28.68627, -30.12885], [28.80222, -30.10579], [28.9338, -30.05072], [29.16548, -29.91706], [29.12553, -29.76266], [29.28545, -29.58456], [29.33204, -29.45598]]]] } },
23223     { type: "Feature", properties: { iso1A2: "LT", iso1A3: "LTU", iso1N3: "440", wikidata: "Q37", nameEn: "Lithuania", groups: ["EU", "154", "150", "UN"], callingCodes: ["370"] }, geometry: { type: "MultiPolygon", coordinates: [[[[24.89005, 56.46666], [24.83686, 56.41565], [24.70022, 56.40483], [24.57353, 56.31525], [24.58143, 56.29125], [24.42746, 56.26522], [24.32334, 56.30226], [24.13139, 56.24881], [24.02657, 56.3231], [23.75726, 56.37282], [23.49803, 56.34307], [23.40486, 56.37689], [23.31606, 56.3827], [23.17312, 56.36795], [23.09531, 56.30511], [22.96988, 56.41213], [22.83048, 56.367], [22.69354, 56.36284], [22.56441, 56.39305], [22.3361, 56.4016], [22.09728, 56.42851], [22.00548, 56.41508], [21.74558, 56.33181], [21.57888, 56.31406], [21.49736, 56.29106], [21.24644, 56.16917], [21.15016, 56.07818], [20.68447, 56.04073], [20.60454, 55.40986], [20.95181, 55.27994], [21.26425, 55.24456], [21.35465, 55.28427], [21.38446, 55.29348], [21.46766, 55.21115], [21.51095, 55.18507], [21.55605, 55.20311], [21.64954, 55.1791], [21.85521, 55.09493], [21.96505, 55.07353], [21.99543, 55.08691], [22.03984, 55.07888], [22.02582, 55.05078], [22.06087, 55.02935], [22.11697, 55.02131], [22.14267, 55.05345], [22.31562, 55.0655], [22.47688, 55.04408], [22.58907, 55.07085], [22.60075, 55.01863], [22.65451, 54.97037], [22.68723, 54.9811], [22.76422, 54.92521], [22.85083, 54.88711], [22.87317, 54.79492], [22.73631, 54.72952], [22.73397, 54.66604], [22.75467, 54.6483], [22.74225, 54.64339], [22.7522, 54.63525], [22.68021, 54.58486], [22.71293, 54.56454], [22.67788, 54.532], [22.70208, 54.45312], [22.7253, 54.41732], [22.79705, 54.36264], [22.83756, 54.40827], [23.00584, 54.38514], [22.99649, 54.35927], [23.05726, 54.34565], [23.04323, 54.31567], [23.104, 54.29794], [23.13905, 54.31567], [23.15526, 54.31076], [23.15938, 54.29894], [23.24656, 54.25701], [23.3494, 54.25155], [23.39525, 54.21672], [23.42418, 54.17911], [23.45223, 54.17775], [23.49196, 54.14764], [23.52702, 54.04622], [23.48261, 53.98855], [23.51284, 53.95052], [23.61677, 53.92691], [23.71726, 53.93379], [23.80543, 53.89558], [23.81309, 53.94205], [23.95098, 53.9613], [23.98837, 53.92554], [24.19638, 53.96405], [24.34128, 53.90076], [24.44411, 53.90076], [24.62275, 54.00217], [24.69652, 54.01901], [24.69185, 53.96543], [24.74279, 53.96663], [24.85311, 54.02862], [24.77131, 54.11091], [24.96894, 54.17589], [24.991, 54.14241], [25.0728, 54.13419], [25.19199, 54.219], [25.22705, 54.26271], [25.35559, 54.26544], [25.509, 54.30267], [25.56823, 54.25212], [25.51452, 54.17799], [25.54724, 54.14925], [25.64875, 54.1259], [25.71084, 54.16704], [25.78563, 54.15747], [25.78553, 54.23327], [25.68513, 54.31727], [25.55425, 54.31591], [25.5376, 54.33158], [25.63371, 54.42075], [25.62203, 54.4656], [25.64813, 54.48704], [25.68045, 54.5321], [25.75977, 54.57252], [25.74122, 54.80108], [25.89462, 54.93438], [25.99129, 54.95705], [26.05907, 54.94631], [26.13386, 54.98924], [26.20397, 54.99729], [26.26941, 55.08032], [26.23202, 55.10439], [26.30628, 55.12536], [26.35121, 55.1525], [26.46249, 55.12814], [26.51481, 55.16051], [26.54753, 55.14181], [26.69243, 55.16718], [26.68075, 55.19787], [26.72983, 55.21788], [26.73017, 55.24226], [26.835, 55.28182], [26.83266, 55.30444], [26.80929, 55.31642], [26.6714, 55.33902], [26.5709, 55.32572], [26.44937, 55.34832], [26.5522, 55.40277], [26.55094, 55.5093], [26.63167, 55.57887], [26.63231, 55.67968], [26.58248, 55.6754], [26.46661, 55.70375], [26.39561, 55.71156], [26.18509, 55.86813], [26.03815, 55.95884], [25.90047, 56.0013], [25.85893, 56.00188], [25.81773, 56.05444], [25.69246, 56.08892], [25.68588, 56.14725], [25.53621, 56.16663], [25.39751, 56.15707], [25.23099, 56.19147], [25.09325, 56.1878], [25.05762, 56.26742], [24.89005, 56.46666]]]] } },
23224     { type: "Feature", properties: { iso1A2: "LU", iso1A3: "LUX", iso1N3: "442", wikidata: "Q32", nameEn: "Luxembourg", groups: ["EU", "155", "150", "UN"], callingCodes: ["352"] }, geometry: { type: "MultiPolygon", coordinates: [[[[6.1379, 50.12964], [6.1137, 50.13668], [6.12028, 50.16374], [6.08577, 50.17246], [6.06406, 50.15344], [6.03093, 50.16362], [6.02488, 50.18283], [5.96453, 50.17259], [5.95929, 50.13295], [5.89488, 50.11476], [5.8857, 50.07824], [5.85474, 50.06342], [5.86904, 50.04614], [5.8551, 50.02683], [5.81866, 50.01286], [5.82331, 49.99662], [5.83968, 49.9892], [5.83467, 49.97823], [5.81163, 49.97142], [5.80833, 49.96451], [5.77291, 49.96056], [5.77314, 49.93646], [5.73621, 49.89796], [5.78415, 49.87922], [5.75269, 49.8711], [5.75861, 49.85631], [5.74567, 49.85368], [5.75884, 49.84811], [5.74953, 49.84709], [5.74975, 49.83933], [5.74076, 49.83823], [5.7404, 49.83452], [5.74844, 49.82435], [5.74364, 49.82058], [5.74953, 49.81428], [5.75409, 49.79239], [5.78871, 49.7962], [5.82245, 49.75048], [5.83149, 49.74729], [5.82562, 49.72395], [5.84193, 49.72161], [5.86503, 49.72739], [5.88677, 49.70951], [5.86527, 49.69291], [5.86175, 49.67862], [5.9069, 49.66377], [5.90164, 49.6511], [5.90599, 49.63853], [5.88552, 49.63507], [5.88393, 49.62802], [5.87609, 49.62047], [5.8762, 49.60898], [5.84826, 49.5969], [5.84971, 49.58674], [5.86986, 49.58756], [5.87256, 49.57539], [5.8424, 49.56082], [5.84692, 49.55663], [5.84143, 49.5533], [5.81838, 49.54777], [5.80871, 49.5425], [5.81664, 49.53775], [5.83648, 49.5425], [5.84466, 49.53027], [5.83467, 49.52717], [5.83389, 49.52152], [5.86571, 49.50015], [5.94128, 49.50034], [5.94224, 49.49608], [5.96876, 49.49053], [5.97693, 49.45513], [6.02648, 49.45451], [6.02743, 49.44845], [6.04176, 49.44801], [6.05553, 49.46663], [6.07887, 49.46399], [6.08373, 49.45594], [6.10072, 49.45268], [6.09845, 49.46351], [6.10325, 49.4707], [6.12346, 49.4735], [6.12814, 49.49365], [6.14321, 49.48796], [6.16115, 49.49297], [6.15366, 49.50226], [6.17386, 49.50934], [6.19543, 49.50536], [6.2409, 49.51408], [6.25029, 49.50609], [6.27875, 49.503], [6.28818, 49.48465], [6.3687, 49.4593], [6.36778, 49.46937], [6.36907, 49.48931], [6.36788, 49.50377], [6.35666, 49.52931], [6.38072, 49.55171], [6.38228, 49.55855], [6.35825, 49.57053], [6.36676, 49.57813], [6.38024, 49.57593], [6.38342, 49.5799], [6.37464, 49.58886], [6.385, 49.59946], [6.39822, 49.60081], [6.41861, 49.61723], [6.4413, 49.65722], [6.43768, 49.66021], [6.42726, 49.66078], [6.42937, 49.66857], [6.44654, 49.67799], [6.46048, 49.69092], [6.48014, 49.69767], [6.49785, 49.71118], [6.50647, 49.71353], [6.5042, 49.71808], [6.49694, 49.72205], [6.49535, 49.72645], [6.50261, 49.72718], [6.51397, 49.72058], [6.51805, 49.72425], [6.50193, 49.73291], [6.50174, 49.75292], [6.51646, 49.75961], [6.51828, 49.76855], [6.51056, 49.77515], [6.51669, 49.78336], [6.50534, 49.78952], [6.52169, 49.79787], [6.53122, 49.80666], [6.52121, 49.81338], [6.51215, 49.80124], [6.50647, 49.80916], [6.48718, 49.81267], [6.47111, 49.82263], [6.45425, 49.81164], [6.44131, 49.81443], [6.42905, 49.81091], [6.42521, 49.81591], [6.40022, 49.82029], [6.36576, 49.85032], [6.34267, 49.84974], [6.33585, 49.83785], [6.32098, 49.83728], [6.32303, 49.85133], [6.30963, 49.87021], [6.29692, 49.86685], [6.28874, 49.87592], [6.26146, 49.88203], [6.23496, 49.89972], [6.22926, 49.92096], [6.21882, 49.92403], [6.22608, 49.929], [6.22094, 49.94955], [6.19856, 49.95053], [6.19089, 49.96991], [6.18045, 49.96611], [6.18554, 49.95622], [6.17872, 49.9537], [6.16466, 49.97086], [6.1701, 49.98518], [6.14147, 49.99563], [6.14948, 50.00908], [6.13806, 50.01056], [6.1295, 50.01849], [6.13273, 50.02019], [6.13794, 50.01466], [6.14666, 50.02207], [6.13044, 50.02929], [6.13458, 50.04141], [6.11274, 50.05916], [6.12055, 50.09171], [6.1379, 50.12964]]]] } },
23225     { type: "Feature", properties: { iso1A2: "LV", iso1A3: "LVA", iso1N3: "428", wikidata: "Q211", nameEn: "Latvia", groups: ["EU", "154", "150", "UN"], callingCodes: ["371"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.34698, 57.52242], [26.90364, 57.62823], [26.54675, 57.51813], [26.46527, 57.56885], [26.29253, 57.59244], [26.1866, 57.6849], [26.2029, 57.7206], [26.08098, 57.76619], [26.0543, 57.76105], [26.03332, 57.7718], [26.02415, 57.76865], [26.02069, 57.77169], [26.0266, 57.77441], [26.027, 57.78158], [26.02456, 57.78342], [26.0324, 57.79037], [26.05949, 57.84744], [25.73499, 57.90193], [25.29581, 58.08288], [25.28237, 57.98539], [25.19484, 58.0831], [24.3579, 57.87471], [24.26221, 57.91787], [23.20055, 57.56697], [22.80496, 57.87798], [19.84909, 57.57876], [19.64795, 57.06466], [20.68447, 56.04073], [21.15016, 56.07818], [21.24644, 56.16917], [21.49736, 56.29106], [21.57888, 56.31406], [21.74558, 56.33181], [22.00548, 56.41508], [22.09728, 56.42851], [22.3361, 56.4016], [22.56441, 56.39305], [22.69354, 56.36284], [22.83048, 56.367], [22.96988, 56.41213], [23.09531, 56.30511], [23.17312, 56.36795], [23.31606, 56.3827], [23.40486, 56.37689], [23.49803, 56.34307], [23.75726, 56.37282], [24.02657, 56.3231], [24.13139, 56.24881], [24.32334, 56.30226], [24.42746, 56.26522], [24.58143, 56.29125], [24.57353, 56.31525], [24.70022, 56.40483], [24.83686, 56.41565], [24.89005, 56.46666], [25.05762, 56.26742], [25.09325, 56.1878], [25.23099, 56.19147], [25.39751, 56.15707], [25.53621, 56.16663], [25.68588, 56.14725], [25.69246, 56.08892], [25.81773, 56.05444], [25.85893, 56.00188], [25.90047, 56.0013], [26.03815, 55.95884], [26.18509, 55.86813], [26.39561, 55.71156], [26.46661, 55.70375], [26.58248, 55.6754], [26.63231, 55.67968], [26.64888, 55.70515], [26.71802, 55.70645], [26.76872, 55.67658], [26.87448, 55.7172], [26.97153, 55.8102], [27.1559, 55.85032], [27.27804, 55.78299], [27.3541, 55.8089], [27.61683, 55.78558], [27.63065, 55.89687], [27.97865, 56.11849], [28.15217, 56.16964], [28.23716, 56.27588], [28.16599, 56.37806], [28.19057, 56.44637], [28.10069, 56.524], [28.13526, 56.57989], [28.04768, 56.59004], [27.86101, 56.88204], [27.66511, 56.83921], [27.86101, 57.29402], [27.52453, 57.42826], [27.56832, 57.53728], [27.34698, 57.52242]]]] } },
23226     { type: "Feature", properties: { iso1A2: "LY", iso1A3: "LBY", iso1N3: "434", wikidata: "Q1016", nameEn: "Libya", groups: ["015", "002", "UN"], callingCodes: ["218"] }, geometry: { type: "MultiPolygon", coordinates: [[[[26.92891, 33.39516], [11.58941, 33.36891], [11.55852, 33.1409], [11.51549, 33.09826], [11.46037, 32.6307], [11.57828, 32.48013], [11.53898, 32.4138], [11.04234, 32.2145], [10.7315, 31.97235], [10.62788, 31.96629], [10.48497, 31.72956], [10.31364, 31.72648], [10.12239, 31.42098], [10.29516, 30.90337], [9.88152, 30.34074], [9.76848, 30.34366], [9.55544, 30.23971], [9.3876, 30.16738], [9.78136, 29.40961], [9.89569, 26.57696], [9.51696, 26.39148], [9.38834, 26.19288], [10.03146, 25.35635], [10.02432, 24.98124], [10.33159, 24.5465], [10.85323, 24.5595], [11.41061, 24.21456], [11.62498, 24.26669], [11.96886, 23.51735], [13.5631, 23.16574], [14.22918, 22.61719], [14.99751, 23.00539], [15.99566, 23.49639], [23.99539, 19.49944], [23.99715, 20.00038], [24.99794, 19.99661], [24.99885, 21.99535], [24.99968, 29.24574], [24.71117, 30.17441], [25.01077, 30.73861], [24.8458, 31.39877], [26.92891, 33.39516]]]] } },
23227     { type: "Feature", properties: { iso1A2: "MA", iso1A3: "MAR", iso1N3: "504", wikidata: "Q1028", nameEn: "Morocco", groups: ["015", "002", "UN"], callingCodes: ["212"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-2.27707, 35.35051], [-5.10878, 36.05227], [-7.2725, 35.73269], [-14.43883, 27.02969], [-17.27295, 21.93519], [-17.21511, 21.34226], [-17.02707, 21.34022], [-16.9978, 21.36239], [-16.44269, 21.39745], [-14.78487, 21.36587], [-14.47329, 21.63839], [-14.48112, 22.00886], [-14.1291, 22.41636], [-14.10361, 22.75501], [-13.75627, 23.77231], [-13.00628, 24.01923], [-12.92147, 24.39502], [-12.12281, 25.13682], [-12.06001, 26.04442], [-11.62052, 26.05229], [-11.38635, 26.611], [-11.23622, 26.72023], [-11.35695, 26.8505], [-10.68417, 26.90984], [-9.81998, 26.71379], [-9.56957, 26.90042], [-9.08698, 26.98639], [-8.71787, 26.9898], [-8.77527, 27.66663], [-8.66879, 27.6666], [-8.6715, 28.71194], [-7.61585, 29.36252], [-6.95824, 29.50924], [-6.78351, 29.44634], [-6.69965, 29.51623], [-5.75616, 29.61407], [-5.72121, 29.52322], [-5.58831, 29.48103], [-5.21671, 29.95253], [-4.6058, 30.28343], [-4.31774, 30.53229], [-3.64735, 30.67539], [-3.65418, 30.85566], [-3.54944, 31.0503], [-3.77103, 31.14984], [-3.77647, 31.31912], [-3.66386, 31.39202], [-3.66314, 31.6339], [-2.82784, 31.79459], [-2.93873, 32.06557], [-2.46166, 32.16603], [-1.22829, 32.07832], [-1.15735, 32.12096], [-1.24453, 32.1917], [-1.24998, 32.32993], [-0.9912, 32.52467], [-1.37794, 32.73628], [-1.54244, 32.95499], [-1.46249, 33.0499], [-1.67067, 33.27084], [-1.59508, 33.59929], [-1.73494, 33.71721], [-1.64666, 34.10405], [-1.78042, 34.39018], [-1.69788, 34.48056], [-1.84569, 34.61907], [-1.73707, 34.74226], [-1.97469, 34.886], [-1.97833, 34.93218], [-2.04734, 34.93218], [-2.21445, 35.04378], [-2.21248, 35.08532], [-2.27707, 35.35051]], [[-2.91909, 35.33927], [-2.92272, 35.27509], [-2.93893, 35.26737], [-2.95065, 35.26576], [-2.95431, 35.2728], [-2.96516, 35.27967], [-2.96826, 35.28296], [-2.96507, 35.28801], [-2.97035, 35.28852], [-2.96978, 35.29459], [-2.96648, 35.30475], [-2.96038, 35.31609], [-2.91909, 35.33927]], [[-3.90602, 35.21494], [-3.89343, 35.22728], [-3.88372, 35.20767], [-3.90602, 35.21494]], [[-4.30191, 35.17419], [-4.29436, 35.17149], [-4.30112, 35.17058], [-4.30191, 35.17419]], [[-2.40316, 35.16893], [-2.45965, 35.16527], [-2.43262, 35.20652], [-2.40316, 35.16893]], [[-5.38491, 35.92591], [-5.21179, 35.90091], [-5.34379, 35.8711], [-5.35844, 35.87375], [-5.37338, 35.88417], [-5.38491, 35.92591]]]] } },
23228     { type: "Feature", properties: { iso1A2: "MC", iso1A3: "MCO", iso1N3: "492", wikidata: "Q235", nameEn: "Monaco", groups: ["155", "150", "UN"], callingCodes: ["377"] }, geometry: { type: "MultiPolygon", coordinates: [[[[7.47823, 43.73341], [7.4379, 43.74963], [7.4389, 43.75151], [7.43708, 43.75197], [7.43624, 43.75014], [7.43013, 43.74895], [7.42809, 43.74396], [7.42443, 43.74087], [7.42299, 43.74176], [7.42062, 43.73977], [7.41233, 43.73439], [7.41298, 43.73311], [7.41291, 43.73168], [7.41113, 43.73156], [7.40903, 43.7296], [7.42422, 43.72209], [7.47823, 43.73341]]]] } },
23229     { type: "Feature", properties: { iso1A2: "MD", iso1A3: "MDA", iso1N3: "498", wikidata: "Q217", nameEn: "Moldova", groups: ["151", "150", "UN"], callingCodes: ["373"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.74422, 48.45926], [27.6658, 48.44034], [27.59027, 48.46311], [27.5889, 48.49224], [27.46942, 48.454], [27.44333, 48.41209], [27.37741, 48.41026], [27.37604, 48.44398], [27.32159, 48.4434], [27.27855, 48.37534], [27.13434, 48.37288], [27.08078, 48.43214], [27.0231, 48.42485], [27.03821, 48.37653], [26.93384, 48.36558], [26.85556, 48.41095], [26.71274, 48.40388], [26.82809, 48.31629], [26.79239, 48.29071], [26.6839, 48.35828], [26.62823, 48.25804], [26.81161, 48.25049], [26.87708, 48.19919], [26.94265, 48.1969], [26.98042, 48.15752], [26.96119, 48.13003], [27.04118, 48.12522], [27.02985, 48.09083], [27.15622, 47.98538], [27.1618, 47.92391], [27.29069, 47.73722], [27.25519, 47.71366], [27.32202, 47.64009], [27.3979, 47.59473], [27.47942, 47.48113], [27.55731, 47.46637], [27.60263, 47.32507], [27.68706, 47.28962], [27.73172, 47.29248], [27.81892, 47.1381], [28.09095, 46.97621], [28.12173, 46.82283], [28.24808, 46.64305], [28.22281, 46.50481], [28.25769, 46.43334], [28.18902, 46.35283], [28.19864, 46.31869], [28.10937, 46.22852], [28.13684, 46.18099], [28.08612, 46.01105], [28.13111, 45.92819], [28.16568, 45.6421], [28.08927, 45.6051], [28.18741, 45.47358], [28.21139, 45.46895], [28.30201, 45.54744], [28.41836, 45.51715], [28.43072, 45.48538], [28.51449, 45.49982], [28.49252, 45.56716], [28.54196, 45.58062], [28.51587, 45.6613], [28.47879, 45.66994], [28.52823, 45.73803], [28.70401, 45.78019], [28.69852, 45.81753], [28.78503, 45.83475], [28.74383, 45.96664], [28.98004, 46.00385], [29.00613, 46.04962], [28.94643, 46.09176], [29.06656, 46.19716], [28.94953, 46.25852], [28.98478, 46.31803], [29.004, 46.31495], [28.9306, 46.45699], [29.01241, 46.46177], [29.02409, 46.49582], [29.23547, 46.55435], [29.24886, 46.37912], [29.35357, 46.49505], [29.49914, 46.45889], [29.5939, 46.35472], [29.6763, 46.36041], [29.66359, 46.4215], [29.74496, 46.45605], [29.88329, 46.35851], [29.94114, 46.40114], [30.09103, 46.38694], [30.16794, 46.40967], [30.02511, 46.45132], [29.88916, 46.54302], [29.94409, 46.56002], [29.9743, 46.75325], [29.94522, 46.80055], [29.98814, 46.82358], [29.87405, 46.88199], [29.75458, 46.8604], [29.72986, 46.92234], [29.57056, 46.94766], [29.62137, 47.05069], [29.61038, 47.09932], [29.53044, 47.07851], [29.49732, 47.12878], [29.57696, 47.13581], [29.54996, 47.24962], [29.59665, 47.25521], [29.5733, 47.36508], [29.48678, 47.36043], [29.47854, 47.30366], [29.39889, 47.30179], [29.3261, 47.44664], [29.18603, 47.43387], [29.11743, 47.55001], [29.22414, 47.60012], [29.22242, 47.73607], [29.27255, 47.79953], [29.20663, 47.80367], [29.27804, 47.88893], [29.19839, 47.89261], [29.1723, 47.99013], [28.9306, 47.96255], [28.8414, 48.03392], [28.85232, 48.12506], [28.69896, 48.13106], [28.53921, 48.17453], [28.48428, 48.0737], [28.42454, 48.12047], [28.43701, 48.15832], [28.38712, 48.17567], [28.34009, 48.13147], [28.30609, 48.14018], [28.30586, 48.1597], [28.34912, 48.1787], [28.36996, 48.20543], [28.35519, 48.24957], [28.32508, 48.23384], [28.2856, 48.23202], [28.19314, 48.20749], [28.17666, 48.25963], [28.07504, 48.23494], [28.09873, 48.3124], [28.04527, 48.32661], [27.95883, 48.32368], [27.88391, 48.36699], [27.87533, 48.4037], [27.81902, 48.41874], [27.79225, 48.44244], [27.74422, 48.45926]]]] } },
23230     { type: "Feature", properties: { iso1A2: "ME", iso1A3: "MNE", iso1N3: "499", wikidata: "Q236", nameEn: "Montenegro", groups: ["039", "150", "UN"], callingCodes: ["382"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.22807, 43.5264], [19.15685, 43.53943], [19.13933, 43.5282], [19.04934, 43.50384], [19.01078, 43.55806], [18.91379, 43.50299], [18.95469, 43.49367], [18.96053, 43.45042], [19.01078, 43.43854], [19.04071, 43.397], [19.08673, 43.31453], [19.08206, 43.29668], [19.04233, 43.30008], [19.00844, 43.24988], [18.95001, 43.29327], [18.95819, 43.32899], [18.90911, 43.36383], [18.83912, 43.34795], [18.84794, 43.33735], [18.85342, 43.32426], [18.76538, 43.29838], [18.6976, 43.25243], [18.71747, 43.2286], [18.66605, 43.2056], [18.64735, 43.14766], [18.66254, 43.03928], [18.52232, 43.01451], [18.49076, 42.95553], [18.49661, 42.89306], [18.4935, 42.86433], [18.47633, 42.85829], [18.45921, 42.81682], [18.47324, 42.74992], [18.56789, 42.72074], [18.55221, 42.69045], [18.54603, 42.69171], [18.54841, 42.68328], [18.57373, 42.64429], [18.52232, 42.62279], [18.55504, 42.58409], [18.53751, 42.57376], [18.49778, 42.58409], [18.43735, 42.55921], [18.44307, 42.51077], [18.43588, 42.48556], [18.52152, 42.42302], [18.54128, 42.39171], [18.45131, 42.21682], [19.26406, 41.74971], [19.37597, 41.84849], [19.37451, 41.8842], [19.33812, 41.90669], [19.34601, 41.95675], [19.37691, 41.96977], [19.36867, 42.02564], [19.37548, 42.06835], [19.40687, 42.10024], [19.28623, 42.17745], [19.42, 42.33019], [19.42352, 42.36546], [19.4836, 42.40831], [19.65972, 42.62774], [19.73244, 42.66299], [19.77375, 42.58517], [19.74731, 42.57422], [19.76549, 42.50237], [19.82333, 42.46581], [19.9324, 42.51699], [20.00842, 42.5109], [20.01834, 42.54622], [20.07761, 42.55582], [20.0969, 42.65559], [20.02915, 42.71147], [20.02088, 42.74789], [20.04898, 42.77701], [20.2539, 42.76245], [20.27869, 42.81945], [20.35692, 42.8335], [20.34528, 42.90676], [20.16415, 42.97177], [20.14896, 42.99058], [20.12325, 42.96237], [20.05431, 42.99571], [20.04729, 43.02732], [19.98887, 43.0538], [19.96549, 43.11098], [19.92576, 43.08539], [19.79255, 43.11951], [19.76918, 43.16044], [19.64063, 43.19027], [19.62661, 43.2286], [19.54598, 43.25158], [19.52962, 43.31623], [19.48171, 43.32644], [19.44315, 43.38846], [19.22229, 43.47926], [19.22807, 43.5264]]]] } },
23231     { type: "Feature", properties: { iso1A2: "MF", iso1A3: "MAF", iso1N3: "663", wikidata: "Q126125", nameEn: "Saint-Martin", country: "FR", groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], callingCodes: ["590"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.93924, 18.02904], [-62.62718, 18.26185], [-63.35989, 18.06012], [-63.33064, 17.9615], [-63.13502, 18.05445], [-63.11042, 18.05339], [-63.09686, 18.04608], [-63.07759, 18.04943], [-63.0579, 18.06614], [-63.04039, 18.05619], [-63.02323, 18.05757], [-62.93924, 18.02904]]]] } },
23232     { type: "Feature", properties: { iso1A2: "MG", iso1A3: "MDG", iso1N3: "450", wikidata: "Q1019", nameEn: "Madagascar", aliases: ["RM"], groups: ["014", "202", "002", "UN"], callingCodes: ["261"] }, geometry: { type: "MultiPolygon", coordinates: [[[[51.93891, -10.85085], [45.84651, -12.77177], [42.14681, -19.63341], [45.80092, -33.00974], [51.93891, -10.85085]]]] } },
23233     { type: "Feature", properties: { iso1A2: "MH", iso1A3: "MHL", iso1N3: "584", wikidata: "Q709", nameEn: "Marshall Islands", groups: ["057", "009", "UN"], roadSpeedUnit: "mph", callingCodes: ["692"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169, 3.9], [173.53711, 5.70687], [169.29099, 15.77133], [159.04653, 10.59067], [169, 3.9]]]] } },
23234     { type: "Feature", properties: { iso1A2: "MK", iso1A3: "MKD", iso1N3: "807", wikidata: "Q221", nameEn: "North Macedonia", groups: ["039", "150", "UN"], callingCodes: ["389"] }, geometry: { type: "MultiPolygon", coordinates: [[[[22.34773, 42.31725], [22.29275, 42.34913], [22.29605, 42.37477], [22.16384, 42.32103], [22.02908, 42.29848], [21.94405, 42.34669], [21.91595, 42.30392], [21.84654, 42.3247], [21.77176, 42.2648], [21.70111, 42.23789], [21.58992, 42.25915], [21.52145, 42.24465], [21.50823, 42.27156], [21.43882, 42.2789], [21.43882, 42.23609], [21.38428, 42.24465], [21.30496, 42.1418], [21.29913, 42.13954], [21.31983, 42.10993], [21.22728, 42.08909], [21.16614, 42.19815], [21.11491, 42.20794], [20.75464, 42.05229], [20.76786, 41.91839], [20.68523, 41.85318], [20.59524, 41.8818], [20.55976, 41.87068], [20.57144, 41.7897], [20.53405, 41.78099], [20.51301, 41.72433], [20.52937, 41.69292], [20.51769, 41.65975], [20.55508, 41.58113], [20.52103, 41.56473], [20.45809, 41.5549], [20.45331, 41.51436], [20.49039, 41.49277], [20.51301, 41.442], [20.55976, 41.4087], [20.52119, 41.34381], [20.49432, 41.33679], [20.51068, 41.2323], [20.59715, 41.13644], [20.58546, 41.11179], [20.59832, 41.09066], [20.63454, 41.0889], [20.65558, 41.08009], [20.71634, 40.91781], [20.73504, 40.9081], [20.81567, 40.89662], [20.83671, 40.92752], [20.94305, 40.92399], [20.97693, 40.90103], [20.97887, 40.85475], [21.15262, 40.85546], [21.21105, 40.8855], [21.25779, 40.86165], [21.35595, 40.87578], [21.41555, 40.9173], [21.53007, 40.90759], [21.57448, 40.86076], [21.69601, 40.9429], [21.7556, 40.92525], [21.91102, 41.04786], [21.90869, 41.09191], [22.06527, 41.15617], [22.1424, 41.12449], [22.17629, 41.15969], [22.26744, 41.16409], [22.42285, 41.11921], [22.5549, 41.13065], [22.58295, 41.11568], [22.62852, 41.14385], [22.65306, 41.18168], [22.71266, 41.13945], [22.74538, 41.16321], [22.76408, 41.32225], [22.81199, 41.3398], [22.93334, 41.34104], [22.96331, 41.35782], [22.95513, 41.63265], [23.03342, 41.71034], [23.01239, 41.76527], [22.96682, 41.77137], [22.90254, 41.87587], [22.86749, 42.02275], [22.67701, 42.06614], [22.51224, 42.15457], [22.50289, 42.19527], [22.47251, 42.20393], [22.38136, 42.30339], [22.34773, 42.31725]]]] } },
23235     { type: "Feature", properties: { iso1A2: "ML", iso1A3: "MLI", iso1N3: "466", wikidata: "Q912", nameEn: "Mali", groups: ["011", "202", "002", "UN"], callingCodes: ["223"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-4.83423, 24.99935], [-6.57191, 25.0002], [-5.60725, 16.49919], [-5.33435, 16.33354], [-5.50165, 15.50061], [-9.32979, 15.50032], [-9.31106, 15.69412], [-9.33314, 15.7044], [-9.44673, 15.60553], [-9.40447, 15.4396], [-10.71721, 15.4223], [-10.90932, 15.11001], [-11.43483, 15.62339], [-11.70705, 15.51558], [-11.94903, 14.76143], [-12.23936, 14.76324], [-11.93043, 13.84505], [-12.06897, 13.71049], [-11.83345, 13.33333], [-11.63025, 13.39174], [-11.39935, 12.97808], [-11.37536, 12.40788], [-11.50006, 12.17826], [-11.24136, 12.01286], [-10.99758, 12.24634], [-10.80355, 12.1053], [-10.71897, 11.91552], [-10.30604, 12.24634], [-9.714, 12.0226], [-9.63938, 12.18312], [-9.32097, 12.29009], [-9.38067, 12.48446], [-9.13689, 12.50875], [-8.94784, 12.34842], [-8.80854, 11.66715], [-8.40058, 11.37466], [-8.66923, 10.99397], [-8.35083, 11.06234], [-8.2667, 10.91762], [-8.32614, 10.69273], [-8.22711, 10.41722], [-8.10207, 10.44649], [-7.9578, 10.2703], [-7.97971, 10.17117], [-7.92107, 10.15577], [-7.63048, 10.46334], [-7.54462, 10.40921], [-7.52261, 10.4655], [-7.44555, 10.44602], [-7.3707, 10.24677], [-7.13331, 10.24877], [-7.0603, 10.14711], [-7.00966, 10.15794], [-6.97444, 10.21644], [-7.01186, 10.25111], [-6.93921, 10.35291], [-6.68164, 10.35074], [-6.63541, 10.66893], [-6.52974, 10.59104], [-6.42847, 10.5694], [-6.40646, 10.69922], [-6.325, 10.68624], [-6.24795, 10.74248], [-6.1731, 10.46983], [-6.18851, 10.24244], [-5.99478, 10.19694], [-5.78124, 10.43952], [-5.65135, 10.46767], [-5.51058, 10.43177], [-5.46643, 10.56074], [-5.47083, 10.75329], [-5.41579, 10.84628], [-5.49284, 11.07538], [-5.32994, 11.13371], [-5.32553, 11.21578], [-5.25949, 11.24816], [-5.25509, 11.36905], [-5.20665, 11.43811], [-5.22867, 11.60421], [-5.29251, 11.61715], [-5.26389, 11.75728], [-5.40258, 11.8327], [-5.26389, 11.84778], [-5.07897, 11.97918], [-4.72893, 12.01579], [-4.70692, 12.06746], [-4.62987, 12.06531], [-4.62546, 12.13204], [-4.54841, 12.1385], [-4.57703, 12.19875], [-4.41412, 12.31922], [-4.47356, 12.71252], [-4.238, 12.71467], [-4.21819, 12.95722], [-4.34477, 13.12927], [-3.96501, 13.49778], [-3.90558, 13.44375], [-3.96282, 13.38164], [-3.7911, 13.36665], [-3.54454, 13.1781], [-3.4313, 13.1588], [-3.43507, 13.27272], [-3.23599, 13.29035], [-3.28396, 13.5422], [-3.26407, 13.70699], [-2.88189, 13.64921], [-2.90831, 13.81174], [-2.84667, 14.05532], [-2.66175, 14.14713], [-2.47587, 14.29671], [-2.10223, 14.14878], [-1.9992, 14.19011], [-1.97945, 14.47709], [-1.68083, 14.50023], [-1.32166, 14.72774], [-1.05875, 14.7921], [-0.72004, 15.08655], [-0.24673, 15.07805], [0.06588, 14.96961], [0.23859, 15.00135], [0.72632, 14.95898], [0.96711, 14.98275], [1.31275, 15.27978], [3.01806, 15.34571], [3.03134, 15.42221], [3.50368, 15.35934], [4.19893, 16.39923], [4.21787, 17.00118], [4.26762, 17.00432], [4.26651, 19.14224], [3.36082, 18.9745], [3.12501, 19.1366], [3.24648, 19.81703], [1.20992, 20.73533], [1.15698, 21.12843], [-4.83423, 24.99935]]]] } },
23236     { type: "Feature", properties: { iso1A2: "MM", iso1A3: "MMR", iso1N3: "104", wikidata: "Q836", nameEn: "Myanmar", aliases: ["Burma", "BU"], groups: ["035", "142", "UN"], callingCodes: ["95"] }, geometry: { type: "MultiPolygon", coordinates: [[[[92.62187, 21.87037], [92.59775, 21.6092], [92.68152, 21.28454], [92.60187, 21.24615], [92.55105, 21.3856], [92.43158, 21.37025], [92.37939, 21.47764], [92.20087, 21.337], [92.17752, 21.17445], [92.26071, 21.05697], [92.47409, 20.38654], [92.61042, 13.76986], [94.6371, 13.81803], [97.63455, 9.60854], [98.12555, 9.44056], [98.33094, 9.91973], [98.47298, 9.95782], [98.52291, 9.92389], [98.55174, 9.92804], [98.7391, 10.31488], [98.81944, 10.52761], [98.77275, 10.62548], [98.78511, 10.68351], [98.86819, 10.78336], [99.0069, 10.85485], [98.99701, 10.92962], [99.02337, 10.97217], [99.06938, 10.94857], [99.32756, 11.28545], [99.31573, 11.32081], [99.39485, 11.3925], [99.47598, 11.62434], [99.5672, 11.62732], [99.64108, 11.78948], [99.64891, 11.82699], [99.53424, 12.02317], [99.56445, 12.14805], [99.47519, 12.1353], [99.409, 12.60603], [99.29254, 12.68921], [99.18905, 12.84799], [99.18748, 12.9898], [99.10646, 13.05804], [99.12225, 13.19847], [99.20617, 13.20575], [99.16695, 13.72621], [98.97356, 14.04868], [98.56762, 14.37701], [98.24874, 14.83013], [98.18821, 15.13125], [98.22, 15.21327], [98.30446, 15.30667], [98.40522, 15.25268], [98.41906, 15.27103], [98.39351, 15.34177], [98.4866, 15.39154], [98.56027, 15.33471], [98.58598, 15.46821], [98.541, 15.65406], [98.59853, 15.87197], [98.57019, 16.04578], [98.69585, 16.13353], [98.8376, 16.11706], [98.92656, 16.36425], [98.84485, 16.42354], [98.68074, 16.27068], [98.63817, 16.47424], [98.57912, 16.55983], [98.5695, 16.62826], [98.51113, 16.64503], [98.51833, 16.676], [98.51472, 16.68521], [98.51579, 16.69433], [98.51043, 16.70107], [98.49713, 16.69022], [98.50253, 16.7139], [98.46994, 16.73613], [98.53833, 16.81934], [98.49603, 16.8446], [98.52624, 16.89979], [98.39441, 17.06266], [98.34566, 17.04822], [98.10439, 17.33847], [98.11185, 17.36829], [97.91829, 17.54504], [97.76407, 17.71595], [97.66794, 17.88005], [97.73723, 17.97912], [97.60841, 18.23846], [97.64116, 18.29778], [97.56219, 18.33885], [97.50383, 18.26844], [97.34522, 18.54596], [97.36444, 18.57138], [97.5258, 18.4939], [97.76752, 18.58097], [97.73836, 18.88478], [97.66487, 18.9371], [97.73654, 18.9812], [97.73797, 19.04261], [97.83479, 19.09972], [97.84024, 19.22217], [97.78606, 19.26769], [97.84186, 19.29526], [97.78769, 19.39429], [97.88423, 19.5041], [97.84715, 19.55782], [98.04364, 19.65755], [98.03314, 19.80941], [98.13829, 19.78541], [98.24884, 19.67876], [98.51182, 19.71303], [98.56065, 19.67807], [98.83661, 19.80931], [98.98679, 19.7419], [99.0735, 20.10298], [99.20328, 20.12877], [99.416, 20.08614], [99.52943, 20.14811], [99.5569, 20.20676], [99.46077, 20.36198], [99.46008, 20.39673], [99.68255, 20.32077], [99.81096, 20.33687], [99.86383, 20.44371], [99.88211, 20.44488], [99.88451, 20.44596], [99.89168, 20.44548], [99.89301, 20.44311], [99.89692, 20.44789], [99.90499, 20.4487], [99.91616, 20.44986], [99.95721, 20.46301], [100.08404, 20.36626], [100.1957, 20.68247], [100.36375, 20.82783], [100.51079, 20.82194], [100.60112, 20.8347], [100.64628, 20.88279], [100.50974, 20.88574], [100.55281, 21.02796], [100.63578, 21.05639], [100.72716, 21.31786], [100.80173, 21.2934], [101.00234, 21.39612], [101.16198, 21.52808], [101.15156, 21.56129], [101.11744, 21.77659], [100.87265, 21.67396], [100.72143, 21.51898], [100.57861, 21.45637], [100.4811, 21.46148], [100.42892, 21.54325], [100.35201, 21.53176], [100.25863, 21.47043], [100.18447, 21.51898], [100.1625, 21.48704], [100.12542, 21.50365], [100.10757, 21.59945], [100.17486, 21.65306], [100.12679, 21.70539], [100.04956, 21.66843], [99.98654, 21.71064], [99.94003, 21.82782], [99.99084, 21.97053], [99.96612, 22.05965], [99.85351, 22.04183], [99.47585, 22.13345], [99.33166, 22.09656], [99.1552, 22.15874], [99.19176, 22.16983], [99.17318, 22.18025], [99.28771, 22.4105], [99.37972, 22.50188], [99.38247, 22.57544], [99.31243, 22.73893], [99.45654, 22.85726], [99.43537, 22.94086], [99.54218, 22.90014], [99.52214, 23.08218], [99.34127, 23.13099], [99.25741, 23.09025], [99.04601, 23.12215], [99.05975, 23.16382], [98.88597, 23.18656], [98.92515, 23.29535], [98.93958, 23.31414], [98.87573, 23.33038], [98.92104, 23.36946], [98.87683, 23.48995], [98.82877, 23.47908], [98.80294, 23.5345], [98.88396, 23.59555], [98.81775, 23.694], [98.82933, 23.72921], [98.79607, 23.77947], [98.68209, 23.80492], [98.67797, 23.9644], [98.89632, 24.10612], [98.87998, 24.15624], [98.85319, 24.13042], [98.59256, 24.08371], [98.54476, 24.13119], [98.20666, 24.11406], [98.07806, 24.07988], [98.06703, 24.08028], [98.0607, 24.07812], [98.05671, 24.07961], [98.05302, 24.07408], [98.04709, 24.07616], [97.99583, 24.04932], [97.98691, 24.03897], [97.93951, 24.01953], [97.90998, 24.02094], [97.88616, 24.00463], [97.88414, 23.99405], [97.88814, 23.98605], [97.89683, 23.98389], [97.89676, 23.97931], [97.8955, 23.97758], [97.88811, 23.97446], [97.86545, 23.97723], [97.84328, 23.97603], [97.79416, 23.95663], [97.79456, 23.94836], [97.72302, 23.89288], [97.64667, 23.84574], [97.5247, 23.94032], [97.62363, 24.00506], [97.72903, 24.12606], [97.75305, 24.16902], [97.72799, 24.18883], [97.72998, 24.2302], [97.76799, 24.26365], [97.71941, 24.29652], [97.66723, 24.30027], [97.65624, 24.33781], [97.7098, 24.35658], [97.66998, 24.45288], [97.60029, 24.4401], [97.52757, 24.43748], [97.56286, 24.54535], [97.56525, 24.72838], [97.54675, 24.74202], [97.5542, 24.74943], [97.56383, 24.75535], [97.56648, 24.76475], [97.64354, 24.79171], [97.70181, 24.84557], [97.73127, 24.83015], [97.76481, 24.8289], [97.79949, 24.85655], [97.72903, 24.91332], [97.72216, 25.08508], [97.77023, 25.11492], [97.83614, 25.2715], [97.92541, 25.20815], [98.14925, 25.41547], [98.12591, 25.50722], [98.18084, 25.56298], [98.16848, 25.62739], [98.25774, 25.6051], [98.31268, 25.55307], [98.40606, 25.61129], [98.54064, 25.85129], [98.63128, 25.79937], [98.70818, 25.86241], [98.60763, 26.01512], [98.57085, 26.11547], [98.63128, 26.15492], [98.66884, 26.09165], [98.7329, 26.17218], [98.67797, 26.24487], [98.72741, 26.36183], [98.77547, 26.61994], [98.7333, 26.85615], [98.69582, 27.56499], [98.43353, 27.67086], [98.42529, 27.55404], [98.32641, 27.51385], [98.13964, 27.9478], [98.15337, 28.12114], [97.90069, 28.3776], [97.79632, 28.33168], [97.70705, 28.5056], [97.56835, 28.55628], [97.50518, 28.49716], [97.47085, 28.2688], [97.41729, 28.29783], [97.34547, 28.21385], [97.31292, 28.06784], [97.35412, 28.06663], [97.38845, 28.01329], [97.35824, 27.87256], [97.29919, 27.92233], [96.90112, 27.62149], [96.91431, 27.45752], [97.17422, 27.14052], [97.14675, 27.09041], [96.89132, 27.17474], [96.85287, 27.2065], [96.88445, 27.25046], [96.73888, 27.36638], [96.55761, 27.29928], [96.40779, 27.29818], [96.15591, 27.24572], [96.04949, 27.19428], [95.93002, 27.04149], [95.81603, 27.01335], [95.437, 26.7083], [95.30339, 26.65372], [95.23513, 26.68499], [95.05798, 26.45408], [95.12801, 26.38397], [95.11428, 26.1019], [95.18556, 26.07338], [94.80117, 25.49359], [94.68032, 25.47003], [94.57458, 25.20318], [94.74212, 25.13606], [94.73937, 25.00545], [94.60204, 24.70889], [94.5526, 24.70764], [94.50729, 24.59281], [94.45279, 24.56656], [94.32362, 24.27692], [94.30215, 24.23752], [94.14081, 23.83333], [93.92089, 23.95812], [93.80279, 23.92549], [93.75952, 24.0003], [93.62871, 24.00922], [93.50616, 23.94432], [93.46633, 23.97067], [93.41415, 24.07854], [93.34735, 24.10151], [93.32351, 24.04468], [93.36059, 23.93176], [93.3908, 23.92925], [93.3908, 23.7622], [93.43475, 23.68299], [93.38805, 23.4728], [93.39981, 23.38828], [93.38781, 23.36139], [93.36862, 23.35426], [93.38478, 23.13698], [93.2878, 23.00464], [93.12988, 23.05772], [93.134, 22.92498], [93.09417, 22.69459], [93.134, 22.59573], [93.11477, 22.54374], [93.13537, 22.45873], [93.18206, 22.43716], [93.19991, 22.25425], [93.14224, 22.24535], [93.15734, 22.18687], [93.04885, 22.20595], [92.99255, 22.05965], [92.99804, 21.98964], [92.93899, 22.02656], [92.89504, 21.95143], [92.86208, 22.05456], [92.70416, 22.16017], [92.67532, 22.03547], [92.60949, 21.97638], [92.62187, 21.87037]]]] } },
23237     { type: "Feature", properties: { iso1A2: "MN", iso1A3: "MNG", iso1N3: "496", wikidata: "Q711", nameEn: "Mongolia", groups: ["030", "142", "UN"], callingCodes: ["976"] }, geometry: { type: "MultiPolygon", coordinates: [[[[102.14032, 51.35566], [101.5044, 51.50467], [101.39085, 51.45753], [100.61116, 51.73028], [99.89203, 51.74903], [99.75578, 51.90108], [99.27888, 51.96876], [98.87768, 52.14563], [98.74142, 51.8637], [98.33222, 51.71832], [98.22053, 51.46579], [98.05257, 51.46696], [97.83305, 51.00248], [98.01472, 50.86652], [97.9693, 50.78044], [98.06393, 50.61262], [98.31373, 50.4996], [98.29481, 50.33561], [97.85197, 49.91339], [97.76871, 49.99861], [97.56432, 49.92801], [97.56811, 49.84265], [97.24639, 49.74737], [96.97388, 49.88413], [95.80056, 50.04239], [95.74757, 49.97915], [95.02465, 49.96941], [94.97166, 50.04725], [94.6121, 50.04239], [94.49477, 50.17832], [94.39258, 50.22193], [94.30823, 50.57498], [92.99595, 50.63183], [93.01109, 50.79001], [92.44714, 50.78762], [92.07173, 50.69585], [91.86048, 50.73734], [89.59711, 49.90851], [89.70687, 49.72535], [88.82499, 49.44808], [88.42449, 49.48821], [88.17223, 49.46934], [88.15543, 49.30314], [87.98977, 49.18147], [87.81333, 49.17354], [87.88171, 48.95853], [87.73822, 48.89582], [88.0788, 48.71436], [87.96361, 48.58478], [88.58939, 48.34531], [88.58316, 48.21893], [88.8011, 48.11302], [88.93186, 48.10263], [89.0711, 47.98528], [89.55453, 48.0423], [89.76624, 47.82745], [90.06512, 47.88177], [90.10871, 47.7375], [90.33598, 47.68303], [90.48854, 47.41826], [90.48542, 47.30438], [90.76108, 46.99399], [90.84035, 46.99525], [91.03649, 46.72916], [91.0147, 46.58171], [91.07696, 46.57315], [90.89639, 46.30711], [90.99672, 46.14207], [91.03026, 46.04194], [90.70907, 45.73437], [90.65114, 45.49314], [90.89169, 45.19667], [91.64048, 45.07408], [93.51161, 44.95964], [94.10003, 44.71016], [94.71959, 44.35284], [95.01191, 44.25274], [95.39772, 44.2805], [95.32891, 44.02407], [95.52594, 43.99353], [95.89543, 43.2528], [96.35658, 42.90363], [96.37926, 42.72055], [97.1777, 42.7964], [99.50671, 42.56535], [100.33297, 42.68231], [100.84979, 42.67087], [101.80515, 42.50074], [102.07645, 42.22519], [102.72403, 42.14675], [103.92804, 41.78246], [104.52258, 41.8706], [104.51667, 41.66113], [105.0123, 41.63188], [106.76517, 42.28741], [107.24774, 42.36107], [107.29755, 42.41395], [107.49681, 42.46221], [107.57258, 42.40898], [108.84489, 42.40246], [109.00679, 42.45302], [109.452, 42.44842], [109.89402, 42.63111], [110.08401, 42.6411], [110.4327, 42.78293], [111.0149, 43.3289], [111.59087, 43.51207], [111.79758, 43.6637], [111.93776, 43.68709], [111.96289, 43.81596], [111.40498, 44.3461], [111.76275, 44.98032], [111.98695, 45.09074], [112.4164, 45.06858], [112.74662, 44.86297], [113.70918, 44.72891], [114.5166, 45.27189], [114.54801, 45.38337], [114.74612, 45.43585], [114.94546, 45.37377], [115.60329, 45.44717], [116.16989, 45.68603], [116.27366, 45.78637], [116.24012, 45.8778], [116.26678, 45.96479], [116.58612, 46.30211], [116.75551, 46.33083], [116.83166, 46.38637], [117.36609, 46.36335], [117.41782, 46.57862], [117.60748, 46.59771], [117.69554, 46.50991], [118.30534, 46.73519], [118.78747, 46.68689], [118.8337, 46.77742], [118.89974, 46.77139], [118.92616, 46.72765], [119.00541, 46.74273], [119.10448, 46.65516], [119.24978, 46.64761], [119.32827, 46.61433], [119.42827, 46.63783], [119.65265, 46.62342], [119.68127, 46.59015], [119.77373, 46.62947], [119.80455, 46.67631], [119.89261, 46.66423], [119.91242, 46.90091], [119.85518, 46.92196], [119.71209, 47.19192], [119.62403, 47.24575], [119.56019, 47.24874], [119.54918, 47.29505], [119.31964, 47.42617], [119.35892, 47.48104], [119.13995, 47.53997], [119.12343, 47.66458], [118.7564, 47.76947], [118.55766, 47.99277], [118.29654, 48.00246], [118.22677, 48.03853], [118.11009, 48.04], [118.03676, 48.00982], [117.80196, 48.01661], [117.50181, 47.77216], [117.37875, 47.63627], [116.9723, 47.87285], [116.67405, 47.89039], [116.4465, 47.83662], [116.21879, 47.88505], [115.94296, 47.67741], [115.57128, 47.91988], [115.52082, 48.15367], [115.811, 48.25699], [115.78876, 48.51781], [116.06565, 48.81716], [116.03781, 48.87014], [116.71193, 49.83813], [116.62502, 49.92919], [116.22402, 50.04477], [115.73602, 49.87688], [115.26068, 49.97367], [114.9703, 50.19254], [114.325, 50.28098], [113.20216, 49.83356], [113.02647, 49.60772], [110.64493, 49.1816], [110.39891, 49.25083], [110.24373, 49.16676], [109.51325, 49.22859], [109.18017, 49.34709], [108.53969, 49.32325], [108.27937, 49.53167], [107.95387, 49.66659], [107.96116, 49.93191], [107.36407, 49.97612], [107.1174, 50.04239], [107.00007, 50.1977], [106.80326, 50.30177], [106.58373, 50.34044], [106.51122, 50.34408], [106.49628, 50.32436], [106.47156, 50.31909], [106.07865, 50.33474], [106.05562, 50.40582], [105.32528, 50.4648], [103.70343, 50.13952], [102.71178, 50.38873], [102.32194, 50.67982], [102.14032, 51.35566]]]] } },
23238     { type: "Feature", properties: { iso1A2: "MO", iso1A3: "MAC", iso1N3: "446", wikidata: "Q14773", nameEn: "Macau", aliases: ["Macao"], country: "CN", groups: ["030", "142", "UN"], driveSide: "left", callingCodes: ["853"] }, geometry: { type: "MultiPolygon", coordinates: [[[[113.54942, 22.14519], [113.54839, 22.10909], [113.57191, 22.07696], [113.63011, 22.10782], [113.60504, 22.20464], [113.57123, 22.20416], [113.56865, 22.20973], [113.5508, 22.21672], [113.54333, 22.21688], [113.54093, 22.21314], [113.53593, 22.2137], [113.53301, 22.21235], [113.53552, 22.20607], [113.52659, 22.18271], [113.54093, 22.15497], [113.54942, 22.14519]]]] } },
23239     { type: "Feature", properties: { iso1A2: "MP", iso1A3: "MNP", iso1N3: "580", wikidata: "Q16644", nameEn: "Northern Mariana Islands", aliases: ["US-MP"], country: "US", groups: ["Q1352230", "Q153732", "057", "009", "UN"], roadSpeedUnit: "mph", callingCodes: ["1 670"] }, geometry: { type: "MultiPolygon", coordinates: [[[[135.52896, 14.32623], [152.19114, 13.63487], [145.05972, 21.28731], [135.52896, 14.32623]]]] } },
23240     { type: "Feature", properties: { iso1A2: "MQ", iso1A3: "MTQ", iso1N3: "474", wikidata: "Q17054", nameEn: "Martinique", country: "FR", groups: ["Q3320166", "EU", "029", "003", "419", "019", "UN"], callingCodes: ["596"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-59.95997, 14.20285], [-61.07821, 15.25109], [-61.69315, 14.26451], [-59.95997, 14.20285]]]] } },
23241     { type: "Feature", properties: { iso1A2: "MR", iso1A3: "MRT", iso1N3: "478", wikidata: "Q1025", nameEn: "Mauritania", groups: ["011", "202", "002", "UN"], callingCodes: ["222"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-5.60725, 16.49919], [-6.57191, 25.0002], [-4.83423, 24.99935], [-8.66674, 27.31569], [-8.66721, 25.99918], [-12.0002, 25.9986], [-12.00251, 23.4538], [-12.14969, 23.41935], [-12.36213, 23.3187], [-12.5741, 23.28975], [-13.00412, 23.02297], [-13.10753, 22.89493], [-13.15313, 22.75649], [-13.08438, 22.53866], [-13.01525, 21.33343], [-16.95474, 21.33997], [-16.99806, 21.12142], [-17.0357, 21.05368], [-17.0396, 20.9961], [-17.06781, 20.92697], [-17.0695, 20.85742], [-17.0471, 20.76408], [-17.15288, 16.07139], [-16.50854, 16.09032], [-16.48967, 16.0496], [-16.44814, 16.09753], [-16.4429, 16.20605], [-16.27016, 16.51565], [-15.6509, 16.50315], [-15.00557, 16.64997], [-14.32144, 16.61495], [-13.80075, 16.13961], [-13.43135, 16.09022], [-13.11029, 15.52116], [-12.23936, 14.76324], [-11.94903, 14.76143], [-11.70705, 15.51558], [-11.43483, 15.62339], [-10.90932, 15.11001], [-10.71721, 15.4223], [-9.40447, 15.4396], [-9.44673, 15.60553], [-9.33314, 15.7044], [-9.31106, 15.69412], [-9.32979, 15.50032], [-5.50165, 15.50061], [-5.33435, 16.33354], [-5.60725, 16.49919]]]] } },
23242     { type: "Feature", properties: { iso1A2: "MS", iso1A3: "MSR", iso1N3: "500", wikidata: "Q13353", nameEn: "Montserrat", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 664"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.91508, 16.51165], [-62.1023, 16.97277], [-62.58307, 16.68909], [-61.91508, 16.51165]]]] } },
23243     { type: "Feature", properties: { iso1A2: "MT", iso1A3: "MLT", iso1N3: "470", wikidata: "Q233", nameEn: "Malta", groups: ["EU", "039", "150", "UN"], driveSide: "left", callingCodes: ["356"] }, geometry: { type: "MultiPolygon", coordinates: [[[[15.70991, 35.79901], [14.07544, 36.41525], [13.27636, 35.20764], [15.70991, 35.79901]]]] } },
23244     { type: "Feature", properties: { iso1A2: "MU", iso1A3: "MUS", iso1N3: "480", wikidata: "Q1027", nameEn: "Mauritius", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["230"] }, geometry: { type: "MultiPolygon", coordinates: [[[[56.09755, -9.55401], [57.50644, -31.92637], [68.4673, -19.15185], [56.09755, -9.55401]]]] } },
23245     { type: "Feature", properties: { iso1A2: "MV", iso1A3: "MDV", iso1N3: "462", wikidata: "Q826", nameEn: "Maldives", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["960"] }, geometry: { type: "MultiPolygon", coordinates: [[[[71.9161, 8.55531], [72.57428, -3.7623], [76.59015, 5.591], [71.9161, 8.55531]]]] } },
23246     { type: "Feature", properties: { iso1A2: "MW", iso1A3: "MWI", iso1N3: "454", wikidata: "Q1020", nameEn: "Malawi", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["265"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.48052, -9.62442], [33.31581, -9.48554], [33.14925, -9.49322], [32.99397, -9.36712], [32.95389, -9.40138], [33.00476, -9.5133], [33.00256, -9.63053], [33.05485, -9.61316], [33.10163, -9.66525], [33.12144, -9.58929], [33.2095, -9.61099], [33.31517, -9.82364], [33.36581, -9.81063], [33.37902, -9.9104], [33.31297, -10.05133], [33.53863, -10.20148], [33.54797, -10.36077], [33.70675, -10.56896], [33.47636, -10.78465], [33.28022, -10.84428], [33.25998, -10.88862], [33.39697, -11.15296], [33.29267, -11.3789], [33.29267, -11.43536], [33.23663, -11.40637], [33.24252, -11.59302], [33.32692, -11.59248], [33.33937, -11.91252], [33.25998, -12.14242], [33.3705, -12.34931], [33.47636, -12.32498], [33.54485, -12.35996], [33.37517, -12.54085], [33.28177, -12.54692], [33.18837, -12.61377], [33.05917, -12.59554], [32.94397, -12.76868], [32.96733, -12.88251], [33.02181, -12.88707], [32.98289, -13.12671], [33.0078, -13.19492], [32.86113, -13.47292], [32.84176, -13.52794], [32.73683, -13.57682], [32.68436, -13.55769], [32.66468, -13.60019], [32.68654, -13.64268], [32.7828, -13.64805], [32.84528, -13.71576], [32.76962, -13.77224], [32.79015, -13.80755], [32.88985, -13.82956], [32.99042, -13.95689], [33.02977, -14.05022], [33.07568, -13.98447], [33.16749, -13.93992], [33.24249, -14.00019], [33.66677, -14.61306], [33.7247, -14.4989], [33.88503, -14.51652], [33.92898, -14.47929], [34.08588, -14.48893], [34.18733, -14.43823], [34.22355, -14.43607], [34.34453, -14.3985], [34.35843, -14.38652], [34.39277, -14.39467], [34.4192, -14.43191], [34.44641, -14.47746], [34.45053, -14.49873], [34.47628, -14.53363], [34.48932, -14.53646], [34.49636, -14.55091], [34.52366, -14.5667], [34.53962, -14.59776], [34.55112, -14.64494], [34.53516, -14.67782], [34.52057, -14.68263], [34.54503, -14.74672], [34.567, -14.77345], [34.61522, -14.99583], [34.57503, -15.30619], [34.43126, -15.44778], [34.44981, -15.60864], [34.25195, -15.90321], [34.43126, -16.04737], [34.40344, -16.20923], [35.04805, -16.83167], [35.13771, -16.81687], [35.17017, -16.93521], [35.04805, -17.00027], [35.0923, -17.13235], [35.3062, -17.1244], [35.27065, -16.93817], [35.30929, -16.82871], [35.27219, -16.69402], [35.14235, -16.56812], [35.25828, -16.4792], [35.30157, -16.2211], [35.43355, -16.11371], [35.52365, -16.15414], [35.70107, -16.10147], [35.80487, -16.03907], [35.85303, -15.41913], [35.78799, -15.17428], [35.91812, -14.89514], [35.87212, -14.89478], [35.86945, -14.67481], [35.5299, -14.27714], [35.47989, -14.15594], [34.86229, -13.48958], [34.60253, -13.48487], [34.37831, -12.17408], [34.46088, -12.0174], [34.70739, -12.15652], [34.82903, -12.04837], [34.57917, -11.87849], [34.64241, -11.57499], [34.96296, -11.57354], [34.91153, -11.39799], [34.79375, -11.32245], [34.63305, -11.11731], [34.61161, -11.01611], [34.67047, -10.93796], [34.65946, -10.6828], [34.57581, -10.56271], [34.51911, -10.12279], [34.54499, -10.0678], [34.03865, -9.49398], [33.95829, -9.54066], [33.9638, -9.62206], [33.93298, -9.71647], [33.76677, -9.58516], [33.48052, -9.62442]]]] } },
23247     { type: "Feature", properties: { iso1A2: "MX", iso1A3: "MEX", iso1N3: "484", wikidata: "Q96", nameEn: "Mexico", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["52"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-117.1243, 32.53427], [-118.48109, 32.5991], [-120.12904, 18.41089], [-92.37213, 14.39277], [-92.2261, 14.53423], [-92.1454, 14.6804], [-92.18161, 14.84147], [-92.1423, 14.88647], [-92.1454, 14.98143], [-92.0621, 15.07406], [-92.20983, 15.26077], [-91.73182, 16.07371], [-90.44567, 16.07573], [-90.40499, 16.40524], [-90.61212, 16.49832], [-90.69064, 16.70697], [-91.04436, 16.92175], [-91.43809, 17.25373], [-90.99199, 17.25192], [-90.98678, 17.81655], [-89.14985, 17.81563], [-89.15105, 17.95104], [-89.03839, 18.0067], [-88.8716, 17.89535], [-88.71505, 18.0707], [-88.48242, 18.49164], [-88.3268, 18.49048], [-88.29909, 18.47591], [-88.26593, 18.47617], [-88.03238, 18.41778], [-88.03165, 18.16657], [-87.90671, 18.15213], [-87.87604, 18.18313], [-87.86657, 18.19971], [-87.85693, 18.18266], [-87.84815, 18.18511], [-86.92368, 17.61462], [-85.9092, 21.8218], [-96.92418, 25.97377], [-97.13927, 25.96583], [-97.35946, 25.92189], [-97.37332, 25.83854], [-97.42511, 25.83969], [-97.45669, 25.86874], [-97.49828, 25.89877], [-97.52025, 25.88518], [-97.66511, 26.01708], [-97.95155, 26.0625], [-97.97017, 26.05232], [-98.24603, 26.07191], [-98.27075, 26.09457], [-98.30491, 26.10475], [-98.35126, 26.15129], [-99.00546, 26.3925], [-99.03053, 26.41249], [-99.08477, 26.39849], [-99.53573, 27.30926], [-99.49744, 27.43746], [-99.482, 27.47128], [-99.48045, 27.49016], [-99.50208, 27.50021], [-99.52955, 27.49747], [-99.51478, 27.55836], [-99.55409, 27.61314], [-100.50029, 28.66117], [-100.51222, 28.70679], [-100.5075, 28.74066], [-100.52313, 28.75598], [-100.59809, 28.88197], [-100.63689, 28.90812], [-100.67294, 29.09744], [-100.79696, 29.24688], [-100.87982, 29.296], [-100.94056, 29.33371], [-100.94579, 29.34523], [-100.96725, 29.3477], [-101.01128, 29.36947], [-101.05686, 29.44738], [-101.47277, 29.7744], [-102.60596, 29.8192], [-103.15787, 28.93865], [-104.37752, 29.54255], [-104.39363, 29.55396], [-104.3969, 29.57105], [-104.5171, 29.64671], [-104.77674, 30.4236], [-106.00363, 31.39181], [-106.09025, 31.40569], [-106.20346, 31.46305], [-106.23711, 31.51262], [-106.24612, 31.54193], [-106.28084, 31.56173], [-106.30305, 31.62154], [-106.33419, 31.66303], [-106.34864, 31.69663], [-106.3718, 31.71165], [-106.38003, 31.73151], [-106.41773, 31.75196], [-106.43419, 31.75478], [-106.45244, 31.76523], [-106.46726, 31.75998], [-106.47298, 31.75054], [-106.48815, 31.74769], [-106.50111, 31.75714], [-106.50962, 31.76155], [-106.51251, 31.76922], [-106.52266, 31.77509], [-106.529, 31.784], [-108.20899, 31.78534], [-108.20979, 31.33316], [-111.07523, 31.33232], [-114.82011, 32.49609], [-114.79524, 32.55731], [-114.81141, 32.55543], [-114.80584, 32.62028], [-114.76736, 32.64094], [-114.71871, 32.71894], [-115.88053, 32.63624], [-117.1243, 32.53427]]]] } },
23248     { type: "Feature", properties: { iso1A2: "MY", iso1A3: "MYS", iso1N3: "458", wikidata: "Q833", nameEn: "Malaysia" }, geometry: null },
23249     { type: "Feature", properties: { iso1A2: "MZ", iso1A3: "MOZ", iso1N3: "508", wikidata: "Q1029", nameEn: "Mozambique", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["258"] }, geometry: { type: "MultiPolygon", coordinates: [[[[40.74206, -10.25691], [40.44265, -10.4618], [40.00295, -10.80255], [39.58249, -10.96043], [39.24395, -11.17433], [38.88996, -11.16978], [38.47258, -11.4199], [38.21598, -11.27289], [37.93618, -11.26228], [37.8388, -11.3123], [37.76614, -11.53352], [37.3936, -11.68949], [36.80309, -11.56836], [36.62068, -11.72884], [36.19094, -11.70008], [36.19094, -11.57593], [35.82767, -11.41081], [35.63599, -11.55927], [34.96296, -11.57354], [34.64241, -11.57499], [34.57917, -11.87849], [34.82903, -12.04837], [34.70739, -12.15652], [34.46088, -12.0174], [34.37831, -12.17408], [34.60253, -13.48487], [34.86229, -13.48958], [35.47989, -14.15594], [35.5299, -14.27714], [35.86945, -14.67481], [35.87212, -14.89478], [35.91812, -14.89514], [35.78799, -15.17428], [35.85303, -15.41913], [35.80487, -16.03907], [35.70107, -16.10147], [35.52365, -16.15414], [35.43355, -16.11371], [35.30157, -16.2211], [35.25828, -16.4792], [35.14235, -16.56812], [35.27219, -16.69402], [35.30929, -16.82871], [35.27065, -16.93817], [35.3062, -17.1244], [35.0923, -17.13235], [35.04805, -17.00027], [35.17017, -16.93521], [35.13771, -16.81687], [35.04805, -16.83167], [34.40344, -16.20923], [34.43126, -16.04737], [34.25195, -15.90321], [34.44981, -15.60864], [34.43126, -15.44778], [34.57503, -15.30619], [34.61522, -14.99583], [34.567, -14.77345], [34.54503, -14.74672], [34.52057, -14.68263], [34.53516, -14.67782], [34.55112, -14.64494], [34.53962, -14.59776], [34.52366, -14.5667], [34.49636, -14.55091], [34.48932, -14.53646], [34.47628, -14.53363], [34.45053, -14.49873], [34.44641, -14.47746], [34.4192, -14.43191], [34.39277, -14.39467], [34.35843, -14.38652], [34.34453, -14.3985], [34.22355, -14.43607], [34.18733, -14.43823], [34.08588, -14.48893], [33.92898, -14.47929], [33.88503, -14.51652], [33.7247, -14.4989], [33.66677, -14.61306], [33.24249, -14.00019], [30.22098, -14.99447], [30.41902, -15.62269], [30.42568, -15.9962], [30.91597, -15.99924], [30.97761, -16.05848], [31.13171, -15.98019], [31.30563, -16.01193], [31.42451, -16.15154], [31.67988, -16.19595], [31.90223, -16.34388], [31.91324, -16.41569], [32.02772, -16.43892], [32.28529, -16.43892], [32.42838, -16.4727], [32.71017, -16.59932], [32.69917, -16.66893], [32.78943, -16.70267], [32.97655, -16.70689], [32.91051, -16.89446], [32.84113, -16.92259], [32.96554, -17.11971], [33.00517, -17.30477], [33.0426, -17.3468], [32.96554, -17.48964], [32.98536, -17.55891], [33.0492, -17.60298], [32.94133, -17.99705], [33.03159, -18.35054], [33.02278, -18.4696], [32.88629, -18.51344], [32.88629, -18.58023], [32.95013, -18.69079], [32.9017, -18.7992], [32.82465, -18.77419], [32.70137, -18.84712], [32.73439, -18.92628], [32.69917, -18.94293], [32.72118, -19.02204], [32.84006, -19.0262], [32.87088, -19.09279], [32.85107, -19.29238], [32.77966, -19.36098], [32.78282, -19.47513], [32.84446, -19.48343], [32.84666, -19.68462], [32.95013, -19.67219], [33.06461, -19.77787], [33.01178, -20.02007], [32.93032, -20.03868], [32.85987, -20.16686], [32.85987, -20.27841], [32.66174, -20.56106], [32.55167, -20.56312], [32.48122, -20.63319], [32.51644, -20.91929], [32.37115, -21.133], [32.48236, -21.32873], [32.41234, -21.31246], [31.38336, -22.36919], [31.30611, -22.422], [31.55779, -23.176], [31.56539, -23.47268], [31.67942, -23.60858], [31.70223, -23.72695], [31.77445, -23.90082], [31.87707, -23.95293], [31.90368, -24.18892], [31.9835, -24.29983], [32.03196, -25.10785], [32.01676, -25.38117], [31.97875, -25.46356], [32.00631, -25.65044], [31.92649, -25.84216], [31.974, -25.95387], [32.00916, -25.999], [32.08599, -26.00978], [32.10435, -26.15656], [32.07352, -26.40185], [32.13409, -26.5317], [32.13315, -26.84345], [32.19409, -26.84032], [32.22302, -26.84136], [32.29584, -26.852], [32.35222, -26.86027], [34.51034, -26.91792], [42.99868, -12.65261], [40.74206, -10.25691]]]] } },
23250     { type: "Feature", properties: { iso1A2: "NA", iso1A3: "NAM", iso1N3: "516", wikidata: "Q1030", nameEn: "Namibia", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["264"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.28743, -17.38814], [13.95896, -17.43141], [13.36212, -16.98048], [12.97145, -16.98567], [12.52111, -17.24495], [12.07076, -17.15165], [11.75063, -17.25013], [10.5065, -17.25284], [12.51595, -32.27486], [16.45332, -28.63117], [16.46592, -28.57126], [16.59922, -28.53246], [16.90446, -28.057], [17.15405, -28.08573], [17.4579, -28.68718], [18.99885, -28.89165], [19.99882, -28.42622], [19.99817, -24.76768], [19.99912, -21.99991], [20.99751, -22.00026], [20.99904, -18.31743], [21.45556, -18.31795], [23.0996, -18.00075], [23.29618, -17.99855], [23.61088, -18.4881], [24.19416, -18.01919], [24.40577, -17.95726], [24.57485, -18.07151], [24.6303, -17.9863], [24.71887, -17.9218], [24.73364, -17.89338], [24.95586, -17.79674], [25.05895, -17.84452], [25.16882, -17.78253], [25.26433, -17.79571], [25.00198, -17.58221], [24.70864, -17.49501], [24.5621, -17.52963], [24.38712, -17.46818], [24.32811, -17.49082], [24.23619, -17.47489], [23.47474, -17.62877], [21.42741, -18.02787], [21.14283, -17.94318], [18.84226, -17.80375], [18.39229, -17.38927], [14.28743, -17.38814]]]] } },
23251     { type: "Feature", properties: { iso1A2: "NC", iso1A3: "NCL", iso1N3: "540", wikidata: "Q33788", nameEn: "New Caledonia", country: "FR", groups: ["EU", "Q1451600", "054", "009", "UN"], callingCodes: ["687"] }, geometry: { type: "MultiPolygon", coordinates: [[[[159.77159, -28.41151], [174.245, -23.1974], [156.73836, -14.50464], [159.77159, -28.41151]]]] } },
23252     { type: "Feature", properties: { iso1A2: "NE", iso1A3: "NER", iso1N3: "562", wikidata: "Q1032", nameEn: "Niger", aliases: ["RN"], groups: ["011", "202", "002", "UN"], callingCodes: ["227"] }, geometry: { type: "MultiPolygon", coordinates: [[[[14.22918, 22.61719], [13.5631, 23.16574], [11.96886, 23.51735], [7.48273, 20.87258], [7.38361, 20.79165], [5.8153, 19.45101], [4.26651, 19.14224], [4.26762, 17.00432], [4.21787, 17.00118], [4.19893, 16.39923], [3.50368, 15.35934], [3.03134, 15.42221], [3.01806, 15.34571], [1.31275, 15.27978], [0.96711, 14.98275], [0.72632, 14.95898], [0.23859, 15.00135], [0.16936, 14.51654], [0.38051, 14.05575], [0.61924, 13.68491], [0.77377, 13.6866], [0.77637, 13.64442], [0.99514, 13.5668], [1.02813, 13.46635], [1.20088, 13.38951], [1.24429, 13.39373], [1.28509, 13.35488], [1.24516, 13.33968], [1.21217, 13.37853], [1.18873, 13.31771], [0.99253, 13.37515], [0.99167, 13.10727], [2.26349, 12.41915], [2.05785, 12.35539], [2.39723, 11.89473], [2.45824, 11.98672], [2.39657, 12.10952], [2.37783, 12.24804], [2.6593, 12.30631], [2.83978, 12.40585], [3.25352, 12.01467], [3.31613, 11.88495], [3.48187, 11.86092], [3.59375, 11.70269], [3.61075, 11.69181], [3.67988, 11.75429], [3.67122, 11.80865], [3.63063, 11.83042], [3.61955, 11.91847], [3.67775, 11.97599], [3.63136, 12.11826], [3.66364, 12.25884], [3.65111, 12.52223], [3.94339, 12.74979], [4.10006, 12.98862], [4.14367, 13.17189], [4.14186, 13.47586], [4.23456, 13.47725], [4.4668, 13.68286], [4.87425, 13.78], [4.9368, 13.7345], [5.07396, 13.75052], [5.21026, 13.73627], [5.27797, 13.75474], [5.35437, 13.83567], [5.52957, 13.8845], [6.15771, 13.64564], [6.27411, 13.67835], [6.43053, 13.6006], [6.69617, 13.34057], [6.94445, 12.99825], [7.0521, 13.00076], [7.12676, 13.02445], [7.22399, 13.1293], [7.39241, 13.09717], [7.81085, 13.34902], [8.07997, 13.30847], [8.25185, 13.20369], [8.41853, 13.06166], [8.49493, 13.07519], [8.60431, 13.01768], [8.64251, 12.93985], [8.97413, 12.83661], [9.65995, 12.80614], [10.00373, 13.18171], [10.19993, 13.27129], [10.46731, 13.28819], [10.66004, 13.36422], [11.4535, 13.37773], [11.88236, 13.2527], [12.04209, 13.14452], [12.16189, 13.10056], [12.19315, 13.12423], [12.47095, 13.06673], [12.58033, 13.27805], [12.6793, 13.29157], [12.87376, 13.48919], [13.05085, 13.53984], [13.19844, 13.52802], [13.33213, 13.71195], [13.6302, 13.71094], [13.47559, 14.40881], [13.48259, 14.46704], [13.68573, 14.55276], [13.67878, 14.64013], [13.809, 14.72915], [13.78991, 14.87519], [13.86301, 15.04043], [14.37425, 15.72591], [15.50373, 16.89649], [15.6032, 18.77402], [15.75098, 19.93002], [15.99632, 20.35364], [15.6721, 20.70069], [15.59841, 20.74039], [15.56004, 20.79488], [15.55382, 20.86507], [15.57248, 20.92138], [15.62515, 20.95395], [15.28332, 21.44557], [15.20213, 21.49365], [15.19692, 21.99339], [14.99751, 23.00539], [14.22918, 22.61719]]]] } },
23253     { type: "Feature", properties: { iso1A2: "NF", iso1A3: "NFK", iso1N3: "574", wikidata: "Q31057", nameEn: "Norfolk Island", country: "AU", groups: ["053", "009", "UN"], driveSide: "left", callingCodes: ["672 3"] }, geometry: { type: "MultiPolygon", coordinates: [[[[169.82316, -28.16667], [166.29505, -28.29175], [167.94076, -30.60745], [169.82316, -28.16667]]]] } },
23254     { type: "Feature", properties: { iso1A2: "NG", iso1A3: "NGA", iso1N3: "566", wikidata: "Q1033", nameEn: "Nigeria", groups: ["011", "202", "002", "UN"], callingCodes: ["234"] }, geometry: { type: "MultiPolygon", coordinates: [[[[6.15771, 13.64564], [5.52957, 13.8845], [5.35437, 13.83567], [5.27797, 13.75474], [5.21026, 13.73627], [5.07396, 13.75052], [4.9368, 13.7345], [4.87425, 13.78], [4.4668, 13.68286], [4.23456, 13.47725], [4.14186, 13.47586], [4.14367, 13.17189], [4.10006, 12.98862], [3.94339, 12.74979], [3.65111, 12.52223], [3.66364, 12.25884], [3.63136, 12.11826], [3.67775, 11.97599], [3.61955, 11.91847], [3.63063, 11.83042], [3.67122, 11.80865], [3.67988, 11.75429], [3.61075, 11.69181], [3.59375, 11.70269], [3.49175, 11.29765], [3.71505, 11.13015], [3.84243, 10.59316], [3.78292, 10.40538], [3.6844, 10.46351], [3.57275, 10.27185], [3.66908, 10.18136], [3.54429, 9.87739], [3.35383, 9.83641], [3.32099, 9.78032], [3.34726, 9.70696], [3.25093, 9.61632], [3.13928, 9.47167], [3.14147, 9.28375], [3.08017, 9.10006], [2.77907, 9.06924], [2.67523, 7.87825], [2.73095, 7.7755], [2.73405, 7.5423], [2.78668, 7.5116], [2.79442, 7.43486], [2.74489, 7.42565], [2.76965, 7.13543], [2.71702, 6.95722], [2.74024, 6.92802], [2.73405, 6.78508], [2.78823, 6.76356], [2.78204, 6.70514], [2.7325, 6.64057], [2.74334, 6.57291], [2.70464, 6.50831], [2.70566, 6.38038], [2.74181, 6.13349], [5.87055, 3.78489], [8.34397, 4.30689], [8.60302, 4.87353], [8.78027, 5.1243], [8.92029, 5.58403], [8.83687, 5.68483], [8.88156, 5.78857], [8.84209, 5.82562], [9.51757, 6.43874], [9.70674, 6.51717], [9.77824, 6.79088], [9.86314, 6.77756], [10.15135, 7.03781], [10.21466, 6.88996], [10.53639, 6.93432], [10.57214, 7.16345], [10.59746, 7.14719], [10.60789, 7.06885], [10.83727, 6.9358], [10.8179, 6.83377], [10.94302, 6.69325], [11.09644, 6.68437], [11.09495, 6.51717], [11.42041, 6.53789], [11.42264, 6.5882], [11.51499, 6.60892], [11.57755, 6.74059], [11.55818, 6.86186], [11.63117, 6.9905], [11.87396, 7.09398], [11.84864, 7.26098], [11.93205, 7.47812], [12.01844, 7.52981], [11.99908, 7.67302], [12.20909, 7.97553], [12.19271, 8.10826], [12.24782, 8.17904], [12.26123, 8.43696], [12.4489, 8.52536], [12.44146, 8.6152], [12.68722, 8.65938], [12.71701, 8.7595], [12.79, 8.75361], [12.81085, 8.91992], [12.90022, 9.11411], [12.91958, 9.33905], [12.85628, 9.36698], [13.02385, 9.49334], [13.22642, 9.57266], [13.25472, 9.76795], [13.29941, 9.8296], [13.25025, 9.86042], [13.24132, 9.91031], [13.27409, 9.93232], [13.286, 9.9822], [13.25323, 10.00127], [13.25025, 10.03647], [13.34111, 10.12299], [13.43644, 10.13326], [13.5705, 10.53183], [13.54964, 10.61236], [13.73434, 10.9255], [13.70753, 10.94451], [13.7403, 11.00593], [13.78945, 11.00154], [13.97489, 11.30258], [14.17821, 11.23831], [14.6124, 11.51283], [14.64591, 11.66166], [14.55207, 11.72001], [14.61612, 11.7798], [14.6474, 12.17466], [14.4843, 12.35223], [14.22215, 12.36533], [14.17523, 12.41916], [14.20204, 12.53405], [14.08251, 13.0797], [13.6302, 13.71094], [13.33213, 13.71195], [13.19844, 13.52802], [13.05085, 13.53984], [12.87376, 13.48919], [12.6793, 13.29157], [12.58033, 13.27805], [12.47095, 13.06673], [12.19315, 13.12423], [12.16189, 13.10056], [12.04209, 13.14452], [11.88236, 13.2527], [11.4535, 13.37773], [10.66004, 13.36422], [10.46731, 13.28819], [10.19993, 13.27129], [10.00373, 13.18171], [9.65995, 12.80614], [8.97413, 12.83661], [8.64251, 12.93985], [8.60431, 13.01768], [8.49493, 13.07519], [8.41853, 13.06166], [8.25185, 13.20369], [8.07997, 13.30847], [7.81085, 13.34902], [7.39241, 13.09717], [7.22399, 13.1293], [7.12676, 13.02445], [7.0521, 13.00076], [6.94445, 12.99825], [6.69617, 13.34057], [6.43053, 13.6006], [6.27411, 13.67835], [6.15771, 13.64564]]]] } },
23255     { type: "Feature", properties: { iso1A2: "NI", iso1A3: "NIC", iso1N3: "558", wikidata: "Q811", nameEn: "Nicaragua", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["505"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-83.13724, 15.00002], [-83.49268, 15.01158], [-83.62101, 14.89448], [-83.89551, 14.76697], [-84.10584, 14.76353], [-84.48373, 14.63249], [-84.70119, 14.68078], [-84.82596, 14.82212], [-84.90082, 14.80489], [-85.1575, 14.53934], [-85.18602, 14.24929], [-85.32149, 14.2562], [-85.45762, 14.11304], [-85.73964, 13.9698], [-85.75477, 13.8499], [-86.03458, 13.99181], [-86.00685, 14.08474], [-86.14801, 14.04317], [-86.35219, 13.77157], [-86.76812, 13.79605], [-86.71267, 13.30348], [-86.87066, 13.30641], [-86.93383, 13.18677], [-86.93197, 13.05313], [-87.03785, 12.98682], [-87.06306, 13.00892], [-87.37107, 12.98646], [-87.55124, 13.12523], [-87.7346, 13.13228], [-88.11443, 12.63306], [-86.14524, 11.09059], [-85.71223, 11.06868], [-85.60529, 11.22607], [-84.92439, 10.9497], [-84.68197, 11.07568], [-83.90838, 10.71161], [-83.66597, 10.79916], [-83.68276, 11.01562], [-82.56142, 11.91792], [-82.06974, 14.49418], [-83.04763, 15.03256], [-83.13724, 15.00002]]]] } },
23256     { type: "Feature", properties: { iso1A2: "NL", iso1A3: "NLD", iso1N3: "528", wikidata: "Q29999", nameEn: "Kingdom of the Netherlands" }, geometry: null },
23257     { type: "Feature", properties: { iso1A2: "NO", iso1A3: "NOR", iso1N3: "578", wikidata: "Q20", nameEn: "Norway" }, geometry: null },
23258     { type: "Feature", properties: { iso1A2: "NP", iso1A3: "NPL", iso1N3: "524", wikidata: "Q837", nameEn: "Nepal", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["977"] }, geometry: { type: "MultiPolygon", coordinates: [[[[88.13378, 27.88015], [87.82681, 27.95248], [87.72718, 27.80938], [87.56996, 27.84517], [87.11696, 27.84104], [87.03757, 27.94835], [86.75582, 28.04182], [86.74181, 28.10638], [86.56265, 28.09569], [86.51609, 27.96623], [86.42736, 27.91122], [86.22966, 27.9786], [86.18607, 28.17364], [86.088, 28.09264], [86.08333, 28.02121], [86.12069, 27.93047], [86.06309, 27.90021], [85.94946, 27.9401], [85.97813, 27.99023], [85.90743, 28.05144], [85.84672, 28.18187], [85.74864, 28.23126], [85.71907, 28.38064], [85.69105, 28.38475], [85.60854, 28.25045], [85.59765, 28.30529], [85.4233, 28.32996], [85.38127, 28.28336], [85.10729, 28.34092], [85.18668, 28.54076], [85.19135, 28.62825], [85.06059, 28.68562], [84.85511, 28.58041], [84.62317, 28.73887], [84.47528, 28.74023], [84.2231, 28.89571], [84.24801, 29.02783], [84.18107, 29.23451], [83.97559, 29.33091], [83.82303, 29.30513], [83.63156, 29.16249], [83.44787, 29.30513], [83.28131, 29.56813], [83.07116, 29.61957], [82.73024, 29.81695], [82.5341, 29.9735], [82.38622, 30.02608], [82.16984, 30.0692], [82.19475, 30.16884], [82.10757, 30.23745], [82.10135, 30.35439], [81.99082, 30.33423], [81.62033, 30.44703], [81.5459, 30.37688], [81.41018, 30.42153], [81.39928, 30.21862], [81.33355, 30.15303], [81.2623, 30.14596], [81.29032, 30.08806], [81.24362, 30.0126], [81.12842, 30.01395], [81.03953, 30.20059], [80.92547, 30.17193], [80.91143, 30.22173], [80.86673, 30.17321], [80.8778, 30.13384], [80.67076, 29.95732], [80.60226, 29.95732], [80.57179, 29.91422], [80.56247, 29.86661], [80.48997, 29.79566], [80.43458, 29.80466], [80.41554, 29.79451], [80.36803, 29.73865], [80.38428, 29.68513], [80.41858, 29.63581], [80.37939, 29.57098], [80.24322, 29.44299], [80.31428, 29.30784], [80.28626, 29.20327], [80.24112, 29.21414], [80.26602, 29.13938], [80.23178, 29.11626], [80.18085, 29.13649], [80.05743, 28.91479], [80.06957, 28.82763], [80.12125, 28.82346], [80.37188, 28.63371], [80.44504, 28.63098], [80.52443, 28.54897], [80.50575, 28.6706], [80.55142, 28.69182], [81.03471, 28.40054], [81.19847, 28.36284], [81.32923, 28.13521], [81.38683, 28.17638], [81.48179, 28.12148], [81.47867, 28.08303], [81.91223, 27.84995], [81.97214, 27.93322], [82.06554, 27.92222], [82.46405, 27.6716], [82.70378, 27.72122], [82.74119, 27.49838], [82.93261, 27.50328], [82.94938, 27.46036], [83.19413, 27.45632], [83.27197, 27.38309], [83.2673, 27.36235], [83.29999, 27.32778], [83.35136, 27.33885], [83.38872, 27.39276], [83.39495, 27.4798], [83.61288, 27.47013], [83.85595, 27.35797], [83.86182, 27.4241], [83.93306, 27.44939], [84.02229, 27.43836], [84.10791, 27.52399], [84.21376, 27.45218], [84.25735, 27.44941], [84.29315, 27.39], [84.62161, 27.33885], [84.69166, 27.21294], [84.64496, 27.04669], [84.793, 26.9968], [84.82913, 27.01989], [84.85754, 26.98984], [84.96687, 26.95599], [84.97186, 26.9149], [85.00536, 26.89523], [85.05592, 26.88991], [85.02635, 26.85381], [85.15883, 26.86966], [85.19291, 26.86909], [85.18046, 26.80519], [85.21159, 26.75933], [85.34302, 26.74954], [85.47752, 26.79292], [85.56471, 26.84133], [85.5757, 26.85955], [85.59461, 26.85161], [85.61621, 26.86721], [85.66239, 26.84822], [85.73483, 26.79613], [85.72315, 26.67471], [85.76907, 26.63076], [85.83126, 26.61134], [85.85126, 26.60866], [85.8492, 26.56667], [86.02729, 26.66756], [86.13596, 26.60651], [86.22513, 26.58863], [86.26235, 26.61886], [86.31564, 26.61925], [86.49726, 26.54218], [86.54258, 26.53819], [86.57073, 26.49825], [86.61313, 26.48658], [86.62686, 26.46891], [86.69124, 26.45169], [86.74025, 26.42386], [86.76797, 26.45892], [86.82898, 26.43919], [86.94543, 26.52076], [86.95912, 26.52076], [87.01559, 26.53228], [87.04691, 26.58685], [87.0707, 26.58571], [87.09147, 26.45039], [87.14751, 26.40542], [87.18863, 26.40558], [87.24682, 26.4143], [87.26587, 26.40592], [87.26568, 26.37294], [87.34568, 26.34787], [87.37314, 26.40815], [87.46566, 26.44058], [87.51571, 26.43106], [87.55274, 26.40596], [87.59175, 26.38342], [87.66803, 26.40294], [87.67893, 26.43501], [87.76004, 26.40711], [87.7918, 26.46737], [87.84193, 26.43663], [87.89085, 26.48565], [87.90115, 26.44923], [88.00895, 26.36029], [88.09414, 26.43732], [88.09963, 26.54195], [88.16452, 26.64111], [88.1659, 26.68177], [88.19107, 26.75516], [88.12302, 26.95324], [88.13422, 26.98705], [88.11719, 26.98758], [87.9887, 27.11045], [88.01587, 27.21388], [88.01646, 27.21612], [88.07277, 27.43007], [88.04008, 27.49223], [88.19107, 27.79285], [88.1973, 27.85067], [88.13378, 27.88015]]]] } },
23259     { type: "Feature", properties: { iso1A2: "NR", iso1A3: "NRU", iso1N3: "520", wikidata: "Q697", nameEn: "Nauru", groups: ["057", "009", "UN"], driveSide: "left", callingCodes: ["674"] }, geometry: { type: "MultiPolygon", coordinates: [[[[166.95155, 0.14829], [166.21778, -0.7977], [167.60042, -0.88259], [166.95155, 0.14829]]]] } },
23260     { type: "Feature", properties: { iso1A2: "NU", iso1A3: "NIU", iso1N3: "570", wikidata: "Q34020", nameEn: "Niue", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["683"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-170.83899, -18.53439], [-170.82274, -20.44429], [-168.63096, -18.60489], [-170.83899, -18.53439]]]] } },
23261     { type: "Feature", properties: { iso1A2: "NZ", iso1A3: "NZL", iso1N3: "554", wikidata: "Q664", nameEn: "New Zealand" }, geometry: null },
23262     { type: "Feature", properties: { iso1A2: "OM", iso1A3: "OMN", iso1N3: "512", wikidata: "Q842", nameEn: "Oman", groups: ["145", "142", "UN"], callingCodes: ["968"] }, geometry: { type: "MultiPolygon", coordinates: [[[[56.82555, 25.7713], [56.79239, 26.41236], [56.68954, 26.76645], [56.2644, 26.58649], [55.81777, 26.18798], [56.08666, 26.05038], [56.15498, 26.06828], [56.19334, 25.9795], [56.13963, 25.82765], [56.17416, 25.77239], [56.13579, 25.73524], [56.14826, 25.66351], [56.18363, 25.65508], [56.20473, 25.61119], [56.25365, 25.60211], [56.26636, 25.60643], [56.25341, 25.61443], [56.26534, 25.62825], [56.82555, 25.7713]]], [[[56.26062, 25.33108], [56.23362, 25.31253], [56.25008, 25.28843], [56.24465, 25.27505], [56.20838, 25.25668], [56.20872, 25.24104], [56.24341, 25.22867], [56.27628, 25.23404], [56.34438, 25.26653], [56.35172, 25.30681], [56.3111, 25.30107], [56.3005, 25.31815], [56.26062, 25.33108]], [[56.28423, 25.26344], [56.27086, 25.26128], [56.2716, 25.27916], [56.28102, 25.28486], [56.29379, 25.2754], [56.28423, 25.26344]]], [[[61.45114, 22.55394], [56.86325, 25.03856], [56.3227, 24.97284], [56.34873, 24.93205], [56.30269, 24.88334], [56.20568, 24.85063], [56.20062, 24.78565], [56.13684, 24.73699], [56.06128, 24.74457], [56.03535, 24.81161], [55.97836, 24.87673], [55.97467, 24.89639], [56.05106, 24.87461], [56.05715, 24.95727], [55.96316, 25.00857], [55.90849, 24.96771], [55.85094, 24.96858], [55.81116, 24.9116], [55.81348, 24.80102], [55.83408, 24.77858], [55.83271, 24.68567], [55.76461, 24.5287], [55.83271, 24.41521], [55.83395, 24.32776], [55.80747, 24.31069], [55.79145, 24.27914], [55.76781, 24.26209], [55.75939, 24.26114], [55.75382, 24.2466], [55.75257, 24.23466], [55.76558, 24.23227], [55.77658, 24.23476], [55.83367, 24.20193], [55.95472, 24.2172], [56.01799, 24.07426], [55.8308, 24.01633], [55.73301, 24.05994], [55.48677, 23.94946], [55.57358, 23.669], [55.22634, 23.10378], [55.2137, 22.71065], [55.66469, 21.99658], [54.99756, 20.00083], [52.00311, 19.00083], [52.78009, 17.35124], [52.74267, 17.29519], [52.81185, 17.28568], [57.49095, 8.14549], [61.45114, 22.55394]]]] } },
23263     { type: "Feature", properties: { iso1A2: "PA", iso1A3: "PAN", iso1N3: "591", wikidata: "Q804", nameEn: "Panama", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["507"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-77.32389, 8.81247], [-77.58292, 9.22278], [-78.79327, 9.93766], [-82.51044, 9.65379], [-82.56507, 9.57279], [-82.61345, 9.49881], [-82.66667, 9.49746], [-82.77206, 9.59573], [-82.87919, 9.62645], [-82.84871, 9.4973], [-82.93516, 9.46741], [-82.93516, 9.07687], [-82.72126, 8.97125], [-82.88253, 8.83331], [-82.91377, 8.774], [-82.92068, 8.74832], [-82.8794, 8.6981], [-82.82739, 8.60153], [-82.83975, 8.54755], [-82.83322, 8.52464], [-82.8382, 8.48117], [-82.8679, 8.44042], [-82.93056, 8.43465], [-83.05209, 8.33394], [-82.9388, 8.26634], [-82.88641, 8.10219], [-82.89137, 8.05755], [-82.89978, 8.04083], [-82.94503, 7.93865], [-82.13751, 6.97312], [-78.06168, 7.07793], [-77.89178, 7.22681], [-77.81426, 7.48319], [-77.72157, 7.47612], [-77.72514, 7.72348], [-77.57185, 7.51147], [-77.17257, 7.97422], [-77.45064, 8.49991], [-77.32389, 8.81247]]]] } },
23264     { type: "Feature", properties: { iso1A2: "PE", iso1A3: "PER", iso1N3: "604", wikidata: "Q419", nameEn: "Peru", groups: ["005", "419", "019", "UN"], callingCodes: ["51"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-74.26675, -0.97229], [-74.42701, -0.50218], [-75.18513, -0.0308], [-75.25764, -0.11943], [-75.40192, -0.17196], [-75.61997, -0.10012], [-75.60169, -0.18708], [-75.53615, -0.19213], [-75.22862, -0.60048], [-75.22862, -0.95588], [-75.3872, -0.9374], [-75.57429, -1.55961], [-76.05203, -2.12179], [-76.6324, -2.58397], [-77.94147, -3.05454], [-78.19369, -3.36431], [-78.14324, -3.47653], [-78.22642, -3.51113], [-78.24589, -3.39907], [-78.34362, -3.38633], [-78.68394, -4.60754], [-78.85149, -4.66795], [-79.01659, -5.01481], [-79.1162, -4.97774], [-79.26248, -4.95167], [-79.59402, -4.46848], [-79.79722, -4.47558], [-80.13945, -4.29786], [-80.39256, -4.48269], [-80.46386, -4.41516], [-80.32114, -4.21323], [-80.45023, -4.20938], [-80.4822, -4.05477], [-80.46386, -4.01342], [-80.13232, -3.90317], [-80.19926, -3.68894], [-80.18741, -3.63994], [-80.19848, -3.59249], [-80.21642, -3.5888], [-80.20535, -3.51667], [-80.22629, -3.501], [-80.23651, -3.48652], [-80.24586, -3.48677], [-80.24123, -3.46124], [-80.20647, -3.431], [-80.30602, -3.39149], [-84.52388, -3.36941], [-85.71054, -21.15413], [-70.59118, -18.35072], [-70.378, -18.3495], [-70.31267, -18.31258], [-70.16394, -18.31737], [-69.96732, -18.25992], [-69.81607, -18.12582], [-69.75305, -17.94605], [-69.82868, -17.72048], [-69.79087, -17.65563], [-69.66483, -17.65083], [-69.46897, -17.4988], [-69.46863, -17.37466], [-69.62883, -17.28142], [-69.16896, -16.72233], [-69.00853, -16.66769], [-69.04027, -16.57214], [-68.98358, -16.42165], [-68.79464, -16.33272], [-68.96238, -16.194], [-69.09986, -16.22693], [-69.20291, -16.16668], [-69.40336, -15.61358], [-69.14856, -15.23478], [-69.36254, -14.94634], [-68.88135, -14.18639], [-69.05265, -13.68546], [-68.8864, -13.40792], [-68.85615, -12.87769], [-68.65044, -12.50689], [-68.98115, -11.8979], [-69.57156, -10.94555], [-69.57835, -10.94051], [-69.90896, -10.92744], [-70.38791, -11.07096], [-70.51395, -10.92249], [-70.64134, -11.0108], [-70.62487, -9.80666], [-70.55429, -9.76692], [-70.58453, -9.58303], [-70.53373, -9.42628], [-71.23394, -9.9668], [-72.14742, -9.98049], [-72.31883, -9.5184], [-72.72216, -9.41397], [-73.21498, -9.40904], [-72.92886, -9.04074], [-73.76576, -7.89884], [-73.65485, -7.77897], [-73.96938, -7.58465], [-73.77011, -7.28944], [-73.73986, -6.87919], [-73.12983, -6.43852], [-73.24579, -6.05764], [-72.83973, -5.14765], [-72.64391, -5.0391], [-71.87003, -4.51661], [-70.96814, -4.36915], [-70.77601, -4.15717], [-70.33236, -4.15214], [-70.19582, -4.3607], [-70.11305, -4.27281], [-70.00888, -4.37833], [-69.94708, -4.2431], [-70.3374, -3.79505], [-70.52393, -3.87553], [-70.71396, -3.7921], [-70.04609, -2.73906], [-70.94377, -2.23142], [-71.75223, -2.15058], [-72.92587, -2.44514], [-73.65312, -1.26222], [-74.26675, -0.97229]]]] } },
23265     { type: "Feature", properties: { iso1A2: "PF", iso1A3: "PYF", iso1N3: "258", wikidata: "Q30971", nameEn: "French Polynesia", country: "FR", groups: ["EU", "Q1451600", "061", "009", "UN"], callingCodes: ["689"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-135.59706, -4.70473], [-156.48634, -15.52824], [-156.45576, -31.75456], [-133.59543, -28.4709], [-135.59706, -4.70473]]]] } },
23266     { type: "Feature", properties: { iso1A2: "PG", iso1A3: "PNG", iso1N3: "598", wikidata: "Q691", nameEn: "Papua New Guinea", groups: ["054", "009", "UN"], driveSide: "left", callingCodes: ["675"] }, geometry: { type: "MultiPolygon", coordinates: [[[[141.03157, 2.12829], [140.99813, -6.3233], [140.85295, -6.72996], [140.90448, -6.85033], [141.01763, -6.90181], [141.01842, -9.35091], [141.88934, -9.36111], [142.19246, -9.15378], [142.48658, -9.36754], [143.29772, -9.33993], [143.87386, -9.02382], [145.2855, -9.62524], [156.73836, -14.50464], [154.74815, -7.33315], [155.60735, -6.92266], [155.69784, -6.92661], [155.92557, -6.84664], [156.03993, -6.65703], [156.03296, -6.55528], [160.43769, -4.17974], [141.03157, 2.12829]]]] } },
23267     { type: "Feature", properties: { iso1A2: "PH", iso1A3: "PHL", iso1N3: "608", wikidata: "Q928", nameEn: "Philippines", aliases: ["PI", "RP"], groups: ["035", "142", "UN"], callingCodes: ["63"] }, geometry: { type: "MultiPolygon", coordinates: [[[[129.19694, 7.84182], [121.8109, 21.77688], [120.69238, 21.52331], [118.82252, 14.67191], [115.39742, 10.92666], [116.79524, 7.43869], [117.17735, 7.52841], [117.93857, 6.89845], [117.98544, 6.27477], [119.52945, 5.35672], [118.93936, 4.09009], [118.06469, 4.16638], [121.14448, 2.12444], [129.19694, 7.84182]]]] } },
23268     { type: "Feature", properties: { iso1A2: "PK", iso1A3: "PAK", iso1N3: "586", wikidata: "Q843", nameEn: "Pakistan", groups: ["034", "142", "UN"], driveSide: "left", callingCodes: ["92"] }, geometry: { type: "MultiPolygon", coordinates: [[[[75.72737, 36.7529], [75.45562, 36.71971], [75.40481, 36.95382], [75.13839, 37.02622], [74.56453, 37.03023], [74.53739, 36.96224], [74.43389, 37.00977], [74.04856, 36.82648], [73.82685, 36.91421], [72.6323, 36.84601], [72.18135, 36.71838], [71.80267, 36.49924], [71.60491, 36.39429], [71.19505, 36.04134], [71.37969, 35.95865], [71.55273, 35.71483], [71.49917, 35.6267], [71.65435, 35.4479], [71.54294, 35.31037], [71.5541, 35.28776], [71.67495, 35.21262], [71.52938, 35.09023], [71.55273, 35.02615], [71.49917, 35.00478], [71.50329, 34.97328], [71.29472, 34.87728], [71.28356, 34.80882], [71.08718, 34.69034], [71.11602, 34.63047], [71.0089, 34.54568], [71.02401, 34.44835], [71.17662, 34.36769], [71.12815, 34.26619], [71.13078, 34.16503], [71.09453, 34.13524], [71.09307, 34.11961], [71.06933, 34.10564], [71.07345, 34.06242], [70.88119, 33.97933], [70.54336, 33.9463], [69.90203, 34.04194], [69.87307, 33.9689], [69.85671, 33.93719], [70.00503, 33.73528], [70.14236, 33.71701], [70.14785, 33.6553], [70.20141, 33.64387], [70.17062, 33.53535], [70.32775, 33.34496], [70.13686, 33.21064], [70.07369, 33.22557], [70.02563, 33.14282], [69.85259, 33.09451], [69.79766, 33.13247], [69.71526, 33.09911], [69.57656, 33.09911], [69.49004, 33.01509], [69.49854, 32.88843], [69.5436, 32.8768], [69.47082, 32.85834], [69.38018, 32.76601], [69.43649, 32.7302], [69.44747, 32.6678], [69.38155, 32.56601], [69.2868, 32.53938], [69.23599, 32.45946], [69.27932, 32.29119], [69.27032, 32.14141], [69.3225, 31.93186], [69.20577, 31.85957], [69.11514, 31.70782], [69.00939, 31.62249], [68.95995, 31.64822], [68.91078, 31.59687], [68.79997, 31.61665], [68.6956, 31.75687], [68.57475, 31.83158], [68.44222, 31.76446], [68.27605, 31.75863], [68.25614, 31.80357], [68.1655, 31.82691], [68.00071, 31.6564], [67.86887, 31.63536], [67.72056, 31.52304], [67.58323, 31.52772], [67.62374, 31.40473], [67.7748, 31.4188], [67.78854, 31.33203], [67.29964, 31.19586], [67.03323, 31.24519], [67.04147, 31.31561], [66.83273, 31.26867], [66.72561, 31.20526], [66.68166, 31.07597], [66.58175, 30.97532], [66.42645, 30.95309], [66.39194, 30.9408], [66.28413, 30.57001], [66.34869, 30.404], [66.23609, 30.06321], [66.36042, 29.9583], [66.24175, 29.85181], [65.04005, 29.53957], [64.62116, 29.58903], [64.19796, 29.50407], [64.12966, 29.39157], [63.5876, 29.50456], [62.47751, 29.40782], [60.87231, 29.86514], [61.31508, 29.38903], [61.53765, 29.00507], [61.65978, 28.77937], [61.93581, 28.55284], [62.40259, 28.42703], [62.59499, 28.24842], [62.79412, 28.28108], [62.7638, 28.02992], [62.84905, 27.47627], [62.79684, 27.34381], [62.80604, 27.22412], [63.19649, 27.25674], [63.32283, 27.14437], [63.25005, 27.08692], [63.25005, 26.84212], [63.18688, 26.83844], [63.1889, 26.65072], [62.77352, 26.64099], [62.31484, 26.528], [62.21304, 26.26601], [62.05117, 26.31647], [61.89391, 26.26251], [61.83831, 26.07249], [61.83968, 25.7538], [61.683, 25.66638], [61.6433, 25.27541], [61.46682, 24.57869], [68.11329, 23.53945], [68.20763, 23.85849], [68.39339, 23.96838], [68.74643, 23.97027], [68.7416, 24.31904], [68.90914, 24.33156], [68.97781, 24.26021], [69.07806, 24.29777], [69.19341, 24.25646], [69.29778, 24.28712], [69.59579, 24.29777], [69.73335, 24.17007], [70.03428, 24.172], [70.11712, 24.30915], [70.5667, 24.43787], [70.57906, 24.27774], [70.71502, 24.23517], [70.88393, 24.27398], [70.85784, 24.30903], [70.94985, 24.3791], [71.04461, 24.34657], [71.12838, 24.42662], [71.00341, 24.46038], [70.97594, 24.60904], [71.09405, 24.69017], [70.94002, 24.92843], [70.89148, 25.15064], [70.66695, 25.39314], [70.67382, 25.68186], [70.60378, 25.71898], [70.53649, 25.68928], [70.37444, 25.67443], [70.2687, 25.71156], [70.0985, 25.93238], [70.08193, 26.08094], [70.17532, 26.24118], [70.17532, 26.55362], [70.05584, 26.60398], [69.88555, 26.56836], [69.50904, 26.74892], [69.58519, 27.18109], [70.03136, 27.56627], [70.12502, 27.8057], [70.37307, 28.01208], [70.60927, 28.02178], [70.79054, 27.68423], [71.89921, 27.96035], [71.9244, 28.11555], [72.20329, 28.3869], [72.29495, 28.66367], [72.40402, 28.78283], [72.94272, 29.02487], [73.01337, 29.16422], [73.05886, 29.1878], [73.28094, 29.56646], [73.3962, 29.94707], [73.58665, 30.01848], [73.80299, 30.06969], [73.97225, 30.19829], [73.95736, 30.28466], [73.88993, 30.36305], [74.5616, 31.04153], [74.67971, 31.05479], [74.6852, 31.12771], [74.60006, 31.13711], [74.60281, 31.10419], [74.56023, 31.08303], [74.51629, 31.13829], [74.53223, 31.30321], [74.59773, 31.4136], [74.64713, 31.45605], [74.59319, 31.50197], [74.61517, 31.55698], [74.57498, 31.60382], [74.47771, 31.72227], [74.58907, 31.87824], [74.79919, 31.95983], [74.86236, 32.04485], [74.9269, 32.0658], [75.00793, 32.03786], [75.25649, 32.10187], [75.38046, 32.26836], [75.28259, 32.36556], [75.03265, 32.49538], [74.97634, 32.45367], [74.84725, 32.49075], [74.68362, 32.49298], [74.67431, 32.56676], [74.65251, 32.56416], [74.64424, 32.60985], [74.69542, 32.66792], [74.65345, 32.71225], [74.7113, 32.84219], [74.64675, 32.82604], [74.6289, 32.75561], [74.45312, 32.77755], [74.41467, 32.90563], [74.31227, 32.92795], [74.34875, 32.97823], [74.31854, 33.02891], [74.17571, 33.07495], [74.15374, 33.13477], [74.02144, 33.18908], [74.01366, 33.25199], [74.08782, 33.26232], [74.17983, 33.3679], [74.18121, 33.4745], [74.10115, 33.56392], [74.03576, 33.56718], [73.97367, 33.64061], [73.98968, 33.66155], [73.96423, 33.73071], [74.00891, 33.75437], [74.05898, 33.82089], [74.14001, 33.83002], [74.26086, 33.92237], [74.25262, 34.01577], [74.21554, 34.03853], [73.91341, 34.01235], [73.88732, 34.05105], [73.90677, 34.10504], [73.98208, 34.2522], [73.90517, 34.35317], [73.8475, 34.32935], [73.74862, 34.34183], [73.74999, 34.3781], [73.88732, 34.48911], [73.89419, 34.54568], [73.93951, 34.57169], [73.93401, 34.63386], [73.96423, 34.68244], [74.12897, 34.70073], [74.31239, 34.79626], [74.58083, 34.77386], [74.6663, 34.703], [75.01479, 34.64629], [75.38009, 34.55021], [75.75438, 34.51827], [76.04614, 34.67566], [76.15463, 34.6429], [76.47186, 34.78965], [76.67648, 34.76371], [76.74377, 34.84039], [76.74514, 34.92488], [76.87193, 34.96906], [76.99251, 34.93349], [77.11796, 35.05419], [76.93465, 35.39866], [76.85088, 35.39754], [76.75475, 35.52617], [76.77323, 35.66062], [76.50961, 35.8908], [76.33453, 35.84296], [76.14913, 35.82848], [76.15325, 35.9264], [75.93028, 36.13136], [76.00906, 36.17511], [76.0324, 36.41198], [75.92391, 36.56986], [75.72737, 36.7529]]]] } },
23269     { type: "Feature", properties: { iso1A2: "PL", iso1A3: "POL", iso1N3: "616", wikidata: "Q36", nameEn: "Poland", groups: ["EU", "151", "150", "UN"], callingCodes: ["48"] }, geometry: { type: "MultiPolygon", coordinates: [[[[18.57853, 55.25302], [14.20811, 54.12784], [14.22634, 53.9291], [14.20647, 53.91671], [14.18544, 53.91258], [14.20823, 53.90776], [14.21323, 53.8664], [14.27249, 53.74464], [14.26782, 53.69866], [14.2836, 53.67721], [14.27133, 53.66613], [14.28477, 53.65955], [14.2853, 53.63392], [14.31904, 53.61581], [14.30416, 53.55499], [14.3273, 53.50587], [14.35209, 53.49506], [14.4215, 53.27724], [14.44133, 53.27427], [14.45125, 53.26241], [14.40662, 53.21098], [14.37853, 53.20405], [14.36696, 53.16444], [14.38679, 53.13669], [14.35044, 53.05829], [14.25954, 53.00264], [14.14056, 52.95786], [14.15873, 52.87715], [14.12256, 52.84311], [14.13806, 52.82392], [14.22071, 52.81175], [14.61073, 52.59847], [14.6289, 52.57136], [14.60081, 52.53116], [14.63056, 52.48993], [14.54423, 52.42568], [14.55228, 52.35264], [14.56378, 52.33838], [14.58149, 52.28007], [14.70139, 52.25038], [14.71319, 52.22144], [14.68344, 52.19612], [14.70616, 52.16927], [14.67683, 52.13936], [14.6917, 52.10283], [14.72971, 52.09167], [14.76026, 52.06624], [14.71339, 52.00337], [14.70488, 51.97679], [14.7139, 51.95643], [14.71836, 51.95606], [14.72163, 51.95188], [14.7177, 51.94048], [14.70601, 51.92944], [14.6933, 51.9044], [14.6588, 51.88359], [14.59089, 51.83302], [14.60493, 51.80473], [14.64625, 51.79472], [14.66386, 51.73282], [14.69065, 51.70842], [14.75392, 51.67445], [14.75759, 51.62318], [14.7727, 51.61263], [14.71125, 51.56209], [14.73047, 51.54606], [14.72652, 51.53902], [14.73219, 51.52922], [14.94749, 51.47155], [14.9652, 51.44793], [14.96899, 51.38367], [14.98008, 51.33449], [15.04288, 51.28387], [15.01242, 51.21285], [15.0047, 51.16874], [14.99311, 51.16249], [14.99414, 51.15813], [15.00083, 51.14974], [14.99646, 51.14365], [14.99079, 51.14284], [14.99689, 51.12205], [14.98229, 51.11354], [14.97938, 51.07742], [14.95529, 51.04552], [14.92942, 50.99744], [14.89252, 50.94999], [14.89681, 50.9422], [14.81664, 50.88148], [14.82803, 50.86966], [14.99852, 50.86817], [15.01088, 50.97984], [14.96419, 50.99108], [15.02433, 51.0242], [15.03895, 51.0123], [15.06218, 51.02269], [15.10152, 51.01095], [15.11937, 50.99021], [15.16744, 51.01959], [15.1743, 50.9833], [15.2361, 50.99886], [15.27043, 50.97724], [15.2773, 50.8907], [15.36656, 50.83956], [15.3803, 50.77187], [15.43798, 50.80833], [15.73186, 50.73885], [15.81683, 50.75666], [15.87331, 50.67188], [15.97219, 50.69799], [16.0175, 50.63009], [15.98317, 50.61528], [16.02437, 50.60046], [16.10265, 50.66405], [16.20839, 50.63096], [16.23174, 50.67101], [16.33611, 50.66579], [16.44597, 50.58041], [16.34572, 50.49575], [16.31413, 50.50274], [16.19526, 50.43291], [16.21585, 50.40627], [16.22821, 50.41054], [16.28118, 50.36891], [16.30289, 50.38292], [16.36495, 50.37679], [16.3622, 50.34875], [16.39379, 50.3207], [16.42674, 50.32509], [16.56407, 50.21009], [16.55446, 50.16613], [16.63137, 50.1142], [16.7014, 50.09659], [16.8456, 50.20834], [16.98018, 50.24172], [17.00353, 50.21449], [17.02825, 50.23118], [16.99803, 50.25753], [17.02138, 50.27772], [16.99803, 50.30316], [16.94448, 50.31281], [16.90877, 50.38642], [16.85933, 50.41093], [16.89229, 50.45117], [17.1224, 50.39494], [17.14498, 50.38117], [17.19579, 50.38817], [17.19991, 50.3654], [17.27681, 50.32246], [17.34273, 50.32947], [17.34548, 50.2628], [17.3702, 50.28123], [17.58889, 50.27837], [17.67764, 50.28977], [17.69292, 50.32859], [17.74648, 50.29966], [17.72176, 50.25665], [17.76296, 50.23382], [17.70528, 50.18812], [17.59404, 50.16437], [17.66683, 50.10275], [17.6888, 50.12037], [17.7506, 50.07896], [17.77669, 50.02253], [17.86886, 49.97452], [18.00191, 50.01723], [18.04585, 50.01194], [18.04585, 50.03311], [18.00396, 50.04954], [18.03212, 50.06574], [18.07898, 50.04535], [18.10628, 50.00223], [18.20241, 49.99958], [18.21752, 49.97309], [18.27107, 49.96779], [18.27794, 49.93863], [18.31914, 49.91565], [18.33278, 49.92415], [18.33562, 49.94747], [18.41604, 49.93498], [18.53423, 49.89906], [18.54495, 49.9079], [18.54299, 49.92537], [18.57697, 49.91565], [18.57045, 49.87849], [18.60341, 49.86256], [18.57183, 49.83334], [18.61278, 49.7618], [18.61368, 49.75426], [18.62645, 49.75002], [18.62943, 49.74603], [18.62676, 49.71983], [18.69817, 49.70473], [18.72838, 49.68163], [18.80479, 49.6815], [18.84786, 49.5446], [18.84521, 49.51672], [18.94536, 49.52143], [18.97283, 49.49914], [18.9742, 49.39557], [19.18019, 49.41165], [19.25435, 49.53391], [19.36009, 49.53747], [19.37795, 49.574], [19.45348, 49.61583], [19.52626, 49.57311], [19.53313, 49.52856], [19.57845, 49.46077], [19.64162, 49.45184], [19.6375, 49.40897], [19.72127, 49.39288], [19.78581, 49.41701], [19.82237, 49.27806], [19.75286, 49.20751], [19.86409, 49.19316], [19.90529, 49.23532], [19.98494, 49.22904], [20.08238, 49.1813], [20.13738, 49.31685], [20.21977, 49.35265], [20.31453, 49.34817], [20.31728, 49.39914], [20.39939, 49.3896], [20.46422, 49.41612], [20.5631, 49.375], [20.61666, 49.41791], [20.72274, 49.41813], [20.77971, 49.35383], [20.9229, 49.29626], [20.98733, 49.30774], [21.09799, 49.37176], [21.041, 49.41791], [21.12477, 49.43666], [21.19756, 49.4054], [21.27858, 49.45988], [21.43376, 49.41433], [21.62328, 49.4447], [21.77983, 49.35443], [21.82927, 49.39467], [21.96385, 49.3437], [22.04427, 49.22136], [22.56155, 49.08865], [22.89122, 49.00725], [22.86336, 49.10513], [22.72009, 49.20288], [22.748, 49.32759], [22.69444, 49.49378], [22.64534, 49.53094], [22.78304, 49.65543], [22.80261, 49.69098], [22.83179, 49.69875], [22.99329, 49.84249], [23.28221, 50.0957], [23.67635, 50.33385], [23.71382, 50.38248], [23.79445, 50.40481], [23.99563, 50.41289], [24.03668, 50.44507], [24.07048, 50.5071], [24.0996, 50.60752], [24.0595, 50.71625], [23.95925, 50.79271], [23.99254, 50.83847], [24.0952, 50.83262], [24.14524, 50.86128], [24.04576, 50.90196], [23.92217, 51.00836], [23.90376, 51.07697], [23.80678, 51.18405], [23.63858, 51.32182], [23.69905, 51.40871], [23.62751, 51.50512], [23.56236, 51.53673], [23.57053, 51.55938], [23.53198, 51.74298], [23.62691, 51.78208], [23.61523, 51.92066], [23.68733, 51.9906], [23.64066, 52.07626], [23.61, 52.11264], [23.54314, 52.12148], [23.47859, 52.18215], [23.20071, 52.22848], [23.18196, 52.28812], [23.34141, 52.44845], [23.45112, 52.53774], [23.58296, 52.59868], [23.73615, 52.6149], [23.93763, 52.71332], [23.91805, 52.94016], [23.94689, 52.95919], [23.92184, 53.02079], [23.87548, 53.0831], [23.91393, 53.16469], [23.85657, 53.22923], [23.81995, 53.24131], [23.62004, 53.60942], [23.51284, 53.95052], [23.48261, 53.98855], [23.52702, 54.04622], [23.49196, 54.14764], [23.45223, 54.17775], [23.42418, 54.17911], [23.39525, 54.21672], [23.3494, 54.25155], [23.24656, 54.25701], [23.15938, 54.29894], [23.15526, 54.31076], [23.13905, 54.31567], [23.104, 54.29794], [23.04323, 54.31567], [23.05726, 54.34565], [22.99649, 54.35927], [23.00584, 54.38514], [22.83756, 54.40827], [22.79705, 54.36264], [21.41123, 54.32395], [20.63871, 54.3706], [19.8038, 54.44203], [19.64312, 54.45423], [18.57853, 55.25302]]]] } },
23270     { type: "Feature", properties: { iso1A2: "PM", iso1A3: "SPM", iso1N3: "666", wikidata: "Q34617", nameEn: "Saint Pierre and Miquelon", country: "FR", groups: ["EU", "Q1451600", "021", "003", "019", "UN"], callingCodes: ["508"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-56.72993, 46.65575], [-55.90758, 46.6223], [-56.27503, 47.39728], [-56.72993, 46.65575]]]] } },
23271     { type: "Feature", properties: { iso1A2: "PN", iso1A3: "PCN", iso1N3: "612", wikidata: "Q35672", nameEn: "Pitcairn Islands", country: "GB", groups: ["BOTS", "061", "009", "UN"], driveSide: "left", callingCodes: ["64"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-133.59543, -28.4709], [-122.0366, -24.55017], [-133.61511, -21.93325], [-133.59543, -28.4709]]]] } },
23272     { type: "Feature", properties: { iso1A2: "PR", iso1A3: "PRI", iso1N3: "630", wikidata: "Q1183", nameEn: "Puerto Rico", aliases: ["US-PR"], country: "US", groups: ["Q1352230", "029", "003", "419", "019", "UN"], roadSpeedUnit: "mph", callingCodes: ["1 787", "1 939"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-65.27974, 17.56928], [-65.02435, 18.73231], [-67.99519, 18.97186], [-68.23894, 17.84663], [-65.27974, 17.56928]]]] } },
23273     { type: "Feature", properties: { iso1A2: "PS", iso1A3: "PSE", iso1N3: "275", wikidata: "Q219060", nameEn: "Palestine" }, geometry: null },
23274     { type: "Feature", properties: { iso1A2: "PT", iso1A3: "PRT", iso1N3: "620", wikidata: "Q45", nameEn: "Portugal" }, geometry: null },
23275     { type: "Feature", properties: { iso1A2: "PW", iso1A3: "PLW", iso1N3: "585", wikidata: "Q695", nameEn: "Palau", groups: ["057", "009", "UN"], roadSpeedUnit: "mph", callingCodes: ["680"] }, geometry: { type: "MultiPolygon", coordinates: [[[[128.97621, 3.08804], [136.39296, 1.54187], [136.04605, 12.45908], [128.97621, 3.08804]]]] } },
23276     { type: "Feature", properties: { iso1A2: "PY", iso1A3: "PRY", iso1N3: "600", wikidata: "Q733", nameEn: "Paraguay", groups: ["005", "419", "019", "UN"], callingCodes: ["595"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-58.16225, -20.16193], [-58.23216, -19.80058], [-59.06965, -19.29148], [-60.00638, -19.2981], [-61.73723, -19.63958], [-61.93912, -20.10053], [-62.26883, -20.55311], [-62.2757, -21.06657], [-62.64455, -22.25091], [-62.51761, -22.37684], [-62.22768, -22.55807], [-61.9756, -23.0507], [-61.0782, -23.62932], [-60.99754, -23.80934], [-60.28163, -24.04436], [-60.03367, -24.00701], [-59.45482, -24.34787], [-59.33886, -24.49935], [-58.33055, -24.97099], [-58.25492, -24.92528], [-57.80821, -25.13863], [-57.57431, -25.47269], [-57.87176, -25.93604], [-58.1188, -26.16704], [-58.3198, -26.83443], [-58.65321, -27.14028], [-58.59549, -27.29973], [-58.04205, -27.2387], [-56.85337, -27.5165], [-56.18313, -27.29851], [-55.89195, -27.3467], [-55.74475, -27.44485], [-55.59094, -27.32444], [-55.62322, -27.1941], [-55.39611, -26.97679], [-55.25243, -26.93808], [-55.16948, -26.96068], [-55.06351, -26.80195], [-55.00584, -26.78754], [-54.80868, -26.55669], [-54.70732, -26.45099], [-54.69333, -26.37705], [-54.67359, -25.98607], [-54.60664, -25.9691], [-54.62063, -25.91213], [-54.59398, -25.59224], [-54.59509, -25.53696], [-54.60196, -25.48397], [-54.62033, -25.46026], [-54.4423, -25.13381], [-54.28207, -24.07305], [-54.32807, -24.01865], [-54.6238, -23.83078], [-55.02691, -23.97317], [-55.0518, -23.98666], [-55.12292, -23.99669], [-55.41784, -23.9657], [-55.44117, -23.9185], [-55.43585, -23.87157], [-55.5555, -23.28237], [-55.52288, -23.2595], [-55.5446, -23.22811], [-55.63849, -22.95122], [-55.62493, -22.62765], [-55.68742, -22.58407], [-55.6986, -22.56268], [-55.72366, -22.5519], [-55.741, -22.52018], [-55.74941, -22.46436], [-55.8331, -22.29008], [-56.23206, -22.25347], [-56.45893, -22.08072], [-56.5212, -22.11556], [-56.6508, -22.28387], [-57.98625, -22.09157], [-57.94642, -21.73799], [-57.88239, -21.6868], [-57.93492, -21.65505], [-57.84536, -20.93155], [-58.16225, -20.16193]]]] } },
23277     { type: "Feature", properties: { iso1A2: "QA", iso1A3: "QAT", iso1N3: "634", wikidata: "Q846", nameEn: "Qatar", groups: ["145", "142", "UN"], callingCodes: ["974"] }, geometry: { type: "MultiPolygon", coordinates: [[[[50.92992, 24.54396], [51.09638, 24.46907], [51.29972, 24.50747], [51.39468, 24.62785], [51.58834, 24.66608], [51.83108, 24.71675], [51.83682, 26.70231], [50.93865, 26.30758], [50.81266, 25.88946], [50.86149, 25.6965], [50.7801, 25.595], [50.80824, 25.54641], [50.57069, 25.57887], [50.8133, 24.74049], [50.92992, 24.54396]]]] } },
23278     { type: "Feature", properties: { iso1A2: "RE", iso1A3: "REU", iso1N3: "638", wikidata: "Q17070", nameEn: "R\xE9union", country: "FR", groups: ["Q3320166", "EU", "014", "202", "002", "UN"], callingCodes: ["262"] }, geometry: { type: "MultiPolygon", coordinates: [[[[53.37984, -21.23941], [56.73473, -21.9174], [56.62373, -20.2711], [53.37984, -21.23941]]]] } },
23279     { type: "Feature", properties: { iso1A2: "RO", iso1A3: "ROU", iso1N3: "642", wikidata: "Q218", nameEn: "Romania", groups: ["EU", "151", "150", "UN"], callingCodes: ["40"] }, geometry: { type: "MultiPolygon", coordinates: [[[[27.15622, 47.98538], [27.02985, 48.09083], [27.04118, 48.12522], [26.96119, 48.13003], [26.98042, 48.15752], [26.94265, 48.1969], [26.87708, 48.19919], [26.81161, 48.25049], [26.62823, 48.25804], [26.55202, 48.22445], [26.33504, 48.18418], [26.17711, 47.99246], [26.05901, 47.9897], [25.77723, 47.93919], [25.63878, 47.94924], [25.23778, 47.89403], [25.11144, 47.75203], [24.88896, 47.7234], [24.81893, 47.82031], [24.70632, 47.84428], [24.61994, 47.95062], [24.43578, 47.97131], [24.34926, 47.9244], [24.22566, 47.90231], [24.11281, 47.91487], [24.06466, 47.95317], [24.02999, 47.95087], [24.00801, 47.968], [23.98553, 47.96076], [23.96337, 47.96672], [23.94192, 47.94868], [23.89352, 47.94512], [23.8602, 47.9329], [23.80904, 47.98142], [23.75188, 47.99705], [23.66262, 47.98786], [23.63894, 48.00293], [23.5653, 48.00499], [23.52803, 48.01818], [23.4979, 47.96858], [23.33577, 48.0237], [23.27397, 48.08245], [23.15999, 48.12188], [23.1133, 48.08061], [23.08858, 48.00716], [23.0158, 47.99338], [22.92241, 48.02002], [22.94301, 47.96672], [22.89849, 47.95851], [22.77991, 47.87211], [22.76617, 47.8417], [22.67247, 47.7871], [22.46559, 47.76583], [22.41979, 47.7391], [22.31816, 47.76126], [22.00917, 47.50492], [22.03389, 47.42508], [22.01055, 47.37767], [21.94463, 47.38046], [21.78395, 47.11104], [21.648, 47.03902], [21.68645, 46.99595], [21.59581, 46.91628], [21.59307, 46.86935], [21.52028, 46.84118], [21.48935, 46.7577], [21.5151, 46.72147], [21.43926, 46.65109], [21.33214, 46.63035], [21.26929, 46.4993], [21.28061, 46.44941], [21.16872, 46.30118], [21.06572, 46.24897], [20.86797, 46.28884], [20.74574, 46.25467], [20.76085, 46.21002], [20.63863, 46.12728], [20.49718, 46.18721], [20.45377, 46.14405], [20.35573, 46.16629], [20.28324, 46.1438], [20.26068, 46.12332], [20.35862, 45.99356], [20.54818, 45.89939], [20.65645, 45.82801], [20.70069, 45.7493], [20.77416, 45.75601], [20.78446, 45.78522], [20.82364, 45.77738], [20.80361, 45.65875], [20.76798, 45.60969], [20.83321, 45.53567], [20.77217, 45.49788], [20.86026, 45.47295], [20.87948, 45.42743], [21.09894, 45.30144], [21.17612, 45.32566], [21.20392, 45.2677], [21.29398, 45.24148], [21.48278, 45.19557], [21.51299, 45.15345], [21.4505, 45.04294], [21.35855, 45.01941], [21.54938, 44.9327], [21.56328, 44.89502], [21.48202, 44.87199], [21.44013, 44.87613], [21.35643, 44.86364], [21.38802, 44.78133], [21.55007, 44.77304], [21.60019, 44.75208], [21.61942, 44.67059], [21.67504, 44.67107], [21.71692, 44.65349], [21.7795, 44.66165], [21.99364, 44.63395], [22.08016, 44.49844], [22.13234, 44.47444], [22.18315, 44.48179], [22.30844, 44.6619], [22.45301, 44.7194], [22.61917, 44.61489], [22.69196, 44.61587], [22.76749, 44.54446], [22.70981, 44.51852], [22.61368, 44.55719], [22.56493, 44.53419], [22.54021, 44.47836], [22.45436, 44.47258], [22.56012, 44.30712], [22.68166, 44.28206], [22.67173, 44.21564], [23.04988, 44.07694], [23.01674, 44.01946], [22.87873, 43.9844], [22.83753, 43.88055], [22.85314, 43.84452], [23.05288, 43.79494], [23.26772, 43.84843], [23.4507, 43.84936], [23.61687, 43.79289], [23.73978, 43.80627], [24.18149, 43.68218], [24.35364, 43.70211], [24.50264, 43.76314], [24.62281, 43.74082], [24.73542, 43.68523], [24.96682, 43.72693], [25.10718, 43.6831], [25.17144, 43.70261], [25.39528, 43.61866], [25.72792, 43.69263], [25.94911, 43.85745], [26.05584, 43.90925], [26.10115, 43.96908], [26.38764, 44.04356], [26.62712, 44.05698], [26.95141, 44.13555], [27.26845, 44.12602], [27.39757, 44.0141], [27.60834, 44.01206], [27.64542, 44.04958], [27.73468, 43.95326], [27.92008, 44.00761], [27.99558, 43.84193], [28.23293, 43.76], [29.24336, 43.70874], [30.04414, 45.08461], [29.69272, 45.19227], [29.65428, 45.25629], [29.68175, 45.26885], [29.59798, 45.38857], [29.42632, 45.44545], [29.24779, 45.43388], [28.96077, 45.33164], [28.94292, 45.28045], [28.81383, 45.3384], [28.78911, 45.24179], [28.71358, 45.22631], [28.5735, 45.24759], [28.34554, 45.32102], [28.28504, 45.43907], [28.21139, 45.46895], [28.18741, 45.47358], [28.08927, 45.6051], [28.16568, 45.6421], [28.13111, 45.92819], [28.08612, 46.01105], [28.13684, 46.18099], [28.10937, 46.22852], [28.19864, 46.31869], [28.18902, 46.35283], [28.25769, 46.43334], [28.22281, 46.50481], [28.24808, 46.64305], [28.12173, 46.82283], [28.09095, 46.97621], [27.81892, 47.1381], [27.73172, 47.29248], [27.68706, 47.28962], [27.60263, 47.32507], [27.55731, 47.46637], [27.47942, 47.48113], [27.3979, 47.59473], [27.32202, 47.64009], [27.25519, 47.71366], [27.29069, 47.73722], [27.1618, 47.92391], [27.15622, 47.98538]]]] } },
23280     { type: "Feature", properties: { iso1A2: "RS", iso1A3: "SRB", iso1N3: "688", wikidata: "Q403", nameEn: "Serbia", groups: ["039", "150", "UN"], callingCodes: ["381"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.66007, 46.19005], [19.56113, 46.16824], [19.52473, 46.1171], [19.28826, 45.99694], [19.14543, 45.9998], [19.10388, 46.04015], [19.0791, 45.96458], [19.01284, 45.96529], [18.99712, 45.93537], [18.81394, 45.91329], [18.85783, 45.85493], [18.90305, 45.71863], [18.96691, 45.66731], [18.88776, 45.57253], [18.94562, 45.53712], [19.07471, 45.53086], [19.08364, 45.48804], [18.99918, 45.49333], [18.97446, 45.37528], [19.10774, 45.29547], [19.28208, 45.23813], [19.41941, 45.23475], [19.43589, 45.17137], [19.19144, 45.17863], [19.14063, 45.12972], [19.07952, 45.14668], [19.1011, 45.01191], [19.05205, 44.97692], [19.15573, 44.95409], [19.06853, 44.89915], [19.02871, 44.92541], [18.98957, 44.90645], [19.01994, 44.85493], [19.18183, 44.92055], [19.36722, 44.88164], [19.32543, 44.74058], [19.26388, 44.65412], [19.16699, 44.52197], [19.13369, 44.52521], [19.12278, 44.50132], [19.14837, 44.45253], [19.14681, 44.41463], [19.11785, 44.40313], [19.10749, 44.39421], [19.10704, 44.38249], [19.10365, 44.37795], [19.10298, 44.36924], [19.11865, 44.36712], [19.1083, 44.3558], [19.11547, 44.34218], [19.13556, 44.338], [19.13332, 44.31492], [19.16741, 44.28648], [19.18328, 44.28383], [19.20508, 44.2917], [19.23306, 44.26097], [19.26945, 44.26957], [19.32464, 44.27185], [19.34773, 44.23244], [19.3588, 44.18353], [19.40927, 44.16722], [19.43905, 44.13088], [19.47338, 44.15034], [19.48386, 44.14332], [19.47321, 44.1193], [19.51167, 44.08158], [19.55999, 44.06894], [19.57467, 44.04716], [19.61991, 44.05254], [19.61836, 44.01464], [19.56498, 43.99922], [19.52515, 43.95573], [19.38439, 43.96611], [19.24363, 44.01502], [19.23465, 43.98764], [19.3986, 43.79668], [19.5176, 43.71403], [19.50455, 43.58385], [19.42696, 43.57987], [19.41941, 43.54056], [19.36653, 43.60921], [19.33426, 43.58833], [19.2553, 43.5938], [19.24774, 43.53061], [19.22807, 43.5264], [19.22229, 43.47926], [19.44315, 43.38846], [19.48171, 43.32644], [19.52962, 43.31623], [19.54598, 43.25158], [19.62661, 43.2286], [19.64063, 43.19027], [19.76918, 43.16044], [19.79255, 43.11951], [19.92576, 43.08539], [19.96549, 43.11098], [19.98887, 43.0538], [20.04729, 43.02732], [20.05431, 42.99571], [20.12325, 42.96237], [20.14896, 42.99058], [20.16415, 42.97177], [20.34528, 42.90676], [20.35692, 42.8335], [20.40594, 42.84853], [20.43734, 42.83157], [20.53484, 42.8885], [20.48692, 42.93208], [20.59929, 43.01067], [20.64557, 43.00826], [20.69515, 43.09641], [20.59929, 43.20492], [20.68688, 43.21335], [20.73811, 43.25068], [20.82145, 43.26769], [20.88685, 43.21697], [20.83727, 43.17842], [20.96287, 43.12416], [21.00749, 43.13984], [21.05378, 43.10707], [21.08952, 43.13471], [21.14465, 43.11089], [21.16734, 42.99694], [21.2041, 43.02277], [21.23877, 43.00848], [21.23534, 42.95523], [21.2719, 42.8994], [21.32974, 42.90424], [21.36941, 42.87397], [21.44047, 42.87276], [21.39045, 42.74888], [21.47498, 42.74695], [21.59154, 42.72643], [21.58755, 42.70418], [21.6626, 42.67813], [21.75025, 42.70125], [21.79413, 42.65923], [21.75672, 42.62695], [21.7327, 42.55041], [21.70522, 42.54176], [21.7035, 42.51899], [21.62556, 42.45106], [21.64209, 42.41081], [21.62887, 42.37664], [21.59029, 42.38042], [21.57021, 42.3647], [21.53467, 42.36809], [21.5264, 42.33634], [21.56772, 42.30946], [21.58992, 42.25915], [21.70111, 42.23789], [21.77176, 42.2648], [21.84654, 42.3247], [21.91595, 42.30392], [21.94405, 42.34669], [22.02908, 42.29848], [22.16384, 42.32103], [22.29605, 42.37477], [22.29275, 42.34913], [22.34773, 42.31725], [22.45919, 42.33822], [22.47498, 42.3915], [22.51961, 42.3991], [22.55669, 42.50144], [22.43983, 42.56851], [22.4997, 42.74144], [22.43309, 42.82057], [22.54302, 42.87774], [22.74826, 42.88701], [22.78397, 42.98253], [22.89521, 43.03625], [22.98104, 43.11199], [23.00806, 43.19279], [22.89727, 43.22417], [22.82036, 43.33665], [22.53397, 43.47225], [22.47582, 43.6558], [22.41043, 43.69566], [22.35558, 43.81281], [22.41449, 44.00514], [22.61688, 44.06534], [22.61711, 44.16938], [22.67173, 44.21564], [22.68166, 44.28206], [22.56012, 44.30712], [22.45436, 44.47258], [22.54021, 44.47836], [22.56493, 44.53419], [22.61368, 44.55719], [22.70981, 44.51852], [22.76749, 44.54446], [22.69196, 44.61587], [22.61917, 44.61489], [22.45301, 44.7194], [22.30844, 44.6619], [22.18315, 44.48179], [22.13234, 44.47444], [22.08016, 44.49844], [21.99364, 44.63395], [21.7795, 44.66165], [21.71692, 44.65349], [21.67504, 44.67107], [21.61942, 44.67059], [21.60019, 44.75208], [21.55007, 44.77304], [21.38802, 44.78133], [21.35643, 44.86364], [21.44013, 44.87613], [21.48202, 44.87199], [21.56328, 44.89502], [21.54938, 44.9327], [21.35855, 45.01941], [21.4505, 45.04294], [21.51299, 45.15345], [21.48278, 45.19557], [21.29398, 45.24148], [21.20392, 45.2677], [21.17612, 45.32566], [21.09894, 45.30144], [20.87948, 45.42743], [20.86026, 45.47295], [20.77217, 45.49788], [20.83321, 45.53567], [20.76798, 45.60969], [20.80361, 45.65875], [20.82364, 45.77738], [20.78446, 45.78522], [20.77416, 45.75601], [20.70069, 45.7493], [20.65645, 45.82801], [20.54818, 45.89939], [20.35862, 45.99356], [20.26068, 46.12332], [20.09713, 46.17315], [20.03533, 46.14509], [20.01816, 46.17696], [19.93508, 46.17553], [19.81491, 46.1313], [19.66007, 46.19005]]]] } },
23281     { type: "Feature", properties: { iso1A2: "RU", iso1A3: "RUS", iso1N3: "643", wikidata: "Q159", nameEn: "Russia" }, geometry: null },
23282     { type: "Feature", properties: { iso1A2: "RW", iso1A3: "RWA", iso1N3: "646", wikidata: "Q1037", nameEn: "Rwanda", groups: ["014", "202", "002", "UN"], callingCodes: ["250"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.47194, -1.0555], [30.35212, -1.06896], [30.16369, -1.34303], [29.912, -1.48269], [29.82657, -1.31187], [29.59061, -1.39016], [29.53062, -1.40499], [29.45038, -1.5054], [29.36322, -1.50887], [29.24323, -1.66826], [29.24458, -1.69663], [29.11847, -1.90576], [29.17562, -2.12278], [29.105, -2.27043], [29.00051, -2.29001], [28.95642, -2.37321], [28.89601, -2.37321], [28.86826, -2.41888], [28.86846, -2.44866], [28.89132, -2.47557], [28.89342, -2.49017], [28.88846, -2.50493], [28.87497, -2.50887], [28.86209, -2.5231], [28.86193, -2.53185], [28.87943, -2.55165], [28.89288, -2.55848], [28.90226, -2.62385], [28.89793, -2.66111], [28.94346, -2.69124], [29.00357, -2.70596], [29.04081, -2.7416], [29.0562, -2.58632], [29.32234, -2.6483], [29.36805, -2.82933], [29.88237, -2.75105], [29.95911, -2.33348], [30.14034, -2.43626], [30.42933, -2.31064], [30.54501, -2.41404], [30.83915, -2.35795], [30.89303, -2.08223], [30.80802, -1.91477], [30.84079, -1.64652], [30.71974, -1.43244], [30.57123, -1.33264], [30.50889, -1.16412], [30.45116, -1.10641], [30.47194, -1.0555]]]] } },
23283     { type: "Feature", properties: { iso1A2: "SA", iso1A3: "SAU", iso1N3: "682", wikidata: "Q851", nameEn: "Saudi Arabia", groups: ["145", "142", "UN"], callingCodes: ["966"] }, geometry: { type: "MultiPolygon", coordinates: [[[[40.01521, 32.05667], [39.29903, 32.23259], [38.99233, 31.99721], [36.99791, 31.50081], [37.99354, 30.49998], [37.66395, 30.33245], [37.4971, 29.99949], [36.75083, 29.86903], [36.50005, 29.49696], [36.07081, 29.18469], [34.8812, 29.36878], [34.4454, 27.91479], [37.8565, 22.00903], [39.63762, 18.37348], [40.99158, 15.81743], [42.15205, 16.40211], [42.76801, 16.40371], [42.94625, 16.39721], [42.94351, 16.49467], [42.97215, 16.51093], [43.11601, 16.53166], [43.15274, 16.67248], [43.22066, 16.65179], [43.21325, 16.74416], [43.25857, 16.75304], [43.26303, 16.79479], [43.24801, 16.80613], [43.22956, 16.80613], [43.22012, 16.83932], [43.18338, 16.84852], [43.1398, 16.90696], [43.19328, 16.94703], [43.1813, 16.98438], [43.18233, 17.02673], [43.23967, 17.03428], [43.17787, 17.14717], [43.20156, 17.25901], [43.32653, 17.31179], [43.22533, 17.38343], [43.29185, 17.53224], [43.43005, 17.56148], [43.70631, 17.35762], [44.50126, 17.47475], [46.31018, 17.20464], [46.76494, 17.29151], [47.00571, 16.94765], [47.48245, 17.10808], [47.58351, 17.50366], [48.19996, 18.20584], [49.04884, 18.59899], [52.00311, 19.00083], [54.99756, 20.00083], [55.66469, 21.99658], [55.2137, 22.71065], [55.13599, 22.63334], [52.56622, 22.94341], [51.59617, 24.12041], [51.58871, 24.27256], [51.41644, 24.39615], [51.58834, 24.66608], [51.39468, 24.62785], [51.29972, 24.50747], [51.09638, 24.46907], [50.92992, 24.54396], [50.8133, 24.74049], [50.57069, 25.57887], [50.302, 25.87592], [50.26923, 26.08243], [50.38162, 26.53976], [50.71771, 26.73086], [50.37726, 27.89227], [49.98877, 27.87827], [49.00421, 28.81495], [48.42991, 28.53628], [47.70561, 28.5221], [47.59863, 28.66798], [47.58376, 28.83382], [47.46202, 29.0014], [46.5527, 29.10283], [46.42415, 29.05947], [44.72255, 29.19736], [42.97796, 30.48295], [42.97601, 30.72204], [40.01521, 32.05667]]]] } },
23284     { type: "Feature", properties: { iso1A2: "SB", iso1A3: "SLB", iso1N3: "090", wikidata: "Q685", nameEn: "Solomon Islands", groups: ["054", "009", "UN"], driveSide: "left", callingCodes: ["677"] }, geometry: { type: "MultiPolygon", coordinates: [[[[172.71443, -12.01327], [160.43769, -4.17974], [156.03296, -6.55528], [156.03993, -6.65703], [155.92557, -6.84664], [155.69784, -6.92661], [155.60735, -6.92266], [154.74815, -7.33315], [156.73836, -14.50464], [172.71443, -12.01327]]]] } },
23285     { type: "Feature", properties: { iso1A2: "SC", iso1A3: "SYC", iso1N3: "690", wikidata: "Q1042", nameEn: "Seychelles", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["248"] }, geometry: { type: "MultiPolygon", coordinates: [[[[43.75112, -10.38913], [54.83239, -10.93575], [66.3222, 5.65313], [43.75112, -10.38913]]]] } },
23286     { type: "Feature", properties: { iso1A2: "SD", iso1A3: "SDN", iso1N3: "729", wikidata: "Q1049", nameEn: "Sudan", groups: ["015", "002", "UN"], callingCodes: ["249"] }, geometry: { type: "MultiPolygon", coordinates: [[[[37.8565, 22.00903], [34.0765, 22.00501], [33.99686, 21.76784], [33.57251, 21.72406], [33.17563, 22.00405], [24.99885, 21.99535], [24.99794, 19.99661], [23.99715, 20.00038], [23.99539, 19.49944], [23.99997, 15.69575], [23.62785, 15.7804], [23.38812, 15.69649], [23.10792, 15.71297], [22.93201, 15.55107], [22.92579, 15.47007], [22.99584, 15.40105], [22.99584, 15.22989], [22.66115, 14.86308], [22.70474, 14.69149], [22.38562, 14.58907], [22.44944, 14.24986], [22.55997, 14.23024], [22.5553, 14.11704], [22.22995, 13.96754], [22.08674, 13.77863], [22.29689, 13.3731], [22.1599, 13.19281], [22.02914, 13.13976], [21.94819, 13.05637], [21.81432, 12.81362], [21.89371, 12.68001], [21.98711, 12.63292], [22.15679, 12.66634], [22.22684, 12.74682], [22.46345, 12.61925], [22.38873, 12.45514], [22.50548, 12.16769], [22.48369, 12.02766], [22.64092, 12.07485], [22.54907, 11.64372], [22.7997, 11.40424], [22.93124, 11.41645], [22.97249, 11.21955], [22.87758, 10.91915], [23.02221, 10.69235], [23.3128, 10.45214], [23.67164, 9.86923], [23.69155, 9.67566], [24.09319, 9.66572], [24.12744, 9.73784], [24.49389, 9.79962], [24.84653, 9.80643], [24.97739, 9.9081], [25.05688, 10.06776], [25.0918, 10.33718], [25.78141, 10.42599], [25.93163, 10.38159], [25.93241, 10.17941], [26.21338, 9.91545], [26.35815, 9.57946], [26.70685, 9.48735], [27.14427, 9.62858], [27.90704, 9.61323], [28.99983, 9.67155], [29.06988, 9.74826], [29.53844, 9.75133], [29.54, 10.07949], [29.94629, 10.29245], [30.00389, 10.28633], [30.53005, 9.95992], [30.82893, 9.71451], [30.84605, 9.7498], [31.28504, 9.75287], [31.77539, 10.28939], [31.99177, 10.65065], [32.46967, 11.04662], [32.39358, 11.18207], [32.39578, 11.70208], [32.10079, 11.95203], [32.73921, 11.95203], [32.73921, 12.22757], [33.25876, 12.22111], [33.13988, 11.43248], [33.26977, 10.83632], [33.24645, 10.77913], [33.52294, 10.64382], [33.66604, 10.44254], [33.80913, 10.32994], [33.90159, 10.17179], [33.96984, 10.15446], [33.99185, 9.99623], [33.96323, 9.80972], [33.9082, 9.762], [33.87958, 9.49937], [34.10229, 9.50238], [34.08717, 9.55243], [34.13186, 9.7492], [34.20484, 9.9033], [34.22718, 10.02506], [34.32102, 10.11599], [34.34783, 10.23914], [34.2823, 10.53508], [34.4372, 10.781], [34.59062, 10.89072], [34.77383, 10.74588], [34.77532, 10.69027], [34.86618, 10.74588], [34.86916, 10.78832], [34.97491, 10.86147], [34.97789, 10.91559], [34.93172, 10.95946], [35.01215, 11.19626], [34.95704, 11.24448], [35.09556, 11.56278], [35.05832, 11.71158], [35.11492, 11.85156], [35.24302, 11.91132], [35.70476, 12.67101], [36.01458, 12.72478], [36.14268, 12.70879], [36.16651, 12.88019], [36.13374, 12.92665], [36.24545, 13.36759], [36.38993, 13.56459], [36.48824, 13.83954], [36.44653, 13.95666], [36.54376, 14.25597], [36.44337, 15.14963], [36.54276, 15.23478], [36.69761, 15.75323], [36.76371, 15.80831], [36.92193, 16.23451], [36.99777, 17.07172], [37.42694, 17.04041], [37.50967, 17.32199], [38.13362, 17.53906], [38.37133, 17.66269], [38.45916, 17.87167], [38.57727, 17.98125], [39.63762, 18.37348], [37.8565, 22.00903]]]] } },
23287     { type: "Feature", properties: { iso1A2: "SE", iso1A3: "SWE", iso1N3: "752", wikidata: "Q34", nameEn: "Sweden", groups: ["EU", "154", "150", "UN"], callingCodes: ["46"] }, geometry: { type: "MultiPolygon", coordinates: [[[[24.15791, 65.85385], [23.90497, 66.15802], [23.71339, 66.21299], [23.64982, 66.30603], [23.67591, 66.3862], [23.63776, 66.43568], [23.85959, 66.56434], [23.89488, 66.772], [23.98059, 66.79585], [23.98563, 66.84149], [23.56214, 67.17038], [23.58735, 67.20752], [23.54701, 67.25435], [23.75372, 67.29914], [23.75372, 67.43688], [23.39577, 67.46974], [23.54701, 67.59306], [23.45627, 67.85297], [23.65793, 67.9497], [23.40081, 68.05545], [23.26469, 68.15134], [23.15377, 68.14759], [23.10336, 68.26551], [22.73028, 68.40881], [22.00429, 68.50692], [21.03001, 68.88969], [20.90649, 68.89696], [20.85104, 68.93142], [20.91658, 68.96764], [20.78802, 69.03087], [20.55258, 69.06069], [20.0695, 69.04469], [20.28444, 68.93283], [20.33435, 68.80174], [20.22027, 68.67246], [19.95647, 68.55546], [20.22027, 68.48759], [19.93508, 68.35911], [18.97255, 68.52416], [18.63032, 68.50849], [18.39503, 68.58672], [18.1241, 68.53721], [18.13836, 68.20874], [17.90787, 67.96537], [17.30416, 68.11591], [16.7409, 67.91037], [16.38441, 67.52923], [16.12774, 67.52106], [16.09922, 67.4364], [16.39154, 67.21653], [16.35589, 67.06419], [15.37197, 66.48217], [15.49318, 66.28509], [15.05113, 66.15572], [14.53778, 66.12399], [14.50926, 65.31786], [13.64276, 64.58402], [14.11117, 64.46674], [14.16051, 64.18725], [13.98222, 64.00953], [13.23411, 64.09087], [12.74105, 64.02171], [12.14928, 63.59373], [12.19919, 63.47935], [11.98529, 63.27487], [12.19919, 63.00104], [12.07085, 62.6297], [12.29187, 62.25699], [12.14746, 61.7147], [12.40595, 61.57226], [12.57707, 61.56547], [12.86939, 61.35427], [12.69115, 61.06584], [12.2277, 61.02442], [12.59133, 60.50559], [12.52003, 60.13846], [12.36317, 59.99259], [12.15641, 59.8926], [11.87121, 59.86039], [11.92112, 59.69531], [11.69297, 59.59442], [11.8213, 59.24985], [11.65732, 58.90177], [11.45199, 58.89604], [11.4601, 58.99022], [11.34459, 59.11672], [11.15367, 59.07862], [11.08911, 58.98745], [10.64958, 58.89391], [10.40861, 58.38489], [12.16597, 56.60205], [12.07466, 56.29488], [12.65312, 56.04345], [12.6372, 55.91371], [12.88472, 55.63369], [12.60345, 55.42675], [12.84405, 55.13257], [14.28399, 55.1553], [14.89259, 55.5623], [15.79951, 55.54655], [19.64795, 57.06466], [19.84909, 57.57876], [20.5104, 59.15546], [19.08191, 60.19152], [19.23413, 60.61414], [20.15877, 63.06556], [24.14112, 65.39731], [24.15107, 65.81427], [24.14798, 65.83466], [24.15791, 65.85385]]]] } },
23288     { type: "Feature", properties: { iso1A2: "SG", iso1A3: "SGP", iso1N3: "702", wikidata: "Q334", nameEn: "Singapore", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["65"] }, geometry: { type: "MultiPolygon", coordinates: [[[[104.00131, 1.42405], [103.93384, 1.42926], [103.89565, 1.42841], [103.86383, 1.46288], [103.81181, 1.47953], [103.76395, 1.45183], [103.74161, 1.4502], [103.7219, 1.46108], [103.67468, 1.43166], [103.62738, 1.35255], [103.56591, 1.19719], [103.66049, 1.18825], [103.74084, 1.12902], [104.03085, 1.26954], [104.12282, 1.27714], [104.08072, 1.35998], [104.09162, 1.39694], [104.08871, 1.42015], [104.07348, 1.43322], [104.04622, 1.44691], [104.02277, 1.4438], [104.00131, 1.42405]]]] } },
23289     { type: "Feature", properties: { iso1A2: "SH", iso1A3: "SHN", iso1N3: "654", wikidata: "Q192184", nameEn: "Saint Helena, Ascension and Tristan da Cunha", country: "GB" }, geometry: null },
23290     { type: "Feature", properties: { iso1A2: "SI", iso1A3: "SVN", iso1N3: "705", wikidata: "Q215", nameEn: "Slovenia", groups: ["EU", "039", "150", "UN"], callingCodes: ["386"] }, geometry: { type: "MultiPolygon", coordinates: [[[[16.50139, 46.56684], [16.39217, 46.63673], [16.38594, 46.6549], [16.41863, 46.66238], [16.42641, 46.69228], [16.37816, 46.69975], [16.30966, 46.7787], [16.31303, 46.79838], [16.3408, 46.80641], [16.34547, 46.83836], [16.2941, 46.87137], [16.2365, 46.87775], [16.21892, 46.86961], [16.15711, 46.85434], [16.14365, 46.8547], [16.10983, 46.867], [16.05786, 46.83927], [15.99054, 46.82772], [15.99126, 46.78199], [15.98432, 46.74991], [15.99769, 46.7266], [16.02808, 46.71094], [16.04347, 46.68694], [16.04036, 46.6549], [15.99988, 46.67947], [15.98512, 46.68463], [15.94864, 46.68769], [15.87691, 46.7211], [15.8162, 46.71897], [15.78518, 46.70712], [15.76771, 46.69863], [15.73823, 46.70011], [15.72279, 46.69548], [15.69523, 46.69823], [15.67411, 46.70735], [15.6543, 46.70616], [15.6543, 46.69228], [15.6365, 46.6894], [15.63255, 46.68069], [15.62317, 46.67947], [15.59826, 46.68908], [15.54533, 46.66985], [15.55333, 46.64988], [15.54431, 46.6312], [15.46906, 46.61321], [15.45514, 46.63697], [15.41235, 46.65556], [15.23711, 46.63994], [15.14215, 46.66131], [15.01451, 46.641], [14.98024, 46.6009], [14.96002, 46.63459], [14.92283, 46.60848], [14.87129, 46.61], [14.86419, 46.59411], [14.83549, 46.56614], [14.81836, 46.51046], [14.72185, 46.49974], [14.66892, 46.44936], [14.5942, 46.43434], [14.56463, 46.37208], [14.52176, 46.42617], [14.45877, 46.41717], [14.42608, 46.44614], [14.314, 46.43327], [14.28326, 46.44315], [14.15989, 46.43327], [14.12097, 46.47724], [14.04002, 46.49117], [14.00422, 46.48474], [13.89837, 46.52331], [13.7148, 46.5222], [13.68684, 46.43881], [13.59777, 46.44137], [13.5763, 46.42613], [13.5763, 46.40915], [13.47019, 46.3621], [13.43418, 46.35992], [13.44808, 46.33507], [13.37671, 46.29668], [13.42218, 46.20758], [13.47587, 46.22725], [13.56114, 46.2054], [13.56682, 46.18703], [13.64451, 46.18966], [13.66472, 46.17392], [13.64053, 46.13587], [13.57072, 46.09022], [13.50104, 46.05986], [13.49568, 46.04839], [13.50998, 46.04498], [13.49702, 46.01832], [13.47474, 46.00546], [13.50104, 45.98078], [13.52963, 45.96588], [13.56759, 45.96991], [13.58903, 45.99009], [13.62074, 45.98388], [13.63458, 45.98947], [13.64307, 45.98326], [13.6329, 45.94894], [13.63815, 45.93607], [13.61931, 45.91782], [13.60857, 45.89907], [13.59565, 45.89446], [13.58644, 45.88173], [13.57563, 45.8425], [13.58858, 45.83503], [13.59784, 45.8072], [13.66986, 45.79955], [13.8235, 45.7176], [13.83332, 45.70855], [13.83422, 45.68703], [13.87933, 45.65207], [13.9191, 45.6322], [13.8695, 45.60835], [13.86771, 45.59898], [13.84106, 45.58185], [13.78445, 45.5825], [13.74587, 45.59811], [13.7198, 45.59352], [13.6076, 45.64761], [13.45644, 45.59464], [13.56979, 45.4895], [13.62902, 45.45898], [13.67398, 45.4436], [13.7785, 45.46787], [13.81742, 45.43729], [13.88124, 45.42637], [13.90771, 45.45149], [13.97309, 45.45258], [13.99488, 45.47551], [13.96063, 45.50825], [14.00578, 45.52352], [14.07116, 45.48752], [14.20348, 45.46896], [14.22371, 45.50388], [14.24239, 45.50607], [14.26611, 45.48239], [14.27681, 45.4902], [14.32487, 45.47142], [14.36693, 45.48642], [14.49769, 45.54424], [14.5008, 45.60852], [14.53816, 45.6205], [14.57397, 45.67165], [14.60977, 45.66403], [14.59576, 45.62812], [14.69694, 45.57366], [14.68605, 45.53006], [14.71718, 45.53442], [14.80124, 45.49515], [14.81992, 45.45913], [14.90554, 45.47769], [14.92266, 45.52788], [15.02385, 45.48533], [15.05187, 45.49079], [15.16862, 45.42309], [15.27758, 45.46678], [15.33051, 45.45258], [15.38188, 45.48752], [15.30249, 45.53224], [15.29837, 45.5841], [15.27747, 45.60504], [15.31027, 45.6303], [15.34695, 45.63382], [15.34214, 45.64702], [15.38952, 45.63682], [15.4057, 45.64727], [15.34919, 45.71623], [15.30872, 45.69014], [15.25423, 45.72275], [15.40836, 45.79491], [15.47531, 45.79802], [15.47325, 45.8253], [15.52234, 45.82195], [15.57952, 45.84953], [15.64185, 45.82915], [15.66662, 45.84085], [15.70411, 45.8465], [15.68232, 45.86819], [15.68383, 45.88867], [15.67967, 45.90455], [15.70636, 45.92116], [15.70327, 46.00015], [15.71246, 46.01196], [15.72977, 46.04682], [15.62317, 46.09103], [15.6083, 46.11992], [15.59909, 46.14761], [15.64904, 46.19229], [15.6434, 46.21396], [15.67395, 46.22478], [15.75436, 46.21969], [15.75479, 46.20336], [15.78817, 46.21719], [15.79284, 46.25811], [15.97965, 46.30652], [16.07616, 46.3463], [16.07314, 46.36458], [16.05065, 46.3833], [16.05281, 46.39141], [16.14859, 46.40547], [16.18824, 46.38282], [16.30233, 46.37837], [16.30162, 46.40437], [16.27329, 46.41467], [16.27398, 46.42875], [16.25124, 46.48067], [16.23961, 46.49653], [16.26759, 46.50566], [16.26733, 46.51505], [16.29793, 46.5121], [16.37193, 46.55008], [16.38771, 46.53608], [16.44036, 46.5171], [16.5007, 46.49644], [16.52604, 46.47831], [16.59527, 46.47524], [16.52604, 46.5051], [16.52885, 46.53303], [16.50139, 46.56684]]]] } },
23291     { type: "Feature", properties: { iso1A2: "SJ", iso1A3: "SJM", iso1N3: "744", wikidata: "Q842829", nameEn: "Svalbard and Jan Mayen", country: "NO" }, geometry: null },
23292     { type: "Feature", properties: { iso1A2: "SK", iso1A3: "SVK", iso1N3: "703", wikidata: "Q214", nameEn: "Slovakia", groups: ["EU", "151", "150", "UN"], callingCodes: ["421"] }, geometry: { type: "MultiPolygon", coordinates: [[[[19.82237, 49.27806], [19.78581, 49.41701], [19.72127, 49.39288], [19.6375, 49.40897], [19.64162, 49.45184], [19.57845, 49.46077], [19.53313, 49.52856], [19.52626, 49.57311], [19.45348, 49.61583], [19.37795, 49.574], [19.36009, 49.53747], [19.25435, 49.53391], [19.18019, 49.41165], [18.9742, 49.39557], [18.97283, 49.49914], [18.94536, 49.52143], [18.84521, 49.51672], [18.74761, 49.492], [18.67757, 49.50895], [18.6144, 49.49824], [18.57183, 49.51162], [18.53063, 49.49022], [18.54848, 49.47059], [18.44686, 49.39467], [18.4084, 49.40003], [18.4139, 49.36517], [18.36446, 49.3267], [18.18456, 49.28909], [18.15022, 49.24518], [18.1104, 49.08624], [18.06885, 49.03157], [17.91814, 49.01784], [17.87831, 48.92679], [17.77944, 48.92318], [17.73126, 48.87885], [17.7094, 48.86721], [17.5295, 48.81117], [17.45671, 48.85004], [17.3853, 48.80936], [17.29054, 48.85546], [17.19355, 48.87602], [17.11202, 48.82925], [17.00215, 48.70887], [16.93955, 48.60371], [16.94611, 48.53614], [16.85204, 48.44968], [16.8497, 48.38321], [16.83588, 48.3844], [16.83317, 48.38138], [16.84243, 48.35258], [16.90903, 48.32519], [16.89461, 48.31332], [16.97701, 48.17385], [17.02919, 48.13996], [17.05735, 48.14179], [17.09168, 48.09366], [17.07039, 48.0317], [17.16001, 48.00636], [17.23699, 48.02094], [17.71215, 47.7548], [18.02938, 47.75665], [18.29305, 47.73541], [18.56496, 47.76588], [18.66521, 47.76772], [18.74074, 47.8157], [18.8506, 47.82308], [18.76821, 47.87469], [18.76134, 47.97499], [18.82176, 48.04206], [19.01952, 48.07052], [19.23924, 48.0595], [19.28182, 48.08336], [19.47957, 48.09437], [19.52489, 48.19791], [19.63338, 48.25006], [19.92452, 48.1283], [20.24312, 48.2784], [20.29943, 48.26104], [20.5215, 48.53336], [20.83248, 48.5824], [21.11516, 48.49546], [21.44063, 48.58456], [21.6068, 48.50365], [21.67134, 48.3989], [21.72525, 48.34628], [21.8279, 48.33321], [21.83339, 48.36242], [22.14689, 48.4005], [22.16023, 48.56548], [22.21379, 48.6218], [22.34151, 48.68893], [22.42934, 48.92857], [22.48296, 48.99172], [22.54338, 49.01424], [22.56155, 49.08865], [22.04427, 49.22136], [21.96385, 49.3437], [21.82927, 49.39467], [21.77983, 49.35443], [21.62328, 49.4447], [21.43376, 49.41433], [21.27858, 49.45988], [21.19756, 49.4054], [21.12477, 49.43666], [21.041, 49.41791], [21.09799, 49.37176], [20.98733, 49.30774], [20.9229, 49.29626], [20.77971, 49.35383], [20.72274, 49.41813], [20.61666, 49.41791], [20.5631, 49.375], [20.46422, 49.41612], [20.39939, 49.3896], [20.31728, 49.39914], [20.31453, 49.34817], [20.21977, 49.35265], [20.13738, 49.31685], [20.08238, 49.1813], [19.98494, 49.22904], [19.90529, 49.23532], [19.86409, 49.19316], [19.75286, 49.20751], [19.82237, 49.27806]]]] } },
23293     { type: "Feature", properties: { iso1A2: "SL", iso1A3: "SLE", iso1N3: "694", wikidata: "Q1044", nameEn: "Sierra Leone", groups: ["011", "202", "002", "UN"], callingCodes: ["232"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-10.27575, 8.48711], [-10.37257, 8.48941], [-10.54891, 8.31174], [-10.63934, 8.35326], [-10.70565, 8.29235], [-10.61422, 8.5314], [-10.47707, 8.67669], [-10.56197, 8.81225], [-10.5783, 9.06386], [-10.74484, 9.07998], [-10.6534, 9.29919], [-11.2118, 10.00098], [-11.89624, 9.99763], [-11.91023, 9.93927], [-12.12634, 9.87203], [-12.24262, 9.92386], [-12.47254, 9.86834], [-12.76788, 9.3133], [-12.94095, 9.26335], [-13.08953, 9.0409], [-13.18586, 9.0925], [-13.29911, 9.04245], [-14.36218, 8.64107], [-12.15048, 6.15992], [-11.50429, 6.92704], [-11.4027, 6.97746], [-11.29417, 7.21576], [-10.60422, 7.7739], [-10.60492, 8.04072], [-10.57523, 8.04829], [-10.51554, 8.1393], [-10.45023, 8.15627], [-10.35227, 8.15223], [-10.29839, 8.21283], [-10.31635, 8.28554], [-10.30084, 8.30008], [-10.27575, 8.48711]]]] } },
23294     { type: "Feature", properties: { iso1A2: "SM", iso1A3: "SMR", iso1N3: "674", wikidata: "Q238", nameEn: "San Marino", groups: ["039", "150", "UN"], callingCodes: ["378"] }, geometry: { type: "MultiPolygon", coordinates: [[[[12.45648, 43.89369], [12.48771, 43.89706], [12.49429, 43.90973], [12.49247, 43.91774], [12.49724, 43.92248], [12.50269, 43.92363], [12.50496, 43.93017], [12.51553, 43.94096], [12.51427, 43.94897], [12.50655, 43.95796], [12.50875, 43.96198], [12.50622, 43.97131], [12.51109, 43.97201], [12.51064, 43.98165], [12.5154, 43.98508], [12.51463, 43.99122], [12.50678, 43.99113], [12.49406, 43.98492], [12.47853, 43.98052], [12.46205, 43.97463], [12.44684, 43.96597], [12.43662, 43.95698], [12.42005, 43.9578], [12.41414, 43.95273], [12.40415, 43.95485], [12.40506, 43.94325], [12.41165, 43.93769], [12.41551, 43.92984], [12.40733, 43.92379], [12.41233, 43.90956], [12.40935, 43.9024], [12.41641, 43.89991], [12.44184, 43.90498], [12.45648, 43.89369]]]] } },
23295     { type: "Feature", properties: { iso1A2: "SN", iso1A3: "SEN", iso1N3: "686", wikidata: "Q1041", nameEn: "Senegal", groups: ["011", "202", "002", "UN"], callingCodes: ["221"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-14.32144, 16.61495], [-15.00557, 16.64997], [-15.6509, 16.50315], [-16.27016, 16.51565], [-16.4429, 16.20605], [-16.44814, 16.09753], [-16.48967, 16.0496], [-16.50854, 16.09032], [-17.15288, 16.07139], [-18.35085, 14.63444], [-17.43598, 13.59273], [-15.47902, 13.58758], [-15.36504, 13.79313], [-14.93719, 13.80173], [-14.34721, 13.46578], [-13.8955, 13.59126], [-13.79409, 13.34472], [-14.36795, 13.23033], [-15.14917, 13.57989], [-15.26908, 13.37768], [-15.80478, 13.34832], [-15.80355, 13.16729], [-16.69343, 13.16791], [-16.74676, 13.06025], [-17.43966, 13.04579], [-17.4623, 11.92379], [-16.70562, 12.34803], [-16.38191, 12.36449], [-16.20591, 12.46157], [-15.67302, 12.42974], [-15.17582, 12.6847], [-13.70523, 12.68013], [-13.05296, 12.64003], [-13.06603, 12.49342], [-12.87336, 12.51892], [-12.35415, 12.32758], [-11.91331, 12.42008], [-11.46267, 12.44559], [-11.37536, 12.40788], [-11.39935, 12.97808], [-11.63025, 13.39174], [-11.83345, 13.33333], [-12.06897, 13.71049], [-11.93043, 13.84505], [-12.23936, 14.76324], [-13.11029, 15.52116], [-13.43135, 16.09022], [-13.80075, 16.13961], [-14.32144, 16.61495]]]] } },
23296     { type: "Feature", properties: { iso1A2: "SO", iso1A3: "SOM", iso1N3: "706", wikidata: "Q1045", nameEn: "Somalia", groups: ["014", "202", "002", "UN"], callingCodes: ["252"] }, geometry: { type: "MultiPolygon", coordinates: [[[[51.12877, 12.56479], [43.90659, 12.3823], [42.95776, 10.98533], [42.69452, 10.62672], [42.87643, 10.18441], [43.0937, 9.90579], [43.23518, 9.84605], [43.32613, 9.59205], [44.19222, 8.93028], [46.99339, 7.9989], [47.92477, 8.00111], [47.97917, 8.00124], [44.98104, 4.91821], [44.02436, 4.9451], [43.40263, 4.79289], [43.04177, 4.57923], [42.97746, 4.44032], [42.84526, 4.28357], [42.55853, 4.20518], [42.07619, 4.17667], [41.89488, 3.97375], [41.31368, 3.14314], [40.98767, 2.82959], [41.00099, -0.83068], [41.56, -1.59812], [41.56362, -1.66375], [41.75542, -1.85308], [57.49095, 8.14549], [51.12877, 12.56479]]]] } },
23297     { type: "Feature", properties: { iso1A2: "SR", iso1A3: "SUR", iso1N3: "740", wikidata: "Q730", nameEn: "Suriname", groups: ["005", "419", "019", "UN"], driveSide: "left", callingCodes: ["597"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-54.26916, 5.26909], [-54.01877, 5.52789], [-54.01074, 5.68785], [-53.7094, 6.2264], [-56.84822, 6.73257], [-57.31629, 5.33714], [-57.22536, 5.15605], [-57.37442, 5.0208], [-57.8699, 4.89394], [-58.0307, 3.95513], [-57.35891, 3.32121], [-56.70519, 2.02964], [-56.55439, 2.02003], [-56.47045, 1.95135], [-55.99278, 1.83137], [-55.89863, 1.89861], [-55.92159, 2.05236], [-56.13054, 2.27723], [-55.96292, 2.53188], [-55.71493, 2.40342], [-55.01919, 2.564], [-54.6084, 2.32856], [-54.42864, 2.42442], [-54.28534, 2.67798], [-53.9849, 3.58697], [-53.98914, 3.627], [-54.05128, 3.63557], [-54.19367, 3.84387], [-54.38444, 4.13222], [-54.4717, 4.91964], [-54.26916, 5.26909]]]] } },
23298     { type: "Feature", properties: { iso1A2: "SS", iso1A3: "SSD", iso1N3: "728", wikidata: "Q958", nameEn: "South Sudan", groups: ["014", "202", "002", "UN"], callingCodes: ["211"] }, geometry: { type: "MultiPolygon", coordinates: [[[[34.10229, 9.50238], [33.87958, 9.49937], [33.9082, 9.762], [33.96323, 9.80972], [33.99185, 9.99623], [33.96984, 10.15446], [33.90159, 10.17179], [33.80913, 10.32994], [33.66604, 10.44254], [33.52294, 10.64382], [33.24645, 10.77913], [33.26977, 10.83632], [33.13988, 11.43248], [33.25876, 12.22111], [32.73921, 12.22757], [32.73921, 11.95203], [32.10079, 11.95203], [32.39578, 11.70208], [32.39358, 11.18207], [32.46967, 11.04662], [31.99177, 10.65065], [31.77539, 10.28939], [31.28504, 9.75287], [30.84605, 9.7498], [30.82893, 9.71451], [30.53005, 9.95992], [30.00389, 10.28633], [29.94629, 10.29245], [29.54, 10.07949], [29.53844, 9.75133], [29.06988, 9.74826], [28.99983, 9.67155], [27.90704, 9.61323], [27.14427, 9.62858], [26.70685, 9.48735], [26.35815, 9.57946], [26.21338, 9.91545], [25.93241, 10.17941], [25.93163, 10.38159], [25.78141, 10.42599], [25.0918, 10.33718], [25.05688, 10.06776], [24.97739, 9.9081], [24.84653, 9.80643], [24.49389, 9.79962], [24.12744, 9.73784], [24.09319, 9.66572], [23.69155, 9.67566], [23.62179, 9.53823], [23.64981, 9.44303], [23.64358, 9.28637], [23.56263, 9.19418], [23.4848, 9.16959], [23.44744, 8.99128], [23.59065, 8.99743], [23.51905, 8.71749], [24.25691, 8.69288], [24.13238, 8.36959], [24.35965, 8.26177], [24.85156, 8.16933], [24.98855, 7.96588], [25.25319, 7.8487], [25.29214, 7.66675], [25.20649, 7.61115], [25.20337, 7.50312], [25.35281, 7.42595], [25.37461, 7.33024], [25.90076, 7.09549], [26.38022, 6.63493], [26.32729, 6.36272], [26.58259, 6.1987], [26.51721, 6.09655], [27.22705, 5.71254], [27.22705, 5.62889], [27.28621, 5.56382], [27.23017, 5.37167], [27.26886, 5.25876], [27.44012, 5.07349], [27.56656, 4.89375], [27.65462, 4.89375], [27.76469, 4.79284], [27.79551, 4.59976], [28.20719, 4.35614], [28.6651, 4.42638], [28.8126, 4.48784], [29.03054, 4.48784], [29.22207, 4.34297], [29.43341, 4.50101], [29.49726, 4.7007], [29.82087, 4.56246], [29.79666, 4.37809], [30.06964, 4.13221], [30.1621, 4.10586], [30.22374, 3.93896], [30.27658, 3.95653], [30.47691, 3.83353], [30.55396, 3.84451], [30.57378, 3.74567], [30.56277, 3.62703], [30.78512, 3.67097], [30.80713, 3.60506], [30.85997, 3.5743], [30.85153, 3.48867], [30.97601, 3.693], [31.16666, 3.79853], [31.29476, 3.8015], [31.50478, 3.67814], [31.50776, 3.63652], [31.72075, 3.74354], [31.81459, 3.82083], [31.86821, 3.78664], [31.96205, 3.6499], [31.95907, 3.57408], [32.05187, 3.589], [32.08491, 3.56287], [32.08866, 3.53543], [32.19888, 3.50867], [32.20782, 3.6053], [32.41337, 3.748], [32.72021, 3.77327], [32.89746, 3.81339], [33.02852, 3.89296], [33.18356, 3.77812], [33.51264, 3.75068], [33.9873, 4.23316], [34.47601, 4.72162], [35.34151, 5.02364], [35.30992, 4.90402], [35.47843, 4.91872], [35.42366, 4.76969], [35.51424, 4.61643], [35.9419, 4.61933], [35.82118, 4.77382], [35.81968, 5.10757], [35.8576, 5.33413], [35.50792, 5.42431], [35.29938, 5.34042], [35.31188, 5.50106], [35.13058, 5.62118], [35.12611, 5.68937], [35.00546, 5.89387], [34.96227, 6.26415], [35.01738, 6.46991], [34.87736, 6.60161], [34.77459, 6.5957], [34.65096, 6.72589], [34.53776, 6.74808], [34.53925, 6.82794], [34.47669, 6.91076], [34.35753, 6.91963], [34.19369, 7.04382], [34.19369, 7.12807], [34.01495, 7.25664], [34.03878, 7.27437], [34.02984, 7.36449], [33.87642, 7.5491], [33.71407, 7.65983], [33.44745, 7.7543], [33.32531, 7.71297], [33.24637, 7.77939], [33.04944, 7.78989], [33.0006, 7.90333], [33.08401, 8.05822], [33.18083, 8.13047], [33.1853, 8.29264], [33.19721, 8.40317], [33.3119, 8.45474], [33.54575, 8.47094], [33.66938, 8.44442], [33.71407, 8.3678], [33.87195, 8.41938], [33.89579, 8.4842], [34.01346, 8.50041], [34.14453, 8.60204], [34.14304, 9.04654], [34.10229, 9.50238]]]] } },
23299     { type: "Feature", properties: { iso1A2: "ST", iso1A3: "STP", iso1N3: "678", wikidata: "Q1039", nameEn: "S\xE3o Tom\xE9 and Principe", groups: ["017", "202", "002", "UN"], callingCodes: ["239"] }, geometry: { type: "MultiPolygon", coordinates: [[[[4.34149, 1.91417], [6.6507, -0.28606], [7.9035, 1.92304], [4.34149, 1.91417]]]] } },
23300     { type: "Feature", properties: { iso1A2: "SV", iso1A3: "SLV", iso1N3: "222", wikidata: "Q792", nameEn: "El Salvador", groups: ["013", "003", "419", "019", "UN"], callingCodes: ["503"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-89.34776, 14.43013], [-89.39028, 14.44561], [-89.57441, 14.41637], [-89.58814, 14.33165], [-89.50614, 14.26084], [-89.52397, 14.22628], [-89.61844, 14.21937], [-89.70756, 14.1537], [-89.75569, 14.07073], [-89.73251, 14.04133], [-89.76103, 14.02923], [-89.81807, 14.07073], [-89.88937, 14.0396], [-90.10505, 13.85104], [-90.11344, 13.73679], [-90.55276, 12.8866], [-88.11443, 12.63306], [-87.7346, 13.13228], [-87.55124, 13.12523], [-87.69751, 13.25228], [-87.73714, 13.32715], [-87.80177, 13.35689], [-87.84675, 13.41078], [-87.83467, 13.44655], [-87.77354, 13.45767], [-87.73841, 13.44169], [-87.72115, 13.46083], [-87.71657, 13.50577], [-87.78148, 13.52906], [-87.73106, 13.75443], [-87.68821, 13.80829], [-87.7966, 13.91353], [-88.00331, 13.86948], [-88.07641, 13.98447], [-88.23018, 13.99915], [-88.25791, 13.91108], [-88.48982, 13.86458], [-88.49738, 13.97224], [-88.70661, 14.04317], [-88.73182, 14.10919], [-88.815, 14.11652], [-88.85785, 14.17763], [-88.94608, 14.20207], [-89.04187, 14.33644], [-89.34776, 14.43013]]]] } },
23301     { type: "Feature", properties: { iso1A2: "SX", iso1A3: "SXM", iso1N3: "534", wikidata: "Q26273", nameEn: "Sint Maarten", aliases: ["NL-SX"], country: "NL", groups: ["Q1451600", "029", "003", "419", "019", "UN"], callingCodes: ["1 721"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-63.33064, 17.9615], [-63.1055, 17.86651], [-62.93924, 18.02904], [-63.02323, 18.05757], [-63.04039, 18.05619], [-63.0579, 18.06614], [-63.07759, 18.04943], [-63.09686, 18.04608], [-63.11042, 18.05339], [-63.13502, 18.05445], [-63.33064, 17.9615]]]] } },
23302     { type: "Feature", properties: { iso1A2: "SY", iso1A3: "SYR", iso1N3: "760", wikidata: "Q858", nameEn: "Syria", groups: ["145", "142", "UN"], callingCodes: ["963"] }, geometry: { type: "MultiPolygon", coordinates: [[[[42.23683, 37.2863], [42.21548, 37.28026], [42.20454, 37.28715], [42.22381, 37.30238], [42.22257, 37.31395], [42.2112, 37.32491], [42.19301, 37.31323], [42.18225, 37.28569], [42.00894, 37.17209], [41.515, 37.08084], [41.21937, 37.07665], [40.90856, 37.13147], [40.69136, 37.0996], [39.81589, 36.75538], [39.21538, 36.66834], [39.03217, 36.70911], [38.74042, 36.70629], [38.55908, 36.84429], [38.38859, 36.90064], [38.21064, 36.91842], [37.81974, 36.76055], [37.68048, 36.75065], [37.49103, 36.66904], [37.47253, 36.63243], [37.21988, 36.6736], [37.16177, 36.66069], [37.10894, 36.6704], [37.08279, 36.63495], [37.02088, 36.66422], [37.01647, 36.69512], [37.04619, 36.71101], [37.04399, 36.73483], [36.99886, 36.74012], [36.99557, 36.75997], [36.66727, 36.82901], [36.61581, 36.74629], [36.62681, 36.71189], [36.57398, 36.65186], [36.58829, 36.58295], [36.54206, 36.49539], [36.6081, 36.33772], [36.65653, 36.33861], [36.68672, 36.23677], [36.6125, 36.22592], [36.50463, 36.2419], [36.4617, 36.20461], [36.39206, 36.22088], [36.37474, 36.01163], [36.33956, 35.98687], [36.30099, 36.00985], [36.28338, 36.00273], [36.29769, 35.96086], [36.27678, 35.94839], [36.25366, 35.96264], [36.19973, 35.95195], [36.17441, 35.92076], [36.1623, 35.80925], [36.14029, 35.81015], [36.13919, 35.83692], [36.11827, 35.85923], [35.99829, 35.88242], [36.01844, 35.92403], [36.00514, 35.94113], [35.98499, 35.94107], [35.931, 35.92109], [35.51152, 36.10954], [35.48515, 34.70851], [35.97386, 34.63322], [35.98718, 34.64977], [36.29165, 34.62991], [36.32399, 34.69334], [36.35135, 34.68516], [36.35384, 34.65447], [36.42941, 34.62505], [36.46003, 34.6378], [36.45299, 34.59438], [36.41429, 34.61175], [36.39846, 34.55672], [36.3369, 34.52629], [36.34745, 34.5002], [36.4442, 34.50165], [36.46179, 34.46541], [36.55853, 34.41609], [36.53039, 34.3798], [36.56556, 34.31881], [36.60778, 34.31009], [36.58667, 34.27667], [36.59195, 34.2316], [36.62537, 34.20251], [36.5128, 34.09916], [36.50576, 34.05982], [36.41078, 34.05253], [36.28589, 33.91981], [36.38263, 33.86579], [36.3967, 33.83365], [36.14517, 33.85118], [36.06778, 33.82927], [35.9341, 33.6596], [36.05723, 33.57904], [35.94465, 33.52774], [35.94816, 33.47886], [35.88668, 33.43183], [35.82577, 33.40479], [35.81324, 33.36354], [35.77477, 33.33609], [35.813, 33.3172], [35.77513, 33.27342], [35.81295, 33.24841], [35.81647, 33.2028], [35.83846, 33.19397], [35.84285, 33.16673], [35.81911, 33.1336], [35.81911, 33.11077], [35.84802, 33.1031], [35.87188, 32.98028], [35.89298, 32.9456], [35.87012, 32.91976], [35.84021, 32.8725], [35.83758, 32.82817], [35.78745, 32.77938], [35.75983, 32.74803], [35.88405, 32.71321], [35.93307, 32.71966], [35.96633, 32.66237], [36.02239, 32.65911], [36.08074, 32.51463], [36.20379, 32.52751], [36.20875, 32.49529], [36.23948, 32.50108], [36.40959, 32.37908], [36.83946, 32.31293], [38.79171, 33.37328], [40.64314, 34.31604], [40.97676, 34.39788], [41.12388, 34.65742], [41.2345, 34.80049], [41.21654, 35.1508], [41.26569, 35.42708], [41.38184, 35.62502], [41.37027, 35.84095], [41.2564, 36.06012], [41.28864, 36.35368], [41.40058, 36.52502], [41.81736, 36.58782], [42.36697, 37.0627], [42.35724, 37.10998], [42.32313, 37.17814], [42.34735, 37.22548], [42.2824, 37.2798], [42.26039, 37.27017], [42.23683, 37.2863]]]] } },
23303     { type: "Feature", properties: { iso1A2: "SZ", iso1A3: "SWZ", iso1N3: "748", wikidata: "Q1050", nameEn: "Eswatini", aliases: ["Swaziland"], groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["268"] }, geometry: { type: "MultiPolygon", coordinates: [[[[31.86881, -25.99973], [31.4175, -25.71886], [31.31237, -25.7431], [31.13073, -25.91558], [30.95819, -26.26303], [30.78927, -26.48271], [30.81101, -26.84722], [30.88826, -26.79622], [30.97757, -26.92706], [30.96088, -27.0245], [31.15027, -27.20151], [31.49834, -27.31549], [31.97592, -27.31675], [31.97463, -27.11057], [32.00893, -26.8096], [32.09664, -26.80721], [32.13315, -26.84345], [32.13409, -26.5317], [32.07352, -26.40185], [32.10435, -26.15656], [32.08599, -26.00978], [32.00916, -25.999], [31.974, -25.95387], [31.86881, -25.99973]]]] } },
23304     { type: "Feature", properties: { iso1A2: "TA", iso1A3: "TAA", wikidata: "Q220982", nameEn: "Tristan da Cunha", aliases: ["SH-TA"], country: "GB", groups: ["SH", "BOTS", "011", "202", "002", "UN"], isoStatus: "excRes", driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["290 8", "44 20"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-13.38232, -34.07258], [-16.67337, -41.9188], [-5.88482, -41.4829], [-13.38232, -34.07258]]]] } },
23305     { type: "Feature", properties: { iso1A2: "TC", iso1A3: "TCA", iso1N3: "796", wikidata: "Q18221", nameEn: "Turks and Caicos Islands", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 649"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.70065, 25.7637], [-72.98446, 20.4801], [-69.80718, 21.35956], [-71.70065, 25.7637]]]] } },
23306     { type: "Feature", properties: { iso1A2: "TD", iso1A3: "TCD", iso1N3: "148", wikidata: "Q657", nameEn: "Chad", groups: ["017", "202", "002", "UN"], callingCodes: ["235"] }, geometry: { type: "MultiPolygon", coordinates: [[[[23.99539, 19.49944], [15.99566, 23.49639], [14.99751, 23.00539], [15.19692, 21.99339], [15.20213, 21.49365], [15.28332, 21.44557], [15.62515, 20.95395], [15.57248, 20.92138], [15.55382, 20.86507], [15.56004, 20.79488], [15.59841, 20.74039], [15.6721, 20.70069], [15.99632, 20.35364], [15.75098, 19.93002], [15.6032, 18.77402], [15.50373, 16.89649], [14.37425, 15.72591], [13.86301, 15.04043], [13.78991, 14.87519], [13.809, 14.72915], [13.67878, 14.64013], [13.68573, 14.55276], [13.48259, 14.46704], [13.47559, 14.40881], [13.6302, 13.71094], [14.08251, 13.0797], [14.46881, 13.08259], [14.56101, 12.91036], [14.55058, 12.78256], [14.83314, 12.62963], [14.90827, 12.3269], [14.89019, 12.16593], [14.96952, 12.0925], [15.00146, 12.1223], [15.0349, 12.10698], [15.05786, 12.0608], [15.04808, 11.8731], [15.11579, 11.79313], [15.06595, 11.71126], [15.13149, 11.5537], [15.0585, 11.40481], [15.10021, 11.04101], [15.04957, 11.02347], [15.09127, 10.87431], [15.06737, 10.80921], [15.15532, 10.62846], [15.14936, 10.53915], [15.23724, 10.47764], [15.30874, 10.31063], [15.50535, 10.1098], [15.68761, 9.99344], [15.41408, 9.92876], [15.24618, 9.99246], [15.14043, 9.99246], [15.05999, 9.94845], [14.95722, 9.97926], [14.80082, 9.93818], [14.4673, 10.00264], [14.20411, 10.00055], [14.1317, 9.82413], [14.01793, 9.73169], [13.97544, 9.6365], [14.37094, 9.2954], [14.35707, 9.19611], [14.83566, 8.80557], [15.09484, 8.65982], [15.20426, 8.50892], [15.50743, 7.79302], [15.59272, 7.7696], [15.56964, 7.58936], [15.49743, 7.52179], [15.73118, 7.52006], [15.79942, 7.44149], [16.40703, 7.68809], [16.41583, 7.77971], [16.58315, 7.88657], [16.59415, 7.76444], [16.658, 7.75353], [16.6668, 7.67281], [16.8143, 7.53971], [17.67288, 7.98905], [17.93926, 7.95853], [18.02731, 8.01085], [18.6085, 8.05009], [18.64153, 8.08714], [18.62612, 8.14163], [18.67455, 8.22226], [18.79783, 8.25929], [19.11044, 8.68172], [18.86388, 8.87971], [19.06421, 9.00367], [20.36748, 9.11019], [20.82979, 9.44696], [21.26348, 9.97642], [21.34934, 9.95907], [21.52766, 10.2105], [21.63553, 10.217], [21.71479, 10.29932], [21.72139, 10.64136], [22.45889, 11.00246], [22.87758, 10.91915], [22.97249, 11.21955], [22.93124, 11.41645], [22.7997, 11.40424], [22.54907, 11.64372], [22.64092, 12.07485], [22.48369, 12.02766], [22.50548, 12.16769], [22.38873, 12.45514], [22.46345, 12.61925], [22.22684, 12.74682], [22.15679, 12.66634], [21.98711, 12.63292], [21.89371, 12.68001], [21.81432, 12.81362], [21.94819, 13.05637], [22.02914, 13.13976], [22.1599, 13.19281], [22.29689, 13.3731], [22.08674, 13.77863], [22.22995, 13.96754], [22.5553, 14.11704], [22.55997, 14.23024], [22.44944, 14.24986], [22.38562, 14.58907], [22.70474, 14.69149], [22.66115, 14.86308], [22.99584, 15.22989], [22.99584, 15.40105], [22.92579, 15.47007], [22.93201, 15.55107], [23.10792, 15.71297], [23.38812, 15.69649], [23.62785, 15.7804], [23.99997, 15.69575], [23.99539, 19.49944]]]] } },
23307     { type: "Feature", properties: { iso1A2: "TF", iso1A3: "ATF", iso1N3: "260", wikidata: "Q129003", nameEn: "French Southern Territories", country: "FR", groups: ["EU", "UN"] }, geometry: null },
23308     { type: "Feature", properties: { iso1A2: "TG", iso1A3: "TGO", iso1N3: "768", wikidata: "Q945", nameEn: "Togo", groups: ["011", "202", "002", "UN"], callingCodes: ["228"] }, geometry: { type: "MultiPolygon", coordinates: [[[[0.50388, 11.01011], [-0.13493, 11.14075], [-0.14462, 11.10811], [-0.05733, 11.08628], [-0.0275, 11.11202], [-514e-5, 11.10763], [342e-5, 11.08317], [0.02395, 11.06229], [0.03355, 10.9807], [-63e-4, 10.96417], [-908e-5, 10.91644], [-0.02685, 10.8783], [-0.0228, 10.81916], [-0.07183, 10.76794], [-0.07327, 10.71845], [-0.09141, 10.7147], [-0.05945, 10.63458], [0.12886, 10.53149], [0.18846, 10.4096], [0.29453, 10.41546], [0.33028, 10.30408], [0.39584, 10.31112], [0.35293, 10.09412], [0.41371, 10.06361], [0.41252, 10.02018], [0.36366, 10.03309], [0.32075, 9.72781], [0.34816, 9.71607], [0.34816, 9.66907], [0.32313, 9.6491], [0.28261, 9.69022], [0.26712, 9.66437], [0.29334, 9.59387], [0.36008, 9.6256], [0.38153, 9.58682], [0.23851, 9.57389], [0.2409, 9.52335], [0.30406, 9.521], [0.31241, 9.50337], [0.2254, 9.47869], [0.25758, 9.42696], [0.33148, 9.44812], [0.36485, 9.49749], [0.49118, 9.48339], [0.56388, 9.40697], [0.45424, 9.04581], [0.52455, 8.87746], [0.37319, 8.75262], [0.47211, 8.59945], [0.64731, 8.48866], [0.73432, 8.29529], [0.63897, 8.25873], [0.5913, 8.19622], [0.61156, 8.18324], [0.6056, 8.13959], [0.58891, 8.12779], [0.62943, 7.85751], [0.58295, 7.62368], [0.51979, 7.58706], [0.52455, 7.45354], [0.57223, 7.39326], [0.62943, 7.41099], [0.65327, 7.31643], [0.59606, 7.01252], [0.52217, 6.9723], [0.52098, 6.94391], [0.56508, 6.92971], [0.52853, 6.82921], [0.57406, 6.80348], [0.58176, 6.76049], [0.6497, 6.73682], [0.63659, 6.63857], [0.74862, 6.56517], [0.71048, 6.53083], [0.89283, 6.33779], [0.99652, 6.33779], [1.03108, 6.24064], [1.05969, 6.22998], [1.09187, 6.17074], [1.19966, 6.17069], [1.19771, 6.11522], [1.27574, 5.93551], [1.67336, 6.02702], [1.62913, 6.24075], [1.79826, 6.28221], [1.76906, 6.43189], [1.58105, 6.68619], [1.61812, 6.74843], [1.55877, 6.99737], [1.64249, 6.99562], [1.61838, 9.0527], [1.5649, 9.16941], [1.41746, 9.3226], [1.33675, 9.54765], [1.36624, 9.5951], [1.35507, 9.99525], [0.77666, 10.37665], [0.80358, 10.71459], [0.8804, 10.803], [0.91245, 10.99597], [0.66104, 10.99964], [0.4958, 10.93269], [0.50521, 10.98035], [0.48852, 10.98561], [0.50388, 11.01011]]]] } },
23309     { type: "Feature", properties: { iso1A2: "TH", iso1A3: "THA", iso1N3: "764", wikidata: "Q869", nameEn: "Thailand", groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["66"] }, geometry: { type: "MultiPolygon", coordinates: [[[[100.08404, 20.36626], [99.95721, 20.46301], [99.91616, 20.44986], [99.90499, 20.4487], [99.89692, 20.44789], [99.89301, 20.44311], [99.89168, 20.44548], [99.88451, 20.44596], [99.88211, 20.44488], [99.86383, 20.44371], [99.81096, 20.33687], [99.68255, 20.32077], [99.46008, 20.39673], [99.46077, 20.36198], [99.5569, 20.20676], [99.52943, 20.14811], [99.416, 20.08614], [99.20328, 20.12877], [99.0735, 20.10298], [98.98679, 19.7419], [98.83661, 19.80931], [98.56065, 19.67807], [98.51182, 19.71303], [98.24884, 19.67876], [98.13829, 19.78541], [98.03314, 19.80941], [98.04364, 19.65755], [97.84715, 19.55782], [97.88423, 19.5041], [97.78769, 19.39429], [97.84186, 19.29526], [97.78606, 19.26769], [97.84024, 19.22217], [97.83479, 19.09972], [97.73797, 19.04261], [97.73654, 18.9812], [97.66487, 18.9371], [97.73836, 18.88478], [97.76752, 18.58097], [97.5258, 18.4939], [97.36444, 18.57138], [97.34522, 18.54596], [97.50383, 18.26844], [97.56219, 18.33885], [97.64116, 18.29778], [97.60841, 18.23846], [97.73723, 17.97912], [97.66794, 17.88005], [97.76407, 17.71595], [97.91829, 17.54504], [98.11185, 17.36829], [98.10439, 17.33847], [98.34566, 17.04822], [98.39441, 17.06266], [98.52624, 16.89979], [98.49603, 16.8446], [98.53833, 16.81934], [98.46994, 16.73613], [98.50253, 16.7139], [98.49713, 16.69022], [98.51043, 16.70107], [98.51579, 16.69433], [98.51472, 16.68521], [98.51833, 16.676], [98.51113, 16.64503], [98.5695, 16.62826], [98.57912, 16.55983], [98.63817, 16.47424], [98.68074, 16.27068], [98.84485, 16.42354], [98.92656, 16.36425], [98.8376, 16.11706], [98.69585, 16.13353], [98.57019, 16.04578], [98.59853, 15.87197], [98.541, 15.65406], [98.58598, 15.46821], [98.56027, 15.33471], [98.4866, 15.39154], [98.39351, 15.34177], [98.41906, 15.27103], [98.40522, 15.25268], [98.30446, 15.30667], [98.22, 15.21327], [98.18821, 15.13125], [98.24874, 14.83013], [98.56762, 14.37701], [98.97356, 14.04868], [99.16695, 13.72621], [99.20617, 13.20575], [99.12225, 13.19847], [99.10646, 13.05804], [99.18748, 12.9898], [99.18905, 12.84799], [99.29254, 12.68921], [99.409, 12.60603], [99.47519, 12.1353], [99.56445, 12.14805], [99.53424, 12.02317], [99.64891, 11.82699], [99.64108, 11.78948], [99.5672, 11.62732], [99.47598, 11.62434], [99.39485, 11.3925], [99.31573, 11.32081], [99.32756, 11.28545], [99.06938, 10.94857], [99.02337, 10.97217], [98.99701, 10.92962], [99.0069, 10.85485], [98.86819, 10.78336], [98.78511, 10.68351], [98.77275, 10.62548], [98.81944, 10.52761], [98.7391, 10.31488], [98.55174, 9.92804], [98.52291, 9.92389], [98.47298, 9.95782], [98.33094, 9.91973], [98.12555, 9.44056], [97.63455, 9.60854], [97.19814, 8.18901], [99.31854, 5.99868], [99.50117, 6.44501], [99.91873, 6.50233], [100.0756, 6.4045], [100.12, 6.42105], [100.19511, 6.72559], [100.29651, 6.68439], [100.30828, 6.66462], [100.31618, 6.66781], [100.31884, 6.66423], [100.32671, 6.66526], [100.32607, 6.65933], [100.31929, 6.65413], [100.35413, 6.54932], [100.41152, 6.52299], [100.41791, 6.5189], [100.42351, 6.51762], [100.43027, 6.52389], [100.66986, 6.45086], [100.74361, 6.50811], [100.74822, 6.46231], [100.81045, 6.45086], [100.85884, 6.24929], [101.10313, 6.25617], [101.12618, 6.19431], [101.06165, 6.14161], [101.12388, 6.11411], [101.087, 5.9193], [101.02708, 5.91013], [100.98815, 5.79464], [101.14062, 5.61613], [101.25755, 5.71065], [101.25524, 5.78633], [101.58019, 5.93534], [101.69773, 5.75881], [101.75074, 5.79091], [101.80144, 5.74505], [101.89188, 5.8386], [101.91776, 5.84269], [101.92819, 5.85511], [101.94712, 5.98421], [101.9714, 6.00575], [101.97114, 6.01992], [101.99209, 6.04075], [102.01835, 6.05407], [102.09182, 6.14161], [102.07732, 6.193], [102.08127, 6.22679], [102.09086, 6.23546], [102.46318, 7.22462], [102.47649, 9.66162], [102.52395, 11.25257], [102.91449, 11.65512], [102.90973, 11.75613], [102.83957, 11.8519], [102.78427, 11.98746], [102.77026, 12.06815], [102.70176, 12.1686], [102.73134, 12.37091], [102.78116, 12.40284], [102.7796, 12.43781], [102.57567, 12.65358], [102.51963, 12.66117], [102.4994, 12.71736], [102.53053, 12.77506], [102.49335, 12.92711], [102.48694, 12.97537], [102.52275, 12.99813], [102.46011, 13.08057], [102.43422, 13.09061], [102.36146, 13.26006], [102.36001, 13.31142], [102.34611, 13.35618], [102.35692, 13.38274], [102.35563, 13.47307], [102.361, 13.50551], [102.33828, 13.55613], [102.36859, 13.57488], [102.44601, 13.5637], [102.5358, 13.56933], [102.57573, 13.60461], [102.62483, 13.60883], [102.58635, 13.6286], [102.5481, 13.6589], [102.56848, 13.69366], [102.72727, 13.77806], [102.77864, 13.93374], [102.91251, 14.01531], [102.93275, 14.19044], [103.16469, 14.33075], [103.39353, 14.35639], [103.53518, 14.42575], [103.71109, 14.4348], [103.70175, 14.38052], [103.93836, 14.3398], [104.27616, 14.39861], [104.55014, 14.36091], [104.69335, 14.42726], [104.97667, 14.38806], [105.02804, 14.23722], [105.08408, 14.20402], [105.14012, 14.23873], [105.17748, 14.34432], [105.20894, 14.34967], [105.43783, 14.43865], [105.53864, 14.55731], [105.5121, 14.80802], [105.61162, 15.00037], [105.46661, 15.13132], [105.58043, 15.32724], [105.50662, 15.32054], [105.4692, 15.33709], [105.47635, 15.3796], [105.58191, 15.41031], [105.60446, 15.53301], [105.61756, 15.68792], [105.46573, 15.74742], [105.42285, 15.76971], [105.37959, 15.84074], [105.34115, 15.92737], [105.38508, 15.987], [105.42001, 16.00657], [105.06204, 16.09792], [105.00262, 16.25627], [104.88057, 16.37311], [104.73349, 16.565], [104.76099, 16.69302], [104.7397, 16.81005], [104.76442, 16.84752], [104.7373, 16.91125], [104.73712, 17.01404], [104.80716, 17.19025], [104.80061, 17.39367], [104.69867, 17.53038], [104.45404, 17.66788], [104.35432, 17.82871], [104.2757, 17.86139], [104.21776, 17.99335], [104.10927, 18.10826], [104.06533, 18.21656], [103.97725, 18.33631], [103.93916, 18.33914], [103.85642, 18.28666], [103.82449, 18.33979], [103.699, 18.34125], [103.60957, 18.40528], [103.47773, 18.42841], [103.41044, 18.4486], [103.30977, 18.4341], [103.24779, 18.37807], [103.23818, 18.34875], [103.29757, 18.30475], [103.17093, 18.2618], [103.14994, 18.23172], [103.1493, 18.17799], [103.07343, 18.12351], [103.07823, 18.03833], [103.0566, 18.00144], [103.01998, 17.97095], [102.9912, 17.9949], [102.95812, 18.0054], [102.86323, 17.97531], [102.81988, 17.94233], [102.79044, 17.93612], [102.75954, 17.89561], [102.68538, 17.86653], [102.67543, 17.84529], [102.69946, 17.81686], [102.68194, 17.80151], [102.59485, 17.83537], [102.5896, 17.84889], [102.61432, 17.92273], [102.60971, 17.95411], [102.59234, 17.96127], [102.45523, 17.97106], [102.11359, 18.21532], [101.88485, 18.02474], [101.78087, 18.07559], [101.72294, 17.92867], [101.44667, 17.7392], [101.15108, 17.47586], [100.96541, 17.57926], [101.02185, 17.87637], [101.1793, 18.0544], [101.19118, 18.2125], [101.15108, 18.25624], [101.18227, 18.34367], [101.06047, 18.43247], [101.27585, 18.68875], [101.22832, 18.73377], [101.25803, 18.89545], [101.35606, 19.04716], [101.261, 19.12717], [101.24911, 19.33334], [101.20604, 19.35296], [101.21347, 19.46223], [101.26991, 19.48324], [101.26545, 19.59242], [101.08928, 19.59748], [100.90302, 19.61901], [100.77231, 19.48324], [100.64606, 19.55884], [100.58219, 19.49164], [100.49604, 19.53504], [100.398, 19.75047], [100.5094, 19.87904], [100.58808, 20.15791], [100.55218, 20.17741], [100.51052, 20.14928], [100.47567, 20.19133], [100.4537, 20.19971], [100.44992, 20.23644], [100.41473, 20.25625], [100.37439, 20.35156], [100.33383, 20.4028], [100.25769, 20.3992], [100.22076, 20.31598], [100.16668, 20.2986], [100.1712, 20.24324], [100.11785, 20.24787], [100.09337, 20.26293], [100.09999, 20.31614], [100.08404, 20.36626]]]] } },
23310     { type: "Feature", properties: { iso1A2: "TJ", iso1A3: "TJK", iso1N3: "762", wikidata: "Q863", nameEn: "Tajikistan", groups: ["143", "142", "UN"], callingCodes: ["992"] }, geometry: { type: "MultiPolygon", coordinates: [[[[70.45251, 41.04438], [70.38028, 41.02014], [70.36655, 40.90296], [69.69434, 40.62615], [69.59441, 40.70181], [69.53021, 40.77621], [69.38327, 40.7918], [69.32834, 40.70233], [69.3455, 40.57988], [69.2643, 40.57506], [69.21063, 40.54469], [69.27066, 40.49274], [69.28525, 40.41894], [69.30774, 40.36102], [69.33794, 40.34819], [69.32833, 40.29794], [69.30808, 40.2821], [69.24817, 40.30357], [69.25229, 40.26362], [69.30104, 40.24502], [69.30448, 40.18774], [69.2074, 40.21488], [69.15659, 40.2162], [69.04544, 40.22904], [68.85832, 40.20885], [68.84357, 40.18604], [68.79276, 40.17555], [68.77902, 40.20492], [68.5332, 40.14826], [68.52771, 40.11676], [68.62796, 40.07789], [69.01523, 40.15771], [69.01935, 40.11466], [68.96579, 40.06949], [68.84906, 40.04952], [68.93695, 39.91167], [68.88889, 39.87163], [68.63071, 39.85265], [68.61972, 39.68905], [68.54166, 39.53929], [68.12053, 39.56317], [67.70992, 39.66156], [67.62889, 39.60234], [67.44899, 39.57799], [67.46547, 39.53564], [67.39681, 39.52505], [67.46822, 39.46146], [67.45998, 39.315], [67.36522, 39.31287], [67.33226, 39.23739], [67.67833, 39.14479], [67.68915, 39.00775], [68.09704, 39.02589], [68.19743, 38.85985], [68.06948, 38.82115], [68.12877, 38.73677], [68.05598, 38.71641], [68.0807, 38.64136], [68.05873, 38.56087], [68.11366, 38.47169], [68.06274, 38.39435], [68.13289, 38.40822], [68.40343, 38.19484], [68.27159, 37.91477], [68.12635, 37.93], [67.81566, 37.43107], [67.8474, 37.31594], [67.78329, 37.1834], [67.7803, 37.08978], [67.87917, 37.0591], [68.02194, 36.91923], [68.18542, 37.02074], [68.27605, 37.00977], [68.29253, 37.10621], [68.41201, 37.10402], [68.41888, 37.13906], [68.61851, 37.19815], [68.6798, 37.27906], [68.81438, 37.23862], [68.80889, 37.32494], [68.91189, 37.26704], [68.88168, 37.33368], [68.96407, 37.32603], [69.03274, 37.25174], [69.25152, 37.09426], [69.39529, 37.16752], [69.45022, 37.23315], [69.36645, 37.40462], [69.44954, 37.4869], [69.51888, 37.5844], [69.80041, 37.5746], [69.84435, 37.60616], [69.93362, 37.61378], [69.95971, 37.5659], [70.15015, 37.52519], [70.28243, 37.66706], [70.27694, 37.81258], [70.1863, 37.84296], [70.17206, 37.93276], [70.4898, 38.12546], [70.54673, 38.24541], [70.60407, 38.28046], [70.61526, 38.34774], [70.64966, 38.34999], [70.69189, 38.37031], [70.6761, 38.39144], [70.67438, 38.40597], [70.69807, 38.41861], [70.72485, 38.4131], [70.75455, 38.4252], [70.77132, 38.45548], [70.78581, 38.45502], [70.78702, 38.45031], [70.79766, 38.44944], [70.80521, 38.44447], [70.81697, 38.44507], [70.82538, 38.45394], [70.84376, 38.44688], [70.88719, 38.46826], [70.92728, 38.43021], [70.98693, 38.48862], [71.03545, 38.44779], [71.0556, 38.40176], [71.09542, 38.42517], [71.10592, 38.42077], [71.10957, 38.40671], [71.1451, 38.40106], [71.21291, 38.32797], [71.33114, 38.30339], [71.33869, 38.27335], [71.37803, 38.25641], [71.36444, 38.15358], [71.29878, 38.04429], [71.28922, 38.01272], [71.27622, 37.99946], [71.27278, 37.96496], [71.24969, 37.93031], [71.2809, 37.91995], [71.296, 37.93403], [71.32871, 37.88564], [71.51565, 37.95349], [71.58843, 37.92425], [71.59255, 37.79956], [71.55752, 37.78677], [71.54324, 37.77104], [71.53053, 37.76534], [71.55234, 37.73209], [71.54186, 37.69691], [71.51972, 37.61945], [71.5065, 37.60912], [71.49693, 37.53527], [71.50616, 37.50733], [71.5256, 37.47971], [71.49612, 37.4279], [71.47685, 37.40281], [71.4862, 37.33405], [71.49821, 37.31975], [71.50674, 37.31502], [71.48536, 37.26017], [71.4824, 37.24921], [71.48339, 37.23937], [71.47386, 37.2269], [71.4555, 37.21418], [71.4494, 37.18137], [71.44127, 37.11856], [71.43097, 37.05855], [71.45578, 37.03094], [71.46923, 36.99925], [71.48481, 36.93218], [71.51502, 36.89128], [71.57195, 36.74943], [71.67083, 36.67346], [71.83229, 36.68084], [72.31676, 36.98115], [72.54095, 37.00007], [72.66381, 37.02014], [72.79693, 37.22222], [73.06884, 37.31729], [73.29633, 37.46495], [73.77197, 37.4417], [73.76647, 37.33913], [73.61129, 37.27469], [73.64974, 37.23643], [73.82552, 37.22659], [73.8564, 37.26158], [74.20308, 37.34208], [74.23339, 37.41116], [74.41055, 37.3948], [74.56161, 37.37734], [74.68383, 37.3948], [74.8294, 37.3435], [74.88887, 37.23275], [75.12328, 37.31839], [75.09719, 37.37297], [75.15899, 37.41443], [75.06011, 37.52779], [74.94338, 37.55501], [74.8912, 37.67576], [75.00935, 37.77486], [74.92416, 37.83428], [74.9063, 38.03033], [74.82665, 38.07359], [74.80331, 38.19889], [74.69894, 38.22155], [74.69619, 38.42947], [74.51217, 38.47034], [74.17022, 38.65504], [73.97933, 38.52945], [73.79806, 38.61106], [73.80656, 38.66449], [73.7033, 38.84782], [73.7445, 38.93867], [73.82964, 38.91517], [73.81728, 39.04007], [73.75823, 39.023], [73.60638, 39.24534], [73.54572, 39.27567], [73.55396, 39.3543], [73.5004, 39.38402], [73.59241, 39.40843], [73.59831, 39.46425], [73.45096, 39.46677], [73.31912, 39.38615], [73.18454, 39.35536], [72.85934, 39.35116], [72.62027, 39.39696], [72.33173, 39.33093], [72.23834, 39.17248], [72.17242, 39.2661], [72.09689, 39.26823], [72.04059, 39.36704], [71.90601, 39.27674], [71.79202, 39.27355], [71.7522, 39.32031], [71.80164, 39.40631], [71.76816, 39.45456], [71.62688, 39.44056], [71.5517, 39.45722], [71.55856, 39.57588], [71.49814, 39.61397], [71.08752, 39.50704], [71.06418, 39.41586], [70.7854, 39.38933], [70.64087, 39.58792], [70.44757, 39.60128], [70.2869, 39.53141], [70.11111, 39.58223], [69.87491, 39.53882], [69.68677, 39.59281], [69.3594, 39.52516], [69.26938, 39.8127], [69.35649, 40.01994], [69.43134, 39.98431], [69.43557, 39.92877], [69.53615, 39.93991], [69.5057, 40.03277], [69.53855, 40.0887], [69.53794, 40.11833], [69.55555, 40.12296], [69.57615, 40.10524], [69.64704, 40.12165], [69.67001, 40.10639], [70.01283, 40.23288], [70.58297, 40.00891], [70.57384, 39.99394], [70.47557, 39.93216], [70.55033, 39.96619], [70.58912, 39.95211], [70.65946, 39.9878], [70.65827, 40.0981], [70.7928, 40.12797], [70.80495, 40.16813], [70.9818, 40.22392], [70.8607, 40.217], [70.62342, 40.17396], [70.56394, 40.26421], [70.57149, 40.3442], [70.37511, 40.38605], [70.32626, 40.45174], [70.49871, 40.52503], [70.80009, 40.72825], [70.45251, 41.04438]]], [[[70.68112, 40.90612], [70.6158, 40.97661], [70.56077, 41.00642], [70.54223, 40.98787], [70.57501, 40.98941], [70.6721, 40.90555], [70.68112, 40.90612]]], [[[70.74189, 39.86319], [70.53651, 39.89155], [70.52631, 39.86989], [70.54998, 39.85137], [70.59667, 39.83542], [70.63105, 39.77923], [70.74189, 39.86319]]]] } },
23311     { type: "Feature", properties: { iso1A2: "TK", iso1A3: "TKL", iso1N3: "772", wikidata: "Q36823", nameEn: "Tokelau", country: "NZ", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["690"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-168.251, -9.44289], [-174.18635, -7.80441], [-174.17993, -10.13616], [-168.251, -9.44289]]]] } },
23312     { type: "Feature", properties: { iso1A2: "TL", iso1A3: "TLS", iso1N3: "626", wikidata: "Q574", nameEn: "East Timor", aliases: ["Timor-Leste", "TP"], groups: ["035", "142", "UN"], driveSide: "left", callingCodes: ["670"] }, geometry: { type: "MultiPolygon", coordinates: [[[[124.46701, -9.13002], [124.94011, -8.85617], [124.97742, -9.08128], [125.11764, -8.96359], [125.18632, -9.03142], [125.18907, -9.16434], [125.09434, -9.19669], [125.04044, -9.17093], [124.97892, -9.19281], [125.09025, -9.46406], [125.68138, -9.85176], [127.55165, -9.05052], [127.42116, -8.22471], [125.87691, -8.31789], [125.58506, -7.95311], [124.92337, -8.75859], [124.33472, -9.11416], [124.04628, -9.22671], [124.04286, -9.34243], [124.10539, -9.41206], [124.14517, -9.42324], [124.21247, -9.36904], [124.28115, -9.42189], [124.28115, -9.50453], [124.3535, -9.48493], [124.35258, -9.43002], [124.38554, -9.3582], [124.45971, -9.30263], [124.46701, -9.13002]]]] } },
23313     { type: "Feature", properties: { iso1A2: "TM", iso1A3: "TKM", iso1N3: "795", wikidata: "Q874", nameEn: "Turkmenistan", groups: ["143", "142", "UN"], callingCodes: ["993"] }, geometry: { type: "MultiPolygon", coordinates: [[[[60.5078, 41.21694], [60.06581, 41.4363], [60.18117, 41.60082], [60.06032, 41.76287], [60.08504, 41.80997], [60.33223, 41.75058], [59.95046, 41.97966], [60.0356, 42.01028], [60.04659, 42.08982], [59.96419, 42.1428], [60.00539, 42.212], [59.94633, 42.27655], [59.4341, 42.29738], [59.2955, 42.37064], [59.17317, 42.52248], [58.93422, 42.5407], [58.6266, 42.79314], [58.57991, 42.64988], [58.27504, 42.69632], [58.14321, 42.62159], [58.29427, 42.56497], [58.51674, 42.30348], [58.40688, 42.29535], [58.3492, 42.43335], [57.99214, 42.50021], [57.90975, 42.4374], [57.92897, 42.24047], [57.84932, 42.18555], [57.6296, 42.16519], [57.30275, 42.14076], [57.03633, 41.92043], [56.96218, 41.80383], [57.03359, 41.41777], [57.13796, 41.36625], [57.03423, 41.25435], [56.00314, 41.32584], [55.45471, 41.25609], [54.95182, 41.92424], [54.20635, 42.38477], [52.97575, 42.1308], [52.47884, 41.78034], [52.26048, 41.69249], [51.7708, 40.29239], [53.89734, 37.3464], [54.24565, 37.32047], [54.36211, 37.34912], [54.58664, 37.45809], [54.67247, 37.43532], [54.77822, 37.51597], [54.81804, 37.61285], [54.77684, 37.62264], [54.851, 37.75739], [55.13412, 37.94705], [55.44152, 38.08564], [55.76561, 38.12238], [55.97847, 38.08024], [56.33278, 38.08132], [56.32454, 38.18502], [56.43303, 38.26054], [56.62255, 38.24005], [56.73928, 38.27887], [57.03453, 38.18717], [57.21169, 38.28965], [57.37236, 38.09321], [57.35042, 37.98546], [57.79534, 37.89299], [58.21399, 37.77281], [58.22999, 37.6856], [58.39959, 37.63134], [58.47786, 37.6433], [58.5479, 37.70526], [58.6921, 37.64548], [58.9338, 37.67374], [59.22905, 37.51161], [59.33507, 37.53146], [59.39797, 37.47892], [59.39385, 37.34257], [59.55178, 37.13594], [59.74678, 37.12499], [60.00768, 37.04102], [60.34767, 36.63214], [61.14516, 36.64644], [61.18187, 36.55348], [61.1393, 36.38782], [61.22719, 36.12759], [61.12007, 35.95992], [61.22444, 35.92879], [61.26152, 35.80749], [61.22719, 35.67038], [61.27371, 35.61482], [61.58742, 35.43803], [61.77693, 35.41341], [61.97743, 35.4604], [62.05709, 35.43803], [62.15871, 35.33278], [62.29191, 35.25964], [62.29878, 35.13312], [62.48006, 35.28796], [62.62288, 35.22067], [62.74098, 35.25432], [62.90853, 35.37086], [63.0898, 35.43131], [63.12276, 35.53196], [63.10079, 35.63024], [63.23262, 35.67487], [63.10318, 35.81782], [63.12276, 35.86208], [63.29579, 35.85985], [63.53475, 35.90881], [63.56496, 35.95106], [63.98519, 36.03773], [64.05385, 36.10433], [64.43288, 36.24401], [64.57295, 36.34362], [64.62514, 36.44311], [64.61141, 36.6351], [64.97945, 37.21913], [65.51778, 37.23881], [65.64263, 37.34388], [65.64137, 37.45061], [65.72274, 37.55438], [66.30993, 37.32409], [66.55743, 37.35409], [66.52303, 37.39827], [66.65761, 37.45497], [66.52852, 37.58568], [66.53676, 37.80084], [66.67684, 37.96776], [66.56697, 38.0435], [66.41042, 38.02403], [66.24013, 38.16238], [65.83913, 38.25733], [65.55873, 38.29052], [64.32576, 38.98691], [64.19086, 38.95561], [63.70778, 39.22349], [63.6913, 39.27666], [62.43337, 39.98528], [62.34273, 40.43206], [62.11751, 40.58242], [61.87856, 41.12257], [61.4446, 41.29407], [61.39732, 41.19873], [61.33199, 41.14946], [61.22212, 41.14946], [61.03261, 41.25691], [60.5078, 41.21694]]]] } },
23314     { type: "Feature", properties: { iso1A2: "TN", iso1A3: "TUN", iso1N3: "788", wikidata: "Q948", nameEn: "Tunisia", groups: ["015", "002", "UN"], callingCodes: ["216"] }, geometry: { type: "MultiPolygon", coordinates: [[[[11.2718, 37.6713], [7.89009, 38.19924], [8.59123, 37.14286], [8.64044, 36.9401], [8.62972, 36.86499], [8.67706, 36.8364], [8.57613, 36.78062], [8.46537, 36.7706], [8.47609, 36.66607], [8.16167, 36.48817], [8.18936, 36.44939], [8.40731, 36.42208], [8.2626, 35.91733], [8.26472, 35.73669], [8.35371, 35.66373], [8.36086, 35.47774], [8.30329, 35.29884], [8.47318, 35.23376], [8.3555, 35.10007], [8.30727, 34.95378], [8.25189, 34.92009], [8.29655, 34.72798], [8.20482, 34.57575], [7.86264, 34.3987], [7.81242, 34.21841], [7.74207, 34.16492], [7.66174, 34.20167], [7.52851, 34.06493], [7.54088, 33.7726], [7.73687, 33.42114], [7.83028, 33.18851], [8.11433, 33.10175], [8.1179, 33.05086], [8.31895, 32.83483], [8.35999, 32.50101], [9.07483, 32.07865], [9.55544, 30.23971], [9.76848, 30.34366], [9.88152, 30.34074], [10.29516, 30.90337], [10.12239, 31.42098], [10.31364, 31.72648], [10.48497, 31.72956], [10.62788, 31.96629], [10.7315, 31.97235], [11.04234, 32.2145], [11.53898, 32.4138], [11.57828, 32.48013], [11.46037, 32.6307], [11.51549, 33.09826], [11.55852, 33.1409], [11.58941, 33.36891], [11.2718, 37.6713]]]] } },
23315     { type: "Feature", properties: { iso1A2: "TO", iso1A3: "TON", iso1N3: "776", wikidata: "Q678", nameEn: "Tonga", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["676"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-176.74538, -22.89767], [-180, -22.90585], [-180, -24.21376], [-173.10761, -24.19665], [-173.13438, -14.94228], [-176.76826, -14.95183], [-176.74538, -22.89767]]]] } },
23316     { type: "Feature", properties: { iso1A2: "TR", iso1A3: "TUR", iso1N3: "792", wikidata: "Q43", nameEn: "Turkey", groups: ["145", "142", "UN"], callingCodes: ["90"] }, geometry: { type: "MultiPolygon", coordinates: [[[[41.54366, 41.52185], [40.89217, 41.72528], [34.8305, 42.4581], [28.32297, 41.98371], [28.02971, 41.98066], [27.91479, 41.97902], [27.83492, 41.99709], [27.81235, 41.94803], [27.69949, 41.97515], [27.55191, 41.90928], [27.52379, 41.93756], [27.45478, 41.96591], [27.27411, 42.10409], [27.22376, 42.10152], [27.19251, 42.06028], [27.08486, 42.08735], [27.03277, 42.0809], [26.95638, 42.00741], [26.79143, 41.97386], [26.62996, 41.97644], [26.56051, 41.92995], [26.57961, 41.90024], [26.53968, 41.82653], [26.36952, 41.82265], [26.33589, 41.76802], [26.32952, 41.73637], [26.35957, 41.71149], [26.47958, 41.67037], [26.5209, 41.62592], [26.59196, 41.60491], [26.59742, 41.48058], [26.61767, 41.42281], [26.62997, 41.34613], [26.5837, 41.32131], [26.5209, 41.33993], [26.39861, 41.25053], [26.32259, 41.24929], [26.31928, 41.07386], [26.3606, 41.02027], [26.33297, 40.98388], [26.35894, 40.94292], [26.32259, 40.94042], [26.28623, 40.93005], [26.29441, 40.89119], [26.26169, 40.9168], [26.20856, 40.86048], [26.21351, 40.83298], [26.15685, 40.80709], [26.12854, 40.77339], [26.12495, 40.74283], [26.08638, 40.73214], [26.0754, 40.72772], [26.03489, 40.73051], [25.94795, 40.72797], [26.04292, 40.3958], [25.61285, 40.17161], [25.94257, 39.39358], [26.43357, 39.43096], [26.70773, 39.0312], [26.61814, 38.81372], [26.21136, 38.65436], [26.32173, 38.48731], [26.24183, 38.44695], [26.21136, 38.17558], [27.05537, 37.9131], [27.16428, 37.72343], [26.99377, 37.69034], [26.95583, 37.64989], [27.14757, 37.32], [27.20312, 36.94571], [27.45627, 36.9008], [27.24613, 36.71622], [27.46117, 36.53789], [27.89482, 36.69898], [27.95037, 36.46155], [28.23708, 36.56812], [29.30783, 36.01033], [29.48192, 36.18377], [29.61002, 36.1731], [29.61805, 36.14179], [29.69611, 36.10365], [29.73302, 35.92555], [32.82353, 35.70297], [35.51152, 36.10954], [35.931, 35.92109], [35.98499, 35.94107], [36.00514, 35.94113], [36.01844, 35.92403], [35.99829, 35.88242], [36.11827, 35.85923], [36.13919, 35.83692], [36.14029, 35.81015], [36.1623, 35.80925], [36.17441, 35.92076], [36.19973, 35.95195], [36.25366, 35.96264], [36.27678, 35.94839], [36.29769, 35.96086], [36.28338, 36.00273], [36.30099, 36.00985], [36.33956, 35.98687], [36.37474, 36.01163], [36.39206, 36.22088], [36.4617, 36.20461], [36.50463, 36.2419], [36.6125, 36.22592], [36.68672, 36.23677], [36.65653, 36.33861], [36.6081, 36.33772], [36.54206, 36.49539], [36.58829, 36.58295], [36.57398, 36.65186], [36.62681, 36.71189], [36.61581, 36.74629], [36.66727, 36.82901], [36.99557, 36.75997], [36.99886, 36.74012], [37.04399, 36.73483], [37.04619, 36.71101], [37.01647, 36.69512], [37.02088, 36.66422], [37.08279, 36.63495], [37.10894, 36.6704], [37.16177, 36.66069], [37.21988, 36.6736], [37.47253, 36.63243], [37.49103, 36.66904], [37.68048, 36.75065], [37.81974, 36.76055], [38.21064, 36.91842], [38.38859, 36.90064], [38.55908, 36.84429], [38.74042, 36.70629], [39.03217, 36.70911], [39.21538, 36.66834], [39.81589, 36.75538], [40.69136, 37.0996], [40.90856, 37.13147], [41.21937, 37.07665], [41.515, 37.08084], [42.00894, 37.17209], [42.18225, 37.28569], [42.19301, 37.31323], [42.2112, 37.32491], [42.22257, 37.31395], [42.22381, 37.30238], [42.20454, 37.28715], [42.21548, 37.28026], [42.23683, 37.2863], [42.26039, 37.27017], [42.2824, 37.2798], [42.34735, 37.22548], [42.32313, 37.17814], [42.35724, 37.10998], [42.56725, 37.14878], [42.78887, 37.38615], [42.93705, 37.32015], [43.11403, 37.37436], [43.30083, 37.30629], [43.33508, 37.33105], [43.50787, 37.24436], [43.56702, 37.25675], [43.63085, 37.21957], [43.7009, 37.23692], [43.8052, 37.22825], [43.82699, 37.19477], [43.84878, 37.22205], [43.90949, 37.22453], [44.02002, 37.33229], [44.13521, 37.32486], [44.2613, 37.25055], [44.27998, 37.16501], [44.22239, 37.15756], [44.18503, 37.09551], [44.25975, 36.98119], [44.30645, 36.97373], [44.35937, 37.02843], [44.35315, 37.04955], [44.38117, 37.05825], [44.42631, 37.05825], [44.63179, 37.19229], [44.76698, 37.16162], [44.78319, 37.1431], [44.7868, 37.16644], [44.75986, 37.21549], [44.81021, 37.2915], [44.58449, 37.45018], [44.61401, 37.60165], [44.56887, 37.6429], [44.62096, 37.71985], [44.55498, 37.783], [44.45948, 37.77065], [44.3883, 37.85433], [44.22509, 37.88859], [44.42476, 38.25763], [44.50115, 38.33939], [44.44386, 38.38295], [44.38309, 38.36117], [44.3119, 38.37887], [44.3207, 38.49799], [44.32058, 38.62752], [44.28065, 38.6465], [44.26155, 38.71427], [44.30322, 38.81581], [44.18863, 38.93881], [44.20946, 39.13975], [44.1043, 39.19842], [44.03667, 39.39223], [44.22452, 39.4169], [44.29818, 39.378], [44.37921, 39.4131], [44.42832, 39.4131], [44.41849, 39.56659], [44.48111, 39.61579], [44.47298, 39.68788], [44.6137, 39.78393], [44.65422, 39.72163], [44.71806, 39.71124], [44.81043, 39.62677], [44.80977, 39.65768], [44.75779, 39.7148], [44.61845, 39.8281], [44.46635, 39.97733], [44.26973, 40.04866], [44.1778, 40.02845], [44.1057, 40.03555], [43.92307, 40.01787], [43.65688, 40.11199], [43.65221, 40.14889], [43.71136, 40.16673], [43.59928, 40.34019], [43.60862, 40.43267], [43.54791, 40.47413], [43.63664, 40.54159], [43.7425, 40.66805], [43.74872, 40.7365], [43.67712, 40.84846], [43.67712, 40.93084], [43.58683, 40.98961], [43.47319, 41.02251], [43.44984, 41.0988], [43.4717, 41.12611], [43.44973, 41.17666], [43.36118, 41.2028], [43.23096, 41.17536], [43.1945, 41.25242], [43.13373, 41.25503], [43.21707, 41.30331], [43.02956, 41.37891], [42.8785, 41.50516], [42.84899, 41.47265], [42.78995, 41.50126], [42.84471, 41.58912], [42.72794, 41.59714], [42.59202, 41.58183], [42.51772, 41.43606], [42.26387, 41.49346], [41.95134, 41.52466], [41.81939, 41.43621], [41.7124, 41.47417], [41.7148, 41.4932], [41.54366, 41.52185]]]] } },
23317     { type: "Feature", properties: { iso1A2: "TT", iso1A3: "TTO", iso1N3: "780", wikidata: "Q754", nameEn: "Trinidad and Tobago", groups: ["029", "003", "419", "019", "UN"], driveSide: "left", callingCodes: ["1 868"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-61.62505, 11.18974], [-62.08693, 10.04435], [-60.89962, 9.81445], [-60.07172, 11.77667], [-61.62505, 11.18974]]]] } },
23318     { type: "Feature", properties: { iso1A2: "TV", iso1A3: "TUV", iso1N3: "798", wikidata: "Q672", nameEn: "Tuvalu", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["688"] }, geometry: { type: "MultiPolygon", coordinates: [[[[174, -5], [174, -11.5], [179.99999, -11.5], [179.99999, -5], [174, -5]]]] } },
23319     { type: "Feature", properties: { iso1A2: "TW", iso1A3: "TWN", iso1N3: "158", wikidata: "Q865", nameEn: "Taiwan", aliases: ["RC"], groups: ["030", "142"], callingCodes: ["886"] }, geometry: { type: "MultiPolygon", coordinates: [[[[121.8109, 21.77688], [122.26612, 25.98197], [120.49232, 25.22863], [118.56434, 24.49266], [118.42453, 24.54644], [118.35291, 24.51645], [118.28244, 24.51231], [118.11703, 24.39734], [120.69238, 21.52331], [121.8109, 21.77688]]]] } },
23320     { type: "Feature", properties: { iso1A2: "TZ", iso1A3: "TZA", iso1N3: "834", wikidata: "Q924", nameEn: "Tanzania", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["255"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.80408, -0.99911], [30.76635, -0.9852], [30.70631, -1.01175], [30.64166, -1.06601], [30.47194, -1.0555], [30.45116, -1.10641], [30.50889, -1.16412], [30.57123, -1.33264], [30.71974, -1.43244], [30.84079, -1.64652], [30.80802, -1.91477], [30.89303, -2.08223], [30.83915, -2.35795], [30.54501, -2.41404], [30.41789, -2.66266], [30.52747, -2.65841], [30.40662, -2.86151], [30.4987, -2.9573], [30.57926, -2.89791], [30.6675, -2.98987], [30.83823, -2.97837], [30.84165, -3.25152], [30.45915, -3.56532], [30.22042, -4.01738], [30.03323, -4.26631], [29.88172, -4.35743], [29.82885, -4.36153], [29.77289, -4.41733], [29.75109, -4.45836], [29.63827, -4.44681], [29.43673, -4.44845], [29.52552, -6.2731], [30.2567, -7.14121], [30.79243, -8.27382], [31.00796, -8.58615], [31.37533, -8.60769], [31.57147, -8.70619], [31.57147, -8.81388], [31.71158, -8.91386], [31.81587, -8.88618], [31.94663, -8.93846], [31.94196, -9.02303], [31.98866, -9.07069], [32.08206, -9.04609], [32.16146, -9.05993], [32.25486, -9.13371], [32.43543, -9.11988], [32.49147, -9.14754], [32.53661, -9.24281], [32.75611, -9.28583], [32.76233, -9.31963], [32.95389, -9.40138], [32.99397, -9.36712], [33.14925, -9.49322], [33.31581, -9.48554], [33.48052, -9.62442], [33.76677, -9.58516], [33.93298, -9.71647], [33.9638, -9.62206], [33.95829, -9.54066], [34.03865, -9.49398], [34.54499, -10.0678], [34.51911, -10.12279], [34.57581, -10.56271], [34.65946, -10.6828], [34.67047, -10.93796], [34.61161, -11.01611], [34.63305, -11.11731], [34.79375, -11.32245], [34.91153, -11.39799], [34.96296, -11.57354], [35.63599, -11.55927], [35.82767, -11.41081], [36.19094, -11.57593], [36.19094, -11.70008], [36.62068, -11.72884], [36.80309, -11.56836], [37.3936, -11.68949], [37.76614, -11.53352], [37.8388, -11.3123], [37.93618, -11.26228], [38.21598, -11.27289], [38.47258, -11.4199], [38.88996, -11.16978], [39.24395, -11.17433], [39.58249, -10.96043], [40.00295, -10.80255], [40.44265, -10.4618], [40.74206, -10.25691], [40.14328, -4.64201], [39.62121, -4.68136], [39.44306, -4.93877], [39.21631, -4.67835], [37.81321, -3.69179], [37.75036, -3.54243], [37.63099, -3.50723], [37.5903, -3.42735], [37.71745, -3.304], [37.67199, -3.06222], [34.0824, -1.02264], [34.03084, -1.05101], [34.02286, -1.00779], [33.93107, -0.99298], [30.80408, -0.99911]]]] } },
23321     { type: "Feature", properties: { iso1A2: "UA", iso1A3: "UKR", iso1N3: "804", wikidata: "Q212", nameEn: "Ukraine", groups: ["151", "150", "UN"], callingCodes: ["380"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.57318, 46.10317], [33.61467, 46.13561], [33.63854, 46.14147], [33.61517, 46.22615], [33.646, 46.23028], [33.74047, 46.18555], [33.79715, 46.20482], [33.85234, 46.19863], [33.91549, 46.15938], [34.05272, 46.10838], [34.07311, 46.11769], [34.12929, 46.10494], [34.181, 46.06804], [34.25111, 46.0532], [34.33912, 46.06114], [34.41221, 46.00245], [34.44155, 45.95995], [34.48729, 45.94267], [34.52011, 45.95097], [34.55889, 45.99347], [34.60861, 45.99347], [34.66679, 45.97136], [34.75479, 45.90705], [34.80153, 45.90047], [34.79905, 45.81009], [34.96015, 45.75634], [35.23066, 45.79231], [37.62608, 46.82615], [38.12112, 46.86078], [38.3384, 46.98085], [38.22955, 47.12069], [38.23049, 47.2324], [38.32112, 47.2585], [38.33074, 47.30508], [38.22225, 47.30788], [38.28954, 47.39255], [38.28679, 47.53552], [38.35062, 47.61631], [38.76379, 47.69346], [38.79628, 47.81109], [38.87979, 47.87719], [39.73935, 47.82876], [39.82213, 47.96396], [39.77544, 48.04206], [39.88256, 48.04482], [39.83724, 48.06501], [39.94847, 48.22811], [40.00752, 48.22445], [39.99241, 48.31768], [39.97325, 48.31399], [39.9693, 48.29904], [39.95248, 48.29972], [39.91465, 48.26743], [39.90041, 48.3049], [39.84273, 48.30947], [39.84136, 48.33321], [39.94847, 48.35055], [39.88794, 48.44226], [39.86196, 48.46633], [39.84548, 48.57821], [39.79764, 48.58668], [39.67226, 48.59368], [39.71765, 48.68673], [39.73104, 48.7325], [39.79466, 48.83739], [39.97182, 48.79398], [40.08168, 48.87443], [40.03636, 48.91957], [39.98967, 48.86901], [39.78368, 48.91596], [39.74874, 48.98675], [39.72649, 48.9754], [39.71353, 48.98959], [39.6683, 48.99454], [39.6836, 49.05121], [39.93437, 49.05709], [40.01988, 49.1761], [40.22176, 49.25683], [40.18331, 49.34996], [40.14912, 49.37681], [40.1141, 49.38798], [40.03087, 49.45452], [40.03636, 49.52321], [40.16683, 49.56865], [40.13249, 49.61672], [39.84548, 49.56064], [39.65047, 49.61761], [39.59142, 49.73758], [39.44496, 49.76067], [39.27968, 49.75976], [39.1808, 49.88911], [38.9391, 49.79524], [38.90477, 49.86787], [38.73311, 49.90238], [38.68677, 50.00904], [38.65688, 49.97176], [38.35408, 50.00664], [38.32524, 50.08866], [38.18517, 50.08161], [38.21675, 49.98104], [38.02999, 49.90592], [38.02999, 49.94482], [37.90776, 50.04194], [37.79515, 50.08425], [37.75807, 50.07896], [37.61113, 50.21976], [37.62879, 50.24481], [37.62486, 50.29966], [37.47243, 50.36277], [37.48204, 50.46079], [37.08468, 50.34935], [36.91762, 50.34963], [36.69377, 50.26982], [36.64571, 50.218], [36.56655, 50.2413], [36.58371, 50.28563], [36.47817, 50.31457], [36.30101, 50.29088], [36.20763, 50.3943], [36.06893, 50.45205], [35.8926, 50.43829], [35.80388, 50.41356], [35.73659, 50.35489], [35.61711, 50.35707], [35.58003, 50.45117], [35.47463, 50.49247], [35.39464, 50.64751], [35.48116, 50.66405], [35.47704, 50.77274], [35.41367, 50.80227], [35.39307, 50.92145], [35.32598, 50.94524], [35.40837, 51.04119], [35.31774, 51.08434], [35.20375, 51.04723], [35.12685, 51.16191], [35.14058, 51.23162], [34.97304, 51.2342], [34.82472, 51.17483], [34.6874, 51.18], [34.6613, 51.25053], [34.38802, 51.2746], [34.31661, 51.23936], [34.23009, 51.26429], [34.33446, 51.363], [34.22048, 51.4187], [34.30562, 51.5205], [34.17599, 51.63253], [34.07765, 51.67065], [34.42922, 51.72852], [34.41136, 51.82793], [34.09413, 52.00835], [34.11199, 52.14087], [34.05239, 52.20132], [33.78789, 52.37204], [33.55718, 52.30324], [33.48027, 52.31499], [33.51323, 52.35779], [33.18913, 52.3754], [32.89937, 52.2461], [32.85405, 52.27888], [32.69475, 52.25535], [32.54781, 52.32423], [32.3528, 52.32842], [32.38988, 52.24946], [32.33083, 52.23685], [32.34044, 52.1434], [32.2777, 52.10266], [32.23331, 52.08085], [32.08813, 52.03319], [31.92159, 52.05144], [31.96141, 52.08015], [31.85018, 52.11305], [31.81722, 52.09955], [31.7822, 52.11406], [31.38326, 52.12991], [31.25142, 52.04131], [31.13332, 52.1004], [30.95589, 52.07775], [30.90897, 52.00699], [30.76443, 51.89739], [30.68804, 51.82806], [30.51946, 51.59649], [30.64992, 51.35014], [30.56203, 51.25655], [30.36153, 51.33984], [30.34642, 51.42555], [30.17888, 51.51025], [29.77376, 51.4461], [29.7408, 51.53417], [29.54372, 51.48372], [29.49773, 51.39814], [29.42357, 51.4187], [29.32881, 51.37843], [29.25191, 51.49828], [29.25603, 51.57089], [29.20659, 51.56918], [29.16402, 51.64679], [29.1187, 51.65872], [28.99098, 51.56833], [28.95528, 51.59222], [28.81795, 51.55552], [28.76027, 51.48802], [28.78224, 51.45294], [28.75615, 51.41442], [28.73143, 51.46236], [28.69161, 51.44695], [28.64429, 51.5664], [28.47051, 51.59734], [28.37592, 51.54505], [28.23452, 51.66988], [28.10658, 51.57857], [27.95827, 51.56065], [27.91844, 51.61952], [27.85253, 51.62293], [27.76052, 51.47604], [27.67125, 51.50854], [27.71932, 51.60672], [27.55727, 51.63486], [27.51058, 51.5854], [27.47212, 51.61184], [27.24828, 51.60161], [27.26613, 51.65957], [27.20948, 51.66713], [27.20602, 51.77291], [26.99422, 51.76933], [26.9489, 51.73788], [26.80043, 51.75777], [26.69759, 51.82284], [26.46962, 51.80501], [26.39367, 51.87315], [26.19084, 51.86781], [26.00408, 51.92967], [25.83217, 51.92587], [25.80574, 51.94556], [25.73673, 51.91973], [25.46163, 51.92205], [25.20228, 51.97143], [24.98784, 51.91273], [24.37123, 51.88222], [24.29021, 51.80841], [24.3163, 51.75063], [24.13075, 51.66979], [23.99907, 51.58369], [23.8741, 51.59734], [23.91118, 51.63316], [23.7766, 51.66809], [23.60906, 51.62122], [23.6736, 51.50255], [23.62751, 51.50512], [23.69905, 51.40871], [23.63858, 51.32182], [23.80678, 51.18405], [23.90376, 51.07697], [23.92217, 51.00836], [24.04576, 50.90196], [24.14524, 50.86128], [24.0952, 50.83262], [23.99254, 50.83847], [23.95925, 50.79271], [24.0595, 50.71625], [24.0996, 50.60752], [24.07048, 50.5071], [24.03668, 50.44507], [23.99563, 50.41289], [23.79445, 50.40481], [23.71382, 50.38248], [23.67635, 50.33385], [23.28221, 50.0957], [22.99329, 49.84249], [22.83179, 49.69875], [22.80261, 49.69098], [22.78304, 49.65543], [22.64534, 49.53094], [22.69444, 49.49378], [22.748, 49.32759], [22.72009, 49.20288], [22.86336, 49.10513], [22.89122, 49.00725], [22.56155, 49.08865], [22.54338, 49.01424], [22.48296, 48.99172], [22.42934, 48.92857], [22.34151, 48.68893], [22.21379, 48.6218], [22.16023, 48.56548], [22.14689, 48.4005], [22.2083, 48.42534], [22.38133, 48.23726], [22.49806, 48.25189], [22.59007, 48.15121], [22.58733, 48.10813], [22.66835, 48.09162], [22.73427, 48.12005], [22.81804, 48.11363], [22.87847, 48.04665], [22.84276, 47.98602], [22.89849, 47.95851], [22.94301, 47.96672], [22.92241, 48.02002], [23.0158, 47.99338], [23.08858, 48.00716], [23.1133, 48.08061], [23.15999, 48.12188], [23.27397, 48.08245], [23.33577, 48.0237], [23.4979, 47.96858], [23.52803, 48.01818], [23.5653, 48.00499], [23.63894, 48.00293], [23.66262, 47.98786], [23.75188, 47.99705], [23.80904, 47.98142], [23.8602, 47.9329], [23.89352, 47.94512], [23.94192, 47.94868], [23.96337, 47.96672], [23.98553, 47.96076], [24.00801, 47.968], [24.02999, 47.95087], [24.06466, 47.95317], [24.11281, 47.91487], [24.22566, 47.90231], [24.34926, 47.9244], [24.43578, 47.97131], [24.61994, 47.95062], [24.70632, 47.84428], [24.81893, 47.82031], [24.88896, 47.7234], [25.11144, 47.75203], [25.23778, 47.89403], [25.63878, 47.94924], [25.77723, 47.93919], [26.05901, 47.9897], [26.17711, 47.99246], [26.33504, 48.18418], [26.55202, 48.22445], [26.62823, 48.25804], [26.6839, 48.35828], [26.79239, 48.29071], [26.82809, 48.31629], [26.71274, 48.40388], [26.85556, 48.41095], [26.93384, 48.36558], [27.03821, 48.37653], [27.0231, 48.42485], [27.08078, 48.43214], [27.13434, 48.37288], [27.27855, 48.37534], [27.32159, 48.4434], [27.37604, 48.44398], [27.37741, 48.41026], [27.44333, 48.41209], [27.46942, 48.454], [27.5889, 48.49224], [27.59027, 48.46311], [27.6658, 48.44034], [27.74422, 48.45926], [27.79225, 48.44244], [27.81902, 48.41874], [27.87533, 48.4037], [27.88391, 48.36699], [27.95883, 48.32368], [28.04527, 48.32661], [28.09873, 48.3124], [28.07504, 48.23494], [28.17666, 48.25963], [28.19314, 48.20749], [28.2856, 48.23202], [28.32508, 48.23384], [28.35519, 48.24957], [28.36996, 48.20543], [28.34912, 48.1787], [28.30586, 48.1597], [28.30609, 48.14018], [28.34009, 48.13147], [28.38712, 48.17567], [28.43701, 48.15832], [28.42454, 48.12047], [28.48428, 48.0737], [28.53921, 48.17453], [28.69896, 48.13106], [28.85232, 48.12506], [28.8414, 48.03392], [28.9306, 47.96255], [29.1723, 47.99013], [29.19839, 47.89261], [29.27804, 47.88893], [29.20663, 47.80367], [29.27255, 47.79953], [29.22242, 47.73607], [29.22414, 47.60012], [29.11743, 47.55001], [29.18603, 47.43387], [29.3261, 47.44664], [29.39889, 47.30179], [29.47854, 47.30366], [29.48678, 47.36043], [29.5733, 47.36508], [29.59665, 47.25521], [29.54996, 47.24962], [29.57696, 47.13581], [29.49732, 47.12878], [29.53044, 47.07851], [29.61038, 47.09932], [29.62137, 47.05069], [29.57056, 46.94766], [29.72986, 46.92234], [29.75458, 46.8604], [29.87405, 46.88199], [29.98814, 46.82358], [29.94522, 46.80055], [29.9743, 46.75325], [29.94409, 46.56002], [29.88916, 46.54302], [30.02511, 46.45132], [30.16794, 46.40967], [30.09103, 46.38694], [29.94114, 46.40114], [29.88329, 46.35851], [29.74496, 46.45605], [29.66359, 46.4215], [29.6763, 46.36041], [29.5939, 46.35472], [29.49914, 46.45889], [29.35357, 46.49505], [29.24886, 46.37912], [29.23547, 46.55435], [29.02409, 46.49582], [29.01241, 46.46177], [28.9306, 46.45699], [29.004, 46.31495], [28.98478, 46.31803], [28.94953, 46.25852], [29.06656, 46.19716], [28.94643, 46.09176], [29.00613, 46.04962], [28.98004, 46.00385], [28.74383, 45.96664], [28.78503, 45.83475], [28.69852, 45.81753], [28.70401, 45.78019], [28.52823, 45.73803], [28.47879, 45.66994], [28.51587, 45.6613], [28.54196, 45.58062], [28.49252, 45.56716], [28.51449, 45.49982], [28.43072, 45.48538], [28.41836, 45.51715], [28.30201, 45.54744], [28.21139, 45.46895], [28.28504, 45.43907], [28.34554, 45.32102], [28.5735, 45.24759], [28.71358, 45.22631], [28.78911, 45.24179], [28.81383, 45.3384], [28.94292, 45.28045], [28.96077, 45.33164], [29.24779, 45.43388], [29.42632, 45.44545], [29.59798, 45.38857], [29.68175, 45.26885], [29.65428, 45.25629], [29.69272, 45.19227], [30.04414, 45.08461], [31.62627, 45.50633], [33.54017, 46.0123], [33.59087, 46.06013], [33.57318, 46.10317]]]] } },
23322     { type: "Feature", properties: { iso1A2: "UG", iso1A3: "UGA", iso1N3: "800", wikidata: "Q1036", nameEn: "Uganda", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["256"] }, geometry: { type: "MultiPolygon", coordinates: [[[[33.93107, -0.99298], [33.9264, -0.54188], [33.98449, -0.13079], [33.90936, 0.10581], [34.10067, 0.36372], [34.08727, 0.44713], [34.11408, 0.48884], [34.13493, 0.58118], [34.20196, 0.62289], [34.27345, 0.63182], [34.31516, 0.75693], [34.40041, 0.80266], [34.43349, 0.85254], [34.52369, 1.10692], [34.57427, 1.09868], [34.58029, 1.14712], [34.67562, 1.21265], [34.80223, 1.22754], [34.82606, 1.26626], [34.82606, 1.30944], [34.7918, 1.36752], [34.87819, 1.5596], [34.92734, 1.56109], [34.9899, 1.6668], [34.98692, 1.97348], [34.90947, 2.42447], [34.95267, 2.47209], [34.77244, 2.70272], [34.78137, 2.76223], [34.73967, 2.85447], [34.65774, 2.8753], [34.60114, 2.93034], [34.56242, 3.11478], [34.45815, 3.18319], [34.40006, 3.37949], [34.41794, 3.44342], [34.39112, 3.48802], [34.44922, 3.51627], [34.45815, 3.67385], [34.15429, 3.80464], [34.06046, 4.15235], [33.9873, 4.23316], [33.51264, 3.75068], [33.18356, 3.77812], [33.02852, 3.89296], [32.89746, 3.81339], [32.72021, 3.77327], [32.41337, 3.748], [32.20782, 3.6053], [32.19888, 3.50867], [32.08866, 3.53543], [32.08491, 3.56287], [32.05187, 3.589], [31.95907, 3.57408], [31.96205, 3.6499], [31.86821, 3.78664], [31.81459, 3.82083], [31.72075, 3.74354], [31.50776, 3.63652], [31.50478, 3.67814], [31.29476, 3.8015], [31.16666, 3.79853], [30.97601, 3.693], [30.85153, 3.48867], [30.94081, 3.50847], [30.93486, 3.40737], [30.84251, 3.26908], [30.77101, 3.04897], [30.8574, 2.9508], [30.8857, 2.83923], [30.75612, 2.5863], [30.74271, 2.43601], [30.83059, 2.42559], [30.91102, 2.33332], [30.96911, 2.41071], [31.06593, 2.35862], [31.07934, 2.30207], [31.12104, 2.27676], [31.1985, 2.29462], [31.20148, 2.2217], [31.28042, 2.17853], [31.30127, 2.11006], [30.48503, 1.21675], [30.24671, 1.14974], [30.22139, 0.99635], [30.1484, 0.89805], [29.98307, 0.84295], [29.95477, 0.64486], [29.97413, 0.52124], [29.87284, 0.39166], [29.81922, 0.16824], [29.77454, 0.16675], [29.7224, 0.07291], [29.72687, -0.08051], [29.65091, -0.46777], [29.67474, -0.47969], [29.67176, -0.55714], [29.62708, -0.71055], [29.63006, -0.8997], [29.58388, -0.89821], [29.59061, -1.39016], [29.82657, -1.31187], [29.912, -1.48269], [30.16369, -1.34303], [30.35212, -1.06896], [30.47194, -1.0555], [30.64166, -1.06601], [30.70631, -1.01175], [30.76635, -0.9852], [30.80408, -0.99911], [33.93107, -0.99298]]]] } },
23323     { type: "Feature", properties: { iso1A2: "UM", iso1A3: "UMI", iso1N3: "581", wikidata: "Q16645", nameEn: "United States Minor Outlying Islands", country: "US" }, geometry: null },
23324     { type: "Feature", properties: { iso1A2: "UN", wikidata: "Q1065", nameEn: "United Nations", level: "unitedNations", isoStatus: "excRes" }, geometry: null },
23325     { type: "Feature", properties: { iso1A2: "US", iso1A3: "USA", iso1N3: "840", wikidata: "Q30", nameEn: "United States of America" }, geometry: null },
23326     { type: "Feature", properties: { iso1A2: "UY", iso1A3: "URY", iso1N3: "858", wikidata: "Q77", nameEn: "Uruguay", groups: ["005", "419", "019", "UN"], callingCodes: ["598"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-57.65132, -30.19229], [-57.61478, -30.25165], [-57.64859, -30.35095], [-57.89115, -30.49572], [-57.8024, -30.77193], [-57.89476, -30.95994], [-57.86729, -31.06352], [-57.9908, -31.34924], [-57.98127, -31.3872], [-58.07569, -31.44916], [-58.0023, -31.53084], [-58.00076, -31.65016], [-58.20252, -31.86966], [-58.10036, -32.25338], [-58.22362, -32.52416], [-58.1224, -32.98842], [-58.40475, -33.11777], [-58.44442, -33.84033], [-58.34425, -34.15035], [-57.83001, -34.69099], [-54.78916, -36.21945], [-52.83257, -34.01481], [-53.37138, -33.74313], [-53.39593, -33.75169], [-53.44031, -33.69344], [-53.52794, -33.68908], [-53.53459, -33.16843], [-53.1111, -32.71147], [-53.37671, -32.57005], [-53.39572, -32.58596], [-53.76024, -32.0751], [-54.17384, -31.86168], [-55.50821, -30.91349], [-55.50841, -30.9027], [-55.51862, -30.89828], [-55.52712, -30.89997], [-55.53276, -30.90218], [-55.53431, -30.89714], [-55.54572, -30.89051], [-55.55218, -30.88193], [-55.55373, -30.8732], [-55.5634, -30.8686], [-55.58866, -30.84117], [-55.87388, -31.05053], [-56.4619, -30.38457], [-56.4795, -30.3899], [-56.49267, -30.39471], [-56.90236, -30.02578], [-57.22502, -30.26121], [-57.65132, -30.19229]]]] } },
23327     { type: "Feature", properties: { iso1A2: "UZ", iso1A3: "UZB", iso1N3: "860", wikidata: "Q265", nameEn: "Uzbekistan", groups: ["143", "142", "UN"], callingCodes: ["998"] }, geometry: { type: "MultiPolygon", coordinates: [[[[65.85194, 42.85481], [65.53277, 43.31856], [65.18666, 43.48835], [64.96464, 43.74748], [64.53885, 43.56941], [63.34656, 43.64003], [62.01711, 43.51008], [61.01475, 44.41383], [58.59711, 45.58671], [55.97842, 44.99622], [55.97832, 44.99622], [55.97822, 44.99617], [55.97811, 44.99617], [55.97801, 44.99612], [55.97801, 44.99607], [55.97791, 44.99607], [55.9778, 44.99607], [55.9777, 44.99601], [55.9777, 44.99596], [55.9776, 44.99591], [55.97749, 44.99591], [55.97739, 44.99591], [55.97739, 44.99586], [55.97729, 44.99586], [55.97718, 44.99581], [55.97708, 44.99576], [55.97698, 44.9957], [55.97698, 44.99565], [55.97687, 44.9956], [55.97677, 44.9956], [55.97677, 44.99555], [55.97677, 44.9955], [55.97667, 44.99545], [55.97656, 44.99539], [55.97646, 44.99534], [55.97646, 44.99529], [55.97636, 44.99524], [55.97636, 44.99519], [55.97625, 44.99514], [55.97615, 44.99508], [55.97615, 44.99503], [55.97615, 44.99498], [55.97615, 44.99493], [55.97615, 44.99483], [55.97615, 44.99477], [55.97605, 44.99477], [55.97605, 44.99467], [55.97605, 44.99462], [55.97605, 44.99457], [55.97605, 44.99452], [55.97594, 44.99446], [55.97584, 44.99441], [55.97584, 44.99436], [55.97584, 44.99431], [55.97584, 44.99426], [55.97584, 44.99421], [55.97584, 44.99415], [55.97584, 44.99405], [55.97584, 44.994], [55.97584, 44.9939], [55.97584, 44.99384], [55.97584, 44.99374], [55.97584, 44.99369], [55.97584, 44.99359], [55.97584, 44.99353], [55.97584, 44.99348], [55.97584, 44.99343], [55.97584, 44.99338], [55.97584, 44.99328], [55.97584, 44.99322], [56.00314, 41.32584], [57.03423, 41.25435], [57.13796, 41.36625], [57.03359, 41.41777], [56.96218, 41.80383], [57.03633, 41.92043], [57.30275, 42.14076], [57.6296, 42.16519], [57.84932, 42.18555], [57.92897, 42.24047], [57.90975, 42.4374], [57.99214, 42.50021], [58.3492, 42.43335], [58.40688, 42.29535], [58.51674, 42.30348], [58.29427, 42.56497], [58.14321, 42.62159], [58.27504, 42.69632], [58.57991, 42.64988], [58.6266, 42.79314], [58.93422, 42.5407], [59.17317, 42.52248], [59.2955, 42.37064], [59.4341, 42.29738], [59.94633, 42.27655], [60.00539, 42.212], [59.96419, 42.1428], [60.04659, 42.08982], [60.0356, 42.01028], [59.95046, 41.97966], [60.33223, 41.75058], [60.08504, 41.80997], [60.06032, 41.76287], [60.18117, 41.60082], [60.06581, 41.4363], [60.5078, 41.21694], [61.03261, 41.25691], [61.22212, 41.14946], [61.33199, 41.14946], [61.39732, 41.19873], [61.4446, 41.29407], [61.87856, 41.12257], [62.11751, 40.58242], [62.34273, 40.43206], [62.43337, 39.98528], [63.6913, 39.27666], [63.70778, 39.22349], [64.19086, 38.95561], [64.32576, 38.98691], [65.55873, 38.29052], [65.83913, 38.25733], [66.24013, 38.16238], [66.41042, 38.02403], [66.56697, 38.0435], [66.67684, 37.96776], [66.53676, 37.80084], [66.52852, 37.58568], [66.65761, 37.45497], [66.52303, 37.39827], [66.55743, 37.35409], [66.64699, 37.32958], [66.95598, 37.40162], [67.08232, 37.35469], [67.13039, 37.27168], [67.2224, 37.24545], [67.2581, 37.17216], [67.51868, 37.26102], [67.78329, 37.1834], [67.8474, 37.31594], [67.81566, 37.43107], [68.12635, 37.93], [68.27159, 37.91477], [68.40343, 38.19484], [68.13289, 38.40822], [68.06274, 38.39435], [68.11366, 38.47169], [68.05873, 38.56087], [68.0807, 38.64136], [68.05598, 38.71641], [68.12877, 38.73677], [68.06948, 38.82115], [68.19743, 38.85985], [68.09704, 39.02589], [67.68915, 39.00775], [67.67833, 39.14479], [67.33226, 39.23739], [67.36522, 39.31287], [67.45998, 39.315], [67.46822, 39.46146], [67.39681, 39.52505], [67.46547, 39.53564], [67.44899, 39.57799], [67.62889, 39.60234], [67.70992, 39.66156], [68.12053, 39.56317], [68.54166, 39.53929], [68.61972, 39.68905], [68.63071, 39.85265], [68.88889, 39.87163], [68.93695, 39.91167], [68.84906, 40.04952], [68.96579, 40.06949], [69.01935, 40.11466], [69.01523, 40.15771], [68.62796, 40.07789], [68.52771, 40.11676], [68.5332, 40.14826], [68.77902, 40.20492], [68.79276, 40.17555], [68.84357, 40.18604], [68.85832, 40.20885], [69.04544, 40.22904], [69.15659, 40.2162], [69.2074, 40.21488], [69.30448, 40.18774], [69.30104, 40.24502], [69.25229, 40.26362], [69.24817, 40.30357], [69.30808, 40.2821], [69.32833, 40.29794], [69.33794, 40.34819], [69.30774, 40.36102], [69.28525, 40.41894], [69.27066, 40.49274], [69.21063, 40.54469], [69.2643, 40.57506], [69.3455, 40.57988], [69.32834, 40.70233], [69.38327, 40.7918], [69.53021, 40.77621], [69.59441, 40.70181], [69.69434, 40.62615], [70.36655, 40.90296], [70.38028, 41.02014], [70.45251, 41.04438], [70.80009, 40.72825], [70.49871, 40.52503], [70.32626, 40.45174], [70.37511, 40.38605], [70.57149, 40.3442], [70.56394, 40.26421], [70.62342, 40.17396], [70.8607, 40.217], [70.9818, 40.22392], [70.95789, 40.28761], [71.05901, 40.28765], [71.13042, 40.34106], [71.36663, 40.31593], [71.4246, 40.28619], [71.51215, 40.26943], [71.51549, 40.22986], [71.61725, 40.20615], [71.61931, 40.26775], [71.68386, 40.26984], [71.70569, 40.20391], [71.69621, 40.18492], [71.71719, 40.17886], [71.73054, 40.14818], [71.82646, 40.21872], [71.85002, 40.25647], [72.05464, 40.27586], [71.96401, 40.31907], [72.18648, 40.49893], [72.24368, 40.46091], [72.40346, 40.4007], [72.44191, 40.48222], [72.41513, 40.50856], [72.38384, 40.51535], [72.41714, 40.55736], [72.34406, 40.60144], [72.40517, 40.61917], [72.47795, 40.5532], [72.66713, 40.5219], [72.66713, 40.59076], [72.69579, 40.59778], [72.73995, 40.58409], [72.74768, 40.58051], [72.74862, 40.57131], [72.75982, 40.57273], [72.74894, 40.59592], [72.74866, 40.60873], [72.80137, 40.67856], [72.84754, 40.67229], [72.85372, 40.7116], [72.8722, 40.71111], [72.93296, 40.73089], [72.99133, 40.76457], [73.0612, 40.76678], [73.13412, 40.79122], [73.13267, 40.83512], [73.01869, 40.84681], [72.94454, 40.8094], [72.84291, 40.85512], [72.68157, 40.84942], [72.59136, 40.86947], [72.55109, 40.96046], [72.48742, 40.97136], [72.45206, 41.03018], [72.38511, 41.02785], [72.36138, 41.04384], [72.34757, 41.06104], [72.34026, 41.04539], [72.324, 41.03381], [72.18339, 40.99571], [72.17594, 41.02377], [72.21061, 41.05607], [72.1792, 41.10621], [72.14864, 41.13363], [72.17594, 41.15522], [72.16433, 41.16483], [72.10745, 41.15483], [72.07249, 41.11739], [71.85964, 41.19081], [71.91457, 41.2982], [71.83914, 41.3546], [71.76625, 41.4466], [71.71132, 41.43012], [71.73054, 41.54713], [71.65914, 41.49599], [71.6787, 41.42111], [71.57227, 41.29175], [71.46688, 41.31883], [71.43814, 41.19644], [71.46148, 41.13958], [71.40198, 41.09436], [71.34877, 41.16807], [71.27187, 41.11015], [71.25813, 41.18796], [71.11806, 41.15359], [71.02193, 41.19494], [70.9615, 41.16393], [70.86263, 41.23833], [70.77885, 41.24813], [70.78572, 41.36419], [70.67586, 41.47953], [70.48909, 41.40335], [70.17682, 41.5455], [70.69777, 41.92554], [71.28719, 42.18033], [71.13263, 42.28356], [70.94483, 42.26238], [69.49545, 41.545], [69.45751, 41.56863], [69.39485, 41.51518], [69.45081, 41.46246], [69.37468, 41.46555], [69.35554, 41.47211], [69.29778, 41.43673], [69.25059, 41.46693], [69.23332, 41.45847], [69.22671, 41.46298], [69.20439, 41.45391], [69.18528, 41.45175], [69.17701, 41.43769], [69.15137, 41.43078], [69.05006, 41.36183], [69.01308, 41.22804], [68.7217, 41.05025], [68.73945, 40.96989], [68.65662, 40.93861], [68.62221, 41.03019], [68.49983, 40.99669], [68.58444, 40.91447], [68.63, 40.59358], [68.49983, 40.56437], [67.96736, 40.83798], [68.1271, 41.0324], [68.08273, 41.08148], [67.98511, 41.02794], [67.9644, 41.14611], [66.69129, 41.1311], [66.53302, 41.87388], [66.00546, 41.94455], [66.09482, 42.93426], [65.85194, 42.85481]], [[70.68112, 40.90612], [70.6721, 40.90555], [70.57501, 40.98941], [70.54223, 40.98787], [70.56077, 41.00642], [70.6158, 40.97661], [70.68112, 40.90612]]], [[[71.21139, 40.03369], [71.12218, 40.03052], [71.06305, 40.1771], [71.00236, 40.18154], [71.01035, 40.05481], [71.11037, 40.01984], [71.11668, 39.99291], [71.09063, 39.99], [71.10501, 39.95568], [71.04979, 39.89808], [71.10531, 39.91354], [71.16101, 39.88423], [71.23067, 39.93581], [71.1427, 39.95026], [71.21139, 40.03369]]], [[[71.86463, 39.98598], [71.78838, 40.01404], [71.71511, 39.96348], [71.7504, 39.93701], [71.84316, 39.95582], [71.86463, 39.98598]]]] } },
23328     { type: "Feature", properties: { iso1A2: "VA", iso1A3: "VAT", iso1N3: "336", wikidata: "Q237", nameEn: "Vatican City", aliases: ["Holy See"], groups: ["039", "150"], callingCodes: ["379", "39 06"] }, geometry: { type: "MultiPolygon", coordinates: [[[[12.45181, 41.90056], [12.45446, 41.90028], [12.45435, 41.90143], [12.45626, 41.90172], [12.45691, 41.90125], [12.4577, 41.90115], [12.45834, 41.90174], [12.45826, 41.90281], [12.45755, 41.9033], [12.45762, 41.9058], [12.45561, 41.90629], [12.45543, 41.90738], [12.45091, 41.90625], [12.44984, 41.90545], [12.44815, 41.90326], [12.44582, 41.90194], [12.44834, 41.90095], [12.45181, 41.90056]]]] } },
23329     { type: "Feature", properties: { iso1A2: "VC", iso1A3: "VCT", iso1N3: "670", wikidata: "Q757", nameEn: "St. Vincent and the Grenadines", aliases: ["WV"], groups: ["029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", callingCodes: ["1 784"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-62.64026, 12.69984], [-59.94058, 12.34011], [-61.69315, 14.26451], [-62.64026, 12.69984]]]] } },
23330     { type: "Feature", properties: { iso1A2: "VE", iso1A3: "VEN", iso1N3: "862", wikidata: "Q717", nameEn: "Venezuela", aliases: ["YV"], groups: ["005", "419", "019", "UN"], callingCodes: ["58"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-71.22331, 13.01387], [-70.92579, 11.96275], [-71.3275, 11.85], [-71.9675, 11.65536], [-72.24983, 11.14138], [-72.4767, 11.1117], [-72.88002, 10.44309], [-72.98085, 9.85253], [-73.36905, 9.16636], [-73.02119, 9.27584], [-72.94052, 9.10663], [-72.77415, 9.10165], [-72.65474, 8.61428], [-72.4042, 8.36513], [-72.36987, 8.19976], [-72.35163, 8.01163], [-72.39137, 8.03534], [-72.47213, 7.96106], [-72.48801, 7.94329], [-72.48183, 7.92909], [-72.47042, 7.92306], [-72.45806, 7.91141], [-72.46183, 7.90682], [-72.44454, 7.86031], [-72.46763, 7.79518], [-72.47827, 7.65604], [-72.45321, 7.57232], [-72.47415, 7.48928], [-72.43132, 7.40034], [-72.19437, 7.37034], [-72.04895, 7.03837], [-71.82441, 7.04314], [-71.44118, 7.02116], [-71.42212, 7.03854], [-71.37234, 7.01588], [-71.03941, 6.98163], [-70.7596, 7.09799], [-70.10716, 6.96516], [-69.41843, 6.1072], [-67.60654, 6.2891], [-67.4625, 6.20625], [-67.43513, 5.98835], [-67.58558, 5.84537], [-67.63914, 5.64963], [-67.59141, 5.5369], [-67.83341, 5.31104], [-67.85358, 4.53249], [-67.62671, 3.74303], [-67.50067, 3.75812], [-67.30945, 3.38393], [-67.85862, 2.86727], [-67.85862, 2.79173], [-67.65696, 2.81691], [-67.21967, 2.35778], [-66.85795, 1.22998], [-66.28507, 0.74585], [-65.6727, 1.01353], [-65.50158, 0.92086], [-65.57288, 0.62856], [-65.11657, 1.12046], [-64.38932, 1.5125], [-64.34654, 1.35569], [-64.08274, 1.64792], [-64.06135, 1.94722], [-63.39827, 2.16098], [-63.39114, 2.4317], [-64.0257, 2.48156], [-64.02908, 2.79797], [-64.48379, 3.7879], [-64.84028, 4.24665], [-64.72977, 4.28931], [-64.57648, 4.12576], [-64.14512, 4.12932], [-63.99183, 3.90172], [-63.86082, 3.94796], [-63.70218, 3.91417], [-63.67099, 4.01731], [-63.50611, 3.83592], [-63.42233, 3.89995], [-63.4464, 3.9693], [-63.21111, 3.96219], [-62.98296, 3.59935], [-62.7655, 3.73099], [-62.74411, 4.03331], [-62.57656, 4.04754], [-62.44822, 4.18621], [-62.13094, 4.08309], [-61.54629, 4.2822], [-61.48569, 4.43149], [-61.29675, 4.44216], [-61.31457, 4.54167], [-61.15703, 4.49839], [-60.98303, 4.54167], [-60.86539, 4.70512], [-60.5802, 4.94312], [-60.73204, 5.20931], [-61.4041, 5.95304], [-61.15058, 6.19558], [-61.20762, 6.58174], [-61.13632, 6.70922], [-60.54873, 6.8631], [-60.39419, 6.94847], [-60.28074, 7.1162], [-60.44116, 7.20817], [-60.54098, 7.14804], [-60.63367, 7.25061], [-60.59802, 7.33194], [-60.71923, 7.55817], [-60.64793, 7.56877], [-60.51959, 7.83373], [-60.38056, 7.8302], [-60.02407, 8.04557], [-59.97059, 8.20791], [-59.83156, 8.23261], [-59.80661, 8.28906], [-59.85562, 8.35213], [-59.98508, 8.53046], [-59.54058, 8.6862], [-60.89962, 9.81445], [-62.08693, 10.04435], [-61.62505, 11.18974], [-63.73917, 11.92623], [-63.19938, 16.44103], [-67.89186, 12.4116], [-68.01417, 11.77722], [-68.33524, 11.78151], [-68.99639, 11.79035], [-71.22331, 13.01387]]]] } },
23331     { type: "Feature", properties: { iso1A2: "VG", iso1A3: "VGB", iso1N3: "092", wikidata: "Q25305", nameEn: "British Virgin Islands", country: "GB", groups: ["BOTS", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 284"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-64.47127, 17.55688], [-63.88746, 19.15706], [-65.02435, 18.73231], [-64.86027, 18.39056], [-64.64673, 18.36549], [-64.47127, 17.55688]]]] } },
23332     { type: "Feature", properties: { iso1A2: "VI", iso1A3: "VIR", iso1N3: "850", wikidata: "Q11703", nameEn: "United States Virgin Islands", aliases: ["US-VI"], country: "US", groups: ["Q1352230", "029", "003", "419", "019", "UN"], driveSide: "left", roadSpeedUnit: "mph", roadHeightUnit: "ft", callingCodes: ["1 340"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-65.02435, 18.73231], [-65.27974, 17.56928], [-64.47127, 17.55688], [-64.64673, 18.36549], [-64.86027, 18.39056], [-65.02435, 18.73231]]]] } },
23333     { type: "Feature", properties: { iso1A2: "VN", iso1A3: "VNM", iso1N3: "704", wikidata: "Q881", nameEn: "Vietnam", groups: ["035", "142", "UN"], callingCodes: ["84"] }, geometry: { type: "MultiPolygon", coordinates: [[[[108.10003, 21.47338], [108.0569, 21.53604], [108.02926, 21.54997], [107.97932, 21.54503], [107.97383, 21.53961], [107.97074, 21.54072], [107.96774, 21.53601], [107.95232, 21.5388], [107.92652, 21.58906], [107.90006, 21.5905], [107.86114, 21.65128], [107.80355, 21.66141], [107.66967, 21.60787], [107.56537, 21.61945], [107.54047, 21.5934], [107.49065, 21.59774], [107.49532, 21.62958], [107.47197, 21.6672], [107.41593, 21.64839], [107.38636, 21.59774], [107.35989, 21.60063], [107.35834, 21.6672], [107.29296, 21.74674], [107.24625, 21.7077], [107.20734, 21.71493], [107.10771, 21.79879], [107.02615, 21.81981], [107.00964, 21.85948], [107.06101, 21.88982], [107.05634, 21.92303], [106.99252, 21.95191], [106.97228, 21.92592], [106.92714, 21.93459], [106.9178, 21.97357], [106.81038, 21.97934], [106.74345, 22.00965], [106.72551, 21.97923], [106.69276, 21.96013], [106.68274, 21.99811], [106.70142, 22.02409], [106.6983, 22.15102], [106.67495, 22.1885], [106.69986, 22.22309], [106.6516, 22.33977], [106.55976, 22.34841], [106.57221, 22.37], [106.55665, 22.46498], [106.58395, 22.474], [106.61269, 22.60301], [106.65316, 22.5757], [106.71698, 22.58432], [106.72321, 22.63606], [106.76293, 22.73491], [106.82404, 22.7881], [106.83685, 22.8098], [106.81271, 22.8226], [106.78422, 22.81532], [106.71128, 22.85982], [106.71387, 22.88296], [106.6734, 22.89587], [106.6516, 22.86862], [106.60179, 22.92884], [106.55976, 22.92311], [106.51306, 22.94891], [106.49749, 22.91164], [106.34961, 22.86718], [106.27022, 22.87722], [106.19705, 22.98475], [106.00179, 22.99049], [105.99568, 22.94178], [105.90119, 22.94168], [105.8726, 22.92756], [105.72382, 23.06641], [105.57594, 23.075], [105.56037, 23.16806], [105.49966, 23.20669], [105.42805, 23.30824], [105.40782, 23.28107], [105.32376, 23.39684], [105.22569, 23.27249], [105.17276, 23.28679], [105.11672, 23.25247], [105.07002, 23.26248], [104.98712, 23.19176], [104.96532, 23.20463], [104.9486, 23.17235], [104.91435, 23.18666], [104.87992, 23.17141], [104.87382, 23.12854], [104.79478, 23.12934], [104.8334, 23.01484], [104.86765, 22.95178], [104.84942, 22.93631], [104.77114, 22.90017], [104.72755, 22.81984], [104.65283, 22.83419], [104.60457, 22.81841], [104.58122, 22.85571], [104.47225, 22.75813], [104.35593, 22.69353], [104.25683, 22.76534], [104.27084, 22.8457], [104.11384, 22.80363], [104.03734, 22.72945], [104.01088, 22.51823], [103.99247, 22.51958], [103.97384, 22.50634], [103.96783, 22.51173], [103.96352, 22.50584], [103.95191, 22.5134], [103.94513, 22.52553], [103.93286, 22.52703], [103.87904, 22.56683], [103.64506, 22.79979], [103.56255, 22.69499], [103.57812, 22.65764], [103.52675, 22.59155], [103.43646, 22.70648], [103.43179, 22.75816], [103.32282, 22.8127], [103.28079, 22.68063], [103.18895, 22.64471], [103.15782, 22.59873], [103.17961, 22.55705], [103.07843, 22.50097], [103.0722, 22.44775], [102.9321, 22.48659], [102.8636, 22.60735], [102.60675, 22.73376], [102.57095, 22.7036], [102.51802, 22.77969], [102.46665, 22.77108], [102.42618, 22.69212], [102.38415, 22.67919], [102.41061, 22.64184], [102.25339, 22.4607], [102.26428, 22.41321], [102.16621, 22.43336], [102.14099, 22.40092], [102.18712, 22.30403], [102.51734, 22.02676], [102.49092, 21.99002], [102.62301, 21.91447], [102.67145, 21.65894], [102.74189, 21.66713], [102.82115, 21.73667], [102.81894, 21.83888], [102.85637, 21.84501], [102.86077, 21.71213], [102.97965, 21.74076], [102.98846, 21.58936], [102.86297, 21.4255], [102.94223, 21.46034], [102.88939, 21.3107], [102.80794, 21.25736], [102.89825, 21.24707], [102.97745, 21.05821], [103.03469, 21.05821], [103.12055, 20.89994], [103.21497, 20.89832], [103.38032, 20.79501], [103.45737, 20.82382], [103.68633, 20.66324], [103.73478, 20.6669], [103.82282, 20.8732], [103.98024, 20.91531], [104.11121, 20.96779], [104.27412, 20.91433], [104.63957, 20.6653], [104.38199, 20.47155], [104.40621, 20.3849], [104.47886, 20.37459], [104.66158, 20.47774], [104.72102, 20.40554], [104.62195, 20.36633], [104.61315, 20.24452], [104.86852, 20.14121], [104.91695, 20.15567], [104.9874, 20.09573], [104.8465, 19.91783], [104.8355, 19.80395], [104.68359, 19.72729], [104.64837, 19.62365], [104.53169, 19.61743], [104.41281, 19.70035], [104.23229, 19.70242], [104.06498, 19.66926], [104.05617, 19.61743], [104.10832, 19.51575], [104.06058, 19.43484], [103.87125, 19.31854], [104.5361, 18.97747], [104.64617, 18.85668], [105.12829, 18.70453], [105.19654, 18.64196], [105.1327, 18.58355], [105.10408, 18.43533], [105.15942, 18.38691], [105.38366, 18.15315], [105.46292, 18.22008], [105.64784, 17.96687], [105.60381, 17.89356], [105.76612, 17.67147], [105.85744, 17.63221], [106.09019, 17.36399], [106.18991, 17.28227], [106.24444, 17.24714], [106.29287, 17.3018], [106.31929, 17.20509], [106.43597, 17.01362], [106.50862, 16.9673], [106.55045, 17.0031], [106.54824, 16.92729], [106.51963, 16.92097], [106.52183, 16.87884], [106.55265, 16.86831], [106.55485, 16.68704], [106.59013, 16.62259], [106.58267, 16.6012], [106.61477, 16.60713], [106.66052, 16.56892], [106.65832, 16.47816], [106.74418, 16.41904], [106.84104, 16.55415], [106.88727, 16.52671], [106.88067, 16.43594], [106.96638, 16.34938], [106.97385, 16.30204], [107.02597, 16.31132], [107.09091, 16.3092], [107.15035, 16.26271], [107.14595, 16.17816], [107.25822, 16.13587], [107.33968, 16.05549], [107.44975, 16.08511], [107.46296, 16.01106], [107.39471, 15.88829], [107.34188, 15.89464], [107.21419, 15.83747], [107.21859, 15.74638], [107.27143, 15.71459], [107.27583, 15.62769], [107.34408, 15.62345], [107.3815, 15.49832], [107.50699, 15.48771], [107.53341, 15.40496], [107.62367, 15.42193], [107.60605, 15.37524], [107.62587, 15.2266], [107.58844, 15.20111], [107.61926, 15.13949], [107.61486, 15.0566], [107.46516, 15.00982], [107.48277, 14.93751], [107.59285, 14.87795], [107.51579, 14.79282], [107.54361, 14.69092], [107.55371, 14.628], [107.52102, 14.59034], [107.52569, 14.54665], [107.48521, 14.40346], [107.44941, 14.41552], [107.39493, 14.32655], [107.40427, 14.24509], [107.33577, 14.11832], [107.37158, 14.07906], [107.35757, 14.02319], [107.38247, 13.99147], [107.44318, 13.99751], [107.46498, 13.91593], [107.45252, 13.78897], [107.53503, 13.73908], [107.61909, 13.52577], [107.62843, 13.3668], [107.49144, 13.01215], [107.49611, 12.88926], [107.55993, 12.7982], [107.5755, 12.52177], [107.55059, 12.36824], [107.4463, 12.29373], [107.42917, 12.24657], [107.34511, 12.33327], [107.15831, 12.27547], [106.99953, 12.08983], [106.92325, 12.06548], [106.79405, 12.0807], [106.70687, 11.96956], [106.4111, 11.97413], [106.4687, 11.86751], [106.44068, 11.86294], [106.44535, 11.8279], [106.41577, 11.76999], [106.45158, 11.68616], [106.44691, 11.66787], [106.37219, 11.69836], [106.30525, 11.67549], [106.26478, 11.72122], [106.18539, 11.75171], [106.13158, 11.73283], [106.06708, 11.77761], [106.02038, 11.77457], [106.00792, 11.7197], [105.95188, 11.63738], [105.88962, 11.67854], [105.8507, 11.66635], [105.80867, 11.60536], [105.81645, 11.56876], [105.87328, 11.55953], [105.88962, 11.43605], [105.86782, 11.28343], [106.10444, 11.07879], [106.1527, 11.10476], [106.1757, 11.07301], [106.20095, 10.97795], [106.14301, 10.98176], [106.18539, 10.79451], [106.06708, 10.8098], [105.94535, 10.9168], [105.93403, 10.83853], [105.84603, 10.85873], [105.86376, 10.89839], [105.77751, 11.03671], [105.50045, 10.94586], [105.42884, 10.96878], [105.34011, 10.86179], [105.11449, 10.96332], [105.08326, 10.95656], [105.02722, 10.89236], [105.09571, 10.72722], [104.95094, 10.64003], [104.87933, 10.52833], [104.59018, 10.53073], [104.49869, 10.4057], [104.47963, 10.43046], [104.43778, 10.42386], [103.99198, 10.48391], [102.47649, 9.66162], [104.81582, 8.03101], [109.55486, 8.10026], [111.60491, 13.57105], [108.00365, 17.98159], [108.10003, 21.47338]]]] } },
23334     { type: "Feature", properties: { iso1A2: "VU", iso1A3: "VUT", iso1N3: "548", wikidata: "Q686", nameEn: "Vanuatu", groups: ["054", "009", "UN"], callingCodes: ["678"] }, geometry: { type: "MultiPolygon", coordinates: [[[[156.73836, -14.50464], [174.245, -23.1974], [172.71443, -12.01327], [156.73836, -14.50464]]]] } },
23335     { type: "Feature", properties: { iso1A2: "WF", iso1A3: "WLF", iso1N3: "876", wikidata: "Q35555", nameEn: "Wallis and Futuna", country: "FR", groups: ["EU", "Q1451600", "061", "009", "UN"], callingCodes: ["681"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-178.66551, -14.32452], [-176.76826, -14.95183], [-175.59809, -12.61507], [-178.66551, -14.32452]]]] } },
23336     { type: "Feature", properties: { iso1A2: "WS", iso1A3: "WSM", iso1N3: "882", wikidata: "Q683", nameEn: "Samoa", groups: ["061", "009", "UN"], driveSide: "left", callingCodes: ["685"] }, geometry: { type: "MultiPolygon", coordinates: [[[[-173.74402, -14.26669], [-170.99605, -15.1275], [-171.39864, -10.21587], [-173.74402, -14.26669]]]] } },
23337     { type: "Feature", properties: { iso1A2: "XK", iso1A3: "XKX", wikidata: "Q1246", nameEn: "Kosovo", aliases: ["KV"], groups: ["039", "150"], isoStatus: "usrAssn", callingCodes: ["383"] }, geometry: { type: "MultiPolygon", coordinates: [[[[21.39045, 42.74888], [21.44047, 42.87276], [21.36941, 42.87397], [21.32974, 42.90424], [21.2719, 42.8994], [21.23534, 42.95523], [21.23877, 43.00848], [21.2041, 43.02277], [21.16734, 42.99694], [21.14465, 43.11089], [21.08952, 43.13471], [21.05378, 43.10707], [21.00749, 43.13984], [20.96287, 43.12416], [20.83727, 43.17842], [20.88685, 43.21697], [20.82145, 43.26769], [20.73811, 43.25068], [20.68688, 43.21335], [20.59929, 43.20492], [20.69515, 43.09641], [20.64557, 43.00826], [20.59929, 43.01067], [20.48692, 42.93208], [20.53484, 42.8885], [20.43734, 42.83157], [20.40594, 42.84853], [20.35692, 42.8335], [20.27869, 42.81945], [20.2539, 42.76245], [20.04898, 42.77701], [20.02088, 42.74789], [20.02915, 42.71147], [20.0969, 42.65559], [20.07761, 42.55582], [20.17127, 42.50469], [20.21797, 42.41237], [20.24399, 42.32168], [20.34479, 42.32656], [20.3819, 42.3029], [20.48857, 42.25444], [20.56955, 42.12097], [20.55633, 42.08173], [20.59434, 42.03879], [20.63069, 41.94913], [20.57946, 41.91593], [20.59524, 41.8818], [20.68523, 41.85318], [20.76786, 41.91839], [20.75464, 42.05229], [21.11491, 42.20794], [21.16614, 42.19815], [21.22728, 42.08909], [21.31983, 42.10993], [21.29913, 42.13954], [21.30496, 42.1418], [21.38428, 42.24465], [21.43882, 42.23609], [21.43882, 42.2789], [21.50823, 42.27156], [21.52145, 42.24465], [21.58992, 42.25915], [21.56772, 42.30946], [21.5264, 42.33634], [21.53467, 42.36809], [21.57021, 42.3647], [21.59029, 42.38042], [21.62887, 42.37664], [21.64209, 42.41081], [21.62556, 42.45106], [21.7035, 42.51899], [21.70522, 42.54176], [21.7327, 42.55041], [21.75672, 42.62695], [21.79413, 42.65923], [21.75025, 42.70125], [21.6626, 42.67813], [21.58755, 42.70418], [21.59154, 42.72643], [21.47498, 42.74695], [21.39045, 42.74888]]]] } },
23338     { type: "Feature", properties: { iso1A2: "YE", iso1A3: "YEM", iso1N3: "887", wikidata: "Q805", nameEn: "Yemen", groups: ["145", "142", "UN"], callingCodes: ["967"] }, geometry: { type: "MultiPolygon", coordinates: [[[[57.49095, 8.14549], [52.81185, 17.28568], [52.74267, 17.29519], [52.78009, 17.35124], [52.00311, 19.00083], [49.04884, 18.59899], [48.19996, 18.20584], [47.58351, 17.50366], [47.48245, 17.10808], [47.00571, 16.94765], [46.76494, 17.29151], [46.31018, 17.20464], [44.50126, 17.47475], [43.70631, 17.35762], [43.43005, 17.56148], [43.29185, 17.53224], [43.22533, 17.38343], [43.32653, 17.31179], [43.20156, 17.25901], [43.17787, 17.14717], [43.23967, 17.03428], [43.18233, 17.02673], [43.1813, 16.98438], [43.19328, 16.94703], [43.1398, 16.90696], [43.18338, 16.84852], [43.22012, 16.83932], [43.22956, 16.80613], [43.24801, 16.80613], [43.26303, 16.79479], [43.25857, 16.75304], [43.21325, 16.74416], [43.22066, 16.65179], [43.15274, 16.67248], [43.11601, 16.53166], [42.97215, 16.51093], [42.94351, 16.49467], [42.94625, 16.39721], [42.76801, 16.40371], [42.15205, 16.40211], [40.99158, 15.81743], [43.29075, 12.79154], [43.32909, 12.59711], [43.90659, 12.3823], [51.12877, 12.56479], [57.49095, 8.14549]]]] } },
23339     { type: "Feature", properties: { iso1A2: "YT", iso1A3: "MYT", iso1N3: "175", wikidata: "Q17063", nameEn: "Mayotte", country: "FR", groups: ["Q3320166", "EU", "014", "202", "002", "UN"], callingCodes: ["262"] }, geometry: { type: "MultiPolygon", coordinates: [[[[43.28731, -13.97126], [45.54824, -13.22353], [45.4971, -11.75965], [43.28731, -13.97126]]]] } },
23340     { type: "Feature", properties: { iso1A2: "ZA", iso1A3: "ZAF", iso1N3: "710", wikidata: "Q258", nameEn: "South Africa", groups: ["018", "202", "002", "UN"], driveSide: "left", callingCodes: ["27"] }, geometry: { type: "MultiPolygon", coordinates: [[[[31.30611, -22.422], [31.16344, -22.32599], [31.08932, -22.34884], [30.86696, -22.28907], [30.6294, -22.32599], [30.48686, -22.31368], [30.38614, -22.34533], [30.28351, -22.35587], [30.2265, -22.2961], [30.13147, -22.30841], [29.92242, -22.19408], [29.76848, -22.14128], [29.64609, -22.12917], [29.37703, -22.19581], [29.21955, -22.17771], [29.18974, -22.18599], [29.15268, -22.21399], [29.10881, -22.21202], [29.0151, -22.22907], [28.91889, -22.44299], [28.63287, -22.55887], [28.34874, -22.5694], [28.04562, -22.8394], [28.04752, -22.90243], [27.93729, -22.96194], [27.93539, -23.04941], [27.74154, -23.2137], [27.6066, -23.21894], [27.52393, -23.37952], [27.33768, -23.40917], [26.99749, -23.65486], [26.84165, -24.24885], [26.51667, -24.47219], [26.46346, -24.60358], [26.39409, -24.63468], [25.8515, -24.75727], [25.84295, -24.78661], [25.88571, -24.87802], [25.72702, -25.25503], [25.69661, -25.29284], [25.6643, -25.4491], [25.58543, -25.6343], [25.33076, -25.76616], [25.12266, -25.75931], [25.01718, -25.72507], [24.8946, -25.80723], [24.67319, -25.81749], [24.44703, -25.73021], [24.36531, -25.773], [24.18287, -25.62916], [23.9244, -25.64286], [23.47588, -25.29971], [23.03497, -25.29971], [22.86012, -25.50572], [22.70808, -25.99186], [22.56365, -26.19668], [22.41921, -26.23078], [22.21206, -26.3773], [22.06192, -26.61882], [21.90703, -26.66808], [21.83291, -26.65959], [21.77114, -26.69015], [21.7854, -26.79199], [21.69322, -26.86152], [21.37869, -26.82083], [21.13353, -26.86661], [20.87031, -26.80047], [20.68596, -26.9039], [20.63275, -26.78181], [20.61754, -26.4692], [20.86081, -26.14892], [20.64795, -25.47827], [20.29826, -24.94869], [20.03678, -24.81004], [20.02809, -24.78725], [19.99817, -24.76768], [19.99882, -28.42622], [18.99885, -28.89165], [17.4579, -28.68718], [17.15405, -28.08573], [16.90446, -28.057], [16.59922, -28.53246], [16.46592, -28.57126], [16.45332, -28.63117], [12.51595, -32.27486], [38.88176, -48.03306], [34.51034, -26.91792], [32.35222, -26.86027], [32.29584, -26.852], [32.22302, -26.84136], [32.19409, -26.84032], [32.13315, -26.84345], [32.09664, -26.80721], [32.00893, -26.8096], [31.97463, -27.11057], [31.97592, -27.31675], [31.49834, -27.31549], [31.15027, -27.20151], [30.96088, -27.0245], [30.97757, -26.92706], [30.88826, -26.79622], [30.81101, -26.84722], [30.78927, -26.48271], [30.95819, -26.26303], [31.13073, -25.91558], [31.31237, -25.7431], [31.4175, -25.71886], [31.86881, -25.99973], [31.974, -25.95387], [31.92649, -25.84216], [32.00631, -25.65044], [31.97875, -25.46356], [32.01676, -25.38117], [32.03196, -25.10785], [31.9835, -24.29983], [31.90368, -24.18892], [31.87707, -23.95293], [31.77445, -23.90082], [31.70223, -23.72695], [31.67942, -23.60858], [31.56539, -23.47268], [31.55779, -23.176], [31.30611, -22.422]], [[29.33204, -29.45598], [29.28545, -29.58456], [29.12553, -29.76266], [29.16548, -29.91706], [28.9338, -30.05072], [28.80222, -30.10579], [28.68627, -30.12885], [28.399, -30.1592], [28.2319, -30.28476], [28.12073, -30.68072], [27.74814, -30.60635], [27.69467, -30.55862], [27.67819, -30.53437], [27.6521, -30.51707], [27.62137, -30.50509], [27.56781, -30.44562], [27.56901, -30.42504], [27.45452, -30.32239], [27.38108, -30.33456], [27.36649, -30.27246], [27.37293, -30.19401], [27.40778, -30.14577], [27.32555, -30.14785], [27.29603, -30.05473], [27.22719, -30.00718], [27.09489, -29.72796], [27.01016, -29.65439], [27.33464, -29.48161], [27.4358, -29.33465], [27.47254, -29.31968], [27.45125, -29.29708], [27.48679, -29.29349], [27.54258, -29.25575], [27.5158, -29.2261], [27.55974, -29.18954], [27.75458, -28.89839], [27.8907, -28.91612], [27.88933, -28.88156], [27.9392, -28.84864], [27.98675, -28.8787], [28.02503, -28.85991], [28.1317, -28.7293], [28.2348, -28.69471], [28.30518, -28.69531], [28.40612, -28.6215], [28.65091, -28.57025], [28.68043, -28.58744], [29.40524, -29.21246], [29.44883, -29.3772], [29.33204, -29.45598]]]] } },
23341     { type: "Feature", properties: { iso1A2: "ZM", iso1A3: "ZMB", iso1N3: "894", wikidata: "Q953", nameEn: "Zambia", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["260"] }, geometry: { type: "MultiPolygon", coordinates: [[[[32.95389, -9.40138], [32.76233, -9.31963], [32.75611, -9.28583], [32.53661, -9.24281], [32.49147, -9.14754], [32.43543, -9.11988], [32.25486, -9.13371], [32.16146, -9.05993], [32.08206, -9.04609], [31.98866, -9.07069], [31.94196, -9.02303], [31.94663, -8.93846], [31.81587, -8.88618], [31.71158, -8.91386], [31.57147, -8.81388], [31.57147, -8.70619], [31.37533, -8.60769], [31.00796, -8.58615], [30.79243, -8.27382], [28.88917, -8.4831], [28.9711, -8.66935], [28.38526, -9.23393], [28.36562, -9.30091], [28.52636, -9.35379], [28.51627, -9.44726], [28.56208, -9.49122], [28.68532, -9.78], [28.62795, -9.92942], [28.65032, -10.65133], [28.37241, -11.57848], [28.48357, -11.87532], [29.18592, -12.37921], [29.4992, -12.43843], [29.48404, -12.23604], [29.8139, -12.14898], [29.81551, -13.44683], [29.65078, -13.41844], [29.60531, -13.21685], [29.01918, -13.41353], [28.33199, -12.41375], [27.59932, -12.22123], [27.21025, -11.76157], [27.22541, -11.60323], [27.04351, -11.61312], [26.88687, -12.01868], [26.01777, -11.91488], [25.33058, -11.65767], [25.34069, -11.19707], [24.42612, -11.44975], [24.34528, -11.06816], [24.00027, -10.89356], [24.02603, -11.15368], [23.98804, -12.13149], [24.06672, -12.29058], [23.90937, -12.844], [24.03339, -12.99091], [21.97988, -13.00148], [22.00323, -16.18028], [22.17217, -16.50269], [23.20038, -17.47563], [23.47474, -17.62877], [24.23619, -17.47489], [24.32811, -17.49082], [24.38712, -17.46818], [24.5621, -17.52963], [24.70864, -17.49501], [25.00198, -17.58221], [25.26433, -17.79571], [25.51646, -17.86232], [25.6827, -17.81987], [25.85738, -17.91403], [25.85892, -17.97726], [26.08925, -17.98168], [26.0908, -17.93021], [26.21601, -17.88608], [26.55918, -17.99638], [26.68403, -18.07411], [26.74314, -18.0199], [26.89926, -17.98756], [27.14196, -17.81398], [27.30736, -17.60487], [27.61377, -17.34378], [27.62795, -17.24365], [27.83141, -16.96274], [28.73725, -16.5528], [28.76199, -16.51575], [28.81454, -16.48611], [28.8501, -16.04537], [28.9243, -15.93987], [29.01298, -15.93805], [29.21955, -15.76589], [29.4437, -15.68702], [29.8317, -15.6126], [30.35574, -15.6513], [30.41902, -15.62269], [30.22098, -14.99447], [33.24249, -14.00019], [33.16749, -13.93992], [33.07568, -13.98447], [33.02977, -14.05022], [32.99042, -13.95689], [32.88985, -13.82956], [32.79015, -13.80755], [32.76962, -13.77224], [32.84528, -13.71576], [32.7828, -13.64805], [32.68654, -13.64268], [32.66468, -13.60019], [32.68436, -13.55769], [32.73683, -13.57682], [32.84176, -13.52794], [32.86113, -13.47292], [33.0078, -13.19492], [32.98289, -13.12671], [33.02181, -12.88707], [32.96733, -12.88251], [32.94397, -12.76868], [33.05917, -12.59554], [33.18837, -12.61377], [33.28177, -12.54692], [33.37517, -12.54085], [33.54485, -12.35996], [33.47636, -12.32498], [33.3705, -12.34931], [33.25998, -12.14242], [33.33937, -11.91252], [33.32692, -11.59248], [33.24252, -11.59302], [33.23663, -11.40637], [33.29267, -11.43536], [33.29267, -11.3789], [33.39697, -11.15296], [33.25998, -10.88862], [33.28022, -10.84428], [33.47636, -10.78465], [33.70675, -10.56896], [33.54797, -10.36077], [33.53863, -10.20148], [33.31297, -10.05133], [33.37902, -9.9104], [33.36581, -9.81063], [33.31517, -9.82364], [33.2095, -9.61099], [33.12144, -9.58929], [33.10163, -9.66525], [33.05485, -9.61316], [33.00256, -9.63053], [33.00476, -9.5133], [32.95389, -9.40138]]]] } },
23342     { type: "Feature", properties: { iso1A2: "ZW", iso1A3: "ZWE", iso1N3: "716", wikidata: "Q954", nameEn: "Zimbabwe", groups: ["014", "202", "002", "UN"], driveSide: "left", callingCodes: ["263"] }, geometry: { type: "MultiPolygon", coordinates: [[[[30.41902, -15.62269], [30.35574, -15.6513], [29.8317, -15.6126], [29.4437, -15.68702], [29.21955, -15.76589], [29.01298, -15.93805], [28.9243, -15.93987], [28.8501, -16.04537], [28.81454, -16.48611], [28.76199, -16.51575], [28.73725, -16.5528], [27.83141, -16.96274], [27.62795, -17.24365], [27.61377, -17.34378], [27.30736, -17.60487], [27.14196, -17.81398], [26.89926, -17.98756], [26.74314, -18.0199], [26.68403, -18.07411], [26.55918, -17.99638], [26.21601, -17.88608], [26.0908, -17.93021], [26.08925, -17.98168], [25.85892, -17.97726], [25.85738, -17.91403], [25.6827, -17.81987], [25.51646, -17.86232], [25.26433, -17.79571], [25.23909, -17.90832], [25.31799, -18.07091], [25.39972, -18.12691], [25.53465, -18.39041], [25.68859, -18.56165], [25.79217, -18.6355], [25.82353, -18.82808], [25.94326, -18.90362], [25.99837, -19.02943], [25.96226, -19.08152], [26.17227, -19.53709], [26.72246, -19.92707], [27.21278, -20.08244], [27.29831, -20.28935], [27.28865, -20.49873], [27.69361, -20.48531], [27.72972, -20.51735], [27.69171, -21.08409], [27.91407, -21.31621], [28.01669, -21.57624], [28.29416, -21.59037], [28.49942, -21.66634], [28.58114, -21.63455], [29.07763, -21.81877], [29.04023, -21.85864], [29.02191, -21.90647], [29.02191, -21.95665], [29.04108, -22.00563], [29.08495, -22.04867], [29.14501, -22.07275], [29.1974, -22.07472], [29.24648, -22.05967], [29.3533, -22.18363], [29.37703, -22.19581], [29.64609, -22.12917], [29.76848, -22.14128], [29.92242, -22.19408], [30.13147, -22.30841], [30.2265, -22.2961], [30.28351, -22.35587], [30.38614, -22.34533], [30.48686, -22.31368], [30.6294, -22.32599], [30.86696, -22.28907], [31.08932, -22.34884], [31.16344, -22.32599], [31.30611, -22.422], [31.38336, -22.36919], [32.41234, -21.31246], [32.48236, -21.32873], [32.37115, -21.133], [32.51644, -20.91929], [32.48122, -20.63319], [32.55167, -20.56312], [32.66174, -20.56106], [32.85987, -20.27841], [32.85987, -20.16686], [32.93032, -20.03868], [33.01178, -20.02007], [33.06461, -19.77787], [32.95013, -19.67219], [32.84666, -19.68462], [32.84446, -19.48343], [32.78282, -19.47513], [32.77966, -19.36098], [32.85107, -19.29238], [32.87088, -19.09279], [32.84006, -19.0262], [32.72118, -19.02204], [32.69917, -18.94293], [32.73439, -18.92628], [32.70137, -18.84712], [32.82465, -18.77419], [32.9017, -18.7992], [32.95013, -18.69079], [32.88629, -18.58023], [32.88629, -18.51344], [33.02278, -18.4696], [33.03159, -18.35054], [32.94133, -17.99705], [33.0492, -17.60298], [32.98536, -17.55891], [32.96554, -17.48964], [33.0426, -17.3468], [33.00517, -17.30477], [32.96554, -17.11971], [32.84113, -16.92259], [32.91051, -16.89446], [32.97655, -16.70689], [32.78943, -16.70267], [32.69917, -16.66893], [32.71017, -16.59932], [32.42838, -16.4727], [32.28529, -16.43892], [32.02772, -16.43892], [31.91324, -16.41569], [31.90223, -16.34388], [31.67988, -16.19595], [31.42451, -16.15154], [31.30563, -16.01193], [31.13171, -15.98019], [30.97761, -16.05848], [30.91597, -15.99924], [30.42568, -15.9962], [30.41902, -15.62269]]]] } }
23343   ] };
23344   var borders = borders_default;
23345   var whichPolygonGetter = {};
23346   var featuresByCode = {};
23347   var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi;
23348   function canonicalID(id2) {
23349     const s = id2 || "";
23350     if (s.charAt(0) === ".") {
23351       return s.toUpperCase();
23352     } else {
23353       return s.replace(idFilterRegex, "").toUpperCase();
23354     }
23355   }
23356   var levels = [
23357     "subterritory",
23358     "territory",
23359     "subcountryGroup",
23360     "country",
23361     "sharedLandform",
23362     "intermediateRegion",
23363     "subregion",
23364     "region",
23365     "subunion",
23366     "union",
23367     "unitedNations",
23368     "world"
23369   ];
23370   loadDerivedDataAndCaches(borders);
23371   function loadDerivedDataAndCaches(borders2) {
23372     const identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"];
23373     let geometryFeatures = [];
23374     borders2.features.forEach((feature22) => {
23375       feature22.properties.id = feature22.properties.iso1A2 || feature22.properties.m49 || feature22.properties.wikidata;
23376       loadM49(feature22);
23377       loadTLD(feature22);
23378       loadIsoStatus(feature22);
23379       loadLevel(feature22);
23380       loadGroups(feature22);
23381       loadFlag(feature22);
23382       cacheFeatureByIDs(feature22);
23383       if (feature22.geometry)
23384         geometryFeatures.push(feature22);
23385     });
23386     borders2.features.forEach((feature22) => {
23387       feature22.properties.groups = feature22.properties.groups.map((groupID) => {
23388         return featuresByCode[groupID].properties.id;
23389       });
23390       loadMembersForGroupsOf(feature22);
23391     });
23392     borders2.features.forEach((feature22) => {
23393       loadRoadSpeedUnit(feature22);
23394       loadRoadHeightUnit(feature22);
23395       loadDriveSide(feature22);
23396       loadCallingCodes(feature22);
23397       loadGroupGroups(feature22);
23398     });
23399     borders2.features.forEach((feature22) => {
23400       feature22.properties.groups.sort((groupID1, groupID2) => {
23401         return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level);
23402       });
23403       if (feature22.properties.members)
23404         feature22.properties.members.sort((id1, id2) => {
23405           const diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level);
23406           if (diff === 0) {
23407             return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]);
23408           }
23409           return diff;
23410         });
23411     });
23412     const geometryOnlyCollection = {
23413       type: "FeatureCollection",
23414       features: geometryFeatures
23415     };
23416     whichPolygonGetter = (0, import_which_polygon.default)(geometryOnlyCollection);
23417     function loadGroups(feature22) {
23418       const props = feature22.properties;
23419       if (!props.groups) {
23420         props.groups = [];
23421       }
23422       if (feature22.geometry && props.country) {
23423         props.groups.push(props.country);
23424       }
23425       if (props.m49 !== "001") {
23426         props.groups.push("001");
23427       }
23428     }
23429     function loadM49(feature22) {
23430       const props = feature22.properties;
23431       if (!props.m49 && props.iso1N3) {
23432         props.m49 = props.iso1N3;
23433       }
23434     }
23435     function loadTLD(feature22) {
23436       const props = feature22.properties;
23437       if (props.level === "unitedNations")
23438         return;
23439       if (!props.ccTLD && props.iso1A2) {
23440         props.ccTLD = "." + props.iso1A2.toLowerCase();
23441       }
23442     }
23443     function loadIsoStatus(feature22) {
23444       const props = feature22.properties;
23445       if (!props.isoStatus && props.iso1A2) {
23446         props.isoStatus = "official";
23447       }
23448     }
23449     function loadLevel(feature22) {
23450       const props = feature22.properties;
23451       if (props.level)
23452         return;
23453       if (!props.country) {
23454         props.level = "country";
23455       } else if (!props.iso1A2 || props.isoStatus === "official") {
23456         props.level = "territory";
23457       } else {
23458         props.level = "subterritory";
23459       }
23460     }
23461     function loadGroupGroups(feature22) {
23462       const props = feature22.properties;
23463       if (feature22.geometry || !props.members)
23464         return;
23465       const featureLevelIndex = levels.indexOf(props.level);
23466       let sharedGroups = [];
23467       props.members.forEach((memberID, index) => {
23468         const member = featuresByCode[memberID];
23469         const memberGroups = member.properties.groups.filter((groupID) => {
23470           return groupID !== feature22.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level);
23471         });
23472         if (index === 0) {
23473           sharedGroups = memberGroups;
23474         } else {
23475           sharedGroups = sharedGroups.filter((groupID) => memberGroups.indexOf(groupID) !== -1);
23476         }
23477       });
23478       props.groups = props.groups.concat(
23479         sharedGroups.filter((groupID) => props.groups.indexOf(groupID) === -1)
23480       );
23481       sharedGroups.forEach((groupID) => {
23482         const groupFeature = featuresByCode[groupID];
23483         if (groupFeature.properties.members.indexOf(props.id) === -1) {
23484           groupFeature.properties.members.push(props.id);
23485         }
23486       });
23487     }
23488     function loadRoadSpeedUnit(feature22) {
23489       const props = feature22.properties;
23490       if (feature22.geometry) {
23491         if (!props.roadSpeedUnit)
23492           props.roadSpeedUnit = "km/h";
23493       } else if (props.members) {
23494         const vals = Array.from(
23495           new Set(
23496             props.members.map((id2) => {
23497               const member = featuresByCode[id2];
23498               if (member.geometry)
23499                 return member.properties.roadSpeedUnit || "km/h";
23500             }).filter(Boolean)
23501           )
23502         );
23503         if (vals.length === 1)
23504           props.roadSpeedUnit = vals[0];
23505       }
23506     }
23507     function loadRoadHeightUnit(feature22) {
23508       const props = feature22.properties;
23509       if (feature22.geometry) {
23510         if (!props.roadHeightUnit)
23511           props.roadHeightUnit = "m";
23512       } else if (props.members) {
23513         const vals = Array.from(
23514           new Set(
23515             props.members.map((id2) => {
23516               const member = featuresByCode[id2];
23517               if (member.geometry)
23518                 return member.properties.roadHeightUnit || "m";
23519             }).filter(Boolean)
23520           )
23521         );
23522         if (vals.length === 1)
23523           props.roadHeightUnit = vals[0];
23524       }
23525     }
23526     function loadDriveSide(feature22) {
23527       const props = feature22.properties;
23528       if (feature22.geometry) {
23529         if (!props.driveSide)
23530           props.driveSide = "right";
23531       } else if (props.members) {
23532         const vals = Array.from(
23533           new Set(
23534             props.members.map((id2) => {
23535               const member = featuresByCode[id2];
23536               if (member.geometry)
23537                 return member.properties.driveSide || "right";
23538             }).filter(Boolean)
23539           )
23540         );
23541         if (vals.length === 1)
23542           props.driveSide = vals[0];
23543       }
23544     }
23545     function loadCallingCodes(feature22) {
23546       const props = feature22.properties;
23547       if (!feature22.geometry && props.members) {
23548         props.callingCodes = Array.from(
23549           new Set(
23550             props.members.reduce((array2, id2) => {
23551               const member = featuresByCode[id2];
23552               if (member.geometry && member.properties.callingCodes) {
23553                 return array2.concat(member.properties.callingCodes);
23554               }
23555               return array2;
23556             }, [])
23557           )
23558         );
23559       }
23560     }
23561     function loadFlag(feature22) {
23562       if (!feature22.properties.iso1A2)
23563         return;
23564       const flag = feature22.properties.iso1A2.replace(/./g, function(char) {
23565         return String.fromCodePoint(char.charCodeAt(0) + 127397);
23566       });
23567       feature22.properties.emojiFlag = flag;
23568     }
23569     function loadMembersForGroupsOf(feature22) {
23570       feature22.properties.groups.forEach((groupID) => {
23571         const groupFeature = featuresByCode[groupID];
23572         if (!groupFeature.properties.members) {
23573           groupFeature.properties.members = [];
23574         }
23575         groupFeature.properties.members.push(feature22.properties.id);
23576       });
23577     }
23578     function cacheFeatureByIDs(feature22) {
23579       let ids = [];
23580       identifierProps.forEach((prop) => {
23581         const id2 = feature22.properties[prop];
23582         if (id2)
23583           ids.push(id2);
23584       });
23585       (feature22.properties.aliases || []).forEach((alias) => {
23586         ids.push(alias);
23587       });
23588       ids.forEach((id2) => {
23589         let cid = canonicalID(id2);
23590         featuresByCode[cid] = feature22;
23591       });
23592     }
23593   }
23594   function locArray(loc) {
23595     if (Array.isArray(loc)) {
23596       return loc;
23597     } else if (loc.coordinates) {
23598       return loc.coordinates;
23599     }
23600     return loc.geometry.coordinates;
23601   }
23602   function smallestFeature(loc) {
23603     const query = locArray(loc);
23604     const featureProperties = whichPolygonGetter(query);
23605     if (!featureProperties)
23606       return null;
23607     return featuresByCode[featureProperties.id];
23608   }
23609   function countryFeature(loc) {
23610     const feature22 = smallestFeature(loc);
23611     if (!feature22)
23612       return null;
23613     const countryCode = feature22.properties.country || feature22.properties.iso1A2;
23614     return featuresByCode[countryCode] || null;
23615   }
23616   var defaultOpts = {
23617     level: void 0,
23618     maxLevel: void 0,
23619     withProp: void 0
23620   };
23621   function featureForLoc(loc, opts) {
23622     const targetLevel = opts.level || "country";
23623     const maxLevel = opts.maxLevel || "world";
23624     const withProp = opts.withProp;
23625     const targetLevelIndex = levels.indexOf(targetLevel);
23626     if (targetLevelIndex === -1)
23627       return null;
23628     const maxLevelIndex = levels.indexOf(maxLevel);
23629     if (maxLevelIndex === -1)
23630       return null;
23631     if (maxLevelIndex < targetLevelIndex)
23632       return null;
23633     if (targetLevel === "country") {
23634       const fastFeature = countryFeature(loc);
23635       if (fastFeature) {
23636         if (!withProp || fastFeature.properties[withProp]) {
23637           return fastFeature;
23638         }
23639       }
23640     }
23641     const features = featuresContaining(loc);
23642     const match = features.find((feature22) => {
23643       let levelIndex = levels.indexOf(feature22.properties.level);
23644       if (feature22.properties.level === targetLevel || levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) {
23645         if (!withProp || feature22.properties[withProp]) {
23646           return feature22;
23647         }
23648       }
23649       return false;
23650     });
23651     return match || null;
23652   }
23653   function featureForID(id2) {
23654     let stringID;
23655     if (typeof id2 === "number") {
23656       stringID = id2.toString();
23657       if (stringID.length === 1) {
23658         stringID = "00" + stringID;
23659       } else if (stringID.length === 2) {
23660         stringID = "0" + stringID;
23661       }
23662     } else {
23663       stringID = canonicalID(id2);
23664     }
23665     return featuresByCode[stringID] || null;
23666   }
23667   function smallestFeaturesForBbox(bbox2) {
23668     return whichPolygonGetter.bbox(bbox2).map((props) => featuresByCode[props.id]);
23669   }
23670   function smallestOrMatchingFeature(query) {
23671     if (typeof query === "object") {
23672       return smallestFeature(query);
23673     }
23674     return featureForID(query);
23675   }
23676   function feature(query, opts = defaultOpts) {
23677     if (typeof query === "object") {
23678       return featureForLoc(query, opts);
23679     }
23680     return featureForID(query);
23681   }
23682   function iso1A2Code(query, opts = defaultOpts) {
23683     opts.withProp = "iso1A2";
23684     const match = feature(query, opts);
23685     if (!match)
23686       return null;
23687     return match.properties.iso1A2 || null;
23688   }
23689   function featuresContaining(query, strict) {
23690     let matchingFeatures;
23691     if (Array.isArray(query) && query.length === 4) {
23692       matchingFeatures = smallestFeaturesForBbox(query);
23693     } else {
23694       const smallestOrMatching = smallestOrMatchingFeature(query);
23695       matchingFeatures = smallestOrMatching ? [smallestOrMatching] : [];
23696     }
23697     if (!matchingFeatures.length)
23698       return [];
23699     let returnFeatures;
23700     if (!strict || typeof query === "object") {
23701       returnFeatures = matchingFeatures.slice();
23702     } else {
23703       returnFeatures = [];
23704     }
23705     matchingFeatures.forEach((feature22) => {
23706       const properties = feature22.properties;
23707       properties.groups.forEach((groupID) => {
23708         const groupFeature = featuresByCode[groupID];
23709         if (returnFeatures.indexOf(groupFeature) === -1) {
23710           returnFeatures.push(groupFeature);
23711         }
23712       });
23713     });
23714     return returnFeatures;
23715   }
23716   function featuresIn(id2, strict) {
23717     const feature22 = featureForID(id2);
23718     if (!feature22)
23719       return [];
23720     let features = [];
23721     if (!strict) {
23722       features.push(feature22);
23723     }
23724     const properties = feature22.properties;
23725     (properties.members || []).forEach((memberID) => {
23726       features.push(featuresByCode[memberID]);
23727     });
23728     return features;
23729   }
23730   function aggregateFeature(id2) {
23731     const features = featuresIn(id2, false);
23732     if (features.length === 0)
23733       return null;
23734     let aggregateCoordinates = [];
23735     features.forEach((feature22) => {
23736       if (feature22.geometry && feature22.geometry.type === "MultiPolygon" && feature22.geometry.coordinates) {
23737         aggregateCoordinates = aggregateCoordinates.concat(feature22.geometry.coordinates);
23738       }
23739     });
23740     return {
23741       type: "Feature",
23742       properties: features[0].properties,
23743       geometry: {
23744         type: "MultiPolygon",
23745         coordinates: aggregateCoordinates
23746       }
23747     };
23748   }
23749   function roadSpeedUnit(query) {
23750     const feature22 = smallestOrMatchingFeature(query);
23751     return feature22 && feature22.properties.roadSpeedUnit || null;
23752   }
23753   function roadHeightUnit(query) {
23754     const feature22 = smallestOrMatchingFeature(query);
23755     return feature22 && feature22.properties.roadHeightUnit || null;
23756   }
23757
23758   // node_modules/@ideditor/location-conflation/index.mjs
23759   var import_geojson_area = __toESM(require_geojson_area(), 1);
23760   var import_circle_to_polygon = __toESM(require_circle_to_polygon(), 1);
23761   var import_polygon_clipping = __toESM(require_polygon_clipping_umd(), 1);
23762   var import_geojson_precision = __toESM(require_geojson_precision(), 1);
23763   var import_json_stringify_pretty_compact = __toESM(require_json_stringify_pretty_compact(), 1);
23764   var location_conflation_default = class {
23765     // constructor
23766     //
23767     // `fc`  Optional FeatureCollection of known features
23768     //
23769     // Optionally pass a GeoJSON FeatureCollection of known features which we can refer to later.
23770     // Each feature must have a filename-like `id`, for example: `something.geojson`
23771     //
23772     // {
23773     //   "type": "FeatureCollection"
23774     //   "features": [
23775     //     {
23776     //       "type": "Feature",
23777     //       "id": "philly_metro.geojson",
23778     //       "properties": { … },
23779     //       "geometry": { … }
23780     //     }
23781     //   ]
23782     // }
23783     constructor(fc) {
23784       this._cache = {};
23785       this._strict = true;
23786       if (fc && fc.type === "FeatureCollection" && Array.isArray(fc.features)) {
23787         fc.features.forEach((feature3) => {
23788           feature3.properties = feature3.properties || {};
23789           let props = feature3.properties;
23790           let id2 = feature3.id || props.id;
23791           if (!id2 || !/^\S+\.geojson$/i.test(id2))
23792             return;
23793           id2 = id2.toLowerCase();
23794           feature3.id = id2;
23795           props.id = id2;
23796           if (!props.area) {
23797             const area = import_geojson_area.default.geometry(feature3.geometry) / 1e6;
23798             props.area = Number(area.toFixed(2));
23799           }
23800           this._cache[id2] = feature3;
23801         });
23802       }
23803       let world = _cloneDeep(feature("Q2"));
23804       world.geometry = {
23805         type: "Polygon",
23806         coordinates: [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
23807       };
23808       world.id = "Q2";
23809       world.properties.id = "Q2";
23810       world.properties.area = import_geojson_area.default.geometry(world.geometry) / 1e6;
23811       this._cache.Q2 = world;
23812     }
23813     // validateLocation
23814     // `location`  The location to validate
23815     //
23816     // Pass a `location` value to validate
23817     //
23818     // Returns a result like:
23819     //   {
23820     //     type:     'point', 'geojson', or 'countrycoder'
23821     //     location:  the queried location
23822     //     id:        the stable identifier for the feature
23823     //   }
23824     // or `null` if the location is invalid
23825     //
23826     validateLocation(location) {
23827       if (Array.isArray(location) && (location.length === 2 || location.length === 3)) {
23828         const lon = location[0];
23829         const lat = location[1];
23830         const radius = location[2];
23831         if (Number.isFinite(lon) && lon >= -180 && lon <= 180 && Number.isFinite(lat) && lat >= -90 && lat <= 90 && (location.length === 2 || Number.isFinite(radius) && radius > 0)) {
23832           const id2 = "[" + location.toString() + "]";
23833           return { type: "point", location, id: id2 };
23834         }
23835       } else if (typeof location === "string" && /^\S+\.geojson$/i.test(location)) {
23836         const id2 = location.toLowerCase();
23837         if (this._cache[id2]) {
23838           return { type: "geojson", location, id: id2 };
23839         }
23840       } else if (typeof location === "string" || typeof location === "number") {
23841         const feature3 = feature(location);
23842         if (feature3) {
23843           const id2 = feature3.properties.wikidata;
23844           return { type: "countrycoder", location, id: id2 };
23845         }
23846       }
23847       if (this._strict) {
23848         throw new Error(`validateLocation:  Invalid location: "${location}".`);
23849       } else {
23850         return null;
23851       }
23852     }
23853     // resolveLocation
23854     // `location`  The location to resolve
23855     //
23856     // Pass a `location` value to resolve
23857     //
23858     // Returns a result like:
23859     //   {
23860     //     type:      'point', 'geojson', or 'countrycoder'
23861     //     location:  the queried location
23862     //     id:        a stable identifier for the feature
23863     //     feature:   the resolved GeoJSON feature
23864     //   }
23865     //  or `null` if the location is invalid
23866     //
23867     resolveLocation(location) {
23868       const valid = this.validateLocation(location);
23869       if (!valid)
23870         return null;
23871       const id2 = valid.id;
23872       if (this._cache[id2]) {
23873         return Object.assign(valid, { feature: this._cache[id2] });
23874       }
23875       if (valid.type === "point") {
23876         const lon = location[0];
23877         const lat = location[1];
23878         const radius = location[2] || 25;
23879         const EDGES = 10;
23880         const PRECISION = 3;
23881         const area = Math.PI * radius * radius;
23882         const feature3 = this._cache[id2] = (0, import_geojson_precision.default)({
23883           type: "Feature",
23884           id: id2,
23885           properties: { id: id2, area: Number(area.toFixed(2)) },
23886           geometry: (0, import_circle_to_polygon.default)([lon, lat], radius * 1e3, EDGES)
23887           // km to m
23888         }, PRECISION);
23889         return Object.assign(valid, { feature: feature3 });
23890       } else if (valid.type === "geojson") {
23891       } else if (valid.type === "countrycoder") {
23892         let feature3 = _cloneDeep(feature(id2));
23893         let props = feature3.properties;
23894         if (Array.isArray(props.members)) {
23895           let aggregate = aggregateFeature(id2);
23896           aggregate.geometry.coordinates = _clip([aggregate], "UNION").geometry.coordinates;
23897           feature3.geometry = aggregate.geometry;
23898         }
23899         if (!props.area) {
23900           const area = import_geojson_area.default.geometry(feature3.geometry) / 1e6;
23901           props.area = Number(area.toFixed(2));
23902         }
23903         feature3.id = id2;
23904         props.id = id2;
23905         this._cache[id2] = feature3;
23906         return Object.assign(valid, { feature: feature3 });
23907       }
23908       if (this._strict) {
23909         throw new Error(`resolveLocation:  Couldn't resolve location "${location}".`);
23910       } else {
23911         return null;
23912       }
23913     }
23914     // validateLocationSet
23915     // `locationSet`  the locationSet to validate
23916     //
23917     // Pass a locationSet Object to validate like:
23918     //   {
23919     //     include: [ Array of locations ],
23920     //     exclude: [ Array of locations ]
23921     //   }
23922     //
23923     // Returns a result like:
23924     //   {
23925     //     type:         'locationset'
23926     //     locationSet:  the queried locationSet
23927     //     id:           the stable identifier for the feature
23928     //   }
23929     // or `null` if the locationSet is invalid
23930     //
23931     validateLocationSet(locationSet) {
23932       locationSet = locationSet || {};
23933       const validator = this.validateLocation.bind(this);
23934       let include = (locationSet.include || []).map(validator).filter(Boolean);
23935       let exclude = (locationSet.exclude || []).map(validator).filter(Boolean);
23936       if (!include.length) {
23937         if (this._strict) {
23938           throw new Error(`validateLocationSet:  LocationSet includes nothing.`);
23939         } else {
23940           locationSet.include = ["Q2"];
23941           include = [{ type: "countrycoder", location: "Q2", id: "Q2" }];
23942         }
23943       }
23944       include.sort(_sortLocations);
23945       let id2 = "+[" + include.map((d) => d.id).join(",") + "]";
23946       if (exclude.length) {
23947         exclude.sort(_sortLocations);
23948         id2 += "-[" + exclude.map((d) => d.id).join(",") + "]";
23949       }
23950       return { type: "locationset", locationSet, id: id2 };
23951     }
23952     // resolveLocationSet
23953     // `locationSet`  the locationSet to resolve
23954     //
23955     // Pass a locationSet Object to validate like:
23956     //   {
23957     //     include: [ Array of locations ],
23958     //     exclude: [ Array of locations ]
23959     //   }
23960     //
23961     // Returns a result like:
23962     //   {
23963     //     type:         'locationset'
23964     //     locationSet:  the queried locationSet
23965     //     id:           the stable identifier for the feature
23966     //     feature:      the resolved GeoJSON feature
23967     //   }
23968     // or `null` if the locationSet is invalid
23969     //
23970     resolveLocationSet(locationSet) {
23971       locationSet = locationSet || {};
23972       const valid = this.validateLocationSet(locationSet);
23973       if (!valid)
23974         return null;
23975       const id2 = valid.id;
23976       if (this._cache[id2]) {
23977         return Object.assign(valid, { feature: this._cache[id2] });
23978       }
23979       const resolver = this.resolveLocation.bind(this);
23980       const includes = (locationSet.include || []).map(resolver).filter(Boolean);
23981       const excludes = (locationSet.exclude || []).map(resolver).filter(Boolean);
23982       if (includes.length === 1 && excludes.length === 0) {
23983         return Object.assign(valid, { feature: includes[0].feature });
23984       }
23985       const includeGeoJSON = _clip(includes.map((d) => d.feature), "UNION");
23986       const excludeGeoJSON = _clip(excludes.map((d) => d.feature), "UNION");
23987       let resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], "DIFFERENCE") : includeGeoJSON;
23988       const area = import_geojson_area.default.geometry(resultGeoJSON.geometry) / 1e6;
23989       resultGeoJSON.id = id2;
23990       resultGeoJSON.properties = { id: id2, area: Number(area.toFixed(2)) };
23991       this._cache[id2] = resultGeoJSON;
23992       return Object.assign(valid, { feature: resultGeoJSON });
23993     }
23994     // strict
23995     //
23996     strict(val) {
23997       if (val === void 0) {
23998         return this._strict;
23999       } else {
24000         this._strict = val;
24001         return this;
24002       }
24003     }
24004     // cache
24005     // convenience method to access the internal cache
24006     cache() {
24007       return this._cache;
24008     }
24009     // stringify
24010     // convenience method to prettyStringify the given object
24011     stringify(obj, options2) {
24012       return (0, import_json_stringify_pretty_compact.default)(obj, options2);
24013     }
24014   };
24015   function _clip(features, which) {
24016     if (!Array.isArray(features) || !features.length)
24017       return null;
24018     const fn = { UNION: import_polygon_clipping.default.union, DIFFERENCE: import_polygon_clipping.default.difference }[which];
24019     const args = features.map((feature3) => feature3.geometry.coordinates);
24020     const coords = fn.apply(null, args);
24021     return {
24022       type: "Feature",
24023       properties: {},
24024       geometry: {
24025         type: whichType(coords),
24026         coordinates: coords
24027       }
24028     };
24029     function whichType(coords2) {
24030       const a = Array.isArray(coords2);
24031       const b = a && Array.isArray(coords2[0]);
24032       const c = b && Array.isArray(coords2[0][0]);
24033       const d = c && Array.isArray(coords2[0][0][0]);
24034       return d ? "MultiPolygon" : "Polygon";
24035     }
24036   }
24037   function _cloneDeep(obj) {
24038     return JSON.parse(JSON.stringify(obj));
24039   }
24040   function _sortLocations(a, b) {
24041     const rank = { countrycoder: 1, geojson: 2, point: 3 };
24042     const aRank = rank[a.type];
24043     const bRank = rank[b.type];
24044     return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id);
24045   }
24046
24047   // modules/core/LocationManager.js
24048   var import_which_polygon2 = __toESM(require_which_polygon());
24049   var import_geojson_area2 = __toESM(require_geojson_area());
24050   var _loco = new location_conflation_default();
24051   var LocationManager = class {
24052     /**
24053      * @constructor
24054      */
24055     constructor() {
24056       this._wp = null;
24057       this._resolved = /* @__PURE__ */ new Map();
24058       this._knownLocationSets = /* @__PURE__ */ new Map();
24059       this._locationIncludedIn = /* @__PURE__ */ new Map();
24060       this._locationExcludedIn = /* @__PURE__ */ new Map();
24061       const world = { locationSet: { include: ["Q2"] } };
24062       this._resolveLocationSet(world);
24063       this._rebuildIndex();
24064     }
24065     /**
24066      * _validateLocationSet
24067      * Pass an Object with a `locationSet` property.
24068      * Validates the `locationSet` and sets a `locationSetID` property on the object.
24069      * To avoid so much computation we only resolve the include and exclude regions, but not the locationSet itself.
24070      *
24071      * Use `_resolveLocationSet()` instead if you need to resolve geojson of locationSet, for example to render it.
24072      * Note: You need to call `_rebuildIndex()` after you're all finished validating the locationSets.
24073      *
24074      * @param  `obj`  Object to check, it should have `locationSet` property
24075      */
24076     _validateLocationSet(obj) {
24077       if (obj.locationSetID)
24078         return;
24079       try {
24080         let locationSet = obj.locationSet;
24081         if (!locationSet) {
24082           throw new Error("object missing locationSet property");
24083         }
24084         if (!locationSet.include) {
24085           locationSet.include = ["Q2"];
24086         }
24087         const locationSetID = _loco.validateLocationSet(locationSet).id;
24088         obj.locationSetID = locationSetID;
24089         if (this._knownLocationSets.has(locationSetID))
24090           return;
24091         let area = 0;
24092         (locationSet.include || []).forEach((location) => {
24093           const locationID = _loco.validateLocation(location).id;
24094           let geojson = this._resolved.get(locationID);
24095           if (!geojson) {
24096             geojson = _loco.resolveLocation(location).feature;
24097             this._resolved.set(locationID, geojson);
24098           }
24099           area += geojson.properties.area;
24100           let s = this._locationIncludedIn.get(locationID);
24101           if (!s) {
24102             s = /* @__PURE__ */ new Set();
24103             this._locationIncludedIn.set(locationID, s);
24104           }
24105           s.add(locationSetID);
24106         });
24107         (locationSet.exclude || []).forEach((location) => {
24108           const locationID = _loco.validateLocation(location).id;
24109           let geojson = this._resolved.get(locationID);
24110           if (!geojson) {
24111             geojson = _loco.resolveLocation(location).feature;
24112             this._resolved.set(locationID, geojson);
24113           }
24114           area -= geojson.properties.area;
24115           let s = this._locationExcludedIn.get(locationID);
24116           if (!s) {
24117             s = /* @__PURE__ */ new Set();
24118             this._locationExcludedIn.set(locationID, s);
24119           }
24120           s.add(locationSetID);
24121         });
24122         this._knownLocationSets.set(locationSetID, area);
24123       } catch (err) {
24124         obj.locationSet = { include: ["Q2"] };
24125         obj.locationSetID = "+[Q2]";
24126       }
24127     }
24128     /**
24129      * _resolveLocationSet
24130      * Does everything that `_validateLocationSet()` does, but then "resolves" the locationSet into GeoJSON.
24131      * This step is a bit more computationally expensive, so really only needed if you intend to render the shape.
24132      *
24133      * Note: You need to call `_rebuildIndex()` after you're all finished validating the locationSets.
24134      *
24135      * @param  `obj`  Object to check, it should have `locationSet` property
24136      */
24137     _resolveLocationSet(obj) {
24138       this._validateLocationSet(obj);
24139       if (this._resolved.has(obj.locationSetID))
24140         return;
24141       try {
24142         const result = _loco.resolveLocationSet(obj.locationSet);
24143         const locationSetID = result.id;
24144         obj.locationSetID = locationSetID;
24145         if (!result.feature.geometry.coordinates.length || !result.feature.properties.area) {
24146           throw new Error(`locationSet ${locationSetID} resolves to an empty feature.`);
24147         }
24148         let geojson = JSON.parse(JSON.stringify(result.feature));
24149         geojson.id = locationSetID;
24150         geojson.properties.id = locationSetID;
24151         this._resolved.set(locationSetID, geojson);
24152       } catch (err) {
24153         obj.locationSet = { include: ["Q2"] };
24154         obj.locationSetID = "+[Q2]";
24155       }
24156     }
24157     /**
24158      * _rebuildIndex
24159      * Rebuilds the whichPolygon index with whatever features have been resolved into GeoJSON.
24160      */
24161     _rebuildIndex() {
24162       this._wp = (0, import_which_polygon2.default)({ features: [...this._resolved.values()] });
24163     }
24164     /**
24165      * mergeCustomGeoJSON
24166      * Accepts a FeatureCollection-like object containing custom locations
24167      * Each feature must have a filename-like `id`, for example: `something.geojson`
24168      * {
24169      *   "type": "FeatureCollection"
24170      *   "features": [
24171      *     {
24172      *       "type": "Feature",
24173      *       "id": "philly_metro.geojson",
24174      *       "properties": { … },
24175      *       "geometry": { … }
24176      *     }
24177      *   ]
24178      * }
24179      *
24180      * @param  `fc`  FeatureCollection-like Object containing custom locations
24181      */
24182     mergeCustomGeoJSON(fc) {
24183       if (!fc || fc.type !== "FeatureCollection" || !Array.isArray(fc.features))
24184         return;
24185       fc.features.forEach((feature3) => {
24186         feature3.properties = feature3.properties || {};
24187         let props = feature3.properties;
24188         let id2 = feature3.id || props.id;
24189         if (!id2 || !/^\S+\.geojson$/i.test(id2))
24190           return;
24191         id2 = id2.toLowerCase();
24192         feature3.id = id2;
24193         props.id = id2;
24194         if (!props.area) {
24195           const area = import_geojson_area2.default.geometry(feature3.geometry) / 1e6;
24196           props.area = Number(area.toFixed(2));
24197         }
24198         _loco._cache[id2] = feature3;
24199       });
24200     }
24201     /**
24202      * mergeLocationSets
24203      * Accepts an Array of Objects containing `locationSet` properties:
24204      * [
24205      *  { id: 'preset1', locationSet: {…} },
24206      *  { id: 'preset2', locationSet: {…} },
24207      *  …
24208      * ]
24209      * After validating, the Objects will be decorated with a `locationSetID` property:
24210      * [
24211      *  { id: 'preset1', locationSet: {…}, locationSetID: '+[Q2]' },
24212      *  { id: 'preset2', locationSet: {…}, locationSetID: '+[Q30]' },
24213      *  …
24214      * ]
24215      *
24216      * @param  `objects`  Objects to check - they should have `locationSet` property
24217      * @return  Promise resolved true (this function used to be slow/async, now it's faster and sync)
24218      */
24219     mergeLocationSets(objects) {
24220       if (!Array.isArray(objects))
24221         return Promise.reject("nothing to do");
24222       objects.forEach((obj) => this._validateLocationSet(obj));
24223       this._rebuildIndex();
24224       return Promise.resolve(objects);
24225     }
24226     /**
24227      * locationSetID
24228      * Returns a locationSetID for a given locationSet (fallback to `+[Q2]`, world)
24229      * (The locationSet doesn't necessarily need to be resolved to compute its `id`)
24230      *
24231      * @param  `locationSet`  A locationSet Object, e.g. `{ include: ['us'] }`
24232      * @return  String locationSetID, e.g. `+[Q30]`
24233      */
24234     locationSetID(locationSet) {
24235       let locationSetID;
24236       try {
24237         locationSetID = _loco.validateLocationSet(locationSet).id;
24238       } catch (err) {
24239         locationSetID = "+[Q2]";
24240       }
24241       return locationSetID;
24242     }
24243     /**
24244      * feature
24245      * Returns the resolved GeoJSON feature for a given locationSetID (fallback to 'world')
24246      * A GeoJSON feature:
24247      * {
24248      *   type: 'Feature',
24249      *   id: '+[Q30]',
24250      *   properties: { id: '+[Q30]', area: 21817019.17, … },
24251      *   geometry: { … }
24252      * }
24253      *
24254      * @param  `locationSetID`  String identifier, e.g. `+[Q30]`
24255      * @return  GeoJSON object (fallback to world)
24256      */
24257     feature(locationSetID = "+[Q2]") {
24258       const feature3 = this._resolved.get(locationSetID);
24259       return feature3 || this._resolved.get("+[Q2]");
24260     }
24261     /**
24262      * locationSetsAt
24263      * Find all the locationSets valid at the given location.
24264      * Results include the area (in km²) to facilitate sorting.
24265      *
24266      * Object of locationSetIDs to areas (in km²)
24267      * {
24268      *   "+[Q2]": 511207893.3958111,
24269      *   "+[Q30]": 21817019.17,
24270      *   "+[new_jersey.geojson]": 22390.77,
24271      *   …
24272      * }
24273      *
24274      * @param  `loc`  `[lon,lat]` location to query, e.g. `[-74.4813, 40.7967]`
24275      * @return  Object of locationSetIDs valid at given location
24276      */
24277     locationSetsAt(loc) {
24278       let result = {};
24279       const hits = this._wp(loc, true) || [];
24280       const thiz = this;
24281       hits.forEach((prop) => {
24282         if (prop.id[0] !== "+")
24283           return;
24284         const locationSetID = prop.id;
24285         const area = thiz._knownLocationSets.get(locationSetID);
24286         if (area) {
24287           result[locationSetID] = area;
24288         }
24289       });
24290       hits.forEach((prop) => {
24291         if (prop.id[0] === "+")
24292           return;
24293         const locationID = prop.id;
24294         const included = thiz._locationIncludedIn.get(locationID);
24295         (included || []).forEach((locationSetID) => {
24296           const area = thiz._knownLocationSets.get(locationSetID);
24297           if (area) {
24298             result[locationSetID] = area;
24299           }
24300         });
24301       });
24302       hits.forEach((prop) => {
24303         if (prop.id[0] === "+")
24304           return;
24305         const locationID = prop.id;
24306         const excluded = thiz._locationExcludedIn.get(locationID);
24307         (excluded || []).forEach((locationSetID) => {
24308           delete result[locationSetID];
24309         });
24310       });
24311       return result;
24312     }
24313     // Direct access to the location-conflation resolver
24314     loco() {
24315       return _loco;
24316     }
24317   };
24318   var _sharedLocationManager = new LocationManager();
24319
24320   // node_modules/lodash-es/_freeGlobal.js
24321   var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
24322   var freeGlobal_default = freeGlobal;
24323
24324   // node_modules/lodash-es/_root.js
24325   var freeSelf = typeof self == "object" && self && self.Object === Object && self;
24326   var root2 = freeGlobal_default || freeSelf || Function("return this")();
24327   var root_default = root2;
24328
24329   // node_modules/lodash-es/_Symbol.js
24330   var Symbol2 = root_default.Symbol;
24331   var Symbol_default = Symbol2;
24332
24333   // node_modules/lodash-es/_getRawTag.js
24334   var objectProto = Object.prototype;
24335   var hasOwnProperty = objectProto.hasOwnProperty;
24336   var nativeObjectToString = objectProto.toString;
24337   var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0;
24338   function getRawTag(value) {
24339     var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
24340     try {
24341       value[symToStringTag] = void 0;
24342       var unmasked = true;
24343     } catch (e) {
24344     }
24345     var result = nativeObjectToString.call(value);
24346     if (unmasked) {
24347       if (isOwn) {
24348         value[symToStringTag] = tag;
24349       } else {
24350         delete value[symToStringTag];
24351       }
24352     }
24353     return result;
24354   }
24355   var getRawTag_default = getRawTag;
24356
24357   // node_modules/lodash-es/_objectToString.js
24358   var objectProto2 = Object.prototype;
24359   var nativeObjectToString2 = objectProto2.toString;
24360   function objectToString(value) {
24361     return nativeObjectToString2.call(value);
24362   }
24363   var objectToString_default = objectToString;
24364
24365   // node_modules/lodash-es/_baseGetTag.js
24366   var nullTag = "[object Null]";
24367   var undefinedTag = "[object Undefined]";
24368   var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0;
24369   function baseGetTag(value) {
24370     if (value == null) {
24371       return value === void 0 ? undefinedTag : nullTag;
24372     }
24373     return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value);
24374   }
24375   var baseGetTag_default = baseGetTag;
24376
24377   // node_modules/lodash-es/isObjectLike.js
24378   function isObjectLike(value) {
24379     return value != null && typeof value == "object";
24380   }
24381   var isObjectLike_default = isObjectLike;
24382
24383   // node_modules/lodash-es/isSymbol.js
24384   var symbolTag = "[object Symbol]";
24385   function isSymbol(value) {
24386     return typeof value == "symbol" || isObjectLike_default(value) && baseGetTag_default(value) == symbolTag;
24387   }
24388   var isSymbol_default = isSymbol;
24389
24390   // node_modules/lodash-es/_arrayMap.js
24391   function arrayMap(array2, iteratee) {
24392     var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
24393     while (++index < length) {
24394       result[index] = iteratee(array2[index], index, array2);
24395     }
24396     return result;
24397   }
24398   var arrayMap_default = arrayMap;
24399
24400   // node_modules/lodash-es/isArray.js
24401   var isArray = Array.isArray;
24402   var isArray_default = isArray;
24403
24404   // node_modules/lodash-es/_baseToString.js
24405   var INFINITY = 1 / 0;
24406   var symbolProto = Symbol_default ? Symbol_default.prototype : void 0;
24407   var symbolToString = symbolProto ? symbolProto.toString : void 0;
24408   function baseToString(value) {
24409     if (typeof value == "string") {
24410       return value;
24411     }
24412     if (isArray_default(value)) {
24413       return arrayMap_default(value, baseToString) + "";
24414     }
24415     if (isSymbol_default(value)) {
24416       return symbolToString ? symbolToString.call(value) : "";
24417     }
24418     var result = value + "";
24419     return result == "0" && 1 / value == -INFINITY ? "-0" : result;
24420   }
24421   var baseToString_default = baseToString;
24422
24423   // node_modules/lodash-es/_trimmedEndIndex.js
24424   var reWhitespace = /\s/;
24425   function trimmedEndIndex(string) {
24426     var index = string.length;
24427     while (index-- && reWhitespace.test(string.charAt(index))) {
24428     }
24429     return index;
24430   }
24431   var trimmedEndIndex_default = trimmedEndIndex;
24432
24433   // node_modules/lodash-es/_baseTrim.js
24434   var reTrimStart = /^\s+/;
24435   function baseTrim(string) {
24436     return string ? string.slice(0, trimmedEndIndex_default(string) + 1).replace(reTrimStart, "") : string;
24437   }
24438   var baseTrim_default = baseTrim;
24439
24440   // node_modules/lodash-es/isObject.js
24441   function isObject(value) {
24442     var type2 = typeof value;
24443     return value != null && (type2 == "object" || type2 == "function");
24444   }
24445   var isObject_default = isObject;
24446
24447   // node_modules/lodash-es/toNumber.js
24448   var NAN = 0 / 0;
24449   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
24450   var reIsBinary = /^0b[01]+$/i;
24451   var reIsOctal = /^0o[0-7]+$/i;
24452   var freeParseInt = parseInt;
24453   function toNumber(value) {
24454     if (typeof value == "number") {
24455       return value;
24456     }
24457     if (isSymbol_default(value)) {
24458       return NAN;
24459     }
24460     if (isObject_default(value)) {
24461       var other = typeof value.valueOf == "function" ? value.valueOf() : value;
24462       value = isObject_default(other) ? other + "" : other;
24463     }
24464     if (typeof value != "string") {
24465       return value === 0 ? value : +value;
24466     }
24467     value = baseTrim_default(value);
24468     var isBinary = reIsBinary.test(value);
24469     return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
24470   }
24471   var toNumber_default = toNumber;
24472
24473   // node_modules/lodash-es/toString.js
24474   function toString(value) {
24475     return value == null ? "" : baseToString_default(value);
24476   }
24477   var toString_default = toString;
24478
24479   // node_modules/lodash-es/_basePropertyOf.js
24480   function basePropertyOf(object) {
24481     return function(key) {
24482       return object == null ? void 0 : object[key];
24483     };
24484   }
24485   var basePropertyOf_default = basePropertyOf;
24486
24487   // node_modules/lodash-es/now.js
24488   var now2 = function() {
24489     return root_default.Date.now();
24490   };
24491   var now_default = now2;
24492
24493   // node_modules/lodash-es/debounce.js
24494   var FUNC_ERROR_TEXT = "Expected a function";
24495   var nativeMax = Math.max;
24496   var nativeMin = Math.min;
24497   function debounce(func, wait, options2) {
24498     var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
24499     if (typeof func != "function") {
24500       throw new TypeError(FUNC_ERROR_TEXT);
24501     }
24502     wait = toNumber_default(wait) || 0;
24503     if (isObject_default(options2)) {
24504       leading = !!options2.leading;
24505       maxing = "maxWait" in options2;
24506       maxWait = maxing ? nativeMax(toNumber_default(options2.maxWait) || 0, wait) : maxWait;
24507       trailing = "trailing" in options2 ? !!options2.trailing : trailing;
24508     }
24509     function invokeFunc(time) {
24510       var args = lastArgs, thisArg = lastThis;
24511       lastArgs = lastThis = void 0;
24512       lastInvokeTime = time;
24513       result = func.apply(thisArg, args);
24514       return result;
24515     }
24516     function leadingEdge(time) {
24517       lastInvokeTime = time;
24518       timerId = setTimeout(timerExpired, wait);
24519       return leading ? invokeFunc(time) : result;
24520     }
24521     function remainingWait(time) {
24522       var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
24523       return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
24524     }
24525     function shouldInvoke(time) {
24526       var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
24527       return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
24528     }
24529     function timerExpired() {
24530       var time = now_default();
24531       if (shouldInvoke(time)) {
24532         return trailingEdge(time);
24533       }
24534       timerId = setTimeout(timerExpired, remainingWait(time));
24535     }
24536     function trailingEdge(time) {
24537       timerId = void 0;
24538       if (trailing && lastArgs) {
24539         return invokeFunc(time);
24540       }
24541       lastArgs = lastThis = void 0;
24542       return result;
24543     }
24544     function cancel() {
24545       if (timerId !== void 0) {
24546         clearTimeout(timerId);
24547       }
24548       lastInvokeTime = 0;
24549       lastArgs = lastCallTime = lastThis = timerId = void 0;
24550     }
24551     function flush() {
24552       return timerId === void 0 ? result : trailingEdge(now_default());
24553     }
24554     function debounced() {
24555       var time = now_default(), isInvoking = shouldInvoke(time);
24556       lastArgs = arguments;
24557       lastThis = this;
24558       lastCallTime = time;
24559       if (isInvoking) {
24560         if (timerId === void 0) {
24561           return leadingEdge(lastCallTime);
24562         }
24563         if (maxing) {
24564           clearTimeout(timerId);
24565           timerId = setTimeout(timerExpired, wait);
24566           return invokeFunc(lastCallTime);
24567         }
24568       }
24569       if (timerId === void 0) {
24570         timerId = setTimeout(timerExpired, wait);
24571       }
24572       return result;
24573     }
24574     debounced.cancel = cancel;
24575     debounced.flush = flush;
24576     return debounced;
24577   }
24578   var debounce_default = debounce;
24579
24580   // node_modules/lodash-es/_escapeHtmlChar.js
24581   var htmlEscapes = {
24582     "&": "&amp;",
24583     "<": "&lt;",
24584     ">": "&gt;",
24585     '"': "&quot;",
24586     "'": "&#39;"
24587   };
24588   var escapeHtmlChar = basePropertyOf_default(htmlEscapes);
24589   var escapeHtmlChar_default = escapeHtmlChar;
24590
24591   // node_modules/lodash-es/escape.js
24592   var reUnescapedHtml = /[&<>"']/g;
24593   var reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
24594   function escape2(string) {
24595     string = toString_default(string);
24596     return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar_default) : string;
24597   }
24598   var escape_default = escape2;
24599
24600   // node_modules/lodash-es/throttle.js
24601   var FUNC_ERROR_TEXT2 = "Expected a function";
24602   function throttle(func, wait, options2) {
24603     var leading = true, trailing = true;
24604     if (typeof func != "function") {
24605       throw new TypeError(FUNC_ERROR_TEXT2);
24606     }
24607     if (isObject_default(options2)) {
24608       leading = "leading" in options2 ? !!options2.leading : leading;
24609       trailing = "trailing" in options2 ? !!options2.trailing : trailing;
24610     }
24611     return debounce_default(func, wait, {
24612       "leading": leading,
24613       "maxWait": wait,
24614       "trailing": trailing
24615     });
24616   }
24617   var throttle_default = throttle;
24618
24619   // node_modules/lodash-es/_unescapeHtmlChar.js
24620   var htmlUnescapes = {
24621     "&amp;": "&",
24622     "&lt;": "<",
24623     "&gt;": ">",
24624     "&quot;": '"',
24625     "&#39;": "'"
24626   };
24627   var unescapeHtmlChar = basePropertyOf_default(htmlUnescapes);
24628   var unescapeHtmlChar_default = unescapeHtmlChar;
24629
24630   // node_modules/lodash-es/unescape.js
24631   var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;
24632   var reHasEscapedHtml = RegExp(reEscapedHtml.source);
24633   function unescape2(string) {
24634     string = toString_default(string);
24635     return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar_default) : string;
24636   }
24637   var unescape_default = unescape2;
24638
24639   // modules/util/detect.js
24640   var _detected;
24641   function utilDetect(refresh2) {
24642     if (_detected && !refresh2)
24643       return _detected;
24644     _detected = {};
24645     const ua = navigator.userAgent;
24646     let m = null;
24647     m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);
24648     if (m !== null) {
24649       _detected.browser = m[1];
24650       _detected.version = m[2];
24651     }
24652     if (!_detected.browser) {
24653       m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);
24654       if (m !== null) {
24655         _detected.browser = "msie";
24656         _detected.version = m[1];
24657       }
24658     }
24659     if (!_detected.browser) {
24660       m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);
24661       if (m !== null) {
24662         _detected.browser = "Opera";
24663         _detected.version = m[2];
24664       }
24665     }
24666     if (!_detected.browser) {
24667       m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
24668       if (m !== null) {
24669         _detected.browser = m[1];
24670         _detected.version = m[2];
24671         m = ua.match(/version\/([\.\d]+)/i);
24672         if (m !== null)
24673           _detected.version = m[1];
24674       }
24675     }
24676     if (!_detected.browser) {
24677       _detected.browser = navigator.appName;
24678       _detected.version = navigator.appVersion;
24679     }
24680     _detected.version = _detected.version.split(/\W/).slice(0, 2).join(".");
24681     _detected.opera = _detected.browser.toLowerCase() === "opera" && Number(_detected.version) < 15;
24682     if (_detected.browser.toLowerCase() === "msie") {
24683       _detected.ie = true;
24684       _detected.browser = "Internet Explorer";
24685       _detected.support = false;
24686     } else {
24687       _detected.ie = false;
24688       _detected.support = true;
24689     }
24690     _detected.filedrop = window.FileReader && "ondrop" in window;
24691     if (/Win/.test(ua)) {
24692       _detected.os = "win";
24693       _detected.platform = "Windows";
24694     } else if (/Mac/.test(ua)) {
24695       _detected.os = "mac";
24696       _detected.platform = "Macintosh";
24697     } else if (/X11/.test(ua) || /Linux/.test(ua)) {
24698       _detected.os = "linux";
24699       _detected.platform = "Linux";
24700     } else {
24701       _detected.os = "win";
24702       _detected.platform = "Unknown";
24703     }
24704     _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent,
24705     // so assume any "mac" with multitouch is actually iOS
24706     navigator.platform === "MacIntel" && "maxTouchPoints" in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream;
24707     _detected.browserLocales = Array.from(new Set(
24708       // remove duplicates
24709       [navigator.language].concat(navigator.languages || []).concat([
24710         // old property for backwards compatibility
24711         navigator.userLanguage
24712       ]).filter(Boolean)
24713     ));
24714     const loc = window.top.location;
24715     let origin = loc.origin;
24716     if (!origin) {
24717       origin = loc.protocol + "//" + loc.hostname + (loc.port ? ":" + loc.port : "");
24718     }
24719     _detected.host = origin + loc.pathname;
24720     return _detected;
24721   }
24722
24723   // modules/util/aes.js
24724   var import_aes_js = __toESM(require_aes_js());
24725   var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
24726   function utilAesEncrypt(text2, key) {
24727     key = key || DEFAULT_128;
24728     const textBytes = import_aes_js.default.utils.utf8.toBytes(text2);
24729     const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key);
24730     const encryptedBytes = aesCtr.encrypt(textBytes);
24731     const encryptedHex = import_aes_js.default.utils.hex.fromBytes(encryptedBytes);
24732     return encryptedHex;
24733   }
24734   function utilAesDecrypt(encryptedHex, key) {
24735     key = key || DEFAULT_128;
24736     const encryptedBytes = import_aes_js.default.utils.hex.toBytes(encryptedHex);
24737     const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key);
24738     const decryptedBytes = aesCtr.decrypt(encryptedBytes);
24739     const text2 = import_aes_js.default.utils.utf8.fromBytes(decryptedBytes);
24740     return text2;
24741   }
24742
24743   // modules/util/clean_tags.js
24744   function utilCleanTags(tags) {
24745     var out = {};
24746     for (var k in tags) {
24747       if (!k)
24748         continue;
24749       var v = tags[k];
24750       if (v !== void 0) {
24751         out[k] = cleanValue(k, v);
24752       }
24753     }
24754     return out;
24755     function cleanValue(k2, v2) {
24756       function keepSpaces(k3) {
24757         return /_hours|_times|:conditional$/.test(k3);
24758       }
24759       function skip(k3) {
24760         return /^(description|note|fixme)$/.test(k3);
24761       }
24762       if (skip(k2))
24763         return v2;
24764       var cleaned = v2.split(";").map(function(s) {
24765         return s.trim();
24766       }).join(keepSpaces(k2) ? "; " : ";");
24767       if (k2.indexOf("website") !== -1 || k2.indexOf("email") !== -1 || cleaned.indexOf("http") === 0) {
24768         cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, "");
24769       }
24770       return cleaned;
24771     }
24772   }
24773
24774   // modules/util/get_set_value.js
24775   function utilGetSetValue(selection2, value) {
24776     function d3_selection_value(value2) {
24777       function valueNull() {
24778         delete this.value;
24779       }
24780       function valueConstant() {
24781         if (this.value !== value2) {
24782           this.value = value2;
24783         }
24784       }
24785       function valueFunction() {
24786         var x = value2.apply(this, arguments);
24787         if (x === null || x === void 0) {
24788           delete this.value;
24789         } else if (this.value !== x) {
24790           this.value = x;
24791         }
24792       }
24793       return value2 === null || value2 === void 0 ? valueNull : typeof value2 === "function" ? valueFunction : valueConstant;
24794     }
24795     if (arguments.length === 1) {
24796       return selection2.property("value");
24797     }
24798     return selection2.each(d3_selection_value(value));
24799   }
24800
24801   // modules/util/keybinding.js
24802   function utilKeybinding(namespace) {
24803     var _keybindings = {};
24804     function testBindings(d3_event, isCapturing) {
24805       var didMatch = false;
24806       var bindings = Object.keys(_keybindings).map(function(id2) {
24807         return _keybindings[id2];
24808       });
24809       var i2, binding;
24810       for (i2 = 0; i2 < bindings.length; i2++) {
24811         binding = bindings[i2];
24812         if (!binding.event.modifiers.shiftKey)
24813           continue;
24814         if (!!binding.capture !== isCapturing)
24815           continue;
24816         if (matches(d3_event, binding, true)) {
24817           binding.callback(d3_event);
24818           didMatch = true;
24819           break;
24820         }
24821       }
24822       if (didMatch)
24823         return;
24824       for (i2 = 0; i2 < bindings.length; i2++) {
24825         binding = bindings[i2];
24826         if (binding.event.modifiers.shiftKey)
24827           continue;
24828         if (!!binding.capture !== isCapturing)
24829           continue;
24830         if (matches(d3_event, binding, false)) {
24831           binding.callback(d3_event);
24832           break;
24833         }
24834       }
24835       function matches(d3_event2, binding2, testShift) {
24836         var event = d3_event2;
24837         var isMatch = false;
24838         var tryKeyCode = true;
24839         if (event.key !== void 0) {
24840           tryKeyCode = event.key.charCodeAt(0) > 127;
24841           isMatch = true;
24842           if (binding2.event.key === void 0) {
24843             isMatch = false;
24844           } else if (Array.isArray(binding2.event.key)) {
24845             if (binding2.event.key.map(function(s) {
24846               return s.toLowerCase();
24847             }).indexOf(event.key.toLowerCase()) === -1) {
24848               isMatch = false;
24849             }
24850           } else {
24851             if (event.key.toLowerCase() !== binding2.event.key.toLowerCase()) {
24852               isMatch = false;
24853             }
24854           }
24855         }
24856         if (!isMatch && (tryKeyCode || binding2.event.modifiers.altKey)) {
24857           isMatch = event.keyCode === binding2.event.keyCode;
24858         }
24859         if (!isMatch)
24860           return false;
24861         if (!(event.ctrlKey && event.altKey)) {
24862           if (event.ctrlKey !== binding2.event.modifiers.ctrlKey)
24863             return false;
24864           if (event.altKey !== binding2.event.modifiers.altKey)
24865             return false;
24866         }
24867         if (event.metaKey !== binding2.event.modifiers.metaKey)
24868           return false;
24869         if (testShift && event.shiftKey !== binding2.event.modifiers.shiftKey)
24870           return false;
24871         return true;
24872       }
24873     }
24874     function capture(d3_event) {
24875       testBindings(d3_event, true);
24876     }
24877     function bubble(d3_event) {
24878       var tagName = select_default2(d3_event.target).node().tagName;
24879       if (tagName === "INPUT" || tagName === "SELECT" || tagName === "TEXTAREA") {
24880         return;
24881       }
24882       testBindings(d3_event, false);
24883     }
24884     function keybinding(selection2) {
24885       selection2 = selection2 || select_default2(document);
24886       selection2.on("keydown.capture." + namespace, capture, true);
24887       selection2.on("keydown.bubble." + namespace, bubble, false);
24888       return keybinding;
24889     }
24890     keybinding.unbind = function(selection2) {
24891       _keybindings = [];
24892       selection2 = selection2 || select_default2(document);
24893       selection2.on("keydown.capture." + namespace, null);
24894       selection2.on("keydown.bubble." + namespace, null);
24895       return keybinding;
24896     };
24897     keybinding.clear = function() {
24898       _keybindings = {};
24899       return keybinding;
24900     };
24901     keybinding.off = function(codes, capture2) {
24902       var arr = utilArrayUniq([].concat(codes));
24903       for (var i2 = 0; i2 < arr.length; i2++) {
24904         var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble");
24905         delete _keybindings[id2];
24906       }
24907       return keybinding;
24908     };
24909     keybinding.on = function(codes, callback, capture2) {
24910       if (typeof callback !== "function") {
24911         return keybinding.off(codes, capture2);
24912       }
24913       var arr = utilArrayUniq([].concat(codes));
24914       for (var i2 = 0; i2 < arr.length; i2++) {
24915         var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble");
24916         var binding = {
24917           id: id2,
24918           capture: capture2,
24919           callback,
24920           event: {
24921             key: void 0,
24922             // preferred
24923             keyCode: 0,
24924             // fallback
24925             modifiers: {
24926               shiftKey: false,
24927               ctrlKey: false,
24928               altKey: false,
24929               metaKey: false
24930             }
24931           }
24932         };
24933         if (_keybindings[id2]) {
24934           console.warn('warning: duplicate keybinding for "' + id2 + '"');
24935         }
24936         _keybindings[id2] = binding;
24937         var matches = arr[i2].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
24938         for (var j2 = 0; j2 < matches.length; j2++) {
24939           if (matches[j2] === "++")
24940             matches[j2] = "+";
24941           if (matches[j2] in utilKeybinding.modifierCodes) {
24942             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j2]]];
24943             binding.event.modifiers[prop] = true;
24944           } else {
24945             binding.event.key = utilKeybinding.keys[matches[j2]] || matches[j2];
24946             if (matches[j2] in utilKeybinding.keyCodes) {
24947               binding.event.keyCode = utilKeybinding.keyCodes[matches[j2]];
24948             }
24949           }
24950         }
24951       }
24952       return keybinding;
24953     };
24954     return keybinding;
24955   }
24956   utilKeybinding.modifierCodes = {
24957     // Shift key, ⇧
24958     "\u21E7": 16,
24959     shift: 16,
24960     // CTRL key, on Mac: ⌃
24961     "\u2303": 17,
24962     ctrl: 17,
24963     // ALT key, on Mac: ⌥ (Alt)
24964     "\u2325": 18,
24965     alt: 18,
24966     option: 18,
24967     // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
24968     "\u2318": 91,
24969     meta: 91,
24970     cmd: 91,
24971     "super": 91,
24972     win: 91
24973   };
24974   utilKeybinding.modifierProperties = {
24975     16: "shiftKey",
24976     17: "ctrlKey",
24977     18: "altKey",
24978     91: "metaKey"
24979   };
24980   utilKeybinding.plusKeys = ["plus", "ffplus", "=", "ffequals", "\u2260", "\xB1"];
24981   utilKeybinding.minusKeys = ["_", "-", "ffminus", "dash", "\u2013", "\u2014"];
24982   utilKeybinding.keys = {
24983     // Backspace key, on Mac: ⌫ (Backspace)
24984     "\u232B": "Backspace",
24985     backspace: "Backspace",
24986     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
24987     "\u21E5": "Tab",
24988     "\u21C6": "Tab",
24989     tab: "Tab",
24990     // Return key, ↩
24991     "\u21A9": "Enter",
24992     "\u21B5": "Enter",
24993     "\u23CE": "Enter",
24994     "return": "Enter",
24995     enter: "Enter",
24996     "\u2305": "Enter",
24997     // Pause/Break key
24998     "pause": "Pause",
24999     "pause-break": "Pause",
25000     // Caps Lock key, ⇪
25001     "\u21EA": "CapsLock",
25002     caps: "CapsLock",
25003     "caps-lock": "CapsLock",
25004     // Escape key, on Mac: ⎋, on Windows: Esc
25005     "\u238B": ["Escape", "Esc"],
25006     escape: ["Escape", "Esc"],
25007     esc: ["Escape", "Esc"],
25008     // Space key
25009     space: [" ", "Spacebar"],
25010     // Page-Up key, or pgup, on Mac: ↖
25011     "\u2196": "PageUp",
25012     pgup: "PageUp",
25013     "page-up": "PageUp",
25014     // Page-Down key, or pgdown, on Mac: ↘
25015     "\u2198": "PageDown",
25016     pgdown: "PageDown",
25017     "page-down": "PageDown",
25018     // END key, on Mac: ⇟
25019     "\u21DF": "End",
25020     end: "End",
25021     // HOME key, on Mac: ⇞
25022     "\u21DE": "Home",
25023     home: "Home",
25024     // Insert key, or ins
25025     ins: "Insert",
25026     insert: "Insert",
25027     // Delete key, on Mac: ⌦ (Delete)
25028     "\u2326": ["Delete", "Del"],
25029     del: ["Delete", "Del"],
25030     "delete": ["Delete", "Del"],
25031     // Left Arrow Key, or ←
25032     "\u2190": ["ArrowLeft", "Left"],
25033     left: ["ArrowLeft", "Left"],
25034     "arrow-left": ["ArrowLeft", "Left"],
25035     // Up Arrow Key, or ↑
25036     "\u2191": ["ArrowUp", "Up"],
25037     up: ["ArrowUp", "Up"],
25038     "arrow-up": ["ArrowUp", "Up"],
25039     // Right Arrow Key, or →
25040     "\u2192": ["ArrowRight", "Right"],
25041     right: ["ArrowRight", "Right"],
25042     "arrow-right": ["ArrowRight", "Right"],
25043     // Up Arrow Key, or ↓
25044     "\u2193": ["ArrowDown", "Down"],
25045     down: ["ArrowDown", "Down"],
25046     "arrow-down": ["ArrowDown", "Down"],
25047     // odities, stuff for backward compatibility (browsers and code):
25048     // Num-Multiply, or *
25049     "*": ["*", "Multiply"],
25050     star: ["*", "Multiply"],
25051     asterisk: ["*", "Multiply"],
25052     multiply: ["*", "Multiply"],
25053     // Num-Plus or +
25054     "+": ["+", "Add"],
25055     "plus": ["+", "Add"],
25056     // Num-Subtract, or -
25057     "-": ["-", "Subtract"],
25058     subtract: ["-", "Subtract"],
25059     "dash": ["-", "Subtract"],
25060     // Semicolon
25061     semicolon: ";",
25062     // = or equals
25063     equals: "=",
25064     // Comma, or ,
25065     comma: ",",
25066     // Period, or ., or full-stop
25067     period: ".",
25068     "full-stop": ".",
25069     // Slash, or /, or forward-slash
25070     slash: "/",
25071     "forward-slash": "/",
25072     // Tick, or `, or back-quote
25073     tick: "`",
25074     "back-quote": "`",
25075     // Open bracket, or [
25076     "open-bracket": "[",
25077     // Back slash, or \
25078     "back-slash": "\\",
25079     // Close backet, or ]
25080     "close-bracket": "]",
25081     // Apostrophe, or Quote, or '
25082     quote: "'",
25083     apostrophe: "'",
25084     // NUMPAD 0-9
25085     "num-0": "0",
25086     "num-1": "1",
25087     "num-2": "2",
25088     "num-3": "3",
25089     "num-4": "4",
25090     "num-5": "5",
25091     "num-6": "6",
25092     "num-7": "7",
25093     "num-8": "8",
25094     "num-9": "9",
25095     // F1-F25
25096     f1: "F1",
25097     f2: "F2",
25098     f3: "F3",
25099     f4: "F4",
25100     f5: "F5",
25101     f6: "F6",
25102     f7: "F7",
25103     f8: "F8",
25104     f9: "F9",
25105     f10: "F10",
25106     f11: "F11",
25107     f12: "F12",
25108     f13: "F13",
25109     f14: "F14",
25110     f15: "F15",
25111     f16: "F16",
25112     f17: "F17",
25113     f18: "F18",
25114     f19: "F19",
25115     f20: "F20",
25116     f21: "F21",
25117     f22: "F22",
25118     f23: "F23",
25119     f24: "F24",
25120     f25: "F25"
25121   };
25122   utilKeybinding.keyCodes = {
25123     // Backspace key, on Mac: ⌫ (Backspace)
25124     "\u232B": 8,
25125     backspace: 8,
25126     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
25127     "\u21E5": 9,
25128     "\u21C6": 9,
25129     tab: 9,
25130     // Return key, ↩
25131     "\u21A9": 13,
25132     "\u21B5": 13,
25133     "\u23CE": 13,
25134     "return": 13,
25135     enter: 13,
25136     "\u2305": 13,
25137     // Pause/Break key
25138     "pause": 19,
25139     "pause-break": 19,
25140     // Caps Lock key, ⇪
25141     "\u21EA": 20,
25142     caps: 20,
25143     "caps-lock": 20,
25144     // Escape key, on Mac: ⎋, on Windows: Esc
25145     "\u238B": 27,
25146     escape: 27,
25147     esc: 27,
25148     // Space key
25149     space: 32,
25150     // Page-Up key, or pgup, on Mac: ↖
25151     "\u2196": 33,
25152     pgup: 33,
25153     "page-up": 33,
25154     // Page-Down key, or pgdown, on Mac: ↘
25155     "\u2198": 34,
25156     pgdown: 34,
25157     "page-down": 34,
25158     // END key, on Mac: ⇟
25159     "\u21DF": 35,
25160     end: 35,
25161     // HOME key, on Mac: ⇞
25162     "\u21DE": 36,
25163     home: 36,
25164     // Insert key, or ins
25165     ins: 45,
25166     insert: 45,
25167     // Delete key, on Mac: ⌦ (Delete)
25168     "\u2326": 46,
25169     del: 46,
25170     "delete": 46,
25171     // Left Arrow Key, or ←
25172     "\u2190": 37,
25173     left: 37,
25174     "arrow-left": 37,
25175     // Up Arrow Key, or ↑
25176     "\u2191": 38,
25177     up: 38,
25178     "arrow-up": 38,
25179     // Right Arrow Key, or →
25180     "\u2192": 39,
25181     right: 39,
25182     "arrow-right": 39,
25183     // Up Arrow Key, or ↓
25184     "\u2193": 40,
25185     down: 40,
25186     "arrow-down": 40,
25187     // odities, printing characters that come out wrong:
25188     // Firefox Equals
25189     "ffequals": 61,
25190     // Num-Multiply, or *
25191     "*": 106,
25192     star: 106,
25193     asterisk: 106,
25194     multiply: 106,
25195     // Num-Plus or +
25196     "+": 107,
25197     "plus": 107,
25198     // Num-Subtract, or -
25199     "-": 109,
25200     subtract: 109,
25201     // Vertical Bar / Pipe
25202     "|": 124,
25203     // Firefox Plus
25204     "ffplus": 171,
25205     // Firefox Minus
25206     "ffminus": 173,
25207     // Semicolon
25208     ";": 186,
25209     semicolon: 186,
25210     // = or equals
25211     "=": 187,
25212     "equals": 187,
25213     // Comma, or ,
25214     ",": 188,
25215     comma: 188,
25216     // Dash / Underscore key
25217     "dash": 189,
25218     // Period, or ., or full-stop
25219     ".": 190,
25220     period: 190,
25221     "full-stop": 190,
25222     // Slash, or /, or forward-slash
25223     "/": 191,
25224     slash: 191,
25225     "forward-slash": 191,
25226     // Tick, or `, or back-quote
25227     "`": 192,
25228     tick: 192,
25229     "back-quote": 192,
25230     // Open bracket, or [
25231     "[": 219,
25232     "open-bracket": 219,
25233     // Back slash, or \
25234     "\\": 220,
25235     "back-slash": 220,
25236     // Close backet, or ]
25237     "]": 221,
25238     "close-bracket": 221,
25239     // Apostrophe, or Quote, or '
25240     "'": 222,
25241     quote: 222,
25242     apostrophe: 222
25243   };
25244   var i = 95;
25245   var n = 0;
25246   while (++i < 106) {
25247     utilKeybinding.keyCodes["num-" + n] = i;
25248     ++n;
25249   }
25250   i = 47;
25251   n = 0;
25252   while (++i < 58) {
25253     utilKeybinding.keyCodes[n] = i;
25254     ++n;
25255   }
25256   i = 111;
25257   n = 1;
25258   while (++i < 136) {
25259     utilKeybinding.keyCodes["f" + n] = i;
25260     ++n;
25261   }
25262   i = 64;
25263   while (++i < 91) {
25264     utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
25265   }
25266
25267   // modules/util/object.js
25268   function utilObjectOmit(obj, omitKeys) {
25269     return Object.keys(obj).reduce(function(result, key) {
25270       if (omitKeys.indexOf(key) === -1) {
25271         result[key] = obj[key];
25272       }
25273       return result;
25274     }, {});
25275   }
25276
25277   // modules/util/rebind.js
25278   function utilRebind(target, source) {
25279     var i2 = 1, n2 = arguments.length, method;
25280     while (++i2 < n2) {
25281       target[method = arguments[i2]] = d3_rebind(target, source, source[method]);
25282     }
25283     return target;
25284   }
25285   function d3_rebind(target, source, method) {
25286     return function() {
25287       var value = method.apply(source, arguments);
25288       return value === source ? target : value;
25289     };
25290   }
25291
25292   // modules/util/session_mutex.js
25293   function utilSessionMutex(name) {
25294     var mutex = {};
25295     var intervalID;
25296     function renew() {
25297       var expires = new Date();
25298       expires.setSeconds(expires.getSeconds() + 5);
25299       document.cookie = name + "=1; expires=" + expires.toUTCString() + "; sameSite=strict";
25300     }
25301     mutex.lock = function() {
25302       if (intervalID)
25303         return true;
25304       var cookie = document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + name + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1");
25305       if (cookie)
25306         return false;
25307       renew();
25308       intervalID = window.setInterval(renew, 4e3);
25309       return true;
25310     };
25311     mutex.unlock = function() {
25312       if (!intervalID)
25313         return;
25314       document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict";
25315       clearInterval(intervalID);
25316       intervalID = null;
25317     };
25318     mutex.locked = function() {
25319       return !!intervalID;
25320     };
25321     return mutex;
25322   }
25323
25324   // modules/util/tiler.js
25325   function utilTiler() {
25326     var _size = [256, 256];
25327     var _scale = 256;
25328     var _tileSize = 256;
25329     var _zoomExtent = [0, 20];
25330     var _translate = [_size[0] / 2, _size[1] / 2];
25331     var _margin = 0;
25332     var _skipNullIsland = false;
25333     function clamp3(num, min3, max3) {
25334       return Math.max(min3, Math.min(num, max3));
25335     }
25336     function nearNullIsland(tile) {
25337       var x = tile[0];
25338       var y = tile[1];
25339       var z = tile[2];
25340       if (z >= 7) {
25341         var center = Math.pow(2, z - 1);
25342         var width = Math.pow(2, z - 6);
25343         var min3 = center - width / 2;
25344         var max3 = center + width / 2 - 1;
25345         return x >= min3 && x <= max3 && y >= min3 && y <= max3;
25346       }
25347       return false;
25348     }
25349     function tiler8() {
25350       var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
25351       var z0 = clamp3(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
25352       var tileMin = 0;
25353       var tileMax = Math.pow(2, z0) - 1;
25354       var log2ts = Math.log(_tileSize) * Math.LOG2E;
25355       var k = Math.pow(2, z - z0 + log2ts);
25356       var origin = [
25357         (_translate[0] - _scale / 2) / k,
25358         (_translate[1] - _scale / 2) / k
25359       ];
25360       var cols = range(
25361         clamp3(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1),
25362         clamp3(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1)
25363       );
25364       var rows = range(
25365         clamp3(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1),
25366         clamp3(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1)
25367       );
25368       var tiles = [];
25369       for (var i2 = 0; i2 < rows.length; i2++) {
25370         var y = rows[i2];
25371         for (var j2 = 0; j2 < cols.length; j2++) {
25372           var x = cols[j2];
25373           if (i2 >= _margin && i2 <= rows.length - _margin && j2 >= _margin && j2 <= cols.length - _margin) {
25374             tiles.unshift([x, y, z0]);
25375           } else {
25376             tiles.push([x, y, z0]);
25377           }
25378         }
25379       }
25380       tiles.translate = origin;
25381       tiles.scale = k;
25382       return tiles;
25383     }
25384     tiler8.getTiles = function(projection2) {
25385       var origin = [
25386         projection2.scale() * Math.PI - projection2.translate()[0],
25387         projection2.scale() * Math.PI - projection2.translate()[1]
25388       ];
25389       this.size(projection2.clipExtent()[1]).scale(projection2.scale() * 2 * Math.PI).translate(projection2.translate());
25390       var tiles = tiler8();
25391       var ts = tiles.scale;
25392       return tiles.map(function(tile) {
25393         if (_skipNullIsland && nearNullIsland(tile)) {
25394           return false;
25395         }
25396         var x = tile[0] * ts - origin[0];
25397         var y = tile[1] * ts - origin[1];
25398         return {
25399           id: tile.toString(),
25400           xyz: tile,
25401           extent: geoExtent(
25402             projection2.invert([x, y + ts]),
25403             projection2.invert([x + ts, y])
25404           )
25405         };
25406       }).filter(Boolean);
25407     };
25408     tiler8.getGeoJSON = function(projection2) {
25409       var features = tiler8.getTiles(projection2).map(function(tile) {
25410         return {
25411           type: "Feature",
25412           properties: {
25413             id: tile.id,
25414             name: tile.id
25415           },
25416           geometry: {
25417             type: "Polygon",
25418             coordinates: [tile.extent.polygon()]
25419           }
25420         };
25421       });
25422       return {
25423         type: "FeatureCollection",
25424         features
25425       };
25426     };
25427     tiler8.tileSize = function(val) {
25428       if (!arguments.length)
25429         return _tileSize;
25430       _tileSize = val;
25431       return tiler8;
25432     };
25433     tiler8.zoomExtent = function(val) {
25434       if (!arguments.length)
25435         return _zoomExtent;
25436       _zoomExtent = val;
25437       return tiler8;
25438     };
25439     tiler8.size = function(val) {
25440       if (!arguments.length)
25441         return _size;
25442       _size = val;
25443       return tiler8;
25444     };
25445     tiler8.scale = function(val) {
25446       if (!arguments.length)
25447         return _scale;
25448       _scale = val;
25449       return tiler8;
25450     };
25451     tiler8.translate = function(val) {
25452       if (!arguments.length)
25453         return _translate;
25454       _translate = val;
25455       return tiler8;
25456     };
25457     tiler8.margin = function(val) {
25458       if (!arguments.length)
25459         return _margin;
25460       _margin = +val;
25461       return tiler8;
25462     };
25463     tiler8.skipNullIsland = function(val) {
25464       if (!arguments.length)
25465         return _skipNullIsland;
25466       _skipNullIsland = val;
25467       return tiler8;
25468     };
25469     return tiler8;
25470   }
25471
25472   // modules/util/trigger_event.js
25473   function utilTriggerEvent(target, type2) {
25474     target.each(function() {
25475       var evt = document.createEvent("HTMLEvents");
25476       evt.initEvent(type2, true, true);
25477       this.dispatchEvent(evt);
25478     });
25479   }
25480
25481   // modules/core/localizer.js
25482   var _mainLocalizer = coreLocalizer();
25483   var _t = _mainLocalizer.t;
25484   function coreLocalizer() {
25485     let localizer = {};
25486     let _dataLanguages = {};
25487     let _dataLocales = {};
25488     let _localeStrings = {};
25489     let _localeCode = "en-US";
25490     let _localeCodes = ["en-US", "en"];
25491     let _languageCode = "en";
25492     let _textDirection = "ltr";
25493     let _usesMetric = false;
25494     let _languageNames = {};
25495     let _scriptNames = {};
25496     localizer.localeCode = () => _localeCode;
25497     localizer.localeCodes = () => _localeCodes;
25498     localizer.languageCode = () => _languageCode;
25499     localizer.textDirection = () => _textDirection;
25500     localizer.usesMetric = () => _usesMetric;
25501     localizer.languageNames = () => _languageNames;
25502     localizer.scriptNames = () => _scriptNames;
25503     let _preferredLocaleCodes = [];
25504     localizer.preferredLocaleCodes = function(codes) {
25505       if (!arguments.length)
25506         return _preferredLocaleCodes;
25507       if (typeof codes === "string") {
25508         _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean);
25509       } else {
25510         _preferredLocaleCodes = codes;
25511       }
25512       return localizer;
25513     };
25514     var _loadPromise;
25515     localizer.ensureLoaded = () => {
25516       if (_loadPromise)
25517         return _loadPromise;
25518       let filesToFetch = [
25519         "languages",
25520         // load the list of languages
25521         "locales"
25522         // load the list of supported locales
25523       ];
25524       const localeDirs = {
25525         general: "locales",
25526         tagging: presetsCdnUrl + "dist/translations"
25527       };
25528       let fileMap = _mainFileFetcher.fileMap();
25529       for (let scopeId in localeDirs) {
25530         const key = `locales_index_${scopeId}`;
25531         if (!fileMap[key]) {
25532           fileMap[key] = localeDirs[scopeId] + "/index.min.json";
25533         }
25534         filesToFetch.push(key);
25535       }
25536       return _loadPromise = Promise.all(filesToFetch.map((key) => _mainFileFetcher.get(key))).then((results) => {
25537         _dataLanguages = results[0];
25538         _dataLocales = results[1];
25539         let indexes = results.slice(2);
25540         let requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales).concat(["en"]);
25541         _localeCodes = localesToUseFrom(requestedLocales);
25542         _localeCode = _localeCodes[0];
25543         let loadStringsPromises = [];
25544         indexes.forEach((index, i2) => {
25545           const fullCoverageIndex = _localeCodes.findIndex(function(locale2) {
25546             return index[locale2] && index[locale2].pct === 1;
25547           });
25548           _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function(code) {
25549             let scopeId = Object.keys(localeDirs)[i2];
25550             let directory = Object.values(localeDirs)[i2];
25551             if (index[code])
25552               loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory));
25553           });
25554         });
25555         return Promise.all(loadStringsPromises);
25556       }).then(() => {
25557         updateForCurrentLocale();
25558       }).catch((err) => console.error(err));
25559     };
25560     function localesToUseFrom(requestedLocales) {
25561       let supportedLocales = _dataLocales;
25562       let toUse = [];
25563       for (let i2 in requestedLocales) {
25564         let locale2 = requestedLocales[i2];
25565         if (supportedLocales[locale2])
25566           toUse.push(locale2);
25567         if (locale2.includes("-")) {
25568           let langPart = locale2.split("-")[0];
25569           if (supportedLocales[langPart])
25570             toUse.push(langPart);
25571         }
25572       }
25573       return utilArrayUniq(toUse);
25574     }
25575     function updateForCurrentLocale() {
25576       if (!_localeCode)
25577         return;
25578       _languageCode = _localeCode.split("-")[0];
25579       const currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
25580       const hash = utilStringQs(window.location.hash);
25581       if (hash.rtl === "true") {
25582         _textDirection = "rtl";
25583       } else if (hash.rtl === "false") {
25584         _textDirection = "ltr";
25585       } else {
25586         _textDirection = currentData && currentData.rtl ? "rtl" : "ltr";
25587       }
25588       let locale2 = _localeCode;
25589       if (locale2.toLowerCase() === "en-us")
25590         locale2 = "en";
25591       _languageNames = _localeStrings.general[locale2].languageNames;
25592       _scriptNames = _localeStrings.general[locale2].scriptNames;
25593       _usesMetric = _localeCode.slice(-3).toLowerCase() !== "-us";
25594     }
25595     localizer.loadLocale = (locale2, scopeId, directory) => {
25596       if (locale2.toLowerCase() === "en-us")
25597         locale2 = "en";
25598       if (_localeStrings[scopeId] && _localeStrings[scopeId][locale2]) {
25599         return Promise.resolve(locale2);
25600       }
25601       let fileMap = _mainFileFetcher.fileMap();
25602       const key = `locale_${scopeId}_${locale2}`;
25603       if (!fileMap[key]) {
25604         fileMap[key] = `${directory}/${locale2}.min.json`;
25605       }
25606       return _mainFileFetcher.get(key).then((d) => {
25607         if (!_localeStrings[scopeId])
25608           _localeStrings[scopeId] = {};
25609         _localeStrings[scopeId][locale2] = d[locale2];
25610         return locale2;
25611       });
25612     };
25613     localizer.pluralRule = function(number3) {
25614       return pluralRule(number3, _localeCode);
25615     };
25616     function pluralRule(number3, localeCode) {
25617       const rules = "Intl" in window && Intl.PluralRules && new Intl.PluralRules(localeCode);
25618       if (rules) {
25619         return rules.select(number3);
25620       }
25621       if (number3 === 1)
25622         return "one";
25623       return "other";
25624     }
25625     localizer.tInfo = function(origStringId, replacements, locale2) {
25626       let stringId = origStringId.trim();
25627       let scopeId = "general";
25628       if (stringId[0] === "_") {
25629         let split = stringId.split(".");
25630         scopeId = split[0].slice(1);
25631         stringId = split.slice(1).join(".");
25632       }
25633       locale2 = locale2 || _localeCode;
25634       let path = stringId.split(".").map((s) => s.replace(/<TX_DOT>/g, ".")).reverse();
25635       let stringsKey = locale2;
25636       if (stringsKey.toLowerCase() === "en-us")
25637         stringsKey = "en";
25638       let result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey];
25639       while (result !== void 0 && path.length) {
25640         result = result[path.pop()];
25641       }
25642       if (result !== void 0) {
25643         if (replacements) {
25644           if (typeof result === "object" && Object.keys(result).length) {
25645             const number3 = Object.values(replacements).find(function(value) {
25646               return typeof value === "number";
25647             });
25648             if (number3 !== void 0) {
25649               const rule = pluralRule(number3, locale2);
25650               if (result[rule]) {
25651                 result = result[rule];
25652               } else {
25653                 result = Object.values(result)[0];
25654               }
25655             }
25656           }
25657           if (typeof result === "string") {
25658             for (let key in replacements) {
25659               let value = replacements[key];
25660               if (typeof value === "number") {
25661                 if (value.toLocaleString) {
25662                   value = value.toLocaleString(locale2, {
25663                     style: "decimal",
25664                     useGrouping: true,
25665                     minimumFractionDigits: 0
25666                   });
25667                 } else {
25668                   value = value.toString();
25669                 }
25670               }
25671               const token = `{${key}}`;
25672               const regex = new RegExp(token, "g");
25673               result = result.replace(regex, value);
25674             }
25675           }
25676         }
25677         if (typeof result === "string") {
25678           return {
25679             text: result,
25680             locale: locale2
25681           };
25682         }
25683       }
25684       let index = _localeCodes.indexOf(locale2);
25685       if (index >= 0 && index < _localeCodes.length - 1) {
25686         let fallback = _localeCodes[index + 1];
25687         return localizer.tInfo(origStringId, replacements, fallback);
25688       }
25689       if (replacements && "default" in replacements) {
25690         return {
25691           text: replacements.default,
25692           locale: null
25693         };
25694       }
25695       const missing = `Missing ${locale2} translation: ${origStringId}`;
25696       if (typeof console !== "undefined")
25697         console.error(missing);
25698       return {
25699         text: missing,
25700         locale: "en"
25701       };
25702     };
25703     localizer.hasTextForStringId = function(stringId) {
25704       return !!localizer.tInfo(stringId, { default: "nothing found" }).locale;
25705     };
25706     localizer.t = function(stringId, replacements, locale2) {
25707       return localizer.tInfo(stringId, replacements, locale2).text;
25708     };
25709     localizer.t.html = function(stringId, replacements, locale2) {
25710       replacements = Object.assign({}, replacements);
25711       for (var k in replacements) {
25712         if (typeof replacements[k] === "string") {
25713           replacements[k] = escape_default(replacements[k]);
25714         }
25715         if (typeof replacements[k] === "object" && typeof replacements[k].html === "string") {
25716           replacements[k] = replacements[k].html;
25717         }
25718       }
25719       const info = localizer.tInfo(stringId, replacements, locale2);
25720       if (info.text) {
25721         return `<span class="localized-text" lang="${info.locale || "und"}">${info.text}</span>`;
25722       } else {
25723         return "";
25724       }
25725     };
25726     localizer.t.append = function(stringId, replacements, locale2) {
25727       const ret = function(selection2) {
25728         const info = localizer.tInfo(stringId, replacements, locale2);
25729         return selection2.append("span").attr("class", "localized-text").attr("lang", info.locale || "und").text((replacements && replacements.prefix || "") + info.text + (replacements && replacements.suffix || ""));
25730       };
25731       ret.stringId = stringId;
25732       return ret;
25733     };
25734     localizer.languageName = (code, options2) => {
25735       if (_languageNames[code]) {
25736         return _languageNames[code];
25737       }
25738       if (options2 && options2.localOnly)
25739         return null;
25740       const langInfo = _dataLanguages[code];
25741       if (langInfo) {
25742         if (langInfo.nativeName) {
25743           return localizer.t("translate.language_and_code", { language: langInfo.nativeName, code });
25744         } else if (langInfo.base && langInfo.script) {
25745           const base = langInfo.base;
25746           if (_languageNames[base]) {
25747             const scriptCode = langInfo.script;
25748             const script = _scriptNames[scriptCode] || scriptCode;
25749             return localizer.t("translate.language_and_code", { language: _languageNames[base], code: script });
25750           } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) {
25751             return localizer.t("translate.language_and_code", { language: _dataLanguages[base].nativeName, code });
25752           }
25753         }
25754       }
25755       return code;
25756     };
25757     return localizer;
25758   }
25759
25760   // modules/presets/collection.js
25761   function presetCollection(collection) {
25762     const MAXRESULTS = 50;
25763     let _this = {};
25764     let _memo = {};
25765     _this.collection = collection;
25766     _this.item = (id2) => {
25767       if (_memo[id2])
25768         return _memo[id2];
25769       const found = _this.collection.find((d) => d.id === id2);
25770       if (found)
25771         _memo[id2] = found;
25772       return found;
25773     };
25774     _this.index = (id2) => _this.collection.findIndex((d) => d.id === id2);
25775     _this.matchGeometry = (geometry) => {
25776       return presetCollection(
25777         _this.collection.filter((d) => d.matchGeometry(geometry))
25778       );
25779     };
25780     _this.matchAllGeometry = (geometries) => {
25781       return presetCollection(
25782         _this.collection.filter((d) => d && d.matchAllGeometry(geometries))
25783       );
25784     };
25785     _this.matchAnyGeometry = (geometries) => {
25786       return presetCollection(
25787         _this.collection.filter((d) => geometries.some((geom) => d.matchGeometry(geom)))
25788       );
25789     };
25790     _this.fallback = (geometry) => {
25791       let id2 = geometry;
25792       if (id2 === "vertex")
25793         id2 = "point";
25794       return _this.item(id2);
25795     };
25796     _this.search = (value, geometry, loc) => {
25797       if (!value)
25798         return _this;
25799       value = value.toLowerCase().trim();
25800       function leading(a) {
25801         const index = a.indexOf(value);
25802         return index === 0 || a[index - 1] === " ";
25803       }
25804       function leadingStrict(a) {
25805         const index = a.indexOf(value);
25806         return index === 0;
25807       }
25808       function sortPresets(nameProp, aliasesProp) {
25809         return function sortNames(a, b) {
25810           let aCompare = a[nameProp]();
25811           let bCompare = b[nameProp]();
25812           if (aliasesProp) {
25813             const findMatchingAlias = (strings) => {
25814               if (strings.some((s) => s === value)) {
25815                 return strings.find((s) => s === value);
25816               } else {
25817                 return strings.filter((s) => s.includes(value)).sort((a2, b2) => a2.length - b2.length)[0];
25818               }
25819             };
25820             aCompare = findMatchingAlias([aCompare].concat(a[aliasesProp]()));
25821             bCompare = findMatchingAlias([bCompare].concat(b[aliasesProp]()));
25822           }
25823           if (value === aCompare)
25824             return -1;
25825           if (value === bCompare)
25826             return 1;
25827           let i2 = b.originalScore - a.originalScore;
25828           if (i2 !== 0)
25829             return i2;
25830           i2 = aCompare.indexOf(value) - bCompare.indexOf(value);
25831           if (i2 !== 0)
25832             return i2;
25833           return aCompare.length - bCompare.length;
25834         };
25835       }
25836       let pool = _this.collection;
25837       if (Array.isArray(loc)) {
25838         const validHere = _sharedLocationManager.locationSetsAt(loc);
25839         pool = pool.filter((a) => !a.locationSetID || validHere[a.locationSetID]);
25840       }
25841       const searchable = pool.filter((a) => a.searchable !== false && a.suggestion !== true);
25842       const suggestions = pool.filter((a) => a.suggestion === true);
25843       const leadingNames = searchable.filter((a) => leading(a.searchName()) || a.searchAliases().some(leading)).sort(sortPresets("searchName", "searchAliases"));
25844       const leadingSuggestions = suggestions.filter((a) => leadingStrict(a.searchName())).sort(sortPresets("searchName"));
25845       const leadingNamesStripped = searchable.filter((a) => leading(a.searchNameStripped()) || a.searchAliasesStripped().some(leading)).sort(sortPresets("searchNameStripped", "searchAliasesStripped"));
25846       const leadingSuggestionsStripped = suggestions.filter((a) => leadingStrict(a.searchNameStripped())).sort(sortPresets("searchNameStripped"));
25847       const leadingTerms = searchable.filter((a) => (a.terms() || []).some(leading));
25848       const leadingSuggestionTerms = suggestions.filter((a) => (a.terms() || []).some(leading));
25849       const leadingTagValues = searchable.filter((a) => Object.values(a.tags || {}).filter((val) => val !== "*").some(leading));
25850       const similarName = searchable.map((a) => ({ preset: a, dist: utilEditDistance(value, a.searchName()) })).filter((a) => a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 3).sort((a, b) => a.dist - b.dist).map((a) => a.preset);
25851       const similarSuggestions = suggestions.map((a) => ({ preset: a, dist: utilEditDistance(value, a.searchName()) })).filter((a) => a.dist + Math.min(value.length - a.preset.searchName().length, 0) < 1).sort((a, b) => a.dist - b.dist).map((a) => a.preset);
25852       const similarTerms = searchable.filter((a) => {
25853         return (a.terms() || []).some((b) => {
25854           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
25855         });
25856       });
25857       let leadingTagKeyValues = [];
25858       if (value.includes("=")) {
25859         leadingTagKeyValues = searchable.filter((a) => a.tags && Object.keys(a.tags).some((key) => key + "=" + a.tags[key] === value)).concat(searchable.filter((a) => a.tags && Object.keys(a.tags).some((key) => leading(key + "=" + a.tags[key]))));
25860       }
25861       let results = leadingNames.concat(
25862         leadingSuggestions,
25863         leadingNamesStripped,
25864         leadingSuggestionsStripped,
25865         leadingTerms,
25866         leadingSuggestionTerms,
25867         leadingTagValues,
25868         similarName,
25869         similarSuggestions,
25870         similarTerms,
25871         leadingTagKeyValues
25872       ).slice(0, MAXRESULTS - 1);
25873       if (geometry) {
25874         if (typeof geometry === "string") {
25875           results.push(_this.fallback(geometry));
25876         } else {
25877           geometry.forEach((geom) => results.push(_this.fallback(geom)));
25878         }
25879       }
25880       return presetCollection(utilArrayUniq(results));
25881     };
25882     return _this;
25883   }
25884
25885   // modules/presets/category.js
25886   function presetCategory(categoryID, category, allPresets) {
25887     let _this = Object.assign({}, category);
25888     let _searchName;
25889     let _searchNameStripped;
25890     _this.id = categoryID;
25891     _this.members = presetCollection(
25892       (category.members || []).map((presetID) => allPresets[presetID]).filter(Boolean)
25893     );
25894     _this.geometry = _this.members.collection.reduce((acc, preset) => {
25895       for (let i2 in preset.geometry) {
25896         const geometry = preset.geometry[i2];
25897         if (acc.indexOf(geometry) === -1) {
25898           acc.push(geometry);
25899         }
25900       }
25901       return acc;
25902     }, []);
25903     _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
25904     _this.matchAllGeometry = (geometries) => _this.members.collection.some((preset) => preset.matchAllGeometry(geometries));
25905     _this.matchScore = () => -1;
25906     _this.name = () => _t(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID });
25907     _this.nameLabel = () => _t.append(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID });
25908     _this.terms = () => [];
25909     _this.searchName = () => {
25910       if (!_searchName) {
25911         _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
25912       }
25913       return _searchName;
25914     };
25915     _this.searchNameStripped = () => {
25916       if (!_searchNameStripped) {
25917         _searchNameStripped = _this.searchName();
25918         if (_searchNameStripped.normalize)
25919           _searchNameStripped = _searchNameStripped.normalize("NFD");
25920         _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, "");
25921       }
25922       return _searchNameStripped;
25923     };
25924     _this.searchAliases = () => [];
25925     _this.searchAliasesStripped = () => [];
25926     return _this;
25927   }
25928
25929   // modules/presets/field.js
25930   function presetField(fieldID, field, allFields) {
25931     allFields = allFields || {};
25932     let _this = Object.assign({}, field);
25933     _this.id = fieldID;
25934     _this.safeid = utilSafeClassName(fieldID);
25935     _this.matchGeometry = (geom) => !_this.geometry || _this.geometry.indexOf(geom) !== -1;
25936     _this.matchAllGeometry = (geometries) => {
25937       return !_this.geometry || geometries.every((geom) => _this.geometry.indexOf(geom) !== -1);
25938     };
25939     _this.t = (scope, options2) => _t(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
25940     _this.t.html = (scope, options2) => _t.html(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
25941     _this.t.append = (scope, options2) => _t.append(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
25942     _this.hasTextForStringId = (scope) => _mainLocalizer.hasTextForStringId(`_tagging.presets.fields.${fieldID}.${scope}`);
25943     _this.resolveReference = (which) => {
25944       const referenceRegex = /^\{(.*)\}$/;
25945       const match = (field[which] || "").match(referenceRegex);
25946       if (match) {
25947         const field2 = allFields[match[1]];
25948         if (field2) {
25949           return field2;
25950         }
25951         console.error(`Unable to resolve referenced field: ${match[1]}`);
25952       }
25953       return _this;
25954     };
25955     _this.title = () => _this.overrideLabel || _this.resolveReference("label").t("label", { "default": fieldID });
25956     _this.label = () => _this.overrideLabel ? (selection2) => selection2.text(_this.overrideLabel) : _this.resolveReference("label").t.append("label", { "default": fieldID });
25957     _this.placeholder = () => _this.resolveReference("placeholder").t("placeholder", { "default": "" });
25958     _this.originalTerms = (_this.terms || []).join();
25959     _this.terms = () => _this.resolveReference("label").t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
25960     _this.increment = _this.type === "number" ? _this.increment || 1 : void 0;
25961     return _this;
25962   }
25963
25964   // modules/presets/preset.js
25965   function presetPreset(presetID, preset, addable, allFields, allPresets) {
25966     allFields = allFields || {};
25967     allPresets = allPresets || {};
25968     let _this = Object.assign({}, preset);
25969     let _addable = addable || false;
25970     let _resolvedFields;
25971     let _resolvedMoreFields;
25972     let _searchName;
25973     let _searchNameStripped;
25974     let _searchAliases;
25975     let _searchAliasesStripped;
25976     const referenceRegex = /^\{(.*)\}$/;
25977     _this.id = presetID;
25978     _this.safeid = utilSafeClassName(presetID);
25979     _this.originalTerms = (_this.terms || []).join();
25980     _this.originalName = _this.name || "";
25981     _this.originalAliases = (_this.aliases || []).join("\n");
25982     _this.originalScore = _this.matchScore || 1;
25983     _this.originalReference = _this.reference || {};
25984     _this.originalFields = _this.fields || [];
25985     _this.originalMoreFields = _this.moreFields || [];
25986     _this.fields = () => _resolvedFields || (_resolvedFields = resolveFields("fields"));
25987     _this.moreFields = () => _resolvedMoreFields || (_resolvedMoreFields = resolveFields("moreFields"));
25988     _this.resetFields = () => _resolvedFields = _resolvedMoreFields = null;
25989     _this.tags = _this.tags || {};
25990     _this.addTags = _this.addTags || _this.tags;
25991     _this.removeTags = _this.removeTags || _this.addTags;
25992     _this.geometry = _this.geometry || [];
25993     _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
25994     _this.matchAllGeometry = (geoms) => geoms.every(_this.matchGeometry);
25995     _this.matchScore = (entityTags) => {
25996       const tags = _this.tags;
25997       let seen = {};
25998       let score = 0;
25999       for (let k in tags) {
26000         seen[k] = true;
26001         if (entityTags[k] === tags[k]) {
26002           score += _this.originalScore;
26003         } else if (tags[k] === "*" && k in entityTags) {
26004           score += _this.originalScore / 2;
26005         } else {
26006           return -1;
26007         }
26008       }
26009       const addTags = _this.addTags;
26010       for (let k in addTags) {
26011         if (!seen[k] && entityTags[k] === addTags[k]) {
26012           score += _this.originalScore;
26013         }
26014       }
26015       if (_this.searchable === false) {
26016         score *= 0.999;
26017       }
26018       return score;
26019     };
26020     _this.t = (scope, options2) => {
26021       const textID = `_tagging.presets.presets.${presetID}.${scope}`;
26022       return _t(textID, options2);
26023     };
26024     _this.t.append = (scope, options2) => {
26025       const textID = `_tagging.presets.presets.${presetID}.${scope}`;
26026       return _t.append(textID, options2);
26027     };
26028     function resolveReference(which) {
26029       const match = (_this[which] || "").match(referenceRegex);
26030       if (match) {
26031         const preset2 = allPresets[match[1]];
26032         if (preset2) {
26033           return preset2;
26034         }
26035         console.error(`Unable to resolve referenced preset: ${match[1]}`);
26036       }
26037       return _this;
26038     }
26039     _this.name = () => {
26040       return resolveReference("originalName").t("name", { "default": _this.originalName || presetID });
26041     };
26042     _this.nameLabel = () => {
26043       return resolveReference("originalName").t.append("name", { "default": _this.originalName || presetID });
26044     };
26045     _this.subtitle = () => {
26046       if (_this.suggestion) {
26047         let path = presetID.split("/");
26048         path.pop();
26049         return _t("_tagging.presets.presets." + path.join("/") + ".name");
26050       }
26051       return null;
26052     };
26053     _this.subtitleLabel = () => {
26054       if (_this.suggestion) {
26055         let path = presetID.split("/");
26056         path.pop();
26057         return _t.append("_tagging.presets.presets." + path.join("/") + ".name");
26058       }
26059       return null;
26060     };
26061     _this.aliases = () => {
26062       return resolveReference("originalName").t("aliases", { "default": _this.originalAliases }).trim().split(/\s*[\r\n]+\s*/);
26063     };
26064     _this.terms = () => {
26065       return resolveReference("originalName").t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
26066     };
26067     _this.searchName = () => {
26068       if (!_searchName) {
26069         _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
26070       }
26071       return _searchName;
26072     };
26073     _this.searchNameStripped = () => {
26074       if (!_searchNameStripped) {
26075         _searchNameStripped = stripDiacritics(_this.searchName());
26076       }
26077       return _searchNameStripped;
26078     };
26079     _this.searchAliases = () => {
26080       if (!_searchAliases) {
26081         _searchAliases = _this.aliases().map((alias) => alias.toLowerCase());
26082       }
26083       return _searchAliases;
26084     };
26085     _this.searchAliasesStripped = () => {
26086       if (!_searchAliasesStripped) {
26087         _searchAliasesStripped = _this.searchAliases();
26088         _searchAliasesStripped = _searchAliasesStripped.map(stripDiacritics);
26089       }
26090       return _searchAliasesStripped;
26091     };
26092     _this.isFallback = () => {
26093       const tagCount = Object.keys(_this.tags).length;
26094       return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty("area");
26095     };
26096     _this.addable = function(val) {
26097       if (!arguments.length)
26098         return _addable;
26099       _addable = val;
26100       return _this;
26101     };
26102     _this.reference = () => {
26103       const qid = _this.tags.wikidata || _this.tags["flag:wikidata"] || _this.tags["brand:wikidata"] || _this.tags["network:wikidata"] || _this.tags["operator:wikidata"];
26104       if (qid) {
26105         return { qid };
26106       }
26107       let key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, "name"))[0];
26108       let value = _this.originalReference.value || _this.tags[key];
26109       if (value === "*") {
26110         return { key };
26111       } else {
26112         return { key, value };
26113       }
26114     };
26115     _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults) => {
26116       let removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags;
26117       tags = utilObjectOmit(tags, Object.keys(removeTags));
26118       if (geometry && !skipFieldDefaults) {
26119         _this.fields().forEach((field) => {
26120           if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key] && (!ignoringKeys || ignoringKeys.indexOf(field.key) === -1)) {
26121             delete tags[field.key];
26122           }
26123         });
26124       }
26125       delete tags.area;
26126       return tags;
26127     };
26128     _this.setTags = (tags, geometry, skipFieldDefaults) => {
26129       const addTags = _this.addTags;
26130       tags = Object.assign({}, tags);
26131       for (let k in addTags) {
26132         if (addTags[k] === "*") {
26133           if (_this.tags[k] || !tags[k]) {
26134             tags[k] = "yes";
26135           }
26136         } else {
26137           tags[k] = addTags[k];
26138         }
26139       }
26140       if (!addTags.hasOwnProperty("area")) {
26141         delete tags.area;
26142         if (geometry === "area") {
26143           let needsAreaTag = true;
26144           for (let k in addTags) {
26145             if (_this.geometry.indexOf("line") === -1 && k in osmAreaKeys || k in osmAreaKeysExceptions && addTags[k] in osmAreaKeysExceptions[k]) {
26146               needsAreaTag = false;
26147               break;
26148             }
26149           }
26150           if (needsAreaTag) {
26151             tags.area = "yes";
26152           }
26153         }
26154       }
26155       if (geometry && !skipFieldDefaults) {
26156         _this.fields().forEach((field) => {
26157           if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
26158             tags[field.key] = field.default;
26159           }
26160         });
26161       }
26162       return tags;
26163     };
26164     function resolveFields(which) {
26165       const fieldIDs = which === "fields" ? _this.originalFields : _this.originalMoreFields;
26166       let resolved = [];
26167       fieldIDs.forEach((fieldID) => {
26168         const match = fieldID.match(referenceRegex);
26169         if (match !== null) {
26170           resolved = resolved.concat(inheritFields(match[1], which));
26171         } else if (allFields[fieldID]) {
26172           resolved.push(allFields[fieldID]);
26173         } else {
26174           console.log(`Cannot resolve "${fieldID}" found in ${_this.id}.${which}`);
26175         }
26176       });
26177       if (!resolved.length) {
26178         const endIndex = _this.id.lastIndexOf("/");
26179         const parentID = endIndex && _this.id.substring(0, endIndex);
26180         if (parentID) {
26181           resolved = inheritFields(parentID, which);
26182         }
26183       }
26184       return utilArrayUniq(resolved);
26185       function inheritFields(presetID2, which2) {
26186         const parent = allPresets[presetID2];
26187         if (!parent)
26188           return [];
26189         if (which2 === "fields") {
26190           return parent.fields().filter(shouldInherit);
26191         } else if (which2 === "moreFields") {
26192           return parent.moreFields();
26193         } else {
26194           return [];
26195         }
26196       }
26197       function shouldInherit(f2) {
26198         if (f2.key && _this.tags[f2.key] !== void 0 && // inherit anyway if multiple values are allowed or just a checkbox
26199         f2.type !== "multiCombo" && f2.type !== "semiCombo" && f2.type !== "manyCombo" && f2.type !== "check")
26200           return false;
26201         return true;
26202       }
26203     }
26204     function stripDiacritics(s) {
26205       if (s.normalize)
26206         s = s.normalize("NFD");
26207       s = s.replace(/[\u0300-\u036f]/g, "");
26208       return s;
26209     }
26210     return _this;
26211   }
26212
26213   // modules/presets/index.js
26214   var _mainPresetIndex = presetIndex();
26215   function presetIndex() {
26216     const dispatch10 = dispatch_default("favoritePreset", "recentsChange");
26217     const MAXRECENTS = 30;
26218     const POINT = presetPreset("point", { name: "Point", tags: {}, geometry: ["point", "vertex"], matchScore: 0.1 });
26219     const LINE = presetPreset("line", { name: "Line", tags: {}, geometry: ["line"], matchScore: 0.1 });
26220     const AREA = presetPreset("area", { name: "Area", tags: { area: "yes" }, geometry: ["area"], matchScore: 0.1 });
26221     const RELATION = presetPreset("relation", { name: "Relation", tags: {}, geometry: ["relation"], matchScore: 0.1 });
26222     let _this = presetCollection([POINT, LINE, AREA, RELATION]);
26223     let _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION };
26224     let _defaults = {
26225       point: presetCollection([POINT]),
26226       vertex: presetCollection([POINT]),
26227       line: presetCollection([LINE]),
26228       area: presetCollection([AREA]),
26229       relation: presetCollection([RELATION])
26230     };
26231     let _fields = {};
26232     let _categories = {};
26233     let _universal = [];
26234     let _addablePresetIDs = null;
26235     let _recents;
26236     let _favorites;
26237     let _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
26238     let _loadPromise;
26239     _this.ensureLoaded = () => {
26240       if (_loadPromise)
26241         return _loadPromise;
26242       return _loadPromise = Promise.all([
26243         _mainFileFetcher.get("preset_categories"),
26244         _mainFileFetcher.get("preset_defaults"),
26245         _mainFileFetcher.get("preset_presets"),
26246         _mainFileFetcher.get("preset_fields")
26247       ]).then((vals) => {
26248         _this.merge({
26249           categories: vals[0],
26250           defaults: vals[1],
26251           presets: vals[2],
26252           fields: vals[3]
26253         });
26254         osmSetAreaKeys(_this.areaKeys());
26255         osmSetLineTags(_this.lineTags());
26256         osmSetPointTags(_this.pointTags());
26257         osmSetVertexTags(_this.vertexTags());
26258       });
26259     };
26260     _this.merge = (d) => {
26261       let newLocationSets = [];
26262       if (d.fields) {
26263         Object.keys(d.fields).forEach((fieldID) => {
26264           let f2 = d.fields[fieldID];
26265           if (f2) {
26266             f2 = presetField(fieldID, f2, _fields);
26267             if (f2.locationSet)
26268               newLocationSets.push(f2);
26269             _fields[fieldID] = f2;
26270           } else {
26271             delete _fields[fieldID];
26272           }
26273         });
26274       }
26275       if (d.presets) {
26276         Object.keys(d.presets).forEach((presetID) => {
26277           let p = d.presets[presetID];
26278           if (p) {
26279             const isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
26280             p = presetPreset(presetID, p, isAddable, _fields, _presets);
26281             if (p.locationSet)
26282               newLocationSets.push(p);
26283             _presets[presetID] = p;
26284           } else {
26285             const existing = _presets[presetID];
26286             if (existing && !existing.isFallback()) {
26287               delete _presets[presetID];
26288             }
26289           }
26290         });
26291       }
26292       if (d.categories) {
26293         Object.keys(d.categories).forEach((categoryID) => {
26294           let c = d.categories[categoryID];
26295           if (c) {
26296             c = presetCategory(categoryID, c, _presets);
26297             if (c.locationSet)
26298               newLocationSets.push(c);
26299             _categories[categoryID] = c;
26300           } else {
26301             delete _categories[categoryID];
26302           }
26303         });
26304       }
26305       _this.collection = Object.values(_presets).concat(Object.values(_categories));
26306       if (d.defaults) {
26307         Object.keys(d.defaults).forEach((geometry) => {
26308           const def = d.defaults[geometry];
26309           if (Array.isArray(def)) {
26310             _defaults[geometry] = presetCollection(
26311               def.map((id2) => _presets[id2] || _categories[id2]).filter(Boolean)
26312             );
26313           } else {
26314             delete _defaults[geometry];
26315           }
26316         });
26317       }
26318       _universal = Object.values(_fields).filter((field) => field.universal);
26319       Object.values(_presets).forEach((preset) => preset.resetFields());
26320       _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
26321       _this.collection.forEach((preset) => {
26322         (preset.geometry || []).forEach((geometry) => {
26323           let g = _geometryIndex[geometry];
26324           for (let key in preset.tags) {
26325             g[key] = g[key] || {};
26326             let value = preset.tags[key];
26327             (g[key][value] = g[key][value] || []).push(preset);
26328           }
26329         });
26330       });
26331       if (d.featureCollection && Array.isArray(d.featureCollection.features)) {
26332         _sharedLocationManager.mergeCustomGeoJSON(d.featureCollection);
26333       }
26334       if (newLocationSets.length) {
26335         _sharedLocationManager.mergeLocationSets(newLocationSets);
26336       }
26337       return _this;
26338     };
26339     _this.match = (entity, resolver) => {
26340       return resolver.transient(entity, "presetMatch", () => {
26341         let geometry = entity.geometry(resolver);
26342         if (geometry === "vertex" && entity.isOnAddressLine(resolver)) {
26343           geometry = "point";
26344         }
26345         const entityExtent = entity.extent(resolver);
26346         return _this.matchTags(entity.tags, geometry, entityExtent.center());
26347       });
26348     };
26349     _this.matchTags = (tags, geometry, loc) => {
26350       const keyIndex = _geometryIndex[geometry];
26351       let bestScore = -1;
26352       let bestMatch;
26353       let matchCandidates = [];
26354       for (let k in tags) {
26355         let indexMatches = [];
26356         let valueIndex = keyIndex[k];
26357         if (!valueIndex)
26358           continue;
26359         let keyValueMatches = valueIndex[tags[k]];
26360         if (keyValueMatches)
26361           indexMatches.push(...keyValueMatches);
26362         let keyStarMatches = valueIndex["*"];
26363         if (keyStarMatches)
26364           indexMatches.push(...keyStarMatches);
26365         if (indexMatches.length === 0)
26366           continue;
26367         for (let i2 = 0; i2 < indexMatches.length; i2++) {
26368           const candidate = indexMatches[i2];
26369           const score = candidate.matchScore(tags);
26370           if (score === -1) {
26371             continue;
26372           }
26373           matchCandidates.push({ score, candidate });
26374           if (score > bestScore) {
26375             bestScore = score;
26376             bestMatch = candidate;
26377           }
26378         }
26379       }
26380       if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== "+[Q2]" && Array.isArray(loc)) {
26381         const validHere = _sharedLocationManager.locationSetsAt(loc);
26382         if (!validHere[bestMatch.locationSetID]) {
26383           matchCandidates.sort((a, b) => a.score < b.score ? 1 : -1);
26384           for (let i2 = 0; i2 < matchCandidates.length; i2++) {
26385             const candidateScore = matchCandidates[i2];
26386             if (!candidateScore.candidate.locationSetID || validHere[candidateScore.candidate.locationSetID]) {
26387               bestMatch = candidateScore.candidate;
26388               bestScore = candidateScore.score;
26389               break;
26390             }
26391           }
26392         }
26393       }
26394       if (!bestMatch || bestMatch.isFallback()) {
26395         for (let k in tags) {
26396           if (/^addr:/.test(k) && keyIndex["addr:*"] && keyIndex["addr:*"]["*"]) {
26397             bestMatch = keyIndex["addr:*"]["*"][0];
26398             break;
26399           }
26400         }
26401       }
26402       return bestMatch || _this.fallback(geometry);
26403     };
26404     _this.allowsVertex = (entity, resolver) => {
26405       if (entity.type !== "node")
26406         return false;
26407       if (Object.keys(entity.tags).length === 0)
26408         return true;
26409       return resolver.transient(entity, "vertexMatch", () => {
26410         if (entity.isOnAddressLine(resolver))
26411           return true;
26412         const geometries = osmNodeGeometriesForTags(entity.tags);
26413         if (geometries.vertex)
26414           return true;
26415         if (geometries.point)
26416           return false;
26417         return true;
26418       });
26419     };
26420     _this.areaKeys = () => {
26421       const ignore = {
26422         barrier: true,
26423         highway: true,
26424         footway: true,
26425         railway: true,
26426         junction: true,
26427         traffic_calming: true,
26428         type: true
26429       };
26430       let areaKeys = {};
26431       const presets = _this.collection.filter((p) => !p.suggestion && !p.replacement);
26432       presets.forEach((p) => {
26433         const keys = p.tags && Object.keys(p.tags);
26434         const key = keys && keys.length && keys[0];
26435         if (!key)
26436           return;
26437         if (ignore[key])
26438           return;
26439         if (p.geometry.indexOf("area") !== -1) {
26440           areaKeys[key] = areaKeys[key] || {};
26441         }
26442       });
26443       presets.forEach((p) => {
26444         let key;
26445         for (key in p.addTags) {
26446           const value = p.addTags[key];
26447           if (key in areaKeys && // probably an area...
26448           p.geometry.indexOf("line") !== -1 && // but sometimes a line
26449           value !== "*") {
26450             areaKeys[key][value] = true;
26451           }
26452         }
26453       });
26454       return areaKeys;
26455     };
26456     _this.lineTags = () => {
26457       return _this.collection.filter((lineTags, d) => {
26458         if (d.suggestion || d.replacement || d.searchable === false)
26459           return lineTags;
26460         const keys = d.tags && Object.keys(d.tags);
26461         const key = keys && keys.length && keys[0];
26462         if (!key)
26463           return lineTags;
26464         if (d.geometry.indexOf("line") !== -1) {
26465           lineTags[key] = lineTags[key] || [];
26466           lineTags[key].push(d.tags);
26467         }
26468         return lineTags;
26469       }, {});
26470     };
26471     _this.pointTags = () => {
26472       return _this.collection.reduce((pointTags, d) => {
26473         if (d.suggestion || d.replacement || d.searchable === false)
26474           return pointTags;
26475         const keys = d.tags && Object.keys(d.tags);
26476         const key = keys && keys.length && keys[0];
26477         if (!key)
26478           return pointTags;
26479         if (d.geometry.indexOf("point") !== -1) {
26480           pointTags[key] = pointTags[key] || {};
26481           pointTags[key][d.tags[key]] = true;
26482         }
26483         return pointTags;
26484       }, {});
26485     };
26486     _this.vertexTags = () => {
26487       return _this.collection.reduce((vertexTags, d) => {
26488         if (d.suggestion || d.replacement || d.searchable === false)
26489           return vertexTags;
26490         const keys = d.tags && Object.keys(d.tags);
26491         const key = keys && keys.length && keys[0];
26492         if (!key)
26493           return vertexTags;
26494         if (d.geometry.indexOf("vertex") !== -1) {
26495           vertexTags[key] = vertexTags[key] || {};
26496           vertexTags[key][d.tags[key]] = true;
26497         }
26498         return vertexTags;
26499       }, {});
26500     };
26501     _this.field = (id2) => _fields[id2];
26502     _this.universal = () => _universal;
26503     _this.defaults = (geometry, n2, startWithRecents, loc, extraPresets) => {
26504       let recents = [];
26505       if (startWithRecents) {
26506         recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
26507       }
26508       let defaults2;
26509       if (_addablePresetIDs) {
26510         defaults2 = Array.from(_addablePresetIDs).map(function(id2) {
26511           var preset = _this.item(id2);
26512           if (preset && preset.matchGeometry(geometry))
26513             return preset;
26514           return null;
26515         }).filter(Boolean);
26516       } else {
26517         defaults2 = _defaults[geometry].collection.concat(_this.fallback(geometry));
26518       }
26519       let result = presetCollection(
26520         utilArrayUniq(recents.concat(defaults2).concat(extraPresets || [])).slice(0, n2 - 1)
26521       );
26522       if (Array.isArray(loc)) {
26523         const validHere = _sharedLocationManager.locationSetsAt(loc);
26524         result.collection = result.collection.filter((a) => !a.locationSetID || validHere[a.locationSetID]);
26525       }
26526       return result;
26527     };
26528     _this.addablePresetIDs = function(val) {
26529       if (!arguments.length)
26530         return _addablePresetIDs;
26531       if (Array.isArray(val))
26532         val = new Set(val);
26533       _addablePresetIDs = val;
26534       if (_addablePresetIDs) {
26535         _this.collection.forEach((p) => {
26536           if (p.addable)
26537             p.addable(_addablePresetIDs.has(p.id));
26538         });
26539       } else {
26540         _this.collection.forEach((p) => {
26541           if (p.addable)
26542             p.addable(true);
26543         });
26544       }
26545       return _this;
26546     };
26547     _this.recent = () => {
26548       return presetCollection(
26549         utilArrayUniq(_this.getRecents().map((d) => d.preset).filter((d) => d.searchable !== false))
26550       );
26551     };
26552     function RibbonItem(preset, source) {
26553       let item = {};
26554       item.preset = preset;
26555       item.source = source;
26556       item.isFavorite = () => item.source === "favorite";
26557       item.isRecent = () => item.source === "recent";
26558       item.matches = (preset2) => item.preset.id === preset2.id;
26559       item.minified = () => ({ pID: item.preset.id });
26560       return item;
26561     }
26562     function ribbonItemForMinified(d, source) {
26563       if (d && d.pID) {
26564         const preset = _this.item(d.pID);
26565         if (!preset)
26566           return null;
26567         return RibbonItem(preset, source);
26568       }
26569       return null;
26570     }
26571     _this.getGenericRibbonItems = () => {
26572       return ["point", "line", "area"].map((id2) => RibbonItem(_this.item(id2), "generic"));
26573     };
26574     _this.getAddable = () => {
26575       if (!_addablePresetIDs)
26576         return [];
26577       return _addablePresetIDs.map((id2) => {
26578         const preset = _this.item(id2);
26579         if (preset)
26580           return RibbonItem(preset, "addable");
26581         return null;
26582       }).filter(Boolean);
26583     };
26584     function setRecents(items) {
26585       _recents = items;
26586       const minifiedItems = items.map((d) => d.minified());
26587       corePreferences("preset_recents", JSON.stringify(minifiedItems));
26588       dispatch10.call("recentsChange");
26589     }
26590     _this.getRecents = () => {
26591       if (!_recents) {
26592         _recents = (JSON.parse(corePreferences("preset_recents")) || []).reduce((acc, d) => {
26593           let item = ribbonItemForMinified(d, "recent");
26594           if (item && item.preset.addable())
26595             acc.push(item);
26596           return acc;
26597         }, []);
26598       }
26599       return _recents;
26600     };
26601     _this.addRecent = (preset, besidePreset, after) => {
26602       const recents = _this.getRecents();
26603       const beforeItem = _this.recentMatching(besidePreset);
26604       let toIndex = recents.indexOf(beforeItem);
26605       if (after)
26606         toIndex += 1;
26607       const newItem = RibbonItem(preset, "recent");
26608       recents.splice(toIndex, 0, newItem);
26609       setRecents(recents);
26610     };
26611     _this.removeRecent = (preset) => {
26612       const item = _this.recentMatching(preset);
26613       if (item) {
26614         let items = _this.getRecents();
26615         items.splice(items.indexOf(item), 1);
26616         setRecents(items);
26617       }
26618     };
26619     _this.recentMatching = (preset) => {
26620       const items = _this.getRecents();
26621       for (let i2 in items) {
26622         if (items[i2].matches(preset)) {
26623           return items[i2];
26624         }
26625       }
26626       return null;
26627     };
26628     _this.moveItem = (items, fromIndex, toIndex) => {
26629       if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length)
26630         return null;
26631       items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
26632       return items;
26633     };
26634     _this.moveRecent = (item, beforeItem) => {
26635       const recents = _this.getRecents();
26636       const fromIndex = recents.indexOf(item);
26637       const toIndex = recents.indexOf(beforeItem);
26638       const items = _this.moveItem(recents, fromIndex, toIndex);
26639       if (items)
26640         setRecents(items);
26641     };
26642     _this.setMostRecent = (preset) => {
26643       if (preset.searchable === false)
26644         return;
26645       let items = _this.getRecents();
26646       let item = _this.recentMatching(preset);
26647       if (item) {
26648         items.splice(items.indexOf(item), 1);
26649       } else {
26650         item = RibbonItem(preset, "recent");
26651       }
26652       while (items.length >= MAXRECENTS) {
26653         items.pop();
26654       }
26655       items.unshift(item);
26656       setRecents(items);
26657     };
26658     function setFavorites(items) {
26659       _favorites = items;
26660       const minifiedItems = items.map((d) => d.minified());
26661       corePreferences("preset_favorites", JSON.stringify(minifiedItems));
26662       dispatch10.call("favoritePreset");
26663     }
26664     _this.addFavorite = (preset, besidePreset, after) => {
26665       const favorites = _this.getFavorites();
26666       const beforeItem = _this.favoriteMatching(besidePreset);
26667       let toIndex = favorites.indexOf(beforeItem);
26668       if (after)
26669         toIndex += 1;
26670       const newItem = RibbonItem(preset, "favorite");
26671       favorites.splice(toIndex, 0, newItem);
26672       setFavorites(favorites);
26673     };
26674     _this.toggleFavorite = (preset) => {
26675       const favs = _this.getFavorites();
26676       const favorite = _this.favoriteMatching(preset);
26677       if (favorite) {
26678         favs.splice(favs.indexOf(favorite), 1);
26679       } else {
26680         if (favs.length === 10) {
26681           favs.pop();
26682         }
26683         favs.push(RibbonItem(preset, "favorite"));
26684       }
26685       setFavorites(favs);
26686     };
26687     _this.removeFavorite = (preset) => {
26688       const item = _this.favoriteMatching(preset);
26689       if (item) {
26690         const items = _this.getFavorites();
26691         items.splice(items.indexOf(item), 1);
26692         setFavorites(items);
26693       }
26694     };
26695     _this.getFavorites = () => {
26696       if (!_favorites) {
26697         let rawFavorites = JSON.parse(corePreferences("preset_favorites"));
26698         if (!rawFavorites) {
26699           rawFavorites = [];
26700           corePreferences("preset_favorites", JSON.stringify(rawFavorites));
26701         }
26702         _favorites = rawFavorites.reduce((output, d) => {
26703           const item = ribbonItemForMinified(d, "favorite");
26704           if (item && item.preset.addable())
26705             output.push(item);
26706           return output;
26707         }, []);
26708       }
26709       return _favorites;
26710     };
26711     _this.favoriteMatching = (preset) => {
26712       const favs = _this.getFavorites();
26713       for (let index in favs) {
26714         if (favs[index].matches(preset)) {
26715           return favs[index];
26716         }
26717       }
26718       return null;
26719     };
26720     return utilRebind(_this, dispatch10, "on");
26721   }
26722
26723   // modules/util/util.js
26724   function utilTagText(entity) {
26725     var obj = entity && entity.tags || {};
26726     return Object.keys(obj).map(function(k) {
26727       return k + "=" + obj[k];
26728     }).join(", ");
26729   }
26730   function utilTotalExtent(array2, graph) {
26731     var extent = geoExtent();
26732     var val, entity;
26733     for (var i2 = 0; i2 < array2.length; i2++) {
26734       val = array2[i2];
26735       entity = typeof val === "string" ? graph.hasEntity(val) : val;
26736       if (entity) {
26737         extent._extend(entity.extent(graph));
26738       }
26739     }
26740     return extent;
26741   }
26742   function utilTagDiff(oldTags, newTags) {
26743     var tagDiff = [];
26744     var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
26745     keys.forEach(function(k) {
26746       var oldVal = oldTags[k];
26747       var newVal = newTags[k];
26748       if ((oldVal || oldVal === "") && (newVal === void 0 || newVal !== oldVal)) {
26749         tagDiff.push({
26750           type: "-",
26751           key: k,
26752           oldVal,
26753           newVal,
26754           display: "- " + k + "=" + oldVal
26755         });
26756       }
26757       if ((newVal || newVal === "") && (oldVal === void 0 || newVal !== oldVal)) {
26758         tagDiff.push({
26759           type: "+",
26760           key: k,
26761           oldVal,
26762           newVal,
26763           display: "+ " + k + "=" + newVal
26764         });
26765       }
26766     });
26767     return tagDiff;
26768   }
26769   function utilEntitySelector(ids) {
26770     return ids.length ? "." + ids.join(",.") : "nothing";
26771   }
26772   function utilEntityOrMemberSelector(ids, graph) {
26773     var seen = new Set(ids);
26774     ids.forEach(collectShallowDescendants);
26775     return utilEntitySelector(Array.from(seen));
26776     function collectShallowDescendants(id2) {
26777       var entity = graph.hasEntity(id2);
26778       if (!entity || entity.type !== "relation")
26779         return;
26780       entity.members.map(function(member) {
26781         return member.id;
26782       }).forEach(function(id3) {
26783         seen.add(id3);
26784       });
26785     }
26786   }
26787   function utilEntityOrDeepMemberSelector(ids, graph) {
26788     return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph));
26789   }
26790   function utilEntityAndDeepMemberIDs(ids, graph) {
26791     var seen = /* @__PURE__ */ new Set();
26792     ids.forEach(collectDeepDescendants);
26793     return Array.from(seen);
26794     function collectDeepDescendants(id2) {
26795       if (seen.has(id2))
26796         return;
26797       seen.add(id2);
26798       var entity = graph.hasEntity(id2);
26799       if (!entity || entity.type !== "relation")
26800         return;
26801       entity.members.map(function(member) {
26802         return member.id;
26803       }).forEach(collectDeepDescendants);
26804     }
26805   }
26806   function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) {
26807     var idsSet = new Set(ids);
26808     var seen = /* @__PURE__ */ new Set();
26809     var returners = /* @__PURE__ */ new Set();
26810     ids.forEach(collectDeepDescendants);
26811     return utilEntitySelector(Array.from(returners));
26812     function collectDeepDescendants(id2) {
26813       if (seen.has(id2))
26814         return;
26815       seen.add(id2);
26816       if (!idsSet.has(id2)) {
26817         returners.add(id2);
26818       }
26819       var entity = graph.hasEntity(id2);
26820       if (!entity || entity.type !== "relation")
26821         return;
26822       if (skipMultipolgonMembers && entity.isMultipolygon())
26823         return;
26824       entity.members.map(function(member) {
26825         return member.id;
26826       }).forEach(collectDeepDescendants);
26827     }
26828   }
26829   function utilHighlightEntities(ids, highlighted, context) {
26830     context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed("highlighted", highlighted);
26831   }
26832   function utilGetAllNodes(ids, graph) {
26833     var seen = /* @__PURE__ */ new Set();
26834     var nodes = /* @__PURE__ */ new Set();
26835     ids.forEach(collectNodes);
26836     return Array.from(nodes);
26837     function collectNodes(id2) {
26838       if (seen.has(id2))
26839         return;
26840       seen.add(id2);
26841       var entity = graph.hasEntity(id2);
26842       if (!entity)
26843         return;
26844       if (entity.type === "node") {
26845         nodes.add(entity);
26846       } else if (entity.type === "way") {
26847         entity.nodes.forEach(collectNodes);
26848       } else {
26849         entity.members.map(function(member) {
26850           return member.id;
26851         }).forEach(collectNodes);
26852       }
26853     }
26854   }
26855   function utilDisplayName(entity) {
26856     var localizedNameKey = "name:" + _mainLocalizer.languageCode().toLowerCase();
26857     var name = entity.tags[localizedNameKey] || entity.tags.name || "";
26858     if (name)
26859       return name;
26860     var tags = {
26861       direction: entity.tags.direction,
26862       from: entity.tags.from,
26863       network: entity.tags.cycle_network || entity.tags.network,
26864       ref: entity.tags.ref,
26865       to: entity.tags.to,
26866       via: entity.tags.via
26867     };
26868     var keyComponents = [];
26869     if (tags.network) {
26870       keyComponents.push("network");
26871     }
26872     if (tags.ref) {
26873       keyComponents.push("ref");
26874     }
26875     if (entity.tags.route) {
26876       if (tags.direction) {
26877         keyComponents.push("direction");
26878       } else if (tags.from && tags.to) {
26879         keyComponents.push("from");
26880         keyComponents.push("to");
26881         if (tags.via) {
26882           keyComponents.push("via");
26883         }
26884       }
26885     }
26886     if (keyComponents.length) {
26887       name = _t("inspector.display_name." + keyComponents.join("_"), tags);
26888     }
26889     return name;
26890   }
26891   function utilDisplayNameForPath(entity) {
26892     var name = utilDisplayName(entity);
26893     var isFirefox = utilDetect().browser.toLowerCase().indexOf("firefox") > -1;
26894     var isNewChromium = Number(utilDetect().version.split(".")[0]) >= 96;
26895     if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) {
26896       name = fixRTLTextForSvg(name);
26897     }
26898     return name;
26899   }
26900   function utilDisplayType(id2) {
26901     return {
26902       n: _t("inspector.node"),
26903       w: _t("inspector.way"),
26904       r: _t("inspector.relation")
26905     }[id2.charAt(0)];
26906   }
26907   function utilDisplayLabel(entity, graphOrGeometry, verbose) {
26908     var result;
26909     var displayName = utilDisplayName(entity);
26910     var preset = typeof graphOrGeometry === "string" ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry);
26911     var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name());
26912     if (verbose) {
26913       result = [presetName, displayName].filter(Boolean).join(" ");
26914     } else {
26915       result = displayName || presetName;
26916     }
26917     return result || utilDisplayType(entity.id);
26918   }
26919   function utilEntityRoot(entityType) {
26920     return {
26921       node: "n",
26922       way: "w",
26923       relation: "r"
26924     }[entityType];
26925   }
26926   function utilCombinedTags(entityIDs, graph) {
26927     var tags = {};
26928     var tagCounts = {};
26929     var allKeys = /* @__PURE__ */ new Set();
26930     var entities = entityIDs.map(function(entityID) {
26931       return graph.hasEntity(entityID);
26932     }).filter(Boolean);
26933     entities.forEach(function(entity) {
26934       var keys = Object.keys(entity.tags).filter(Boolean);
26935       keys.forEach(function(key2) {
26936         allKeys.add(key2);
26937       });
26938     });
26939     entities.forEach(function(entity) {
26940       allKeys.forEach(function(key2) {
26941         var value = entity.tags[key2];
26942         if (!tags.hasOwnProperty(key2)) {
26943           tags[key2] = value;
26944         } else {
26945           if (!Array.isArray(tags[key2])) {
26946             if (tags[key2] !== value) {
26947               tags[key2] = [tags[key2], value];
26948             }
26949           } else {
26950             if (tags[key2].indexOf(value) === -1) {
26951               tags[key2].push(value);
26952             }
26953           }
26954         }
26955         var tagHash = key2 + "=" + value;
26956         if (!tagCounts[tagHash])
26957           tagCounts[tagHash] = 0;
26958         tagCounts[tagHash] += 1;
26959       });
26960     });
26961     for (var key in tags) {
26962       if (!Array.isArray(tags[key]))
26963         continue;
26964       tags[key] = tags[key].sort(function(val12, val2) {
26965         var key2 = key2;
26966         var count2 = tagCounts[key2 + "=" + val2];
26967         var count1 = tagCounts[key2 + "=" + val12];
26968         if (count2 !== count1) {
26969           return count2 - count1;
26970         }
26971         if (val2 && val12) {
26972           return val12.localeCompare(val2);
26973         }
26974         return val12 ? 1 : -1;
26975       });
26976     }
26977     return tags;
26978   }
26979   function utilStringQs(str2) {
26980     var i2 = 0;
26981     while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#"))
26982       i2++;
26983     str2 = str2.slice(i2);
26984     return str2.split("&").reduce(function(obj, pair2) {
26985       var parts = pair2.split("=");
26986       if (parts.length === 2) {
26987         obj[parts[0]] = null === parts[1] ? "" : decodeURIComponent(parts[1]);
26988       }
26989       return obj;
26990     }, {});
26991   }
26992   function utilQsString(obj, noencode) {
26993     function softEncode(s) {
26994       return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26995     }
26996     return Object.keys(obj).sort().map(function(key) {
26997       return encodeURIComponent(key) + "=" + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26998     }).join("&");
26999   }
27000   function utilPrefixDOMProperty(property) {
27001     var prefixes2 = ["webkit", "ms", "moz", "o"];
27002     var i2 = -1;
27003     var n2 = prefixes2.length;
27004     var s = document.body;
27005     if (property in s)
27006       return property;
27007     property = property.slice(0, 1).toUpperCase() + property.slice(1);
27008     while (++i2 < n2) {
27009       if (prefixes2[i2] + property in s) {
27010         return prefixes2[i2] + property;
27011       }
27012     }
27013     return false;
27014   }
27015   function utilPrefixCSSProperty(property) {
27016     var prefixes2 = ["webkit", "ms", "Moz", "O"];
27017     var i2 = -1;
27018     var n2 = prefixes2.length;
27019     var s = document.body.style;
27020     if (property.toLowerCase() in s) {
27021       return property.toLowerCase();
27022     }
27023     while (++i2 < n2) {
27024       if (prefixes2[i2] + property in s) {
27025         return "-" + prefixes2[i2].toLowerCase() + property.replace(/([A-Z])/g, "-$1").toLowerCase();
27026       }
27027     }
27028     return false;
27029   }
27030   var transformProperty;
27031   function utilSetTransform(el, x, y, scale) {
27032     var prop = transformProperty = transformProperty || utilPrefixCSSProperty("Transform");
27033     var translate = utilDetect().opera ? "translate(" + x + "px," + y + "px)" : "translate3d(" + x + "px," + y + "px,0)";
27034     return el.style(prop, translate + (scale ? " scale(" + scale + ")" : ""));
27035   }
27036   function utilEditDistance(a, b) {
27037     a = (0, import_diacritics.remove)(a.toLowerCase());
27038     b = (0, import_diacritics.remove)(b.toLowerCase());
27039     if (a.length === 0)
27040       return b.length;
27041     if (b.length === 0)
27042       return a.length;
27043     var matrix = [];
27044     var i2, j2;
27045     for (i2 = 0; i2 <= b.length; i2++) {
27046       matrix[i2] = [i2];
27047     }
27048     for (j2 = 0; j2 <= a.length; j2++) {
27049       matrix[0][j2] = j2;
27050     }
27051     for (i2 = 1; i2 <= b.length; i2++) {
27052       for (j2 = 1; j2 <= a.length; j2++) {
27053         if (b.charAt(i2 - 1) === a.charAt(j2 - 1)) {
27054           matrix[i2][j2] = matrix[i2 - 1][j2 - 1];
27055         } else {
27056           matrix[i2][j2] = Math.min(
27057             matrix[i2 - 1][j2 - 1] + 1,
27058             // substitution
27059             Math.min(
27060               matrix[i2][j2 - 1] + 1,
27061               // insertion
27062               matrix[i2 - 1][j2] + 1
27063             )
27064           );
27065         }
27066       }
27067     }
27068     return matrix[b.length][a.length];
27069   }
27070   function utilFastMouse(container) {
27071     var rect = container.getBoundingClientRect();
27072     var rectLeft = rect.left;
27073     var rectTop = rect.top;
27074     var clientLeft = +container.clientLeft;
27075     var clientTop = +container.clientTop;
27076     return function(e) {
27077       return [
27078         e.clientX - rectLeft - clientLeft,
27079         e.clientY - rectTop - clientTop
27080       ];
27081     };
27082   }
27083   function utilAsyncMap(inputs, func, callback) {
27084     var remaining = inputs.length;
27085     var results = [];
27086     var errors = [];
27087     inputs.forEach(function(d, i2) {
27088       func(d, function done(err, data) {
27089         errors[i2] = err;
27090         results[i2] = data;
27091         remaining--;
27092         if (!remaining)
27093           callback(errors, results);
27094       });
27095     });
27096   }
27097   function utilWrap(index, length) {
27098     if (index < 0) {
27099       index += Math.ceil(-index / length) * length;
27100     }
27101     return index % length;
27102   }
27103   function utilFunctor(value) {
27104     if (typeof value === "function")
27105       return value;
27106     return function() {
27107       return value;
27108     };
27109   }
27110   function utilNoAuto(selection2) {
27111     var isText = selection2.size() && selection2.node().tagName.toLowerCase() === "textarea";
27112     return selection2.attr("autocomplete", "new-password").attr("autocorrect", "off").attr("autocapitalize", "off").attr("spellcheck", isText ? "true" : "false");
27113   }
27114   function utilHashcode(str2) {
27115     var hash = 0;
27116     if (str2.length === 0) {
27117       return hash;
27118     }
27119     for (var i2 = 0; i2 < str2.length; i2++) {
27120       var char = str2.charCodeAt(i2);
27121       hash = (hash << 5) - hash + char;
27122       hash = hash & hash;
27123     }
27124     return hash;
27125   }
27126   function utilSafeClassName(str2) {
27127     return str2.toLowerCase().replace(/[^a-z0-9]+/g, "_");
27128   }
27129   function utilUniqueDomId(val) {
27130     return "ideditor-" + utilSafeClassName(val.toString()) + "-" + new Date().getTime().toString();
27131   }
27132   function utilUnicodeCharsCount(str2) {
27133     return Array.from(str2).length;
27134   }
27135   function utilUnicodeCharsTruncated(str2, limit) {
27136     return Array.from(str2).slice(0, limit).join("");
27137   }
27138   function toNumericID(id2) {
27139     var match = id2.match(/^[cnwr](-?\d+)$/);
27140     if (match) {
27141       return parseInt(match[1], 10);
27142     }
27143     return NaN;
27144   }
27145   function compareNumericIDs(left, right) {
27146     if (isNaN(left) && isNaN(right))
27147       return -1;
27148     if (isNaN(left))
27149       return 1;
27150     if (isNaN(right))
27151       return -1;
27152     if (Math.sign(left) !== Math.sign(right))
27153       return -Math.sign(left);
27154     if (Math.sign(left) < 0)
27155       return Math.sign(right - left);
27156     return Math.sign(left - right);
27157   }
27158   function utilCompareIDs(left, right) {
27159     return compareNumericIDs(toNumericID(left), toNumericID(right));
27160   }
27161   function utilOldestID(ids) {
27162     if (ids.length === 0) {
27163       return void 0;
27164     }
27165     var oldestIDIndex = 0;
27166     var oldestID = toNumericID(ids[0]);
27167     for (var i2 = 1; i2 < ids.length; i2++) {
27168       var num = toNumericID(ids[i2]);
27169       if (compareNumericIDs(oldestID, num) === 1) {
27170         oldestIDIndex = i2;
27171         oldestID = num;
27172       }
27173     }
27174     return ids[oldestIDIndex];
27175   }
27176   function utilCleanOsmString(val, maxChars) {
27177     if (val === void 0 || val === null) {
27178       val = "";
27179     } else {
27180       val = val.toString();
27181     }
27182     val = val.trim();
27183     if (val.normalize)
27184       val = val.normalize("NFC");
27185     return utilUnicodeCharsTruncated(val, maxChars);
27186   }
27187
27188   // modules/osm/entity.js
27189   function osmEntity(attrs) {
27190     if (this instanceof osmEntity)
27191       return;
27192     if (attrs && attrs.type) {
27193       return osmEntity[attrs.type].apply(this, arguments);
27194     } else if (attrs && attrs.id) {
27195       return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
27196     }
27197     return new osmEntity().initialize(arguments);
27198   }
27199   osmEntity.id = function(type2) {
27200     return osmEntity.id.fromOSM(type2, osmEntity.id.next[type2]--);
27201   };
27202   osmEntity.id.next = {
27203     changeset: -1,
27204     node: -1,
27205     way: -1,
27206     relation: -1
27207   };
27208   osmEntity.id.fromOSM = function(type2, id2) {
27209     return type2[0] + id2;
27210   };
27211   osmEntity.id.toOSM = function(id2) {
27212     var match = id2.match(/^[cnwr](-?\d+)$/);
27213     if (match) {
27214       return match[1];
27215     }
27216     return "";
27217   };
27218   osmEntity.id.type = function(id2) {
27219     return { "c": "changeset", "n": "node", "w": "way", "r": "relation" }[id2[0]];
27220   };
27221   osmEntity.key = function(entity) {
27222     return entity.id + "v" + (entity.v || 0);
27223   };
27224   var _deprecatedTagValuesByKey;
27225   osmEntity.deprecatedTagValuesByKey = function(dataDeprecated) {
27226     if (!_deprecatedTagValuesByKey) {
27227       _deprecatedTagValuesByKey = {};
27228       dataDeprecated.forEach(function(d) {
27229         var oldKeys = Object.keys(d.old);
27230         if (oldKeys.length === 1) {
27231           var oldKey = oldKeys[0];
27232           var oldValue = d.old[oldKey];
27233           if (oldValue !== "*") {
27234             if (!_deprecatedTagValuesByKey[oldKey]) {
27235               _deprecatedTagValuesByKey[oldKey] = [oldValue];
27236             } else {
27237               _deprecatedTagValuesByKey[oldKey].push(oldValue);
27238             }
27239           }
27240         }
27241       });
27242     }
27243     return _deprecatedTagValuesByKey;
27244   };
27245   osmEntity.prototype = {
27246     tags: {},
27247     initialize: function(sources) {
27248       for (var i2 = 0; i2 < sources.length; ++i2) {
27249         var source = sources[i2];
27250         for (var prop in source) {
27251           if (Object.prototype.hasOwnProperty.call(source, prop)) {
27252             if (source[prop] === void 0) {
27253               delete this[prop];
27254             } else {
27255               this[prop] = source[prop];
27256             }
27257           }
27258         }
27259       }
27260       if (!this.id && this.type) {
27261         this.id = osmEntity.id(this.type);
27262       }
27263       if (!this.hasOwnProperty("visible")) {
27264         this.visible = true;
27265       }
27266       if (debug) {
27267         Object.freeze(this);
27268         Object.freeze(this.tags);
27269         if (this.loc)
27270           Object.freeze(this.loc);
27271         if (this.nodes)
27272           Object.freeze(this.nodes);
27273         if (this.members)
27274           Object.freeze(this.members);
27275       }
27276       return this;
27277     },
27278     copy: function(resolver, copies) {
27279       if (copies[this.id])
27280         return copies[this.id];
27281       var copy2 = osmEntity(this, { id: void 0, user: void 0, version: void 0 });
27282       copies[this.id] = copy2;
27283       return copy2;
27284     },
27285     osmId: function() {
27286       return osmEntity.id.toOSM(this.id);
27287     },
27288     isNew: function() {
27289       var osmId = osmEntity.id.toOSM(this.id);
27290       return osmId.length === 0 || osmId[0] === "-";
27291     },
27292     update: function(attrs) {
27293       return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
27294     },
27295     mergeTags: function(tags) {
27296       var merged = Object.assign({}, this.tags);
27297       var changed = false;
27298       for (var k in tags) {
27299         var t1 = merged[k];
27300         var t2 = tags[k];
27301         if (!t1) {
27302           changed = true;
27303           merged[k] = t2;
27304         } else if (t1 !== t2) {
27305           changed = true;
27306           merged[k] = utilUnicodeCharsTruncated(
27307             utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(";"),
27308             255
27309             // avoid exceeding character limit; see also context.maxCharsForTagValue()
27310           );
27311         }
27312       }
27313       return changed ? this.update({ tags: merged }) : this;
27314     },
27315     intersects: function(extent, resolver) {
27316       return this.extent(resolver).intersects(extent);
27317     },
27318     hasNonGeometryTags: function() {
27319       return Object.keys(this.tags).some(function(k) {
27320         return k !== "area";
27321       });
27322     },
27323     hasParentRelations: function(resolver) {
27324       return resolver.parentRelations(this).length > 0;
27325     },
27326     hasInterestingTags: function() {
27327       return Object.keys(this.tags).some(osmIsInterestingTag);
27328     },
27329     isHighwayIntersection: function() {
27330       return false;
27331     },
27332     isDegenerate: function() {
27333       return true;
27334     },
27335     deprecatedTags: function(dataDeprecated) {
27336       var tags = this.tags;
27337       if (Object.keys(tags).length === 0)
27338         return [];
27339       var deprecated = [];
27340       dataDeprecated.forEach(function(d) {
27341         var oldKeys = Object.keys(d.old);
27342         if (d.replace) {
27343           var hasExistingValues = Object.keys(d.replace).some(function(replaceKey) {
27344             if (!tags[replaceKey] || d.old[replaceKey])
27345               return false;
27346             var replaceValue = d.replace[replaceKey];
27347             if (replaceValue === "*")
27348               return false;
27349             if (replaceValue === tags[replaceKey])
27350               return false;
27351             return true;
27352           });
27353           if (hasExistingValues)
27354             return;
27355         }
27356         var matchesDeprecatedTags = oldKeys.every(function(oldKey) {
27357           if (!tags[oldKey])
27358             return false;
27359           if (d.old[oldKey] === "*")
27360             return true;
27361           if (d.old[oldKey] === tags[oldKey])
27362             return true;
27363           var vals = tags[oldKey].split(";").filter(Boolean);
27364           if (vals.length === 0) {
27365             return false;
27366           } else if (vals.length > 1) {
27367             return vals.indexOf(d.old[oldKey]) !== -1;
27368           } else {
27369             if (tags[oldKey] === d.old[oldKey]) {
27370               if (d.replace && d.old[oldKey] === d.replace[oldKey]) {
27371                 var replaceKeys = Object.keys(d.replace);
27372                 return !replaceKeys.every(function(replaceKey) {
27373                   return tags[replaceKey] === d.replace[replaceKey];
27374                 });
27375               } else {
27376                 return true;
27377               }
27378             }
27379           }
27380           return false;
27381         });
27382         if (matchesDeprecatedTags) {
27383           deprecated.push(d);
27384         }
27385       });
27386       return deprecated;
27387     }
27388   };
27389
27390   // modules/osm/lanes.js
27391   function osmLanes(entity) {
27392     if (entity.type !== "way")
27393       return null;
27394     if (!entity.tags.highway)
27395       return null;
27396     var tags = entity.tags;
27397     var isOneWay = entity.isOneWay();
27398     var laneCount = getLaneCount(tags, isOneWay);
27399     var maxspeed = parseMaxspeed(tags);
27400     var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
27401     var forward = laneDirections.forward;
27402     var backward = laneDirections.backward;
27403     var bothways = laneDirections.bothways;
27404     var turnLanes = {};
27405     turnLanes.unspecified = parseTurnLanes(tags["turn:lanes"]);
27406     turnLanes.forward = parseTurnLanes(tags["turn:lanes:forward"]);
27407     turnLanes.backward = parseTurnLanes(tags["turn:lanes:backward"]);
27408     var maxspeedLanes = {};
27409     maxspeedLanes.unspecified = parseMaxspeedLanes(tags["maxspeed:lanes"], maxspeed);
27410     maxspeedLanes.forward = parseMaxspeedLanes(tags["maxspeed:lanes:forward"], maxspeed);
27411     maxspeedLanes.backward = parseMaxspeedLanes(tags["maxspeed:lanes:backward"], maxspeed);
27412     var psvLanes = {};
27413     psvLanes.unspecified = parseMiscLanes(tags["psv:lanes"]);
27414     psvLanes.forward = parseMiscLanes(tags["psv:lanes:forward"]);
27415     psvLanes.backward = parseMiscLanes(tags["psv:lanes:backward"]);
27416     var busLanes = {};
27417     busLanes.unspecified = parseMiscLanes(tags["bus:lanes"]);
27418     busLanes.forward = parseMiscLanes(tags["bus:lanes:forward"]);
27419     busLanes.backward = parseMiscLanes(tags["bus:lanes:backward"]);
27420     var taxiLanes = {};
27421     taxiLanes.unspecified = parseMiscLanes(tags["taxi:lanes"]);
27422     taxiLanes.forward = parseMiscLanes(tags["taxi:lanes:forward"]);
27423     taxiLanes.backward = parseMiscLanes(tags["taxi:lanes:backward"]);
27424     var hovLanes = {};
27425     hovLanes.unspecified = parseMiscLanes(tags["hov:lanes"]);
27426     hovLanes.forward = parseMiscLanes(tags["hov:lanes:forward"]);
27427     hovLanes.backward = parseMiscLanes(tags["hov:lanes:backward"]);
27428     var hgvLanes = {};
27429     hgvLanes.unspecified = parseMiscLanes(tags["hgv:lanes"]);
27430     hgvLanes.forward = parseMiscLanes(tags["hgv:lanes:forward"]);
27431     hgvLanes.backward = parseMiscLanes(tags["hgv:lanes:backward"]);
27432     var bicyclewayLanes = {};
27433     bicyclewayLanes.unspecified = parseBicycleWay(tags["bicycleway:lanes"]);
27434     bicyclewayLanes.forward = parseBicycleWay(tags["bicycleway:lanes:forward"]);
27435     bicyclewayLanes.backward = parseBicycleWay(tags["bicycleway:lanes:backward"]);
27436     var lanesObj = {
27437       forward: [],
27438       backward: [],
27439       unspecified: []
27440     };
27441     mapToLanesObj(lanesObj, turnLanes, "turnLane");
27442     mapToLanesObj(lanesObj, maxspeedLanes, "maxspeed");
27443     mapToLanesObj(lanesObj, psvLanes, "psv");
27444     mapToLanesObj(lanesObj, busLanes, "bus");
27445     mapToLanesObj(lanesObj, taxiLanes, "taxi");
27446     mapToLanesObj(lanesObj, hovLanes, "hov");
27447     mapToLanesObj(lanesObj, hgvLanes, "hgv");
27448     mapToLanesObj(lanesObj, bicyclewayLanes, "bicycleway");
27449     return {
27450       metadata: {
27451         count: laneCount,
27452         oneway: isOneWay,
27453         forward,
27454         backward,
27455         bothways,
27456         turnLanes,
27457         maxspeed,
27458         maxspeedLanes,
27459         psvLanes,
27460         busLanes,
27461         taxiLanes,
27462         hovLanes,
27463         hgvLanes,
27464         bicyclewayLanes
27465       },
27466       lanes: lanesObj
27467     };
27468   }
27469   function getLaneCount(tags, isOneWay) {
27470     var count;
27471     if (tags.lanes) {
27472       count = parseInt(tags.lanes, 10);
27473       if (count > 0) {
27474         return count;
27475       }
27476     }
27477     switch (tags.highway) {
27478       case "trunk":
27479       case "motorway":
27480         count = isOneWay ? 2 : 4;
27481         break;
27482       default:
27483         count = isOneWay ? 1 : 2;
27484         break;
27485     }
27486     return count;
27487   }
27488   function parseMaxspeed(tags) {
27489     var maxspeed = tags.maxspeed;
27490     if (!maxspeed)
27491       return;
27492     var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
27493     if (!maxspeedRegex.test(maxspeed))
27494       return;
27495     return parseInt(maxspeed, 10);
27496   }
27497   function parseLaneDirections(tags, isOneWay, laneCount) {
27498     var forward = parseInt(tags["lanes:forward"], 10);
27499     var backward = parseInt(tags["lanes:backward"], 10);
27500     var bothways = parseInt(tags["lanes:both_ways"], 10) > 0 ? 1 : 0;
27501     if (parseInt(tags.oneway, 10) === -1) {
27502       forward = 0;
27503       bothways = 0;
27504       backward = laneCount;
27505     } else if (isOneWay) {
27506       forward = laneCount;
27507       bothways = 0;
27508       backward = 0;
27509     } else if (isNaN(forward) && isNaN(backward)) {
27510       backward = Math.floor((laneCount - bothways) / 2);
27511       forward = laneCount - bothways - backward;
27512     } else if (isNaN(forward)) {
27513       if (backward > laneCount - bothways) {
27514         backward = laneCount - bothways;
27515       }
27516       forward = laneCount - bothways - backward;
27517     } else if (isNaN(backward)) {
27518       if (forward > laneCount - bothways) {
27519         forward = laneCount - bothways;
27520       }
27521       backward = laneCount - bothways - forward;
27522     }
27523     return {
27524       forward,
27525       backward,
27526       bothways
27527     };
27528   }
27529   function parseTurnLanes(tag) {
27530     if (!tag)
27531       return;
27532     var validValues = [
27533       "left",
27534       "slight_left",
27535       "sharp_left",
27536       "through",
27537       "right",
27538       "slight_right",
27539       "sharp_right",
27540       "reverse",
27541       "merge_to_left",
27542       "merge_to_right",
27543       "none"
27544     ];
27545     return tag.split("|").map(function(s) {
27546       if (s === "")
27547         s = "none";
27548       return s.split(";").map(function(d) {
27549         return validValues.indexOf(d) === -1 ? "unknown" : d;
27550       });
27551     });
27552   }
27553   function parseMaxspeedLanes(tag, maxspeed) {
27554     if (!tag)
27555       return;
27556     return tag.split("|").map(function(s) {
27557       if (s === "none")
27558         return s;
27559       var m = parseInt(s, 10);
27560       if (s === "" || m === maxspeed)
27561         return null;
27562       return isNaN(m) ? "unknown" : m;
27563     });
27564   }
27565   function parseMiscLanes(tag) {
27566     if (!tag)
27567       return;
27568     var validValues = [
27569       "yes",
27570       "no",
27571       "designated"
27572     ];
27573     return tag.split("|").map(function(s) {
27574       if (s === "")
27575         s = "no";
27576       return validValues.indexOf(s) === -1 ? "unknown" : s;
27577     });
27578   }
27579   function parseBicycleWay(tag) {
27580     if (!tag)
27581       return;
27582     var validValues = [
27583       "yes",
27584       "no",
27585       "designated",
27586       "lane"
27587     ];
27588     return tag.split("|").map(function(s) {
27589       if (s === "")
27590         s = "no";
27591       return validValues.indexOf(s) === -1 ? "unknown" : s;
27592     });
27593   }
27594   function mapToLanesObj(lanesObj, data, key) {
27595     if (data.forward) {
27596       data.forward.forEach(function(l, i2) {
27597         if (!lanesObj.forward[i2])
27598           lanesObj.forward[i2] = {};
27599         lanesObj.forward[i2][key] = l;
27600       });
27601     }
27602     if (data.backward) {
27603       data.backward.forEach(function(l, i2) {
27604         if (!lanesObj.backward[i2])
27605           lanesObj.backward[i2] = {};
27606         lanesObj.backward[i2][key] = l;
27607       });
27608     }
27609     if (data.unspecified) {
27610       data.unspecified.forEach(function(l, i2) {
27611         if (!lanesObj.unspecified[i2])
27612           lanesObj.unspecified[i2] = {};
27613         lanesObj.unspecified[i2][key] = l;
27614       });
27615     }
27616   }
27617
27618   // modules/osm/way.js
27619   function osmWay() {
27620     if (!(this instanceof osmWay)) {
27621       return new osmWay().initialize(arguments);
27622     } else if (arguments.length) {
27623       this.initialize(arguments);
27624     }
27625   }
27626   osmEntity.way = osmWay;
27627   osmWay.prototype = Object.create(osmEntity.prototype);
27628   Object.assign(osmWay.prototype, {
27629     type: "way",
27630     nodes: [],
27631     copy: function(resolver, copies) {
27632       if (copies[this.id])
27633         return copies[this.id];
27634       var copy2 = osmEntity.prototype.copy.call(this, resolver, copies);
27635       var nodes = this.nodes.map(function(id2) {
27636         return resolver.entity(id2).copy(resolver, copies).id;
27637       });
27638       copy2 = copy2.update({ nodes });
27639       copies[this.id] = copy2;
27640       return copy2;
27641     },
27642     extent: function(resolver) {
27643       return resolver.transient(this, "extent", function() {
27644         var extent = geoExtent();
27645         for (var i2 = 0; i2 < this.nodes.length; i2++) {
27646           var node = resolver.hasEntity(this.nodes[i2]);
27647           if (node) {
27648             extent._extend(node.extent());
27649           }
27650         }
27651         return extent;
27652       });
27653     },
27654     first: function() {
27655       return this.nodes[0];
27656     },
27657     last: function() {
27658       return this.nodes[this.nodes.length - 1];
27659     },
27660     contains: function(node) {
27661       return this.nodes.indexOf(node) >= 0;
27662     },
27663     affix: function(node) {
27664       if (this.nodes[0] === node)
27665         return "prefix";
27666       if (this.nodes[this.nodes.length - 1] === node)
27667         return "suffix";
27668     },
27669     layer: function() {
27670       if (isFinite(this.tags.layer)) {
27671         return Math.max(-10, Math.min(+this.tags.layer, 10));
27672       }
27673       if (this.tags.covered === "yes")
27674         return -1;
27675       if (this.tags.location === "overground")
27676         return 1;
27677       if (this.tags.location === "underground")
27678         return -1;
27679       if (this.tags.location === "underwater")
27680         return -10;
27681       if (this.tags.power === "line")
27682         return 10;
27683       if (this.tags.power === "minor_line")
27684         return 10;
27685       if (this.tags.aerialway)
27686         return 10;
27687       if (this.tags.bridge)
27688         return 1;
27689       if (this.tags.cutting)
27690         return -1;
27691       if (this.tags.tunnel)
27692         return -1;
27693       if (this.tags.waterway)
27694         return -1;
27695       if (this.tags.man_made === "pipeline")
27696         return -10;
27697       if (this.tags.boundary)
27698         return -10;
27699       return 0;
27700     },
27701     // the approximate width of the line based on its tags except its `width` tag
27702     impliedLineWidthMeters: function() {
27703       var averageWidths = {
27704         highway: {
27705           // width is for single lane
27706           motorway: 5,
27707           motorway_link: 5,
27708           trunk: 4.5,
27709           trunk_link: 4.5,
27710           primary: 4,
27711           secondary: 4,
27712           tertiary: 4,
27713           primary_link: 4,
27714           secondary_link: 4,
27715           tertiary_link: 4,
27716           unclassified: 4,
27717           road: 4,
27718           living_street: 4,
27719           bus_guideway: 4,
27720           pedestrian: 4,
27721           residential: 3.5,
27722           service: 3.5,
27723           track: 3,
27724           cycleway: 2.5,
27725           bridleway: 2,
27726           corridor: 2,
27727           steps: 2,
27728           path: 1.5,
27729           footway: 1.5
27730         },
27731         railway: {
27732           // width includes ties and rail bed, not just track gauge
27733           rail: 2.5,
27734           light_rail: 2.5,
27735           tram: 2.5,
27736           subway: 2.5,
27737           monorail: 2.5,
27738           funicular: 2.5,
27739           disused: 2.5,
27740           preserved: 2.5,
27741           miniature: 1.5,
27742           narrow_gauge: 1.5
27743         },
27744         waterway: {
27745           river: 50,
27746           canal: 25,
27747           stream: 5,
27748           tidal_channel: 5,
27749           fish_pass: 2.5,
27750           drain: 2.5,
27751           ditch: 1.5
27752         }
27753       };
27754       for (var key in averageWidths) {
27755         if (this.tags[key] && averageWidths[key][this.tags[key]]) {
27756           var width = averageWidths[key][this.tags[key]];
27757           if (key === "highway") {
27758             var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10);
27759             if (!laneCount)
27760               laneCount = this.isOneWay() ? 1 : 2;
27761             return width * laneCount;
27762           }
27763           return width;
27764         }
27765       }
27766       return null;
27767     },
27768     isOneWay: function() {
27769       var values = {
27770         "yes": true,
27771         "1": true,
27772         "-1": true,
27773         "reversible": true,
27774         "alternating": true,
27775         "no": false,
27776         "0": false
27777       };
27778       if (values[this.tags.oneway] !== void 0) {
27779         return values[this.tags.oneway];
27780       }
27781       for (var key in this.tags) {
27782         if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) {
27783           return true;
27784         }
27785       }
27786       return false;
27787     },
27788     // Some identifier for tag that implies that this way is "sided",
27789     // i.e. the right side is the 'inside' (e.g. the right side of a
27790     // natural=cliff is lower).
27791     sidednessIdentifier: function() {
27792       for (var key in this.tags) {
27793         var value = this.tags[key];
27794         if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) {
27795           if (osmRightSideIsInsideTags[key][value] === true) {
27796             return key;
27797           } else {
27798             return osmRightSideIsInsideTags[key][value];
27799           }
27800         }
27801       }
27802       return null;
27803     },
27804     isSided: function() {
27805       if (this.tags.two_sided === "yes") {
27806         return false;
27807       }
27808       return this.sidednessIdentifier() !== null;
27809     },
27810     lanes: function() {
27811       return osmLanes(this);
27812     },
27813     isClosed: function() {
27814       return this.nodes.length > 1 && this.first() === this.last();
27815     },
27816     isConvex: function(resolver) {
27817       if (!this.isClosed() || this.isDegenerate())
27818         return null;
27819       var nodes = utilArrayUniq(resolver.childNodes(this));
27820       var coords = nodes.map(function(n2) {
27821         return n2.loc;
27822       });
27823       var curr = 0;
27824       var prev = 0;
27825       for (var i2 = 0; i2 < coords.length; i2++) {
27826         var o = coords[(i2 + 1) % coords.length];
27827         var a = coords[i2];
27828         var b = coords[(i2 + 2) % coords.length];
27829         var res = geoVecCross(a, b, o);
27830         curr = res > 0 ? 1 : res < 0 ? -1 : 0;
27831         if (curr === 0) {
27832           continue;
27833         } else if (prev && curr !== prev) {
27834           return false;
27835         }
27836         prev = curr;
27837       }
27838       return true;
27839     },
27840     // returns an object with the tag that implies this is an area, if any
27841     tagSuggestingArea: function() {
27842       return osmTagSuggestingArea(this.tags);
27843     },
27844     isArea: function() {
27845       if (this.tags.area === "yes")
27846         return true;
27847       if (!this.isClosed() || this.tags.area === "no")
27848         return false;
27849       return this.tagSuggestingArea() !== null;
27850     },
27851     isDegenerate: function() {
27852       return new Set(this.nodes).size < (this.isArea() ? 3 : 2);
27853     },
27854     areAdjacent: function(n1, n2) {
27855       for (var i2 = 0; i2 < this.nodes.length; i2++) {
27856         if (this.nodes[i2] === n1) {
27857           if (this.nodes[i2 - 1] === n2)
27858             return true;
27859           if (this.nodes[i2 + 1] === n2)
27860             return true;
27861         }
27862       }
27863       return false;
27864     },
27865     geometry: function(graph) {
27866       return graph.transient(this, "geometry", function() {
27867         return this.isArea() ? "area" : "line";
27868       });
27869     },
27870     // returns an array of objects representing the segments between the nodes in this way
27871     segments: function(graph) {
27872       function segmentExtent(graph2) {
27873         var n1 = graph2.hasEntity(this.nodes[0]);
27874         var n2 = graph2.hasEntity(this.nodes[1]);
27875         return n1 && n2 && geoExtent([
27876           [
27877             Math.min(n1.loc[0], n2.loc[0]),
27878             Math.min(n1.loc[1], n2.loc[1])
27879           ],
27880           [
27881             Math.max(n1.loc[0], n2.loc[0]),
27882             Math.max(n1.loc[1], n2.loc[1])
27883           ]
27884         ]);
27885       }
27886       return graph.transient(this, "segments", function() {
27887         var segments = [];
27888         for (var i2 = 0; i2 < this.nodes.length - 1; i2++) {
27889           segments.push({
27890             id: this.id + "-" + i2,
27891             wayId: this.id,
27892             index: i2,
27893             nodes: [this.nodes[i2], this.nodes[i2 + 1]],
27894             extent: segmentExtent
27895           });
27896         }
27897         return segments;
27898       });
27899     },
27900     // If this way is not closed, append the beginning node to the end of the nodelist to close it.
27901     close: function() {
27902       if (this.isClosed() || !this.nodes.length)
27903         return this;
27904       var nodes = this.nodes.slice();
27905       nodes = nodes.filter(noRepeatNodes);
27906       nodes.push(nodes[0]);
27907       return this.update({ nodes });
27908     },
27909     // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
27910     unclose: function() {
27911       if (!this.isClosed())
27912         return this;
27913       var nodes = this.nodes.slice();
27914       var connector = this.first();
27915       var i2 = nodes.length - 1;
27916       while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
27917         nodes.splice(i2, 1);
27918         i2 = nodes.length - 1;
27919       }
27920       nodes = nodes.filter(noRepeatNodes);
27921       return this.update({ nodes });
27922     },
27923     // Adds a node (id) in front of the node which is currently at position index.
27924     // If index is undefined, the node will be added to the end of the way for linear ways,
27925     //   or just before the final connecting node for circular ways.
27926     // Consecutive duplicates are eliminated including existing ones.
27927     // Circularity is always preserved when adding a node.
27928     addNode: function(id2, index) {
27929       var nodes = this.nodes.slice();
27930       var isClosed = this.isClosed();
27931       var max3 = isClosed ? nodes.length - 1 : nodes.length;
27932       if (index === void 0) {
27933         index = max3;
27934       }
27935       if (index < 0 || index > max3) {
27936         throw new RangeError("index " + index + " out of range 0.." + max3);
27937       }
27938       if (isClosed) {
27939         var connector = this.first();
27940         var i2 = 1;
27941         while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) {
27942           nodes.splice(i2, 1);
27943           if (index > i2)
27944             index--;
27945         }
27946         i2 = nodes.length - 1;
27947         while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
27948           nodes.splice(i2, 1);
27949           if (index > i2)
27950             index--;
27951           i2 = nodes.length - 1;
27952         }
27953       }
27954       nodes.splice(index, 0, id2);
27955       nodes = nodes.filter(noRepeatNodes);
27956       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
27957         nodes.push(nodes[0]);
27958       }
27959       return this.update({ nodes });
27960     },
27961     // Replaces the node which is currently at position index with the given node (id).
27962     // Consecutive duplicates are eliminated including existing ones.
27963     // Circularity is preserved when updating a node.
27964     updateNode: function(id2, index) {
27965       var nodes = this.nodes.slice();
27966       var isClosed = this.isClosed();
27967       var max3 = nodes.length - 1;
27968       if (index === void 0 || index < 0 || index > max3) {
27969         throw new RangeError("index " + index + " out of range 0.." + max3);
27970       }
27971       if (isClosed) {
27972         var connector = this.first();
27973         var i2 = 1;
27974         while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) {
27975           nodes.splice(i2, 1);
27976           if (index > i2)
27977             index--;
27978         }
27979         i2 = nodes.length - 1;
27980         while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
27981           nodes.splice(i2, 1);
27982           if (index === i2)
27983             index = 0;
27984           i2 = nodes.length - 1;
27985         }
27986       }
27987       nodes.splice(index, 1, id2);
27988       nodes = nodes.filter(noRepeatNodes);
27989       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
27990         nodes.push(nodes[0]);
27991       }
27992       return this.update({ nodes });
27993     },
27994     // Replaces each occurrence of node id needle with replacement.
27995     // Consecutive duplicates are eliminated including existing ones.
27996     // Circularity is preserved.
27997     replaceNode: function(needleID, replacementID) {
27998       var nodes = this.nodes.slice();
27999       var isClosed = this.isClosed();
28000       for (var i2 = 0; i2 < nodes.length; i2++) {
28001         if (nodes[i2] === needleID) {
28002           nodes[i2] = replacementID;
28003         }
28004       }
28005       nodes = nodes.filter(noRepeatNodes);
28006       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
28007         nodes.push(nodes[0]);
28008       }
28009       return this.update({ nodes });
28010     },
28011     // Removes each occurrence of node id.
28012     // Consecutive duplicates are eliminated including existing ones.
28013     // Circularity is preserved.
28014     removeNode: function(id2) {
28015       var nodes = this.nodes.slice();
28016       var isClosed = this.isClosed();
28017       nodes = nodes.filter(function(node) {
28018         return node !== id2;
28019       }).filter(noRepeatNodes);
28020       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
28021         nodes.push(nodes[0]);
28022       }
28023       return this.update({ nodes });
28024     },
28025     asJXON: function(changeset_id) {
28026       var r = {
28027         way: {
28028           "@id": this.osmId(),
28029           "@version": this.version || 0,
28030           nd: this.nodes.map(function(id2) {
28031             return { keyAttributes: { ref: osmEntity.id.toOSM(id2) } };
28032           }, this),
28033           tag: Object.keys(this.tags).map(function(k) {
28034             return { keyAttributes: { k, v: this.tags[k] } };
28035           }, this)
28036         }
28037       };
28038       if (changeset_id) {
28039         r.way["@changeset"] = changeset_id;
28040       }
28041       return r;
28042     },
28043     asGeoJSON: function(resolver) {
28044       return resolver.transient(this, "GeoJSON", function() {
28045         var coordinates = resolver.childNodes(this).map(function(n2) {
28046           return n2.loc;
28047         });
28048         if (this.isArea() && this.isClosed()) {
28049           return {
28050             type: "Polygon",
28051             coordinates: [coordinates]
28052           };
28053         } else {
28054           return {
28055             type: "LineString",
28056             coordinates
28057           };
28058         }
28059       });
28060     },
28061     area: function(resolver) {
28062       return resolver.transient(this, "area", function() {
28063         var nodes = resolver.childNodes(this);
28064         var json = {
28065           type: "Polygon",
28066           coordinates: [nodes.map(function(n2) {
28067             return n2.loc;
28068           })]
28069         };
28070         if (!this.isClosed() && nodes.length) {
28071           json.coordinates[0].push(nodes[0].loc);
28072         }
28073         var area = area_default(json);
28074         if (area > 2 * Math.PI) {
28075           json.coordinates[0] = json.coordinates[0].reverse();
28076           area = area_default(json);
28077         }
28078         return isNaN(area) ? 0 : area;
28079       });
28080     }
28081   });
28082   function noRepeatNodes(node, i2, arr) {
28083     return i2 === 0 || node !== arr[i2 - 1];
28084   }
28085
28086   // modules/osm/multipolygon.js
28087   function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
28088     if (entity.type !== "relation" || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
28089       return false;
28090     }
28091     var outerMember;
28092     for (var memberIndex in entity.members) {
28093       var member = entity.members[memberIndex];
28094       if (!member.role || member.role === "outer") {
28095         if (outerMember)
28096           return false;
28097         if (member.type !== "way")
28098           return false;
28099         if (!graph.hasEntity(member.id))
28100           return false;
28101         outerMember = graph.entity(member.id);
28102         if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
28103           return false;
28104         }
28105       }
28106     }
28107     return outerMember;
28108   }
28109   function osmIsOldMultipolygonOuterMember(entity, graph) {
28110     if (entity.type !== "way" || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) {
28111       return false;
28112     }
28113     var parents = graph.parentRelations(entity);
28114     if (parents.length !== 1)
28115       return false;
28116     var parent = parents[0];
28117     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
28118       return false;
28119     }
28120     var members = parent.members, member;
28121     for (var i2 = 0; i2 < members.length; i2++) {
28122       member = members[i2];
28123       if (member.id === entity.id && member.role && member.role !== "outer") {
28124         return false;
28125       }
28126       if (member.id !== entity.id && (!member.role || member.role === "outer")) {
28127         return false;
28128       }
28129     }
28130     return parent;
28131   }
28132   function osmOldMultipolygonOuterMember(entity, graph) {
28133     if (entity.type !== "way")
28134       return false;
28135     var parents = graph.parentRelations(entity);
28136     if (parents.length !== 1)
28137       return false;
28138     var parent = parents[0];
28139     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
28140       return false;
28141     }
28142     var members = parent.members, member, outerMember;
28143     for (var i2 = 0; i2 < members.length; i2++) {
28144       member = members[i2];
28145       if (!member.role || member.role === "outer") {
28146         if (outerMember)
28147           return false;
28148         outerMember = member;
28149       }
28150     }
28151     if (!outerMember)
28152       return false;
28153     var outerEntity = graph.hasEntity(outerMember.id);
28154     if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) {
28155       return false;
28156     }
28157     return outerEntity;
28158   }
28159   function osmJoinWays(toJoin, graph) {
28160     function resolve(member) {
28161       return graph.childNodes(graph.entity(member.id));
28162     }
28163     function reverse(item2) {
28164       var action = actionReverse(item2.id, { reverseOneway: true });
28165       sequences.actions.push(action);
28166       return item2 instanceof osmWay ? action(graph).entity(item2.id) : item2;
28167     }
28168     toJoin = toJoin.filter(function(member) {
28169       return member.type === "way" && graph.hasEntity(member.id);
28170     });
28171     var i2;
28172     var joinAsMembers = true;
28173     for (i2 = 0; i2 < toJoin.length; i2++) {
28174       if (toJoin[i2] instanceof osmWay) {
28175         joinAsMembers = false;
28176         break;
28177       }
28178     }
28179     var sequences = [];
28180     sequences.actions = [];
28181     while (toJoin.length) {
28182       var item = toJoin.shift();
28183       var currWays = [item];
28184       var currNodes = resolve(item).slice();
28185       while (toJoin.length) {
28186         var start2 = currNodes[0];
28187         var end = currNodes[currNodes.length - 1];
28188         var fn = null;
28189         var nodes = null;
28190         for (i2 = 0; i2 < toJoin.length; i2++) {
28191           item = toJoin[i2];
28192           nodes = resolve(item);
28193           if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start2 || nodes[0] === start2)) {
28194             currWays[0] = reverse(currWays[0]);
28195             currNodes.reverse();
28196             start2 = currNodes[0];
28197             end = currNodes[currNodes.length - 1];
28198           }
28199           if (nodes[0] === end) {
28200             fn = currNodes.push;
28201             nodes = nodes.slice(1);
28202             break;
28203           } else if (nodes[nodes.length - 1] === end) {
28204             fn = currNodes.push;
28205             nodes = nodes.slice(0, -1).reverse();
28206             item = reverse(item);
28207             break;
28208           } else if (nodes[nodes.length - 1] === start2) {
28209             fn = currNodes.unshift;
28210             nodes = nodes.slice(0, -1);
28211             break;
28212           } else if (nodes[0] === start2) {
28213             fn = currNodes.unshift;
28214             nodes = nodes.slice(1).reverse();
28215             item = reverse(item);
28216             break;
28217           } else {
28218             fn = nodes = null;
28219           }
28220         }
28221         if (!nodes) {
28222           break;
28223         }
28224         fn.apply(currWays, [item]);
28225         fn.apply(currNodes, nodes);
28226         toJoin.splice(i2, 1);
28227       }
28228       currWays.nodes = currNodes;
28229       sequences.push(currWays);
28230     }
28231     return sequences;
28232   }
28233
28234   // modules/actions/add_member.js
28235   function actionAddMember(relationId, member, memberIndex, insertPair) {
28236     return function action(graph) {
28237       var relation = graph.entity(relationId);
28238       var isPTv2 = /stop|platform/.test(member.role);
28239       if ((isNaN(memberIndex) || insertPair) && member.type === "way" && !isPTv2) {
28240         graph = addWayMember(relation, graph);
28241       } else {
28242         if (isPTv2 && isNaN(memberIndex)) {
28243           memberIndex = 0;
28244         }
28245         graph = graph.replace(relation.addMember(member, memberIndex));
28246       }
28247       return graph;
28248     };
28249     function addWayMember(relation, graph) {
28250       var groups, tempWay, insertPairIsReversed, item, i2, j2, k;
28251       var PTv2members = [];
28252       var members = [];
28253       for (i2 = 0; i2 < relation.members.length; i2++) {
28254         var m = relation.members[i2];
28255         if (/stop|platform/.test(m.role)) {
28256           PTv2members.push(m);
28257         } else {
28258           members.push(m);
28259         }
28260       }
28261       relation = relation.update({ members });
28262       if (insertPair) {
28263         tempWay = osmWay({ id: "wTemp", nodes: insertPair.nodes });
28264         graph = graph.replace(tempWay);
28265         var tempMember = { id: tempWay.id, type: "way", role: member.role };
28266         var tempRelation = relation.replaceMember({ id: insertPair.originalID }, tempMember, true);
28267         groups = utilArrayGroupBy(tempRelation.members, "type");
28268         groups.way = groups.way || [];
28269         var originalWay = graph.entity(insertPair.originalID);
28270         var insertedWay = graph.entity(insertPair.insertedID);
28271         insertPairIsReversed = originalWay.nodes.length > 0 && insertedWay.nodes.length > 0 && insertedWay.nodes[insertedWay.nodes.length - 1] === originalWay.nodes[0] && originalWay.nodes[originalWay.nodes.length - 1] !== insertedWay.nodes[0];
28272       } else {
28273         groups = utilArrayGroupBy(relation.members, "type");
28274         groups.way = groups.way || [];
28275         groups.way.push(member);
28276       }
28277       members = withIndex(groups.way);
28278       var joined = osmJoinWays(members, graph);
28279       for (i2 = 0; i2 < joined.length; i2++) {
28280         var segment = joined[i2];
28281         var nodes = segment.nodes.slice();
28282         var startIndex = segment[0].index;
28283         for (j2 = 0; j2 < members.length; j2++) {
28284           if (members[j2].index === startIndex) {
28285             break;
28286           }
28287         }
28288         for (k = 0; k < segment.length; k++) {
28289           item = segment[k];
28290           var way = graph.entity(item.id);
28291           if (tempWay && item.id === tempWay.id) {
28292             var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed;
28293             if (reverse) {
28294               item.pair = [
28295                 { id: insertPair.insertedID, type: "way", role: item.role },
28296                 { id: insertPair.originalID, type: "way", role: item.role }
28297               ];
28298             } else {
28299               item.pair = [
28300                 { id: insertPair.originalID, type: "way", role: item.role },
28301                 { id: insertPair.insertedID, type: "way", role: item.role }
28302               ];
28303             }
28304           }
28305           if (k > 0) {
28306             if (j2 + k >= members.length || item.index !== members[j2 + k].index) {
28307               moveMember(members, item.index, j2 + k);
28308             }
28309           }
28310           nodes.splice(0, way.nodes.length - 1);
28311         }
28312       }
28313       if (tempWay) {
28314         graph = graph.remove(tempWay);
28315       }
28316       var wayMembers = [];
28317       for (i2 = 0; i2 < members.length; i2++) {
28318         item = members[i2];
28319         if (item.index === -1)
28320           continue;
28321         if (item.pair) {
28322           wayMembers.push(item.pair[0]);
28323           wayMembers.push(item.pair[1]);
28324         } else {
28325           wayMembers.push(utilObjectOmit(item, ["index"]));
28326         }
28327       }
28328       var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []);
28329       return graph.replace(relation.update({ members: newMembers }));
28330       function moveMember(arr, findIndex, toIndex) {
28331         var i3;
28332         for (i3 = 0; i3 < arr.length; i3++) {
28333           if (arr[i3].index === findIndex) {
28334             break;
28335           }
28336         }
28337         var item2 = Object.assign({}, arr[i3]);
28338         arr[i3].index = -1;
28339         item2.index = toIndex;
28340         arr.splice(toIndex, 0, item2);
28341       }
28342       function withIndex(arr) {
28343         var result = new Array(arr.length);
28344         for (var i3 = 0; i3 < arr.length; i3++) {
28345           result[i3] = Object.assign({}, arr[i3]);
28346           result[i3].index = i3;
28347         }
28348         return result;
28349       }
28350     }
28351   }
28352
28353   // modules/actions/add_midpoint.js
28354   function actionAddMidpoint(midpoint, node) {
28355     return function(graph) {
28356       graph = graph.replace(node.move(midpoint.loc));
28357       var parents = utilArrayIntersection(
28358         graph.parentWays(graph.entity(midpoint.edge[0])),
28359         graph.parentWays(graph.entity(midpoint.edge[1]))
28360       );
28361       parents.forEach(function(way) {
28362         for (var i2 = 0; i2 < way.nodes.length - 1; i2++) {
28363           if (geoEdgeEqual([way.nodes[i2], way.nodes[i2 + 1]], midpoint.edge)) {
28364             graph = graph.replace(graph.entity(way.id).addNode(node.id, i2 + 1));
28365             return;
28366           }
28367         }
28368       });
28369       return graph;
28370     };
28371   }
28372
28373   // modules/actions/add_vertex.js
28374   function actionAddVertex(wayId, nodeId, index) {
28375     return function(graph) {
28376       return graph.replace(graph.entity(wayId).addNode(nodeId, index));
28377     };
28378   }
28379
28380   // modules/actions/change_member.js
28381   function actionChangeMember(relationId, member, memberIndex) {
28382     return function(graph) {
28383       return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
28384     };
28385   }
28386
28387   // modules/actions/change_preset.js
28388   function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
28389     return function action(graph) {
28390       var entity = graph.entity(entityID);
28391       var geometry = entity.geometry(graph);
28392       var tags = entity.tags;
28393       var preserveKeys;
28394       if (newPreset) {
28395         preserveKeys = [];
28396         if (newPreset.addTags) {
28397           preserveKeys = preserveKeys.concat(Object.keys(newPreset.addTags));
28398         }
28399         if (oldPreset && !oldPreset.id.startsWith(newPreset.id)) {
28400           newPreset.fields().concat(newPreset.moreFields()).filter((f2) => f2.matchGeometry(geometry)).map((f2) => f2.key).filter(Boolean).forEach((key) => preserveKeys.push(key));
28401         }
28402       }
28403       if (oldPreset)
28404         tags = oldPreset.unsetTags(tags, geometry, preserveKeys);
28405       if (newPreset)
28406         tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
28407       return graph.replace(entity.update({ tags }));
28408     };
28409   }
28410
28411   // modules/actions/change_tags.js
28412   function actionChangeTags(entityId, tags) {
28413     return function(graph) {
28414       var entity = graph.entity(entityId);
28415       return graph.replace(entity.update({ tags }));
28416     };
28417   }
28418
28419   // modules/osm/node.js
28420   var cardinal = {
28421     north: 0,
28422     n: 0,
28423     northnortheast: 22,
28424     nne: 22,
28425     northeast: 45,
28426     ne: 45,
28427     eastnortheast: 67,
28428     ene: 67,
28429     east: 90,
28430     e: 90,
28431     eastsoutheast: 112,
28432     ese: 112,
28433     southeast: 135,
28434     se: 135,
28435     southsoutheast: 157,
28436     sse: 157,
28437     south: 180,
28438     s: 180,
28439     southsouthwest: 202,
28440     ssw: 202,
28441     southwest: 225,
28442     sw: 225,
28443     westsouthwest: 247,
28444     wsw: 247,
28445     west: 270,
28446     w: 270,
28447     westnorthwest: 292,
28448     wnw: 292,
28449     northwest: 315,
28450     nw: 315,
28451     northnorthwest: 337,
28452     nnw: 337
28453   };
28454   function osmNode() {
28455     if (!(this instanceof osmNode)) {
28456       return new osmNode().initialize(arguments);
28457     } else if (arguments.length) {
28458       this.initialize(arguments);
28459     }
28460   }
28461   osmEntity.node = osmNode;
28462   osmNode.prototype = Object.create(osmEntity.prototype);
28463   Object.assign(osmNode.prototype, {
28464     type: "node",
28465     loc: [9999, 9999],
28466     extent: function() {
28467       return new geoExtent(this.loc);
28468     },
28469     geometry: function(graph) {
28470       return graph.transient(this, "geometry", function() {
28471         return graph.isPoi(this) ? "point" : "vertex";
28472       });
28473     },
28474     move: function(loc) {
28475       return this.update({ loc });
28476     },
28477     isDegenerate: function() {
28478       return !(Array.isArray(this.loc) && this.loc.length === 2 && this.loc[0] >= -180 && this.loc[0] <= 180 && this.loc[1] >= -90 && this.loc[1] <= 90);
28479     },
28480     // Inspect tags and geometry to determine which direction(s) this node/vertex points
28481     directions: function(resolver, projection2) {
28482       var val;
28483       var i2;
28484       if (this.isHighwayIntersection(resolver) && (this.tags.stop || "").toLowerCase() === "all") {
28485         val = "all";
28486       } else {
28487         val = (this.tags.direction || "").toLowerCase();
28488         var re2 = /:direction$/i;
28489         var keys = Object.keys(this.tags);
28490         for (i2 = 0; i2 < keys.length; i2++) {
28491           if (re2.test(keys[i2])) {
28492             val = this.tags[keys[i2]].toLowerCase();
28493             break;
28494           }
28495         }
28496       }
28497       if (val === "")
28498         return [];
28499       var values = val.split(";");
28500       var results = [];
28501       values.forEach(function(v) {
28502         if (cardinal[v] !== void 0) {
28503           v = cardinal[v];
28504         }
28505         if (v !== "" && !isNaN(+v)) {
28506           results.push(+v);
28507           return;
28508         }
28509         var lookBackward = this.tags["traffic_sign:backward"] || v === "backward" || v === "both" || v === "all";
28510         var lookForward = this.tags["traffic_sign:forward"] || v === "forward" || v === "both" || v === "all";
28511         if (!lookForward && !lookBackward)
28512           return;
28513         var nodeIds = {};
28514         resolver.parentWays(this).forEach(function(parent) {
28515           var nodes = parent.nodes;
28516           for (i2 = 0; i2 < nodes.length; i2++) {
28517             if (nodes[i2] === this.id) {
28518               if (lookForward && i2 > 0) {
28519                 nodeIds[nodes[i2 - 1]] = true;
28520               }
28521               if (lookBackward && i2 < nodes.length - 1) {
28522                 nodeIds[nodes[i2 + 1]] = true;
28523               }
28524             }
28525           }
28526         }, this);
28527         Object.keys(nodeIds).forEach(function(nodeId) {
28528           results.push(
28529             geoAngle(this, resolver.entity(nodeId), projection2) * (180 / Math.PI) + 90
28530           );
28531         }, this);
28532       }, this);
28533       return utilArrayUniq(results);
28534     },
28535     isCrossing: function() {
28536       return this.tags.highway === "crossing" || this.tags.railway && this.tags.railway.indexOf("crossing") !== -1;
28537     },
28538     isEndpoint: function(resolver) {
28539       return resolver.transient(this, "isEndpoint", function() {
28540         var id2 = this.id;
28541         return resolver.parentWays(this).filter(function(parent) {
28542           return !parent.isClosed() && !!parent.affix(id2);
28543         }).length > 0;
28544       });
28545     },
28546     isConnected: function(resolver) {
28547       return resolver.transient(this, "isConnected", function() {
28548         var parents = resolver.parentWays(this);
28549         if (parents.length > 1) {
28550           for (var i2 in parents) {
28551             if (parents[i2].geometry(resolver) === "line" && parents[i2].hasInterestingTags())
28552               return true;
28553           }
28554         } else if (parents.length === 1) {
28555           var way = parents[0];
28556           var nodes = way.nodes.slice();
28557           if (way.isClosed()) {
28558             nodes.pop();
28559           }
28560           return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
28561         }
28562         return false;
28563       });
28564     },
28565     parentIntersectionWays: function(resolver) {
28566       return resolver.transient(this, "parentIntersectionWays", function() {
28567         return resolver.parentWays(this).filter(function(parent) {
28568           return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === "line";
28569         });
28570       });
28571     },
28572     isIntersection: function(resolver) {
28573       return this.parentIntersectionWays(resolver).length > 1;
28574     },
28575     isHighwayIntersection: function(resolver) {
28576       return resolver.transient(this, "isHighwayIntersection", function() {
28577         return resolver.parentWays(this).filter(function(parent) {
28578           return parent.tags.highway && parent.geometry(resolver) === "line";
28579         }).length > 1;
28580       });
28581     },
28582     isOnAddressLine: function(resolver) {
28583       return resolver.transient(this, "isOnAddressLine", function() {
28584         return resolver.parentWays(this).filter(function(parent) {
28585           return parent.tags.hasOwnProperty("addr:interpolation") && parent.geometry(resolver) === "line";
28586         }).length > 0;
28587       });
28588     },
28589     asJXON: function(changeset_id) {
28590       var r = {
28591         node: {
28592           "@id": this.osmId(),
28593           "@lon": this.loc[0],
28594           "@lat": this.loc[1],
28595           "@version": this.version || 0,
28596           tag: Object.keys(this.tags).map(function(k) {
28597             return { keyAttributes: { k, v: this.tags[k] } };
28598           }, this)
28599         }
28600       };
28601       if (changeset_id)
28602         r.node["@changeset"] = changeset_id;
28603       return r;
28604     },
28605     asGeoJSON: function() {
28606       return {
28607         type: "Point",
28608         coordinates: this.loc
28609       };
28610     }
28611   });
28612
28613   // modules/actions/circularize.js
28614   function actionCircularize(wayId, projection2, maxAngle) {
28615     maxAngle = (maxAngle || 20) * Math.PI / 180;
28616     var action = function(graph, t) {
28617       if (t === null || !isFinite(t))
28618         t = 1;
28619       t = Math.min(Math.max(+t, 0), 1);
28620       var way = graph.entity(wayId);
28621       var origNodes = {};
28622       graph.childNodes(way).forEach(function(node2) {
28623         if (!origNodes[node2.id])
28624           origNodes[node2.id] = node2;
28625       });
28626       if (!way.isConvex(graph)) {
28627         graph = action.makeConvex(graph);
28628       }
28629       var nodes = utilArrayUniq(graph.childNodes(way));
28630       var keyNodes = nodes.filter(function(n2) {
28631         return graph.parentWays(n2).length !== 1;
28632       });
28633       var points = nodes.map(function(n2) {
28634         return projection2(n2.loc);
28635       });
28636       var keyPoints = keyNodes.map(function(n2) {
28637         return projection2(n2.loc);
28638       });
28639       var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : centroid_default2(points);
28640       var radius = median(points, function(p) {
28641         return geoVecLength(centroid, p);
28642       });
28643       var sign2 = area_default3(points) > 0 ? 1 : -1;
28644       var ids, i2, j2, k;
28645       if (!keyNodes.length) {
28646         keyNodes = [nodes[0]];
28647         keyPoints = [points[0]];
28648       }
28649       if (keyNodes.length === 1) {
28650         var index = nodes.indexOf(keyNodes[0]);
28651         var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
28652         keyNodes.push(nodes[oppositeIndex]);
28653         keyPoints.push(points[oppositeIndex]);
28654       }
28655       for (i2 = 0; i2 < keyPoints.length; i2++) {
28656         var nextKeyNodeIndex = (i2 + 1) % keyNodes.length;
28657         var startNode = keyNodes[i2];
28658         var endNode = keyNodes[nextKeyNodeIndex];
28659         var startNodeIndex = nodes.indexOf(startNode);
28660         var endNodeIndex = nodes.indexOf(endNode);
28661         var numberNewPoints = -1;
28662         var indexRange = endNodeIndex - startNodeIndex;
28663         var nearNodes = {};
28664         var inBetweenNodes = [];
28665         var startAngle, endAngle, totalAngle, eachAngle;
28666         var angle2, loc, node, origNode;
28667         if (indexRange < 0) {
28668           indexRange += nodes.length;
28669         }
28670         var distance = geoVecLength(centroid, keyPoints[i2]) || 1e-4;
28671         keyPoints[i2] = [
28672           centroid[0] + (keyPoints[i2][0] - centroid[0]) / distance * radius,
28673           centroid[1] + (keyPoints[i2][1] - centroid[1]) / distance * radius
28674         ];
28675         loc = projection2.invert(keyPoints[i2]);
28676         node = keyNodes[i2];
28677         origNode = origNodes[node.id];
28678         node = node.move(geoVecInterp(origNode.loc, loc, t));
28679         graph = graph.replace(node);
28680         startAngle = Math.atan2(keyPoints[i2][1] - centroid[1], keyPoints[i2][0] - centroid[0]);
28681         endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
28682         totalAngle = endAngle - startAngle;
28683         if (totalAngle * sign2 > 0) {
28684           totalAngle = -sign2 * (2 * Math.PI - Math.abs(totalAngle));
28685         }
28686         do {
28687           numberNewPoints++;
28688           eachAngle = totalAngle / (indexRange + numberNewPoints);
28689         } while (Math.abs(eachAngle) > maxAngle);
28690         for (j2 = 1; j2 < indexRange; j2++) {
28691           angle2 = startAngle + j2 * eachAngle;
28692           loc = projection2.invert([
28693             centroid[0] + Math.cos(angle2) * radius,
28694             centroid[1] + Math.sin(angle2) * radius
28695           ]);
28696           node = nodes[(j2 + startNodeIndex) % nodes.length];
28697           origNode = origNodes[node.id];
28698           nearNodes[node.id] = angle2;
28699           node = node.move(geoVecInterp(origNode.loc, loc, t));
28700           graph = graph.replace(node);
28701         }
28702         for (j2 = 0; j2 < numberNewPoints; j2++) {
28703           angle2 = startAngle + (indexRange + j2) * eachAngle;
28704           loc = projection2.invert([
28705             centroid[0] + Math.cos(angle2) * radius,
28706             centroid[1] + Math.sin(angle2) * radius
28707           ]);
28708           var min3 = Infinity;
28709           for (var nodeId in nearNodes) {
28710             var nearAngle = nearNodes[nodeId];
28711             var dist = Math.abs(nearAngle - angle2);
28712             if (dist < min3) {
28713               min3 = dist;
28714               origNode = origNodes[nodeId];
28715             }
28716           }
28717           node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
28718           graph = graph.replace(node);
28719           nodes.splice(endNodeIndex + j2, 0, node);
28720           inBetweenNodes.push(node.id);
28721         }
28722         if (indexRange === 1 && inBetweenNodes.length) {
28723           var startIndex1 = way.nodes.lastIndexOf(startNode.id);
28724           var endIndex1 = way.nodes.lastIndexOf(endNode.id);
28725           var wayDirection1 = endIndex1 - startIndex1;
28726           if (wayDirection1 < -1) {
28727             wayDirection1 = 1;
28728           }
28729           var parentWays = graph.parentWays(keyNodes[i2]);
28730           for (j2 = 0; j2 < parentWays.length; j2++) {
28731             var sharedWay = parentWays[j2];
28732             if (sharedWay === way)
28733               continue;
28734             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
28735               var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
28736               var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
28737               var wayDirection2 = endIndex2 - startIndex2;
28738               var insertAt = endIndex2;
28739               if (wayDirection2 < -1) {
28740                 wayDirection2 = 1;
28741               }
28742               if (wayDirection1 !== wayDirection2) {
28743                 inBetweenNodes.reverse();
28744                 insertAt = startIndex2;
28745               }
28746               for (k = 0; k < inBetweenNodes.length; k++) {
28747                 sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
28748               }
28749               graph = graph.replace(sharedWay);
28750             }
28751           }
28752         }
28753       }
28754       ids = nodes.map(function(n2) {
28755         return n2.id;
28756       });
28757       ids.push(ids[0]);
28758       way = way.update({ nodes: ids });
28759       graph = graph.replace(way);
28760       return graph;
28761     };
28762     action.makeConvex = function(graph) {
28763       var way = graph.entity(wayId);
28764       var nodes = utilArrayUniq(graph.childNodes(way));
28765       var points = nodes.map(function(n2) {
28766         return projection2(n2.loc);
28767       });
28768       var sign2 = area_default3(points) > 0 ? 1 : -1;
28769       var hull = hull_default(points);
28770       var i2, j2;
28771       if (sign2 === -1) {
28772         nodes.reverse();
28773         points.reverse();
28774       }
28775       for (i2 = 0; i2 < hull.length - 1; i2++) {
28776         var startIndex = points.indexOf(hull[i2]);
28777         var endIndex = points.indexOf(hull[i2 + 1]);
28778         var indexRange = endIndex - startIndex;
28779         if (indexRange < 0) {
28780           indexRange += nodes.length;
28781         }
28782         for (j2 = 1; j2 < indexRange; j2++) {
28783           var point2 = geoVecInterp(hull[i2], hull[i2 + 1], j2 / indexRange);
28784           var node = nodes[(j2 + startIndex) % nodes.length].move(projection2.invert(point2));
28785           graph = graph.replace(node);
28786         }
28787       }
28788       return graph;
28789     };
28790     action.disabled = function(graph) {
28791       if (!graph.entity(wayId).isClosed()) {
28792         return "not_closed";
28793       }
28794       var way = graph.entity(wayId);
28795       var nodes = utilArrayUniq(graph.childNodes(way));
28796       var points = nodes.map(function(n2) {
28797         return projection2(n2.loc);
28798       });
28799       var hull = hull_default(points);
28800       var epsilonAngle = Math.PI / 180;
28801       if (hull.length !== points.length || hull.length < 3) {
28802         return false;
28803       }
28804       var centroid = centroid_default2(points);
28805       var radius = geoVecLengthSquare(centroid, points[0]);
28806       var i2, actualPoint;
28807       for (i2 = 0; i2 < hull.length; i2++) {
28808         actualPoint = hull[i2];
28809         var actualDist = geoVecLengthSquare(actualPoint, centroid);
28810         var diff = Math.abs(actualDist - radius);
28811         if (diff > 0.05 * radius) {
28812           return false;
28813         }
28814       }
28815       for (i2 = 0; i2 < hull.length; i2++) {
28816         actualPoint = hull[i2];
28817         var nextPoint = hull[(i2 + 1) % hull.length];
28818         var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]);
28819         var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]);
28820         var angle2 = endAngle - startAngle;
28821         if (angle2 < 0) {
28822           angle2 = -angle2;
28823         }
28824         if (angle2 > Math.PI) {
28825           angle2 = 2 * Math.PI - angle2;
28826         }
28827         if (angle2 > maxAngle + epsilonAngle) {
28828           return false;
28829         }
28830       }
28831       return "already_circular";
28832     };
28833     action.transitionable = true;
28834     return action;
28835   }
28836
28837   // modules/actions/delete_way.js
28838   function actionDeleteWay(wayID) {
28839     function canDeleteNode(node, graph) {
28840       if (graph.parentWays(node).length || graph.parentRelations(node).length)
28841         return false;
28842       var geometries = osmNodeGeometriesForTags(node.tags);
28843       if (geometries.point)
28844         return false;
28845       if (geometries.vertex)
28846         return true;
28847       return !node.hasInterestingTags();
28848     }
28849     var action = function(graph) {
28850       var way = graph.entity(wayID);
28851       graph.parentRelations(way).forEach(function(parent) {
28852         parent = parent.removeMembersWithID(wayID);
28853         graph = graph.replace(parent);
28854         if (parent.isDegenerate()) {
28855           graph = actionDeleteRelation(parent.id)(graph);
28856         }
28857       });
28858       new Set(way.nodes).forEach(function(nodeID) {
28859         graph = graph.replace(way.removeNode(nodeID));
28860         var node = graph.entity(nodeID);
28861         if (canDeleteNode(node, graph)) {
28862           graph = graph.remove(node);
28863         }
28864       });
28865       return graph.remove(way);
28866     };
28867     return action;
28868   }
28869
28870   // modules/actions/delete_multiple.js
28871   function actionDeleteMultiple(ids) {
28872     var actions = {
28873       way: actionDeleteWay,
28874       node: actionDeleteNode,
28875       relation: actionDeleteRelation
28876     };
28877     var action = function(graph) {
28878       ids.forEach(function(id2) {
28879         if (graph.hasEntity(id2)) {
28880           graph = actions[graph.entity(id2).type](id2)(graph);
28881         }
28882       });
28883       return graph;
28884     };
28885     return action;
28886   }
28887
28888   // modules/actions/delete_relation.js
28889   function actionDeleteRelation(relationID, allowUntaggedMembers) {
28890     function canDeleteEntity(entity, graph) {
28891       return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && (!entity.hasInterestingTags() && !allowUntaggedMembers);
28892     }
28893     var action = function(graph) {
28894       var relation = graph.entity(relationID);
28895       graph.parentRelations(relation).forEach(function(parent) {
28896         parent = parent.removeMembersWithID(relationID);
28897         graph = graph.replace(parent);
28898         if (parent.isDegenerate()) {
28899           graph = actionDeleteRelation(parent.id)(graph);
28900         }
28901       });
28902       var memberIDs = utilArrayUniq(relation.members.map(function(m) {
28903         return m.id;
28904       }));
28905       memberIDs.forEach(function(memberID) {
28906         graph = graph.replace(relation.removeMembersWithID(memberID));
28907         var entity = graph.entity(memberID);
28908         if (canDeleteEntity(entity, graph)) {
28909           graph = actionDeleteMultiple([memberID])(graph);
28910         }
28911       });
28912       return graph.remove(relation);
28913     };
28914     return action;
28915   }
28916
28917   // modules/actions/delete_node.js
28918   function actionDeleteNode(nodeId) {
28919     var action = function(graph) {
28920       var node = graph.entity(nodeId);
28921       graph.parentWays(node).forEach(function(parent) {
28922         parent = parent.removeNode(nodeId);
28923         graph = graph.replace(parent);
28924         if (parent.isDegenerate()) {
28925           graph = actionDeleteWay(parent.id)(graph);
28926         }
28927       });
28928       graph.parentRelations(node).forEach(function(parent) {
28929         parent = parent.removeMembersWithID(nodeId);
28930         graph = graph.replace(parent);
28931         if (parent.isDegenerate()) {
28932           graph = actionDeleteRelation(parent.id)(graph);
28933         }
28934       });
28935       return graph.remove(node);
28936     };
28937     return action;
28938   }
28939
28940   // modules/actions/connect.js
28941   function actionConnect(nodeIDs) {
28942     var action = function(graph) {
28943       var survivor;
28944       var node;
28945       var parents;
28946       var i2, j2;
28947       nodeIDs.reverse();
28948       var interestingIDs = [];
28949       for (i2 = 0; i2 < nodeIDs.length; i2++) {
28950         node = graph.entity(nodeIDs[i2]);
28951         if (node.hasInterestingTags()) {
28952           if (!node.isNew()) {
28953             interestingIDs.push(node.id);
28954           }
28955         }
28956       }
28957       survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs));
28958       for (i2 = 0; i2 < nodeIDs.length; i2++) {
28959         node = graph.entity(nodeIDs[i2]);
28960         if (node.id === survivor.id)
28961           continue;
28962         parents = graph.parentWays(node);
28963         for (j2 = 0; j2 < parents.length; j2++) {
28964           graph = graph.replace(parents[j2].replaceNode(node.id, survivor.id));
28965         }
28966         parents = graph.parentRelations(node);
28967         for (j2 = 0; j2 < parents.length; j2++) {
28968           graph = graph.replace(parents[j2].replaceMember(node, survivor));
28969         }
28970         survivor = survivor.mergeTags(node.tags);
28971         graph = actionDeleteNode(node.id)(graph);
28972       }
28973       graph = graph.replace(survivor);
28974       parents = graph.parentWays(survivor);
28975       for (i2 = 0; i2 < parents.length; i2++) {
28976         if (parents[i2].isDegenerate()) {
28977           graph = actionDeleteWay(parents[i2].id)(graph);
28978         }
28979       }
28980       return graph;
28981     };
28982     action.disabled = function(graph) {
28983       var seen = {};
28984       var restrictionIDs = [];
28985       var survivor;
28986       var node, way;
28987       var relations, relation, role;
28988       var i2, j2, k;
28989       survivor = graph.entity(utilOldestID(nodeIDs));
28990       for (i2 = 0; i2 < nodeIDs.length; i2++) {
28991         node = graph.entity(nodeIDs[i2]);
28992         relations = graph.parentRelations(node);
28993         for (j2 = 0; j2 < relations.length; j2++) {
28994           relation = relations[j2];
28995           role = relation.memberById(node.id).role || "";
28996           if (relation.hasFromViaTo()) {
28997             restrictionIDs.push(relation.id);
28998           }
28999           if (seen[relation.id] !== void 0 && seen[relation.id] !== role) {
29000             return "relation";
29001           } else {
29002             seen[relation.id] = role;
29003           }
29004         }
29005       }
29006       for (i2 = 0; i2 < nodeIDs.length; i2++) {
29007         node = graph.entity(nodeIDs[i2]);
29008         var parents = graph.parentWays(node);
29009         for (j2 = 0; j2 < parents.length; j2++) {
29010           var parent = parents[j2];
29011           relations = graph.parentRelations(parent);
29012           for (k = 0; k < relations.length; k++) {
29013             relation = relations[k];
29014             if (relation.hasFromViaTo()) {
29015               restrictionIDs.push(relation.id);
29016             }
29017           }
29018         }
29019       }
29020       restrictionIDs = utilArrayUniq(restrictionIDs);
29021       for (i2 = 0; i2 < restrictionIDs.length; i2++) {
29022         relation = graph.entity(restrictionIDs[i2]);
29023         if (!relation.isComplete(graph))
29024           continue;
29025         var memberWays = relation.members.filter(function(m) {
29026           return m.type === "way";
29027         }).map(function(m) {
29028           return graph.entity(m.id);
29029         });
29030         memberWays = utilArrayUniq(memberWays);
29031         var f2 = relation.memberByRole("from");
29032         var t = relation.memberByRole("to");
29033         var isUturn = f2.id === t.id;
29034         var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
29035         for (j2 = 0; j2 < relation.members.length; j2++) {
29036           collectNodes(relation.members[j2], nodes);
29037         }
29038         nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
29039         nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
29040         var filter2 = keyNodeFilter(nodes.keyfrom, nodes.keyto);
29041         nodes.from = nodes.from.filter(filter2);
29042         nodes.via = nodes.via.filter(filter2);
29043         nodes.to = nodes.to.filter(filter2);
29044         var connectFrom = false;
29045         var connectVia = false;
29046         var connectTo = false;
29047         var connectKeyFrom = false;
29048         var connectKeyTo = false;
29049         for (j2 = 0; j2 < nodeIDs.length; j2++) {
29050           var n2 = nodeIDs[j2];
29051           if (nodes.from.indexOf(n2) !== -1) {
29052             connectFrom = true;
29053           }
29054           if (nodes.via.indexOf(n2) !== -1) {
29055             connectVia = true;
29056           }
29057           if (nodes.to.indexOf(n2) !== -1) {
29058             connectTo = true;
29059           }
29060           if (nodes.keyfrom.indexOf(n2) !== -1) {
29061             connectKeyFrom = true;
29062           }
29063           if (nodes.keyto.indexOf(n2) !== -1) {
29064             connectKeyTo = true;
29065           }
29066         }
29067         if (connectFrom && connectTo && !isUturn) {
29068           return "restriction";
29069         }
29070         if (connectFrom && connectVia) {
29071           return "restriction";
29072         }
29073         if (connectTo && connectVia) {
29074           return "restriction";
29075         }
29076         if (connectKeyFrom || connectKeyTo) {
29077           if (nodeIDs.length !== 2) {
29078             return "restriction";
29079           }
29080           var n0 = null;
29081           var n1 = null;
29082           for (j2 = 0; j2 < memberWays.length; j2++) {
29083             way = memberWays[j2];
29084             if (way.contains(nodeIDs[0])) {
29085               n0 = nodeIDs[0];
29086             }
29087             if (way.contains(nodeIDs[1])) {
29088               n1 = nodeIDs[1];
29089             }
29090           }
29091           if (n0 && n1) {
29092             var ok = false;
29093             for (j2 = 0; j2 < memberWays.length; j2++) {
29094               way = memberWays[j2];
29095               if (way.areAdjacent(n0, n1)) {
29096                 ok = true;
29097                 break;
29098               }
29099             }
29100             if (!ok) {
29101               return "restriction";
29102             }
29103           }
29104         }
29105         for (j2 = 0; j2 < memberWays.length; j2++) {
29106           way = memberWays[j2].update({});
29107           for (k = 0; k < nodeIDs.length; k++) {
29108             if (nodeIDs[k] === survivor.id)
29109               continue;
29110             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
29111               way = way.removeNode(nodeIDs[k]);
29112             } else {
29113               way = way.replaceNode(nodeIDs[k], survivor.id);
29114             }
29115           }
29116           if (way.isDegenerate()) {
29117             return "restriction";
29118           }
29119         }
29120       }
29121       return false;
29122       function hasDuplicates(n3, i3, arr) {
29123         return arr.indexOf(n3) !== arr.lastIndexOf(n3);
29124       }
29125       function keyNodeFilter(froms, tos) {
29126         return function(n3) {
29127           return froms.indexOf(n3) === -1 && tos.indexOf(n3) === -1;
29128         };
29129       }
29130       function collectNodes(member, collection) {
29131         var entity = graph.hasEntity(member.id);
29132         if (!entity)
29133           return;
29134         var role2 = member.role || "";
29135         if (!collection[role2]) {
29136           collection[role2] = [];
29137         }
29138         if (member.type === "node") {
29139           collection[role2].push(member.id);
29140           if (role2 === "via") {
29141             collection.keyfrom.push(member.id);
29142             collection.keyto.push(member.id);
29143           }
29144         } else if (member.type === "way") {
29145           collection[role2].push.apply(collection[role2], entity.nodes);
29146           if (role2 === "from" || role2 === "via") {
29147             collection.keyfrom.push(entity.first());
29148             collection.keyfrom.push(entity.last());
29149           }
29150           if (role2 === "to" || role2 === "via") {
29151             collection.keyto.push(entity.first());
29152             collection.keyto.push(entity.last());
29153           }
29154         }
29155       }
29156     };
29157     return action;
29158   }
29159
29160   // modules/actions/copy_entities.js
29161   function actionCopyEntities(ids, fromGraph) {
29162     var _copies = {};
29163     var action = function(graph) {
29164       ids.forEach(function(id3) {
29165         fromGraph.entity(id3).copy(fromGraph, _copies);
29166       });
29167       for (var id2 in _copies) {
29168         graph = graph.replace(_copies[id2]);
29169       }
29170       return graph;
29171     };
29172     action.copies = function() {
29173       return _copies;
29174     };
29175     return action;
29176   }
29177
29178   // modules/actions/delete_member.js
29179   function actionDeleteMember(relationId, memberIndex) {
29180     return function(graph) {
29181       var relation = graph.entity(relationId).removeMember(memberIndex);
29182       graph = graph.replace(relation);
29183       if (relation.isDegenerate()) {
29184         graph = actionDeleteRelation(relation.id)(graph);
29185       }
29186       return graph;
29187     };
29188   }
29189
29190   // modules/actions/discard_tags.js
29191   function actionDiscardTags(difference, discardTags) {
29192     discardTags = discardTags || {};
29193     return (graph) => {
29194       difference.modified().forEach(checkTags);
29195       difference.created().forEach(checkTags);
29196       return graph;
29197       function checkTags(entity) {
29198         const keys = Object.keys(entity.tags);
29199         let didDiscard = false;
29200         let tags = {};
29201         for (let i2 = 0; i2 < keys.length; i2++) {
29202           const k = keys[i2];
29203           if (discardTags[k] || !entity.tags[k]) {
29204             didDiscard = true;
29205           } else {
29206             tags[k] = entity.tags[k];
29207           }
29208         }
29209         if (didDiscard) {
29210           graph = graph.replace(entity.update({ tags }));
29211         }
29212       }
29213     };
29214   }
29215
29216   // modules/actions/disconnect.js
29217   function actionDisconnect(nodeId, newNodeId) {
29218     var wayIds;
29219     var disconnectableRelationTypes = {
29220       "associatedStreet": true,
29221       "enforcement": true,
29222       "site": true
29223     };
29224     var action = function(graph) {
29225       var node = graph.entity(nodeId);
29226       var connections = action.connections(graph);
29227       connections.forEach(function(connection) {
29228         var way = graph.entity(connection.wayID);
29229         var newNode = osmNode({ id: newNodeId, loc: node.loc, tags: node.tags });
29230         graph = graph.replace(newNode);
29231         if (connection.index === 0 && way.isArea()) {
29232           graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
29233         } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
29234           graph = graph.replace(way.unclose().addNode(newNode.id));
29235         } else {
29236           graph = graph.replace(way.updateNode(newNode.id, connection.index));
29237         }
29238       });
29239       return graph;
29240     };
29241     action.connections = function(graph) {
29242       var candidates = [];
29243       var keeping = false;
29244       var parentWays = graph.parentWays(graph.entity(nodeId));
29245       var way, waynode;
29246       for (var i2 = 0; i2 < parentWays.length; i2++) {
29247         way = parentWays[i2];
29248         if (wayIds && wayIds.indexOf(way.id) === -1) {
29249           keeping = true;
29250           continue;
29251         }
29252         if (way.isArea() && way.nodes[0] === nodeId) {
29253           candidates.push({ wayID: way.id, index: 0 });
29254         } else {
29255           for (var j2 = 0; j2 < way.nodes.length; j2++) {
29256             waynode = way.nodes[j2];
29257             if (waynode === nodeId) {
29258               if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j2 === way.nodes.length - 1) {
29259                 continue;
29260               }
29261               candidates.push({ wayID: way.id, index: j2 });
29262             }
29263           }
29264         }
29265       }
29266       return keeping ? candidates : candidates.slice(1);
29267     };
29268     action.disabled = function(graph) {
29269       var connections = action.connections(graph);
29270       if (connections.length === 0)
29271         return "not_connected";
29272       var parentWays = graph.parentWays(graph.entity(nodeId));
29273       var seenRelationIds = {};
29274       var sharedRelation;
29275       parentWays.forEach(function(way) {
29276         var relations = graph.parentRelations(way);
29277         relations.filter((relation) => !disconnectableRelationTypes[relation.tags.type]).forEach(function(relation) {
29278           if (relation.id in seenRelationIds) {
29279             if (wayIds) {
29280               if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
29281                 sharedRelation = relation;
29282               }
29283             } else {
29284               sharedRelation = relation;
29285             }
29286           } else {
29287             seenRelationIds[relation.id] = way.id;
29288           }
29289         });
29290       });
29291       if (sharedRelation)
29292         return "relation";
29293     };
29294     action.limitWays = function(val) {
29295       if (!arguments.length)
29296         return wayIds;
29297       wayIds = val;
29298       return action;
29299     };
29300     return action;
29301   }
29302
29303   // modules/actions/extract.js
29304   function actionExtract(entityID, projection2) {
29305     var extractedNodeID;
29306     var action = function(graph) {
29307       var entity = graph.entity(entityID);
29308       if (entity.type === "node") {
29309         return extractFromNode(entity, graph);
29310       }
29311       return extractFromWayOrRelation(entity, graph);
29312     };
29313     function extractFromNode(node, graph) {
29314       extractedNodeID = node.id;
29315       var replacement = osmNode({ loc: node.loc });
29316       graph = graph.replace(replacement);
29317       graph = graph.parentWays(node).reduce(function(accGraph, parentWay) {
29318         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
29319       }, graph);
29320       return graph.parentRelations(node).reduce(function(accGraph, parentRel) {
29321         return accGraph.replace(parentRel.replaceMember(node, replacement));
29322       }, graph);
29323     }
29324     function extractFromWayOrRelation(entity, graph) {
29325       var fromGeometry = entity.geometry(graph);
29326       var keysToCopyAndRetain = ["source", "wheelchair"];
29327       var keysToRetain = ["area"];
29328       var buildingKeysToRetain = ["architect", "building", "height", "layer"];
29329       var extractedLoc = path_default(projection2).centroid(entity.asGeoJSON(graph));
29330       extractedLoc = extractedLoc && projection2.invert(extractedLoc);
29331       if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) {
29332         extractedLoc = entity.extent(graph).center();
29333       }
29334       var indoorAreaValues = {
29335         area: true,
29336         corridor: true,
29337         elevator: true,
29338         level: true,
29339         room: true
29340       };
29341       var isBuilding = entity.tags.building && entity.tags.building !== "no" || entity.tags["building:part"] && entity.tags["building:part"] !== "no";
29342       var isIndoorArea = fromGeometry === "area" && entity.tags.indoor && indoorAreaValues[entity.tags.indoor];
29343       var entityTags = Object.assign({}, entity.tags);
29344       var pointTags = {};
29345       for (var key in entityTags) {
29346         if (entity.type === "relation" && key === "type") {
29347           continue;
29348         }
29349         if (keysToRetain.indexOf(key) !== -1) {
29350           continue;
29351         }
29352         if (isBuilding) {
29353           if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/))
29354             continue;
29355         }
29356         if (isIndoorArea && key === "indoor") {
29357           continue;
29358         }
29359         pointTags[key] = entityTags[key];
29360         if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
29361           continue;
29362         } else if (isIndoorArea && key === "level") {
29363           continue;
29364         }
29365         delete entityTags[key];
29366       }
29367       if (!isBuilding && !isIndoorArea && fromGeometry === "area") {
29368         entityTags.area = "yes";
29369       }
29370       var replacement = osmNode({ loc: extractedLoc, tags: pointTags });
29371       graph = graph.replace(replacement);
29372       extractedNodeID = replacement.id;
29373       return graph.replace(entity.update({ tags: entityTags }));
29374     }
29375     action.getExtractedNodeID = function() {
29376       return extractedNodeID;
29377     };
29378     return action;
29379   }
29380
29381   // modules/actions/join.js
29382   function actionJoin(ids) {
29383     function groupEntitiesByGeometry(graph) {
29384       var entities = ids.map(function(id2) {
29385         return graph.entity(id2);
29386       });
29387       return Object.assign(
29388         { line: [] },
29389         utilArrayGroupBy(entities, function(entity) {
29390           return entity.geometry(graph);
29391         })
29392       );
29393     }
29394     var action = function(graph) {
29395       var ways = ids.map(graph.entity, graph);
29396       var survivorID = utilOldestID(ways.map((way) => way.id));
29397       ways.sort(function(a, b) {
29398         var aSided = a.isSided();
29399         var bSided = b.isSided();
29400         return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0;
29401       });
29402       var sequences = osmJoinWays(ways, graph);
29403       var joined = sequences[0];
29404       graph = sequences.actions.reduce(function(g, action2) {
29405         return action2(g);
29406       }, graph);
29407       var survivor = graph.entity(survivorID);
29408       survivor = survivor.update({ nodes: joined.nodes.map(function(n2) {
29409         return n2.id;
29410       }) });
29411       graph = graph.replace(survivor);
29412       joined.forEach(function(way) {
29413         if (way.id === survivorID)
29414           return;
29415         graph.parentRelations(way).forEach(function(parent) {
29416           graph = graph.replace(parent.replaceMember(way, survivor));
29417         });
29418         survivor = survivor.mergeTags(way.tags);
29419         graph = graph.replace(survivor);
29420         graph = actionDeleteWay(way.id)(graph);
29421       });
29422       function checkForSimpleMultipolygon() {
29423         if (!survivor.isClosed())
29424           return;
29425         var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon2) {
29426           return multipolygon2.members.length === 1;
29427         });
29428         if (multipolygons.length !== 1)
29429           return;
29430         var multipolygon = multipolygons[0];
29431         for (var key in survivor.tags) {
29432           if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged
29433           multipolygon.tags[key] !== survivor.tags[key])
29434             return;
29435         }
29436         survivor = survivor.mergeTags(multipolygon.tags);
29437         graph = graph.replace(survivor);
29438         graph = actionDeleteRelation(
29439           multipolygon.id,
29440           true
29441           /* allow untagged members */
29442         )(graph);
29443         var tags = Object.assign({}, survivor.tags);
29444         if (survivor.geometry(graph) !== "area") {
29445           tags.area = "yes";
29446         }
29447         delete tags.type;
29448         survivor = survivor.update({ tags });
29449         graph = graph.replace(survivor);
29450       }
29451       checkForSimpleMultipolygon();
29452       return graph;
29453     };
29454     action.resultingWayNodesLength = function(graph) {
29455       return ids.reduce(function(count, id2) {
29456         return count + graph.entity(id2).nodes.length;
29457       }, 0) - ids.length - 1;
29458     };
29459     action.disabled = function(graph) {
29460       var geometries = groupEntitiesByGeometry(graph);
29461       if (ids.length < 2 || ids.length !== geometries.line.length) {
29462         return "not_eligible";
29463       }
29464       var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
29465       if (joined.length > 1) {
29466         return "not_adjacent";
29467       }
29468       var i2;
29469       var sortedParentRelations = function(id2) {
29470         return graph.parentRelations(graph.entity(id2)).filter((rel) => !rel.isRestriction() && !rel.isConnectivity()).sort((a, b) => a.id - b.id);
29471       };
29472       var relsA = sortedParentRelations(ids[0]);
29473       for (i2 = 1; i2 < ids.length; i2++) {
29474         var relsB = sortedParentRelations(ids[i2]);
29475         if (!utilArrayIdentical(relsA, relsB)) {
29476           return "conflicting_relations";
29477         }
29478       }
29479       for (i2 = 0; i2 < ids.length - 1; i2++) {
29480         for (var j2 = i2 + 1; j2 < ids.length; j2++) {
29481           var path1 = graph.childNodes(graph.entity(ids[i2])).map(function(e) {
29482             return e.loc;
29483           });
29484           var path2 = graph.childNodes(graph.entity(ids[j2])).map(function(e) {
29485             return e.loc;
29486           });
29487           var intersections = geoPathIntersections(path1, path2);
29488           var common = utilArrayIntersection(
29489             joined[0].nodes.map(function(n2) {
29490               return n2.loc.toString();
29491             }),
29492             intersections.map(function(n2) {
29493               return n2.toString();
29494             })
29495           );
29496           if (common.length !== intersections.length) {
29497             return "paths_intersect";
29498           }
29499         }
29500       }
29501       var nodeIds = joined[0].nodes.map(function(n2) {
29502         return n2.id;
29503       }).slice(1, -1);
29504       var relation;
29505       var tags = {};
29506       var conflicting = false;
29507       joined[0].forEach(function(way) {
29508         var parents = graph.parentRelations(way);
29509         parents.forEach(function(parent) {
29510           if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function(m) {
29511             return nodeIds.indexOf(m.id) >= 0;
29512           })) {
29513             relation = parent;
29514           }
29515         });
29516         for (var k in way.tags) {
29517           if (!(k in tags)) {
29518             tags[k] = way.tags[k];
29519           } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
29520             conflicting = true;
29521           }
29522         }
29523       });
29524       if (relation) {
29525         return relation.isRestriction() ? "restriction" : "connectivity";
29526       }
29527       if (conflicting) {
29528         return "conflicting_tags";
29529       }
29530     };
29531     return action;
29532   }
29533
29534   // modules/actions/merge.js
29535   function actionMerge(ids) {
29536     function groupEntitiesByGeometry(graph) {
29537       var entities = ids.map(function(id2) {
29538         return graph.entity(id2);
29539       });
29540       return Object.assign(
29541         { point: [], area: [], line: [], relation: [] },
29542         utilArrayGroupBy(entities, function(entity) {
29543           return entity.geometry(graph);
29544         })
29545       );
29546     }
29547     var action = function(graph) {
29548       var geometries = groupEntitiesByGeometry(graph);
29549       var target = geometries.area[0] || geometries.line[0];
29550       var points = geometries.point;
29551       points.forEach(function(point2) {
29552         target = target.mergeTags(point2.tags);
29553         graph = graph.replace(target);
29554         graph.parentRelations(point2).forEach(function(parent) {
29555           graph = graph.replace(parent.replaceMember(point2, target));
29556         });
29557         var nodes = utilArrayUniq(graph.childNodes(target));
29558         var removeNode = point2;
29559         if (!point2.isNew()) {
29560           var inserted = false;
29561           var canBeReplaced = function(node2) {
29562             return !(graph.parentWays(node2).length > 1 || graph.parentRelations(node2).length);
29563           };
29564           var replaceNode = function(node2) {
29565             graph = graph.replace(point2.update({ tags: node2.tags, loc: node2.loc }));
29566             target = target.replaceNode(node2.id, point2.id);
29567             graph = graph.replace(target);
29568             removeNode = node2;
29569             inserted = true;
29570           };
29571           var i2;
29572           var node;
29573           for (i2 = 0; i2 < nodes.length; i2++) {
29574             node = nodes[i2];
29575             if (canBeReplaced(node) && node.isNew()) {
29576               replaceNode(node);
29577               break;
29578             }
29579           }
29580           if (!inserted && point2.hasInterestingTags()) {
29581             for (i2 = 0; i2 < nodes.length; i2++) {
29582               node = nodes[i2];
29583               if (canBeReplaced(node) && !node.hasInterestingTags()) {
29584                 replaceNode(node);
29585                 break;
29586               }
29587             }
29588             if (!inserted) {
29589               for (i2 = 0; i2 < nodes.length; i2++) {
29590                 node = nodes[i2];
29591                 if (canBeReplaced(node) && utilCompareIDs(point2.id, node.id) < 0) {
29592                   replaceNode(node);
29593                   break;
29594                 }
29595               }
29596             }
29597           }
29598         }
29599         graph = graph.remove(removeNode);
29600       });
29601       if (target.tags.area === "yes") {
29602         var tags = Object.assign({}, target.tags);
29603         delete tags.area;
29604         if (osmTagSuggestingArea(tags)) {
29605           target = target.update({ tags });
29606           graph = graph.replace(target);
29607         }
29608       }
29609       return graph;
29610     };
29611     action.disabled = function(graph) {
29612       var geometries = groupEntitiesByGeometry(graph);
29613       if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) {
29614         return "not_eligible";
29615       }
29616     };
29617     return action;
29618   }
29619
29620   // modules/actions/merge_nodes.js
29621   function actionMergeNodes(nodeIDs, loc) {
29622     function chooseLoc(graph) {
29623       if (!nodeIDs.length)
29624         return null;
29625       var sum = [0, 0];
29626       var interestingCount = 0;
29627       var interestingLoc;
29628       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
29629         var node = graph.entity(nodeIDs[i2]);
29630         if (node.hasInterestingTags()) {
29631           interestingLoc = ++interestingCount === 1 ? node.loc : null;
29632         }
29633         sum = geoVecAdd(sum, node.loc);
29634       }
29635       return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
29636     }
29637     var action = function(graph) {
29638       if (nodeIDs.length < 2)
29639         return graph;
29640       var toLoc = loc;
29641       if (!toLoc) {
29642         toLoc = chooseLoc(graph);
29643       }
29644       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
29645         var node = graph.entity(nodeIDs[i2]);
29646         if (node.loc !== toLoc) {
29647           graph = graph.replace(node.move(toLoc));
29648         }
29649       }
29650       return actionConnect(nodeIDs)(graph);
29651     };
29652     action.disabled = function(graph) {
29653       if (nodeIDs.length < 2)
29654         return "not_eligible";
29655       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
29656         var entity = graph.entity(nodeIDs[i2]);
29657         if (entity.type !== "node")
29658           return "not_eligible";
29659       }
29660       return actionConnect(nodeIDs).disabled(graph);
29661     };
29662     return action;
29663   }
29664
29665   // modules/osm/changeset.js
29666   function osmChangeset() {
29667     if (!(this instanceof osmChangeset)) {
29668       return new osmChangeset().initialize(arguments);
29669     } else if (arguments.length) {
29670       this.initialize(arguments);
29671     }
29672   }
29673   osmEntity.changeset = osmChangeset;
29674   osmChangeset.prototype = Object.create(osmEntity.prototype);
29675   Object.assign(osmChangeset.prototype, {
29676     type: "changeset",
29677     extent: function() {
29678       return new geoExtent();
29679     },
29680     geometry: function() {
29681       return "changeset";
29682     },
29683     asJXON: function() {
29684       return {
29685         osm: {
29686           changeset: {
29687             tag: Object.keys(this.tags).map(function(k) {
29688               return { "@k": k, "@v": this.tags[k] };
29689             }, this),
29690             "@version": 0.6,
29691             "@generator": "iD"
29692           }
29693         }
29694       };
29695     },
29696     // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
29697     // XML. Returns a string.
29698     osmChangeJXON: function(changes) {
29699       var changeset_id = this.id;
29700       function nest(x, order) {
29701         var groups = {};
29702         for (var i2 = 0; i2 < x.length; i2++) {
29703           var tagName = Object.keys(x[i2])[0];
29704           if (!groups[tagName])
29705             groups[tagName] = [];
29706           groups[tagName].push(x[i2][tagName]);
29707         }
29708         var ordered = {};
29709         order.forEach(function(o) {
29710           if (groups[o])
29711             ordered[o] = groups[o];
29712         });
29713         return ordered;
29714       }
29715       function sort(changes2) {
29716         function resolve(item) {
29717           return relations.find(function(relation2) {
29718             return item.keyAttributes.type === "relation" && item.keyAttributes.ref === relation2["@id"];
29719           });
29720         }
29721         function isNew(item) {
29722           return !sorted[item["@id"]] && !processing.find(function(proc) {
29723             return proc["@id"] === item["@id"];
29724           });
29725         }
29726         var processing = [];
29727         var sorted = {};
29728         var relations = changes2.relation;
29729         if (!relations)
29730           return changes2;
29731         for (var i2 = 0; i2 < relations.length; i2++) {
29732           var relation = relations[i2];
29733           if (!sorted[relation["@id"]]) {
29734             processing.push(relation);
29735           }
29736           while (processing.length > 0) {
29737             var next = processing[0], deps = next.member.map(resolve).filter(Boolean).filter(isNew);
29738             if (deps.length === 0) {
29739               sorted[next["@id"]] = next;
29740               processing.shift();
29741             } else {
29742               processing = deps.concat(processing);
29743             }
29744           }
29745         }
29746         changes2.relation = Object.values(sorted);
29747         return changes2;
29748       }
29749       function rep2(entity) {
29750         return entity.asJXON(changeset_id);
29751       }
29752       return {
29753         osmChange: {
29754           "@version": 0.6,
29755           "@generator": "iD",
29756           "create": sort(nest(changes.created.map(rep2), ["node", "way", "relation"])),
29757           "modify": nest(changes.modified.map(rep2), ["node", "way", "relation"]),
29758           "delete": Object.assign(nest(changes.deleted.map(rep2), ["relation", "way", "node"]), { "@if-unused": true })
29759         }
29760       };
29761     },
29762     asGeoJSON: function() {
29763       return {};
29764     }
29765   });
29766
29767   // modules/osm/note.js
29768   function osmNote() {
29769     if (!(this instanceof osmNote)) {
29770       return new osmNote().initialize(arguments);
29771     } else if (arguments.length) {
29772       this.initialize(arguments);
29773     }
29774   }
29775   osmNote.id = function() {
29776     return osmNote.id.next--;
29777   };
29778   osmNote.id.next = -1;
29779   Object.assign(osmNote.prototype, {
29780     type: "note",
29781     initialize: function(sources) {
29782       for (var i2 = 0; i2 < sources.length; ++i2) {
29783         var source = sources[i2];
29784         for (var prop in source) {
29785           if (Object.prototype.hasOwnProperty.call(source, prop)) {
29786             if (source[prop] === void 0) {
29787               delete this[prop];
29788             } else {
29789               this[prop] = source[prop];
29790             }
29791           }
29792         }
29793       }
29794       if (!this.id) {
29795         this.id = osmNote.id().toString();
29796       }
29797       return this;
29798     },
29799     extent: function() {
29800       return new geoExtent(this.loc);
29801     },
29802     update: function(attrs) {
29803       return osmNote(this, attrs);
29804     },
29805     isNew: function() {
29806       return this.id < 0;
29807     },
29808     move: function(loc) {
29809       return this.update({ loc });
29810     }
29811   });
29812
29813   // modules/osm/relation.js
29814   function osmRelation() {
29815     if (!(this instanceof osmRelation)) {
29816       return new osmRelation().initialize(arguments);
29817     } else if (arguments.length) {
29818       this.initialize(arguments);
29819     }
29820   }
29821   osmEntity.relation = osmRelation;
29822   osmRelation.prototype = Object.create(osmEntity.prototype);
29823   osmRelation.creationOrder = function(a, b) {
29824     var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
29825     var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
29826     if (aId < 0 || bId < 0)
29827       return aId - bId;
29828     return bId - aId;
29829   };
29830   Object.assign(osmRelation.prototype, {
29831     type: "relation",
29832     members: [],
29833     copy: function(resolver, copies) {
29834       if (copies[this.id])
29835         return copies[this.id];
29836       var copy2 = osmEntity.prototype.copy.call(this, resolver, copies);
29837       var members = this.members.map(function(member) {
29838         return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
29839       });
29840       copy2 = copy2.update({ members });
29841       copies[this.id] = copy2;
29842       return copy2;
29843     },
29844     extent: function(resolver, memo) {
29845       return resolver.transient(this, "extent", function() {
29846         if (memo && memo[this.id])
29847           return geoExtent();
29848         memo = memo || {};
29849         memo[this.id] = true;
29850         var extent = geoExtent();
29851         for (var i2 = 0; i2 < this.members.length; i2++) {
29852           var member = resolver.hasEntity(this.members[i2].id);
29853           if (member) {
29854             extent._extend(member.extent(resolver, memo));
29855           }
29856         }
29857         return extent;
29858       });
29859     },
29860     geometry: function(graph) {
29861       return graph.transient(this, "geometry", function() {
29862         return this.isMultipolygon() ? "area" : "relation";
29863       });
29864     },
29865     isDegenerate: function() {
29866       return this.members.length === 0;
29867     },
29868     // Return an array of members, each extended with an 'index' property whose value
29869     // is the member index.
29870     indexedMembers: function() {
29871       var result = new Array(this.members.length);
29872       for (var i2 = 0; i2 < this.members.length; i2++) {
29873         result[i2] = Object.assign({}, this.members[i2], { index: i2 });
29874       }
29875       return result;
29876     },
29877     // Return the first member with the given role. A copy of the member object
29878     // is returned, extended with an 'index' property whose value is the member index.
29879     memberByRole: function(role) {
29880       for (var i2 = 0; i2 < this.members.length; i2++) {
29881         if (this.members[i2].role === role) {
29882           return Object.assign({}, this.members[i2], { index: i2 });
29883         }
29884       }
29885     },
29886     // Same as memberByRole, but returns all members with the given role
29887     membersByRole: function(role) {
29888       var result = [];
29889       for (var i2 = 0; i2 < this.members.length; i2++) {
29890         if (this.members[i2].role === role) {
29891           result.push(Object.assign({}, this.members[i2], { index: i2 }));
29892         }
29893       }
29894       return result;
29895     },
29896     // Return the first member with the given id. A copy of the member object
29897     // is returned, extended with an 'index' property whose value is the member index.
29898     memberById: function(id2) {
29899       for (var i2 = 0; i2 < this.members.length; i2++) {
29900         if (this.members[i2].id === id2) {
29901           return Object.assign({}, this.members[i2], { index: i2 });
29902         }
29903       }
29904     },
29905     // Return the first member with the given id and role. A copy of the member object
29906     // is returned, extended with an 'index' property whose value is the member index.
29907     memberByIdAndRole: function(id2, role) {
29908       for (var i2 = 0; i2 < this.members.length; i2++) {
29909         if (this.members[i2].id === id2 && this.members[i2].role === role) {
29910           return Object.assign({}, this.members[i2], { index: i2 });
29911         }
29912       }
29913     },
29914     addMember: function(member, index) {
29915       var members = this.members.slice();
29916       members.splice(index === void 0 ? members.length : index, 0, member);
29917       return this.update({ members });
29918     },
29919     updateMember: function(member, index) {
29920       var members = this.members.slice();
29921       members.splice(index, 1, Object.assign({}, members[index], member));
29922       return this.update({ members });
29923     },
29924     removeMember: function(index) {
29925       var members = this.members.slice();
29926       members.splice(index, 1);
29927       return this.update({ members });
29928     },
29929     removeMembersWithID: function(id2) {
29930       var members = this.members.filter(function(m) {
29931         return m.id !== id2;
29932       });
29933       return this.update({ members });
29934     },
29935     moveMember: function(fromIndex, toIndex) {
29936       var members = this.members.slice();
29937       members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
29938       return this.update({ members });
29939     },
29940     // Wherever a member appears with id `needle.id`, replace it with a member
29941     // with id `replacement.id`, type `replacement.type`, and the original role,
29942     // By default, adding a duplicate member (by id and role) is prevented.
29943     // Return an updated relation.
29944     replaceMember: function(needle, replacement, keepDuplicates) {
29945       if (!this.memberById(needle.id))
29946         return this;
29947       var members = [];
29948       for (var i2 = 0; i2 < this.members.length; i2++) {
29949         var member = this.members[i2];
29950         if (member.id !== needle.id) {
29951           members.push(member);
29952         } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
29953           members.push({ id: replacement.id, type: replacement.type, role: member.role });
29954         }
29955       }
29956       return this.update({ members });
29957     },
29958     asJXON: function(changeset_id) {
29959       var r = {
29960         relation: {
29961           "@id": this.osmId(),
29962           "@version": this.version || 0,
29963           member: this.members.map(function(member) {
29964             return {
29965               keyAttributes: {
29966                 type: member.type,
29967                 role: member.role,
29968                 ref: osmEntity.id.toOSM(member.id)
29969               }
29970             };
29971           }, this),
29972           tag: Object.keys(this.tags).map(function(k) {
29973             return { keyAttributes: { k, v: this.tags[k] } };
29974           }, this)
29975         }
29976       };
29977       if (changeset_id) {
29978         r.relation["@changeset"] = changeset_id;
29979       }
29980       return r;
29981     },
29982     asGeoJSON: function(resolver) {
29983       return resolver.transient(this, "GeoJSON", function() {
29984         if (this.isMultipolygon()) {
29985           return {
29986             type: "MultiPolygon",
29987             coordinates: this.multipolygon(resolver)
29988           };
29989         } else {
29990           return {
29991             type: "FeatureCollection",
29992             properties: this.tags,
29993             features: this.members.map(function(member) {
29994               return Object.assign({ role: member.role }, resolver.entity(member.id).asGeoJSON(resolver));
29995             })
29996           };
29997         }
29998       });
29999     },
30000     area: function(resolver) {
30001       return resolver.transient(this, "area", function() {
30002         return area_default(this.asGeoJSON(resolver));
30003       });
30004     },
30005     isMultipolygon: function() {
30006       return this.tags.type === "multipolygon";
30007     },
30008     isComplete: function(resolver) {
30009       for (var i2 = 0; i2 < this.members.length; i2++) {
30010         if (!resolver.hasEntity(this.members[i2].id)) {
30011           return false;
30012         }
30013       }
30014       return true;
30015     },
30016     hasFromViaTo: function() {
30017       return this.members.some(function(m) {
30018         return m.role === "from";
30019       }) && this.members.some(function(m) {
30020         return m.role === "via";
30021       }) && this.members.some(function(m) {
30022         return m.role === "to";
30023       });
30024     },
30025     isRestriction: function() {
30026       return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
30027     },
30028     isValidRestriction: function() {
30029       if (!this.isRestriction())
30030         return false;
30031       var froms = this.members.filter(function(m) {
30032         return m.role === "from";
30033       });
30034       var vias = this.members.filter(function(m) {
30035         return m.role === "via";
30036       });
30037       var tos = this.members.filter(function(m) {
30038         return m.role === "to";
30039       });
30040       if (froms.length !== 1 && this.tags.restriction !== "no_entry")
30041         return false;
30042       if (froms.some(function(m) {
30043         return m.type !== "way";
30044       }))
30045         return false;
30046       if (tos.length !== 1 && this.tags.restriction !== "no_exit")
30047         return false;
30048       if (tos.some(function(m) {
30049         return m.type !== "way";
30050       }))
30051         return false;
30052       if (vias.length === 0)
30053         return false;
30054       if (vias.length > 1 && vias.some(function(m) {
30055         return m.type !== "way";
30056       }))
30057         return false;
30058       return true;
30059     },
30060     isConnectivity: function() {
30061       return !!(this.tags.type && this.tags.type.match(/^connectivity:?/));
30062     },
30063     // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
30064     // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
30065     //
30066     // This corresponds to the structure needed for rendering a multipolygon path using a
30067     // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
30068     //
30069     // In the case of invalid geometries, this function will still return a result which
30070     // includes the nodes of all way members, but some Nds may be unclosed and some inner
30071     // rings not matched with the intended outer ring.
30072     //
30073     multipolygon: function(resolver) {
30074       var outers = this.members.filter(function(m) {
30075         return "outer" === (m.role || "outer");
30076       });
30077       var inners = this.members.filter(function(m) {
30078         return "inner" === m.role;
30079       });
30080       outers = osmJoinWays(outers, resolver);
30081       inners = osmJoinWays(inners, resolver);
30082       var sequenceToLineString = function(sequence) {
30083         if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) {
30084           sequence.nodes.push(sequence.nodes[0]);
30085         }
30086         return sequence.nodes.map(function(node) {
30087           return node.loc;
30088         });
30089       };
30090       outers = outers.map(sequenceToLineString);
30091       inners = inners.map(sequenceToLineString);
30092       var result = outers.map(function(o2) {
30093         return [area_default({ type: "Polygon", coordinates: [o2] }) > 2 * Math.PI ? o2.reverse() : o2];
30094       });
30095       function findOuter(inner2) {
30096         var o2, outer;
30097         for (o2 = 0; o2 < outers.length; o2++) {
30098           outer = outers[o2];
30099           if (geoPolygonContainsPolygon(outer, inner2)) {
30100             return o2;
30101           }
30102         }
30103         for (o2 = 0; o2 < outers.length; o2++) {
30104           outer = outers[o2];
30105           if (geoPolygonIntersectsPolygon(outer, inner2, false)) {
30106             return o2;
30107           }
30108         }
30109       }
30110       for (var i2 = 0; i2 < inners.length; i2++) {
30111         var inner = inners[i2];
30112         if (area_default({ type: "Polygon", coordinates: [inner] }) < 2 * Math.PI) {
30113           inner = inner.reverse();
30114         }
30115         var o = findOuter(inners[i2]);
30116         if (o !== void 0) {
30117           result[o].push(inners[i2]);
30118         } else {
30119           result.push([inners[i2]]);
30120         }
30121       }
30122       return result;
30123     }
30124   });
30125
30126   // modules/osm/qa_item.js
30127   var QAItem = class {
30128     constructor(loc, service, itemType, id2, props) {
30129       this.loc = loc;
30130       this.service = service.title;
30131       this.itemType = itemType;
30132       this.id = id2 ? id2 : `${QAItem.id()}`;
30133       this.update(props);
30134       if (service && typeof service.getIcon === "function") {
30135         this.icon = service.getIcon(itemType);
30136       }
30137     }
30138     update(props) {
30139       const { loc, service, itemType, id: id2 } = this;
30140       Object.keys(props).forEach((prop) => this[prop] = props[prop]);
30141       this.loc = loc;
30142       this.service = service;
30143       this.itemType = itemType;
30144       this.id = id2;
30145       return this;
30146     }
30147     // Generic handling for newly created QAItems
30148     static id() {
30149       return this.nextId--;
30150     }
30151   };
30152   QAItem.nextId = -1;
30153
30154   // modules/actions/split.js
30155   function actionSplit(nodeIds, newWayIds) {
30156     if (typeof nodeIds === "string")
30157       nodeIds = [nodeIds];
30158     var _wayIDs;
30159     var _keepHistoryOn = "longest";
30160     var _createdWayIDs = [];
30161     function dist(graph, nA, nB) {
30162       var locA = graph.entity(nA).loc;
30163       var locB = graph.entity(nB).loc;
30164       var epsilon3 = 1e-6;
30165       return locA && locB ? geoSphericalDistance(locA, locB) : epsilon3;
30166     }
30167     function splitArea(nodes, idxA, graph) {
30168       var lengths = new Array(nodes.length);
30169       var length;
30170       var i2;
30171       var best = 0;
30172       var idxB;
30173       function wrap2(index) {
30174         return utilWrap(index, nodes.length);
30175       }
30176       length = 0;
30177       for (i2 = wrap2(idxA + 1); i2 !== idxA; i2 = wrap2(i2 + 1)) {
30178         length += dist(graph, nodes[i2], nodes[wrap2(i2 - 1)]);
30179         lengths[i2] = length;
30180       }
30181       length = 0;
30182       for (i2 = wrap2(idxA - 1); i2 !== idxA; i2 = wrap2(i2 - 1)) {
30183         length += dist(graph, nodes[i2], nodes[wrap2(i2 + 1)]);
30184         if (length < lengths[i2]) {
30185           lengths[i2] = length;
30186         }
30187       }
30188       for (i2 = 0; i2 < nodes.length; i2++) {
30189         var cost = lengths[i2] / dist(graph, nodes[idxA], nodes[i2]);
30190         if (cost > best) {
30191           idxB = i2;
30192           best = cost;
30193         }
30194       }
30195       return idxB;
30196     }
30197     function totalLengthBetweenNodes(graph, nodes) {
30198       var totalLength = 0;
30199       for (var i2 = 0; i2 < nodes.length - 1; i2++) {
30200         totalLength += dist(graph, nodes[i2], nodes[i2 + 1]);
30201       }
30202       return totalLength;
30203     }
30204     function split(graph, nodeId, wayA, newWayId) {
30205       var wayB = osmWay({ id: newWayId, tags: wayA.tags });
30206       var origNodes = wayA.nodes.slice();
30207       var nodesA;
30208       var nodesB;
30209       var isArea = wayA.isArea();
30210       var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
30211       if (wayA.isClosed()) {
30212         var nodes = wayA.nodes.slice(0, -1);
30213         var idxA = nodes.indexOf(nodeId);
30214         var idxB = splitArea(nodes, idxA, graph);
30215         if (idxB < idxA) {
30216           nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
30217           nodesB = nodes.slice(idxB, idxA + 1);
30218         } else {
30219           nodesA = nodes.slice(idxA, idxB + 1);
30220           nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
30221         }
30222       } else {
30223         var idx = wayA.nodes.indexOf(nodeId, 1);
30224         nodesA = wayA.nodes.slice(0, idx + 1);
30225         nodesB = wayA.nodes.slice(idx);
30226       }
30227       var lengthA = totalLengthBetweenNodes(graph, nodesA);
30228       var lengthB = totalLengthBetweenNodes(graph, nodesB);
30229       if (_keepHistoryOn === "longest" && lengthB > lengthA) {
30230         wayA = wayA.update({ nodes: nodesB });
30231         wayB = wayB.update({ nodes: nodesA });
30232         var temp = lengthA;
30233         lengthA = lengthB;
30234         lengthB = temp;
30235       } else {
30236         wayA = wayA.update({ nodes: nodesA });
30237         wayB = wayB.update({ nodes: nodesB });
30238       }
30239       if (wayA.tags.step_count) {
30240         var stepCount = Number(wayA.tags.step_count);
30241         if (stepCount && // ensure a number
30242         isFinite(stepCount) && // ensure positive
30243         stepCount > 0 && // ensure integer
30244         Math.round(stepCount) === stepCount) {
30245           var tagsA = Object.assign({}, wayA.tags);
30246           var tagsB = Object.assign({}, wayB.tags);
30247           var ratioA = lengthA / (lengthA + lengthB);
30248           var countA = Math.round(stepCount * ratioA);
30249           tagsA.step_count = countA.toString();
30250           tagsB.step_count = (stepCount - countA).toString();
30251           wayA = wayA.update({ tags: tagsA });
30252           wayB = wayB.update({ tags: tagsB });
30253         }
30254       }
30255       graph = graph.replace(wayA);
30256       graph = graph.replace(wayB);
30257       graph.parentRelations(wayA).forEach(function(relation) {
30258         var member;
30259         if (relation.hasFromViaTo()) {
30260           var f2 = relation.memberByRole("from");
30261           var v = relation.membersByRole("via");
30262           var t = relation.memberByRole("to");
30263           var i2;
30264           if (f2.id === wayA.id || t.id === wayA.id) {
30265             var keepB = false;
30266             if (v.length === 1 && v[0].type === "node") {
30267               keepB = wayB.contains(v[0].id);
30268             } else {
30269               for (i2 = 0; i2 < v.length; i2++) {
30270                 if (v[i2].type === "way") {
30271                   var wayVia = graph.hasEntity(v[i2].id);
30272                   if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
30273                     keepB = true;
30274                     break;
30275                   }
30276                 }
30277               }
30278             }
30279             if (keepB) {
30280               relation = relation.replaceMember(wayA, wayB);
30281               graph = graph.replace(relation);
30282             }
30283           } else {
30284             for (i2 = 0; i2 < v.length; i2++) {
30285               if (v[i2].type === "way" && v[i2].id === wayA.id) {
30286                 member = {
30287                   id: wayB.id,
30288                   type: "way",
30289                   role: "via"
30290                 };
30291                 graph = actionAddMember(relation.id, member, v[i2].index + 1)(graph);
30292                 break;
30293               }
30294             }
30295           }
30296         } else {
30297           if (relation === isOuter) {
30298             graph = graph.replace(relation.mergeTags(wayA.tags));
30299             graph = graph.replace(wayA.update({ tags: {} }));
30300             graph = graph.replace(wayB.update({ tags: {} }));
30301           }
30302           member = {
30303             id: wayB.id,
30304             type: "way",
30305             role: relation.memberById(wayA.id).role
30306           };
30307           var insertPair = {
30308             originalID: wayA.id,
30309             insertedID: wayB.id,
30310             nodes: origNodes
30311           };
30312           graph = actionAddMember(relation.id, member, void 0, insertPair)(graph);
30313         }
30314       });
30315       if (!isOuter && isArea) {
30316         var multipolygon = osmRelation({
30317           tags: Object.assign({}, wayA.tags, { type: "multipolygon" }),
30318           members: [
30319             { id: wayA.id, role: "outer", type: "way" },
30320             { id: wayB.id, role: "outer", type: "way" }
30321           ]
30322         });
30323         graph = graph.replace(multipolygon);
30324         graph = graph.replace(wayA.update({ tags: {} }));
30325         graph = graph.replace(wayB.update({ tags: {} }));
30326       }
30327       _createdWayIDs.push(wayB.id);
30328       return graph;
30329     }
30330     var action = function(graph) {
30331       _createdWayIDs = [];
30332       var newWayIndex = 0;
30333       for (var i2 = 0; i2 < nodeIds.length; i2++) {
30334         var nodeId = nodeIds[i2];
30335         var candidates = action.waysForNode(nodeId, graph);
30336         for (var j2 = 0; j2 < candidates.length; j2++) {
30337           graph = split(graph, nodeId, candidates[j2], newWayIds && newWayIds[newWayIndex]);
30338           newWayIndex += 1;
30339         }
30340       }
30341       return graph;
30342     };
30343     action.getCreatedWayIDs = function() {
30344       return _createdWayIDs;
30345     };
30346     action.waysForNode = function(nodeId, graph) {
30347       var node = graph.entity(nodeId);
30348       var splittableParents = graph.parentWays(node).filter(isSplittable);
30349       if (!_wayIDs) {
30350         var hasLine = splittableParents.some(function(parent) {
30351           return parent.geometry(graph) === "line";
30352         });
30353         if (hasLine) {
30354           return splittableParents.filter(function(parent) {
30355             return parent.geometry(graph) === "line";
30356           });
30357         }
30358       }
30359       return splittableParents;
30360       function isSplittable(parent) {
30361         if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
30362           return false;
30363         if (parent.isClosed())
30364           return true;
30365         for (var i2 = 1; i2 < parent.nodes.length - 1; i2++) {
30366           if (parent.nodes[i2] === nodeId)
30367             return true;
30368         }
30369         return false;
30370       }
30371     };
30372     action.ways = function(graph) {
30373       return utilArrayUniq([].concat.apply([], nodeIds.map(function(nodeId) {
30374         return action.waysForNode(nodeId, graph);
30375       })));
30376     };
30377     action.disabled = function(graph) {
30378       for (var i2 = 0; i2 < nodeIds.length; i2++) {
30379         var nodeId = nodeIds[i2];
30380         var candidates = action.waysForNode(nodeId, graph);
30381         if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) {
30382           return "not_eligible";
30383         }
30384       }
30385     };
30386     action.limitWays = function(val) {
30387       if (!arguments.length)
30388         return _wayIDs;
30389       _wayIDs = val;
30390       return action;
30391     };
30392     action.keepHistoryOn = function(val) {
30393       if (!arguments.length)
30394         return _keepHistoryOn;
30395       _keepHistoryOn = val;
30396       return action;
30397     };
30398     return action;
30399   }
30400
30401   // modules/core/graph.js
30402   function coreGraph(other, mutable) {
30403     if (!(this instanceof coreGraph))
30404       return new coreGraph(other, mutable);
30405     if (other instanceof coreGraph) {
30406       var base = other.base();
30407       this.entities = Object.assign(Object.create(base.entities), other.entities);
30408       this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
30409       this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
30410     } else {
30411       this.entities = /* @__PURE__ */ Object.create({});
30412       this._parentWays = /* @__PURE__ */ Object.create({});
30413       this._parentRels = /* @__PURE__ */ Object.create({});
30414       this.rebase(other || [], [this]);
30415     }
30416     this.transients = {};
30417     this._childNodes = {};
30418     this.frozen = !mutable;
30419   }
30420   coreGraph.prototype = {
30421     hasEntity: function(id2) {
30422       return this.entities[id2];
30423     },
30424     entity: function(id2) {
30425       var entity = this.entities[id2];
30426       if (!entity) {
30427         entity = this.entities.__proto__[id2];
30428       }
30429       if (!entity) {
30430         throw new Error("entity " + id2 + " not found");
30431       }
30432       return entity;
30433     },
30434     geometry: function(id2) {
30435       return this.entity(id2).geometry(this);
30436     },
30437     transient: function(entity, key, fn) {
30438       var id2 = entity.id;
30439       var transients = this.transients[id2] || (this.transients[id2] = {});
30440       if (transients[key] !== void 0) {
30441         return transients[key];
30442       }
30443       transients[key] = fn.call(entity);
30444       return transients[key];
30445     },
30446     parentWays: function(entity) {
30447       var parents = this._parentWays[entity.id];
30448       var result = [];
30449       if (parents) {
30450         parents.forEach(function(id2) {
30451           result.push(this.entity(id2));
30452         }, this);
30453       }
30454       return result;
30455     },
30456     isPoi: function(entity) {
30457       var parents = this._parentWays[entity.id];
30458       return !parents || parents.size === 0;
30459     },
30460     isShared: function(entity) {
30461       var parents = this._parentWays[entity.id];
30462       return parents && parents.size > 1;
30463     },
30464     parentRelations: function(entity) {
30465       var parents = this._parentRels[entity.id];
30466       var result = [];
30467       if (parents) {
30468         parents.forEach(function(id2) {
30469           result.push(this.entity(id2));
30470         }, this);
30471       }
30472       return result;
30473     },
30474     parentMultipolygons: function(entity) {
30475       return this.parentRelations(entity).filter(function(relation) {
30476         return relation.isMultipolygon();
30477       });
30478     },
30479     childNodes: function(entity) {
30480       if (this._childNodes[entity.id])
30481         return this._childNodes[entity.id];
30482       if (!entity.nodes)
30483         return [];
30484       var nodes = [];
30485       for (var i2 = 0; i2 < entity.nodes.length; i2++) {
30486         nodes[i2] = this.entity(entity.nodes[i2]);
30487       }
30488       if (debug)
30489         Object.freeze(nodes);
30490       this._childNodes[entity.id] = nodes;
30491       return this._childNodes[entity.id];
30492     },
30493     base: function() {
30494       return {
30495         "entities": Object.getPrototypeOf(this.entities),
30496         "parentWays": Object.getPrototypeOf(this._parentWays),
30497         "parentRels": Object.getPrototypeOf(this._parentRels)
30498       };
30499     },
30500     // Unlike other graph methods, rebase mutates in place. This is because it
30501     // is used only during the history operation that merges newly downloaded
30502     // data into each state. To external consumers, it should appear as if the
30503     // graph always contained the newly downloaded data.
30504     rebase: function(entities, stack, force) {
30505       var base = this.base();
30506       var i2, j2, k, id2;
30507       for (i2 = 0; i2 < entities.length; i2++) {
30508         var entity = entities[i2];
30509         if (!entity.visible || !force && base.entities[entity.id])
30510           continue;
30511         base.entities[entity.id] = entity;
30512         this._updateCalculated(void 0, entity, base.parentWays, base.parentRels);
30513         if (entity.type === "way") {
30514           for (j2 = 0; j2 < entity.nodes.length; j2++) {
30515             id2 = entity.nodes[j2];
30516             for (k = 1; k < stack.length; k++) {
30517               var ents = stack[k].entities;
30518               if (ents.hasOwnProperty(id2) && ents[id2] === void 0) {
30519                 delete ents[id2];
30520               }
30521             }
30522           }
30523         }
30524       }
30525       for (i2 = 0; i2 < stack.length; i2++) {
30526         stack[i2]._updateRebased();
30527       }
30528     },
30529     _updateRebased: function() {
30530       var base = this.base();
30531       Object.keys(this._parentWays).forEach(function(child) {
30532         if (base.parentWays[child]) {
30533           base.parentWays[child].forEach(function(id2) {
30534             if (!this.entities.hasOwnProperty(id2)) {
30535               this._parentWays[child].add(id2);
30536             }
30537           }, this);
30538         }
30539       }, this);
30540       Object.keys(this._parentRels).forEach(function(child) {
30541         if (base.parentRels[child]) {
30542           base.parentRels[child].forEach(function(id2) {
30543             if (!this.entities.hasOwnProperty(id2)) {
30544               this._parentRels[child].add(id2);
30545             }
30546           }, this);
30547         }
30548       }, this);
30549       this.transients = {};
30550     },
30551     // Updates calculated properties (parentWays, parentRels) for the specified change
30552     _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
30553       parentWays = parentWays || this._parentWays;
30554       parentRels = parentRels || this._parentRels;
30555       var type2 = entity && entity.type || oldentity && oldentity.type;
30556       var removed, added, i2;
30557       if (type2 === "way") {
30558         if (oldentity && entity) {
30559           removed = utilArrayDifference(oldentity.nodes, entity.nodes);
30560           added = utilArrayDifference(entity.nodes, oldentity.nodes);
30561         } else if (oldentity) {
30562           removed = oldentity.nodes;
30563           added = [];
30564         } else if (entity) {
30565           removed = [];
30566           added = entity.nodes;
30567         }
30568         for (i2 = 0; i2 < removed.length; i2++) {
30569           parentWays[removed[i2]] = new Set(parentWays[removed[i2]]);
30570           parentWays[removed[i2]].delete(oldentity.id);
30571         }
30572         for (i2 = 0; i2 < added.length; i2++) {
30573           parentWays[added[i2]] = new Set(parentWays[added[i2]]);
30574           parentWays[added[i2]].add(entity.id);
30575         }
30576       } else if (type2 === "relation") {
30577         var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) {
30578           return m.id;
30579         }) : [];
30580         var entityMemberIDs = entity ? entity.members.map(function(m) {
30581           return m.id;
30582         }) : [];
30583         if (oldentity && entity) {
30584           removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
30585           added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
30586         } else if (oldentity) {
30587           removed = oldentityMemberIDs;
30588           added = [];
30589         } else if (entity) {
30590           removed = [];
30591           added = entityMemberIDs;
30592         }
30593         for (i2 = 0; i2 < removed.length; i2++) {
30594           parentRels[removed[i2]] = new Set(parentRels[removed[i2]]);
30595           parentRels[removed[i2]].delete(oldentity.id);
30596         }
30597         for (i2 = 0; i2 < added.length; i2++) {
30598           parentRels[added[i2]] = new Set(parentRels[added[i2]]);
30599           parentRels[added[i2]].add(entity.id);
30600         }
30601       }
30602     },
30603     replace: function(entity) {
30604       if (this.entities[entity.id] === entity)
30605         return this;
30606       return this.update(function() {
30607         this._updateCalculated(this.entities[entity.id], entity);
30608         this.entities[entity.id] = entity;
30609       });
30610     },
30611     remove: function(entity) {
30612       return this.update(function() {
30613         this._updateCalculated(entity, void 0);
30614         this.entities[entity.id] = void 0;
30615       });
30616     },
30617     revert: function(id2) {
30618       var baseEntity = this.base().entities[id2];
30619       var headEntity = this.entities[id2];
30620       if (headEntity === baseEntity)
30621         return this;
30622       return this.update(function() {
30623         this._updateCalculated(headEntity, baseEntity);
30624         delete this.entities[id2];
30625       });
30626     },
30627     update: function() {
30628       var graph = this.frozen ? coreGraph(this, true) : this;
30629       for (var i2 = 0; i2 < arguments.length; i2++) {
30630         arguments[i2].call(graph, graph);
30631       }
30632       if (this.frozen)
30633         graph.frozen = true;
30634       return graph;
30635     },
30636     // Obliterates any existing entities
30637     load: function(entities) {
30638       var base = this.base();
30639       this.entities = Object.create(base.entities);
30640       for (var i2 in entities) {
30641         this.entities[i2] = entities[i2];
30642         this._updateCalculated(base.entities[i2], this.entities[i2]);
30643       }
30644       return this;
30645     }
30646   };
30647
30648   // modules/osm/intersection.js
30649   function osmTurn(turn) {
30650     if (!(this instanceof osmTurn)) {
30651       return new osmTurn(turn);
30652     }
30653     Object.assign(this, turn);
30654   }
30655   function osmIntersection(graph, startVertexId, maxDistance) {
30656     maxDistance = maxDistance || 30;
30657     var vgraph = coreGraph();
30658     var i2, j2, k;
30659     function memberOfRestriction(entity) {
30660       return graph.parentRelations(entity).some(function(r) {
30661         return r.isRestriction();
30662       });
30663     }
30664     function isRoad(way2) {
30665       if (way2.isArea() || way2.isDegenerate())
30666         return false;
30667       var roads = {
30668         "motorway": true,
30669         "motorway_link": true,
30670         "trunk": true,
30671         "trunk_link": true,
30672         "primary": true,
30673         "primary_link": true,
30674         "secondary": true,
30675         "secondary_link": true,
30676         "tertiary": true,
30677         "tertiary_link": true,
30678         "residential": true,
30679         "unclassified": true,
30680         "living_street": true,
30681         "service": true,
30682         "road": true,
30683         "track": true
30684       };
30685       return roads[way2.tags.highway];
30686     }
30687     var startNode = graph.entity(startVertexId);
30688     var checkVertices = [startNode];
30689     var checkWays;
30690     var vertices = [];
30691     var vertexIds = [];
30692     var vertex;
30693     var ways = [];
30694     var wayIds = [];
30695     var way;
30696     var nodes = [];
30697     var node;
30698     var parents = [];
30699     var parent;
30700     var actions = [];
30701     while (checkVertices.length) {
30702       vertex = checkVertices.pop();
30703       checkWays = graph.parentWays(vertex);
30704       var hasWays = false;
30705       for (i2 = 0; i2 < checkWays.length; i2++) {
30706         way = checkWays[i2];
30707         if (!isRoad(way) && !memberOfRestriction(way))
30708           continue;
30709         ways.push(way);
30710         hasWays = true;
30711         nodes = utilArrayUniq(graph.childNodes(way));
30712         for (j2 = 0; j2 < nodes.length; j2++) {
30713           node = nodes[j2];
30714           if (node === vertex)
30715             continue;
30716           if (vertices.indexOf(node) !== -1)
30717             continue;
30718           if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance)
30719             continue;
30720           var hasParents = false;
30721           parents = graph.parentWays(node);
30722           for (k = 0; k < parents.length; k++) {
30723             parent = parents[k];
30724             if (parent === way)
30725               continue;
30726             if (ways.indexOf(parent) !== -1)
30727               continue;
30728             if (!isRoad(parent))
30729               continue;
30730             hasParents = true;
30731             break;
30732           }
30733           if (hasParents) {
30734             checkVertices.push(node);
30735           }
30736         }
30737       }
30738       if (hasWays) {
30739         vertices.push(vertex);
30740       }
30741     }
30742     vertices = utilArrayUniq(vertices);
30743     ways = utilArrayUniq(ways);
30744     ways.forEach(function(way2) {
30745       graph.childNodes(way2).forEach(function(node2) {
30746         vgraph = vgraph.replace(node2);
30747       });
30748       vgraph = vgraph.replace(way2);
30749       graph.parentRelations(way2).forEach(function(relation) {
30750         if (relation.isRestriction()) {
30751           if (relation.isValidRestriction(graph)) {
30752             vgraph = vgraph.replace(relation);
30753           } else if (relation.isComplete(graph)) {
30754             actions.push(actionDeleteRelation(relation.id));
30755           }
30756         }
30757       });
30758     });
30759     ways.forEach(function(w) {
30760       var way2 = vgraph.entity(w.id);
30761       if (way2.tags.oneway === "-1") {
30762         var action = actionReverse(way2.id, { reverseOneway: true });
30763         actions.push(action);
30764         vgraph = action(vgraph);
30765       }
30766     });
30767     var origCount = osmEntity.id.next.way;
30768     vertices.forEach(function(v) {
30769       var splitAll = actionSplit([v.id]).keepHistoryOn("first");
30770       if (!splitAll.disabled(vgraph)) {
30771         splitAll.ways(vgraph).forEach(function(way2) {
30772           var splitOne = actionSplit([v.id]).limitWays([way2.id]).keepHistoryOn("first");
30773           actions.push(splitOne);
30774           vgraph = splitOne(vgraph);
30775         });
30776       }
30777     });
30778     osmEntity.id.next.way = origCount;
30779     vertexIds = vertices.map(function(v) {
30780       return v.id;
30781     });
30782     vertices = [];
30783     ways = [];
30784     vertexIds.forEach(function(id2) {
30785       var vertex2 = vgraph.entity(id2);
30786       var parents2 = vgraph.parentWays(vertex2);
30787       vertices.push(vertex2);
30788       ways = ways.concat(parents2);
30789     });
30790     vertices = utilArrayUniq(vertices);
30791     ways = utilArrayUniq(ways);
30792     vertexIds = vertices.map(function(v) {
30793       return v.id;
30794     });
30795     wayIds = ways.map(function(w) {
30796       return w.id;
30797     });
30798     function withMetadata(way2, vertexIds2) {
30799       var __oneWay = way2.isOneWay();
30800       var __first = vertexIds2.indexOf(way2.first()) !== -1;
30801       var __last = vertexIds2.indexOf(way2.last()) !== -1;
30802       var __via = __first && __last;
30803       var __from = __first && !__oneWay || __last;
30804       var __to = __first || __last && !__oneWay;
30805       return way2.update({
30806         __first,
30807         __last,
30808         __from,
30809         __via,
30810         __to,
30811         __oneWay
30812       });
30813     }
30814     ways = [];
30815     wayIds.forEach(function(id2) {
30816       var way2 = withMetadata(vgraph.entity(id2), vertexIds);
30817       vgraph = vgraph.replace(way2);
30818       ways.push(way2);
30819     });
30820     var keepGoing;
30821     var removeWayIds = [];
30822     var removeVertexIds = [];
30823     do {
30824       keepGoing = false;
30825       checkVertices = vertexIds.slice();
30826       for (i2 = 0; i2 < checkVertices.length; i2++) {
30827         var vertexId = checkVertices[i2];
30828         vertex = vgraph.hasEntity(vertexId);
30829         if (!vertex) {
30830           if (vertexIds.indexOf(vertexId) !== -1) {
30831             vertexIds.splice(vertexIds.indexOf(vertexId), 1);
30832           }
30833           removeVertexIds.push(vertexId);
30834           continue;
30835         }
30836         parents = vgraph.parentWays(vertex);
30837         if (parents.length < 3) {
30838           if (vertexIds.indexOf(vertexId) !== -1) {
30839             vertexIds.splice(vertexIds.indexOf(vertexId), 1);
30840           }
30841         }
30842         if (parents.length === 2) {
30843           var a = parents[0];
30844           var b = parents[1];
30845           var aIsLeaf = a && !a.__via;
30846           var bIsLeaf = b && !b.__via;
30847           var leaf, survivor;
30848           if (aIsLeaf && !bIsLeaf) {
30849             leaf = a;
30850             survivor = b;
30851           } else if (!aIsLeaf && bIsLeaf) {
30852             leaf = b;
30853             survivor = a;
30854           }
30855           if (leaf && survivor) {
30856             survivor = withMetadata(survivor, vertexIds);
30857             vgraph = vgraph.replace(survivor).remove(leaf);
30858             removeWayIds.push(leaf.id);
30859             keepGoing = true;
30860           }
30861         }
30862         parents = vgraph.parentWays(vertex);
30863         if (parents.length < 2) {
30864           if (vertexIds.indexOf(vertexId) !== -1) {
30865             vertexIds.splice(vertexIds.indexOf(vertexId), 1);
30866           }
30867           removeVertexIds.push(vertexId);
30868           keepGoing = true;
30869         }
30870         if (parents.length < 1) {
30871           vgraph = vgraph.remove(vertex);
30872         }
30873       }
30874     } while (keepGoing);
30875     vertices = vertices.filter(function(vertex2) {
30876       return removeVertexIds.indexOf(vertex2.id) === -1;
30877     }).map(function(vertex2) {
30878       return vgraph.entity(vertex2.id);
30879     });
30880     ways = ways.filter(function(way2) {
30881       return removeWayIds.indexOf(way2.id) === -1;
30882     }).map(function(way2) {
30883       return vgraph.entity(way2.id);
30884     });
30885     var intersection = {
30886       graph: vgraph,
30887       actions,
30888       vertices,
30889       ways
30890     };
30891     intersection.turns = function(fromWayId, maxViaWay) {
30892       if (!fromWayId)
30893         return [];
30894       if (!maxViaWay)
30895         maxViaWay = 0;
30896       var vgraph2 = intersection.graph;
30897       var keyVertexIds = intersection.vertices.map(function(v) {
30898         return v.id;
30899       });
30900       var start2 = vgraph2.entity(fromWayId);
30901       if (!start2 || !(start2.__from || start2.__via))
30902         return [];
30903       var maxPathLength = maxViaWay * 2 + 3;
30904       var turns = [];
30905       step(start2);
30906       return turns;
30907       function step(entity, currPath, currRestrictions, matchedRestriction) {
30908         currPath = (currPath || []).slice();
30909         if (currPath.length >= maxPathLength)
30910           return;
30911         currPath.push(entity.id);
30912         currRestrictions = (currRestrictions || []).slice();
30913         if (entity.type === "node") {
30914           stepNode(entity, currPath, currRestrictions);
30915         } else {
30916           stepWay(entity, currPath, currRestrictions, matchedRestriction);
30917         }
30918       }
30919       function stepNode(entity, currPath, currRestrictions) {
30920         var i3, j3;
30921         var parents2 = vgraph2.parentWays(entity);
30922         var nextWays = [];
30923         for (i3 = 0; i3 < parents2.length; i3++) {
30924           var way2 = parents2[i3];
30925           if (way2.__oneWay && way2.nodes[0] !== entity.id)
30926             continue;
30927           if (currPath.indexOf(way2.id) !== -1 && currPath.length >= 3)
30928             continue;
30929           var restrict = null;
30930           for (j3 = 0; j3 < currRestrictions.length; j3++) {
30931             var restriction = currRestrictions[j3];
30932             var f2 = restriction.memberByRole("from");
30933             var v = restriction.membersByRole("via");
30934             var t = restriction.memberByRole("to");
30935             var isNo = /^no_/.test(restriction.tags.restriction);
30936             var isOnly = /^only_/.test(restriction.tags.restriction);
30937             if (!(isNo || isOnly)) {
30938               continue;
30939             }
30940             var matchesFrom = f2.id === fromWayId;
30941             var matchesViaTo = false;
30942             var isAlongOnlyPath = false;
30943             if (t.id === way2.id) {
30944               if (v.length === 1 && v[0].type === "node") {
30945                 matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2);
30946               } else {
30947                 var pathVias = [];
30948                 for (k = 2; k < currPath.length; k += 2) {
30949                   pathVias.push(currPath[k]);
30950                 }
30951                 var restrictionVias = [];
30952                 for (k = 0; k < v.length; k++) {
30953                   if (v[k].type === "way") {
30954                     restrictionVias.push(v[k].id);
30955                   }
30956                 }
30957                 var diff = utilArrayDifference(pathVias, restrictionVias);
30958                 matchesViaTo = !diff.length;
30959               }
30960             } else if (isOnly) {
30961               for (k = 0; k < v.length; k++) {
30962                 if (v[k].type === "way" && v[k].id === way2.id) {
30963                   isAlongOnlyPath = true;
30964                   break;
30965                 }
30966               }
30967             }
30968             if (matchesViaTo) {
30969               if (isOnly) {
30970                 restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, only: true, end: true };
30971               } else {
30972                 restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, no: true, end: true };
30973               }
30974             } else {
30975               if (isAlongOnlyPath) {
30976                 restrict = { id: restriction.id, direct: false, from: f2.id, only: true, end: false };
30977               } else if (isOnly) {
30978                 restrict = { id: restriction.id, direct: false, from: f2.id, no: true, end: true };
30979               }
30980             }
30981             if (restrict && restrict.direct)
30982               break;
30983           }
30984           nextWays.push({ way: way2, restrict });
30985         }
30986         nextWays.forEach(function(nextWay) {
30987           step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
30988         });
30989       }
30990       function stepWay(entity, currPath, currRestrictions, matchedRestriction) {
30991         var i3;
30992         if (currPath.length >= 3) {
30993           var turnPath = currPath.slice();
30994           if (matchedRestriction && matchedRestriction.direct === false) {
30995             for (i3 = 0; i3 < turnPath.length; i3++) {
30996               if (turnPath[i3] === matchedRestriction.from) {
30997                 turnPath = turnPath.slice(i3);
30998                 break;
30999               }
31000             }
31001           }
31002           var turn = pathToTurn(turnPath);
31003           if (turn) {
31004             if (matchedRestriction) {
31005               turn.restrictionID = matchedRestriction.id;
31006               turn.no = matchedRestriction.no;
31007               turn.only = matchedRestriction.only;
31008               turn.direct = matchedRestriction.direct;
31009             }
31010             turns.push(osmTurn(turn));
31011           }
31012           if (currPath[0] === currPath[2])
31013             return;
31014         }
31015         if (matchedRestriction && matchedRestriction.end)
31016           return;
31017         var n1 = vgraph2.entity(entity.first());
31018         var n2 = vgraph2.entity(entity.last());
31019         var dist = geoSphericalDistance(n1.loc, n2.loc);
31020         var nextNodes = [];
31021         if (currPath.length > 1) {
31022           if (dist > maxDistance)
31023             return;
31024           if (!entity.__via)
31025             return;
31026         }
31027         if (!entity.__oneWay && // bidirectional..
31028         keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
31029         currPath.indexOf(n1.id) === -1) {
31030           nextNodes.push(n1);
31031         }
31032         if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
31033         currPath.indexOf(n2.id) === -1) {
31034           nextNodes.push(n2);
31035         }
31036         nextNodes.forEach(function(nextNode) {
31037           var fromRestrictions = vgraph2.parentRelations(entity).filter(function(r) {
31038             if (!r.isRestriction())
31039               return false;
31040             var f2 = r.memberByRole("from");
31041             if (!f2 || f2.id !== entity.id)
31042               return false;
31043             var isOnly = /^only_/.test(r.tags.restriction);
31044             if (!isOnly)
31045               return true;
31046             var isOnlyVia = false;
31047             var v = r.membersByRole("via");
31048             if (v.length === 1 && v[0].type === "node") {
31049               isOnlyVia = v[0].id === nextNode.id;
31050             } else {
31051               for (var i4 = 0; i4 < v.length; i4++) {
31052                 if (v[i4].type !== "way")
31053                   continue;
31054                 var viaWay = vgraph2.entity(v[i4].id);
31055                 if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
31056                   isOnlyVia = true;
31057                   break;
31058                 }
31059               }
31060             }
31061             return isOnlyVia;
31062           });
31063           step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
31064         });
31065       }
31066       function pathToTurn(path) {
31067         if (path.length < 3)
31068           return;
31069         var fromWayId2, fromNodeId, fromVertexId;
31070         var toWayId, toNodeId, toVertexId;
31071         var viaWayIds, viaNodeId, isUturn;
31072         fromWayId2 = path[0];
31073         toWayId = path[path.length - 1];
31074         if (path.length === 3 && fromWayId2 === toWayId) {
31075           var way2 = vgraph2.entity(fromWayId2);
31076           if (way2.__oneWay)
31077             return null;
31078           isUturn = true;
31079           viaNodeId = fromVertexId = toVertexId = path[1];
31080           fromNodeId = toNodeId = adjacentNode(fromWayId2, viaNodeId);
31081         } else {
31082           isUturn = false;
31083           fromVertexId = path[1];
31084           fromNodeId = adjacentNode(fromWayId2, fromVertexId);
31085           toVertexId = path[path.length - 2];
31086           toNodeId = adjacentNode(toWayId, toVertexId);
31087           if (path.length === 3) {
31088             viaNodeId = path[1];
31089           } else {
31090             viaWayIds = path.filter(function(entityId) {
31091               return entityId[0] === "w";
31092             });
31093             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);
31094           }
31095         }
31096         return {
31097           key: path.join("_"),
31098           path,
31099           from: { node: fromNodeId, way: fromWayId2, vertex: fromVertexId },
31100           via: { node: viaNodeId, ways: viaWayIds },
31101           to: { node: toNodeId, way: toWayId, vertex: toVertexId },
31102           u: isUturn
31103         };
31104         function adjacentNode(wayId, affixId) {
31105           var nodes2 = vgraph2.entity(wayId).nodes;
31106           return affixId === nodes2[0] ? nodes2[1] : nodes2[nodes2.length - 2];
31107         }
31108       }
31109     };
31110     return intersection;
31111   }
31112   function osmInferRestriction(graph, turn, projection2) {
31113     var fromWay = graph.entity(turn.from.way);
31114     var fromNode = graph.entity(turn.from.node);
31115     var fromVertex = graph.entity(turn.from.vertex);
31116     var toWay = graph.entity(turn.to.way);
31117     var toNode = graph.entity(turn.to.node);
31118     var toVertex = graph.entity(turn.to.vertex);
31119     var fromOneWay = fromWay.tags.oneway === "yes";
31120     var toOneWay = toWay.tags.oneway === "yes";
31121     var angle2 = (geoAngle(fromVertex, fromNode, projection2) - geoAngle(toVertex, toNode, projection2)) * 180 / Math.PI;
31122     while (angle2 < 0) {
31123       angle2 += 360;
31124     }
31125     if (fromNode === toNode) {
31126       return "no_u_turn";
31127     }
31128     if ((angle2 < 23 || angle2 > 336) && fromOneWay && toOneWay) {
31129       return "no_u_turn";
31130     }
31131     if ((angle2 < 40 || angle2 > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) {
31132       return "no_u_turn";
31133     }
31134     if (angle2 < 158) {
31135       return "no_right_turn";
31136     }
31137     if (angle2 > 202) {
31138       return "no_left_turn";
31139     }
31140     return "no_straight_on";
31141   }
31142
31143   // modules/actions/merge_polygon.js
31144   function actionMergePolygon(ids, newRelationId) {
31145     function groupEntities(graph) {
31146       var entities = ids.map(function(id2) {
31147         return graph.entity(id2);
31148       });
31149       var geometryGroups = utilArrayGroupBy(entities, function(entity) {
31150         if (entity.type === "way" && entity.isClosed()) {
31151           return "closedWay";
31152         } else if (entity.type === "relation" && entity.isMultipolygon()) {
31153           return "multipolygon";
31154         } else {
31155           return "other";
31156         }
31157       });
31158       return Object.assign(
31159         { closedWay: [], multipolygon: [], other: [] },
31160         geometryGroups
31161       );
31162     }
31163     var action = function(graph) {
31164       var entities = groupEntities(graph);
31165       var polygons = entities.multipolygon.reduce(function(polygons2, m) {
31166         return polygons2.concat(osmJoinWays(m.members, graph));
31167       }, []).concat(entities.closedWay.map(function(d) {
31168         var member = [{ id: d.id }];
31169         member.nodes = graph.childNodes(d);
31170         return member;
31171       }));
31172       var contained = polygons.map(function(w, i2) {
31173         return polygons.map(function(d, n2) {
31174           if (i2 === n2)
31175             return null;
31176           return geoPolygonContainsPolygon(
31177             d.nodes.map(function(n3) {
31178               return n3.loc;
31179             }),
31180             w.nodes.map(function(n3) {
31181               return n3.loc;
31182             })
31183           );
31184         });
31185       });
31186       var members = [];
31187       var outer = true;
31188       while (polygons.length) {
31189         extractUncontained(polygons);
31190         polygons = polygons.filter(isContained);
31191         contained = contained.filter(isContained).map(filterContained);
31192       }
31193       function isContained(d, i2) {
31194         return contained[i2].some(function(val) {
31195           return val;
31196         });
31197       }
31198       function filterContained(d) {
31199         return d.filter(isContained);
31200       }
31201       function extractUncontained(polygons2) {
31202         polygons2.forEach(function(d, i2) {
31203           if (!isContained(d, i2)) {
31204             d.forEach(function(member) {
31205               members.push({
31206                 type: "way",
31207                 id: member.id,
31208                 role: outer ? "outer" : "inner"
31209               });
31210             });
31211           }
31212         });
31213         outer = !outer;
31214       }
31215       var relation;
31216       if (entities.multipolygon.length > 0) {
31217         var oldestID = utilOldestID(entities.multipolygon.map((entity) => entity.id));
31218         relation = entities.multipolygon.find((entity) => entity.id === oldestID);
31219       } else {
31220         relation = osmRelation({ id: newRelationId, tags: { type: "multipolygon" } });
31221       }
31222       entities.multipolygon.forEach(function(m) {
31223         if (m.id !== relation.id) {
31224           relation = relation.mergeTags(m.tags);
31225           graph = graph.remove(m);
31226         }
31227       });
31228       entities.closedWay.forEach(function(way) {
31229         function isThisOuter(m) {
31230           return m.id === way.id && m.role !== "inner";
31231         }
31232         if (members.some(isThisOuter)) {
31233           relation = relation.mergeTags(way.tags);
31234           graph = graph.replace(way.update({ tags: {} }));
31235         }
31236       });
31237       return graph.replace(relation.update({
31238         members,
31239         tags: utilObjectOmit(relation.tags, ["area"])
31240       }));
31241     };
31242     action.disabled = function(graph) {
31243       var entities = groupEntities(graph);
31244       if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) {
31245         return "not_eligible";
31246       }
31247       if (!entities.multipolygon.every(function(r) {
31248         return r.isComplete(graph);
31249       })) {
31250         return "incomplete_relation";
31251       }
31252       if (!entities.multipolygon.length) {
31253         var sharedMultipolygons = [];
31254         entities.closedWay.forEach(function(way, i2) {
31255           if (i2 === 0) {
31256             sharedMultipolygons = graph.parentMultipolygons(way);
31257           } else {
31258             sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way));
31259           }
31260         });
31261         sharedMultipolygons = sharedMultipolygons.filter(function(relation) {
31262           return relation.members.length === entities.closedWay.length;
31263         });
31264         if (sharedMultipolygons.length) {
31265           return "not_eligible";
31266         }
31267       } else if (entities.closedWay.some(function(way) {
31268         return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length;
31269       })) {
31270         return "not_eligible";
31271       }
31272     };
31273     return action;
31274   }
31275
31276   // modules/actions/merge_remote_changes.js
31277   var import_fast_deep_equal = __toESM(require_fast_deep_equal());
31278
31279   // node_modules/node-diff3/index.mjs
31280   function LCS(buffer1, buffer2) {
31281     let equivalenceClasses = {};
31282     for (let j2 = 0; j2 < buffer2.length; j2++) {
31283       const item = buffer2[j2];
31284       if (equivalenceClasses[item]) {
31285         equivalenceClasses[item].push(j2);
31286       } else {
31287         equivalenceClasses[item] = [j2];
31288       }
31289     }
31290     const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null };
31291     let candidates = [NULLRESULT];
31292     for (let i2 = 0; i2 < buffer1.length; i2++) {
31293       const item = buffer1[i2];
31294       const buffer2indices = equivalenceClasses[item] || [];
31295       let r = 0;
31296       let c = candidates[0];
31297       for (let jx = 0; jx < buffer2indices.length; jx++) {
31298         const j2 = buffer2indices[jx];
31299         let s;
31300         for (s = r; s < candidates.length; s++) {
31301           if (candidates[s].buffer2index < j2 && (s === candidates.length - 1 || candidates[s + 1].buffer2index > j2)) {
31302             break;
31303           }
31304         }
31305         if (s < candidates.length) {
31306           const newCandidate = { buffer1index: i2, buffer2index: j2, chain: candidates[s] };
31307           if (r === candidates.length) {
31308             candidates.push(c);
31309           } else {
31310             candidates[r] = c;
31311           }
31312           r = s + 1;
31313           c = newCandidate;
31314           if (r === candidates.length) {
31315             break;
31316           }
31317         }
31318       }
31319       candidates[r] = c;
31320     }
31321     return candidates[candidates.length - 1];
31322   }
31323   function diffIndices(buffer1, buffer2) {
31324     const lcs = LCS(buffer1, buffer2);
31325     let result = [];
31326     let tail1 = buffer1.length;
31327     let tail2 = buffer2.length;
31328     for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {
31329       const mismatchLength1 = tail1 - candidate.buffer1index - 1;
31330       const mismatchLength2 = tail2 - candidate.buffer2index - 1;
31331       tail1 = candidate.buffer1index;
31332       tail2 = candidate.buffer2index;
31333       if (mismatchLength1 || mismatchLength2) {
31334         result.push({
31335           buffer1: [tail1 + 1, mismatchLength1],
31336           buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),
31337           buffer2: [tail2 + 1, mismatchLength2],
31338           buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)
31339         });
31340       }
31341     }
31342     result.reverse();
31343     return result;
31344   }
31345   function diff3MergeRegions(a, o, b) {
31346     let hunks = [];
31347     function addHunk(h, ab) {
31348       hunks.push({
31349         ab,
31350         oStart: h.buffer1[0],
31351         oLength: h.buffer1[1],
31352         // length of o to remove
31353         abStart: h.buffer2[0],
31354         abLength: h.buffer2[1]
31355         // length of a/b to insert
31356         // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1])
31357       });
31358     }
31359     diffIndices(o, a).forEach((item) => addHunk(item, "a"));
31360     diffIndices(o, b).forEach((item) => addHunk(item, "b"));
31361     hunks.sort((x, y) => x.oStart - y.oStart);
31362     let results = [];
31363     let currOffset = 0;
31364     function advanceTo(endOffset) {
31365       if (endOffset > currOffset) {
31366         results.push({
31367           stable: true,
31368           buffer: "o",
31369           bufferStart: currOffset,
31370           bufferLength: endOffset - currOffset,
31371           bufferContent: o.slice(currOffset, endOffset)
31372         });
31373         currOffset = endOffset;
31374       }
31375     }
31376     while (hunks.length) {
31377       let hunk = hunks.shift();
31378       let regionStart = hunk.oStart;
31379       let regionEnd = hunk.oStart + hunk.oLength;
31380       let regionHunks = [hunk];
31381       advanceTo(regionStart);
31382       while (hunks.length) {
31383         const nextHunk = hunks[0];
31384         const nextHunkStart = nextHunk.oStart;
31385         if (nextHunkStart > regionEnd)
31386           break;
31387         regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
31388         regionHunks.push(hunks.shift());
31389       }
31390       if (regionHunks.length === 1) {
31391         if (hunk.abLength > 0) {
31392           const buffer = hunk.ab === "a" ? a : b;
31393           results.push({
31394             stable: true,
31395             buffer: hunk.ab,
31396             bufferStart: hunk.abStart,
31397             bufferLength: hunk.abLength,
31398             bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)
31399           });
31400         }
31401       } else {
31402         let bounds = {
31403           a: [a.length, -1, o.length, -1],
31404           b: [b.length, -1, o.length, -1]
31405         };
31406         while (regionHunks.length) {
31407           hunk = regionHunks.shift();
31408           const oStart = hunk.oStart;
31409           const oEnd = oStart + hunk.oLength;
31410           const abStart = hunk.abStart;
31411           const abEnd = abStart + hunk.abLength;
31412           let b2 = bounds[hunk.ab];
31413           b2[0] = Math.min(abStart, b2[0]);
31414           b2[1] = Math.max(abEnd, b2[1]);
31415           b2[2] = Math.min(oStart, b2[2]);
31416           b2[3] = Math.max(oEnd, b2[3]);
31417         }
31418         const aStart = bounds.a[0] + (regionStart - bounds.a[2]);
31419         const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
31420         const bStart = bounds.b[0] + (regionStart - bounds.b[2]);
31421         const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
31422         let result = {
31423           stable: false,
31424           aStart,
31425           aLength: aEnd - aStart,
31426           aContent: a.slice(aStart, aEnd),
31427           oStart: regionStart,
31428           oLength: regionEnd - regionStart,
31429           oContent: o.slice(regionStart, regionEnd),
31430           bStart,
31431           bLength: bEnd - bStart,
31432           bContent: b.slice(bStart, bEnd)
31433         };
31434         results.push(result);
31435       }
31436       currOffset = regionEnd;
31437     }
31438     advanceTo(o.length);
31439     return results;
31440   }
31441   function diff3Merge(a, o, b, options2) {
31442     let defaults2 = {
31443       excludeFalseConflicts: true,
31444       stringSeparator: /\s+/
31445     };
31446     options2 = Object.assign(defaults2, options2);
31447     if (typeof a === "string")
31448       a = a.split(options2.stringSeparator);
31449     if (typeof o === "string")
31450       o = o.split(options2.stringSeparator);
31451     if (typeof b === "string")
31452       b = b.split(options2.stringSeparator);
31453     let results = [];
31454     const regions = diff3MergeRegions(a, o, b);
31455     let okBuffer = [];
31456     function flushOk() {
31457       if (okBuffer.length) {
31458         results.push({ ok: okBuffer });
31459       }
31460       okBuffer = [];
31461     }
31462     function isFalseConflict(a2, b2) {
31463       if (a2.length !== b2.length)
31464         return false;
31465       for (let i2 = 0; i2 < a2.length; i2++) {
31466         if (a2[i2] !== b2[i2])
31467           return false;
31468       }
31469       return true;
31470     }
31471     regions.forEach((region) => {
31472       if (region.stable) {
31473         okBuffer.push(...region.bufferContent);
31474       } else {
31475         if (options2.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
31476           okBuffer.push(...region.aContent);
31477         } else {
31478           flushOk();
31479           results.push({
31480             conflict: {
31481               a: region.aContent,
31482               aIndex: region.aStart,
31483               o: region.oContent,
31484               oIndex: region.oStart,
31485               b: region.bContent,
31486               bIndex: region.bStart
31487             }
31488           });
31489         }
31490       }
31491     });
31492     flushOk();
31493     return results;
31494   }
31495
31496   // modules/actions/merge_remote_changes.js
31497   var import_lodash = __toESM(require_lodash());
31498   function actionMergeRemoteChanges(id2, localGraph, remoteGraph, discardTags, formatUser) {
31499     discardTags = discardTags || {};
31500     var _option = "safe";
31501     var _conflicts = [];
31502     function user(d) {
31503       return typeof formatUser === "function" ? formatUser(d) : (0, import_lodash.escape)(d);
31504     }
31505     function mergeLocation(remote, target) {
31506       function pointEqual(a, b) {
31507         var epsilon3 = 1e-6;
31508         return Math.abs(a[0] - b[0]) < epsilon3 && Math.abs(a[1] - b[1]) < epsilon3;
31509       }
31510       if (_option === "force_local" || pointEqual(target.loc, remote.loc)) {
31511         return target;
31512       }
31513       if (_option === "force_remote") {
31514         return target.update({ loc: remote.loc });
31515       }
31516       _conflicts.push(_t.html("merge_remote_changes.conflict.location", { user: { html: user(remote.user) } }));
31517       return target;
31518     }
31519     function mergeNodes(base, remote, target) {
31520       if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.nodes, remote.nodes)) {
31521         return target;
31522       }
31523       if (_option === "force_remote") {
31524         return target.update({ nodes: remote.nodes });
31525       }
31526       var ccount = _conflicts.length;
31527       var o = base.nodes || [];
31528       var a = target.nodes || [];
31529       var b = remote.nodes || [];
31530       var nodes = [];
31531       var hunks = diff3Merge(a, o, b, { excludeFalseConflicts: true });
31532       for (var i2 = 0; i2 < hunks.length; i2++) {
31533         var hunk = hunks[i2];
31534         if (hunk.ok) {
31535           nodes.push.apply(nodes, hunk.ok);
31536         } else {
31537           var c = hunk.conflict;
31538           if ((0, import_fast_deep_equal.default)(c.o, c.a)) {
31539             nodes.push.apply(nodes, c.b);
31540           } else if ((0, import_fast_deep_equal.default)(c.o, c.b)) {
31541             nodes.push.apply(nodes, c.a);
31542           } else {
31543             _conflicts.push(_t.html("merge_remote_changes.conflict.nodelist", { user: { html: user(remote.user) } }));
31544             break;
31545           }
31546         }
31547       }
31548       return _conflicts.length === ccount ? target.update({ nodes }) : target;
31549     }
31550     function mergeChildren(targetWay, children2, updates, graph) {
31551       function isUsed(node2, targetWay2) {
31552         var hasInterestingParent = graph.parentWays(node2).some(function(way) {
31553           return way.id !== targetWay2.id;
31554         });
31555         return node2.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node2).length > 0;
31556       }
31557       var ccount = _conflicts.length;
31558       for (var i2 = 0; i2 < children2.length; i2++) {
31559         var id3 = children2[i2];
31560         var node = graph.hasEntity(id3);
31561         if (targetWay.nodes.indexOf(id3) === -1) {
31562           if (node && !isUsed(node, targetWay)) {
31563             updates.removeIds.push(id3);
31564           }
31565           continue;
31566         }
31567         var local = localGraph.hasEntity(id3);
31568         var remote = remoteGraph.hasEntity(id3);
31569         var target;
31570         if (_option === "force_remote" && remote && remote.visible) {
31571           updates.replacements.push(remote);
31572         } else if (_option === "force_local" && local) {
31573           target = osmEntity(local);
31574           if (remote) {
31575             target = target.update({ version: remote.version });
31576           }
31577           updates.replacements.push(target);
31578         } else if (_option === "safe" && local && remote && local.version !== remote.version) {
31579           target = osmEntity(local, { version: remote.version });
31580           if (remote.visible) {
31581             target = mergeLocation(remote, target);
31582           } else {
31583             _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } }));
31584           }
31585           if (_conflicts.length !== ccount)
31586             break;
31587           updates.replacements.push(target);
31588         }
31589       }
31590       return targetWay;
31591     }
31592     function updateChildren(updates, graph) {
31593       for (var i2 = 0; i2 < updates.replacements.length; i2++) {
31594         graph = graph.replace(updates.replacements[i2]);
31595       }
31596       if (updates.removeIds.length) {
31597         graph = actionDeleteMultiple(updates.removeIds)(graph);
31598       }
31599       return graph;
31600     }
31601     function mergeMembers(remote, target) {
31602       if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.members, remote.members)) {
31603         return target;
31604       }
31605       if (_option === "force_remote") {
31606         return target.update({ members: remote.members });
31607       }
31608       _conflicts.push(_t.html("merge_remote_changes.conflict.memberlist", { user: { html: user(remote.user) } }));
31609       return target;
31610     }
31611     function mergeTags(base, remote, target) {
31612       if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.tags, remote.tags)) {
31613         return target;
31614       }
31615       if (_option === "force_remote") {
31616         return target.update({ tags: remote.tags });
31617       }
31618       var ccount = _conflicts.length;
31619       var o = base.tags || {};
31620       var a = target.tags || {};
31621       var b = remote.tags || {};
31622       var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)).filter(function(k2) {
31623         return !discardTags[k2];
31624       });
31625       var tags = Object.assign({}, a);
31626       var changed = false;
31627       for (var i2 = 0; i2 < keys.length; i2++) {
31628         var k = keys[i2];
31629         if (o[k] !== b[k] && a[k] !== b[k]) {
31630           if (o[k] !== a[k]) {
31631             _conflicts.push(_t.html(
31632               "merge_remote_changes.conflict.tags",
31633               { tag: k, local: a[k], remote: b[k], user: { html: user(remote.user) } }
31634             ));
31635           } else {
31636             if (b.hasOwnProperty(k)) {
31637               tags[k] = b[k];
31638             } else {
31639               delete tags[k];
31640             }
31641             changed = true;
31642           }
31643         }
31644       }
31645       return changed && _conflicts.length === ccount ? target.update({ tags }) : target;
31646     }
31647     var action = function(graph) {
31648       var updates = { replacements: [], removeIds: [] };
31649       var base = graph.base().entities[id2];
31650       var local = localGraph.entity(id2);
31651       var remote = remoteGraph.entity(id2);
31652       var target = osmEntity(local, { version: remote.version });
31653       if (!remote.visible) {
31654         if (_option === "force_remote") {
31655           return actionDeleteMultiple([id2])(graph);
31656         } else if (_option === "force_local") {
31657           if (target.type === "way") {
31658             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
31659             graph = updateChildren(updates, graph);
31660           }
31661           return graph.replace(target);
31662         } else {
31663           _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } }));
31664           return graph;
31665         }
31666       }
31667       if (target.type === "node") {
31668         target = mergeLocation(remote, target);
31669       } else if (target.type === "way") {
31670         graph.rebase(remoteGraph.childNodes(remote), [graph], false);
31671         target = mergeNodes(base, remote, target);
31672         target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
31673       } else if (target.type === "relation") {
31674         target = mergeMembers(remote, target);
31675       }
31676       target = mergeTags(base, remote, target);
31677       if (!_conflicts.length) {
31678         graph = updateChildren(updates, graph).replace(target);
31679       }
31680       return graph;
31681     };
31682     action.withOption = function(opt) {
31683       _option = opt;
31684       return action;
31685     };
31686     action.conflicts = function() {
31687       return _conflicts;
31688     };
31689     return action;
31690   }
31691
31692   // modules/actions/move.js
31693   function actionMove(moveIDs, tryDelta, projection2, cache) {
31694     var _delta = tryDelta;
31695     function setupCache(graph) {
31696       function canMove(nodeID) {
31697         if (moveIDs.indexOf(nodeID) !== -1)
31698           return true;
31699         var parents = graph.parentWays(graph.entity(nodeID));
31700         if (parents.length < 3)
31701           return true;
31702         var parentsMoving = parents.every(function(way) {
31703           return cache.moving[way.id];
31704         });
31705         if (!parentsMoving)
31706           delete cache.moving[nodeID];
31707         return parentsMoving;
31708       }
31709       function cacheEntities(ids) {
31710         for (var i2 = 0; i2 < ids.length; i2++) {
31711           var id2 = ids[i2];
31712           if (cache.moving[id2])
31713             continue;
31714           cache.moving[id2] = true;
31715           var entity = graph.hasEntity(id2);
31716           if (!entity)
31717             continue;
31718           if (entity.type === "node") {
31719             cache.nodes.push(id2);
31720             cache.startLoc[id2] = entity.loc;
31721           } else if (entity.type === "way") {
31722             cache.ways.push(id2);
31723             cacheEntities(entity.nodes);
31724           } else {
31725             cacheEntities(entity.members.map(function(member) {
31726               return member.id;
31727             }));
31728           }
31729         }
31730       }
31731       function cacheIntersections(ids) {
31732         function isEndpoint(way2, id3) {
31733           return !way2.isClosed() && !!way2.affix(id3);
31734         }
31735         for (var i2 = 0; i2 < ids.length; i2++) {
31736           var id2 = ids[i2];
31737           var childNodes = graph.childNodes(graph.entity(id2));
31738           for (var j2 = 0; j2 < childNodes.length; j2++) {
31739             var node = childNodes[j2];
31740             var parents = graph.parentWays(node);
31741             if (parents.length !== 2)
31742               continue;
31743             var moved = graph.entity(id2);
31744             var unmoved = null;
31745             for (var k = 0; k < parents.length; k++) {
31746               var way = parents[k];
31747               if (!cache.moving[way.id]) {
31748                 unmoved = way;
31749                 break;
31750               }
31751             }
31752             if (!unmoved)
31753               continue;
31754             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2)
31755               continue;
31756             if (moved.isArea() || unmoved.isArea())
31757               continue;
31758             cache.intersections.push({
31759               nodeId: node.id,
31760               movedId: moved.id,
31761               unmovedId: unmoved.id,
31762               movedIsEP: isEndpoint(moved, node.id),
31763               unmovedIsEP: isEndpoint(unmoved, node.id)
31764             });
31765           }
31766         }
31767       }
31768       if (!cache) {
31769         cache = {};
31770       }
31771       if (!cache.ok) {
31772         cache.moving = {};
31773         cache.intersections = [];
31774         cache.replacedVertex = {};
31775         cache.startLoc = {};
31776         cache.nodes = [];
31777         cache.ways = [];
31778         cacheEntities(moveIDs);
31779         cacheIntersections(cache.ways);
31780         cache.nodes = cache.nodes.filter(canMove);
31781         cache.ok = true;
31782       }
31783     }
31784     function replaceMovedVertex(nodeId, wayId, graph, delta) {
31785       var way = graph.entity(wayId);
31786       var moved = graph.entity(nodeId);
31787       var movedIndex = way.nodes.indexOf(nodeId);
31788       var len, prevIndex, nextIndex;
31789       if (way.isClosed()) {
31790         len = way.nodes.length - 1;
31791         prevIndex = (movedIndex + len - 1) % len;
31792         nextIndex = (movedIndex + len + 1) % len;
31793       } else {
31794         len = way.nodes.length;
31795         prevIndex = movedIndex - 1;
31796         nextIndex = movedIndex + 1;
31797       }
31798       var prev = graph.hasEntity(way.nodes[prevIndex]);
31799       var next = graph.hasEntity(way.nodes[nextIndex]);
31800       if (!prev || !next)
31801         return graph;
31802       var key = wayId + "_" + nodeId;
31803       var orig = cache.replacedVertex[key];
31804       if (!orig) {
31805         orig = osmNode();
31806         cache.replacedVertex[key] = orig;
31807         cache.startLoc[orig.id] = cache.startLoc[nodeId];
31808       }
31809       var start2, end;
31810       if (delta) {
31811         start2 = projection2(cache.startLoc[nodeId]);
31812         end = projection2.invert(geoVecAdd(start2, delta));
31813       } else {
31814         end = cache.startLoc[nodeId];
31815       }
31816       orig = orig.move(end);
31817       var angle2 = Math.abs(geoAngle(orig, prev, projection2) - geoAngle(orig, next, projection2)) * 180 / Math.PI;
31818       if (angle2 > 175 && angle2 < 185)
31819         return graph;
31820       var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection2);
31821       var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection2);
31822       var d1 = geoPathLength(p1);
31823       var d2 = geoPathLength(p2);
31824       var insertAt = d1 <= d2 ? movedIndex : nextIndex;
31825       if (way.isClosed() && insertAt === 0)
31826         insertAt = len;
31827       way = way.addNode(orig.id, insertAt);
31828       return graph.replace(orig).replace(way);
31829     }
31830     function removeDuplicateVertices(wayId, graph) {
31831       var way = graph.entity(wayId);
31832       var epsilon3 = 1e-6;
31833       var prev, curr;
31834       function isInteresting(node, graph2) {
31835         return graph2.parentWays(node).length > 1 || graph2.parentRelations(node).length || node.hasInterestingTags();
31836       }
31837       for (var i2 = 0; i2 < way.nodes.length; i2++) {
31838         curr = graph.entity(way.nodes[i2]);
31839         if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon3)) {
31840           if (!isInteresting(prev, graph)) {
31841             way = way.removeNode(prev.id);
31842             graph = graph.replace(way).remove(prev);
31843           } else if (!isInteresting(curr, graph)) {
31844             way = way.removeNode(curr.id);
31845             graph = graph.replace(way).remove(curr);
31846           }
31847         }
31848         prev = curr;
31849       }
31850       return graph;
31851     }
31852     function unZorroIntersection(intersection, graph) {
31853       var vertex = graph.entity(intersection.nodeId);
31854       var way1 = graph.entity(intersection.movedId);
31855       var way2 = graph.entity(intersection.unmovedId);
31856       var isEP1 = intersection.movedIsEP;
31857       var isEP2 = intersection.unmovedIsEP;
31858       if (isEP1 && isEP2)
31859         return graph;
31860       var nodes1 = graph.childNodes(way1).filter(function(n2) {
31861         return n2 !== vertex;
31862       });
31863       var nodes2 = graph.childNodes(way2).filter(function(n2) {
31864         return n2 !== vertex;
31865       });
31866       if (way1.isClosed() && way1.first() === vertex.id)
31867         nodes1.push(nodes1[0]);
31868       if (way2.isClosed() && way2.first() === vertex.id)
31869         nodes2.push(nodes2[0]);
31870       var edge1 = !isEP1 && geoChooseEdge(nodes1, projection2(vertex.loc), projection2);
31871       var edge2 = !isEP2 && geoChooseEdge(nodes2, projection2(vertex.loc), projection2);
31872       var loc;
31873       if (!isEP1 && !isEP2) {
31874         var epsilon3 = 1e-6, maxIter = 10;
31875         for (var i2 = 0; i2 < maxIter; i2++) {
31876           loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
31877           edge1 = geoChooseEdge(nodes1, projection2(loc), projection2);
31878           edge2 = geoChooseEdge(nodes2, projection2(loc), projection2);
31879           if (Math.abs(edge1.distance - edge2.distance) < epsilon3)
31880             break;
31881         }
31882       } else if (!isEP1) {
31883         loc = edge1.loc;
31884       } else {
31885         loc = edge2.loc;
31886       }
31887       graph = graph.replace(vertex.move(loc));
31888       if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
31889         way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
31890         graph = graph.replace(way1);
31891       }
31892       if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
31893         way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
31894         graph = graph.replace(way2);
31895       }
31896       return graph;
31897     }
31898     function cleanupIntersections(graph) {
31899       for (var i2 = 0; i2 < cache.intersections.length; i2++) {
31900         var obj = cache.intersections[i2];
31901         graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
31902         graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
31903         graph = unZorroIntersection(obj, graph);
31904         graph = removeDuplicateVertices(obj.movedId, graph);
31905         graph = removeDuplicateVertices(obj.unmovedId, graph);
31906       }
31907       return graph;
31908     }
31909     function limitDelta(graph) {
31910       function moveNode(loc) {
31911         return geoVecAdd(projection2(loc), _delta);
31912       }
31913       for (var i2 = 0; i2 < cache.intersections.length; i2++) {
31914         var obj = cache.intersections[i2];
31915         if (obj.movedIsEP && obj.unmovedIsEP)
31916           continue;
31917         if (!obj.movedIsEP)
31918           continue;
31919         var node = graph.entity(obj.nodeId);
31920         var start2 = projection2(node.loc);
31921         var end = geoVecAdd(start2, _delta);
31922         var movedNodes = graph.childNodes(graph.entity(obj.movedId));
31923         var movedPath = movedNodes.map(function(n2) {
31924           return moveNode(n2.loc);
31925         });
31926         var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
31927         var unmovedPath = unmovedNodes.map(function(n2) {
31928           return projection2(n2.loc);
31929         });
31930         var hits = geoPathIntersections(movedPath, unmovedPath);
31931         for (var j2 = 0; i2 < hits.length; i2++) {
31932           if (geoVecEqual(hits[j2], end))
31933             continue;
31934           var edge = geoChooseEdge(unmovedNodes, end, projection2);
31935           _delta = geoVecSubtract(projection2(edge.loc), start2);
31936         }
31937       }
31938     }
31939     var action = function(graph) {
31940       if (_delta[0] === 0 && _delta[1] === 0)
31941         return graph;
31942       setupCache(graph);
31943       if (cache.intersections.length) {
31944         limitDelta(graph);
31945       }
31946       for (var i2 = 0; i2 < cache.nodes.length; i2++) {
31947         var node = graph.entity(cache.nodes[i2]);
31948         var start2 = projection2(node.loc);
31949         var end = geoVecAdd(start2, _delta);
31950         graph = graph.replace(node.move(projection2.invert(end)));
31951       }
31952       if (cache.intersections.length) {
31953         graph = cleanupIntersections(graph);
31954       }
31955       return graph;
31956     };
31957     action.delta = function() {
31958       return _delta;
31959     };
31960     return action;
31961   }
31962
31963   // modules/actions/move_member.js
31964   function actionMoveMember(relationId, fromIndex, toIndex) {
31965     return function(graph) {
31966       return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
31967     };
31968   }
31969
31970   // modules/actions/move_node.js
31971   function actionMoveNode(nodeID, toLoc) {
31972     var action = function(graph, t) {
31973       if (t === null || !isFinite(t))
31974         t = 1;
31975       t = Math.min(Math.max(+t, 0), 1);
31976       var node = graph.entity(nodeID);
31977       return graph.replace(
31978         node.move(geoVecInterp(node.loc, toLoc, t))
31979       );
31980     };
31981     action.transitionable = true;
31982     return action;
31983   }
31984
31985   // modules/actions/noop.js
31986   function actionNoop() {
31987     return function(graph) {
31988       return graph;
31989     };
31990   }
31991
31992   // modules/actions/orthogonalize.js
31993   function actionOrthogonalize(wayID, projection2, vertexID, degThresh, ep) {
31994     var epsilon3 = ep || 1e-4;
31995     var threshold = degThresh || 13;
31996     var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
31997     var upperThreshold = Math.cos(threshold * Math.PI / 180);
31998     var action = function(graph, t) {
31999       if (t === null || !isFinite(t))
32000         t = 1;
32001       t = Math.min(Math.max(+t, 0), 1);
32002       var way = graph.entity(wayID);
32003       way = way.removeNode("");
32004       if (way.tags.nonsquare) {
32005         var tags = Object.assign({}, way.tags);
32006         delete tags.nonsquare;
32007         way = way.update({ tags });
32008       }
32009       graph = graph.replace(way);
32010       var isClosed = way.isClosed();
32011       var nodes = graph.childNodes(way).slice();
32012       if (isClosed)
32013         nodes.pop();
32014       if (vertexID !== void 0) {
32015         nodes = nodeSubset(nodes, vertexID, isClosed);
32016         if (nodes.length !== 3)
32017           return graph;
32018       }
32019       var nodeCount = {};
32020       var points = [];
32021       var corner = { i: 0, dotp: 1 };
32022       var node, point2, loc, score, motions, i2, j2;
32023       for (i2 = 0; i2 < nodes.length; i2++) {
32024         node = nodes[i2];
32025         nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
32026         points.push({ id: node.id, coord: projection2(node.loc) });
32027       }
32028       if (points.length === 3) {
32029         for (i2 = 0; i2 < 1e3; i2++) {
32030           motions = points.map(calcMotion);
32031           points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
32032           score = corner.dotp;
32033           if (score < epsilon3) {
32034             break;
32035           }
32036         }
32037         node = graph.entity(nodes[corner.i].id);
32038         loc = projection2.invert(points[corner.i].coord);
32039         graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
32040       } else {
32041         var straights = [];
32042         var simplified = [];
32043         for (i2 = 0; i2 < points.length; i2++) {
32044           point2 = points[i2];
32045           var dotp = 0;
32046           if (isClosed || i2 > 0 && i2 < points.length - 1) {
32047             var a = points[(i2 - 1 + points.length) % points.length];
32048             var b = points[(i2 + 1) % points.length];
32049             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point2.coord));
32050           }
32051           if (dotp > upperThreshold) {
32052             straights.push(point2);
32053           } else {
32054             simplified.push(point2);
32055           }
32056         }
32057         var bestPoints = clonePoints(simplified);
32058         var originalPoints = clonePoints(simplified);
32059         score = Infinity;
32060         for (i2 = 0; i2 < 1e3; i2++) {
32061           motions = simplified.map(calcMotion);
32062           for (j2 = 0; j2 < motions.length; j2++) {
32063             simplified[j2].coord = geoVecAdd(simplified[j2].coord, motions[j2]);
32064           }
32065           var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon3, threshold);
32066           if (newScore < score) {
32067             bestPoints = clonePoints(simplified);
32068             score = newScore;
32069           }
32070           if (score < epsilon3) {
32071             break;
32072           }
32073         }
32074         var bestCoords = bestPoints.map(function(p) {
32075           return p.coord;
32076         });
32077         if (isClosed)
32078           bestCoords.push(bestCoords[0]);
32079         for (i2 = 0; i2 < bestPoints.length; i2++) {
32080           point2 = bestPoints[i2];
32081           if (!geoVecEqual(originalPoints[i2].coord, point2.coord)) {
32082             node = graph.entity(point2.id);
32083             loc = projection2.invert(point2.coord);
32084             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
32085           }
32086         }
32087         for (i2 = 0; i2 < straights.length; i2++) {
32088           point2 = straights[i2];
32089           if (nodeCount[point2.id] > 1)
32090             continue;
32091           node = graph.entity(point2.id);
32092           if (t === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) {
32093             graph = actionDeleteNode(node.id)(graph);
32094           } else {
32095             var choice = geoVecProject(point2.coord, bestCoords);
32096             if (choice) {
32097               loc = projection2.invert(choice.target);
32098               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
32099             }
32100           }
32101         }
32102       }
32103       return graph;
32104       function clonePoints(array2) {
32105         return array2.map(function(p) {
32106           return { id: p.id, coord: [p.coord[0], p.coord[1]] };
32107         });
32108       }
32109       function calcMotion(point3, i3, array2) {
32110         if (!isClosed && (i3 === 0 || i3 === array2.length - 1))
32111           return [0, 0];
32112         if (nodeCount[array2[i3].id] > 1)
32113           return [0, 0];
32114         var a2 = array2[(i3 - 1 + array2.length) % array2.length].coord;
32115         var origin = point3.coord;
32116         var b2 = array2[(i3 + 1) % array2.length].coord;
32117         var p = geoVecSubtract(a2, origin);
32118         var q = geoVecSubtract(b2, origin);
32119         var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
32120         p = geoVecNormalize(p);
32121         q = geoVecNormalize(q);
32122         var dotp2 = p[0] * q[0] + p[1] * q[1];
32123         var val = Math.abs(dotp2);
32124         if (val < lowerThreshold) {
32125           corner.i = i3;
32126           corner.dotp = val;
32127           var vec = geoVecNormalize(geoVecAdd(p, q));
32128           return geoVecScale(vec, 0.1 * dotp2 * scale);
32129         }
32130         return [0, 0];
32131       }
32132     };
32133     function nodeSubset(nodes, vertexID2, isClosed) {
32134       var first = isClosed ? 0 : 1;
32135       var last = isClosed ? nodes.length : nodes.length - 1;
32136       for (var i2 = first; i2 < last; i2++) {
32137         if (nodes[i2].id === vertexID2) {
32138           return [
32139             nodes[(i2 - 1 + nodes.length) % nodes.length],
32140             nodes[i2],
32141             nodes[(i2 + 1) % nodes.length]
32142           ];
32143         }
32144       }
32145       return [];
32146     }
32147     action.disabled = function(graph) {
32148       var way = graph.entity(wayID);
32149       way = way.removeNode("");
32150       graph = graph.replace(way);
32151       var isClosed = way.isClosed();
32152       var nodes = graph.childNodes(way).slice();
32153       if (isClosed)
32154         nodes.pop();
32155       var allowStraightAngles = false;
32156       if (vertexID !== void 0) {
32157         allowStraightAngles = true;
32158         nodes = nodeSubset(nodes, vertexID, isClosed);
32159         if (nodes.length !== 3)
32160           return "end_vertex";
32161       }
32162       var coords = nodes.map(function(n2) {
32163         return projection2(n2.loc);
32164       });
32165       var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles);
32166       if (score === null) {
32167         return "not_squarish";
32168       } else if (score === 0) {
32169         return "square_enough";
32170       } else {
32171         return false;
32172       }
32173     };
32174     action.transitionable = true;
32175     return action;
32176   }
32177
32178   // modules/actions/restrict_turn.js
32179   function actionRestrictTurn(turn, restrictionType, restrictionID) {
32180     return function(graph) {
32181       var fromWay = graph.entity(turn.from.way);
32182       var toWay = graph.entity(turn.to.way);
32183       var viaNode = turn.via.node && graph.entity(turn.via.node);
32184       var viaWays = turn.via.ways && turn.via.ways.map(function(id2) {
32185         return graph.entity(id2);
32186       });
32187       var members = [];
32188       members.push({ id: fromWay.id, type: "way", role: "from" });
32189       if (viaNode) {
32190         members.push({ id: viaNode.id, type: "node", role: "via" });
32191       } else if (viaWays) {
32192         viaWays.forEach(function(viaWay) {
32193           members.push({ id: viaWay.id, type: "way", role: "via" });
32194         });
32195       }
32196       members.push({ id: toWay.id, type: "way", role: "to" });
32197       return graph.replace(osmRelation({
32198         id: restrictionID,
32199         tags: {
32200           type: "restriction",
32201           restriction: restrictionType
32202         },
32203         members
32204       }));
32205     };
32206   }
32207
32208   // modules/actions/revert.js
32209   function actionRevert(id2) {
32210     var action = function(graph) {
32211       var entity = graph.hasEntity(id2), base = graph.base().entities[id2];
32212       if (entity && !base) {
32213         if (entity.type === "node") {
32214           graph.parentWays(entity).forEach(function(parent) {
32215             parent = parent.removeNode(id2);
32216             graph = graph.replace(parent);
32217             if (parent.isDegenerate()) {
32218               graph = actionDeleteWay(parent.id)(graph);
32219             }
32220           });
32221         }
32222         graph.parentRelations(entity).forEach(function(parent) {
32223           parent = parent.removeMembersWithID(id2);
32224           graph = graph.replace(parent);
32225           if (parent.isDegenerate()) {
32226             graph = actionDeleteRelation(parent.id)(graph);
32227           }
32228         });
32229       }
32230       return graph.revert(id2);
32231     };
32232     return action;
32233   }
32234
32235   // modules/actions/rotate.js
32236   function actionRotate(rotateIds, pivot, angle2, projection2) {
32237     var action = function(graph) {
32238       return graph.update(function(graph2) {
32239         utilGetAllNodes(rotateIds, graph2).forEach(function(node) {
32240           var point2 = geoRotate([projection2(node.loc)], angle2, pivot)[0];
32241           graph2 = graph2.replace(node.move(projection2.invert(point2)));
32242         });
32243       });
32244     };
32245     return action;
32246   }
32247
32248   // modules/actions/scale.js
32249   function actionScale(ids, pivotLoc, scaleFactor, projection2) {
32250     return function(graph) {
32251       return graph.update(function(graph2) {
32252         let point2, radial;
32253         utilGetAllNodes(ids, graph2).forEach(function(node) {
32254           point2 = projection2(node.loc);
32255           radial = [
32256             point2[0] - pivotLoc[0],
32257             point2[1] - pivotLoc[1]
32258           ];
32259           point2 = [
32260             pivotLoc[0] + scaleFactor * radial[0],
32261             pivotLoc[1] + scaleFactor * radial[1]
32262           ];
32263           graph2 = graph2.replace(node.move(projection2.invert(point2)));
32264         });
32265       });
32266     };
32267   }
32268
32269   // modules/actions/straighten_nodes.js
32270   function actionStraightenNodes(nodeIDs, projection2) {
32271     function positionAlongWay(a, o, b) {
32272       return geoVecDot(a, b, o) / geoVecDot(b, b, o);
32273     }
32274     function getEndpoints(points) {
32275       var ssr = geoGetSmallestSurroundingRectangle(points);
32276       var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
32277       var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
32278       var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
32279       var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
32280       var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
32281       if (isLong) {
32282         return [p1, q1];
32283       }
32284       return [p2, q2];
32285     }
32286     var action = function(graph, t) {
32287       if (t === null || !isFinite(t))
32288         t = 1;
32289       t = Math.min(Math.max(+t, 0), 1);
32290       var nodes = nodeIDs.map(function(id2) {
32291         return graph.entity(id2);
32292       });
32293       var points = nodes.map(function(n2) {
32294         return projection2(n2.loc);
32295       });
32296       var endpoints = getEndpoints(points);
32297       var startPoint = endpoints[0];
32298       var endPoint = endpoints[1];
32299       for (var i2 = 0; i2 < points.length; i2++) {
32300         var node = nodes[i2];
32301         var point2 = points[i2];
32302         var u = positionAlongWay(point2, startPoint, endPoint);
32303         var point22 = geoVecInterp(startPoint, endPoint, u);
32304         var loc2 = projection2.invert(point22);
32305         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
32306       }
32307       return graph;
32308     };
32309     action.disabled = function(graph) {
32310       var nodes = nodeIDs.map(function(id2) {
32311         return graph.entity(id2);
32312       });
32313       var points = nodes.map(function(n2) {
32314         return projection2(n2.loc);
32315       });
32316       var endpoints = getEndpoints(points);
32317       var startPoint = endpoints[0];
32318       var endPoint = endpoints[1];
32319       var maxDistance = 0;
32320       for (var i2 = 0; i2 < points.length; i2++) {
32321         var point2 = points[i2];
32322         var u = positionAlongWay(point2, startPoint, endPoint);
32323         var p = geoVecInterp(startPoint, endPoint, u);
32324         var dist = geoVecLength(p, point2);
32325         if (!isNaN(dist) && dist > maxDistance) {
32326           maxDistance = dist;
32327         }
32328       }
32329       if (maxDistance < 1e-4) {
32330         return "straight_enough";
32331       }
32332     };
32333     action.transitionable = true;
32334     return action;
32335   }
32336
32337   // modules/actions/straighten_way.js
32338   function actionStraightenWay(selectedIDs, projection2) {
32339     function positionAlongWay(a, o, b) {
32340       return geoVecDot(a, b, o) / geoVecDot(b, b, o);
32341     }
32342     function allNodes(graph) {
32343       var nodes = [];
32344       var startNodes = [];
32345       var endNodes = [];
32346       var remainingWays = [];
32347       var selectedWays = selectedIDs.filter(function(w) {
32348         return graph.entity(w).type === "way";
32349       });
32350       var selectedNodes = selectedIDs.filter(function(n2) {
32351         return graph.entity(n2).type === "node";
32352       });
32353       for (var i2 = 0; i2 < selectedWays.length; i2++) {
32354         var way = graph.entity(selectedWays[i2]);
32355         nodes = way.nodes.slice(0);
32356         remainingWays.push(nodes);
32357         startNodes.push(nodes[0]);
32358         endNodes.push(nodes[nodes.length - 1]);
32359       }
32360       startNodes = startNodes.filter(function(n2) {
32361         return startNodes.indexOf(n2) === startNodes.lastIndexOf(n2);
32362       });
32363       endNodes = endNodes.filter(function(n2) {
32364         return endNodes.indexOf(n2) === endNodes.lastIndexOf(n2);
32365       });
32366       var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0];
32367       var nextWay = [];
32368       nodes = [];
32369       var getNextWay = function(currNode2, remainingWays2) {
32370         return remainingWays2.filter(function(way2) {
32371           return way2[0] === currNode2 || way2[way2.length - 1] === currNode2;
32372         })[0];
32373       };
32374       while (remainingWays.length) {
32375         nextWay = getNextWay(currNode, remainingWays);
32376         remainingWays = utilArrayDifference(remainingWays, [nextWay]);
32377         if (nextWay[0] !== currNode) {
32378           nextWay.reverse();
32379         }
32380         nodes = nodes.concat(nextWay);
32381         currNode = nodes[nodes.length - 1];
32382       }
32383       if (selectedNodes.length === 2) {
32384         var startNodeIdx = nodes.indexOf(selectedNodes[0]);
32385         var endNodeIdx = nodes.indexOf(selectedNodes[1]);
32386         var sortedStartEnd = [startNodeIdx, endNodeIdx];
32387         sortedStartEnd.sort(function(a, b) {
32388           return a - b;
32389         });
32390         nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1);
32391       }
32392       return nodes.map(function(n2) {
32393         return graph.entity(n2);
32394       });
32395     }
32396     function shouldKeepNode(node, graph) {
32397       return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
32398     }
32399     var action = function(graph, t) {
32400       if (t === null || !isFinite(t))
32401         t = 1;
32402       t = Math.min(Math.max(+t, 0), 1);
32403       var nodes = allNodes(graph);
32404       var points = nodes.map(function(n2) {
32405         return projection2(n2.loc);
32406       });
32407       var startPoint = points[0];
32408       var endPoint = points[points.length - 1];
32409       var toDelete = [];
32410       var i2;
32411       for (i2 = 1; i2 < points.length - 1; i2++) {
32412         var node = nodes[i2];
32413         var point2 = points[i2];
32414         if (t < 1 || shouldKeepNode(node, graph)) {
32415           var u = positionAlongWay(point2, startPoint, endPoint);
32416           var p = geoVecInterp(startPoint, endPoint, u);
32417           var loc2 = projection2.invert(p);
32418           graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
32419         } else {
32420           if (toDelete.indexOf(node) === -1) {
32421             toDelete.push(node);
32422           }
32423         }
32424       }
32425       for (i2 = 0; i2 < toDelete.length; i2++) {
32426         graph = actionDeleteNode(toDelete[i2].id)(graph);
32427       }
32428       return graph;
32429     };
32430     action.disabled = function(graph) {
32431       var nodes = allNodes(graph);
32432       var points = nodes.map(function(n2) {
32433         return projection2(n2.loc);
32434       });
32435       var startPoint = points[0];
32436       var endPoint = points[points.length - 1];
32437       var threshold = 0.2 * geoVecLength(startPoint, endPoint);
32438       var i2;
32439       if (threshold === 0) {
32440         return "too_bendy";
32441       }
32442       var maxDistance = 0;
32443       for (i2 = 1; i2 < points.length - 1; i2++) {
32444         var point2 = points[i2];
32445         var u = positionAlongWay(point2, startPoint, endPoint);
32446         var p = geoVecInterp(startPoint, endPoint, u);
32447         var dist = geoVecLength(p, point2);
32448         if (isNaN(dist) || dist > threshold) {
32449           return "too_bendy";
32450         } else if (dist > maxDistance) {
32451           maxDistance = dist;
32452         }
32453       }
32454       var keepingAllNodes = nodes.every(function(node, i3) {
32455         return i3 === 0 || i3 === nodes.length - 1 || shouldKeepNode(node, graph);
32456       });
32457       if (maxDistance < 1e-4 && // Allow straightening even if already straight in order to remove extraneous nodes
32458       keepingAllNodes) {
32459         return "straight_enough";
32460       }
32461     };
32462     action.transitionable = true;
32463     return action;
32464   }
32465
32466   // modules/actions/unrestrict_turn.js
32467   function actionUnrestrictTurn(turn) {
32468     return function(graph) {
32469       return actionDeleteRelation(turn.restrictionID)(graph);
32470     };
32471   }
32472
32473   // modules/actions/reflect.js
32474   function actionReflect(reflectIds, projection2) {
32475     var _useLongAxis = true;
32476     var action = function(graph, t) {
32477       if (t === null || !isFinite(t))
32478         t = 1;
32479       t = Math.min(Math.max(+t, 0), 1);
32480       var nodes = utilGetAllNodes(reflectIds, graph);
32481       var points = nodes.map(function(n2) {
32482         return projection2(n2.loc);
32483       });
32484       var ssr = geoGetSmallestSurroundingRectangle(points);
32485       var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
32486       var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
32487       var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
32488       var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
32489       var p, q;
32490       var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
32491       if (_useLongAxis && isLong || !_useLongAxis && !isLong) {
32492         p = p1;
32493         q = q1;
32494       } else {
32495         p = p2;
32496         q = q2;
32497       }
32498       var dx = q[0] - p[0];
32499       var dy = q[1] - p[1];
32500       var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
32501       var b = 2 * dx * dy / (dx * dx + dy * dy);
32502       for (var i2 = 0; i2 < nodes.length; i2++) {
32503         var node = nodes[i2];
32504         var c = projection2(node.loc);
32505         var c2 = [
32506           a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
32507           b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
32508         ];
32509         var loc2 = projection2.invert(c2);
32510         node = node.move(geoVecInterp(node.loc, loc2, t));
32511         graph = graph.replace(node);
32512       }
32513       return graph;
32514     };
32515     action.useLongAxis = function(val) {
32516       if (!arguments.length)
32517         return _useLongAxis;
32518       _useLongAxis = val;
32519       return action;
32520     };
32521     action.transitionable = true;
32522     return action;
32523   }
32524
32525   // modules/actions/upgrade_tags.js
32526   function actionUpgradeTags(entityId, oldTags, replaceTags) {
32527     return function(graph) {
32528       var entity = graph.entity(entityId);
32529       var tags = Object.assign({}, entity.tags);
32530       var transferValue;
32531       var semiIndex;
32532       for (var oldTagKey in oldTags) {
32533         if (!(oldTagKey in tags))
32534           continue;
32535         if (oldTags[oldTagKey] === "*") {
32536           transferValue = tags[oldTagKey];
32537           delete tags[oldTagKey];
32538         } else if (oldTags[oldTagKey] === tags[oldTagKey]) {
32539           delete tags[oldTagKey];
32540         } else {
32541           var vals = tags[oldTagKey].split(";").filter(Boolean);
32542           var oldIndex = vals.indexOf(oldTags[oldTagKey]);
32543           if (vals.length === 1 || oldIndex === -1) {
32544             delete tags[oldTagKey];
32545           } else {
32546             if (replaceTags && replaceTags[oldTagKey]) {
32547               semiIndex = oldIndex;
32548             }
32549             vals.splice(oldIndex, 1);
32550             tags[oldTagKey] = vals.join(";");
32551           }
32552         }
32553       }
32554       if (replaceTags) {
32555         for (var replaceKey in replaceTags) {
32556           var replaceValue = replaceTags[replaceKey];
32557           if (replaceValue === "*") {
32558             if (tags[replaceKey] && tags[replaceKey] !== "no") {
32559               continue;
32560             } else {
32561               tags[replaceKey] = "yes";
32562             }
32563           } else if (replaceValue === "$1") {
32564             tags[replaceKey] = transferValue;
32565           } else {
32566             if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== void 0) {
32567               var existingVals = tags[replaceKey].split(";").filter(Boolean);
32568               if (existingVals.indexOf(replaceValue) === -1) {
32569                 existingVals.splice(semiIndex, 0, replaceValue);
32570                 tags[replaceKey] = existingVals.join(";");
32571               }
32572             } else {
32573               tags[replaceKey] = replaceValue;
32574             }
32575           }
32576         }
32577       }
32578       return graph.replace(entity.update({ tags }));
32579     };
32580   }
32581
32582   // modules/behavior/edit.js
32583   function behaviorEdit(context) {
32584     function behavior() {
32585       context.map().minzoom(context.minEditableZoom());
32586     }
32587     behavior.off = function() {
32588       context.map().minzoom(0);
32589     };
32590     return behavior;
32591   }
32592
32593   // modules/behavior/hover.js
32594   function behaviorHover(context) {
32595     var dispatch10 = dispatch_default("hover");
32596     var _selection = select_default2(null);
32597     var _newNodeId = null;
32598     var _initialNodeID = null;
32599     var _altDisables;
32600     var _ignoreVertex;
32601     var _targets = [];
32602     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
32603     function keydown(d3_event) {
32604       if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
32605         _selection.selectAll(".hover").classed("hover-suppressed", true).classed("hover", false);
32606         _selection.classed("hover-disabled", true);
32607         dispatch10.call("hover", this, null);
32608       }
32609     }
32610     function keyup(d3_event) {
32611       if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
32612         _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false).classed("hover", true);
32613         _selection.classed("hover-disabled", false);
32614         dispatch10.call("hover", this, _targets);
32615       }
32616     }
32617     function behavior(selection2) {
32618       _selection = selection2;
32619       _targets = [];
32620       if (_initialNodeID) {
32621         _newNodeId = _initialNodeID;
32622         _initialNodeID = null;
32623       } else {
32624         _newNodeId = null;
32625       }
32626       _selection.on(_pointerPrefix + "over.hover", pointerover).on(_pointerPrefix + "out.hover", pointerout).on(_pointerPrefix + "down.hover", pointerover);
32627       select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", pointerout, true).on("keydown.hover", keydown).on("keyup.hover", keyup);
32628       function eventTarget(d3_event) {
32629         var datum2 = d3_event.target && d3_event.target.__data__;
32630         if (typeof datum2 !== "object")
32631           return null;
32632         if (!(datum2 instanceof osmEntity) && datum2.properties && datum2.properties.entity instanceof osmEntity) {
32633           return datum2.properties.entity;
32634         }
32635         return datum2;
32636       }
32637       function pointerover(d3_event) {
32638         if (context.mode().id.indexOf("drag") === -1 && (!d3_event.pointerType || d3_event.pointerType === "mouse") && d3_event.buttons)
32639           return;
32640         var target = eventTarget(d3_event);
32641         if (target && _targets.indexOf(target) === -1) {
32642           _targets.push(target);
32643           updateHover(d3_event, _targets);
32644         }
32645       }
32646       function pointerout(d3_event) {
32647         var target = eventTarget(d3_event);
32648         var index = _targets.indexOf(target);
32649         if (index !== -1) {
32650           _targets.splice(index);
32651           updateHover(d3_event, _targets);
32652         }
32653       }
32654       function allowsVertex(d) {
32655         return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
32656       }
32657       function modeAllowsHover(target) {
32658         var mode = context.mode();
32659         if (mode.id === "add-point") {
32660           return mode.preset.matchGeometry("vertex") || target.type !== "way" && target.geometry(context.graph()) !== "vertex";
32661         }
32662         return true;
32663       }
32664       function updateHover(d3_event, targets) {
32665         _selection.selectAll(".hover").classed("hover", false);
32666         _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false);
32667         var mode = context.mode();
32668         if (!_newNodeId && (mode.id === "draw-line" || mode.id === "draw-area")) {
32669           var node = targets.find(function(target) {
32670             return target instanceof osmEntity && target.type === "node";
32671           });
32672           _newNodeId = node && node.id;
32673         }
32674         targets = targets.filter(function(datum3) {
32675           if (datum3 instanceof osmEntity) {
32676             return datum3.id !== _newNodeId && (datum3.type !== "node" || !_ignoreVertex || allowsVertex(datum3)) && modeAllowsHover(datum3);
32677           }
32678           return true;
32679         });
32680         var selector = "";
32681         for (var i2 in targets) {
32682           var datum2 = targets[i2];
32683           if (datum2.__featurehash__) {
32684             selector += ", .data" + datum2.__featurehash__;
32685           } else if (datum2 instanceof QAItem) {
32686             selector += ", ." + datum2.service + ".itemId-" + datum2.id;
32687           } else if (datum2 instanceof osmNote) {
32688             selector += ", .note-" + datum2.id;
32689           } else if (datum2 instanceof osmEntity) {
32690             selector += ", ." + datum2.id;
32691             if (datum2.type === "relation") {
32692               for (var j2 in datum2.members) {
32693                 selector += ", ." + datum2.members[j2].id;
32694               }
32695             }
32696           }
32697         }
32698         var suppressed = _altDisables && d3_event && d3_event.altKey;
32699         if (selector.trim().length) {
32700           selector = selector.slice(1);
32701           _selection.selectAll(selector).classed(suppressed ? "hover-suppressed" : "hover", true);
32702         }
32703         dispatch10.call("hover", this, !suppressed && targets);
32704       }
32705     }
32706     behavior.off = function(selection2) {
32707       selection2.selectAll(".hover").classed("hover", false);
32708       selection2.selectAll(".hover-suppressed").classed("hover-suppressed", false);
32709       selection2.classed("hover-disabled", false);
32710       selection2.on(_pointerPrefix + "over.hover", null).on(_pointerPrefix + "out.hover", null).on(_pointerPrefix + "down.hover", null);
32711       select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", null, true).on("keydown.hover", null).on("keyup.hover", null);
32712     };
32713     behavior.altDisables = function(val) {
32714       if (!arguments.length)
32715         return _altDisables;
32716       _altDisables = val;
32717       return behavior;
32718     };
32719     behavior.ignoreVertex = function(val) {
32720       if (!arguments.length)
32721         return _ignoreVertex;
32722       _ignoreVertex = val;
32723       return behavior;
32724     };
32725     behavior.initialNodeID = function(nodeId) {
32726       _initialNodeID = nodeId;
32727       return behavior;
32728     };
32729     return utilRebind(behavior, dispatch10, "on");
32730   }
32731
32732   // modules/behavior/draw.js
32733   var _disableSpace = false;
32734   var _lastSpace = null;
32735   function behaviorDraw(context) {
32736     var dispatch10 = dispatch_default(
32737       "move",
32738       "down",
32739       "downcancel",
32740       "click",
32741       "clickWay",
32742       "clickNode",
32743       "undo",
32744       "cancel",
32745       "finish"
32746     );
32747     var keybinding = utilKeybinding("draw");
32748     var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on("hover", context.ui().sidebar.hover);
32749     var _edit = behaviorEdit(context);
32750     var _closeTolerance = 4;
32751     var _tolerance = 12;
32752     var _mouseLeave = false;
32753     var _lastMouse = null;
32754     var _lastPointerUpEvent;
32755     var _downPointer;
32756     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
32757     function datum2(d3_event) {
32758       var mode = context.mode();
32759       var isNote = mode && mode.id.indexOf("note") !== -1;
32760       if (d3_event.altKey || isNote)
32761         return {};
32762       var element;
32763       if (d3_event.type === "keydown") {
32764         element = _lastMouse && _lastMouse.target;
32765       } else {
32766         element = d3_event.target;
32767       }
32768       var d = element.__data__;
32769       return d && d.properties && d.properties.target ? d : {};
32770     }
32771     function pointerdown(d3_event) {
32772       if (_downPointer)
32773         return;
32774       var pointerLocGetter = utilFastMouse(this);
32775       _downPointer = {
32776         id: d3_event.pointerId || "mouse",
32777         pointerLocGetter,
32778         downTime: +new Date(),
32779         downLoc: pointerLocGetter(d3_event)
32780       };
32781       dispatch10.call("down", this, d3_event, datum2(d3_event));
32782     }
32783     function pointerup(d3_event) {
32784       if (!_downPointer || _downPointer.id !== (d3_event.pointerId || "mouse"))
32785         return;
32786       var downPointer = _downPointer;
32787       _downPointer = null;
32788       _lastPointerUpEvent = d3_event;
32789       if (downPointer.isCancelled)
32790         return;
32791       var t2 = +new Date();
32792       var p2 = downPointer.pointerLocGetter(d3_event);
32793       var dist = geoVecLength(downPointer.downLoc, p2);
32794       if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) {
32795         select_default2(window).on("click.draw-block", function() {
32796           d3_event.stopPropagation();
32797         }, true);
32798         context.map().dblclickZoomEnable(false);
32799         window.setTimeout(function() {
32800           context.map().dblclickZoomEnable(true);
32801           select_default2(window).on("click.draw-block", null);
32802         }, 500);
32803         click(d3_event, p2);
32804       }
32805     }
32806     function pointermove(d3_event) {
32807       if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse") && !_downPointer.isCancelled) {
32808         var p2 = _downPointer.pointerLocGetter(d3_event);
32809         var dist = geoVecLength(_downPointer.downLoc, p2);
32810         if (dist >= _closeTolerance) {
32811           _downPointer.isCancelled = true;
32812           dispatch10.call("downcancel", this);
32813         }
32814       }
32815       if (d3_event.pointerType && d3_event.pointerType !== "mouse" || d3_event.buttons || _downPointer)
32816         return;
32817       if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== "mouse" && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100)
32818         return;
32819       _lastMouse = d3_event;
32820       dispatch10.call("move", this, d3_event, datum2(d3_event));
32821     }
32822     function pointercancel(d3_event) {
32823       if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse")) {
32824         if (!_downPointer.isCancelled) {
32825           dispatch10.call("downcancel", this);
32826         }
32827         _downPointer = null;
32828       }
32829     }
32830     function mouseenter() {
32831       _mouseLeave = false;
32832     }
32833     function mouseleave() {
32834       _mouseLeave = true;
32835     }
32836     function allowsVertex(d) {
32837       return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
32838     }
32839     function click(d3_event, loc) {
32840       var d = datum2(d3_event);
32841       var target = d && d.properties && d.properties.entity;
32842       var mode = context.mode();
32843       if (target && target.type === "node" && allowsVertex(target)) {
32844         dispatch10.call("clickNode", this, target, d);
32845         return;
32846       } else if (target && target.type === "way" && (mode.id !== "add-point" || mode.preset.matchGeometry("vertex"))) {
32847         var choice = geoChooseEdge(
32848           context.graph().childNodes(target),
32849           loc,
32850           context.projection,
32851           context.activeID()
32852         );
32853         if (choice) {
32854           var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
32855           dispatch10.call("clickWay", this, choice.loc, edge, d);
32856           return;
32857         }
32858       } else if (mode.id !== "add-point" || mode.preset.matchGeometry("point")) {
32859         var locLatLng = context.projection.invert(loc);
32860         dispatch10.call("click", this, locLatLng, d);
32861       }
32862     }
32863     function space(d3_event) {
32864       d3_event.preventDefault();
32865       d3_event.stopPropagation();
32866       var currSpace = context.map().mouse();
32867       if (_disableSpace && _lastSpace) {
32868         var dist = geoVecLength(_lastSpace, currSpace);
32869         if (dist > _tolerance) {
32870           _disableSpace = false;
32871         }
32872       }
32873       if (_disableSpace || _mouseLeave || !_lastMouse)
32874         return;
32875       _lastSpace = currSpace;
32876       _disableSpace = true;
32877       select_default2(window).on("keyup.space-block", function() {
32878         d3_event.preventDefault();
32879         d3_event.stopPropagation();
32880         _disableSpace = false;
32881         select_default2(window).on("keyup.space-block", null);
32882       });
32883       var loc = context.map().mouse() || // or the map center if the mouse has never entered the map
32884       context.projection(context.map().center());
32885       click(d3_event, loc);
32886     }
32887     function backspace(d3_event) {
32888       d3_event.preventDefault();
32889       dispatch10.call("undo");
32890     }
32891     function del(d3_event) {
32892       d3_event.preventDefault();
32893       dispatch10.call("cancel");
32894     }
32895     function ret(d3_event) {
32896       d3_event.preventDefault();
32897       dispatch10.call("finish");
32898     }
32899     function behavior(selection2) {
32900       context.install(_hover);
32901       context.install(_edit);
32902       _downPointer = null;
32903       keybinding.on("\u232B", backspace).on("\u2326", del).on("\u238B", ret).on("\u21A9", ret).on("space", space).on("\u2325space", space);
32904       selection2.on("mouseenter.draw", mouseenter).on("mouseleave.draw", mouseleave).on(_pointerPrefix + "down.draw", pointerdown).on(_pointerPrefix + "move.draw", pointermove);
32905       select_default2(window).on(_pointerPrefix + "up.draw", pointerup, true).on("pointercancel.draw", pointercancel, true);
32906       select_default2(document).call(keybinding);
32907       return behavior;
32908     }
32909     behavior.off = function(selection2) {
32910       context.ui().sidebar.hover.cancel();
32911       context.uninstall(_hover);
32912       context.uninstall(_edit);
32913       selection2.on("mouseenter.draw", null).on("mouseleave.draw", null).on(_pointerPrefix + "down.draw", null).on(_pointerPrefix + "move.draw", null);
32914       select_default2(window).on(_pointerPrefix + "up.draw", null).on("pointercancel.draw", null);
32915       select_default2(document).call(keybinding.unbind);
32916     };
32917     behavior.hover = function() {
32918       return _hover;
32919     };
32920     return utilRebind(behavior, dispatch10, "on");
32921   }
32922
32923   // modules/behavior/breathe.js
32924   var import_fast_deep_equal2 = __toESM(require_fast_deep_equal());
32925
32926   // node_modules/d3-scale/src/init.js
32927   function initRange(domain2, range3) {
32928     switch (arguments.length) {
32929       case 0:
32930         break;
32931       case 1:
32932         this.range(domain2);
32933         break;
32934       default:
32935         this.range(range3).domain(domain2);
32936         break;
32937     }
32938     return this;
32939   }
32940
32941   // node_modules/d3-scale/src/constant.js
32942   function constants(x) {
32943     return function() {
32944       return x;
32945     };
32946   }
32947
32948   // node_modules/d3-scale/src/number.js
32949   function number2(x) {
32950     return +x;
32951   }
32952
32953   // node_modules/d3-scale/src/continuous.js
32954   var unit = [0, 1];
32955   function identity3(x) {
32956     return x;
32957   }
32958   function normalize(a, b) {
32959     return (b -= a = +a) ? function(x) {
32960       return (x - a) / b;
32961     } : constants(isNaN(b) ? NaN : 0.5);
32962   }
32963   function clamper(a, b) {
32964     var t;
32965     if (a > b)
32966       t = a, a = b, b = t;
32967     return function(x) {
32968       return Math.max(a, Math.min(b, x));
32969     };
32970   }
32971   function bimap(domain2, range3, interpolate) {
32972     var d0 = domain2[0], d1 = domain2[1], r0 = range3[0], r1 = range3[1];
32973     if (d1 < d0)
32974       d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
32975     else
32976       d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
32977     return function(x) {
32978       return r0(d0(x));
32979     };
32980   }
32981   function polymap(domain2, range3, interpolate) {
32982     var j2 = Math.min(domain2.length, range3.length) - 1, d = new Array(j2), r = new Array(j2), i2 = -1;
32983     if (domain2[j2] < domain2[0]) {
32984       domain2 = domain2.slice().reverse();
32985       range3 = range3.slice().reverse();
32986     }
32987     while (++i2 < j2) {
32988       d[i2] = normalize(domain2[i2], domain2[i2 + 1]);
32989       r[i2] = interpolate(range3[i2], range3[i2 + 1]);
32990     }
32991     return function(x) {
32992       var i3 = bisect_default(domain2, x, 1, j2) - 1;
32993       return r[i3](d[i3](x));
32994     };
32995   }
32996   function copy(source, target) {
32997     return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
32998   }
32999   function transformer2() {
33000     var domain2 = unit, range3 = unit, interpolate = value_default, transform2, untransform, unknown, clamp3 = identity3, piecewise, output, input;
33001     function rescale() {
33002       var n2 = Math.min(domain2.length, range3.length);
33003       if (clamp3 !== identity3)
33004         clamp3 = clamper(domain2[0], domain2[n2 - 1]);
33005       piecewise = n2 > 2 ? polymap : bimap;
33006       output = input = null;
33007       return scale;
33008     }
33009     function scale(x) {
33010       return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain2.map(transform2), range3, interpolate)))(transform2(clamp3(x)));
33011     }
33012     scale.invert = function(y) {
33013       return clamp3(untransform((input || (input = piecewise(range3, domain2.map(transform2), number_default)))(y)));
33014     };
33015     scale.domain = function(_) {
33016       return arguments.length ? (domain2 = Array.from(_, number2), rescale()) : domain2.slice();
33017     };
33018     scale.range = function(_) {
33019       return arguments.length ? (range3 = Array.from(_), rescale()) : range3.slice();
33020     };
33021     scale.rangeRound = function(_) {
33022       return range3 = Array.from(_), interpolate = round_default, rescale();
33023     };
33024     scale.clamp = function(_) {
33025       return arguments.length ? (clamp3 = _ ? true : identity3, rescale()) : clamp3 !== identity3;
33026     };
33027     scale.interpolate = function(_) {
33028       return arguments.length ? (interpolate = _, rescale()) : interpolate;
33029     };
33030     scale.unknown = function(_) {
33031       return arguments.length ? (unknown = _, scale) : unknown;
33032     };
33033     return function(t, u) {
33034       transform2 = t, untransform = u;
33035       return rescale();
33036     };
33037   }
33038   function continuous() {
33039     return transformer2()(identity3, identity3);
33040   }
33041
33042   // node_modules/d3-format/src/formatDecimal.js
33043   function formatDecimal_default(x) {
33044     return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
33045   }
33046   function formatDecimalParts(x, p) {
33047     if ((i2 = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0)
33048       return null;
33049     var i2, coefficient = x.slice(0, i2);
33050     return [
33051       coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
33052       +x.slice(i2 + 1)
33053     ];
33054   }
33055
33056   // node_modules/d3-format/src/exponent.js
33057   function exponent_default(x) {
33058     return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;
33059   }
33060
33061   // node_modules/d3-format/src/formatGroup.js
33062   function formatGroup_default(grouping, thousands) {
33063     return function(value, width) {
33064       var i2 = value.length, t = [], j2 = 0, g = grouping[0], length = 0;
33065       while (i2 > 0 && g > 0) {
33066         if (length + g + 1 > width)
33067           g = Math.max(1, width - length);
33068         t.push(value.substring(i2 -= g, i2 + g));
33069         if ((length += g + 1) > width)
33070           break;
33071         g = grouping[j2 = (j2 + 1) % grouping.length];
33072       }
33073       return t.reverse().join(thousands);
33074     };
33075   }
33076
33077   // node_modules/d3-format/src/formatNumerals.js
33078   function formatNumerals_default(numerals) {
33079     return function(value) {
33080       return value.replace(/[0-9]/g, function(i2) {
33081         return numerals[+i2];
33082       });
33083     };
33084   }
33085
33086   // node_modules/d3-format/src/formatSpecifier.js
33087   var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
33088   function formatSpecifier(specifier) {
33089     if (!(match = re.exec(specifier)))
33090       throw new Error("invalid format: " + specifier);
33091     var match;
33092     return new FormatSpecifier({
33093       fill: match[1],
33094       align: match[2],
33095       sign: match[3],
33096       symbol: match[4],
33097       zero: match[5],
33098       width: match[6],
33099       comma: match[7],
33100       precision: match[8] && match[8].slice(1),
33101       trim: match[9],
33102       type: match[10]
33103     });
33104   }
33105   formatSpecifier.prototype = FormatSpecifier.prototype;
33106   function FormatSpecifier(specifier) {
33107     this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
33108     this.align = specifier.align === void 0 ? ">" : specifier.align + "";
33109     this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
33110     this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
33111     this.zero = !!specifier.zero;
33112     this.width = specifier.width === void 0 ? void 0 : +specifier.width;
33113     this.comma = !!specifier.comma;
33114     this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
33115     this.trim = !!specifier.trim;
33116     this.type = specifier.type === void 0 ? "" : specifier.type + "";
33117   }
33118   FormatSpecifier.prototype.toString = function() {
33119     return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
33120   };
33121
33122   // node_modules/d3-format/src/formatTrim.js
33123   function formatTrim_default(s) {
33124     out:
33125       for (var n2 = s.length, i2 = 1, i0 = -1, i1; i2 < n2; ++i2) {
33126         switch (s[i2]) {
33127           case ".":
33128             i0 = i1 = i2;
33129             break;
33130           case "0":
33131             if (i0 === 0)
33132               i0 = i2;
33133             i1 = i2;
33134             break;
33135           default:
33136             if (!+s[i2])
33137               break out;
33138             if (i0 > 0)
33139               i0 = 0;
33140             break;
33141         }
33142       }
33143     return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
33144   }
33145
33146   // node_modules/d3-format/src/formatPrefixAuto.js
33147   var prefixExponent;
33148   function formatPrefixAuto_default(x, p) {
33149     var d = formatDecimalParts(x, p);
33150     if (!d)
33151       return x + "";
33152     var coefficient = d[0], exponent = d[1], i2 = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n2 = coefficient.length;
33153     return i2 === n2 ? coefficient : i2 > n2 ? coefficient + new Array(i2 - n2 + 1).join("0") : i2 > 0 ? coefficient.slice(0, i2) + "." + coefficient.slice(i2) : "0." + new Array(1 - i2).join("0") + formatDecimalParts(x, Math.max(0, p + i2 - 1))[0];
33154   }
33155
33156   // node_modules/d3-format/src/formatRounded.js
33157   function formatRounded_default(x, p) {
33158     var d = formatDecimalParts(x, p);
33159     if (!d)
33160       return x + "";
33161     var coefficient = d[0], exponent = d[1];
33162     return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0");
33163   }
33164
33165   // node_modules/d3-format/src/formatTypes.js
33166   var formatTypes_default = {
33167     "%": (x, p) => (x * 100).toFixed(p),
33168     "b": (x) => Math.round(x).toString(2),
33169     "c": (x) => x + "",
33170     "d": formatDecimal_default,
33171     "e": (x, p) => x.toExponential(p),
33172     "f": (x, p) => x.toFixed(p),
33173     "g": (x, p) => x.toPrecision(p),
33174     "o": (x) => Math.round(x).toString(8),
33175     "p": (x, p) => formatRounded_default(x * 100, p),
33176     "r": formatRounded_default,
33177     "s": formatPrefixAuto_default,
33178     "X": (x) => Math.round(x).toString(16).toUpperCase(),
33179     "x": (x) => Math.round(x).toString(16)
33180   };
33181
33182   // node_modules/d3-format/src/identity.js
33183   function identity_default3(x) {
33184     return x;
33185   }
33186
33187   // node_modules/d3-format/src/locale.js
33188   var map = Array.prototype.map;
33189   var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
33190   function locale_default(locale2) {
33191     var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity_default3 : formatGroup_default(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity_default3 : formatNumerals_default(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "\u2212" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + "";
33192     function newFormat(specifier) {
33193       specifier = formatSpecifier(specifier);
33194       var fill = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol = specifier.symbol, zero3 = specifier.zero, width = specifier.width, comma = specifier.comma, precision2 = specifier.precision, trim = specifier.trim, type2 = specifier.type;
33195       if (type2 === "n")
33196         comma = true, type2 = "g";
33197       else if (!formatTypes_default[type2])
33198         precision2 === void 0 && (precision2 = 12), trim = true, type2 = "g";
33199       if (zero3 || fill === "0" && align === "=")
33200         zero3 = true, fill = "0", align = "=";
33201       var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type2) ? "0" + type2.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type2) ? percent : "";
33202       var formatType = formatTypes_default[type2], maybeSuffix = /[defgprs%]/.test(type2);
33203       precision2 = precision2 === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision2)) : Math.max(0, Math.min(20, precision2));
33204       function format2(value) {
33205         var valuePrefix = prefix, valueSuffix = suffix, i2, n2, c;
33206         if (type2 === "c") {
33207           valueSuffix = formatType(value) + valueSuffix;
33208           value = "";
33209         } else {
33210           value = +value;
33211           var valueNegative = value < 0 || 1 / value < 0;
33212           value = isNaN(value) ? nan : formatType(Math.abs(value), precision2);
33213           if (trim)
33214             value = formatTrim_default(value);
33215           if (valueNegative && +value === 0 && sign2 !== "+")
33216             valueNegative = false;
33217           valuePrefix = (valueNegative ? sign2 === "(" ? sign2 : minus : sign2 === "-" || sign2 === "(" ? "" : sign2) + valuePrefix;
33218           valueSuffix = (type2 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign2 === "(" ? ")" : "");
33219           if (maybeSuffix) {
33220             i2 = -1, n2 = value.length;
33221             while (++i2 < n2) {
33222               if (c = value.charCodeAt(i2), 48 > c || c > 57) {
33223                 valueSuffix = (c === 46 ? decimal + value.slice(i2 + 1) : value.slice(i2)) + valueSuffix;
33224                 value = value.slice(0, i2);
33225                 break;
33226               }
33227             }
33228           }
33229         }
33230         if (comma && !zero3)
33231           value = group(value, Infinity);
33232         var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
33233         if (comma && zero3)
33234           value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
33235         switch (align) {
33236           case "<":
33237             value = valuePrefix + value + valueSuffix + padding;
33238             break;
33239           case "=":
33240             value = valuePrefix + padding + value + valueSuffix;
33241             break;
33242           case "^":
33243             value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
33244             break;
33245           default:
33246             value = padding + valuePrefix + value + valueSuffix;
33247             break;
33248         }
33249         return numerals(value);
33250       }
33251       format2.toString = function() {
33252         return specifier + "";
33253       };
33254       return format2;
33255     }
33256     function formatPrefix2(specifier, value) {
33257       var f2 = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
33258       return function(value2) {
33259         return f2(k * value2) + prefix;
33260       };
33261     }
33262     return {
33263       format: newFormat,
33264       formatPrefix: formatPrefix2
33265     };
33266   }
33267
33268   // node_modules/d3-format/src/defaultLocale.js
33269   var locale;
33270   var format;
33271   var formatPrefix;
33272   defaultLocale({
33273     thousands: ",",
33274     grouping: [3],
33275     currency: ["$", ""]
33276   });
33277   function defaultLocale(definition) {
33278     locale = locale_default(definition);
33279     format = locale.format;
33280     formatPrefix = locale.formatPrefix;
33281     return locale;
33282   }
33283
33284   // node_modules/d3-format/src/precisionFixed.js
33285   function precisionFixed_default(step) {
33286     return Math.max(0, -exponent_default(Math.abs(step)));
33287   }
33288
33289   // node_modules/d3-format/src/precisionPrefix.js
33290   function precisionPrefix_default(step, value) {
33291     return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step)));
33292   }
33293
33294   // node_modules/d3-format/src/precisionRound.js
33295   function precisionRound_default(step, max3) {
33296     step = Math.abs(step), max3 = Math.abs(max3) - step;
33297     return Math.max(0, exponent_default(max3) - exponent_default(step)) + 1;
33298   }
33299
33300   // node_modules/d3-scale/src/tickFormat.js
33301   function tickFormat(start2, stop, count, specifier) {
33302     var step = tickStep(start2, stop, count), precision2;
33303     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
33304     switch (specifier.type) {
33305       case "s": {
33306         var value = Math.max(Math.abs(start2), Math.abs(stop));
33307         if (specifier.precision == null && !isNaN(precision2 = precisionPrefix_default(step, value)))
33308           specifier.precision = precision2;
33309         return formatPrefix(specifier, value);
33310       }
33311       case "":
33312       case "e":
33313       case "g":
33314       case "p":
33315       case "r": {
33316         if (specifier.precision == null && !isNaN(precision2 = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop)))))
33317           specifier.precision = precision2 - (specifier.type === "e");
33318         break;
33319       }
33320       case "f":
33321       case "%": {
33322         if (specifier.precision == null && !isNaN(precision2 = precisionFixed_default(step)))
33323           specifier.precision = precision2 - (specifier.type === "%") * 2;
33324         break;
33325       }
33326     }
33327     return format(specifier);
33328   }
33329
33330   // node_modules/d3-scale/src/linear.js
33331   function linearish(scale) {
33332     var domain2 = scale.domain;
33333     scale.ticks = function(count) {
33334       var d = domain2();
33335       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
33336     };
33337     scale.tickFormat = function(count, specifier) {
33338       var d = domain2();
33339       return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
33340     };
33341     scale.nice = function(count) {
33342       if (count == null)
33343         count = 10;
33344       var d = domain2();
33345       var i0 = 0;
33346       var i1 = d.length - 1;
33347       var start2 = d[i0];
33348       var stop = d[i1];
33349       var prestep;
33350       var step;
33351       var maxIter = 10;
33352       if (stop < start2) {
33353         step = start2, start2 = stop, stop = step;
33354         step = i0, i0 = i1, i1 = step;
33355       }
33356       while (maxIter-- > 0) {
33357         step = tickIncrement(start2, stop, count);
33358         if (step === prestep) {
33359           d[i0] = start2;
33360           d[i1] = stop;
33361           return domain2(d);
33362         } else if (step > 0) {
33363           start2 = Math.floor(start2 / step) * step;
33364           stop = Math.ceil(stop / step) * step;
33365         } else if (step < 0) {
33366           start2 = Math.ceil(start2 * step) / step;
33367           stop = Math.floor(stop * step) / step;
33368         } else {
33369           break;
33370         }
33371         prestep = step;
33372       }
33373       return scale;
33374     };
33375     return scale;
33376   }
33377   function linear3() {
33378     var scale = continuous();
33379     scale.copy = function() {
33380       return copy(scale, linear3());
33381     };
33382     initRange.apply(scale, arguments);
33383     return linearish(scale);
33384   }
33385
33386   // node_modules/d3-scale/src/quantize.js
33387   function quantize() {
33388     var x05 = 0, x12 = 1, n2 = 1, domain2 = [0.5], range3 = [0, 1], unknown;
33389     function scale(x) {
33390       return x != null && x <= x ? range3[bisect_default(domain2, x, 0, n2)] : unknown;
33391     }
33392     function rescale() {
33393       var i2 = -1;
33394       domain2 = new Array(n2);
33395       while (++i2 < n2)
33396         domain2[i2] = ((i2 + 1) * x12 - (i2 - n2) * x05) / (n2 + 1);
33397       return scale;
33398     }
33399     scale.domain = function(_) {
33400       return arguments.length ? ([x05, x12] = _, x05 = +x05, x12 = +x12, rescale()) : [x05, x12];
33401     };
33402     scale.range = function(_) {
33403       return arguments.length ? (n2 = (range3 = Array.from(_)).length - 1, rescale()) : range3.slice();
33404     };
33405     scale.invertExtent = function(y) {
33406       var i2 = range3.indexOf(y);
33407       return i2 < 0 ? [NaN, NaN] : i2 < 1 ? [x05, domain2[0]] : i2 >= n2 ? [domain2[n2 - 1], x12] : [domain2[i2 - 1], domain2[i2]];
33408     };
33409     scale.unknown = function(_) {
33410       return arguments.length ? (unknown = _, scale) : scale;
33411     };
33412     scale.thresholds = function() {
33413       return domain2.slice();
33414     };
33415     scale.copy = function() {
33416       return quantize().domain([x05, x12]).range(range3).unknown(unknown);
33417     };
33418     return initRange.apply(linearish(scale), arguments);
33419   }
33420
33421   // modules/behavior/breathe.js
33422   function behaviorBreathe() {
33423     var duration = 800;
33424     var steps = 4;
33425     var selector = ".selected.shadow, .selected .shadow";
33426     var _selected = select_default2(null);
33427     var _classed = "";
33428     var _params = {};
33429     var _done = false;
33430     var _timer;
33431     function ratchetyInterpolator(a, b, steps2, units) {
33432       a = Number(a);
33433       b = Number(b);
33434       var sample = quantize().domain([0, 1]).range(quantize_default(number_default(a, b), steps2));
33435       return function(t) {
33436         return String(sample(t)) + (units || "");
33437       };
33438     }
33439     function reset(selection2) {
33440       selection2.style("stroke-opacity", null).style("stroke-width", null).style("fill-opacity", null).style("r", null);
33441     }
33442     function setAnimationParams(transition2, fromTo) {
33443       var toFrom = fromTo === "from" ? "to" : "from";
33444       transition2.styleTween("stroke-opacity", function(d) {
33445         return ratchetyInterpolator(
33446           _params[d.id][toFrom].opacity,
33447           _params[d.id][fromTo].opacity,
33448           steps
33449         );
33450       }).styleTween("stroke-width", function(d) {
33451         return ratchetyInterpolator(
33452           _params[d.id][toFrom].width,
33453           _params[d.id][fromTo].width,
33454           steps,
33455           "px"
33456         );
33457       }).styleTween("fill-opacity", function(d) {
33458         return ratchetyInterpolator(
33459           _params[d.id][toFrom].opacity,
33460           _params[d.id][fromTo].opacity,
33461           steps
33462         );
33463       }).styleTween("r", function(d) {
33464         return ratchetyInterpolator(
33465           _params[d.id][toFrom].width,
33466           _params[d.id][fromTo].width,
33467           steps,
33468           "px"
33469         );
33470       });
33471     }
33472     function calcAnimationParams(selection2) {
33473       selection2.call(reset).each(function(d) {
33474         var s = select_default2(this);
33475         var tag = s.node().tagName;
33476         var p = { "from": {}, "to": {} };
33477         var opacity;
33478         var width;
33479         if (tag === "circle") {
33480           opacity = Number(s.style("fill-opacity") || 0.5);
33481           width = Number(s.style("r") || 15.5);
33482         } else {
33483           opacity = Number(s.style("stroke-opacity") || 0.7);
33484           width = Number(s.style("stroke-width") || 10);
33485         }
33486         p.tag = tag;
33487         p.from.opacity = opacity * 0.6;
33488         p.to.opacity = opacity * 1.25;
33489         p.from.width = width * 0.7;
33490         p.to.width = width * (tag === "circle" ? 1.5 : 1);
33491         _params[d.id] = p;
33492       });
33493     }
33494     function run(surface, fromTo) {
33495       var toFrom = fromTo === "from" ? "to" : "from";
33496       var currSelected = surface.selectAll(selector);
33497       var currClassed = surface.attr("class");
33498       if (_done || currSelected.empty()) {
33499         _selected.call(reset);
33500         _selected = select_default2(null);
33501         return;
33502       }
33503       if (!(0, import_fast_deep_equal2.default)(currSelected.data(), _selected.data()) || currClassed !== _classed) {
33504         _selected.call(reset);
33505         _classed = currClassed;
33506         _selected = currSelected.call(calcAnimationParams);
33507       }
33508       var didCallNextRun = false;
33509       _selected.transition().duration(duration).call(setAnimationParams, fromTo).on("end", function() {
33510         if (!didCallNextRun) {
33511           surface.call(run, toFrom);
33512           didCallNextRun = true;
33513         }
33514         if (!select_default2(this).classed("selected")) {
33515           reset(select_default2(this));
33516         }
33517       });
33518     }
33519     function behavior(surface) {
33520       _done = false;
33521       _timer = timer(function() {
33522         if (surface.selectAll(selector).empty()) {
33523           return false;
33524         }
33525         surface.call(run, "from");
33526         _timer.stop();
33527         return true;
33528       }, 20);
33529     }
33530     behavior.restartIfNeeded = function(surface) {
33531       if (_selected.empty()) {
33532         surface.call(run, "from");
33533         if (_timer) {
33534           _timer.stop();
33535         }
33536       }
33537     };
33538     behavior.off = function() {
33539       _done = true;
33540       if (_timer) {
33541         _timer.stop();
33542       }
33543       _selected.interrupt().call(reset);
33544     };
33545     return behavior;
33546   }
33547
33548   // modules/behavior/operation.js
33549   function behaviorOperation(context) {
33550     var _operation;
33551     function keypress(d3_event) {
33552       if (!context.map().withinEditableZoom())
33553         return;
33554       if (_operation.availableForKeypress && !_operation.availableForKeypress())
33555         return;
33556       d3_event.preventDefault();
33557       var disabled = _operation.disabled();
33558       if (disabled) {
33559         context.ui().flash.duration(4e3).iconName("#iD-operation-" + _operation.id).iconClass("operation disabled").label(_operation.tooltip())();
33560       } else {
33561         context.ui().flash.duration(2e3).iconName("#iD-operation-" + _operation.id).iconClass("operation").label(_operation.annotation() || _operation.title)();
33562         if (_operation.point)
33563           _operation.point(null);
33564         _operation();
33565       }
33566     }
33567     function behavior() {
33568       if (_operation && _operation.available()) {
33569         context.keybinding().on(_operation.keys, keypress);
33570       }
33571       return behavior;
33572     }
33573     behavior.off = function() {
33574       context.keybinding().off(_operation.keys);
33575     };
33576     behavior.which = function(_) {
33577       if (!arguments.length)
33578         return _operation;
33579       _operation = _;
33580       return behavior;
33581     };
33582     return behavior;
33583   }
33584
33585   // modules/operations/circularize.js
33586   function operationCircularize(context, selectedIDs) {
33587     var _extent;
33588     var _actions = selectedIDs.map(getAction).filter(Boolean);
33589     var _amount = _actions.length === 1 ? "single" : "multiple";
33590     var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) {
33591       return n2.loc;
33592     });
33593     function getAction(entityID) {
33594       var entity = context.entity(entityID);
33595       if (entity.type !== "way" || new Set(entity.nodes).size <= 1)
33596         return null;
33597       if (!_extent) {
33598         _extent = entity.extent(context.graph());
33599       } else {
33600         _extent = _extent.extend(entity.extent(context.graph()));
33601       }
33602       return actionCircularize(entityID, context.projection);
33603     }
33604     var operation = function() {
33605       if (!_actions.length)
33606         return;
33607       var combinedAction = function(graph, t) {
33608         _actions.forEach(function(action) {
33609           if (!action.disabled(graph)) {
33610             graph = action(graph, t);
33611           }
33612         });
33613         return graph;
33614       };
33615       combinedAction.transitionable = true;
33616       context.perform(combinedAction, operation.annotation());
33617       window.setTimeout(function() {
33618         context.validator().validate();
33619       }, 300);
33620     };
33621     operation.available = function() {
33622       return _actions.length && selectedIDs.length === _actions.length;
33623     };
33624     operation.disabled = function() {
33625       if (!_actions.length)
33626         return "";
33627       var actionDisableds = _actions.map(function(action) {
33628         return action.disabled(context.graph());
33629       }).filter(Boolean);
33630       if (actionDisableds.length === _actions.length) {
33631         if (new Set(actionDisableds).size > 1) {
33632           return "multiple_blockers";
33633         }
33634         return actionDisableds[0];
33635       } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
33636         return "too_large";
33637       } else if (someMissing()) {
33638         return "not_downloaded";
33639       } else if (selectedIDs.some(context.hasHiddenConnections)) {
33640         return "connected_to_hidden";
33641       }
33642       return false;
33643       function someMissing() {
33644         if (context.inIntro())
33645           return false;
33646         var osm = context.connection();
33647         if (osm) {
33648           var missing = _coords.filter(function(loc) {
33649             return !osm.isDataLoaded(loc);
33650           });
33651           if (missing.length) {
33652             missing.forEach(function(loc) {
33653               context.loadTileAtLoc(loc);
33654             });
33655             return true;
33656           }
33657         }
33658         return false;
33659       }
33660     };
33661     operation.tooltip = function() {
33662       var disable = operation.disabled();
33663       return disable ? _t.append("operations.circularize." + disable + "." + _amount) : _t.append("operations.circularize.description." + _amount);
33664     };
33665     operation.annotation = function() {
33666       return _t("operations.circularize.annotation.feature", { n: _actions.length });
33667     };
33668     operation.id = "circularize";
33669     operation.keys = [_t("operations.circularize.key")];
33670     operation.title = _t.append("operations.circularize.title");
33671     operation.behavior = behaviorOperation(context).which(operation);
33672     return operation;
33673   }
33674
33675   // modules/ui/cmd.js
33676   var uiCmd = function(code) {
33677     var detected = utilDetect();
33678     if (detected.os === "mac") {
33679       return code;
33680     }
33681     if (detected.os === "win") {
33682       if (code === "\u2318\u21E7Z")
33683         return "Ctrl+Y";
33684     }
33685     var result = "", replacements = {
33686       "\u2318": "Ctrl",
33687       "\u21E7": "Shift",
33688       "\u2325": "Alt",
33689       "\u232B": "Backspace",
33690       "\u2326": "Delete"
33691     };
33692     for (var i2 = 0; i2 < code.length; i2++) {
33693       if (code[i2] in replacements) {
33694         result += replacements[code[i2]] + (i2 < code.length - 1 ? "+" : "");
33695       } else {
33696         result += code[i2];
33697       }
33698     }
33699     return result;
33700   };
33701   uiCmd.display = function(code) {
33702     if (code.length !== 1)
33703       return code;
33704     var detected = utilDetect();
33705     var mac = detected.os === "mac";
33706     var replacements = {
33707       "\u2318": mac ? "\u2318 " + _t("shortcuts.key.cmd") : _t("shortcuts.key.ctrl"),
33708       "\u21E7": mac ? "\u21E7 " + _t("shortcuts.key.shift") : _t("shortcuts.key.shift"),
33709       "\u2325": mac ? "\u2325 " + _t("shortcuts.key.option") : _t("shortcuts.key.alt"),
33710       "\u2303": mac ? "\u2303 " + _t("shortcuts.key.ctrl") : _t("shortcuts.key.ctrl"),
33711       "\u232B": mac ? "\u232B " + _t("shortcuts.key.delete") : _t("shortcuts.key.backspace"),
33712       "\u2326": mac ? "\u2326 " + _t("shortcuts.key.del") : _t("shortcuts.key.del"),
33713       "\u2196": mac ? "\u2196 " + _t("shortcuts.key.pgup") : _t("shortcuts.key.pgup"),
33714       "\u2198": mac ? "\u2198 " + _t("shortcuts.key.pgdn") : _t("shortcuts.key.pgdn"),
33715       "\u21DE": mac ? "\u21DE " + _t("shortcuts.key.home") : _t("shortcuts.key.home"),
33716       "\u21DF": mac ? "\u21DF " + _t("shortcuts.key.end") : _t("shortcuts.key.end"),
33717       "\u21B5": mac ? "\u23CE " + _t("shortcuts.key.return") : _t("shortcuts.key.enter"),
33718       "\u238B": mac ? "\u238B " + _t("shortcuts.key.esc") : _t("shortcuts.key.esc"),
33719       "\u2630": mac ? "\u2630 " + _t("shortcuts.key.menu") : _t("shortcuts.key.menu")
33720     };
33721     return replacements[code] || code;
33722   };
33723
33724   // modules/operations/delete.js
33725   function operationDelete(context, selectedIDs) {
33726     var multi = selectedIDs.length === 1 ? "single" : "multiple";
33727     var action = actionDeleteMultiple(selectedIDs);
33728     var nodes = utilGetAllNodes(selectedIDs, context.graph());
33729     var coords = nodes.map(function(n2) {
33730       return n2.loc;
33731     });
33732     var extent = utilTotalExtent(selectedIDs, context.graph());
33733     var operation = function() {
33734       var nextSelectedID;
33735       var nextSelectedLoc;
33736       if (selectedIDs.length === 1) {
33737         var id2 = selectedIDs[0];
33738         var entity = context.entity(id2);
33739         var geometry = entity.geometry(context.graph());
33740         var parents = context.graph().parentWays(entity);
33741         var parent = parents[0];
33742         if (geometry === "vertex") {
33743           var nodes2 = parent.nodes;
33744           var i2 = nodes2.indexOf(id2);
33745           if (i2 === 0) {
33746             i2++;
33747           } else if (i2 === nodes2.length - 1) {
33748             i2--;
33749           } else {
33750             var a = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 - 1]).loc);
33751             var b = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 + 1]).loc);
33752             i2 = a < b ? i2 - 1 : i2 + 1;
33753           }
33754           nextSelectedID = nodes2[i2];
33755           nextSelectedLoc = context.entity(nextSelectedID).loc;
33756         }
33757       }
33758       context.perform(action, operation.annotation());
33759       context.validator().validate();
33760       if (nextSelectedID && nextSelectedLoc) {
33761         if (context.hasEntity(nextSelectedID)) {
33762           context.enter(modeSelect(context, [nextSelectedID]).follow(true));
33763         } else {
33764           context.map().centerEase(nextSelectedLoc);
33765           context.enter(modeBrowse(context));
33766         }
33767       } else {
33768         context.enter(modeBrowse(context));
33769       }
33770     };
33771     operation.available = function() {
33772       return true;
33773     };
33774     operation.disabled = function() {
33775       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
33776         return "too_large";
33777       } else if (someMissing()) {
33778         return "not_downloaded";
33779       } else if (selectedIDs.some(context.hasHiddenConnections)) {
33780         return "connected_to_hidden";
33781       } else if (selectedIDs.some(protectedMember)) {
33782         return "part_of_relation";
33783       } else if (selectedIDs.some(incompleteRelation)) {
33784         return "incomplete_relation";
33785       } else if (selectedIDs.some(hasWikidataTag)) {
33786         return "has_wikidata_tag";
33787       }
33788       return false;
33789       function someMissing() {
33790         if (context.inIntro())
33791           return false;
33792         var osm = context.connection();
33793         if (osm) {
33794           var missing = coords.filter(function(loc) {
33795             return !osm.isDataLoaded(loc);
33796           });
33797           if (missing.length) {
33798             missing.forEach(function(loc) {
33799               context.loadTileAtLoc(loc);
33800             });
33801             return true;
33802           }
33803         }
33804         return false;
33805       }
33806       function hasWikidataTag(id2) {
33807         var entity = context.entity(id2);
33808         return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
33809       }
33810       function incompleteRelation(id2) {
33811         var entity = context.entity(id2);
33812         return entity.type === "relation" && !entity.isComplete(context.graph());
33813       }
33814       function protectedMember(id2) {
33815         var entity = context.entity(id2);
33816         if (entity.type !== "way")
33817           return false;
33818         var parents = context.graph().parentRelations(entity);
33819         for (var i2 = 0; i2 < parents.length; i2++) {
33820           var parent = parents[i2];
33821           var type2 = parent.tags.type;
33822           var role = parent.memberById(id2).role || "outer";
33823           if (type2 === "route" || type2 === "boundary" || type2 === "multipolygon" && role === "outer") {
33824             return true;
33825           }
33826         }
33827         return false;
33828       }
33829     };
33830     operation.tooltip = function() {
33831       var disable = operation.disabled();
33832       return disable ? _t.append("operations.delete." + disable + "." + multi) : _t.append("operations.delete.description." + multi);
33833     };
33834     operation.annotation = function() {
33835       return selectedIDs.length === 1 ? _t("operations.delete.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.delete.annotation.feature", { n: selectedIDs.length });
33836     };
33837     operation.id = "delete";
33838     operation.keys = [uiCmd("\u2318\u232B"), uiCmd("\u2318\u2326"), uiCmd("\u2326")];
33839     operation.title = _t.append("operations.delete.title");
33840     operation.behavior = behaviorOperation(context).which(operation);
33841     return operation;
33842   }
33843
33844   // modules/operations/orthogonalize.js
33845   function operationOrthogonalize(context, selectedIDs) {
33846     var _extent;
33847     var _type;
33848     var _actions = selectedIDs.map(chooseAction).filter(Boolean);
33849     var _amount = _actions.length === 1 ? "single" : "multiple";
33850     var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) {
33851       return n2.loc;
33852     });
33853     function chooseAction(entityID) {
33854       var entity = context.entity(entityID);
33855       var geometry = entity.geometry(context.graph());
33856       if (!_extent) {
33857         _extent = entity.extent(context.graph());
33858       } else {
33859         _extent = _extent.extend(entity.extent(context.graph()));
33860       }
33861       if (entity.type === "way" && new Set(entity.nodes).size > 2) {
33862         if (_type && _type !== "feature")
33863           return null;
33864         _type = "feature";
33865         return actionOrthogonalize(entityID, context.projection);
33866       } else if (geometry === "vertex") {
33867         if (_type && _type !== "corner")
33868           return null;
33869         _type = "corner";
33870         var graph = context.graph();
33871         var parents = graph.parentWays(entity);
33872         if (parents.length === 1) {
33873           var way = parents[0];
33874           if (way.nodes.indexOf(entityID) !== -1) {
33875             return actionOrthogonalize(way.id, context.projection, entityID);
33876           }
33877         }
33878       }
33879       return null;
33880     }
33881     var operation = function() {
33882       if (!_actions.length)
33883         return;
33884       var combinedAction = function(graph, t) {
33885         _actions.forEach(function(action) {
33886           if (!action.disabled(graph)) {
33887             graph = action(graph, t);
33888           }
33889         });
33890         return graph;
33891       };
33892       combinedAction.transitionable = true;
33893       context.perform(combinedAction, operation.annotation());
33894       window.setTimeout(function() {
33895         context.validator().validate();
33896       }, 300);
33897     };
33898     operation.available = function() {
33899       return _actions.length && selectedIDs.length === _actions.length;
33900     };
33901     operation.disabled = function() {
33902       if (!_actions.length)
33903         return "";
33904       var actionDisableds = _actions.map(function(action) {
33905         return action.disabled(context.graph());
33906       }).filter(Boolean);
33907       if (actionDisableds.length === _actions.length) {
33908         if (new Set(actionDisableds).size > 1) {
33909           return "multiple_blockers";
33910         }
33911         return actionDisableds[0];
33912       } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
33913         return "too_large";
33914       } else if (someMissing()) {
33915         return "not_downloaded";
33916       } else if (selectedIDs.some(context.hasHiddenConnections)) {
33917         return "connected_to_hidden";
33918       }
33919       return false;
33920       function someMissing() {
33921         if (context.inIntro())
33922           return false;
33923         var osm = context.connection();
33924         if (osm) {
33925           var missing = _coords.filter(function(loc) {
33926             return !osm.isDataLoaded(loc);
33927           });
33928           if (missing.length) {
33929             missing.forEach(function(loc) {
33930               context.loadTileAtLoc(loc);
33931             });
33932             return true;
33933           }
33934         }
33935         return false;
33936       }
33937     };
33938     operation.tooltip = function() {
33939       var disable = operation.disabled();
33940       return disable ? _t.append("operations.orthogonalize." + disable + "." + _amount) : _t.append("operations.orthogonalize.description." + _type + "." + _amount);
33941     };
33942     operation.annotation = function() {
33943       return _t("operations.orthogonalize.annotation." + _type, { n: _actions.length });
33944     };
33945     operation.id = "orthogonalize";
33946     operation.keys = [_t("operations.orthogonalize.key")];
33947     operation.title = _t.append("operations.orthogonalize.title");
33948     operation.behavior = behaviorOperation(context).which(operation);
33949     return operation;
33950   }
33951
33952   // modules/operations/reflect.js
33953   function operationReflectShort(context, selectedIDs) {
33954     return operationReflect(context, selectedIDs, "short");
33955   }
33956   function operationReflectLong(context, selectedIDs) {
33957     return operationReflect(context, selectedIDs, "long");
33958   }
33959   function operationReflect(context, selectedIDs, axis) {
33960     axis = axis || "long";
33961     var multi = selectedIDs.length === 1 ? "single" : "multiple";
33962     var nodes = utilGetAllNodes(selectedIDs, context.graph());
33963     var coords = nodes.map(function(n2) {
33964       return n2.loc;
33965     });
33966     var extent = utilTotalExtent(selectedIDs, context.graph());
33967     var operation = function() {
33968       var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === "long"));
33969       context.perform(action, operation.annotation());
33970       window.setTimeout(function() {
33971         context.validator().validate();
33972       }, 300);
33973     };
33974     operation.available = function() {
33975       return nodes.length >= 3;
33976     };
33977     operation.disabled = function() {
33978       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
33979         return "too_large";
33980       } else if (someMissing()) {
33981         return "not_downloaded";
33982       } else if (selectedIDs.some(context.hasHiddenConnections)) {
33983         return "connected_to_hidden";
33984       } else if (selectedIDs.some(incompleteRelation)) {
33985         return "incomplete_relation";
33986       }
33987       return false;
33988       function someMissing() {
33989         if (context.inIntro())
33990           return false;
33991         var osm = context.connection();
33992         if (osm) {
33993           var missing = coords.filter(function(loc) {
33994             return !osm.isDataLoaded(loc);
33995           });
33996           if (missing.length) {
33997             missing.forEach(function(loc) {
33998               context.loadTileAtLoc(loc);
33999             });
34000             return true;
34001           }
34002         }
34003         return false;
34004       }
34005       function incompleteRelation(id2) {
34006         var entity = context.entity(id2);
34007         return entity.type === "relation" && !entity.isComplete(context.graph());
34008       }
34009     };
34010     operation.tooltip = function() {
34011       var disable = operation.disabled();
34012       return disable ? _t.append("operations.reflect." + disable + "." + multi) : _t.append("operations.reflect.description." + axis + "." + multi);
34013     };
34014     operation.annotation = function() {
34015       return _t("operations.reflect.annotation." + axis + ".feature", { n: selectedIDs.length });
34016     };
34017     operation.id = "reflect-" + axis;
34018     operation.keys = [_t("operations.reflect.key." + axis)];
34019     operation.title = _t.append("operations.reflect.title." + axis);
34020     operation.behavior = behaviorOperation(context).which(operation);
34021     return operation;
34022   }
34023
34024   // modules/operations/move.js
34025   function operationMove(context, selectedIDs) {
34026     var multi = selectedIDs.length === 1 ? "single" : "multiple";
34027     var nodes = utilGetAllNodes(selectedIDs, context.graph());
34028     var coords = nodes.map(function(n2) {
34029       return n2.loc;
34030     });
34031     var extent = utilTotalExtent(selectedIDs, context.graph());
34032     var operation = function() {
34033       context.enter(modeMove(context, selectedIDs));
34034     };
34035     operation.available = function() {
34036       return selectedIDs.length > 0;
34037     };
34038     operation.disabled = function() {
34039       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
34040         return "too_large";
34041       } else if (someMissing()) {
34042         return "not_downloaded";
34043       } else if (selectedIDs.some(context.hasHiddenConnections)) {
34044         return "connected_to_hidden";
34045       } else if (selectedIDs.some(incompleteRelation)) {
34046         return "incomplete_relation";
34047       }
34048       return false;
34049       function someMissing() {
34050         if (context.inIntro())
34051           return false;
34052         var osm = context.connection();
34053         if (osm) {
34054           var missing = coords.filter(function(loc) {
34055             return !osm.isDataLoaded(loc);
34056           });
34057           if (missing.length) {
34058             missing.forEach(function(loc) {
34059               context.loadTileAtLoc(loc);
34060             });
34061             return true;
34062           }
34063         }
34064         return false;
34065       }
34066       function incompleteRelation(id2) {
34067         var entity = context.entity(id2);
34068         return entity.type === "relation" && !entity.isComplete(context.graph());
34069       }
34070     };
34071     operation.tooltip = function() {
34072       var disable = operation.disabled();
34073       return disable ? _t.append("operations.move." + disable + "." + multi) : _t.append("operations.move.description." + multi);
34074     };
34075     operation.annotation = function() {
34076       return selectedIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.move.annotation.feature", { n: selectedIDs.length });
34077     };
34078     operation.id = "move";
34079     operation.keys = [_t("operations.move.key")];
34080     operation.title = _t.append("operations.move.title");
34081     operation.behavior = behaviorOperation(context).which(operation);
34082     operation.mouseOnly = true;
34083     return operation;
34084   }
34085
34086   // modules/modes/rotate.js
34087   function modeRotate(context, entityIDs) {
34088     var _tolerancePx = 4;
34089     var mode = {
34090       id: "rotate",
34091       button: "browse"
34092     };
34093     var keybinding = utilKeybinding("rotate");
34094     var behaviors = [
34095       behaviorEdit(context),
34096       operationCircularize(context, entityIDs).behavior,
34097       operationDelete(context, entityIDs).behavior,
34098       operationMove(context, entityIDs).behavior,
34099       operationOrthogonalize(context, entityIDs).behavior,
34100       operationReflectLong(context, entityIDs).behavior,
34101       operationReflectShort(context, entityIDs).behavior
34102     ];
34103     var annotation = entityIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.rotate.annotation.feature", { n: entityIDs.length });
34104     var _prevGraph;
34105     var _prevAngle;
34106     var _prevTransform;
34107     var _pivot;
34108     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
34109     function doRotate(d3_event) {
34110       var fn;
34111       if (context.graph() !== _prevGraph) {
34112         fn = context.perform;
34113       } else {
34114         fn = context.replace;
34115       }
34116       var projection2 = context.projection;
34117       var currTransform = projection2.transform();
34118       if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) {
34119         var nodes = utilGetAllNodes(entityIDs, context.graph());
34120         var points = nodes.map(function(n2) {
34121           return projection2(n2.loc);
34122         });
34123         _pivot = getPivot(points);
34124         _prevAngle = void 0;
34125       }
34126       var currMouse = context.map().mouse(d3_event);
34127       var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
34128       if (typeof _prevAngle === "undefined")
34129         _prevAngle = currAngle;
34130       var delta = currAngle - _prevAngle;
34131       fn(actionRotate(entityIDs, _pivot, delta, projection2));
34132       _prevTransform = currTransform;
34133       _prevAngle = currAngle;
34134       _prevGraph = context.graph();
34135     }
34136     function getPivot(points) {
34137       var _pivot2;
34138       if (points.length === 1) {
34139         _pivot2 = points[0];
34140       } else if (points.length === 2) {
34141         _pivot2 = geoVecInterp(points[0], points[1], 0.5);
34142       } else {
34143         var polygonHull = hull_default(points);
34144         if (polygonHull.length === 2) {
34145           _pivot2 = geoVecInterp(points[0], points[1], 0.5);
34146         } else {
34147           _pivot2 = centroid_default2(hull_default(points));
34148         }
34149       }
34150       return _pivot2;
34151     }
34152     function finish(d3_event) {
34153       d3_event.stopPropagation();
34154       context.replace(actionNoop(), annotation);
34155       context.enter(modeSelect(context, entityIDs));
34156     }
34157     function cancel() {
34158       if (_prevGraph)
34159         context.pop();
34160       context.enter(modeSelect(context, entityIDs));
34161     }
34162     function undone() {
34163       context.enter(modeBrowse(context));
34164     }
34165     mode.enter = function() {
34166       _prevGraph = null;
34167       context.features().forceVisible(entityIDs);
34168       behaviors.forEach(context.install);
34169       var downEvent;
34170       context.surface().on(_pointerPrefix + "down.modeRotate", function(d3_event) {
34171         downEvent = d3_event;
34172       });
34173       select_default2(window).on(_pointerPrefix + "move.modeRotate", doRotate, true).on(_pointerPrefix + "up.modeRotate", function(d3_event) {
34174         if (!downEvent)
34175           return;
34176         var mapNode = context.container().select(".main-map").node();
34177         var pointGetter = utilFastMouse(mapNode);
34178         var p1 = pointGetter(downEvent);
34179         var p2 = pointGetter(d3_event);
34180         var dist = geoVecLength(p1, p2);
34181         if (dist <= _tolerancePx)
34182           finish(d3_event);
34183         downEvent = null;
34184       }, true);
34185       context.history().on("undone.modeRotate", undone);
34186       keybinding.on("\u238B", cancel).on("\u21A9", finish);
34187       select_default2(document).call(keybinding);
34188     };
34189     mode.exit = function() {
34190       behaviors.forEach(context.uninstall);
34191       context.surface().on(_pointerPrefix + "down.modeRotate", null);
34192       select_default2(window).on(_pointerPrefix + "move.modeRotate", null, true).on(_pointerPrefix + "up.modeRotate", null, true);
34193       context.history().on("undone.modeRotate", null);
34194       select_default2(document).call(keybinding.unbind);
34195       context.features().forceVisible([]);
34196     };
34197     mode.selectedIDs = function() {
34198       if (!arguments.length)
34199         return entityIDs;
34200       return mode;
34201     };
34202     return mode;
34203   }
34204
34205   // modules/operations/rotate.js
34206   function operationRotate(context, selectedIDs) {
34207     var multi = selectedIDs.length === 1 ? "single" : "multiple";
34208     var nodes = utilGetAllNodes(selectedIDs, context.graph());
34209     var coords = nodes.map(function(n2) {
34210       return n2.loc;
34211     });
34212     var extent = utilTotalExtent(selectedIDs, context.graph());
34213     var operation = function() {
34214       context.enter(modeRotate(context, selectedIDs));
34215     };
34216     operation.available = function() {
34217       return nodes.length >= 2;
34218     };
34219     operation.disabled = function() {
34220       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
34221         return "too_large";
34222       } else if (someMissing()) {
34223         return "not_downloaded";
34224       } else if (selectedIDs.some(context.hasHiddenConnections)) {
34225         return "connected_to_hidden";
34226       } else if (selectedIDs.some(incompleteRelation)) {
34227         return "incomplete_relation";
34228       }
34229       return false;
34230       function someMissing() {
34231         if (context.inIntro())
34232           return false;
34233         var osm = context.connection();
34234         if (osm) {
34235           var missing = coords.filter(function(loc) {
34236             return !osm.isDataLoaded(loc);
34237           });
34238           if (missing.length) {
34239             missing.forEach(function(loc) {
34240               context.loadTileAtLoc(loc);
34241             });
34242             return true;
34243           }
34244         }
34245         return false;
34246       }
34247       function incompleteRelation(id2) {
34248         var entity = context.entity(id2);
34249         return entity.type === "relation" && !entity.isComplete(context.graph());
34250       }
34251     };
34252     operation.tooltip = function() {
34253       var disable = operation.disabled();
34254       return disable ? _t.append("operations.rotate." + disable + "." + multi) : _t.append("operations.rotate.description." + multi);
34255     };
34256     operation.annotation = function() {
34257       return selectedIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.rotate.annotation.feature", { n: selectedIDs.length });
34258     };
34259     operation.id = "rotate";
34260     operation.keys = [_t("operations.rotate.key")];
34261     operation.title = _t.append("operations.rotate.title");
34262     operation.behavior = behaviorOperation(context).which(operation);
34263     operation.mouseOnly = true;
34264     return operation;
34265   }
34266
34267   // modules/modes/move.js
34268   function modeMove(context, entityIDs, baseGraph) {
34269     var _tolerancePx = 4;
34270     var mode = {
34271       id: "move",
34272       button: "browse"
34273     };
34274     var keybinding = utilKeybinding("move");
34275     var behaviors = [
34276       behaviorEdit(context),
34277       operationCircularize(context, entityIDs).behavior,
34278       operationDelete(context, entityIDs).behavior,
34279       operationOrthogonalize(context, entityIDs).behavior,
34280       operationReflectLong(context, entityIDs).behavior,
34281       operationReflectShort(context, entityIDs).behavior,
34282       operationRotate(context, entityIDs).behavior
34283     ];
34284     var annotation = entityIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.move.annotation.feature", { n: entityIDs.length });
34285     var _prevGraph;
34286     var _cache4;
34287     var _origin;
34288     var _nudgeInterval;
34289     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
34290     function doMove(nudge) {
34291       nudge = nudge || [0, 0];
34292       var fn;
34293       if (_prevGraph !== context.graph()) {
34294         _cache4 = {};
34295         _origin = context.map().mouseCoordinates();
34296         fn = context.perform;
34297       } else {
34298         fn = context.overwrite;
34299       }
34300       var currMouse = context.map().mouse();
34301       var origMouse = context.projection(_origin);
34302       var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
34303       fn(actionMove(entityIDs, delta, context.projection, _cache4));
34304       _prevGraph = context.graph();
34305     }
34306     function startNudge(nudge) {
34307       if (_nudgeInterval)
34308         window.clearInterval(_nudgeInterval);
34309       _nudgeInterval = window.setInterval(function() {
34310         context.map().pan(nudge);
34311         doMove(nudge);
34312       }, 50);
34313     }
34314     function stopNudge() {
34315       if (_nudgeInterval) {
34316         window.clearInterval(_nudgeInterval);
34317         _nudgeInterval = null;
34318       }
34319     }
34320     function move() {
34321       doMove();
34322       var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions());
34323       if (nudge) {
34324         startNudge(nudge);
34325       } else {
34326         stopNudge();
34327       }
34328     }
34329     function finish(d3_event) {
34330       d3_event.stopPropagation();
34331       context.replace(actionNoop(), annotation);
34332       context.enter(modeSelect(context, entityIDs));
34333       stopNudge();
34334     }
34335     function cancel() {
34336       if (baseGraph) {
34337         while (context.graph() !== baseGraph)
34338           context.pop();
34339         context.enter(modeBrowse(context));
34340       } else {
34341         if (_prevGraph)
34342           context.pop();
34343         context.enter(modeSelect(context, entityIDs));
34344       }
34345       stopNudge();
34346     }
34347     function undone() {
34348       context.enter(modeBrowse(context));
34349     }
34350     mode.enter = function() {
34351       _origin = context.map().mouseCoordinates();
34352       _prevGraph = null;
34353       _cache4 = {};
34354       context.features().forceVisible(entityIDs);
34355       behaviors.forEach(context.install);
34356       var downEvent;
34357       context.surface().on(_pointerPrefix + "down.modeMove", function(d3_event) {
34358         downEvent = d3_event;
34359       });
34360       select_default2(window).on(_pointerPrefix + "move.modeMove", move, true).on(_pointerPrefix + "up.modeMove", function(d3_event) {
34361         if (!downEvent)
34362           return;
34363         var mapNode = context.container().select(".main-map").node();
34364         var pointGetter = utilFastMouse(mapNode);
34365         var p1 = pointGetter(downEvent);
34366         var p2 = pointGetter(d3_event);
34367         var dist = geoVecLength(p1, p2);
34368         if (dist <= _tolerancePx)
34369           finish(d3_event);
34370         downEvent = null;
34371       }, true);
34372       context.history().on("undone.modeMove", undone);
34373       keybinding.on("\u238B", cancel).on("\u21A9", finish);
34374       select_default2(document).call(keybinding);
34375     };
34376     mode.exit = function() {
34377       stopNudge();
34378       behaviors.forEach(function(behavior) {
34379         context.uninstall(behavior);
34380       });
34381       context.surface().on(_pointerPrefix + "down.modeMove", null);
34382       select_default2(window).on(_pointerPrefix + "move.modeMove", null, true).on(_pointerPrefix + "up.modeMove", null, true);
34383       context.history().on("undone.modeMove", null);
34384       select_default2(document).call(keybinding.unbind);
34385       context.features().forceVisible([]);
34386     };
34387     mode.selectedIDs = function() {
34388       if (!arguments.length)
34389         return entityIDs;
34390       return mode;
34391     };
34392     return mode;
34393   }
34394
34395   // modules/behavior/paste.js
34396   function behaviorPaste(context) {
34397     function doPaste(d3_event) {
34398       if (!context.map().withinEditableZoom())
34399         return;
34400       d3_event.preventDefault();
34401       var baseGraph = context.graph();
34402       var mouse = context.map().mouse();
34403       var projection2 = context.projection;
34404       var viewport = geoExtent(projection2.clipExtent()).polygon();
34405       if (!geoPointInPolygon(mouse, viewport))
34406         return;
34407       var oldIDs = context.copyIDs();
34408       if (!oldIDs.length)
34409         return;
34410       var extent = geoExtent();
34411       var oldGraph = context.copyGraph();
34412       var newIDs = [];
34413       var action = actionCopyEntities(oldIDs, oldGraph);
34414       context.perform(action);
34415       var copies = action.copies();
34416       var originals = /* @__PURE__ */ new Set();
34417       Object.values(copies).forEach(function(entity) {
34418         originals.add(entity.id);
34419       });
34420       for (var id2 in copies) {
34421         var oldEntity = oldGraph.entity(id2);
34422         var newEntity = copies[id2];
34423         extent._extend(oldEntity.extent(oldGraph));
34424         var parents = context.graph().parentWays(newEntity);
34425         var parentCopied = parents.some(function(parent) {
34426           return originals.has(parent.id);
34427         });
34428         if (!parentCopied) {
34429           newIDs.push(newEntity.id);
34430         }
34431       }
34432       var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center());
34433       var delta = geoVecSubtract(mouse, copyPoint);
34434       context.perform(actionMove(newIDs, delta, projection2));
34435       context.enter(modeMove(context, newIDs, baseGraph));
34436     }
34437     function behavior() {
34438       context.keybinding().on(uiCmd("\u2318V"), doPaste);
34439       return behavior;
34440     }
34441     behavior.off = function() {
34442       context.keybinding().off(uiCmd("\u2318V"));
34443     };
34444     return behavior;
34445   }
34446
34447   // modules/behavior/drag.js
34448   function behaviorDrag() {
34449     var dispatch10 = dispatch_default("start", "move", "end");
34450     var _tolerancePx = 1;
34451     var _penTolerancePx = 4;
34452     var _origin = null;
34453     var _selector = "";
34454     var _targetNode;
34455     var _targetEntity;
34456     var _surface;
34457     var _pointerId;
34458     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
34459     var d3_event_userSelectProperty = utilPrefixCSSProperty("UserSelect");
34460     var d3_event_userSelectSuppress = function() {
34461       var selection2 = selection_default();
34462       var select = selection2.style(d3_event_userSelectProperty);
34463       selection2.style(d3_event_userSelectProperty, "none");
34464       return function() {
34465         selection2.style(d3_event_userSelectProperty, select);
34466       };
34467     };
34468     function pointerdown(d3_event) {
34469       if (_pointerId)
34470         return;
34471       _pointerId = d3_event.pointerId || "mouse";
34472       _targetNode = this;
34473       var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode);
34474       var offset;
34475       var startOrigin = pointerLocGetter(d3_event);
34476       var started = false;
34477       var selectEnable = d3_event_userSelectSuppress();
34478       select_default2(window).on(_pointerPrefix + "move.drag", pointermove).on(_pointerPrefix + "up.drag pointercancel.drag", pointerup, true);
34479       if (_origin) {
34480         offset = _origin.call(_targetNode, _targetEntity);
34481         offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
34482       } else {
34483         offset = [0, 0];
34484       }
34485       d3_event.stopPropagation();
34486       function pointermove(d3_event2) {
34487         if (_pointerId !== (d3_event2.pointerId || "mouse"))
34488           return;
34489         var p = pointerLocGetter(d3_event2);
34490         if (!started) {
34491           var dist = geoVecLength(startOrigin, p);
34492           var tolerance = d3_event2.pointerType === "pen" ? _penTolerancePx : _tolerancePx;
34493           if (dist < tolerance)
34494             return;
34495           started = true;
34496           dispatch10.call("start", this, d3_event2, _targetEntity);
34497         } else {
34498           startOrigin = p;
34499           d3_event2.stopPropagation();
34500           d3_event2.preventDefault();
34501           var dx = p[0] - startOrigin[0];
34502           var dy = p[1] - startOrigin[1];
34503           dispatch10.call("move", this, d3_event2, _targetEntity, [p[0] + offset[0], p[1] + offset[1]], [dx, dy]);
34504         }
34505       }
34506       function pointerup(d3_event2) {
34507         if (_pointerId !== (d3_event2.pointerId || "mouse"))
34508           return;
34509         _pointerId = null;
34510         if (started) {
34511           dispatch10.call("end", this, d3_event2, _targetEntity);
34512           d3_event2.preventDefault();
34513         }
34514         select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null);
34515         selectEnable();
34516       }
34517     }
34518     function behavior(selection2) {
34519       var matchesSelector = utilPrefixDOMProperty("matchesSelector");
34520       var delegate = pointerdown;
34521       if (_selector) {
34522         delegate = function(d3_event) {
34523           var root3 = this;
34524           var target = d3_event.target;
34525           for (; target && target !== root3; target = target.parentNode) {
34526             var datum2 = target.__data__;
34527             _targetEntity = datum2 instanceof osmNote ? datum2 : datum2 && datum2.properties && datum2.properties.entity;
34528             if (_targetEntity && target[matchesSelector](_selector)) {
34529               return pointerdown.call(target, d3_event);
34530             }
34531           }
34532         };
34533       }
34534       selection2.on(_pointerPrefix + "down.drag" + _selector, delegate);
34535     }
34536     behavior.off = function(selection2) {
34537       selection2.on(_pointerPrefix + "down.drag" + _selector, null);
34538     };
34539     behavior.selector = function(_) {
34540       if (!arguments.length)
34541         return _selector;
34542       _selector = _;
34543       return behavior;
34544     };
34545     behavior.origin = function(_) {
34546       if (!arguments.length)
34547         return _origin;
34548       _origin = _;
34549       return behavior;
34550     };
34551     behavior.cancel = function() {
34552       select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null);
34553       return behavior;
34554     };
34555     behavior.targetNode = function(_) {
34556       if (!arguments.length)
34557         return _targetNode;
34558       _targetNode = _;
34559       return behavior;
34560     };
34561     behavior.targetEntity = function(_) {
34562       if (!arguments.length)
34563         return _targetEntity;
34564       _targetEntity = _;
34565       return behavior;
34566     };
34567     behavior.surface = function(_) {
34568       if (!arguments.length)
34569         return _surface;
34570       _surface = _;
34571       return behavior;
34572     };
34573     return utilRebind(behavior, dispatch10, "on");
34574   }
34575
34576   // modules/modes/drag_node.js
34577   function modeDragNode(context) {
34578     var mode = {
34579       id: "drag-node",
34580       button: "browse"
34581     };
34582     var hover = behaviorHover(context).altDisables(true).on("hover", context.ui().sidebar.hover);
34583     var edit2 = behaviorEdit(context);
34584     var _nudgeInterval;
34585     var _restoreSelectedIDs = [];
34586     var _wasMidpoint = false;
34587     var _isCancelled = false;
34588     var _activeEntity;
34589     var _startLoc;
34590     var _lastLoc;
34591     function startNudge(d3_event, entity, nudge) {
34592       if (_nudgeInterval)
34593         window.clearInterval(_nudgeInterval);
34594       _nudgeInterval = window.setInterval(function() {
34595         context.map().pan(nudge);
34596         doMove(d3_event, entity, nudge);
34597       }, 50);
34598     }
34599     function stopNudge() {
34600       if (_nudgeInterval) {
34601         window.clearInterval(_nudgeInterval);
34602         _nudgeInterval = null;
34603       }
34604     }
34605     function moveAnnotation(entity) {
34606       return _t("operations.move.annotation." + entity.geometry(context.graph()));
34607     }
34608     function connectAnnotation(nodeEntity, targetEntity) {
34609       var nodeGeometry = nodeEntity.geometry(context.graph());
34610       var targetGeometry = targetEntity.geometry(context.graph());
34611       if (nodeGeometry === "vertex" && targetGeometry === "vertex") {
34612         var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
34613         var targetParentWayIDs = context.graph().parentWays(targetEntity);
34614         var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
34615         if (sharedParentWays.length !== 0) {
34616           if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
34617             return _t("operations.connect.annotation.from_vertex.to_adjacent_vertex");
34618           }
34619           return _t("operations.connect.annotation.from_vertex.to_sibling_vertex");
34620         }
34621       }
34622       return _t("operations.connect.annotation.from_" + nodeGeometry + ".to_" + targetGeometry);
34623     }
34624     function shouldSnapToNode(target) {
34625       if (!_activeEntity)
34626         return false;
34627       return _activeEntity.geometry(context.graph()) !== "vertex" || (target.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(target, context.graph()));
34628     }
34629     function origin(entity) {
34630       return context.projection(entity.loc);
34631     }
34632     function keydown(d3_event) {
34633       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
34634         if (context.surface().classed("nope")) {
34635           context.surface().classed("nope-suppressed", true);
34636         }
34637         context.surface().classed("nope", false).classed("nope-disabled", true);
34638       }
34639     }
34640     function keyup(d3_event) {
34641       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
34642         if (context.surface().classed("nope-suppressed")) {
34643           context.surface().classed("nope", true);
34644         }
34645         context.surface().classed("nope-suppressed", false).classed("nope-disabled", false);
34646       }
34647     }
34648     function start2(d3_event, entity) {
34649       _wasMidpoint = entity.type === "midpoint";
34650       var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
34651       _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden;
34652       if (_isCancelled) {
34653         if (hasHidden) {
34654           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("modes.drag_node.connected_to_hidden"))();
34655         }
34656         return drag.cancel();
34657       }
34658       if (_wasMidpoint) {
34659         var midpoint = entity;
34660         entity = osmNode();
34661         context.perform(actionAddMidpoint(midpoint, entity));
34662         entity = context.entity(entity.id);
34663         var vertex = context.surface().selectAll("." + entity.id);
34664         drag.targetNode(vertex.node()).targetEntity(entity);
34665       } else {
34666         context.perform(actionNoop());
34667       }
34668       _activeEntity = entity;
34669       _startLoc = entity.loc;
34670       hover.ignoreVertex(entity.geometry(context.graph()) === "vertex");
34671       context.surface().selectAll("." + _activeEntity.id).classed("active", true);
34672       context.enter(mode);
34673     }
34674     function datum2(d3_event) {
34675       if (!d3_event || d3_event.altKey) {
34676         return {};
34677       } else {
34678         var d = d3_event.target.__data__;
34679         return d && d.properties && d.properties.target ? d : {};
34680       }
34681     }
34682     function doMove(d3_event, entity, nudge) {
34683       nudge = nudge || [0, 0];
34684       var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
34685       var currMouse = geoVecSubtract(currPoint, nudge);
34686       var loc = context.projection.invert(currMouse);
34687       var target, edge;
34688       if (!_nudgeInterval) {
34689         var d = datum2(d3_event);
34690         target = d && d.properties && d.properties.entity;
34691         var targetLoc = target && target.loc;
34692         var targetNodes = d && d.properties && d.properties.nodes;
34693         if (targetLoc) {
34694           if (shouldSnapToNode(target)) {
34695             loc = targetLoc;
34696           }
34697         } else if (targetNodes) {
34698           edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id);
34699           if (edge) {
34700             loc = edge.loc;
34701           }
34702         }
34703       }
34704       context.replace(
34705         actionMoveNode(entity.id, loc)
34706       );
34707       var isInvalid = false;
34708       if (target) {
34709         isInvalid = hasRelationConflict(entity, target, edge, context.graph());
34710       }
34711       if (!isInvalid) {
34712         isInvalid = hasInvalidGeometry(entity, context.graph());
34713       }
34714       var nope = context.surface().classed("nope");
34715       if (isInvalid === "relation" || isInvalid === "restriction") {
34716         if (!nope) {
34717           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(
34718             "operations.connect." + isInvalid,
34719             { relation: _mainPresetIndex.item("type/restriction").name() }
34720           ))();
34721         }
34722       } else if (isInvalid) {
34723         var errorID = isInvalid === "line" ? "lines" : "areas";
34724         context.ui().flash.duration(3e3).iconName("#iD-icon-no").label(_t.append("self_intersection.error." + errorID))();
34725       } else {
34726         if (nope) {
34727           context.ui().flash.duration(1).label("")();
34728         }
34729       }
34730       var nopeDisabled = context.surface().classed("nope-disabled");
34731       if (nopeDisabled) {
34732         context.surface().classed("nope", false).classed("nope-suppressed", isInvalid);
34733       } else {
34734         context.surface().classed("nope", isInvalid).classed("nope-suppressed", false);
34735       }
34736       _lastLoc = loc;
34737     }
34738     function hasRelationConflict(entity, target, edge, graph) {
34739       var testGraph = graph.update();
34740       if (edge) {
34741         var midpoint = osmNode();
34742         var action = actionAddMidpoint({
34743           loc: edge.loc,
34744           edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
34745         }, midpoint);
34746         testGraph = action(testGraph);
34747         target = midpoint;
34748       }
34749       var ids = [entity.id, target.id];
34750       return actionConnect(ids).disabled(testGraph);
34751     }
34752     function hasInvalidGeometry(entity, graph) {
34753       var parents = graph.parentWays(entity);
34754       var i2, j2, k;
34755       for (i2 = 0; i2 < parents.length; i2++) {
34756         var parent = parents[i2];
34757         var nodes = [];
34758         var activeIndex = null;
34759         var relations = graph.parentRelations(parent);
34760         for (j2 = 0; j2 < relations.length; j2++) {
34761           if (!relations[j2].isMultipolygon())
34762             continue;
34763           var rings = osmJoinWays(relations[j2].members, graph);
34764           for (k = 0; k < rings.length; k++) {
34765             nodes = rings[k].nodes;
34766             if (nodes.find(function(n2) {
34767               return n2.id === entity.id;
34768             })) {
34769               activeIndex = k;
34770               if (geoHasSelfIntersections(nodes, entity.id)) {
34771                 return "multipolygonMember";
34772               }
34773             }
34774             rings[k].coords = nodes.map(function(n2) {
34775               return n2.loc;
34776             });
34777           }
34778           for (k = 0; k < rings.length; k++) {
34779             if (k === activeIndex)
34780               continue;
34781             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
34782               return "multipolygonRing";
34783             }
34784           }
34785         }
34786         if (activeIndex === null) {
34787           nodes = parent.nodes.map(function(nodeID) {
34788             return graph.entity(nodeID);
34789           });
34790           if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
34791             return parent.geometry(graph);
34792           }
34793         }
34794       }
34795       return false;
34796     }
34797     function move(d3_event, entity, point2) {
34798       if (_isCancelled)
34799         return;
34800       d3_event.stopPropagation();
34801       context.surface().classed("nope-disabled", d3_event.altKey);
34802       _lastLoc = context.projection.invert(point2);
34803       doMove(d3_event, entity);
34804       var nudge = geoViewportEdge(point2, context.map().dimensions());
34805       if (nudge) {
34806         startNudge(d3_event, entity, nudge);
34807       } else {
34808         stopNudge();
34809       }
34810     }
34811     function end(d3_event, entity) {
34812       if (_isCancelled)
34813         return;
34814       var wasPoint = entity.geometry(context.graph()) === "point";
34815       var d = datum2(d3_event);
34816       var nope = d && d.properties && d.properties.nope || context.surface().classed("nope");
34817       var target = d && d.properties && d.properties.entity;
34818       if (nope) {
34819         context.perform(
34820           _actionBounceBack(entity.id, _startLoc)
34821         );
34822       } else if (target && target.type === "way") {
34823         var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id);
34824         context.replace(
34825           actionAddMidpoint({
34826             loc: choice.loc,
34827             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
34828           }, entity),
34829           connectAnnotation(entity, target)
34830         );
34831       } else if (target && target.type === "node" && shouldSnapToNode(target)) {
34832         context.replace(
34833           actionConnect([target.id, entity.id]),
34834           connectAnnotation(entity, target)
34835         );
34836       } else if (_wasMidpoint) {
34837         context.replace(
34838           actionNoop(),
34839           _t("operations.add.annotation.vertex")
34840         );
34841       } else {
34842         context.replace(
34843           actionNoop(),
34844           moveAnnotation(entity)
34845         );
34846       }
34847       if (wasPoint) {
34848         context.enter(modeSelect(context, [entity.id]));
34849       } else {
34850         var reselection = _restoreSelectedIDs.filter(function(id2) {
34851           return context.graph().hasEntity(id2);
34852         });
34853         if (reselection.length) {
34854           context.enter(modeSelect(context, reselection));
34855         } else {
34856           context.enter(modeBrowse(context));
34857         }
34858       }
34859     }
34860     function _actionBounceBack(nodeID, toLoc) {
34861       var moveNode = actionMoveNode(nodeID, toLoc);
34862       var action = function(graph, t) {
34863         if (t === 1)
34864           context.pop();
34865         return moveNode(graph, t);
34866       };
34867       action.transitionable = true;
34868       return action;
34869     }
34870     function cancel() {
34871       drag.cancel();
34872       context.enter(modeBrowse(context));
34873     }
34874     var drag = behaviorDrag().selector(".layer-touch.points .target").surface(context.container().select(".main-map").node()).origin(origin).on("start", start2).on("move", move).on("end", end);
34875     mode.enter = function() {
34876       context.install(hover);
34877       context.install(edit2);
34878       select_default2(window).on("keydown.dragNode", keydown).on("keyup.dragNode", keyup);
34879       context.history().on("undone.drag-node", cancel);
34880     };
34881     mode.exit = function() {
34882       context.ui().sidebar.hover.cancel();
34883       context.uninstall(hover);
34884       context.uninstall(edit2);
34885       select_default2(window).on("keydown.dragNode", null).on("keyup.dragNode", null);
34886       context.history().on("undone.drag-node", null);
34887       _activeEntity = null;
34888       context.surface().classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false).selectAll(".active").classed("active", false);
34889       stopNudge();
34890     };
34891     mode.selectedIDs = function() {
34892       if (!arguments.length)
34893         return _activeEntity ? [_activeEntity.id] : [];
34894       return mode;
34895     };
34896     mode.activeID = function() {
34897       if (!arguments.length)
34898         return _activeEntity && _activeEntity.id;
34899       return mode;
34900     };
34901     mode.restoreSelectedIDs = function(_) {
34902       if (!arguments.length)
34903         return _restoreSelectedIDs;
34904       _restoreSelectedIDs = _;
34905       return mode;
34906     };
34907     mode.behavior = drag;
34908     return mode;
34909   }
34910
34911   // modules/services/keepRight.js
34912   var import_rbush = __toESM(require_rbush_min());
34913
34914   // node_modules/d3-fetch/src/text.js
34915   function responseText(response) {
34916     if (!response.ok)
34917       throw new Error(response.status + " " + response.statusText);
34918     return response.text();
34919   }
34920   function text_default3(input, init2) {
34921     return fetch(input, init2).then(responseText);
34922   }
34923
34924   // node_modules/d3-fetch/src/json.js
34925   function responseJson(response) {
34926     if (!response.ok)
34927       throw new Error(response.status + " " + response.statusText);
34928     if (response.status === 204 || response.status === 205)
34929       return;
34930     return response.json();
34931   }
34932   function json_default(input, init2) {
34933     return fetch(input, init2).then(responseJson);
34934   }
34935
34936   // node_modules/d3-fetch/src/xml.js
34937   function parser(type2) {
34938     return (input, init2) => text_default3(input, init2).then((text2) => new DOMParser().parseFromString(text2, type2));
34939   }
34940   var xml_default = parser("application/xml");
34941   var html = parser("text/html");
34942   var svg = parser("image/svg+xml");
34943
34944   // modules/services/keepRight.js
34945   var tiler = utilTiler();
34946   var dispatch2 = dispatch_default("loaded");
34947   var _tileZoom = 14;
34948   var _krUrlRoot = "https://www.keepright.at";
34949   var _krData = { errorTypes: {}, localizeStrings: {} };
34950   var _cache;
34951   var _krRuleset = [
34952     // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
34953     30,
34954     40,
34955     50,
34956     60,
34957     70,
34958     90,
34959     100,
34960     110,
34961     120,
34962     130,
34963     150,
34964     160,
34965     170,
34966     180,
34967     190,
34968     191,
34969     192,
34970     193,
34971     194,
34972     195,
34973     196,
34974     197,
34975     198,
34976     200,
34977     201,
34978     202,
34979     203,
34980     204,
34981     205,
34982     206,
34983     207,
34984     208,
34985     210,
34986     220,
34987     230,
34988     231,
34989     232,
34990     270,
34991     280,
34992     281,
34993     282,
34994     283,
34995     284,
34996     285,
34997     290,
34998     291,
34999     292,
35000     293,
35001     294,
35002     295,
35003     296,
35004     297,
35005     298,
35006     300,
35007     310,
35008     311,
35009     312,
35010     313,
35011     320,
35012     350,
35013     360,
35014     370,
35015     380,
35016     390,
35017     400,
35018     401,
35019     402,
35020     410,
35021     411,
35022     412,
35023     413
35024   ];
35025   function abortRequest(controller) {
35026     if (controller) {
35027       controller.abort();
35028     }
35029   }
35030   function abortUnwantedRequests(cache, tiles) {
35031     Object.keys(cache.inflightTile).forEach((k) => {
35032       const wanted = tiles.find((tile) => k === tile.id);
35033       if (!wanted) {
35034         abortRequest(cache.inflightTile[k]);
35035         delete cache.inflightTile[k];
35036       }
35037     });
35038   }
35039   function encodeIssueRtree(d) {
35040     return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
35041   }
35042   function updateRtree(item, replace) {
35043     _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id);
35044     if (replace) {
35045       _cache.rtree.insert(item);
35046     }
35047   }
35048   function tokenReplacements(d) {
35049     if (!(d instanceof QAItem))
35050       return;
35051     const replacements = {};
35052     const issueTemplate = _krData.errorTypes[d.whichType];
35053     if (!issueTemplate) {
35054       console.log("No Template: ", d.whichType);
35055       console.log("  ", d.description);
35056       return;
35057     }
35058     if (!issueTemplate.regex)
35059       return;
35060     const errorRegex = new RegExp(issueTemplate.regex, "i");
35061     const errorMatch = errorRegex.exec(d.description);
35062     if (!errorMatch) {
35063       console.log("Unmatched: ", d.whichType);
35064       console.log("  ", d.description);
35065       console.log("  ", errorRegex);
35066       return;
35067     }
35068     for (let i2 = 1; i2 < errorMatch.length; i2++) {
35069       let capture = errorMatch[i2];
35070       let idType;
35071       idType = "IDs" in issueTemplate ? issueTemplate.IDs[i2 - 1] : "";
35072       if (idType && capture) {
35073         capture = parseError(capture, idType);
35074       } else {
35075         const compare = capture.toLowerCase();
35076         if (_krData.localizeStrings[compare]) {
35077           capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]);
35078         } else {
35079           capture = unescape_default(capture);
35080         }
35081       }
35082       replacements["var" + i2] = capture;
35083     }
35084     return replacements;
35085   }
35086   function parseError(capture, idType) {
35087     const compare = capture.toLowerCase();
35088     if (_krData.localizeStrings[compare]) {
35089       capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]);
35090     }
35091     switch (idType) {
35092       case "this":
35093         capture = linkErrorObject2(capture);
35094         break;
35095       case "url":
35096         capture = linkURL(capture);
35097         break;
35098       case "n":
35099       case "w":
35100       case "r":
35101         capture = linkEntity2(idType + capture);
35102         break;
35103       case "20":
35104         capture = parse20(capture);
35105         break;
35106       case "211":
35107         capture = parse211(capture);
35108         break;
35109       case "231":
35110         capture = parse231(capture);
35111         break;
35112       case "294":
35113         capture = parse294(capture);
35114         break;
35115       case "370":
35116         capture = parse370(capture);
35117         break;
35118     }
35119     return capture;
35120     function linkErrorObject2(d) {
35121       return { html: `<a class="error_object_link">${d}</a>` };
35122     }
35123     function linkEntity2(d) {
35124       return { html: `<a class="error_entity_link">${d}</a>` };
35125     }
35126     function linkURL(d) {
35127       return { html: `<a class="kr_external_link" target="_blank" href="${d}">${d}</a>` };
35128     }
35129     function parse211(capture2) {
35130       let newList = [];
35131       const items = capture2.split(", ");
35132       items.forEach((item) => {
35133         let id2 = linkEntity2("n" + item.slice(1));
35134         newList.push(id2);
35135       });
35136       return newList.join(", ");
35137     }
35138     function parse231(capture2) {
35139       let newList = [];
35140       const items = capture2.split("),");
35141       items.forEach((item) => {
35142         const match = item.match(/\#(\d+)\((.+)\)?/);
35143         if (match !== null && match.length > 2) {
35144           newList.push(
35145             linkEntity2("w" + match[1]) + " " + _t("QA.keepRight.errorTypes.231.layer", { layer: match[2] })
35146           );
35147         }
35148       });
35149       return newList.join(", ");
35150     }
35151     function parse294(capture2) {
35152       let newList = [];
35153       const items = capture2.split(",");
35154       items.forEach((item) => {
35155         item = item.split(" ");
35156         const role = `"${item[0]}"`;
35157         const idType2 = item[1].slice(0, 1);
35158         let id2 = item[2].slice(1);
35159         id2 = linkEntity2(idType2 + id2);
35160         newList.push(`${role} ${item[1]} ${id2}`);
35161       });
35162       return newList.join(", ");
35163     }
35164     function parse370(capture2) {
35165       if (!capture2)
35166         return "";
35167       const match = capture2.match(/\(including the name (\'.+\')\)/);
35168       if (match && match.length) {
35169         return _t("QA.keepRight.errorTypes.370.including_the_name", { name: match[1] });
35170       }
35171       return "";
35172     }
35173     function parse20(capture2) {
35174       let newList = [];
35175       const items = capture2.split(",");
35176       items.forEach((item) => {
35177         const id2 = linkEntity2("n" + item.slice(1));
35178         newList.push(id2);
35179       });
35180       return newList.join(", ");
35181     }
35182   }
35183   var keepRight_default = {
35184     title: "keepRight",
35185     init() {
35186       _mainFileFetcher.get("keepRight").then((d) => _krData = d);
35187       if (!_cache) {
35188         this.reset();
35189       }
35190       this.event = utilRebind(this, dispatch2, "on");
35191     },
35192     reset() {
35193       if (_cache) {
35194         Object.values(_cache.inflightTile).forEach(abortRequest);
35195       }
35196       _cache = {
35197         data: {},
35198         loadedTile: {},
35199         inflightTile: {},
35200         inflightPost: {},
35201         closed: {},
35202         rtree: new import_rbush.default()
35203       };
35204     },
35205     // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
35206     loadIssues(projection2) {
35207       const options2 = {
35208         format: "geojson",
35209         ch: _krRuleset
35210       };
35211       const tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection2);
35212       abortUnwantedRequests(_cache, tiles);
35213       tiles.forEach((tile) => {
35214         if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id])
35215           return;
35216         const [left, top, right, bottom] = tile.extent.rectangle();
35217         const params = Object.assign({}, options2, { left, bottom, right, top });
35218         const url = `${_krUrlRoot}/export.php?` + utilQsString(params);
35219         const controller = new AbortController();
35220         _cache.inflightTile[tile.id] = controller;
35221         json_default(url, { signal: controller.signal }).then((data) => {
35222           delete _cache.inflightTile[tile.id];
35223           _cache.loadedTile[tile.id] = true;
35224           if (!data || !data.features || !data.features.length) {
35225             throw new Error("No Data");
35226           }
35227           data.features.forEach((feature3) => {
35228             const {
35229               properties: {
35230                 error_type: itemType,
35231                 error_id: id2,
35232                 comment = null,
35233                 object_id: objectId,
35234                 object_type: objectType,
35235                 schema,
35236                 title
35237               }
35238             } = feature3;
35239             let {
35240               geometry: { coordinates: loc },
35241               properties: { description = "" }
35242             } = feature3;
35243             const issueTemplate = _krData.errorTypes[itemType];
35244             const parentIssueType = (Math.floor(itemType / 10) * 10).toString();
35245             const whichType = issueTemplate ? itemType : parentIssueType;
35246             const whichTemplate = _krData.errorTypes[whichType];
35247             switch (whichType) {
35248               case "170":
35249                 description = `This feature has a FIXME tag: ${description}`;
35250                 break;
35251               case "292":
35252               case "293":
35253                 description = description.replace("A turn-", "This turn-");
35254                 break;
35255               case "294":
35256               case "295":
35257               case "296":
35258               case "297":
35259               case "298":
35260                 description = `This turn-restriction~${description}`;
35261                 break;
35262               case "300":
35263                 description = "This highway is missing a maxspeed tag";
35264                 break;
35265               case "411":
35266               case "412":
35267               case "413":
35268                 description = `This feature~${description}`;
35269                 break;
35270             }
35271             let coincident = false;
35272             do {
35273               let delta = coincident ? [1e-5, 0] : [0, 1e-5];
35274               loc = geoVecAdd(loc, delta);
35275               let bbox2 = geoExtent(loc).bbox();
35276               coincident = _cache.rtree.search(bbox2).length;
35277             } while (coincident);
35278             let d = new QAItem(loc, this, itemType, id2, {
35279               comment,
35280               description,
35281               whichType,
35282               parentIssueType,
35283               severity: whichTemplate.severity || "error",
35284               objectId,
35285               objectType,
35286               schema,
35287               title
35288             });
35289             d.replacements = tokenReplacements(d);
35290             _cache.data[id2] = d;
35291             _cache.rtree.insert(encodeIssueRtree(d));
35292           });
35293           dispatch2.call("loaded");
35294         }).catch(() => {
35295           delete _cache.inflightTile[tile.id];
35296           _cache.loadedTile[tile.id] = true;
35297         });
35298       });
35299     },
35300     postUpdate(d, callback) {
35301       if (_cache.inflightPost[d.id]) {
35302         return callback({ message: "Error update already inflight", status: -2 }, d);
35303       }
35304       const params = { schema: d.schema, id: d.id };
35305       if (d.newStatus) {
35306         params.st = d.newStatus;
35307       }
35308       if (d.newComment !== void 0) {
35309         params.co = d.newComment;
35310       }
35311       const url = `${_krUrlRoot}/comment.php?` + utilQsString(params);
35312       const controller = new AbortController();
35313       _cache.inflightPost[d.id] = controller;
35314       json_default(url, { signal: controller.signal }).finally(() => {
35315         delete _cache.inflightPost[d.id];
35316         if (d.newStatus === "ignore") {
35317           this.removeItem(d);
35318         } else if (d.newStatus === "ignore_t") {
35319           this.removeItem(d);
35320           _cache.closed[`${d.schema}:${d.id}`] = true;
35321         } else {
35322           d = this.replaceItem(d.update({
35323             comment: d.newComment,
35324             newComment: void 0,
35325             newState: void 0
35326           }));
35327         }
35328         if (callback)
35329           callback(null, d);
35330       });
35331     },
35332     // Get all cached QAItems covering the viewport
35333     getItems(projection2) {
35334       const viewport = projection2.clipExtent();
35335       const min3 = [viewport[0][0], viewport[1][1]];
35336       const max3 = [viewport[1][0], viewport[0][1]];
35337       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
35338       return _cache.rtree.search(bbox2).map((d) => d.data);
35339     },
35340     // Get a QAItem from cache
35341     // NOTE: Don't change method name until UI v3 is merged
35342     getError(id2) {
35343       return _cache.data[id2];
35344     },
35345     // Replace a single QAItem in the cache
35346     replaceItem(item) {
35347       if (!(item instanceof QAItem) || !item.id)
35348         return;
35349       _cache.data[item.id] = item;
35350       updateRtree(encodeIssueRtree(item), true);
35351       return item;
35352     },
35353     // Remove a single QAItem from the cache
35354     removeItem(item) {
35355       if (!(item instanceof QAItem) || !item.id)
35356         return;
35357       delete _cache.data[item.id];
35358       updateRtree(encodeIssueRtree(item), false);
35359     },
35360     issueURL(item) {
35361       return `${_krUrlRoot}/report_map.php?schema=${item.schema}&error=${item.id}`;
35362     },
35363     // Get an array of issues closed during this session.
35364     // Used to populate `closed:keepright` changeset tag
35365     getClosedIDs() {
35366       return Object.keys(_cache.closed).sort();
35367     }
35368   };
35369
35370   // modules/services/improveOSM.js
35371   var import_rbush2 = __toESM(require_rbush_min());
35372   var tiler2 = utilTiler();
35373   var dispatch3 = dispatch_default("loaded");
35374   var _tileZoom2 = 14;
35375   var _impOsmUrls = {
35376     ow: "https://grab.community.improve-osm.org/directionOfFlowService",
35377     mr: "https://grab.community.improve-osm.org/missingGeoService",
35378     tr: "https://grab.community.improve-osm.org/turnRestrictionService"
35379   };
35380   var _impOsmData = { icons: {} };
35381   var _cache2;
35382   function abortRequest2(i2) {
35383     Object.values(i2).forEach((controller) => {
35384       if (controller) {
35385         controller.abort();
35386       }
35387     });
35388   }
35389   function abortUnwantedRequests2(cache, tiles) {
35390     Object.keys(cache.inflightTile).forEach((k) => {
35391       const wanted = tiles.find((tile) => k === tile.id);
35392       if (!wanted) {
35393         abortRequest2(cache.inflightTile[k]);
35394         delete cache.inflightTile[k];
35395       }
35396     });
35397   }
35398   function encodeIssueRtree2(d) {
35399     return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
35400   }
35401   function updateRtree2(item, replace) {
35402     _cache2.rtree.remove(item, (a, b) => a.data.id === b.data.id);
35403     if (replace) {
35404       _cache2.rtree.insert(item);
35405     }
35406   }
35407   function linkErrorObject(d) {
35408     return { html: `<a class="error_object_link">${d}</a>` };
35409   }
35410   function linkEntity(d) {
35411     return { html: `<a class="error_entity_link">${d}</a>` };
35412   }
35413   function pointAverage(points) {
35414     if (points.length) {
35415       const sum = points.reduce(
35416         (acc, point2) => geoVecAdd(acc, [point2.lon, point2.lat]),
35417         [0, 0]
35418       );
35419       return geoVecScale(sum, 1 / points.length);
35420     } else {
35421       return [0, 0];
35422     }
35423   }
35424   function relativeBearing(p1, p2) {
35425     let angle2 = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
35426     if (angle2 < 0) {
35427       angle2 += 2 * Math.PI;
35428     }
35429     return angle2 * 180 / Math.PI;
35430   }
35431   function cardinalDirection(bearing) {
35432     const dir = 45 * Math.round(bearing / 45);
35433     const compass = {
35434       0: "north",
35435       45: "northeast",
35436       90: "east",
35437       135: "southeast",
35438       180: "south",
35439       225: "southwest",
35440       270: "west",
35441       315: "northwest",
35442       360: "north"
35443     };
35444     return _t(`QA.improveOSM.directions.${compass[dir]}`);
35445   }
35446   function preventCoincident(loc, bumpUp) {
35447     let coincident = false;
35448     do {
35449       let delta = coincident ? [1e-5, 0] : bumpUp ? [0, 1e-5] : [0, 0];
35450       loc = geoVecAdd(loc, delta);
35451       let bbox2 = geoExtent(loc).bbox();
35452       coincident = _cache2.rtree.search(bbox2).length;
35453     } while (coincident);
35454     return loc;
35455   }
35456   var improveOSM_default = {
35457     title: "improveOSM",
35458     init() {
35459       _mainFileFetcher.get("qa_data").then((d) => _impOsmData = d.improveOSM);
35460       if (!_cache2) {
35461         this.reset();
35462       }
35463       this.event = utilRebind(this, dispatch3, "on");
35464     },
35465     reset() {
35466       if (_cache2) {
35467         Object.values(_cache2.inflightTile).forEach(abortRequest2);
35468       }
35469       _cache2 = {
35470         data: {},
35471         loadedTile: {},
35472         inflightTile: {},
35473         inflightPost: {},
35474         closed: {},
35475         rtree: new import_rbush2.default()
35476       };
35477     },
35478     loadIssues(projection2) {
35479       const options2 = {
35480         client: "iD",
35481         status: "OPEN",
35482         zoom: "19"
35483         // Use a high zoom so that clusters aren't returned
35484       };
35485       const tiles = tiler2.zoomExtent([_tileZoom2, _tileZoom2]).getTiles(projection2);
35486       abortUnwantedRequests2(_cache2, tiles);
35487       tiles.forEach((tile) => {
35488         if (_cache2.loadedTile[tile.id] || _cache2.inflightTile[tile.id])
35489           return;
35490         const [east, north, west, south] = tile.extent.rectangle();
35491         const params = Object.assign({}, options2, { east, south, west, north });
35492         const requests = {};
35493         Object.keys(_impOsmUrls).forEach((k) => {
35494           const kParams = Object.assign(
35495             {},
35496             params,
35497             k === "mr" ? { type: "PARKING,ROAD,BOTH,PATH" } : { confidenceLevel: "C1" }
35498           );
35499           const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams);
35500           const controller = new AbortController();
35501           requests[k] = controller;
35502           json_default(url, { signal: controller.signal }).then((data) => {
35503             delete _cache2.inflightTile[tile.id][k];
35504             if (!Object.keys(_cache2.inflightTile[tile.id]).length) {
35505               delete _cache2.inflightTile[tile.id];
35506               _cache2.loadedTile[tile.id] = true;
35507             }
35508             if (data.roadSegments) {
35509               data.roadSegments.forEach((feature3) => {
35510                 const { points, wayId, fromNodeId, toNodeId } = feature3;
35511                 const itemId = `${wayId}${fromNodeId}${toNodeId}`;
35512                 let mid = points.length / 2;
35513                 let loc;
35514                 if (mid % 1 === 0) {
35515                   loc = pointAverage([points[mid - 1], points[mid]]);
35516                 } else {
35517                   mid = points[Math.floor(mid)];
35518                   loc = [mid.lon, mid.lat];
35519                 }
35520                 loc = preventCoincident(loc, false);
35521                 let d = new QAItem(loc, this, k, itemId, {
35522                   issueKey: k,
35523                   // used as a category
35524                   identifier: {
35525                     // used to post changes
35526                     wayId,
35527                     fromNodeId,
35528                     toNodeId
35529                   },
35530                   objectId: wayId,
35531                   objectType: "way"
35532                 });
35533                 d.replacements = {
35534                   percentage: feature3.percentOfTrips,
35535                   num_trips: feature3.numberOfTrips,
35536                   highway: linkErrorObject(_t("QA.keepRight.error_parts.highway")),
35537                   from_node: linkEntity("n" + feature3.fromNodeId),
35538                   to_node: linkEntity("n" + feature3.toNodeId)
35539                 };
35540                 _cache2.data[d.id] = d;
35541                 _cache2.rtree.insert(encodeIssueRtree2(d));
35542               });
35543             }
35544             if (data.tiles) {
35545               data.tiles.forEach((feature3) => {
35546                 const { type: type2, x, y, numberOfTrips } = feature3;
35547                 const geoType = type2.toLowerCase();
35548                 const itemId = `${geoType}${x}${y}${numberOfTrips}`;
35549                 let loc = pointAverage(feature3.points);
35550                 loc = preventCoincident(loc, false);
35551                 let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, {
35552                   issueKey: k,
35553                   identifier: { x, y }
35554                 });
35555                 d.replacements = {
35556                   num_trips: numberOfTrips,
35557                   geometry_type: _t(`QA.improveOSM.geometry_types.${geoType}`)
35558                 };
35559                 if (numberOfTrips === -1) {
35560                   d.desc = _t("QA.improveOSM.error_types.mr.description_alt", d.replacements);
35561                 }
35562                 _cache2.data[d.id] = d;
35563                 _cache2.rtree.insert(encodeIssueRtree2(d));
35564               });
35565             }
35566             if (data.entities) {
35567               data.entities.forEach((feature3) => {
35568                 const { point: point2, id: id2, segments, numberOfPasses, turnType } = feature3;
35569                 const itemId = `${id2.replace(/[,:+#]/g, "_")}`;
35570                 const loc = preventCoincident([point2.lon, point2.lat], true);
35571                 const ids = id2.split(",");
35572                 const from_way = ids[0];
35573                 const via_node = ids[3];
35574                 const to_way = ids[2].split(":")[1];
35575                 let d = new QAItem(loc, this, k, itemId, {
35576                   issueKey: k,
35577                   identifier: id2,
35578                   objectId: via_node,
35579                   objectType: "node"
35580                 });
35581                 const [p1, p2] = segments[0].points;
35582                 const dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
35583                 d.replacements = {
35584                   num_passed: numberOfPasses,
35585                   num_trips: segments[0].numberOfTrips,
35586                   turn_restriction: turnType.toLowerCase(),
35587                   from_way: linkEntity("w" + from_way),
35588                   to_way: linkEntity("w" + to_way),
35589                   travel_direction: dir_of_travel,
35590                   junction: linkErrorObject(_t("QA.keepRight.error_parts.this_node"))
35591                 };
35592                 _cache2.data[d.id] = d;
35593                 _cache2.rtree.insert(encodeIssueRtree2(d));
35594                 dispatch3.call("loaded");
35595               });
35596             }
35597           }).catch(() => {
35598             delete _cache2.inflightTile[tile.id][k];
35599             if (!Object.keys(_cache2.inflightTile[tile.id]).length) {
35600               delete _cache2.inflightTile[tile.id];
35601               _cache2.loadedTile[tile.id] = true;
35602             }
35603           });
35604         });
35605         _cache2.inflightTile[tile.id] = requests;
35606       });
35607     },
35608     getComments(item) {
35609       if (item.comments) {
35610         return Promise.resolve(item);
35611       }
35612       const key = item.issueKey;
35613       let qParams = {};
35614       if (key === "ow") {
35615         qParams = item.identifier;
35616       } else if (key === "mr") {
35617         qParams.tileX = item.identifier.x;
35618         qParams.tileY = item.identifier.y;
35619       } else if (key === "tr") {
35620         qParams.targetId = item.identifier;
35621       }
35622       const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams);
35623       const cacheComments = (data) => {
35624         item.comments = data.comments ? data.comments.reverse() : [];
35625         this.replaceItem(item);
35626       };
35627       return json_default(url).then(cacheComments).then(() => item);
35628     },
35629     postUpdate(d, callback) {
35630       if (!osm_default.authenticated()) {
35631         return callback({ message: "Not Authenticated", status: -3 }, d);
35632       }
35633       if (_cache2.inflightPost[d.id]) {
35634         return callback({ message: "Error update already inflight", status: -2 }, d);
35635       }
35636       osm_default.userDetails(sendPayload.bind(this));
35637       function sendPayload(err, user) {
35638         if (err) {
35639           return callback(err, d);
35640         }
35641         const key = d.issueKey;
35642         const url = `${_impOsmUrls[key]}/comment`;
35643         const payload = {
35644           username: user.display_name,
35645           targetIds: [d.identifier]
35646         };
35647         if (d.newStatus) {
35648           payload.status = d.newStatus;
35649           payload.text = "status changed";
35650         }
35651         if (d.newComment) {
35652           payload.text = d.newComment;
35653         }
35654         const controller = new AbortController();
35655         _cache2.inflightPost[d.id] = controller;
35656         const options2 = {
35657           method: "POST",
35658           signal: controller.signal,
35659           body: JSON.stringify(payload)
35660         };
35661         json_default(url, options2).then(() => {
35662           delete _cache2.inflightPost[d.id];
35663           if (!d.newStatus) {
35664             const now3 = new Date();
35665             let comments = d.comments ? d.comments : [];
35666             comments.push({
35667               username: payload.username,
35668               text: payload.text,
35669               timestamp: now3.getTime() / 1e3
35670             });
35671             this.replaceItem(d.update({
35672               comments,
35673               newComment: void 0
35674             }));
35675           } else {
35676             this.removeItem(d);
35677             if (d.newStatus === "SOLVED") {
35678               if (!(d.issueKey in _cache2.closed)) {
35679                 _cache2.closed[d.issueKey] = 0;
35680               }
35681               _cache2.closed[d.issueKey] += 1;
35682             }
35683           }
35684           if (callback)
35685             callback(null, d);
35686         }).catch((err2) => {
35687           delete _cache2.inflightPost[d.id];
35688           if (callback)
35689             callback(err2.message);
35690         });
35691       }
35692     },
35693     // Get all cached QAItems covering the viewport
35694     getItems(projection2) {
35695       const viewport = projection2.clipExtent();
35696       const min3 = [viewport[0][0], viewport[1][1]];
35697       const max3 = [viewport[1][0], viewport[0][1]];
35698       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
35699       return _cache2.rtree.search(bbox2).map((d) => d.data);
35700     },
35701     // Get a QAItem from cache
35702     // NOTE: Don't change method name until UI v3 is merged
35703     getError(id2) {
35704       return _cache2.data[id2];
35705     },
35706     // get the name of the icon to display for this item
35707     getIcon(itemType) {
35708       return _impOsmData.icons[itemType];
35709     },
35710     // Replace a single QAItem in the cache
35711     replaceItem(issue) {
35712       if (!(issue instanceof QAItem) || !issue.id)
35713         return;
35714       _cache2.data[issue.id] = issue;
35715       updateRtree2(encodeIssueRtree2(issue), true);
35716       return issue;
35717     },
35718     // Remove a single QAItem from the cache
35719     removeItem(issue) {
35720       if (!(issue instanceof QAItem) || !issue.id)
35721         return;
35722       delete _cache2.data[issue.id];
35723       updateRtree2(encodeIssueRtree2(issue), false);
35724     },
35725     // Used to populate `closed:improveosm:*` changeset tags
35726     getClosedCounts() {
35727       return _cache2.closed;
35728     }
35729   };
35730
35731   // modules/services/osmose.js
35732   var import_rbush3 = __toESM(require_rbush_min());
35733
35734   // node_modules/marked/lib/marked.esm.js
35735   function getDefaults() {
35736     return {
35737       async: false,
35738       baseUrl: null,
35739       breaks: false,
35740       extensions: null,
35741       gfm: true,
35742       headerIds: true,
35743       headerPrefix: "",
35744       highlight: null,
35745       langPrefix: "language-",
35746       mangle: true,
35747       pedantic: false,
35748       renderer: null,
35749       sanitize: false,
35750       sanitizer: null,
35751       silent: false,
35752       smartypants: false,
35753       tokenizer: null,
35754       walkTokens: null,
35755       xhtml: false
35756     };
35757   }
35758   var defaults = getDefaults();
35759   function changeDefaults(newDefaults) {
35760     defaults = newDefaults;
35761   }
35762   var escapeTest = /[&<>"']/;
35763   var escapeReplace = /[&<>"']/g;
35764   var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
35765   var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
35766   var escapeReplacements = {
35767     "&": "&amp;",
35768     "<": "&lt;",
35769     ">": "&gt;",
35770     '"': "&quot;",
35771     "'": "&#39;"
35772   };
35773   var getEscapeReplacement = (ch) => escapeReplacements[ch];
35774   function escape4(html2, encode) {
35775     if (encode) {
35776       if (escapeTest.test(html2)) {
35777         return html2.replace(escapeReplace, getEscapeReplacement);
35778       }
35779     } else {
35780       if (escapeTestNoEncode.test(html2)) {
35781         return html2.replace(escapeReplaceNoEncode, getEscapeReplacement);
35782       }
35783     }
35784     return html2;
35785   }
35786   var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
35787   function unescape3(html2) {
35788     return html2.replace(unescapeTest, (_, n2) => {
35789       n2 = n2.toLowerCase();
35790       if (n2 === "colon")
35791         return ":";
35792       if (n2.charAt(0) === "#") {
35793         return n2.charAt(1) === "x" ? String.fromCharCode(parseInt(n2.substring(2), 16)) : String.fromCharCode(+n2.substring(1));
35794       }
35795       return "";
35796     });
35797   }
35798   var caret = /(^|[^\[])\^/g;
35799   function edit(regex, opt) {
35800     regex = typeof regex === "string" ? regex : regex.source;
35801     opt = opt || "";
35802     const obj = {
35803       replace: (name, val) => {
35804         val = val.source || val;
35805         val = val.replace(caret, "$1");
35806         regex = regex.replace(name, val);
35807         return obj;
35808       },
35809       getRegex: () => {
35810         return new RegExp(regex, opt);
35811       }
35812     };
35813     return obj;
35814   }
35815   var nonWordAndColonTest = /[^\w:]/g;
35816   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
35817   function cleanUrl(sanitize, base, href) {
35818     if (sanitize) {
35819       let prot;
35820       try {
35821         prot = decodeURIComponent(unescape3(href)).replace(nonWordAndColonTest, "").toLowerCase();
35822       } catch (e) {
35823         return null;
35824       }
35825       if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) {
35826         return null;
35827       }
35828     }
35829     if (base && !originIndependentUrl.test(href)) {
35830       href = resolveUrl(base, href);
35831     }
35832     try {
35833       href = encodeURI(href).replace(/%25/g, "%");
35834     } catch (e) {
35835       return null;
35836     }
35837     return href;
35838   }
35839   var baseUrls = {};
35840   var justDomain = /^[^:]+:\/*[^/]*$/;
35841   var protocol = /^([^:]+:)[\s\S]*$/;
35842   var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
35843   function resolveUrl(base, href) {
35844     if (!baseUrls[" " + base]) {
35845       if (justDomain.test(base)) {
35846         baseUrls[" " + base] = base + "/";
35847       } else {
35848         baseUrls[" " + base] = rtrim(base, "/", true);
35849       }
35850     }
35851     base = baseUrls[" " + base];
35852     const relativeBase = base.indexOf(":") === -1;
35853     if (href.substring(0, 2) === "//") {
35854       if (relativeBase) {
35855         return href;
35856       }
35857       return base.replace(protocol, "$1") + href;
35858     } else if (href.charAt(0) === "/") {
35859       if (relativeBase) {
35860         return href;
35861       }
35862       return base.replace(domain, "$1") + href;
35863     } else {
35864       return base + href;
35865     }
35866   }
35867   var noopTest = { exec: function noopTest2() {
35868   } };
35869   function merge2(obj) {
35870     let i2 = 1, target, key;
35871     for (; i2 < arguments.length; i2++) {
35872       target = arguments[i2];
35873       for (key in target) {
35874         if (Object.prototype.hasOwnProperty.call(target, key)) {
35875           obj[key] = target[key];
35876         }
35877       }
35878     }
35879     return obj;
35880   }
35881   function splitCells(tableRow, count) {
35882     const row = tableRow.replace(/\|/g, (match, offset, str2) => {
35883       let escaped = false, curr = offset;
35884       while (--curr >= 0 && str2[curr] === "\\")
35885         escaped = !escaped;
35886       if (escaped) {
35887         return "|";
35888       } else {
35889         return " |";
35890       }
35891     }), cells = row.split(/ \|/);
35892     let i2 = 0;
35893     if (!cells[0].trim()) {
35894       cells.shift();
35895     }
35896     if (cells.length > 0 && !cells[cells.length - 1].trim()) {
35897       cells.pop();
35898     }
35899     if (cells.length > count) {
35900       cells.splice(count);
35901     } else {
35902       while (cells.length < count)
35903         cells.push("");
35904     }
35905     for (; i2 < cells.length; i2++) {
35906       cells[i2] = cells[i2].trim().replace(/\\\|/g, "|");
35907     }
35908     return cells;
35909   }
35910   function rtrim(str2, c, invert) {
35911     const l = str2.length;
35912     if (l === 0) {
35913       return "";
35914     }
35915     let suffLen = 0;
35916     while (suffLen < l) {
35917       const currChar = str2.charAt(l - suffLen - 1);
35918       if (currChar === c && !invert) {
35919         suffLen++;
35920       } else if (currChar !== c && invert) {
35921         suffLen++;
35922       } else {
35923         break;
35924       }
35925     }
35926     return str2.slice(0, l - suffLen);
35927   }
35928   function findClosingBracket(str2, b) {
35929     if (str2.indexOf(b[1]) === -1) {
35930       return -1;
35931     }
35932     const l = str2.length;
35933     let level = 0, i2 = 0;
35934     for (; i2 < l; i2++) {
35935       if (str2[i2] === "\\") {
35936         i2++;
35937       } else if (str2[i2] === b[0]) {
35938         level++;
35939       } else if (str2[i2] === b[1]) {
35940         level--;
35941         if (level < 0) {
35942           return i2;
35943         }
35944       }
35945     }
35946     return -1;
35947   }
35948   function checkSanitizeDeprecation(opt) {
35949     if (opt && opt.sanitize && !opt.silent) {
35950       console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options");
35951     }
35952   }
35953   function repeatString(pattern, count) {
35954     if (count < 1) {
35955       return "";
35956     }
35957     let result = "";
35958     while (count > 1) {
35959       if (count & 1) {
35960         result += pattern;
35961       }
35962       count >>= 1;
35963       pattern += pattern;
35964     }
35965     return result + pattern;
35966   }
35967   function outputLink(cap, link2, raw, lexer2) {
35968     const href = link2.href;
35969     const title = link2.title ? escape4(link2.title) : null;
35970     const text2 = cap[1].replace(/\\([\[\]])/g, "$1");
35971     if (cap[0].charAt(0) !== "!") {
35972       lexer2.state.inLink = true;
35973       const token = {
35974         type: "link",
35975         raw,
35976         href,
35977         title,
35978         text: text2,
35979         tokens: lexer2.inlineTokens(text2)
35980       };
35981       lexer2.state.inLink = false;
35982       return token;
35983     }
35984     return {
35985       type: "image",
35986       raw,
35987       href,
35988       title,
35989       text: escape4(text2)
35990     };
35991   }
35992   function indentCodeCompensation(raw, text2) {
35993     const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
35994     if (matchIndentToCode === null) {
35995       return text2;
35996     }
35997     const indentToCode = matchIndentToCode[1];
35998     return text2.split("\n").map((node) => {
35999       const matchIndentInNode = node.match(/^\s+/);
36000       if (matchIndentInNode === null) {
36001         return node;
36002       }
36003       const [indentInNode] = matchIndentInNode;
36004       if (indentInNode.length >= indentToCode.length) {
36005         return node.slice(indentToCode.length);
36006       }
36007       return node;
36008     }).join("\n");
36009   }
36010   var Tokenizer = class {
36011     constructor(options2) {
36012       this.options = options2 || defaults;
36013     }
36014     space(src) {
36015       const cap = this.rules.block.newline.exec(src);
36016       if (cap && cap[0].length > 0) {
36017         return {
36018           type: "space",
36019           raw: cap[0]
36020         };
36021       }
36022     }
36023     code(src) {
36024       const cap = this.rules.block.code.exec(src);
36025       if (cap) {
36026         const text2 = cap[0].replace(/^ {1,4}/gm, "");
36027         return {
36028           type: "code",
36029           raw: cap[0],
36030           codeBlockStyle: "indented",
36031           text: !this.options.pedantic ? rtrim(text2, "\n") : text2
36032         };
36033       }
36034     }
36035     fences(src) {
36036       const cap = this.rules.block.fences.exec(src);
36037       if (cap) {
36038         const raw = cap[0];
36039         const text2 = indentCodeCompensation(raw, cap[3] || "");
36040         return {
36041           type: "code",
36042           raw,
36043           lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, "$1") : cap[2],
36044           text: text2
36045         };
36046       }
36047     }
36048     heading(src) {
36049       const cap = this.rules.block.heading.exec(src);
36050       if (cap) {
36051         let text2 = cap[2].trim();
36052         if (/#$/.test(text2)) {
36053           const trimmed = rtrim(text2, "#");
36054           if (this.options.pedantic) {
36055             text2 = trimmed.trim();
36056           } else if (!trimmed || / $/.test(trimmed)) {
36057             text2 = trimmed.trim();
36058           }
36059         }
36060         return {
36061           type: "heading",
36062           raw: cap[0],
36063           depth: cap[1].length,
36064           text: text2,
36065           tokens: this.lexer.inline(text2)
36066         };
36067       }
36068     }
36069     hr(src) {
36070       const cap = this.rules.block.hr.exec(src);
36071       if (cap) {
36072         return {
36073           type: "hr",
36074           raw: cap[0]
36075         };
36076       }
36077     }
36078     blockquote(src) {
36079       const cap = this.rules.block.blockquote.exec(src);
36080       if (cap) {
36081         const text2 = cap[0].replace(/^ *>[ \t]?/gm, "");
36082         return {
36083           type: "blockquote",
36084           raw: cap[0],
36085           tokens: this.lexer.blockTokens(text2, []),
36086           text: text2
36087         };
36088       }
36089     }
36090     list(src) {
36091       let cap = this.rules.block.list.exec(src);
36092       if (cap) {
36093         let raw, istask, ischecked, indent2, i2, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;
36094         let bull = cap[1].trim();
36095         const isordered = bull.length > 1;
36096         const list = {
36097           type: "list",
36098           raw: "",
36099           ordered: isordered,
36100           start: isordered ? +bull.slice(0, -1) : "",
36101           loose: false,
36102           items: []
36103         };
36104         bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
36105         if (this.options.pedantic) {
36106           bull = isordered ? bull : "[*+-]";
36107         }
36108         const itemRegex = new RegExp(`^( {0,3}${bull})((?:[      ][^\\n]*)?(?:\\n|$))`);
36109         while (src) {
36110           endEarly = false;
36111           if (!(cap = itemRegex.exec(src))) {
36112             break;
36113           }
36114           if (this.rules.block.hr.test(src)) {
36115             break;
36116           }
36117           raw = cap[0];
36118           src = src.substring(raw.length);
36119           line = cap[2].split("\n", 1)[0];
36120           nextLine = src.split("\n", 1)[0];
36121           if (this.options.pedantic) {
36122             indent2 = 2;
36123             itemContents = line.trimLeft();
36124           } else {
36125             indent2 = cap[2].search(/[^ ]/);
36126             indent2 = indent2 > 4 ? 1 : indent2;
36127             itemContents = line.slice(indent2);
36128             indent2 += cap[1].length;
36129           }
36130           blankLine = false;
36131           if (!line && /^ *$/.test(nextLine)) {
36132             raw += nextLine + "\n";
36133             src = src.substring(nextLine.length + 1);
36134             endEarly = true;
36135           }
36136           if (!endEarly) {
36137             const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))`);
36138             const hrRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
36139             const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:\`\`\`|~~~)`);
36140             const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}#`);
36141             while (src) {
36142               rawLine = src.split("\n", 1)[0];
36143               line = rawLine;
36144               if (this.options.pedantic) {
36145                 line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, "  ");
36146               }
36147               if (fencesBeginRegex.test(line)) {
36148                 break;
36149               }
36150               if (headingBeginRegex.test(line)) {
36151                 break;
36152               }
36153               if (nextBulletRegex.test(line)) {
36154                 break;
36155               }
36156               if (hrRegex.test(src)) {
36157                 break;
36158               }
36159               if (line.search(/[^ ]/) >= indent2 || !line.trim()) {
36160                 itemContents += "\n" + line.slice(indent2);
36161               } else if (!blankLine) {
36162                 itemContents += "\n" + line;
36163               } else {
36164                 break;
36165               }
36166               if (!blankLine && !line.trim()) {
36167                 blankLine = true;
36168               }
36169               raw += rawLine + "\n";
36170               src = src.substring(rawLine.length + 1);
36171             }
36172           }
36173           if (!list.loose) {
36174             if (endsWithBlankLine) {
36175               list.loose = true;
36176             } else if (/\n *\n *$/.test(raw)) {
36177               endsWithBlankLine = true;
36178             }
36179           }
36180           if (this.options.gfm) {
36181             istask = /^\[[ xX]\] /.exec(itemContents);
36182             if (istask) {
36183               ischecked = istask[0] !== "[ ] ";
36184               itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
36185             }
36186           }
36187           list.items.push({
36188             type: "list_item",
36189             raw,
36190             task: !!istask,
36191             checked: ischecked,
36192             loose: false,
36193             text: itemContents
36194           });
36195           list.raw += raw;
36196         }
36197         list.items[list.items.length - 1].raw = raw.trimRight();
36198         list.items[list.items.length - 1].text = itemContents.trimRight();
36199         list.raw = list.raw.trimRight();
36200         const l = list.items.length;
36201         for (i2 = 0; i2 < l; i2++) {
36202           this.lexer.state.top = false;
36203           list.items[i2].tokens = this.lexer.blockTokens(list.items[i2].text, []);
36204           const spacers = list.items[i2].tokens.filter((t) => t.type === "space");
36205           const hasMultipleLineBreaks = spacers.every((t) => {
36206             const chars = t.raw.split("");
36207             let lineBreaks = 0;
36208             for (const char of chars) {
36209               if (char === "\n") {
36210                 lineBreaks += 1;
36211               }
36212               if (lineBreaks > 1) {
36213                 return true;
36214               }
36215             }
36216             return false;
36217           });
36218           if (!list.loose && spacers.length && hasMultipleLineBreaks) {
36219             list.loose = true;
36220             list.items[i2].loose = true;
36221           }
36222         }
36223         return list;
36224       }
36225     }
36226     html(src) {
36227       const cap = this.rules.block.html.exec(src);
36228       if (cap) {
36229         const token = {
36230           type: "html",
36231           raw: cap[0],
36232           pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"),
36233           text: cap[0]
36234         };
36235         if (this.options.sanitize) {
36236           const text2 = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]);
36237           token.type = "paragraph";
36238           token.text = text2;
36239           token.tokens = this.lexer.inline(text2);
36240         }
36241         return token;
36242       }
36243     }
36244     def(src) {
36245       const cap = this.rules.block.def.exec(src);
36246       if (cap) {
36247         if (cap[3])
36248           cap[3] = cap[3].substring(1, cap[3].length - 1);
36249         const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
36250         return {
36251           type: "def",
36252           tag,
36253           raw: cap[0],
36254           href: cap[2] ? cap[2].replace(this.rules.inline._escapes, "$1") : cap[2],
36255           title: cap[3] ? cap[3].replace(this.rules.inline._escapes, "$1") : cap[3]
36256         };
36257       }
36258     }
36259     table(src) {
36260       const cap = this.rules.block.table.exec(src);
36261       if (cap) {
36262         const item = {
36263           type: "table",
36264           header: splitCells(cap[1]).map((c) => {
36265             return { text: c };
36266           }),
36267           align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
36268           rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : []
36269         };
36270         if (item.header.length === item.align.length) {
36271           item.raw = cap[0];
36272           let l = item.align.length;
36273           let i2, j2, k, row;
36274           for (i2 = 0; i2 < l; i2++) {
36275             if (/^ *-+: *$/.test(item.align[i2])) {
36276               item.align[i2] = "right";
36277             } else if (/^ *:-+: *$/.test(item.align[i2])) {
36278               item.align[i2] = "center";
36279             } else if (/^ *:-+ *$/.test(item.align[i2])) {
36280               item.align[i2] = "left";
36281             } else {
36282               item.align[i2] = null;
36283             }
36284           }
36285           l = item.rows.length;
36286           for (i2 = 0; i2 < l; i2++) {
36287             item.rows[i2] = splitCells(item.rows[i2], item.header.length).map((c) => {
36288               return { text: c };
36289             });
36290           }
36291           l = item.header.length;
36292           for (j2 = 0; j2 < l; j2++) {
36293             item.header[j2].tokens = this.lexer.inline(item.header[j2].text);
36294           }
36295           l = item.rows.length;
36296           for (j2 = 0; j2 < l; j2++) {
36297             row = item.rows[j2];
36298             for (k = 0; k < row.length; k++) {
36299               row[k].tokens = this.lexer.inline(row[k].text);
36300             }
36301           }
36302           return item;
36303         }
36304       }
36305     }
36306     lheading(src) {
36307       const cap = this.rules.block.lheading.exec(src);
36308       if (cap) {
36309         return {
36310           type: "heading",
36311           raw: cap[0],
36312           depth: cap[2].charAt(0) === "=" ? 1 : 2,
36313           text: cap[1],
36314           tokens: this.lexer.inline(cap[1])
36315         };
36316       }
36317     }
36318     paragraph(src) {
36319       const cap = this.rules.block.paragraph.exec(src);
36320       if (cap) {
36321         const text2 = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
36322         return {
36323           type: "paragraph",
36324           raw: cap[0],
36325           text: text2,
36326           tokens: this.lexer.inline(text2)
36327         };
36328       }
36329     }
36330     text(src) {
36331       const cap = this.rules.block.text.exec(src);
36332       if (cap) {
36333         return {
36334           type: "text",
36335           raw: cap[0],
36336           text: cap[0],
36337           tokens: this.lexer.inline(cap[0])
36338         };
36339       }
36340     }
36341     escape(src) {
36342       const cap = this.rules.inline.escape.exec(src);
36343       if (cap) {
36344         return {
36345           type: "escape",
36346           raw: cap[0],
36347           text: escape4(cap[1])
36348         };
36349       }
36350     }
36351     tag(src) {
36352       const cap = this.rules.inline.tag.exec(src);
36353       if (cap) {
36354         if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
36355           this.lexer.state.inLink = true;
36356         } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
36357           this.lexer.state.inLink = false;
36358         }
36359         if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
36360           this.lexer.state.inRawBlock = true;
36361         } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
36362           this.lexer.state.inRawBlock = false;
36363         }
36364         return {
36365           type: this.options.sanitize ? "text" : "html",
36366           raw: cap[0],
36367           inLink: this.lexer.state.inLink,
36368           inRawBlock: this.lexer.state.inRawBlock,
36369           text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0]
36370         };
36371       }
36372     }
36373     link(src) {
36374       const cap = this.rules.inline.link.exec(src);
36375       if (cap) {
36376         const trimmedUrl = cap[2].trim();
36377         if (!this.options.pedantic && /^</.test(trimmedUrl)) {
36378           if (!/>$/.test(trimmedUrl)) {
36379             return;
36380           }
36381           const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
36382           if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
36383             return;
36384           }
36385         } else {
36386           const lastParenIndex = findClosingBracket(cap[2], "()");
36387           if (lastParenIndex > -1) {
36388             const start2 = cap[0].indexOf("!") === 0 ? 5 : 4;
36389             const linkLen = start2 + cap[1].length + lastParenIndex;
36390             cap[2] = cap[2].substring(0, lastParenIndex);
36391             cap[0] = cap[0].substring(0, linkLen).trim();
36392             cap[3] = "";
36393           }
36394         }
36395         let href = cap[2];
36396         let title = "";
36397         if (this.options.pedantic) {
36398           const link2 = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
36399           if (link2) {
36400             href = link2[1];
36401             title = link2[3];
36402           }
36403         } else {
36404           title = cap[3] ? cap[3].slice(1, -1) : "";
36405         }
36406         href = href.trim();
36407         if (/^</.test(href)) {
36408           if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
36409             href = href.slice(1);
36410           } else {
36411             href = href.slice(1, -1);
36412           }
36413         }
36414         return outputLink(cap, {
36415           href: href ? href.replace(this.rules.inline._escapes, "$1") : href,
36416           title: title ? title.replace(this.rules.inline._escapes, "$1") : title
36417         }, cap[0], this.lexer);
36418       }
36419     }
36420     reflink(src, links) {
36421       let cap;
36422       if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
36423         let link2 = (cap[2] || cap[1]).replace(/\s+/g, " ");
36424         link2 = links[link2.toLowerCase()];
36425         if (!link2 || !link2.href) {
36426           const text2 = cap[0].charAt(0);
36427           return {
36428             type: "text",
36429             raw: text2,
36430             text: text2
36431           };
36432         }
36433         return outputLink(cap, link2, cap[0], this.lexer);
36434       }
36435     }
36436     emStrong(src, maskedSrc, prevChar = "") {
36437       let match = this.rules.inline.emStrong.lDelim.exec(src);
36438       if (!match)
36439         return;
36440       if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
36441         return;
36442       const nextChar = match[1] || match[2] || "";
36443       if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) {
36444         const lLength = match[0].length - 1;
36445         let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
36446         const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
36447         endReg.lastIndex = 0;
36448         maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
36449         while ((match = endReg.exec(maskedSrc)) != null) {
36450           rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
36451           if (!rDelim)
36452             continue;
36453           rLength = rDelim.length;
36454           if (match[3] || match[4]) {
36455             delimTotal += rLength;
36456             continue;
36457           } else if (match[5] || match[6]) {
36458             if (lLength % 3 && !((lLength + rLength) % 3)) {
36459               midDelimTotal += rLength;
36460               continue;
36461             }
36462           }
36463           delimTotal -= rLength;
36464           if (delimTotal > 0)
36465             continue;
36466           rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
36467           const raw = src.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);
36468           if (Math.min(lLength, rLength) % 2) {
36469             const text3 = raw.slice(1, -1);
36470             return {
36471               type: "em",
36472               raw,
36473               text: text3,
36474               tokens: this.lexer.inlineTokens(text3)
36475             };
36476           }
36477           const text2 = raw.slice(2, -2);
36478           return {
36479             type: "strong",
36480             raw,
36481             text: text2,
36482             tokens: this.lexer.inlineTokens(text2)
36483           };
36484         }
36485       }
36486     }
36487     codespan(src) {
36488       const cap = this.rules.inline.code.exec(src);
36489       if (cap) {
36490         let text2 = cap[2].replace(/\n/g, " ");
36491         const hasNonSpaceChars = /[^ ]/.test(text2);
36492         const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2);
36493         if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
36494           text2 = text2.substring(1, text2.length - 1);
36495         }
36496         text2 = escape4(text2, true);
36497         return {
36498           type: "codespan",
36499           raw: cap[0],
36500           text: text2
36501         };
36502       }
36503     }
36504     br(src) {
36505       const cap = this.rules.inline.br.exec(src);
36506       if (cap) {
36507         return {
36508           type: "br",
36509           raw: cap[0]
36510         };
36511       }
36512     }
36513     del(src) {
36514       const cap = this.rules.inline.del.exec(src);
36515       if (cap) {
36516         return {
36517           type: "del",
36518           raw: cap[0],
36519           text: cap[2],
36520           tokens: this.lexer.inlineTokens(cap[2])
36521         };
36522       }
36523     }
36524     autolink(src, mangle2) {
36525       const cap = this.rules.inline.autolink.exec(src);
36526       if (cap) {
36527         let text2, href;
36528         if (cap[2] === "@") {
36529           text2 = escape4(this.options.mangle ? mangle2(cap[1]) : cap[1]);
36530           href = "mailto:" + text2;
36531         } else {
36532           text2 = escape4(cap[1]);
36533           href = text2;
36534         }
36535         return {
36536           type: "link",
36537           raw: cap[0],
36538           text: text2,
36539           href,
36540           tokens: [
36541             {
36542               type: "text",
36543               raw: text2,
36544               text: text2
36545             }
36546           ]
36547         };
36548       }
36549     }
36550     url(src, mangle2) {
36551       let cap;
36552       if (cap = this.rules.inline.url.exec(src)) {
36553         let text2, href;
36554         if (cap[2] === "@") {
36555           text2 = escape4(this.options.mangle ? mangle2(cap[0]) : cap[0]);
36556           href = "mailto:" + text2;
36557         } else {
36558           let prevCapZero;
36559           do {
36560             prevCapZero = cap[0];
36561             cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
36562           } while (prevCapZero !== cap[0]);
36563           text2 = escape4(cap[0]);
36564           if (cap[1] === "www.") {
36565             href = "http://" + text2;
36566           } else {
36567             href = text2;
36568           }
36569         }
36570         return {
36571           type: "link",
36572           raw: cap[0],
36573           text: text2,
36574           href,
36575           tokens: [
36576             {
36577               type: "text",
36578               raw: text2,
36579               text: text2
36580             }
36581           ]
36582         };
36583       }
36584     }
36585     inlineText(src, smartypants2) {
36586       const cap = this.rules.inline.text.exec(src);
36587       if (cap) {
36588         let text2;
36589         if (this.lexer.state.inRawBlock) {
36590           text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0];
36591         } else {
36592           text2 = escape4(this.options.smartypants ? smartypants2(cap[0]) : cap[0]);
36593         }
36594         return {
36595           type: "text",
36596           raw: cap[0],
36597           text: text2
36598         };
36599       }
36600     }
36601   };
36602   var block = {
36603     newline: /^(?: *(?:\n|$))+/,
36604     code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
36605     fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
36606     hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
36607     heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
36608     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
36609     list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
36610     html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",
36611     def: /^ {0,3}\[(label)\]: *(?:\n *)?<?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
36612     table: noopTest,
36613     lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
36614     // regex template, placeholders will be replaced according to different paragraph
36615     // interruption rules of commonmark and the original markdown spec:
36616     _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
36617     text: /^[^\n]+/
36618   };
36619   block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
36620   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
36621   block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex();
36622   block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
36623   block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex();
36624   block.list = edit(block.list).replace(/bull/g, block.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block.def.source + ")").getRegex();
36625   block._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
36626   block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
36627   block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
36628   block.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
36629   block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex();
36630   block.normal = merge2({}, block);
36631   block.gfm = merge2({}, block.normal, {
36632     table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
36633     // Cells
36634   });
36635   block.gfm.table = edit(block.gfm.table).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
36636   block.gfm.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("table", block.gfm.table).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
36637   block.pedantic = merge2({}, block.normal, {
36638     html: edit(
36639       `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
36640     ).replace("comment", block._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
36641     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
36642     heading: /^(#{1,6})(.*)(?:\n+|$)/,
36643     fences: noopTest,
36644     // fences not supported
36645     paragraph: edit(block.normal._paragraph).replace("hr", block.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex()
36646   });
36647   var inline = {
36648     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
36649     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
36650     url: noopTest,
36651     tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
36652     // CDATA section
36653     link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
36654     reflink: /^!?\[(label)\]\[(ref)\]/,
36655     nolink: /^!?\[(ref)\](?:\[\])?/,
36656     reflinkSearch: "reflink|nolink(?!\\()",
36657     emStrong: {
36658       lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
36659       //        (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.
36660       //          () Skip orphan inside strong                                      () Consume to delim     (1) #***                (2) a***#, a***                             (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a
36661       rDelimAst: /^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,
36662       rDelimUnd: /^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/
36663       // ^- Not allowed for _
36664     },
36665     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
36666     br: /^( {2,}|\\)\n(?!\s*$)/,
36667     del: noopTest,
36668     text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
36669     punctuation: /^([\spunctuation])/
36670   };
36671   inline._punctuation = "!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~";
36672   inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();
36673   inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
36674   inline.escapedEmSt = /(?:^|[^\\])(?:\\\\)*\\[*_]/g;
36675   inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex();
36676   inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();
36677   inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "g").replace(/punct/g, inline._punctuation).getRegex();
36678   inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "g").replace(/punct/g, inline._punctuation).getRegex();
36679   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
36680   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
36681   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])?)+(?![-_])/;
36682   inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex();
36683   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
36684   inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex();
36685   inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
36686   inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
36687   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
36688   inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex();
36689   inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex();
36690   inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex();
36691   inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex();
36692   inline.normal = merge2({}, inline);
36693   inline.pedantic = merge2({}, inline.normal, {
36694     strong: {
36695       start: /^__|\*\*/,
36696       middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
36697       endAst: /\*\*(?!\*)/g,
36698       endUnd: /__(?!_)/g
36699     },
36700     em: {
36701       start: /^_|\*/,
36702       middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
36703       endAst: /\*(?!\*)/g,
36704       endUnd: /_(?!_)/g
36705     },
36706     link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(),
36707     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex()
36708   });
36709   inline.gfm = merge2({}, inline.normal, {
36710     escape: edit(inline.escape).replace("])", "~|])").getRegex(),
36711     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
36712     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
36713     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
36714     del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
36715     text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
36716   });
36717   inline.gfm.url = edit(inline.gfm.url, "i").replace("email", inline.gfm._extended_email).getRegex();
36718   inline.breaks = merge2({}, inline.gfm, {
36719     br: edit(inline.br).replace("{2,}", "*").getRegex(),
36720     text: edit(inline.gfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
36721   });
36722   function smartypants(text2) {
36723     return text2.replace(/---/g, "\u2014").replace(/--/g, "\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018").replace(/'/g, "\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C").replace(/"/g, "\u201D").replace(/\.{3}/g, "\u2026");
36724   }
36725   function mangle(text2) {
36726     let out = "", i2, ch;
36727     const l = text2.length;
36728     for (i2 = 0; i2 < l; i2++) {
36729       ch = text2.charCodeAt(i2);
36730       if (Math.random() > 0.5) {
36731         ch = "x" + ch.toString(16);
36732       }
36733       out += "&#" + ch + ";";
36734     }
36735     return out;
36736   }
36737   var Lexer = class {
36738     constructor(options2) {
36739       this.tokens = [];
36740       this.tokens.links = /* @__PURE__ */ Object.create(null);
36741       this.options = options2 || defaults;
36742       this.options.tokenizer = this.options.tokenizer || new Tokenizer();
36743       this.tokenizer = this.options.tokenizer;
36744       this.tokenizer.options = this.options;
36745       this.tokenizer.lexer = this;
36746       this.inlineQueue = [];
36747       this.state = {
36748         inLink: false,
36749         inRawBlock: false,
36750         top: true
36751       };
36752       const rules = {
36753         block: block.normal,
36754         inline: inline.normal
36755       };
36756       if (this.options.pedantic) {
36757         rules.block = block.pedantic;
36758         rules.inline = inline.pedantic;
36759       } else if (this.options.gfm) {
36760         rules.block = block.gfm;
36761         if (this.options.breaks) {
36762           rules.inline = inline.breaks;
36763         } else {
36764           rules.inline = inline.gfm;
36765         }
36766       }
36767       this.tokenizer.rules = rules;
36768     }
36769     /**
36770      * Expose Rules
36771      */
36772     static get rules() {
36773       return {
36774         block,
36775         inline
36776       };
36777     }
36778     /**
36779      * Static Lex Method
36780      */
36781     static lex(src, options2) {
36782       const lexer2 = new Lexer(options2);
36783       return lexer2.lex(src);
36784     }
36785     /**
36786      * Static Lex Inline Method
36787      */
36788     static lexInline(src, options2) {
36789       const lexer2 = new Lexer(options2);
36790       return lexer2.inlineTokens(src);
36791     }
36792     /**
36793      * Preprocessing
36794      */
36795     lex(src) {
36796       src = src.replace(/\r\n|\r/g, "\n");
36797       this.blockTokens(src, this.tokens);
36798       let next;
36799       while (next = this.inlineQueue.shift()) {
36800         this.inlineTokens(next.src, next.tokens);
36801       }
36802       return this.tokens;
36803     }
36804     /**
36805      * Lexing
36806      */
36807     blockTokens(src, tokens = []) {
36808       if (this.options.pedantic) {
36809         src = src.replace(/\t/g, "    ").replace(/^ +$/gm, "");
36810       } else {
36811         src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
36812           return leading + "    ".repeat(tabs.length);
36813         });
36814       }
36815       let token, lastToken, cutSrc, lastParagraphClipped;
36816       while (src) {
36817         if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => {
36818           if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
36819             src = src.substring(token.raw.length);
36820             tokens.push(token);
36821             return true;
36822           }
36823           return false;
36824         })) {
36825           continue;
36826         }
36827         if (token = this.tokenizer.space(src)) {
36828           src = src.substring(token.raw.length);
36829           if (token.raw.length === 1 && tokens.length > 0) {
36830             tokens[tokens.length - 1].raw += "\n";
36831           } else {
36832             tokens.push(token);
36833           }
36834           continue;
36835         }
36836         if (token = this.tokenizer.code(src)) {
36837           src = src.substring(token.raw.length);
36838           lastToken = tokens[tokens.length - 1];
36839           if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
36840             lastToken.raw += "\n" + token.raw;
36841             lastToken.text += "\n" + token.text;
36842             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
36843           } else {
36844             tokens.push(token);
36845           }
36846           continue;
36847         }
36848         if (token = this.tokenizer.fences(src)) {
36849           src = src.substring(token.raw.length);
36850           tokens.push(token);
36851           continue;
36852         }
36853         if (token = this.tokenizer.heading(src)) {
36854           src = src.substring(token.raw.length);
36855           tokens.push(token);
36856           continue;
36857         }
36858         if (token = this.tokenizer.hr(src)) {
36859           src = src.substring(token.raw.length);
36860           tokens.push(token);
36861           continue;
36862         }
36863         if (token = this.tokenizer.blockquote(src)) {
36864           src = src.substring(token.raw.length);
36865           tokens.push(token);
36866           continue;
36867         }
36868         if (token = this.tokenizer.list(src)) {
36869           src = src.substring(token.raw.length);
36870           tokens.push(token);
36871           continue;
36872         }
36873         if (token = this.tokenizer.html(src)) {
36874           src = src.substring(token.raw.length);
36875           tokens.push(token);
36876           continue;
36877         }
36878         if (token = this.tokenizer.def(src)) {
36879           src = src.substring(token.raw.length);
36880           lastToken = tokens[tokens.length - 1];
36881           if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
36882             lastToken.raw += "\n" + token.raw;
36883             lastToken.text += "\n" + token.raw;
36884             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
36885           } else if (!this.tokens.links[token.tag]) {
36886             this.tokens.links[token.tag] = {
36887               href: token.href,
36888               title: token.title
36889             };
36890           }
36891           continue;
36892         }
36893         if (token = this.tokenizer.table(src)) {
36894           src = src.substring(token.raw.length);
36895           tokens.push(token);
36896           continue;
36897         }
36898         if (token = this.tokenizer.lheading(src)) {
36899           src = src.substring(token.raw.length);
36900           tokens.push(token);
36901           continue;
36902         }
36903         cutSrc = src;
36904         if (this.options.extensions && this.options.extensions.startBlock) {
36905           let startIndex = Infinity;
36906           const tempSrc = src.slice(1);
36907           let tempStart;
36908           this.options.extensions.startBlock.forEach(function(getStartIndex) {
36909             tempStart = getStartIndex.call({ lexer: this }, tempSrc);
36910             if (typeof tempStart === "number" && tempStart >= 0) {
36911               startIndex = Math.min(startIndex, tempStart);
36912             }
36913           });
36914           if (startIndex < Infinity && startIndex >= 0) {
36915             cutSrc = src.substring(0, startIndex + 1);
36916           }
36917         }
36918         if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
36919           lastToken = tokens[tokens.length - 1];
36920           if (lastParagraphClipped && lastToken.type === "paragraph") {
36921             lastToken.raw += "\n" + token.raw;
36922             lastToken.text += "\n" + token.text;
36923             this.inlineQueue.pop();
36924             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
36925           } else {
36926             tokens.push(token);
36927           }
36928           lastParagraphClipped = cutSrc.length !== src.length;
36929           src = src.substring(token.raw.length);
36930           continue;
36931         }
36932         if (token = this.tokenizer.text(src)) {
36933           src = src.substring(token.raw.length);
36934           lastToken = tokens[tokens.length - 1];
36935           if (lastToken && lastToken.type === "text") {
36936             lastToken.raw += "\n" + token.raw;
36937             lastToken.text += "\n" + token.text;
36938             this.inlineQueue.pop();
36939             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
36940           } else {
36941             tokens.push(token);
36942           }
36943           continue;
36944         }
36945         if (src) {
36946           const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
36947           if (this.options.silent) {
36948             console.error(errMsg);
36949             break;
36950           } else {
36951             throw new Error(errMsg);
36952           }
36953         }
36954       }
36955       this.state.top = true;
36956       return tokens;
36957     }
36958     inline(src, tokens = []) {
36959       this.inlineQueue.push({ src, tokens });
36960       return tokens;
36961     }
36962     /**
36963      * Lexing/Compiling
36964      */
36965     inlineTokens(src, tokens = []) {
36966       let token, lastToken, cutSrc;
36967       let maskedSrc = src;
36968       let match;
36969       let keepPrevChar, prevChar;
36970       if (this.tokens.links) {
36971         const links = Object.keys(this.tokens.links);
36972         if (links.length > 0) {
36973           while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
36974             if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
36975               maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
36976             }
36977           }
36978         }
36979       }
36980       while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
36981         maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
36982       }
36983       while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
36984         maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
36985         this.tokenizer.rules.inline.escapedEmSt.lastIndex--;
36986       }
36987       while (src) {
36988         if (!keepPrevChar) {
36989           prevChar = "";
36990         }
36991         keepPrevChar = false;
36992         if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => {
36993           if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
36994             src = src.substring(token.raw.length);
36995             tokens.push(token);
36996             return true;
36997           }
36998           return false;
36999         })) {
37000           continue;
37001         }
37002         if (token = this.tokenizer.escape(src)) {
37003           src = src.substring(token.raw.length);
37004           tokens.push(token);
37005           continue;
37006         }
37007         if (token = this.tokenizer.tag(src)) {
37008           src = src.substring(token.raw.length);
37009           lastToken = tokens[tokens.length - 1];
37010           if (lastToken && token.type === "text" && lastToken.type === "text") {
37011             lastToken.raw += token.raw;
37012             lastToken.text += token.text;
37013           } else {
37014             tokens.push(token);
37015           }
37016           continue;
37017         }
37018         if (token = this.tokenizer.link(src)) {
37019           src = src.substring(token.raw.length);
37020           tokens.push(token);
37021           continue;
37022         }
37023         if (token = this.tokenizer.reflink(src, this.tokens.links)) {
37024           src = src.substring(token.raw.length);
37025           lastToken = tokens[tokens.length - 1];
37026           if (lastToken && token.type === "text" && lastToken.type === "text") {
37027             lastToken.raw += token.raw;
37028             lastToken.text += token.text;
37029           } else {
37030             tokens.push(token);
37031           }
37032           continue;
37033         }
37034         if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
37035           src = src.substring(token.raw.length);
37036           tokens.push(token);
37037           continue;
37038         }
37039         if (token = this.tokenizer.codespan(src)) {
37040           src = src.substring(token.raw.length);
37041           tokens.push(token);
37042           continue;
37043         }
37044         if (token = this.tokenizer.br(src)) {
37045           src = src.substring(token.raw.length);
37046           tokens.push(token);
37047           continue;
37048         }
37049         if (token = this.tokenizer.del(src)) {
37050           src = src.substring(token.raw.length);
37051           tokens.push(token);
37052           continue;
37053         }
37054         if (token = this.tokenizer.autolink(src, mangle)) {
37055           src = src.substring(token.raw.length);
37056           tokens.push(token);
37057           continue;
37058         }
37059         if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {
37060           src = src.substring(token.raw.length);
37061           tokens.push(token);
37062           continue;
37063         }
37064         cutSrc = src;
37065         if (this.options.extensions && this.options.extensions.startInline) {
37066           let startIndex = Infinity;
37067           const tempSrc = src.slice(1);
37068           let tempStart;
37069           this.options.extensions.startInline.forEach(function(getStartIndex) {
37070             tempStart = getStartIndex.call({ lexer: this }, tempSrc);
37071             if (typeof tempStart === "number" && tempStart >= 0) {
37072               startIndex = Math.min(startIndex, tempStart);
37073             }
37074           });
37075           if (startIndex < Infinity && startIndex >= 0) {
37076             cutSrc = src.substring(0, startIndex + 1);
37077           }
37078         }
37079         if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
37080           src = src.substring(token.raw.length);
37081           if (token.raw.slice(-1) !== "_") {
37082             prevChar = token.raw.slice(-1);
37083           }
37084           keepPrevChar = true;
37085           lastToken = tokens[tokens.length - 1];
37086           if (lastToken && lastToken.type === "text") {
37087             lastToken.raw += token.raw;
37088             lastToken.text += token.text;
37089           } else {
37090             tokens.push(token);
37091           }
37092           continue;
37093         }
37094         if (src) {
37095           const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
37096           if (this.options.silent) {
37097             console.error(errMsg);
37098             break;
37099           } else {
37100             throw new Error(errMsg);
37101           }
37102         }
37103       }
37104       return tokens;
37105     }
37106   };
37107   var Renderer = class {
37108     constructor(options2) {
37109       this.options = options2 || defaults;
37110     }
37111     code(code, infostring, escaped) {
37112       const lang = (infostring || "").match(/\S*/)[0];
37113       if (this.options.highlight) {
37114         const out = this.options.highlight(code, lang);
37115         if (out != null && out !== code) {
37116           escaped = true;
37117           code = out;
37118         }
37119       }
37120       code = code.replace(/\n$/, "") + "\n";
37121       if (!lang) {
37122         return "<pre><code>" + (escaped ? code : escape4(code, true)) + "</code></pre>\n";
37123       }
37124       return '<pre><code class="' + this.options.langPrefix + escape4(lang, true) + '">' + (escaped ? code : escape4(code, true)) + "</code></pre>\n";
37125     }
37126     /**
37127      * @param {string} quote
37128      */
37129     blockquote(quote2) {
37130       return `<blockquote>
37131 ${quote2}</blockquote>
37132 `;
37133     }
37134     html(html2) {
37135       return html2;
37136     }
37137     /**
37138      * @param {string} text
37139      * @param {string} level
37140      * @param {string} raw
37141      * @param {any} slugger
37142      */
37143     heading(text2, level, raw, slugger) {
37144       if (this.options.headerIds) {
37145         const id2 = this.options.headerPrefix + slugger.slug(raw);
37146         return `<h${level} id="${id2}">${text2}</h${level}>
37147 `;
37148       }
37149       return `<h${level}>${text2}</h${level}>
37150 `;
37151     }
37152     hr() {
37153       return this.options.xhtml ? "<hr/>\n" : "<hr>\n";
37154     }
37155     list(body, ordered, start2) {
37156       const type2 = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : "";
37157       return "<" + type2 + startatt + ">\n" + body + "</" + type2 + ">\n";
37158     }
37159     /**
37160      * @param {string} text
37161      */
37162     listitem(text2) {
37163       return `<li>${text2}</li>
37164 `;
37165     }
37166     checkbox(checked) {
37167       return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox"' + (this.options.xhtml ? " /" : "") + "> ";
37168     }
37169     /**
37170      * @param {string} text
37171      */
37172     paragraph(text2) {
37173       return `<p>${text2}</p>
37174 `;
37175     }
37176     /**
37177      * @param {string} header
37178      * @param {string} body
37179      */
37180     table(header, body) {
37181       if (body)
37182         body = `<tbody>${body}</tbody>`;
37183       return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
37184     }
37185     /**
37186      * @param {string} content
37187      */
37188     tablerow(content) {
37189       return `<tr>
37190 ${content}</tr>
37191 `;
37192     }
37193     tablecell(content, flags) {
37194       const type2 = flags.header ? "th" : "td";
37195       const tag = flags.align ? `<${type2} align="${flags.align}">` : `<${type2}>`;
37196       return tag + content + `</${type2}>
37197 `;
37198     }
37199     /**
37200      * span level renderer
37201      * @param {string} text
37202      */
37203     strong(text2) {
37204       return `<strong>${text2}</strong>`;
37205     }
37206     /**
37207      * @param {string} text
37208      */
37209     em(text2) {
37210       return `<em>${text2}</em>`;
37211     }
37212     /**
37213      * @param {string} text
37214      */
37215     codespan(text2) {
37216       return `<code>${text2}</code>`;
37217     }
37218     br() {
37219       return this.options.xhtml ? "<br/>" : "<br>";
37220     }
37221     /**
37222      * @param {string} text
37223      */
37224     del(text2) {
37225       return `<del>${text2}</del>`;
37226     }
37227     /**
37228      * @param {string} href
37229      * @param {string} title
37230      * @param {string} text
37231      */
37232     link(href, title, text2) {
37233       href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
37234       if (href === null) {
37235         return text2;
37236       }
37237       let out = '<a href="' + escape4(href) + '"';
37238       if (title) {
37239         out += ' title="' + title + '"';
37240       }
37241       out += ">" + text2 + "</a>";
37242       return out;
37243     }
37244     /**
37245      * @param {string} href
37246      * @param {string} title
37247      * @param {string} text
37248      */
37249     image(href, title, text2) {
37250       href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
37251       if (href === null) {
37252         return text2;
37253       }
37254       let out = `<img src="${href}" alt="${text2}"`;
37255       if (title) {
37256         out += ` title="${title}"`;
37257       }
37258       out += this.options.xhtml ? "/>" : ">";
37259       return out;
37260     }
37261     text(text2) {
37262       return text2;
37263     }
37264   };
37265   var TextRenderer = class {
37266     // no need for block level renderers
37267     strong(text2) {
37268       return text2;
37269     }
37270     em(text2) {
37271       return text2;
37272     }
37273     codespan(text2) {
37274       return text2;
37275     }
37276     del(text2) {
37277       return text2;
37278     }
37279     html(text2) {
37280       return text2;
37281     }
37282     text(text2) {
37283       return text2;
37284     }
37285     link(href, title, text2) {
37286       return "" + text2;
37287     }
37288     image(href, title, text2) {
37289       return "" + text2;
37290     }
37291     br() {
37292       return "";
37293     }
37294   };
37295   var Slugger = class {
37296     constructor() {
37297       this.seen = {};
37298     }
37299     /**
37300      * @param {string} value
37301      */
37302     serialize(value) {
37303       return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-");
37304     }
37305     /**
37306      * Finds the next safe (unique) slug to use
37307      * @param {string} originalSlug
37308      * @param {boolean} isDryRun
37309      */
37310     getNextSafeSlug(originalSlug, isDryRun) {
37311       let slug = originalSlug;
37312       let occurenceAccumulator = 0;
37313       if (this.seen.hasOwnProperty(slug)) {
37314         occurenceAccumulator = this.seen[originalSlug];
37315         do {
37316           occurenceAccumulator++;
37317           slug = originalSlug + "-" + occurenceAccumulator;
37318         } while (this.seen.hasOwnProperty(slug));
37319       }
37320       if (!isDryRun) {
37321         this.seen[originalSlug] = occurenceAccumulator;
37322         this.seen[slug] = 0;
37323       }
37324       return slug;
37325     }
37326     /**
37327      * Convert string to unique id
37328      * @param {object} [options]
37329      * @param {boolean} [options.dryrun] Generates the next unique slug without
37330      * updating the internal accumulator.
37331      */
37332     slug(value, options2 = {}) {
37333       const slug = this.serialize(value);
37334       return this.getNextSafeSlug(slug, options2.dryrun);
37335     }
37336   };
37337   var Parser = class {
37338     constructor(options2) {
37339       this.options = options2 || defaults;
37340       this.options.renderer = this.options.renderer || new Renderer();
37341       this.renderer = this.options.renderer;
37342       this.renderer.options = this.options;
37343       this.textRenderer = new TextRenderer();
37344       this.slugger = new Slugger();
37345     }
37346     /**
37347      * Static Parse Method
37348      */
37349     static parse(tokens, options2) {
37350       const parser3 = new Parser(options2);
37351       return parser3.parse(tokens);
37352     }
37353     /**
37354      * Static Parse Inline Method
37355      */
37356     static parseInline(tokens, options2) {
37357       const parser3 = new Parser(options2);
37358       return parser3.parseInline(tokens);
37359     }
37360     /**
37361      * Parse Loop
37362      */
37363     parse(tokens, top = true) {
37364       let out = "", i2, j2, k, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret;
37365       const l = tokens.length;
37366       for (i2 = 0; i2 < l; i2++) {
37367         token = tokens[i2];
37368         if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
37369           ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
37370           if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) {
37371             out += ret || "";
37372             continue;
37373           }
37374         }
37375         switch (token.type) {
37376           case "space": {
37377             continue;
37378           }
37379           case "hr": {
37380             out += this.renderer.hr();
37381             continue;
37382           }
37383           case "heading": {
37384             out += this.renderer.heading(
37385               this.parseInline(token.tokens),
37386               token.depth,
37387               unescape3(this.parseInline(token.tokens, this.textRenderer)),
37388               this.slugger
37389             );
37390             continue;
37391           }
37392           case "code": {
37393             out += this.renderer.code(
37394               token.text,
37395               token.lang,
37396               token.escaped
37397             );
37398             continue;
37399           }
37400           case "table": {
37401             header = "";
37402             cell = "";
37403             l2 = token.header.length;
37404             for (j2 = 0; j2 < l2; j2++) {
37405               cell += this.renderer.tablecell(
37406                 this.parseInline(token.header[j2].tokens),
37407                 { header: true, align: token.align[j2] }
37408               );
37409             }
37410             header += this.renderer.tablerow(cell);
37411             body = "";
37412             l2 = token.rows.length;
37413             for (j2 = 0; j2 < l2; j2++) {
37414               row = token.rows[j2];
37415               cell = "";
37416               l3 = row.length;
37417               for (k = 0; k < l3; k++) {
37418                 cell += this.renderer.tablecell(
37419                   this.parseInline(row[k].tokens),
37420                   { header: false, align: token.align[k] }
37421                 );
37422               }
37423               body += this.renderer.tablerow(cell);
37424             }
37425             out += this.renderer.table(header, body);
37426             continue;
37427           }
37428           case "blockquote": {
37429             body = this.parse(token.tokens);
37430             out += this.renderer.blockquote(body);
37431             continue;
37432           }
37433           case "list": {
37434             ordered = token.ordered;
37435             start2 = token.start;
37436             loose = token.loose;
37437             l2 = token.items.length;
37438             body = "";
37439             for (j2 = 0; j2 < l2; j2++) {
37440               item = token.items[j2];
37441               checked = item.checked;
37442               task = item.task;
37443               itemBody = "";
37444               if (item.task) {
37445                 checkbox = this.renderer.checkbox(checked);
37446                 if (loose) {
37447                   if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
37448                     item.tokens[0].text = checkbox + " " + item.tokens[0].text;
37449                     if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
37450                       item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
37451                     }
37452                   } else {
37453                     item.tokens.unshift({
37454                       type: "text",
37455                       text: checkbox
37456                     });
37457                   }
37458                 } else {
37459                   itemBody += checkbox;
37460                 }
37461               }
37462               itemBody += this.parse(item.tokens, loose);
37463               body += this.renderer.listitem(itemBody, task, checked);
37464             }
37465             out += this.renderer.list(body, ordered, start2);
37466             continue;
37467           }
37468           case "html": {
37469             out += this.renderer.html(token.text);
37470             continue;
37471           }
37472           case "paragraph": {
37473             out += this.renderer.paragraph(this.parseInline(token.tokens));
37474             continue;
37475           }
37476           case "text": {
37477             body = token.tokens ? this.parseInline(token.tokens) : token.text;
37478             while (i2 + 1 < l && tokens[i2 + 1].type === "text") {
37479               token = tokens[++i2];
37480               body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text);
37481             }
37482             out += top ? this.renderer.paragraph(body) : body;
37483             continue;
37484           }
37485           default: {
37486             const errMsg = 'Token with "' + token.type + '" type was not found.';
37487             if (this.options.silent) {
37488               console.error(errMsg);
37489               return;
37490             } else {
37491               throw new Error(errMsg);
37492             }
37493           }
37494         }
37495       }
37496       return out;
37497     }
37498     /**
37499      * Parse Inline Tokens
37500      */
37501     parseInline(tokens, renderer) {
37502       renderer = renderer || this.renderer;
37503       let out = "", i2, token, ret;
37504       const l = tokens.length;
37505       for (i2 = 0; i2 < l; i2++) {
37506         token = tokens[i2];
37507         if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
37508           ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
37509           if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) {
37510             out += ret || "";
37511             continue;
37512           }
37513         }
37514         switch (token.type) {
37515           case "escape": {
37516             out += renderer.text(token.text);
37517             break;
37518           }
37519           case "html": {
37520             out += renderer.html(token.text);
37521             break;
37522           }
37523           case "link": {
37524             out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
37525             break;
37526           }
37527           case "image": {
37528             out += renderer.image(token.href, token.title, token.text);
37529             break;
37530           }
37531           case "strong": {
37532             out += renderer.strong(this.parseInline(token.tokens, renderer));
37533             break;
37534           }
37535           case "em": {
37536             out += renderer.em(this.parseInline(token.tokens, renderer));
37537             break;
37538           }
37539           case "codespan": {
37540             out += renderer.codespan(token.text);
37541             break;
37542           }
37543           case "br": {
37544             out += renderer.br();
37545             break;
37546           }
37547           case "del": {
37548             out += renderer.del(this.parseInline(token.tokens, renderer));
37549             break;
37550           }
37551           case "text": {
37552             out += renderer.text(token.text);
37553             break;
37554           }
37555           default: {
37556             const errMsg = 'Token with "' + token.type + '" type was not found.';
37557             if (this.options.silent) {
37558               console.error(errMsg);
37559               return;
37560             } else {
37561               throw new Error(errMsg);
37562             }
37563           }
37564         }
37565       }
37566       return out;
37567     }
37568   };
37569   function marked(src, opt, callback) {
37570     if (typeof src === "undefined" || src === null) {
37571       throw new Error("marked(): input parameter is undefined or null");
37572     }
37573     if (typeof src !== "string") {
37574       throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected");
37575     }
37576     if (typeof opt === "function") {
37577       callback = opt;
37578       opt = null;
37579     }
37580     opt = merge2({}, marked.defaults, opt || {});
37581     checkSanitizeDeprecation(opt);
37582     if (callback) {
37583       const highlight = opt.highlight;
37584       let tokens;
37585       try {
37586         tokens = Lexer.lex(src, opt);
37587       } catch (e) {
37588         return callback(e);
37589       }
37590       const done = function(err) {
37591         let out;
37592         if (!err) {
37593           try {
37594             if (opt.walkTokens) {
37595               marked.walkTokens(tokens, opt.walkTokens);
37596             }
37597             out = Parser.parse(tokens, opt);
37598           } catch (e) {
37599             err = e;
37600           }
37601         }
37602         opt.highlight = highlight;
37603         return err ? callback(err) : callback(null, out);
37604       };
37605       if (!highlight || highlight.length < 3) {
37606         return done();
37607       }
37608       delete opt.highlight;
37609       if (!tokens.length)
37610         return done();
37611       let pending = 0;
37612       marked.walkTokens(tokens, function(token) {
37613         if (token.type === "code") {
37614           pending++;
37615           setTimeout(() => {
37616             highlight(token.text, token.lang, function(err, code) {
37617               if (err) {
37618                 return done(err);
37619               }
37620               if (code != null && code !== token.text) {
37621                 token.text = code;
37622                 token.escaped = true;
37623               }
37624               pending--;
37625               if (pending === 0) {
37626                 done();
37627               }
37628             });
37629           }, 0);
37630         }
37631       });
37632       if (pending === 0) {
37633         done();
37634       }
37635       return;
37636     }
37637     function onError(e) {
37638       e.message += "\nPlease report this to https://github.com/markedjs/marked.";
37639       if (opt.silent) {
37640         return "<p>An error occurred:</p><pre>" + escape4(e.message + "", true) + "</pre>";
37641       }
37642       throw e;
37643     }
37644     try {
37645       const tokens = Lexer.lex(src, opt);
37646       if (opt.walkTokens) {
37647         if (opt.async) {
37648           return Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(() => {
37649             return Parser.parse(tokens, opt);
37650           }).catch(onError);
37651         }
37652         marked.walkTokens(tokens, opt.walkTokens);
37653       }
37654       return Parser.parse(tokens, opt);
37655     } catch (e) {
37656       onError(e);
37657     }
37658   }
37659   marked.options = marked.setOptions = function(opt) {
37660     merge2(marked.defaults, opt);
37661     changeDefaults(marked.defaults);
37662     return marked;
37663   };
37664   marked.getDefaults = getDefaults;
37665   marked.defaults = defaults;
37666   marked.use = function(...args) {
37667     const opts = merge2({}, ...args);
37668     const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };
37669     let hasExtensions;
37670     args.forEach((pack) => {
37671       if (pack.extensions) {
37672         hasExtensions = true;
37673         pack.extensions.forEach((ext) => {
37674           if (!ext.name) {
37675             throw new Error("extension name required");
37676           }
37677           if (ext.renderer) {
37678             const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;
37679             if (prevRenderer) {
37680               extensions.renderers[ext.name] = function(...args2) {
37681                 let ret = ext.renderer.apply(this, args2);
37682                 if (ret === false) {
37683                   ret = prevRenderer.apply(this, args2);
37684                 }
37685                 return ret;
37686               };
37687             } else {
37688               extensions.renderers[ext.name] = ext.renderer;
37689             }
37690           }
37691           if (ext.tokenizer) {
37692             if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
37693               throw new Error("extension level must be 'block' or 'inline'");
37694             }
37695             if (extensions[ext.level]) {
37696               extensions[ext.level].unshift(ext.tokenizer);
37697             } else {
37698               extensions[ext.level] = [ext.tokenizer];
37699             }
37700             if (ext.start) {
37701               if (ext.level === "block") {
37702                 if (extensions.startBlock) {
37703                   extensions.startBlock.push(ext.start);
37704                 } else {
37705                   extensions.startBlock = [ext.start];
37706                 }
37707               } else if (ext.level === "inline") {
37708                 if (extensions.startInline) {
37709                   extensions.startInline.push(ext.start);
37710                 } else {
37711                   extensions.startInline = [ext.start];
37712                 }
37713               }
37714             }
37715           }
37716           if (ext.childTokens) {
37717             extensions.childTokens[ext.name] = ext.childTokens;
37718           }
37719         });
37720       }
37721       if (pack.renderer) {
37722         const renderer = marked.defaults.renderer || new Renderer();
37723         for (const prop in pack.renderer) {
37724           const prevRenderer = renderer[prop];
37725           renderer[prop] = (...args2) => {
37726             let ret = pack.renderer[prop].apply(renderer, args2);
37727             if (ret === false) {
37728               ret = prevRenderer.apply(renderer, args2);
37729             }
37730             return ret;
37731           };
37732         }
37733         opts.renderer = renderer;
37734       }
37735       if (pack.tokenizer) {
37736         const tokenizer = marked.defaults.tokenizer || new Tokenizer();
37737         for (const prop in pack.tokenizer) {
37738           const prevTokenizer = tokenizer[prop];
37739           tokenizer[prop] = (...args2) => {
37740             let ret = pack.tokenizer[prop].apply(tokenizer, args2);
37741             if (ret === false) {
37742               ret = prevTokenizer.apply(tokenizer, args2);
37743             }
37744             return ret;
37745           };
37746         }
37747         opts.tokenizer = tokenizer;
37748       }
37749       if (pack.walkTokens) {
37750         const walkTokens2 = marked.defaults.walkTokens;
37751         opts.walkTokens = function(token) {
37752           let values = [];
37753           values.push(pack.walkTokens.call(this, token));
37754           if (walkTokens2) {
37755             values = values.concat(walkTokens2.call(this, token));
37756           }
37757           return values;
37758         };
37759       }
37760       if (hasExtensions) {
37761         opts.extensions = extensions;
37762       }
37763       marked.setOptions(opts);
37764     });
37765   };
37766   marked.walkTokens = function(tokens, callback) {
37767     let values = [];
37768     for (const token of tokens) {
37769       values = values.concat(callback.call(marked, token));
37770       switch (token.type) {
37771         case "table": {
37772           for (const cell of token.header) {
37773             values = values.concat(marked.walkTokens(cell.tokens, callback));
37774           }
37775           for (const row of token.rows) {
37776             for (const cell of row) {
37777               values = values.concat(marked.walkTokens(cell.tokens, callback));
37778             }
37779           }
37780           break;
37781         }
37782         case "list": {
37783           values = values.concat(marked.walkTokens(token.items, callback));
37784           break;
37785         }
37786         default: {
37787           if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
37788             marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {
37789               values = values.concat(marked.walkTokens(token[childTokens], callback));
37790             });
37791           } else if (token.tokens) {
37792             values = values.concat(marked.walkTokens(token.tokens, callback));
37793           }
37794         }
37795       }
37796     }
37797     return values;
37798   };
37799   marked.parseInline = function(src, opt) {
37800     if (typeof src === "undefined" || src === null) {
37801       throw new Error("marked.parseInline(): input parameter is undefined or null");
37802     }
37803     if (typeof src !== "string") {
37804       throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected");
37805     }
37806     opt = merge2({}, marked.defaults, opt || {});
37807     checkSanitizeDeprecation(opt);
37808     try {
37809       const tokens = Lexer.lexInline(src, opt);
37810       if (opt.walkTokens) {
37811         marked.walkTokens(tokens, opt.walkTokens);
37812       }
37813       return Parser.parseInline(tokens, opt);
37814     } catch (e) {
37815       e.message += "\nPlease report this to https://github.com/markedjs/marked.";
37816       if (opt.silent) {
37817         return "<p>An error occurred:</p><pre>" + escape4(e.message + "", true) + "</pre>";
37818       }
37819       throw e;
37820     }
37821   };
37822   marked.Parser = Parser;
37823   marked.parser = Parser.parse;
37824   marked.Renderer = Renderer;
37825   marked.TextRenderer = TextRenderer;
37826   marked.Lexer = Lexer;
37827   marked.lexer = Lexer.lex;
37828   marked.Tokenizer = Tokenizer;
37829   marked.Slugger = Slugger;
37830   marked.parse = marked;
37831   var options = marked.options;
37832   var setOptions = marked.setOptions;
37833   var use = marked.use;
37834   var walkTokens = marked.walkTokens;
37835   var parseInline = marked.parseInline;
37836   var parser2 = Parser.parse;
37837   var lexer = Lexer.lex;
37838
37839   // modules/services/osmose.js
37840   var tiler3 = utilTiler();
37841   var dispatch4 = dispatch_default("loaded");
37842   var _tileZoom3 = 14;
37843   var _osmoseUrlRoot = "https://osmose.openstreetmap.fr/api/0.3";
37844   var _osmoseData = { icons: {}, items: [] };
37845   var _cache3;
37846   function abortRequest3(controller) {
37847     if (controller) {
37848       controller.abort();
37849     }
37850   }
37851   function abortUnwantedRequests3(cache, tiles) {
37852     Object.keys(cache.inflightTile).forEach((k) => {
37853       let wanted = tiles.find((tile) => k === tile.id);
37854       if (!wanted) {
37855         abortRequest3(cache.inflightTile[k]);
37856         delete cache.inflightTile[k];
37857       }
37858     });
37859   }
37860   function encodeIssueRtree3(d) {
37861     return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
37862   }
37863   function updateRtree3(item, replace) {
37864     _cache3.rtree.remove(item, (a, b) => a.data.id === b.data.id);
37865     if (replace) {
37866       _cache3.rtree.insert(item);
37867     }
37868   }
37869   function preventCoincident2(loc) {
37870     let coincident = false;
37871     do {
37872       let delta = coincident ? [1e-5, 0] : [0, 1e-5];
37873       loc = geoVecAdd(loc, delta);
37874       let bbox2 = geoExtent(loc).bbox();
37875       coincident = _cache3.rtree.search(bbox2).length;
37876     } while (coincident);
37877     return loc;
37878   }
37879   var osmose_default = {
37880     title: "osmose",
37881     init() {
37882       _mainFileFetcher.get("qa_data").then((d) => {
37883         _osmoseData = d.osmose;
37884         _osmoseData.items = Object.keys(d.osmose.icons).map((s) => s.split("-")[0]).reduce((unique, item) => unique.indexOf(item) !== -1 ? unique : [...unique, item], []);
37885       });
37886       if (!_cache3) {
37887         this.reset();
37888       }
37889       this.event = utilRebind(this, dispatch4, "on");
37890     },
37891     reset() {
37892       let _strings = {};
37893       let _colors = {};
37894       if (_cache3) {
37895         Object.values(_cache3.inflightTile).forEach(abortRequest3);
37896         _strings = _cache3.strings;
37897         _colors = _cache3.colors;
37898       }
37899       _cache3 = {
37900         data: {},
37901         loadedTile: {},
37902         inflightTile: {},
37903         inflightPost: {},
37904         closed: {},
37905         rtree: new import_rbush3.default(),
37906         strings: _strings,
37907         colors: _colors
37908       };
37909     },
37910     loadIssues(projection2) {
37911       let params = {
37912         // Tiles return a maximum # of issues
37913         // So we want to filter our request for only types iD supports
37914         item: _osmoseData.items
37915       };
37916       let tiles = tiler3.zoomExtent([_tileZoom3, _tileZoom3]).getTiles(projection2);
37917       abortUnwantedRequests3(_cache3, tiles);
37918       tiles.forEach((tile) => {
37919         if (_cache3.loadedTile[tile.id] || _cache3.inflightTile[tile.id])
37920           return;
37921         let [x, y, z] = tile.xyz;
37922         let url = `${_osmoseUrlRoot}/issues/${z}/${x}/${y}.geojson?` + utilQsString(params);
37923         let controller = new AbortController();
37924         _cache3.inflightTile[tile.id] = controller;
37925         json_default(url, { signal: controller.signal }).then((data) => {
37926           delete _cache3.inflightTile[tile.id];
37927           _cache3.loadedTile[tile.id] = true;
37928           if (data.features) {
37929             data.features.forEach((issue) => {
37930               const { item, class: cl, uuid: id2 } = issue.properties;
37931               const itemType = `${item}-${cl}`;
37932               if (itemType in _osmoseData.icons) {
37933                 let loc = issue.geometry.coordinates;
37934                 loc = preventCoincident2(loc);
37935                 let d = new QAItem(loc, this, itemType, id2, { item });
37936                 if (item === 8300 || item === 8360) {
37937                   d.elems = [];
37938                 }
37939                 _cache3.data[d.id] = d;
37940                 _cache3.rtree.insert(encodeIssueRtree3(d));
37941               }
37942             });
37943           }
37944           dispatch4.call("loaded");
37945         }).catch(() => {
37946           delete _cache3.inflightTile[tile.id];
37947           _cache3.loadedTile[tile.id] = true;
37948         });
37949       });
37950     },
37951     loadIssueDetail(issue) {
37952       if (issue.elems !== void 0) {
37953         return Promise.resolve(issue);
37954       }
37955       const url = `${_osmoseUrlRoot}/issue/${issue.id}?langs=${_mainLocalizer.localeCode()}`;
37956       const cacheDetails = (data) => {
37957         issue.elems = data.elems.map((e) => e.type.substring(0, 1) + e.id);
37958         issue.detail = data.subtitle ? marked(data.subtitle.auto) : "";
37959         this.replaceItem(issue);
37960       };
37961       return json_default(url).then(cacheDetails).then(() => issue);
37962     },
37963     loadStrings(locale2 = _mainLocalizer.localeCode()) {
37964       const items = Object.keys(_osmoseData.icons);
37965       if (locale2 in _cache3.strings && Object.keys(_cache3.strings[locale2]).length === items.length) {
37966         return Promise.resolve(_cache3.strings[locale2]);
37967       }
37968       if (!(locale2 in _cache3.strings)) {
37969         _cache3.strings[locale2] = {};
37970       }
37971       const allRequests = items.map((itemType) => {
37972         if (itemType in _cache3.strings[locale2])
37973           return null;
37974         const cacheData = (data) => {
37975           const [cat = { items: [] }] = data.categories;
37976           const [item2 = { class: [] }] = cat.items;
37977           const [cl2 = null] = item2.class;
37978           if (!cl2) {
37979             console.log(`Osmose strings request (${itemType}) had unexpected data`);
37980             return;
37981           }
37982           const { item: itemInt, color: color2 } = item2;
37983           if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color2)) {
37984             _cache3.colors[itemInt] = color2;
37985           }
37986           const { title, detail, fix, trap } = cl2;
37987           let issueStrings = {};
37988           if (title)
37989             issueStrings.title = title.auto;
37990           if (detail)
37991             issueStrings.detail = marked(detail.auto);
37992           if (trap)
37993             issueStrings.trap = marked(trap.auto);
37994           if (fix)
37995             issueStrings.fix = marked(fix.auto);
37996           _cache3.strings[locale2][itemType] = issueStrings;
37997         };
37998         const [item, cl] = itemType.split("-");
37999         const url = `${_osmoseUrlRoot}/items/${item}/class/${cl}?langs=${locale2}`;
38000         return json_default(url).then(cacheData);
38001       }).filter(Boolean);
38002       return Promise.all(allRequests).then(() => _cache3.strings[locale2]);
38003     },
38004     getStrings(itemType, locale2 = _mainLocalizer.localeCode()) {
38005       return locale2 in _cache3.strings ? _cache3.strings[locale2][itemType] : {};
38006     },
38007     getColor(itemType) {
38008       return itemType in _cache3.colors ? _cache3.colors[itemType] : "#FFFFFF";
38009     },
38010     postUpdate(issue, callback) {
38011       if (_cache3.inflightPost[issue.id]) {
38012         return callback({ message: "Issue update already inflight", status: -2 }, issue);
38013       }
38014       const url = `${_osmoseUrlRoot}/issue/${issue.id}/${issue.newStatus}`;
38015       const controller = new AbortController();
38016       const after = () => {
38017         delete _cache3.inflightPost[issue.id];
38018         this.removeItem(issue);
38019         if (issue.newStatus === "done") {
38020           if (!(issue.item in _cache3.closed)) {
38021             _cache3.closed[issue.item] = 0;
38022           }
38023           _cache3.closed[issue.item] += 1;
38024         }
38025         if (callback)
38026           callback(null, issue);
38027       };
38028       _cache3.inflightPost[issue.id] = controller;
38029       fetch(url, { signal: controller.signal }).then(after).catch((err) => {
38030         delete _cache3.inflightPost[issue.id];
38031         if (callback)
38032           callback(err.message);
38033       });
38034     },
38035     // Get all cached QAItems covering the viewport
38036     getItems(projection2) {
38037       const viewport = projection2.clipExtent();
38038       const min3 = [viewport[0][0], viewport[1][1]];
38039       const max3 = [viewport[1][0], viewport[0][1]];
38040       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
38041       return _cache3.rtree.search(bbox2).map((d) => d.data);
38042     },
38043     // Get a QAItem from cache
38044     // NOTE: Don't change method name until UI v3 is merged
38045     getError(id2) {
38046       return _cache3.data[id2];
38047     },
38048     // get the name of the icon to display for this item
38049     getIcon(itemType) {
38050       return _osmoseData.icons[itemType];
38051     },
38052     // Replace a single QAItem in the cache
38053     replaceItem(item) {
38054       if (!(item instanceof QAItem) || !item.id)
38055         return;
38056       _cache3.data[item.id] = item;
38057       updateRtree3(encodeIssueRtree3(item), true);
38058       return item;
38059     },
38060     // Remove a single QAItem from the cache
38061     removeItem(item) {
38062       if (!(item instanceof QAItem) || !item.id)
38063         return;
38064       delete _cache3.data[item.id];
38065       updateRtree3(encodeIssueRtree3(item), false);
38066     },
38067     // Used to populate `closed:osmose:*` changeset tags
38068     getClosedCounts() {
38069       return _cache3.closed;
38070     },
38071     itemURL(item) {
38072       return `https://osmose.openstreetmap.fr/en/error/${item.id}`;
38073     }
38074   };
38075
38076   // modules/services/mapillary.js
38077   var import_pbf = __toESM(require_pbf());
38078   var import_rbush4 = __toESM(require_rbush_min());
38079   var import_vector_tile = __toESM(require_vector_tile());
38080   var accessToken = "MLY|4100327730013843|5bb78b81720791946a9a7b956c57b7cf";
38081   var apiUrl = "https://graph.mapillary.com/";
38082   var baseTileUrl = "https://tiles.mapillary.com/maps/vtp";
38083   var mapFeatureTileUrl = `${baseTileUrl}/mly_map_feature_point/2/{z}/{x}/{y}?access_token=${accessToken}`;
38084   var tileUrl = `${baseTileUrl}/mly1_public/2/{z}/{x}/{y}?access_token=${accessToken}`;
38085   var trafficSignTileUrl = `${baseTileUrl}/mly_map_feature_traffic_sign/2/{z}/{x}/{y}?access_token=${accessToken}`;
38086   var viewercss = "mapillary-js/mapillary.css";
38087   var viewerjs = "mapillary-js/mapillary.js";
38088   var minZoom = 14;
38089   var dispatch5 = dispatch_default("change", "loadedImages", "loadedSigns", "loadedMapFeatures", "bearingChanged", "imageChanged");
38090   var _loadViewerPromise;
38091   var _mlyActiveImage;
38092   var _mlyCache;
38093   var _mlyFallback = false;
38094   var _mlyHighlightedDetection;
38095   var _mlyShowFeatureDetections = false;
38096   var _mlyShowSignDetections = false;
38097   var _mlyViewer;
38098   var _mlyViewerFilter = ["all"];
38099   function loadTiles(which, url, maxZoom2, projection2) {
38100     const tiler8 = utilTiler().zoomExtent([minZoom, maxZoom2]).skipNullIsland(true);
38101     const tiles = tiler8.getTiles(projection2);
38102     tiles.forEach(function(tile) {
38103       loadTile(which, url, tile);
38104     });
38105   }
38106   function loadTile(which, url, tile) {
38107     const cache = _mlyCache.requests;
38108     const tileId = `${tile.id}-${which}`;
38109     if (cache.loaded[tileId] || cache.inflight[tileId])
38110       return;
38111     const controller = new AbortController();
38112     cache.inflight[tileId] = controller;
38113     const requestUrl = url.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace("{z}", tile.xyz[2]);
38114     fetch(requestUrl, { signal: controller.signal }).then(function(response) {
38115       if (!response.ok) {
38116         throw new Error(response.status + " " + response.statusText);
38117       }
38118       cache.loaded[tileId] = true;
38119       delete cache.inflight[tileId];
38120       return response.arrayBuffer();
38121     }).then(function(data) {
38122       if (!data) {
38123         throw new Error("No Data");
38124       }
38125       loadTileDataToCache(data, tile, which);
38126       if (which === "images") {
38127         dispatch5.call("loadedImages");
38128       } else if (which === "signs") {
38129         dispatch5.call("loadedSigns");
38130       } else if (which === "points") {
38131         dispatch5.call("loadedMapFeatures");
38132       }
38133     }).catch(function() {
38134       cache.loaded[tileId] = true;
38135       delete cache.inflight[tileId];
38136     });
38137   }
38138   function loadTileDataToCache(data, tile, which) {
38139     const vectorTile = new import_vector_tile.VectorTile(new import_pbf.default(data));
38140     let features, cache, layer, i2, feature3, loc, d;
38141     if (vectorTile.layers.hasOwnProperty("image")) {
38142       features = [];
38143       cache = _mlyCache.images;
38144       layer = vectorTile.layers.image;
38145       for (i2 = 0; i2 < layer.length; i2++) {
38146         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
38147         loc = feature3.geometry.coordinates;
38148         d = {
38149           loc,
38150           captured_at: feature3.properties.captured_at,
38151           ca: feature3.properties.compass_angle,
38152           id: feature3.properties.id,
38153           is_pano: feature3.properties.is_pano,
38154           sequence_id: feature3.properties.sequence_id
38155         };
38156         cache.forImageId[d.id] = d;
38157         features.push({
38158           minX: loc[0],
38159           minY: loc[1],
38160           maxX: loc[0],
38161           maxY: loc[1],
38162           data: d
38163         });
38164       }
38165       if (cache.rtree) {
38166         cache.rtree.load(features);
38167       }
38168     }
38169     if (vectorTile.layers.hasOwnProperty("sequence")) {
38170       features = [];
38171       cache = _mlyCache.sequences;
38172       layer = vectorTile.layers.sequence;
38173       for (i2 = 0; i2 < layer.length; i2++) {
38174         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
38175         if (cache.lineString[feature3.properties.id]) {
38176           cache.lineString[feature3.properties.id].push(feature3);
38177         } else {
38178           cache.lineString[feature3.properties.id] = [feature3];
38179         }
38180       }
38181     }
38182     if (vectorTile.layers.hasOwnProperty("point")) {
38183       features = [];
38184       cache = _mlyCache[which];
38185       layer = vectorTile.layers.point;
38186       for (i2 = 0; i2 < layer.length; i2++) {
38187         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
38188         loc = feature3.geometry.coordinates;
38189         d = {
38190           loc,
38191           id: feature3.properties.id,
38192           first_seen_at: feature3.properties.first_seen_at,
38193           last_seen_at: feature3.properties.last_seen_at,
38194           value: feature3.properties.value
38195         };
38196         features.push({
38197           minX: loc[0],
38198           minY: loc[1],
38199           maxX: loc[0],
38200           maxY: loc[1],
38201           data: d
38202         });
38203       }
38204       if (cache.rtree) {
38205         cache.rtree.load(features);
38206       }
38207     }
38208     if (vectorTile.layers.hasOwnProperty("traffic_sign")) {
38209       features = [];
38210       cache = _mlyCache[which];
38211       layer = vectorTile.layers.traffic_sign;
38212       for (i2 = 0; i2 < layer.length; i2++) {
38213         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
38214         loc = feature3.geometry.coordinates;
38215         d = {
38216           loc,
38217           id: feature3.properties.id,
38218           first_seen_at: feature3.properties.first_seen_at,
38219           last_seen_at: feature3.properties.last_seen_at,
38220           value: feature3.properties.value
38221         };
38222         features.push({
38223           minX: loc[0],
38224           minY: loc[1],
38225           maxX: loc[0],
38226           maxY: loc[1],
38227           data: d
38228         });
38229       }
38230       if (cache.rtree) {
38231         cache.rtree.load(features);
38232       }
38233     }
38234   }
38235   function loadData(url) {
38236     return fetch(url).then(function(response) {
38237       if (!response.ok) {
38238         throw new Error(response.status + " " + response.statusText);
38239       }
38240       return response.json();
38241     }).then(function(result) {
38242       if (!result) {
38243         return [];
38244       }
38245       return result.data || [];
38246     });
38247   }
38248   function partitionViewport(projection2) {
38249     const z = geoScaleToZoom(projection2.scale());
38250     const z2 = Math.ceil(z * 2) / 2 + 2.5;
38251     const tiler8 = utilTiler().zoomExtent([z2, z2]);
38252     return tiler8.getTiles(projection2).map(function(tile) {
38253       return tile.extent;
38254     });
38255   }
38256   function searchLimited(limit, projection2, rtree) {
38257     limit = limit || 5;
38258     return partitionViewport(projection2).reduce(function(result, extent) {
38259       const found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) {
38260         return d.data;
38261       });
38262       return found.length ? result.concat(found) : result;
38263     }, []);
38264   }
38265   var mapillary_default = {
38266     // Initialize Mapillary
38267     init: function() {
38268       if (!_mlyCache) {
38269         this.reset();
38270       }
38271       this.event = utilRebind(this, dispatch5, "on");
38272     },
38273     // Reset cache and state
38274     reset: function() {
38275       if (_mlyCache) {
38276         Object.values(_mlyCache.requests.inflight).forEach(function(request3) {
38277           request3.abort();
38278         });
38279       }
38280       _mlyCache = {
38281         images: { rtree: new import_rbush4.default(), forImageId: {} },
38282         image_detections: { forImageId: {} },
38283         signs: { rtree: new import_rbush4.default() },
38284         points: { rtree: new import_rbush4.default() },
38285         sequences: { rtree: new import_rbush4.default(), lineString: {} },
38286         requests: { loaded: {}, inflight: {} }
38287       };
38288       _mlyActiveImage = null;
38289     },
38290     // Get visible images
38291     images: function(projection2) {
38292       const limit = 5;
38293       return searchLimited(limit, projection2, _mlyCache.images.rtree);
38294     },
38295     // Get visible traffic signs
38296     signs: function(projection2) {
38297       const limit = 5;
38298       return searchLimited(limit, projection2, _mlyCache.signs.rtree);
38299     },
38300     // Get visible map (point) features
38301     mapFeatures: function(projection2) {
38302       const limit = 5;
38303       return searchLimited(limit, projection2, _mlyCache.points.rtree);
38304     },
38305     // Get cached image by id
38306     cachedImage: function(imageId) {
38307       return _mlyCache.images.forImageId[imageId];
38308     },
38309     // Get visible sequences
38310     sequences: function(projection2) {
38311       const viewport = projection2.clipExtent();
38312       const min3 = [viewport[0][0], viewport[1][1]];
38313       const max3 = [viewport[1][0], viewport[0][1]];
38314       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
38315       const sequenceIds = {};
38316       let lineStrings = [];
38317       _mlyCache.images.rtree.search(bbox2).forEach(function(d) {
38318         if (d.data.sequence_id) {
38319           sequenceIds[d.data.sequence_id] = true;
38320         }
38321       });
38322       Object.keys(sequenceIds).forEach(function(sequenceId) {
38323         if (_mlyCache.sequences.lineString[sequenceId]) {
38324           lineStrings = lineStrings.concat(_mlyCache.sequences.lineString[sequenceId]);
38325         }
38326       });
38327       return lineStrings;
38328     },
38329     // Load images in the visible area
38330     loadImages: function(projection2) {
38331       loadTiles("images", tileUrl, 14, projection2);
38332     },
38333     // Load traffic signs in the visible area
38334     loadSigns: function(projection2) {
38335       loadTiles("signs", trafficSignTileUrl, 14, projection2);
38336     },
38337     // Load map (point) features in the visible area
38338     loadMapFeatures: function(projection2) {
38339       loadTiles("points", mapFeatureTileUrl, 14, projection2);
38340     },
38341     // Return a promise that resolves when the image viewer (Mapillary JS) library has finished loading
38342     ensureViewerLoaded: function(context) {
38343       if (_loadViewerPromise)
38344         return _loadViewerPromise;
38345       const wrap2 = context.container().select(".photoviewer").selectAll(".mly-wrapper").data([0]);
38346       wrap2.enter().append("div").attr("id", "ideditor-mly").attr("class", "photo-wrapper mly-wrapper").classed("hide", true);
38347       const that = this;
38348       _loadViewerPromise = new Promise((resolve, reject) => {
38349         let loadedCount = 0;
38350         function loaded() {
38351           loadedCount += 1;
38352           if (loadedCount === 2)
38353             resolve();
38354         }
38355         const head = select_default2("head");
38356         head.selectAll("#ideditor-mapillary-viewercss").data([0]).enter().append("link").attr("id", "ideditor-mapillary-viewercss").attr("rel", "stylesheet").attr("crossorigin", "anonymous").attr("href", context.asset(viewercss)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() {
38357           reject();
38358         });
38359         head.selectAll("#ideditor-mapillary-viewerjs").data([0]).enter().append("script").attr("id", "ideditor-mapillary-viewerjs").attr("crossorigin", "anonymous").attr("src", context.asset(viewerjs)).on("load.serviceMapillary", loaded).on("error.serviceMapillary", function() {
38360           reject();
38361         });
38362       }).catch(function() {
38363         _loadViewerPromise = null;
38364       }).then(function() {
38365         that.initViewer(context);
38366       });
38367       return _loadViewerPromise;
38368     },
38369     // Load traffic sign image sprites
38370     loadSignResources: function(context) {
38371       context.ui().svgDefs.addSprites(
38372         ["mapillary-sprite"],
38373         false
38374         /* don't override colors */
38375       );
38376       return this;
38377     },
38378     // Load map (point) feature image sprites
38379     loadObjectResources: function(context) {
38380       context.ui().svgDefs.addSprites(
38381         ["mapillary-object-sprite"],
38382         false
38383         /* don't override colors */
38384       );
38385       return this;
38386     },
38387     // Remove previous detections in image viewer
38388     resetTags: function() {
38389       if (_mlyViewer && !_mlyFallback) {
38390         _mlyViewer.getComponent("tag").removeAll();
38391       }
38392     },
38393     // Show map feature detections in image viewer
38394     showFeatureDetections: function(value) {
38395       _mlyShowFeatureDetections = value;
38396       if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
38397         this.resetTags();
38398       }
38399     },
38400     // Show traffic sign detections in image viewer
38401     showSignDetections: function(value) {
38402       _mlyShowSignDetections = value;
38403       if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
38404         this.resetTags();
38405       }
38406     },
38407     // Apply filter to image viewer
38408     filterViewer: function(context) {
38409       const showsPano = context.photos().showsPanoramic();
38410       const showsFlat = context.photos().showsFlat();
38411       const fromDate = context.photos().fromDate();
38412       const toDate = context.photos().toDate();
38413       const filter2 = ["all"];
38414       if (!showsPano)
38415         filter2.push(["!=", "cameraType", "spherical"]);
38416       if (!showsFlat && showsPano)
38417         filter2.push(["==", "pano", true]);
38418       if (fromDate) {
38419         filter2.push([">=", "capturedAt", new Date(fromDate).getTime()]);
38420       }
38421       if (toDate) {
38422         filter2.push([">=", "capturedAt", new Date(toDate).getTime()]);
38423       }
38424       if (_mlyViewer) {
38425         _mlyViewer.setFilter(filter2);
38426       }
38427       _mlyViewerFilter = filter2;
38428       return filter2;
38429     },
38430     // Make the image viewer visible
38431     showViewer: function(context) {
38432       const wrap2 = context.container().select(".photoviewer").classed("hide", false);
38433       const isHidden = wrap2.selectAll(".photo-wrapper.mly-wrapper.hide").size();
38434       if (isHidden && _mlyViewer) {
38435         wrap2.selectAll(".photo-wrapper:not(.mly-wrapper)").classed("hide", true);
38436         wrap2.selectAll(".photo-wrapper.mly-wrapper").classed("hide", false);
38437         _mlyViewer.resize();
38438       }
38439       return this;
38440     },
38441     // Hide the image viewer and resets map markers
38442     hideViewer: function(context) {
38443       _mlyActiveImage = null;
38444       if (!_mlyFallback && _mlyViewer) {
38445         _mlyViewer.getComponent("sequence").stop();
38446       }
38447       const viewer = context.container().select(".photoviewer");
38448       if (!viewer.empty())
38449         viewer.datum(null);
38450       viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
38451       this.updateUrlImage(null);
38452       dispatch5.call("imageChanged");
38453       dispatch5.call("loadedMapFeatures");
38454       dispatch5.call("loadedSigns");
38455       return this.setStyles(context, null);
38456     },
38457     // Update the URL with current image id
38458     updateUrlImage: function(imageId) {
38459       if (!window.mocha) {
38460         const hash = utilStringQs(window.location.hash);
38461         if (imageId) {
38462           hash.photo = "mapillary/" + imageId;
38463         } else {
38464           delete hash.photo;
38465         }
38466         window.location.replace("#" + utilQsString(hash, true));
38467       }
38468     },
38469     // Highlight the detection in the viewer that is related to the clicked map feature
38470     highlightDetection: function(detection) {
38471       if (detection) {
38472         _mlyHighlightedDetection = detection.id;
38473       }
38474       return this;
38475     },
38476     // Initialize image viewer (Mapillar JS)
38477     initViewer: function(context) {
38478       const that = this;
38479       if (!window.mapillary)
38480         return;
38481       const opts = {
38482         accessToken,
38483         component: {
38484           cover: false,
38485           keyboard: false,
38486           tag: true
38487         },
38488         container: "ideditor-mly"
38489       };
38490       if (!mapillary.isSupported() && mapillary.isFallbackSupported()) {
38491         _mlyFallback = true;
38492         opts.component = {
38493           cover: false,
38494           direction: false,
38495           imagePlane: false,
38496           keyboard: false,
38497           mouse: false,
38498           sequence: false,
38499           tag: false,
38500           image: true,
38501           // fallback
38502           navigation: true
38503           // fallback
38504         };
38505       }
38506       _mlyViewer = new mapillary.Viewer(opts);
38507       _mlyViewer.on("image", imageChanged);
38508       _mlyViewer.on("bearing", bearingChanged);
38509       if (_mlyViewerFilter) {
38510         _mlyViewer.setFilter(_mlyViewerFilter);
38511       }
38512       context.ui().photoviewer.on("resize.mapillary", function() {
38513         if (_mlyViewer)
38514           _mlyViewer.resize();
38515       });
38516       function imageChanged(node) {
38517         that.resetTags();
38518         const image = node.image;
38519         that.setActiveImage(image);
38520         that.setStyles(context, null);
38521         const loc = [image.originalLngLat.lng, image.originalLngLat.lat];
38522         context.map().centerEase(loc);
38523         that.updateUrlImage(image.id);
38524         if (_mlyShowFeatureDetections || _mlyShowSignDetections) {
38525           that.updateDetections(image.id, `${apiUrl}/${image.id}/detections?access_token=${accessToken}&fields=id,image,geometry,value`);
38526         }
38527         dispatch5.call("imageChanged");
38528       }
38529       function bearingChanged(e) {
38530         dispatch5.call("bearingChanged", void 0, e);
38531       }
38532     },
38533     // Move to an image
38534     selectImage: function(context, imageId) {
38535       if (_mlyViewer && imageId) {
38536         _mlyViewer.moveTo(imageId).catch(function(e) {
38537           console.error("mly3", e);
38538         });
38539       }
38540       return this;
38541     },
38542     // Return the currently displayed image
38543     getActiveImage: function() {
38544       return _mlyActiveImage;
38545     },
38546     // Return a list of detection objects for the given id
38547     getDetections: function(id2) {
38548       return loadData(`${apiUrl}/${id2}/detections?access_token=${accessToken}&fields=id,value,image`);
38549     },
38550     // Set the currently visible image
38551     setActiveImage: function(image) {
38552       if (image) {
38553         _mlyActiveImage = {
38554           ca: image.originalCompassAngle,
38555           id: image.id,
38556           loc: [image.originalLngLat.lng, image.originalLngLat.lat],
38557           is_pano: image.cameraType === "spherical",
38558           sequence_id: image.sequenceId
38559         };
38560       } else {
38561         _mlyActiveImage = null;
38562       }
38563     },
38564     // Update the currently highlighted sequence and selected bubble.
38565     setStyles: function(context, hovered) {
38566       const hoveredImageId = hovered && hovered.id;
38567       const hoveredSequenceId = hovered && hovered.sequence_id;
38568       const selectedSequenceId = _mlyActiveImage && _mlyActiveImage.sequence_id;
38569       context.container().selectAll(".layer-mapillary .viewfield-group").classed("highlighted", function(d) {
38570         return d.sequence_id === selectedSequenceId || d.id === hoveredImageId;
38571       }).classed("hovered", function(d) {
38572         return d.id === hoveredImageId;
38573       });
38574       context.container().selectAll(".layer-mapillary .sequence").classed("highlighted", function(d) {
38575         return d.properties.id === hoveredSequenceId;
38576       }).classed("currentView", function(d) {
38577         return d.properties.id === selectedSequenceId;
38578       });
38579       return this;
38580     },
38581     // Get detections for the current image and shows them in the image viewer
38582     updateDetections: function(imageId, url) {
38583       if (!_mlyViewer || _mlyFallback)
38584         return;
38585       if (!imageId)
38586         return;
38587       const cache = _mlyCache.image_detections;
38588       if (cache.forImageId[imageId]) {
38589         showDetections(_mlyCache.image_detections.forImageId[imageId]);
38590       } else {
38591         loadData(url).then((detections) => {
38592           detections.forEach(function(detection) {
38593             if (!cache.forImageId[imageId]) {
38594               cache.forImageId[imageId] = [];
38595             }
38596             cache.forImageId[imageId].push({
38597               geometry: detection.geometry,
38598               id: detection.id,
38599               image_id: imageId,
38600               value: detection.value
38601             });
38602           });
38603           showDetections(_mlyCache.image_detections.forImageId[imageId] || []);
38604         });
38605       }
38606       function showDetections(detections) {
38607         const tagComponent = _mlyViewer.getComponent("tag");
38608         detections.forEach(function(data) {
38609           const tag = makeTag(data);
38610           if (tag) {
38611             tagComponent.add([tag]);
38612           }
38613         });
38614       }
38615       function makeTag(data) {
38616         const valueParts = data.value.split("--");
38617         if (!valueParts.length)
38618           return;
38619         let tag;
38620         let text2;
38621         let color2 = 16777215;
38622         if (_mlyHighlightedDetection === data.id) {
38623           color2 = 16776960;
38624           text2 = valueParts[1];
38625           if (text2 === "flat" || text2 === "discrete" || text2 === "sign") {
38626             text2 = valueParts[2];
38627           }
38628           text2 = text2.replace(/-/g, " ");
38629           text2 = text2.charAt(0).toUpperCase() + text2.slice(1);
38630           _mlyHighlightedDetection = null;
38631         }
38632         var decodedGeometry = window.atob(data.geometry);
38633         var uintArray = new Uint8Array(decodedGeometry.length);
38634         for (var i2 = 0; i2 < decodedGeometry.length; i2++) {
38635           uintArray[i2] = decodedGeometry.charCodeAt(i2);
38636         }
38637         const tile = new import_vector_tile.VectorTile(new import_pbf.default(uintArray.buffer));
38638         const layer = tile.layers["mpy-or"];
38639         const geometries = layer.feature(0).loadGeometry();
38640         const polygon2 = geometries.map((ring) => ring.map((point2) => [point2.x / layer.extent, point2.y / layer.extent]));
38641         tag = new mapillary.OutlineTag(
38642           data.id,
38643           new mapillary.PolygonGeometry(polygon2[0]),
38644           {
38645             text: text2,
38646             textColor: color2,
38647             lineColor: color2,
38648             lineWidth: 2,
38649             fillColor: color2,
38650             fillOpacity: 0.3
38651           }
38652         );
38653         return tag;
38654       }
38655     },
38656     // Return the current cache
38657     cache: function() {
38658       return _mlyCache;
38659     }
38660   };
38661
38662   // modules/core/validation/models.js
38663   function validationIssue(attrs) {
38664     this.type = attrs.type;
38665     this.subtype = attrs.subtype;
38666     this.severity = attrs.severity;
38667     this.message = attrs.message;
38668     this.reference = attrs.reference;
38669     this.entityIds = attrs.entityIds;
38670     this.loc = attrs.loc;
38671     this.data = attrs.data;
38672     this.dynamicFixes = attrs.dynamicFixes;
38673     this.hash = attrs.hash;
38674     this.id = generateID.apply(this);
38675     this.key = generateKey.apply(this);
38676     this.autoFix = null;
38677     function generateID() {
38678       var parts = [this.type];
38679       if (this.hash) {
38680         parts.push(this.hash);
38681       }
38682       if (this.subtype) {
38683         parts.push(this.subtype);
38684       }
38685       if (this.entityIds) {
38686         var entityKeys = this.entityIds.slice().sort();
38687         parts.push.apply(parts, entityKeys);
38688       }
38689       return parts.join(":");
38690     }
38691     function generateKey() {
38692       return this.id + ":" + Date.now().toString();
38693     }
38694     this.extent = function(resolver) {
38695       if (this.loc) {
38696         return geoExtent(this.loc);
38697       }
38698       if (this.entityIds && this.entityIds.length) {
38699         return this.entityIds.reduce(function(extent, entityId) {
38700           return extent.extend(resolver.entity(entityId).extent(resolver));
38701         }, geoExtent());
38702       }
38703       return null;
38704     };
38705     this.fixes = function(context) {
38706       var fixes = this.dynamicFixes ? this.dynamicFixes(context) : [];
38707       var issue = this;
38708       if (issue.severity === "warning") {
38709         fixes.push(new validationIssueFix({
38710           title: _t.append("issues.fix.ignore_issue.title"),
38711           icon: "iD-icon-close",
38712           onClick: function() {
38713             context.validator().ignoreIssue(this.issue.id);
38714           }
38715         }));
38716       }
38717       fixes.forEach(function(fix) {
38718         fix.id = fix.title.stringId;
38719         fix.issue = issue;
38720         if (fix.autoArgs) {
38721           issue.autoFix = fix;
38722         }
38723       });
38724       return fixes;
38725     };
38726   }
38727   function validationIssueFix(attrs) {
38728     this.title = attrs.title;
38729     this.onClick = attrs.onClick;
38730     this.disabledReason = attrs.disabledReason;
38731     this.icon = attrs.icon;
38732     this.entityIds = attrs.entityIds || [];
38733     this.autoArgs = attrs.autoArgs;
38734     this.issue = null;
38735   }
38736
38737   // modules/services/maprules.js
38738   var buildRuleChecks = function() {
38739     return {
38740       equals: function(equals) {
38741         return function(tags) {
38742           return Object.keys(equals).every(function(k) {
38743             return equals[k] === tags[k];
38744           });
38745         };
38746       },
38747       notEquals: function(notEquals) {
38748         return function(tags) {
38749           return Object.keys(notEquals).some(function(k) {
38750             return notEquals[k] !== tags[k];
38751           });
38752         };
38753       },
38754       absence: function(absence) {
38755         return function(tags) {
38756           return Object.keys(tags).indexOf(absence) === -1;
38757         };
38758       },
38759       presence: function(presence) {
38760         return function(tags) {
38761           return Object.keys(tags).indexOf(presence) > -1;
38762         };
38763       },
38764       greaterThan: function(greaterThan) {
38765         var key = Object.keys(greaterThan)[0];
38766         var value = greaterThan[key];
38767         return function(tags) {
38768           return tags[key] > value;
38769         };
38770       },
38771       greaterThanEqual: function(greaterThanEqual) {
38772         var key = Object.keys(greaterThanEqual)[0];
38773         var value = greaterThanEqual[key];
38774         return function(tags) {
38775           return tags[key] >= value;
38776         };
38777       },
38778       lessThan: function(lessThan) {
38779         var key = Object.keys(lessThan)[0];
38780         var value = lessThan[key];
38781         return function(tags) {
38782           return tags[key] < value;
38783         };
38784       },
38785       lessThanEqual: function(lessThanEqual) {
38786         var key = Object.keys(lessThanEqual)[0];
38787         var value = lessThanEqual[key];
38788         return function(tags) {
38789           return tags[key] <= value;
38790         };
38791       },
38792       positiveRegex: function(positiveRegex) {
38793         var tagKey = Object.keys(positiveRegex)[0];
38794         var expression = positiveRegex[tagKey].join("|");
38795         var regex = new RegExp(expression);
38796         return function(tags) {
38797           return regex.test(tags[tagKey]);
38798         };
38799       },
38800       negativeRegex: function(negativeRegex) {
38801         var tagKey = Object.keys(negativeRegex)[0];
38802         var expression = negativeRegex[tagKey].join("|");
38803         var regex = new RegExp(expression);
38804         return function(tags) {
38805           return !regex.test(tags[tagKey]);
38806         };
38807       }
38808     };
38809   };
38810   var buildLineKeys = function() {
38811     return {
38812       highway: {
38813         rest_area: true,
38814         services: true
38815       },
38816       railway: {
38817         roundhouse: true,
38818         station: true,
38819         traverser: true,
38820         turntable: true,
38821         wash: true
38822       }
38823     };
38824   };
38825   var maprules_default = {
38826     init: function() {
38827       this._ruleChecks = buildRuleChecks();
38828       this._validationRules = [];
38829       this._areaKeys = osmAreaKeys;
38830       this._lineKeys = buildLineKeys();
38831     },
38832     // list of rules only relevant to tag checks...
38833     filterRuleChecks: function(selector) {
38834       var _ruleChecks = this._ruleChecks;
38835       return Object.keys(selector).reduce(function(rules, key) {
38836         if (["geometry", "error", "warning"].indexOf(key) === -1) {
38837           rules.push(_ruleChecks[key](selector[key]));
38838         }
38839         return rules;
38840       }, []);
38841     },
38842     // builds tagMap from mapcss-parse selector object...
38843     buildTagMap: function(selector) {
38844       var getRegexValues = function(regexes) {
38845         return regexes.map(function(regex) {
38846           return regex.replace(/\$|\^/g, "");
38847         });
38848       };
38849       var tagMap = Object.keys(selector).reduce(function(expectedTags, key) {
38850         var values;
38851         var isRegex = /regex/gi.test(key);
38852         var isEqual = /equals/gi.test(key);
38853         if (isRegex || isEqual) {
38854           Object.keys(selector[key]).forEach(function(selectorKey) {
38855             values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
38856             if (expectedTags.hasOwnProperty(selectorKey)) {
38857               values = values.concat(expectedTags[selectorKey]);
38858             }
38859             expectedTags[selectorKey] = values;
38860           });
38861         } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
38862           var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
38863           values = [selector[key][tagKey]];
38864           if (expectedTags.hasOwnProperty(tagKey)) {
38865             values = values.concat(expectedTags[tagKey]);
38866           }
38867           expectedTags[tagKey] = values;
38868         }
38869         return expectedTags;
38870       }, {});
38871       return tagMap;
38872     },
38873     // inspired by osmWay#isArea()
38874     inferGeometry: function(tagMap) {
38875       var _lineKeys = this._lineKeys;
38876       var _areaKeys = this._areaKeys;
38877       var keyValueDoesNotImplyArea = function(key2) {
38878         return utilArrayIntersection(tagMap[key2], Object.keys(_areaKeys[key2])).length > 0;
38879       };
38880       var keyValueImpliesLine = function(key2) {
38881         return utilArrayIntersection(tagMap[key2], Object.keys(_lineKeys[key2])).length > 0;
38882       };
38883       if (tagMap.hasOwnProperty("area")) {
38884         if (tagMap.area.indexOf("yes") > -1) {
38885           return "area";
38886         }
38887         if (tagMap.area.indexOf("no") > -1) {
38888           return "line";
38889         }
38890       }
38891       for (var key in tagMap) {
38892         if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) {
38893           return "area";
38894         }
38895         if (key in _lineKeys && keyValueImpliesLine(key)) {
38896           return "area";
38897         }
38898       }
38899       return "line";
38900     },
38901     // adds from mapcss-parse selector check...
38902     addRule: function(selector) {
38903       var rule = {
38904         // checks relevant to mapcss-selector
38905         checks: this.filterRuleChecks(selector),
38906         // true if all conditions for a tag error are true..
38907         matches: function(entity) {
38908           return this.checks.every(function(check) {
38909             return check(entity.tags);
38910           });
38911         },
38912         // borrowed from Way#isArea()
38913         inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
38914         geometryMatches: function(entity, graph) {
38915           if (entity.type === "node" || entity.type === "relation") {
38916             return selector.geometry === entity.type;
38917           } else if (entity.type === "way") {
38918             return this.inferredGeometry === entity.geometry(graph);
38919           }
38920         },
38921         // when geometries match and tag matches are present, return a warning...
38922         findIssues: function(entity, graph, issues) {
38923           if (this.geometryMatches(entity, graph) && this.matches(entity)) {
38924             var severity = Object.keys(selector).indexOf("error") > -1 ? "error" : "warning";
38925             var message = selector[severity];
38926             issues.push(new validationIssue({
38927               type: "maprules",
38928               severity,
38929               message: function() {
38930                 return message;
38931               },
38932               entityIds: [entity.id]
38933             }));
38934           }
38935         }
38936       };
38937       this._validationRules.push(rule);
38938     },
38939     clearRules: function() {
38940       this._validationRules = [];
38941     },
38942     // returns validationRules...
38943     validationRules: function() {
38944       return this._validationRules;
38945     },
38946     // returns ruleChecks
38947     ruleChecks: function() {
38948       return this._ruleChecks;
38949     }
38950   };
38951
38952   // modules/services/nominatim.js
38953   var import_rbush5 = __toESM(require_rbush_min());
38954   var apibase = nominatimApiUrl;
38955   var _inflight = {};
38956   var _nominatimCache;
38957   var nominatim_default = {
38958     init: function() {
38959       _inflight = {};
38960       _nominatimCache = new import_rbush5.default();
38961     },
38962     reset: function() {
38963       Object.values(_inflight).forEach(function(controller) {
38964         controller.abort();
38965       });
38966       _inflight = {};
38967       _nominatimCache = new import_rbush5.default();
38968     },
38969     countryCode: function(location, callback) {
38970       this.reverse(location, function(err, result) {
38971         if (err) {
38972           return callback(err);
38973         } else if (result.address) {
38974           return callback(null, result.address.country_code);
38975         } else {
38976           return callback("Unable to geocode", null);
38977         }
38978       });
38979     },
38980     reverse: function(loc, callback) {
38981       var cached = _nominatimCache.search(
38982         { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
38983       );
38984       if (cached.length > 0) {
38985         if (callback)
38986           callback(null, cached[0].data);
38987         return;
38988       }
38989       var params = { zoom: 13, format: "json", addressdetails: 1, lat: loc[1], lon: loc[0] };
38990       var url = apibase + "reverse?" + utilQsString(params);
38991       if (_inflight[url])
38992         return;
38993       var controller = new AbortController();
38994       _inflight[url] = controller;
38995       json_default(url, { signal: controller.signal }).then(function(result) {
38996         delete _inflight[url];
38997         if (result && result.error) {
38998           throw new Error(result.error);
38999         }
39000         var extent = geoExtent(loc).padByMeters(200);
39001         _nominatimCache.insert(Object.assign(extent.bbox(), { data: result }));
39002         if (callback)
39003           callback(null, result);
39004       }).catch(function(err) {
39005         delete _inflight[url];
39006         if (err.name === "AbortError")
39007           return;
39008         if (callback)
39009           callback(err.message);
39010       });
39011     },
39012     search: function(val, callback) {
39013       var searchVal = encodeURIComponent(val);
39014       var url = apibase + "search/" + searchVal + "?limit=10&format=json";
39015       if (_inflight[url])
39016         return;
39017       var controller = new AbortController();
39018       _inflight[url] = controller;
39019       json_default(url, { signal: controller.signal }).then(function(result) {
39020         delete _inflight[url];
39021         if (result && result.error) {
39022           throw new Error(result.error);
39023         }
39024         if (callback)
39025           callback(null, result);
39026       }).catch(function(err) {
39027         delete _inflight[url];
39028         if (err.name === "AbortError")
39029           return;
39030         if (callback)
39031           callback(err.message);
39032       });
39033     }
39034   };
39035
39036   // node_modules/name-suggestion-index/lib/matcher.js
39037   var import_which_polygon3 = __toESM(require_which_polygon(), 1);
39038
39039   // node_modules/name-suggestion-index/lib/simplify.js
39040   var import_diacritics2 = __toESM(require_diacritics(), 1);
39041   function simplify(str2) {
39042     if (typeof str2 !== "string")
39043       return "";
39044     return import_diacritics2.default.remove(
39045       str2.replace(/&/g, "and").replace(/İ/ig, "i").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\u2000-\u206f\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e7f\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\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase()
39046     );
39047   }
39048
39049   // node_modules/name-suggestion-index/config/matchGroups.json
39050   var matchGroups_default = {
39051     matchGroups: {
39052       adult_gaming_centre: [
39053         "amenity/casino",
39054         "amenity/gambling",
39055         "leisure/adult_gaming_centre"
39056       ],
39057       beauty: [
39058         "shop/beauty",
39059         "shop/hairdresser_supply"
39060       ],
39061       bed: [
39062         "shop/bed",
39063         "shop/furniture"
39064       ],
39065       beverages: [
39066         "shop/alcohol",
39067         "shop/beer",
39068         "shop/beverages",
39069         "shop/kiosk",
39070         "shop/wine"
39071       ],
39072       camping: [
39073         "tourism/camp_site",
39074         "tourism/caravan_site"
39075       ],
39076       car_parts: [
39077         "shop/car_parts",
39078         "shop/car_repair",
39079         "shop/tires",
39080         "shop/tyres"
39081       ],
39082       clinic: [
39083         "amenity/clinic",
39084         "amenity/doctors",
39085         "healthcare/clinic",
39086         "healthcare/laboratory",
39087         "healthcare/physiotherapist",
39088         "healthcare/sample_collection",
39089         "healthcare/dialysis"
39090       ],
39091       convenience: [
39092         "shop/beauty",
39093         "shop/chemist",
39094         "shop/convenience",
39095         "shop/cosmetics",
39096         "shop/grocery",
39097         "shop/kiosk",
39098         "shop/newsagent",
39099         "shop/perfumery"
39100       ],
39101       coworking: [
39102         "amenity/coworking_space",
39103         "office/coworking",
39104         "office/coworking_space"
39105       ],
39106       dentist: [
39107         "amenity/dentist",
39108         "amenity/doctors",
39109         "healthcare/dentist"
39110       ],
39111       electronics: [
39112         "office/telecommunication",
39113         "shop/computer",
39114         "shop/electronics",
39115         "shop/hifi",
39116         "shop/kiosk",
39117         "shop/mobile",
39118         "shop/mobile_phone",
39119         "shop/telecommunication"
39120       ],
39121       fabric: [
39122         "shop/fabric",
39123         "shop/haberdashery",
39124         "shop/sewing"
39125       ],
39126       fashion: [
39127         "shop/accessories",
39128         "shop/bag",
39129         "shop/boutique",
39130         "shop/clothes",
39131         "shop/department_store",
39132         "shop/fashion",
39133         "shop/fashion_accessories",
39134         "shop/sports",
39135         "shop/shoes"
39136       ],
39137       financial: [
39138         "amenity/bank",
39139         "office/accountant",
39140         "office/financial",
39141         "office/financial_advisor",
39142         "office/tax_advisor",
39143         "shop/tax"
39144       ],
39145       fitness: [
39146         "leisure/fitness_centre",
39147         "leisure/fitness_center",
39148         "leisure/sports_centre",
39149         "leisure/sports_center"
39150       ],
39151       food: [
39152         "amenity/bar",
39153         "amenity/cafe",
39154         "amenity/fast_food",
39155         "amenity/ice_cream",
39156         "amenity/pub",
39157         "amenity/restaurant",
39158         "shop/bakery",
39159         "shop/candy",
39160         "shop/chocolate",
39161         "shop/coffee",
39162         "shop/confectionary",
39163         "shop/confectionery",
39164         "shop/food",
39165         "shop/kiosk",
39166         "shop/ice_cream",
39167         "shop/pastry",
39168         "shop/tea"
39169       ],
39170       fuel: [
39171         "amenity/fuel",
39172         "shop/gas",
39173         "shop/convenience;gas",
39174         "shop/gas;convenience"
39175       ],
39176       gift: [
39177         "shop/gift",
39178         "shop/card",
39179         "shop/cards",
39180         "shop/kiosk",
39181         "shop/stationery"
39182       ],
39183       hardware: [
39184         "shop/bathroom_furnishing",
39185         "shop/carpet",
39186         "shop/diy",
39187         "shop/doityourself",
39188         "shop/doors",
39189         "shop/electrical",
39190         "shop/flooring",
39191         "shop/hardware",
39192         "shop/hardware_store",
39193         "shop/power_tools",
39194         "shop/tool_hire",
39195         "shop/tools",
39196         "shop/trade"
39197       ],
39198       health_food: [
39199         "shop/health",
39200         "shop/health_food",
39201         "shop/herbalist",
39202         "shop/nutrition_supplements"
39203       ],
39204       hobby: [
39205         "shop/electronics",
39206         "shop/hobby",
39207         "shop/books",
39208         "shop/games",
39209         "shop/collector",
39210         "shop/toys",
39211         "shop/model",
39212         "shop/video_games",
39213         "shop/anime"
39214       ],
39215       hospital: [
39216         "amenity/doctors",
39217         "amenity/hospital",
39218         "healthcare/hospital"
39219       ],
39220       houseware: [
39221         "shop/houseware",
39222         "shop/interior_decoration"
39223       ],
39224       lifeboat_station: [
39225         "amenity/lifeboat_station",
39226         "emergency/lifeboat_station",
39227         "emergency/marine_rescue"
39228       ],
39229       lodging: [
39230         "tourism/hotel",
39231         "tourism/motel"
39232       ],
39233       money_transfer: [
39234         "amenity/money_transfer",
39235         "shop/money_transfer"
39236       ],
39237       office_supplies: [
39238         "shop/office_supplies",
39239         "shop/stationary",
39240         "shop/stationery"
39241       ],
39242       outdoor: [
39243         "shop/clothes",
39244         "shop/outdoor",
39245         "shop/sports"
39246       ],
39247       parcel_locker: [
39248         "amenity/parcel_locker",
39249         "amenity/vending_machine"
39250       ],
39251       pharmacy: [
39252         "amenity/doctors",
39253         "amenity/pharmacy",
39254         "healthcare/pharmacy"
39255       ],
39256       playground: [
39257         "amenity/theme_park",
39258         "leisure/amusement_arcade",
39259         "leisure/playground"
39260       ],
39261       rental: [
39262         "amenity/bicycle_rental",
39263         "amenity/boat_rental",
39264         "amenity/car_rental",
39265         "amenity/truck_rental",
39266         "amenity/vehicle_rental",
39267         "shop/kiosk",
39268         "shop/rental"
39269       ],
39270       school: [
39271         "amenity/childcare",
39272         "amenity/college",
39273         "amenity/kindergarten",
39274         "amenity/language_school",
39275         "amenity/prep_school",
39276         "amenity/school",
39277         "amenity/university"
39278       ],
39279       storage: [
39280         "shop/storage_units",
39281         "shop/storage_rental"
39282       ],
39283       substation: [
39284         "power/station",
39285         "power/substation",
39286         "power/sub_station"
39287       ],
39288       supermarket: [
39289         "shop/food",
39290         "shop/frozen_food",
39291         "shop/greengrocer",
39292         "shop/grocery",
39293         "shop/supermarket",
39294         "shop/wholesale"
39295       ],
39296       variety_store: [
39297         "shop/variety_store",
39298         "shop/discount",
39299         "shop/convenience"
39300       ],
39301       vending: [
39302         "amenity/vending_machine",
39303         "shop/kiosk",
39304         "shop/vending_machine"
39305       ],
39306       weight_loss: [
39307         "amenity/clinic",
39308         "amenity/doctors",
39309         "amenity/weight_clinic",
39310         "healthcare/counselling",
39311         "leisure/fitness_centre",
39312         "office/therapist",
39313         "shop/beauty",
39314         "shop/diet",
39315         "shop/food",
39316         "shop/health_food",
39317         "shop/herbalist",
39318         "shop/nutrition",
39319         "shop/nutrition_supplements",
39320         "shop/weight_loss"
39321       ],
39322       wholesale: [
39323         "shop/wholesale",
39324         "shop/supermarket",
39325         "shop/department_store"
39326       ]
39327     }
39328   };
39329
39330   // node_modules/name-suggestion-index/config/genericWords.json
39331   var genericWords_default = {
39332     genericWords: [
39333       "^(barn|bazaa?r|bench|bou?tique|building|casa|church)$",
39334       "^(baseball|basketball|football|soccer|softball|tennis(halle)?)\\s?(field|court)?$",
39335       "^(club|green|out|ware)\\s?house$",
39336       "^(driveway|el \xE1rbol|fountain|generic|golf|government|graveyard)$",
39337       "^(fixme|n\\s?\\/?\\s?a|name|no\\s?name|none|null|temporary|test|unknown)$",
39338       "^(hofladen|librairie|magazine?|maison)$",
39339       "^(mobile home|skate)?\\s?park$",
39340       "^(obuwie|pond|pool|sale|shops?|sklep|stores?)$",
39341       "^\\?+$",
39342       "^private$",
39343       "^tattoo( studio)?$",
39344       "^windmill$",
39345       "^\u0446\u0435\u0440\u043A\u043E\u0432\u043D\u0430\u044F( \u043B\u0430\u0432\u043A\u0430)?$"
39346     ]
39347   };
39348
39349   // node_modules/name-suggestion-index/config/trees.json
39350   var trees_default = {
39351     trees: {
39352       brands: {
39353         emoji: "\u{1F354}",
39354         mainTag: "brand:wikidata",
39355         sourceTags: ["brand", "name"],
39356         nameTags: {
39357           primary: "^(name|name:\\w+)$",
39358           alternate: "^(brand|brand:\\w+|operator|operator:\\w+|\\w+_name|\\w+_name:\\w+)$"
39359         }
39360       },
39361       flags: {
39362         emoji: "\u{1F6A9}",
39363         mainTag: "flag:wikidata",
39364         nameTags: {
39365           primary: "^(flag:name|flag:name:\\w+)$",
39366           alternate: "^(country|country:\\w+|flag|flag:\\w+|subject|subject:\\w+)$"
39367         }
39368       },
39369       operators: {
39370         emoji: "\u{1F4BC}",
39371         mainTag: "operator:wikidata",
39372         sourceTags: ["operator"],
39373         nameTags: {
39374           primary: "^(name|name:\\w+|operator|operator:\\w+)$",
39375           alternate: "^(brand|brand:\\w+|\\w+_name|\\w+_name:\\w+)$"
39376         }
39377       },
39378       transit: {
39379         emoji: "\u{1F687}",
39380         mainTag: "network:wikidata",
39381         sourceTags: ["network"],
39382         nameTags: {
39383           primary: "^network$",
39384           alternate: "^(operator|operator:\\w+|network:\\w+|\\w+_name|\\w+_name:\\w+)$"
39385         }
39386       }
39387     }
39388   };
39389
39390   // node_modules/name-suggestion-index/lib/matcher.js
39391   var matchGroups = matchGroups_default.matchGroups;
39392   var trees = trees_default.trees;
39393   var Matcher = class {
39394     //
39395     // `constructor`
39396     // initialize the genericWords regexes
39397     constructor() {
39398       this.matchIndex = void 0;
39399       this.genericWords = /* @__PURE__ */ new Map();
39400       (genericWords_default.genericWords || []).forEach((s) => this.genericWords.set(s, new RegExp(s, "i")));
39401       this.itemLocation = void 0;
39402       this.locationSets = void 0;
39403       this.locationIndex = void 0;
39404       this.warnings = [];
39405     }
39406     //
39407     // `buildMatchIndex()`
39408     // Call this to prepare the matcher for use
39409     //
39410     // `data` needs to be an Object indexed on a 'tree/key/value' path.
39411     // (e.g. cache filled by `fileTree.read` or data found in `dist/nsi.json`)
39412     // {
39413     //    'brands/amenity/bank': { properties: {}, items: [ {}, {}, … ] },
39414     //    'brands/amenity/bar':  { properties: {}, items: [ {}, {}, … ] },
39415     //    …
39416     // }
39417     //
39418     buildMatchIndex(data) {
39419       const that = this;
39420       if (that.matchIndex)
39421         return;
39422       that.matchIndex = /* @__PURE__ */ new Map();
39423       const seenTree = /* @__PURE__ */ new Map();
39424       Object.keys(data).forEach((tkv) => {
39425         const category = data[tkv];
39426         const parts = tkv.split("/", 3);
39427         const t = parts[0];
39428         const k = parts[1];
39429         const v = parts[2];
39430         const thiskv = `${k}/${v}`;
39431         const tree = trees[t];
39432         let branch = that.matchIndex.get(thiskv);
39433         if (!branch) {
39434           branch = {
39435             primary: /* @__PURE__ */ new Map(),
39436             alternate: /* @__PURE__ */ new Map(),
39437             excludeGeneric: /* @__PURE__ */ new Map(),
39438             excludeNamed: /* @__PURE__ */ new Map()
39439           };
39440           that.matchIndex.set(thiskv, branch);
39441         }
39442         const properties = category.properties || {};
39443         const exclude = properties.exclude || {};
39444         (exclude.generic || []).forEach((s) => branch.excludeGeneric.set(s, new RegExp(s, "i")));
39445         (exclude.named || []).forEach((s) => branch.excludeNamed.set(s, new RegExp(s, "i")));
39446         const excludeRegexes = [...branch.excludeGeneric.values(), ...branch.excludeNamed.values()];
39447         let items = category.items;
39448         if (!Array.isArray(items) || !items.length)
39449           return;
39450         const primaryName = new RegExp(tree.nameTags.primary, "i");
39451         const alternateName = new RegExp(tree.nameTags.alternate, "i");
39452         const notName = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i;
39453         const skipGenericKV = skipGenericKVMatches(t, k, v);
39454         const genericKV = /* @__PURE__ */ new Set([`${k}/yes`, `building/yes`]);
39455         const matchGroupKV = /* @__PURE__ */ new Set();
39456         Object.values(matchGroups).forEach((matchGroup) => {
39457           const inGroup = matchGroup.some((otherkv) => otherkv === thiskv);
39458           if (!inGroup)
39459             return;
39460           matchGroup.forEach((otherkv) => {
39461             if (otherkv === thiskv)
39462               return;
39463             matchGroupKV.add(otherkv);
39464             const otherk = otherkv.split("/", 2)[0];
39465             genericKV.add(`${otherk}/yes`);
39466           });
39467         });
39468         items.forEach((item) => {
39469           if (!item.id)
39470             return;
39471           if (Array.isArray(item.matchTags) && item.matchTags.length) {
39472             item.matchTags = item.matchTags.filter((matchTag) => !matchGroupKV.has(matchTag) && !genericKV.has(matchTag));
39473             if (!item.matchTags.length)
39474               delete item.matchTags;
39475           }
39476           let kvTags = [`${thiskv}`].concat(item.matchTags || []);
39477           if (!skipGenericKV) {
39478             kvTags = kvTags.concat(Array.from(genericKV));
39479           }
39480           Object.keys(item.tags).forEach((osmkey) => {
39481             if (notName.test(osmkey))
39482               return;
39483             const osmvalue = item.tags[osmkey];
39484             if (!osmvalue || excludeRegexes.some((regex) => regex.test(osmvalue)))
39485               return;
39486             if (primaryName.test(osmkey)) {
39487               kvTags.forEach((kv) => insertName("primary", t, kv, simplify(osmvalue), item.id));
39488             } else if (alternateName.test(osmkey)) {
39489               kvTags.forEach((kv) => insertName("alternate", t, kv, simplify(osmvalue), item.id));
39490             }
39491           });
39492           let keepMatchNames = /* @__PURE__ */ new Set();
39493           (item.matchNames || []).forEach((matchName) => {
39494             const nsimple = simplify(matchName);
39495             kvTags.forEach((kv) => {
39496               const branch2 = that.matchIndex.get(kv);
39497               const primaryLeaf = branch2 && branch2.primary.get(nsimple);
39498               const alternateLeaf = branch2 && branch2.alternate.get(nsimple);
39499               const inPrimary = primaryLeaf && primaryLeaf.has(item.id);
39500               const inAlternate = alternateLeaf && alternateLeaf.has(item.id);
39501               if (!inPrimary && !inAlternate) {
39502                 insertName("alternate", t, kv, nsimple, item.id);
39503                 keepMatchNames.add(matchName);
39504               }
39505             });
39506           });
39507           if (keepMatchNames.size) {
39508             item.matchNames = Array.from(keepMatchNames);
39509           } else {
39510             delete item.matchNames;
39511           }
39512         });
39513       });
39514       function insertName(which, t, kv, nsimple, itemID) {
39515         if (!nsimple) {
39516           that.warnings.push(`Warning: skipping empty ${which} name for item ${t}/${kv}: ${itemID}`);
39517           return;
39518         }
39519         let branch = that.matchIndex.get(kv);
39520         if (!branch) {
39521           branch = {
39522             primary: /* @__PURE__ */ new Map(),
39523             alternate: /* @__PURE__ */ new Map(),
39524             excludeGeneric: /* @__PURE__ */ new Map(),
39525             excludeNamed: /* @__PURE__ */ new Map()
39526           };
39527           that.matchIndex.set(kv, branch);
39528         }
39529         let leaf = branch[which].get(nsimple);
39530         if (!leaf) {
39531           leaf = /* @__PURE__ */ new Set();
39532           branch[which].set(nsimple, leaf);
39533         }
39534         leaf.add(itemID);
39535         if (!/yes$/.test(kv)) {
39536           const kvnsimple = `${kv}/${nsimple}`;
39537           const existing = seenTree.get(kvnsimple);
39538           if (existing && existing !== t) {
39539             const items = Array.from(leaf);
39540             that.warnings.push(`Duplicate cache key "${kvnsimple}" in trees "${t}" and "${existing}", check items: ${items}`);
39541             return;
39542           }
39543           seenTree.set(kvnsimple, t);
39544         }
39545       }
39546       function skipGenericKVMatches(t, k, v) {
39547         return t === "flags" || t === "transit" || k === "landuse" || v === "atm" || v === "bicycle_parking" || v === "car_sharing" || v === "caravan_site" || v === "charging_station" || v === "dog_park" || v === "parking" || v === "phone" || v === "playground" || v === "post_box" || v === "public_bookcase" || v === "recycling" || v === "vending_machine";
39548       }
39549     }
39550     //
39551     // `buildLocationIndex()`
39552     // Call this to prepare a which-polygon location index.
39553     // This *resolves* all the locationSets into GeoJSON, which takes some time.
39554     // You can skip this step if you don't care about matching within a location.
39555     //
39556     // `data` needs to be an Object indexed on a 'tree/key/value' path.
39557     // (e.g. cache filled by `fileTree.read` or data found in `dist/nsi.json`)
39558     // {
39559     //    'brands/amenity/bank': { properties: {}, items: [ {}, {}, … ] },
39560     //    'brands/amenity/bar':  { properties: {}, items: [ {}, {}, … ] },
39561     //    …
39562     // }
39563     //
39564     buildLocationIndex(data, loco) {
39565       const that = this;
39566       if (that.locationIndex)
39567         return;
39568       that.itemLocation = /* @__PURE__ */ new Map();
39569       that.locationSets = /* @__PURE__ */ new Map();
39570       Object.keys(data).forEach((tkv) => {
39571         const items = data[tkv].items;
39572         if (!Array.isArray(items) || !items.length)
39573           return;
39574         items.forEach((item) => {
39575           if (that.itemLocation.has(item.id))
39576             return;
39577           let resolved;
39578           try {
39579             resolved = loco.resolveLocationSet(item.locationSet);
39580           } catch (err) {
39581             console.warn(`buildLocationIndex: ${err.message}`);
39582           }
39583           if (!resolved || !resolved.id)
39584             return;
39585           that.itemLocation.set(item.id, resolved.id);
39586           if (that.locationSets.has(resolved.id))
39587             return;
39588           let feature3 = _cloneDeep2(resolved.feature);
39589           feature3.id = resolved.id;
39590           feature3.properties.id = resolved.id;
39591           if (!feature3.geometry.coordinates.length || !feature3.properties.area) {
39592             console.warn(`buildLocationIndex: locationSet ${resolved.id} for ${item.id} resolves to an empty feature:`);
39593             console.warn(JSON.stringify(feature3));
39594             return;
39595           }
39596           that.locationSets.set(resolved.id, feature3);
39597         });
39598       });
39599       that.locationIndex = (0, import_which_polygon3.default)({ type: "FeatureCollection", features: [...that.locationSets.values()] });
39600       function _cloneDeep2(obj) {
39601         return JSON.parse(JSON.stringify(obj));
39602       }
39603     }
39604     //
39605     // `match()`
39606     // Pass parts and return an Array of matches.
39607     // `k` - key
39608     // `v` - value
39609     // `n` - namelike
39610     // `loc` - optional - [lon,lat] location to search
39611     //
39612     // 1. If the [k,v,n] tuple matches a canonical item…
39613     // Return an Array of match results.
39614     // Each result will include the area in km² that the item is valid.
39615     //
39616     // Order of results:
39617     // Primary ordering will be on the "match" column:
39618     //   "primary" - where the query matches the `name` tag, followed by
39619     //   "alternate" - where the query matches an alternate name tag (e.g. short_name, brand, operator, etc)
39620     // Secondary ordering will be on the "area" column:
39621     //   "area descending" if no location was provided, (worldwide before local)
39622     //   "area ascending" if location was provided (local before worldwide)
39623     //
39624     // [
39625     //   { match: 'primary',   itemID: String,  area: Number,  kv: String,  nsimple: String },
39626     //   { match: 'primary',   itemID: String,  area: Number,  kv: String,  nsimple: String },
39627     //   { match: 'alternate', itemID: String,  area: Number,  kv: String,  nsimple: String },
39628     //   { match: 'alternate', itemID: String,  area: Number,  kv: String,  nsimple: String },
39629     //   …
39630     // ]
39631     //
39632     // -or-
39633     //
39634     // 2. If the [k,v,n] tuple matches an exclude pattern…
39635     // Return an Array with a single exclude result, either
39636     //
39637     // [ { match: 'excludeGeneric', pattern: String,  kv: String } ]  // "generic" e.g. "Food Court"
39638     //   or
39639     // [ { match: 'excludeNamed', pattern: String,  kv: String } ]    // "named", e.g. "Kebabai"
39640     //
39641     // About results
39642     //   "generic" - a generic word that is probably not really a name.
39643     //     For these, iD should warn the user "Hey don't put 'food court' in the name tag".
39644     //   "named" - a real name like "Kebabai" that is just common, but not a brand.
39645     //     For these, iD should just let it be. We don't include these in NSI, but we don't want to nag users about it either.
39646     //
39647     // -or-
39648     //
39649     // 3. If the [k,v,n] tuple matches nothing of any kind, return `null`
39650     //
39651     //
39652     match(k, v, n2, loc) {
39653       const that = this;
39654       if (!that.matchIndex) {
39655         throw new Error("match:  matchIndex not built.");
39656       }
39657       let matchLocations;
39658       if (Array.isArray(loc) && that.locationIndex) {
39659         matchLocations = that.locationIndex([loc[0], loc[1], loc[0], loc[1]], true);
39660       }
39661       const nsimple = simplify(n2);
39662       let seen = /* @__PURE__ */ new Set();
39663       let results = [];
39664       gatherResults("primary");
39665       gatherResults("alternate");
39666       if (results.length)
39667         return results;
39668       gatherResults("exclude");
39669       return results.length ? results : null;
39670       function gatherResults(which) {
39671         const kv = `${k}/${v}`;
39672         let didMatch = tryMatch(which, kv);
39673         if (didMatch)
39674           return;
39675         for (let mg in matchGroups) {
39676           const matchGroup = matchGroups[mg];
39677           const inGroup = matchGroup.some((otherkv) => otherkv === kv);
39678           if (!inGroup)
39679             continue;
39680           for (let i2 = 0; i2 < matchGroup.length; i2++) {
39681             const otherkv = matchGroup[i2];
39682             if (otherkv === kv)
39683               continue;
39684             didMatch = tryMatch(which, otherkv);
39685             if (didMatch)
39686               return;
39687           }
39688         }
39689         if (which === "exclude") {
39690           const regex = [...that.genericWords.values()].find((regex2) => regex2.test(n2));
39691           if (regex) {
39692             results.push({ match: "excludeGeneric", pattern: String(regex) });
39693             return;
39694           }
39695         }
39696       }
39697       function tryMatch(which, kv) {
39698         const branch = that.matchIndex.get(kv);
39699         if (!branch)
39700           return;
39701         if (which === "exclude") {
39702           let regex = [...branch.excludeNamed.values()].find((regex2) => regex2.test(n2));
39703           if (regex) {
39704             results.push({ match: "excludeNamed", pattern: String(regex), kv });
39705             return;
39706           }
39707           regex = [...branch.excludeGeneric.values()].find((regex2) => regex2.test(n2));
39708           if (regex) {
39709             results.push({ match: "excludeGeneric", pattern: String(regex), kv });
39710             return;
39711           }
39712           return;
39713         }
39714         const leaf = branch[which].get(nsimple);
39715         if (!leaf || !leaf.size)
39716           return;
39717         let hits = Array.from(leaf).map((itemID) => {
39718           let area = Infinity;
39719           if (that.itemLocation && that.locationSets) {
39720             const location = that.locationSets.get(that.itemLocation.get(itemID));
39721             area = location && location.properties.area || Infinity;
39722           }
39723           return { match: which, itemID, area, kv, nsimple };
39724         });
39725         let sortFn = byAreaDescending;
39726         if (matchLocations) {
39727           hits = hits.filter(isValidLocation);
39728           sortFn = byAreaAscending;
39729         }
39730         if (!hits.length)
39731           return;
39732         hits.sort(sortFn).forEach((hit) => {
39733           if (seen.has(hit.itemID))
39734             return;
39735           seen.add(hit.itemID);
39736           results.push(hit);
39737         });
39738         return true;
39739         function isValidLocation(hit) {
39740           if (!that.itemLocation)
39741             return true;
39742           return matchLocations.find((props) => props.id === that.itemLocation.get(hit.itemID));
39743         }
39744         function byAreaAscending(hitA, hitB) {
39745           return hitA.area - hitB.area;
39746         }
39747         function byAreaDescending(hitA, hitB) {
39748           return hitB.area - hitA.area;
39749         }
39750       }
39751     }
39752     //
39753     // `getWarnings()`
39754     // Return any warnings discovered when buiding the index.
39755     // (currently this does nothing)
39756     //
39757     getWarnings() {
39758       return this.warnings;
39759     }
39760   };
39761
39762   // modules/services/nsi.js
39763   var import_vparse2 = __toESM(require_vparse());
39764
39765   // modules/core/difference.js
39766   var import_fast_deep_equal3 = __toESM(require_fast_deep_equal());
39767   function coreDifference(base, head) {
39768     var _changes = {};
39769     var _didChange = {};
39770     var _diff = {};
39771     function checkEntityID(id2) {
39772       var h = head.entities[id2];
39773       var b = base.entities[id2];
39774       if (h === b)
39775         return;
39776       if (_changes[id2])
39777         return;
39778       if (!h && b) {
39779         _changes[id2] = { base: b, head: h };
39780         _didChange.deletion = true;
39781         return;
39782       }
39783       if (h && !b) {
39784         _changes[id2] = { base: b, head: h };
39785         _didChange.addition = true;
39786         return;
39787       }
39788       if (h && b) {
39789         if (h.members && b.members && !(0, import_fast_deep_equal3.default)(h.members, b.members)) {
39790           _changes[id2] = { base: b, head: h };
39791           _didChange.geometry = true;
39792           _didChange.properties = true;
39793           return;
39794         }
39795         if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
39796           _changes[id2] = { base: b, head: h };
39797           _didChange.geometry = true;
39798         }
39799         if (h.nodes && b.nodes && !(0, import_fast_deep_equal3.default)(h.nodes, b.nodes)) {
39800           _changes[id2] = { base: b, head: h };
39801           _didChange.geometry = true;
39802         }
39803         if (h.tags && b.tags && !(0, import_fast_deep_equal3.default)(h.tags, b.tags)) {
39804           _changes[id2] = { base: b, head: h };
39805           _didChange.properties = true;
39806         }
39807       }
39808     }
39809     function load() {
39810       var ids = utilArrayUniq(Object.keys(head.entities).concat(Object.keys(base.entities)));
39811       for (var i2 = 0; i2 < ids.length; i2++) {
39812         checkEntityID(ids[i2]);
39813       }
39814     }
39815     load();
39816     _diff.length = function length() {
39817       return Object.keys(_changes).length;
39818     };
39819     _diff.changes = function changes() {
39820       return _changes;
39821     };
39822     _diff.didChange = _didChange;
39823     _diff.extantIDs = function extantIDs(includeRelMembers) {
39824       var result = /* @__PURE__ */ new Set();
39825       Object.keys(_changes).forEach(function(id2) {
39826         if (_changes[id2].head) {
39827           result.add(id2);
39828         }
39829         var h = _changes[id2].head;
39830         var b = _changes[id2].base;
39831         var entity = h || b;
39832         if (includeRelMembers && entity.type === "relation") {
39833           var mh = h ? h.members.map(function(m) {
39834             return m.id;
39835           }) : [];
39836           var mb = b ? b.members.map(function(m) {
39837             return m.id;
39838           }) : [];
39839           utilArrayUnion(mh, mb).forEach(function(memberID) {
39840             if (head.hasEntity(memberID)) {
39841               result.add(memberID);
39842             }
39843           });
39844         }
39845       });
39846       return Array.from(result);
39847     };
39848     _diff.modified = function modified() {
39849       var result = [];
39850       Object.values(_changes).forEach(function(change) {
39851         if (change.base && change.head) {
39852           result.push(change.head);
39853         }
39854       });
39855       return result;
39856     };
39857     _diff.created = function created() {
39858       var result = [];
39859       Object.values(_changes).forEach(function(change) {
39860         if (!change.base && change.head) {
39861           result.push(change.head);
39862         }
39863       });
39864       return result;
39865     };
39866     _diff.deleted = function deleted() {
39867       var result = [];
39868       Object.values(_changes).forEach(function(change) {
39869         if (change.base && !change.head) {
39870           result.push(change.base);
39871         }
39872       });
39873       return result;
39874     };
39875     _diff.summary = function summary() {
39876       var relevant = {};
39877       var keys = Object.keys(_changes);
39878       for (var i2 = 0; i2 < keys.length; i2++) {
39879         var change = _changes[keys[i2]];
39880         if (change.head && change.head.geometry(head) !== "vertex") {
39881           addEntity(change.head, head, change.base ? "modified" : "created");
39882         } else if (change.base && change.base.geometry(base) !== "vertex") {
39883           addEntity(change.base, base, "deleted");
39884         } else if (change.base && change.head) {
39885           var moved = !(0, import_fast_deep_equal3.default)(change.base.loc, change.head.loc);
39886           var retagged = !(0, import_fast_deep_equal3.default)(change.base.tags, change.head.tags);
39887           if (moved) {
39888             addParents(change.head);
39889           }
39890           if (retagged || moved && change.head.hasInterestingTags()) {
39891             addEntity(change.head, head, "modified");
39892           }
39893         } else if (change.head && change.head.hasInterestingTags()) {
39894           addEntity(change.head, head, "created");
39895         } else if (change.base && change.base.hasInterestingTags()) {
39896           addEntity(change.base, base, "deleted");
39897         }
39898       }
39899       return Object.values(relevant);
39900       function addEntity(entity, graph, changeType) {
39901         relevant[entity.id] = {
39902           entity,
39903           graph,
39904           changeType
39905         };
39906       }
39907       function addParents(entity) {
39908         var parents = head.parentWays(entity);
39909         for (var j2 = parents.length - 1; j2 >= 0; j2--) {
39910           var parent = parents[j2];
39911           if (!(parent.id in relevant)) {
39912             addEntity(parent, head, "modified");
39913           }
39914         }
39915       }
39916     };
39917     _diff.complete = function complete(extent) {
39918       var result = {};
39919       var id2, change;
39920       for (id2 in _changes) {
39921         change = _changes[id2];
39922         var h = change.head;
39923         var b = change.base;
39924         var entity = h || b;
39925         var i2;
39926         if (extent && (!h || !h.intersects(extent, head)) && (!b || !b.intersects(extent, base))) {
39927           continue;
39928         }
39929         result[id2] = h;
39930         if (entity.type === "way") {
39931           var nh = h ? h.nodes : [];
39932           var nb = b ? b.nodes : [];
39933           var diff;
39934           diff = utilArrayDifference(nh, nb);
39935           for (i2 = 0; i2 < diff.length; i2++) {
39936             result[diff[i2]] = head.hasEntity(diff[i2]);
39937           }
39938           diff = utilArrayDifference(nb, nh);
39939           for (i2 = 0; i2 < diff.length; i2++) {
39940             result[diff[i2]] = head.hasEntity(diff[i2]);
39941           }
39942         }
39943         if (entity.type === "relation" && entity.isMultipolygon()) {
39944           var mh = h ? h.members.map(function(m) {
39945             return m.id;
39946           }) : [];
39947           var mb = b ? b.members.map(function(m) {
39948             return m.id;
39949           }) : [];
39950           var ids = utilArrayUnion(mh, mb);
39951           for (i2 = 0; i2 < ids.length; i2++) {
39952             var member = head.hasEntity(ids[i2]);
39953             if (!member)
39954               continue;
39955             if (extent && !member.intersects(extent, head))
39956               continue;
39957             result[ids[i2]] = member;
39958           }
39959         }
39960         addParents(head.parentWays(entity), result);
39961         addParents(head.parentRelations(entity), result);
39962       }
39963       return result;
39964       function addParents(parents, result2) {
39965         for (var i3 = 0; i3 < parents.length; i3++) {
39966           var parent = parents[i3];
39967           if (parent.id in result2)
39968             continue;
39969           result2[parent.id] = parent;
39970           addParents(head.parentRelations(parent), result2);
39971         }
39972       }
39973     };
39974     return _diff;
39975   }
39976
39977   // modules/core/tree.js
39978   var import_rbush6 = __toESM(require_rbush_min());
39979   function coreTree(head) {
39980     var _rtree = new import_rbush6.default();
39981     var _bboxes = {};
39982     var _segmentsRTree = new import_rbush6.default();
39983     var _segmentsBBoxes = {};
39984     var _segmentsByWayId = {};
39985     var tree = {};
39986     function entityBBox(entity) {
39987       var bbox2 = entity.extent(head).bbox();
39988       bbox2.id = entity.id;
39989       _bboxes[entity.id] = bbox2;
39990       return bbox2;
39991     }
39992     function segmentBBox(segment) {
39993       var extent = segment.extent(head);
39994       if (!extent)
39995         return null;
39996       var bbox2 = extent.bbox();
39997       bbox2.segment = segment;
39998       _segmentsBBoxes[segment.id] = bbox2;
39999       return bbox2;
40000     }
40001     function removeEntity(entity) {
40002       _rtree.remove(_bboxes[entity.id]);
40003       delete _bboxes[entity.id];
40004       if (_segmentsByWayId[entity.id]) {
40005         _segmentsByWayId[entity.id].forEach(function(segment) {
40006           _segmentsRTree.remove(_segmentsBBoxes[segment.id]);
40007           delete _segmentsBBoxes[segment.id];
40008         });
40009         delete _segmentsByWayId[entity.id];
40010       }
40011     }
40012     function loadEntities(entities) {
40013       _rtree.load(entities.map(entityBBox));
40014       var segments = [];
40015       entities.forEach(function(entity) {
40016         if (entity.segments) {
40017           var entitySegments = entity.segments(head);
40018           _segmentsByWayId[entity.id] = entitySegments;
40019           segments = segments.concat(entitySegments);
40020         }
40021       });
40022       if (segments.length)
40023         _segmentsRTree.load(segments.map(segmentBBox).filter(Boolean));
40024     }
40025     function updateParents(entity, insertions, memo) {
40026       head.parentWays(entity).forEach(function(way) {
40027         if (_bboxes[way.id]) {
40028           removeEntity(way);
40029           insertions[way.id] = way;
40030         }
40031         updateParents(way, insertions, memo);
40032       });
40033       head.parentRelations(entity).forEach(function(relation) {
40034         if (memo[entity.id])
40035           return;
40036         memo[entity.id] = true;
40037         if (_bboxes[relation.id]) {
40038           removeEntity(relation);
40039           insertions[relation.id] = relation;
40040         }
40041         updateParents(relation, insertions, memo);
40042       });
40043     }
40044     tree.rebase = function(entities, force) {
40045       var insertions = {};
40046       for (var i2 = 0; i2 < entities.length; i2++) {
40047         var entity = entities[i2];
40048         if (!entity.visible)
40049           continue;
40050         if (head.entities.hasOwnProperty(entity.id) || _bboxes[entity.id]) {
40051           if (!force) {
40052             continue;
40053           } else if (_bboxes[entity.id]) {
40054             removeEntity(entity);
40055           }
40056         }
40057         insertions[entity.id] = entity;
40058         updateParents(entity, insertions, {});
40059       }
40060       loadEntities(Object.values(insertions));
40061       return tree;
40062     };
40063     function updateToGraph(graph) {
40064       if (graph === head)
40065         return;
40066       var diff = coreDifference(head, graph);
40067       head = graph;
40068       var changed = diff.didChange;
40069       if (!changed.addition && !changed.deletion && !changed.geometry)
40070         return;
40071       var insertions = {};
40072       if (changed.deletion) {
40073         diff.deleted().forEach(function(entity) {
40074           removeEntity(entity);
40075         });
40076       }
40077       if (changed.geometry) {
40078         diff.modified().forEach(function(entity) {
40079           removeEntity(entity);
40080           insertions[entity.id] = entity;
40081           updateParents(entity, insertions, {});
40082         });
40083       }
40084       if (changed.addition) {
40085         diff.created().forEach(function(entity) {
40086           insertions[entity.id] = entity;
40087         });
40088       }
40089       loadEntities(Object.values(insertions));
40090     }
40091     tree.intersects = function(extent, graph) {
40092       updateToGraph(graph);
40093       return _rtree.search(extent.bbox()).map(function(bbox2) {
40094         return graph.entity(bbox2.id);
40095       });
40096     };
40097     tree.waySegments = function(extent, graph) {
40098       updateToGraph(graph);
40099       return _segmentsRTree.search(extent.bbox()).map(function(bbox2) {
40100         return bbox2.segment;
40101       });
40102     };
40103     return tree;
40104   }
40105
40106   // modules/svg/icon.js
40107   function svgIcon(name, svgklass, useklass) {
40108     return function drawIcon(selection2) {
40109       selection2.selectAll("svg.icon" + (svgklass ? "." + svgklass.split(" ")[0] : "")).data([0]).enter().append("svg").attr("class", "icon " + (svgklass || "")).append("use").attr("xlink:href", name).attr("class", useklass);
40110     };
40111   }
40112
40113   // modules/ui/modal.js
40114   function uiModal(selection2, blocking) {
40115     let keybinding = utilKeybinding("modal");
40116     let previous = selection2.select("div.modal");
40117     let animate = previous.empty();
40118     previous.transition().duration(200).style("opacity", 0).remove();
40119     let shaded = selection2.append("div").attr("class", "shaded").style("opacity", 0);
40120     shaded.close = () => {
40121       shaded.transition().duration(200).style("opacity", 0).remove();
40122       modal.transition().duration(200).style("top", "0px");
40123       select_default2(document).call(keybinding.unbind);
40124     };
40125     let modal = shaded.append("div").attr("class", "modal fillL");
40126     modal.append("input").attr("class", "keytrap keytrap-first").on("focus.keytrap", moveFocusToLast);
40127     if (!blocking) {
40128       shaded.on("click.remove-modal", (d3_event) => {
40129         if (d3_event.target === this) {
40130           shaded.close();
40131         }
40132       });
40133       modal.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", shaded.close).call(svgIcon("#iD-icon-close"));
40134       keybinding.on("\u232B", shaded.close).on("\u238B", shaded.close);
40135       select_default2(document).call(keybinding);
40136     }
40137     modal.append("div").attr("class", "content");
40138     modal.append("input").attr("class", "keytrap keytrap-last").on("focus.keytrap", moveFocusToFirst);
40139     if (animate) {
40140       shaded.transition().style("opacity", 1);
40141     } else {
40142       shaded.style("opacity", 1);
40143     }
40144     return shaded;
40145     function moveFocusToFirst() {
40146       let node = modal.select("a, button, input:not(.keytrap), select, textarea").node();
40147       if (node) {
40148         node.focus();
40149       } else {
40150         select_default2(this).node().blur();
40151       }
40152     }
40153     function moveFocusToLast() {
40154       let nodes = modal.selectAll("a, button, input:not(.keytrap), select, textarea").nodes();
40155       if (nodes.length) {
40156         nodes[nodes.length - 1].focus();
40157       } else {
40158         select_default2(this).node().blur();
40159       }
40160     }
40161   }
40162
40163   // modules/ui/loading.js
40164   function uiLoading(context) {
40165     let _modalSelection = select_default2(null);
40166     let _message = "";
40167     let _blocking = false;
40168     let loading = (selection2) => {
40169       _modalSelection = uiModal(selection2, _blocking);
40170       let loadertext = _modalSelection.select(".content").classed("loading-modal", true).append("div").attr("class", "modal-section fillL");
40171       loadertext.append("img").attr("class", "loader").attr("src", context.imagePath("loader-white.gif"));
40172       loadertext.append("h3").html(_message);
40173       _modalSelection.select("button.close").attr("class", "hide");
40174       return loading;
40175     };
40176     loading.message = function(val) {
40177       if (!arguments.length)
40178         return _message;
40179       _message = val;
40180       return loading;
40181     };
40182     loading.blocking = function(val) {
40183       if (!arguments.length)
40184         return _blocking;
40185       _blocking = val;
40186       return loading;
40187     };
40188     loading.close = () => {
40189       _modalSelection.remove();
40190     };
40191     loading.isShown = () => {
40192       return _modalSelection && !_modalSelection.empty() && _modalSelection.node().parentNode;
40193     };
40194     return loading;
40195   }
40196
40197   // modules/core/history.js
40198   function coreHistory(context) {
40199     var dispatch10 = dispatch_default("reset", "change", "merge", "restore", "undone", "redone", "storage_error");
40200     var lock = utilSessionMutex("lock");
40201     var _hasUnresolvedRestorableChanges = lock.lock() && !!corePreferences(getKey("saved_history"));
40202     var duration = 150;
40203     var _imageryUsed = [];
40204     var _photoOverlaysUsed = [];
40205     var _checkpoints = {};
40206     var _pausedGraph;
40207     var _stack;
40208     var _index;
40209     var _tree;
40210     function _act(actions, t) {
40211       actions = Array.prototype.slice.call(actions);
40212       var annotation;
40213       if (typeof actions[actions.length - 1] !== "function") {
40214         annotation = actions.pop();
40215       }
40216       var graph = _stack[_index].graph;
40217       for (var i2 = 0; i2 < actions.length; i2++) {
40218         graph = actions[i2](graph, t);
40219       }
40220       return {
40221         graph,
40222         annotation,
40223         imageryUsed: _imageryUsed,
40224         photoOverlaysUsed: _photoOverlaysUsed,
40225         transform: context.projection.transform(),
40226         selectedIDs: context.selectedIDs()
40227       };
40228     }
40229     function _perform(args, t) {
40230       var previous = _stack[_index].graph;
40231       _stack = _stack.slice(0, _index + 1);
40232       var actionResult = _act(args, t);
40233       _stack.push(actionResult);
40234       _index++;
40235       return change(previous);
40236     }
40237     function _replace(args, t) {
40238       var previous = _stack[_index].graph;
40239       var actionResult = _act(args, t);
40240       _stack[_index] = actionResult;
40241       return change(previous);
40242     }
40243     function _overwrite(args, t) {
40244       var previous = _stack[_index].graph;
40245       if (_index > 0) {
40246         _index--;
40247         _stack.pop();
40248       }
40249       _stack = _stack.slice(0, _index + 1);
40250       var actionResult = _act(args, t);
40251       _stack.push(actionResult);
40252       _index++;
40253       return change(previous);
40254     }
40255     function change(previous) {
40256       var difference = coreDifference(previous, history.graph());
40257       if (!_pausedGraph) {
40258         dispatch10.call("change", this, difference);
40259       }
40260       return difference;
40261     }
40262     function getKey(n2) {
40263       return "iD_" + window.location.origin + "_" + n2;
40264     }
40265     var history = {
40266       graph: function() {
40267         return _stack[_index].graph;
40268       },
40269       tree: function() {
40270         return _tree;
40271       },
40272       base: function() {
40273         return _stack[0].graph;
40274       },
40275       merge: function(entities) {
40276         var stack = _stack.map(function(state) {
40277           return state.graph;
40278         });
40279         _stack[0].graph.rebase(entities, stack, false);
40280         _tree.rebase(entities, false);
40281         dispatch10.call("merge", this, entities);
40282       },
40283       perform: function() {
40284         select_default2(document).interrupt("history.perform");
40285         var transitionable = false;
40286         var action0 = arguments[0];
40287         if (arguments.length === 1 || arguments.length === 2 && typeof arguments[1] !== "function") {
40288           transitionable = !!action0.transitionable;
40289         }
40290         if (transitionable) {
40291           var origArguments = arguments;
40292           select_default2(document).transition("history.perform").duration(duration).ease(linear2).tween("history.tween", function() {
40293             return function(t) {
40294               if (t < 1)
40295                 _overwrite([action0], t);
40296             };
40297           }).on("start", function() {
40298             _perform([action0], 0);
40299           }).on("end interrupt", function() {
40300             _overwrite(origArguments, 1);
40301           });
40302         } else {
40303           return _perform(arguments);
40304         }
40305       },
40306       replace: function() {
40307         select_default2(document).interrupt("history.perform");
40308         return _replace(arguments, 1);
40309       },
40310       // Same as calling pop and then perform
40311       overwrite: function() {
40312         select_default2(document).interrupt("history.perform");
40313         return _overwrite(arguments, 1);
40314       },
40315       pop: function(n2) {
40316         select_default2(document).interrupt("history.perform");
40317         var previous = _stack[_index].graph;
40318         if (isNaN(+n2) || +n2 < 0) {
40319           n2 = 1;
40320         }
40321         while (n2-- > 0 && _index > 0) {
40322           _index--;
40323           _stack.pop();
40324         }
40325         return change(previous);
40326       },
40327       // Back to the previous annotated state or _index = 0.
40328       undo: function() {
40329         select_default2(document).interrupt("history.perform");
40330         var previousStack = _stack[_index];
40331         var previous = previousStack.graph;
40332         while (_index > 0) {
40333           _index--;
40334           if (_stack[_index].annotation)
40335             break;
40336         }
40337         dispatch10.call("undone", this, _stack[_index], previousStack);
40338         return change(previous);
40339       },
40340       // Forward to the next annotated state.
40341       redo: function() {
40342         select_default2(document).interrupt("history.perform");
40343         var previousStack = _stack[_index];
40344         var previous = previousStack.graph;
40345         var tryIndex = _index;
40346         while (tryIndex < _stack.length - 1) {
40347           tryIndex++;
40348           if (_stack[tryIndex].annotation) {
40349             _index = tryIndex;
40350             dispatch10.call("redone", this, _stack[_index], previousStack);
40351             break;
40352           }
40353         }
40354         return change(previous);
40355       },
40356       pauseChangeDispatch: function() {
40357         if (!_pausedGraph) {
40358           _pausedGraph = _stack[_index].graph;
40359         }
40360       },
40361       resumeChangeDispatch: function() {
40362         if (_pausedGraph) {
40363           var previous = _pausedGraph;
40364           _pausedGraph = null;
40365           return change(previous);
40366         }
40367       },
40368       undoAnnotation: function() {
40369         var i2 = _index;
40370         while (i2 >= 0) {
40371           if (_stack[i2].annotation)
40372             return _stack[i2].annotation;
40373           i2--;
40374         }
40375       },
40376       redoAnnotation: function() {
40377         var i2 = _index + 1;
40378         while (i2 <= _stack.length - 1) {
40379           if (_stack[i2].annotation)
40380             return _stack[i2].annotation;
40381           i2++;
40382         }
40383       },
40384       // Returns the entities from the active graph with bounding boxes
40385       // overlapping the given `extent`.
40386       intersects: function(extent) {
40387         return _tree.intersects(extent, _stack[_index].graph);
40388       },
40389       difference: function() {
40390         var base = _stack[0].graph;
40391         var head = _stack[_index].graph;
40392         return coreDifference(base, head);
40393       },
40394       changes: function(action) {
40395         var base = _stack[0].graph;
40396         var head = _stack[_index].graph;
40397         if (action) {
40398           head = action(head);
40399         }
40400         var difference = coreDifference(base, head);
40401         return {
40402           modified: difference.modified(),
40403           created: difference.created(),
40404           deleted: difference.deleted()
40405         };
40406       },
40407       hasChanges: function() {
40408         return this.difference().length() > 0;
40409       },
40410       imageryUsed: function(sources) {
40411         if (sources) {
40412           _imageryUsed = sources;
40413           return history;
40414         } else {
40415           var s = /* @__PURE__ */ new Set();
40416           _stack.slice(1, _index + 1).forEach(function(state) {
40417             state.imageryUsed.forEach(function(source) {
40418               if (source !== "Custom") {
40419                 s.add(source);
40420               }
40421             });
40422           });
40423           return Array.from(s);
40424         }
40425       },
40426       photoOverlaysUsed: function(sources) {
40427         if (sources) {
40428           _photoOverlaysUsed = sources;
40429           return history;
40430         } else {
40431           var s = /* @__PURE__ */ new Set();
40432           _stack.slice(1, _index + 1).forEach(function(state) {
40433             if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
40434               state.photoOverlaysUsed.forEach(function(photoOverlay) {
40435                 s.add(photoOverlay);
40436               });
40437             }
40438           });
40439           return Array.from(s);
40440         }
40441       },
40442       // save the current history state
40443       checkpoint: function(key) {
40444         _checkpoints[key] = {
40445           stack: _stack,
40446           index: _index
40447         };
40448         return history;
40449       },
40450       // restore history state to a given checkpoint or reset completely
40451       reset: function(key) {
40452         if (key !== void 0 && _checkpoints.hasOwnProperty(key)) {
40453           _stack = _checkpoints[key].stack;
40454           _index = _checkpoints[key].index;
40455         } else {
40456           _stack = [{ graph: coreGraph() }];
40457           _index = 0;
40458           _tree = coreTree(_stack[0].graph);
40459           _checkpoints = {};
40460         }
40461         dispatch10.call("reset");
40462         dispatch10.call("change");
40463         return history;
40464       },
40465       // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
40466       //
40467       // To use it:
40468       //  1. Start the walkthrough.
40469       //  2. Get to a "free editing" tutorial step
40470       //  3. Make your edits to the walkthrough map
40471       //  4. In your browser dev console run:
40472       //        `id.history().toIntroGraph()`
40473       //  5. This outputs stringified JSON to the browser console
40474       //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
40475       toIntroGraph: function() {
40476         var nextID = { n: 0, r: 0, w: 0 };
40477         var permIDs = {};
40478         var graph = this.graph();
40479         var baseEntities = {};
40480         Object.values(graph.base().entities).forEach(function(entity) {
40481           var copy2 = copyIntroEntity(entity);
40482           baseEntities[copy2.id] = copy2;
40483         });
40484         Object.keys(graph.entities).forEach(function(id2) {
40485           var entity = graph.entities[id2];
40486           if (entity) {
40487             var copy2 = copyIntroEntity(entity);
40488             baseEntities[copy2.id] = copy2;
40489           } else {
40490             delete baseEntities[id2];
40491           }
40492         });
40493         Object.values(baseEntities).forEach(function(entity) {
40494           if (Array.isArray(entity.nodes)) {
40495             entity.nodes = entity.nodes.map(function(node) {
40496               return permIDs[node] || node;
40497             });
40498           }
40499           if (Array.isArray(entity.members)) {
40500             entity.members = entity.members.map(function(member) {
40501               member.id = permIDs[member.id] || member.id;
40502               return member;
40503             });
40504           }
40505         });
40506         return JSON.stringify({ dataIntroGraph: baseEntities });
40507         function copyIntroEntity(source) {
40508           var copy2 = utilObjectOmit(source, ["type", "user", "v", "version", "visible"]);
40509           if (copy2.tags && !Object.keys(copy2.tags)) {
40510             delete copy2.tags;
40511           }
40512           if (Array.isArray(copy2.loc)) {
40513             copy2.loc[0] = +copy2.loc[0].toFixed(6);
40514             copy2.loc[1] = +copy2.loc[1].toFixed(6);
40515           }
40516           var match = source.id.match(/([nrw])-\d*/);
40517           if (match !== null) {
40518             var nrw = match[1];
40519             var permID;
40520             do {
40521               permID = nrw + ++nextID[nrw];
40522             } while (baseEntities.hasOwnProperty(permID));
40523             copy2.id = permIDs[source.id] = permID;
40524           }
40525           return copy2;
40526         }
40527       },
40528       toJSON: function() {
40529         if (!this.hasChanges())
40530           return;
40531         var allEntities = {};
40532         var baseEntities = {};
40533         var base = _stack[0];
40534         var s = _stack.map(function(i2) {
40535           var modified = [];
40536           var deleted = [];
40537           Object.keys(i2.graph.entities).forEach(function(id2) {
40538             var entity = i2.graph.entities[id2];
40539             if (entity) {
40540               var key = osmEntity.key(entity);
40541               allEntities[key] = entity;
40542               modified.push(key);
40543             } else {
40544               deleted.push(id2);
40545             }
40546             if (id2 in base.graph.entities) {
40547               baseEntities[id2] = base.graph.entities[id2];
40548             }
40549             if (entity && entity.nodes) {
40550               entity.nodes.forEach(function(nodeID) {
40551                 if (nodeID in base.graph.entities) {
40552                   baseEntities[nodeID] = base.graph.entities[nodeID];
40553                 }
40554               });
40555             }
40556             var baseParents = base.graph._parentWays[id2];
40557             if (baseParents) {
40558               baseParents.forEach(function(parentID) {
40559                 if (parentID in base.graph.entities) {
40560                   baseEntities[parentID] = base.graph.entities[parentID];
40561                 }
40562               });
40563             }
40564           });
40565           var x = {};
40566           if (modified.length)
40567             x.modified = modified;
40568           if (deleted.length)
40569             x.deleted = deleted;
40570           if (i2.imageryUsed)
40571             x.imageryUsed = i2.imageryUsed;
40572           if (i2.photoOverlaysUsed)
40573             x.photoOverlaysUsed = i2.photoOverlaysUsed;
40574           if (i2.annotation)
40575             x.annotation = i2.annotation;
40576           if (i2.transform)
40577             x.transform = i2.transform;
40578           if (i2.selectedIDs)
40579             x.selectedIDs = i2.selectedIDs;
40580           return x;
40581         });
40582         return JSON.stringify({
40583           version: 3,
40584           entities: Object.values(allEntities),
40585           baseEntities: Object.values(baseEntities),
40586           stack: s,
40587           nextIDs: osmEntity.id.next,
40588           index: _index,
40589           // note the time the changes were saved
40590           timestamp: new Date().getTime()
40591         });
40592       },
40593       fromJSON: function(json, loadChildNodes) {
40594         var h = JSON.parse(json);
40595         var loadComplete = true;
40596         osmEntity.id.next = h.nextIDs;
40597         _index = h.index;
40598         if (h.version === 2 || h.version === 3) {
40599           var allEntities = {};
40600           h.entities.forEach(function(entity) {
40601             allEntities[osmEntity.key(entity)] = osmEntity(entity);
40602           });
40603           if (h.version === 3) {
40604             var baseEntities = h.baseEntities.map(function(d) {
40605               return osmEntity(d);
40606             });
40607             var stack = _stack.map(function(state) {
40608               return state.graph;
40609             });
40610             _stack[0].graph.rebase(baseEntities, stack, true);
40611             _tree.rebase(baseEntities, true);
40612             if (loadChildNodes) {
40613               var osm = context.connection();
40614               var baseWays = baseEntities.filter(function(e) {
40615                 return e.type === "way";
40616               });
40617               var nodeIDs = baseWays.reduce(function(acc, way) {
40618                 return utilArrayUnion(acc, way.nodes);
40619               }, []);
40620               var missing = nodeIDs.filter(function(n2) {
40621                 return !_stack[0].graph.hasEntity(n2);
40622               });
40623               if (missing.length && osm) {
40624                 loadComplete = false;
40625                 context.map().redrawEnable(false);
40626                 var loading = uiLoading(context).blocking(true);
40627                 context.container().call(loading);
40628                 var childNodesLoaded = function(err, result) {
40629                   if (!err) {
40630                     var visibleGroups = utilArrayGroupBy(result.data, "visible");
40631                     var visibles = visibleGroups.true || [];
40632                     var invisibles = visibleGroups.false || [];
40633                     if (visibles.length) {
40634                       var visibleIDs = visibles.map(function(entity) {
40635                         return entity.id;
40636                       });
40637                       var stack2 = _stack.map(function(state) {
40638                         return state.graph;
40639                       });
40640                       missing = utilArrayDifference(missing, visibleIDs);
40641                       _stack[0].graph.rebase(visibles, stack2, true);
40642                       _tree.rebase(visibles, true);
40643                     }
40644                     invisibles.forEach(function(entity) {
40645                       osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
40646                     });
40647                   }
40648                   if (err || !missing.length) {
40649                     loading.close();
40650                     context.map().redrawEnable(true);
40651                     dispatch10.call("change");
40652                     dispatch10.call("restore", this);
40653                   }
40654                 };
40655                 osm.loadMultiple(missing, childNodesLoaded);
40656               }
40657             }
40658           }
40659           _stack = h.stack.map(function(d) {
40660             var entities = {}, entity;
40661             if (d.modified) {
40662               d.modified.forEach(function(key) {
40663                 entity = allEntities[key];
40664                 entities[entity.id] = entity;
40665               });
40666             }
40667             if (d.deleted) {
40668               d.deleted.forEach(function(id2) {
40669                 entities[id2] = void 0;
40670               });
40671             }
40672             return {
40673               graph: coreGraph(_stack[0].graph).load(entities),
40674               annotation: d.annotation,
40675               imageryUsed: d.imageryUsed,
40676               photoOverlaysUsed: d.photoOverlaysUsed,
40677               transform: d.transform,
40678               selectedIDs: d.selectedIDs
40679             };
40680           });
40681         } else {
40682           _stack = h.stack.map(function(d) {
40683             var entities = {};
40684             for (var i2 in d.entities) {
40685               var entity = d.entities[i2];
40686               entities[i2] = entity === "undefined" ? void 0 : osmEntity(entity);
40687             }
40688             d.graph = coreGraph(_stack[0].graph).load(entities);
40689             return d;
40690           });
40691         }
40692         var transform2 = _stack[_index].transform;
40693         if (transform2) {
40694           context.map().transformEase(transform2, 0);
40695         }
40696         if (loadComplete) {
40697           dispatch10.call("change");
40698           dispatch10.call("restore", this);
40699         }
40700         return history;
40701       },
40702       lock: function() {
40703         return lock.lock();
40704       },
40705       unlock: function() {
40706         lock.unlock();
40707       },
40708       save: function() {
40709         if (lock.locked() && // don't overwrite existing, unresolved changes
40710         !_hasUnresolvedRestorableChanges) {
40711           const success = corePreferences(getKey("saved_history"), history.toJSON() || null);
40712           if (!success)
40713             dispatch10.call("storage_error");
40714         }
40715         return history;
40716       },
40717       // delete the history version saved in localStorage
40718       clearSaved: function() {
40719         context.debouncedSave.cancel();
40720         if (lock.locked()) {
40721           _hasUnresolvedRestorableChanges = false;
40722           corePreferences(getKey("saved_history"), null);
40723           corePreferences("comment", null);
40724           corePreferences("hashtags", null);
40725           corePreferences("source", null);
40726         }
40727         return history;
40728       },
40729       savedHistoryJSON: function() {
40730         return corePreferences(getKey("saved_history"));
40731       },
40732       hasRestorableChanges: function() {
40733         return _hasUnresolvedRestorableChanges;
40734       },
40735       // load history from a version stored in localStorage
40736       restore: function() {
40737         if (lock.locked()) {
40738           _hasUnresolvedRestorableChanges = false;
40739           var json = this.savedHistoryJSON();
40740           if (json)
40741             history.fromJSON(json, true);
40742         }
40743       },
40744       _getKey: getKey
40745     };
40746     history.reset();
40747     return utilRebind(history, dispatch10, "on");
40748   }
40749
40750   // modules/validations/index.js
40751   var validations_exports = {};
40752   __export(validations_exports, {
40753     validationAlmostJunction: () => validationAlmostJunction,
40754     validationCloseNodes: () => validationCloseNodes,
40755     validationCrossingWays: () => validationCrossingWays,
40756     validationDisconnectedWay: () => validationDisconnectedWay,
40757     validationFormatting: () => validationFormatting,
40758     validationHelpRequest: () => validationHelpRequest,
40759     validationImpossibleOneway: () => validationImpossibleOneway,
40760     validationIncompatibleSource: () => validationIncompatibleSource,
40761     validationMaprules: () => validationMaprules,
40762     validationMismatchedGeometry: () => validationMismatchedGeometry,
40763     validationMissingRole: () => validationMissingRole,
40764     validationMissingTag: () => validationMissingTag,
40765     validationOutdatedTags: () => validationOutdatedTags,
40766     validationPrivateData: () => validationPrivateData,
40767     validationSuspiciousName: () => validationSuspiciousName,
40768     validationUnsquareWay: () => validationUnsquareWay
40769   });
40770
40771   // modules/validations/almost_junction.js
40772   function validationAlmostJunction(context) {
40773     const type2 = "almost_junction";
40774     const EXTEND_TH_METERS = 5;
40775     const WELD_TH_METERS = 0.75;
40776     const CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS;
40777     const SIG_ANGLE_TH = Math.atan(WELD_TH_METERS / EXTEND_TH_METERS);
40778     function isHighway(entity) {
40779       return entity.type === "way" && osmRoutableHighwayTagValues[entity.tags.highway];
40780     }
40781     function isTaggedAsNotContinuing(node) {
40782       return node.tags.noexit === "yes" || node.tags.amenity === "parking_entrance" || node.tags.entrance && node.tags.entrance !== "no";
40783     }
40784     const validation = function checkAlmostJunction(entity, graph) {
40785       if (!isHighway(entity))
40786         return [];
40787       if (entity.isDegenerate())
40788         return [];
40789       const tree = context.history().tree();
40790       const extendableNodeInfos = findConnectableEndNodesByExtension(entity);
40791       let issues = [];
40792       extendableNodeInfos.forEach((extendableNodeInfo) => {
40793         issues.push(new validationIssue({
40794           type: type2,
40795           subtype: "highway-highway",
40796           severity: "warning",
40797           message: function(context2) {
40798             const entity1 = context2.hasEntity(this.entityIds[0]);
40799             if (this.entityIds[0] === this.entityIds[2]) {
40800               return entity1 ? _t.append("issues.almost_junction.self.message", {
40801                 feature: utilDisplayLabel(entity1, context2.graph())
40802               }) : "";
40803             } else {
40804               const entity2 = context2.hasEntity(this.entityIds[2]);
40805               return entity1 && entity2 ? _t.append("issues.almost_junction.message", {
40806                 feature: utilDisplayLabel(entity1, context2.graph()),
40807                 feature2: utilDisplayLabel(entity2, context2.graph())
40808               }) : "";
40809             }
40810           },
40811           reference: showReference,
40812           entityIds: [
40813             entity.id,
40814             extendableNodeInfo.node.id,
40815             extendableNodeInfo.wid
40816           ],
40817           loc: extendableNodeInfo.node.loc,
40818           hash: JSON.stringify(extendableNodeInfo.node.loc),
40819           data: {
40820             midId: extendableNodeInfo.mid.id,
40821             edge: extendableNodeInfo.edge,
40822             cross_loc: extendableNodeInfo.cross_loc
40823           },
40824           dynamicFixes: makeFixes
40825         }));
40826       });
40827       return issues;
40828       function makeFixes(context2) {
40829         let fixes = [new validationIssueFix({
40830           icon: "iD-icon-abutment",
40831           title: _t.append("issues.fix.connect_features.title"),
40832           onClick: function(context3) {
40833             const annotation = _t("issues.fix.connect_almost_junction.annotation");
40834             const [, endNodeId, crossWayId] = this.issue.entityIds;
40835             const midNode = context3.entity(this.issue.data.midId);
40836             const endNode = context3.entity(endNodeId);
40837             const crossWay = context3.entity(crossWayId);
40838             const nearEndNodes = findNearbyEndNodes(endNode, crossWay);
40839             if (nearEndNodes.length > 0) {
40840               const collinear = findSmallJoinAngle(midNode, endNode, nearEndNodes);
40841               if (collinear) {
40842                 context3.perform(
40843                   actionMergeNodes([collinear.id, endNode.id], collinear.loc),
40844                   annotation
40845                 );
40846                 return;
40847               }
40848             }
40849             const targetEdge = this.issue.data.edge;
40850             const crossLoc = this.issue.data.cross_loc;
40851             const edgeNodes = [context3.entity(targetEdge[0]), context3.entity(targetEdge[1])];
40852             const closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
40853             if (closestNodeInfo.distance < WELD_TH_METERS) {
40854               context3.perform(
40855                 actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
40856                 annotation
40857               );
40858             } else {
40859               context3.perform(
40860                 actionAddMidpoint({ loc: crossLoc, edge: targetEdge }, endNode),
40861                 annotation
40862               );
40863             }
40864           }
40865         })];
40866         const node = context2.hasEntity(this.entityIds[1]);
40867         if (node && !node.hasInterestingTags()) {
40868           fixes.push(new validationIssueFix({
40869             icon: "maki-barrier",
40870             title: _t.append("issues.fix.tag_as_disconnected.title"),
40871             onClick: function(context3) {
40872               const nodeID = this.issue.entityIds[1];
40873               const tags = Object.assign({}, context3.entity(nodeID).tags);
40874               tags.noexit = "yes";
40875               context3.perform(
40876                 actionChangeTags(nodeID, tags),
40877                 _t("issues.fix.tag_as_disconnected.annotation")
40878               );
40879             }
40880           }));
40881         }
40882         return fixes;
40883       }
40884       function showReference(selection2) {
40885         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.almost_junction.highway-highway.reference"));
40886       }
40887       function isExtendableCandidate(node, way) {
40888         const osm = services.osm;
40889         if (osm && !osm.isDataLoaded(node.loc)) {
40890           return false;
40891         }
40892         if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
40893           return false;
40894         }
40895         let occurrences = 0;
40896         for (const index in way.nodes) {
40897           if (way.nodes[index] === node.id) {
40898             occurrences += 1;
40899             if (occurrences > 1) {
40900               return false;
40901             }
40902           }
40903         }
40904         return true;
40905       }
40906       function findConnectableEndNodesByExtension(way) {
40907         let results = [];
40908         if (way.isClosed())
40909           return results;
40910         let testNodes;
40911         const indices = [0, way.nodes.length - 1];
40912         indices.forEach((nodeIndex) => {
40913           const nodeID = way.nodes[nodeIndex];
40914           const node = graph.entity(nodeID);
40915           if (!isExtendableCandidate(node, way))
40916             return;
40917           const connectionInfo = canConnectByExtend(way, nodeIndex);
40918           if (!connectionInfo)
40919             return;
40920           testNodes = graph.childNodes(way).slice();
40921           testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
40922           if (geoHasSelfIntersections(testNodes, nodeID))
40923             return;
40924           results.push(connectionInfo);
40925         });
40926         return results;
40927       }
40928       function findNearbyEndNodes(node, way) {
40929         return [
40930           way.nodes[0],
40931           way.nodes[way.nodes.length - 1]
40932         ].map((d) => graph.entity(d)).filter((d) => {
40933           return d.id !== node.id && geoSphericalDistance(node.loc, d.loc) <= CLOSE_NODE_TH;
40934         });
40935       }
40936       function findSmallJoinAngle(midNode, tipNode, endNodes) {
40937         let joinTo;
40938         let minAngle = Infinity;
40939         endNodes.forEach((endNode) => {
40940           const a1 = geoAngle(midNode, tipNode, context.projection) + Math.PI;
40941           const a2 = geoAngle(midNode, endNode, context.projection) + Math.PI;
40942           const diff = Math.max(a1, a2) - Math.min(a1, a2);
40943           if (diff < minAngle) {
40944             joinTo = endNode;
40945             minAngle = diff;
40946           }
40947         });
40948         if (minAngle <= SIG_ANGLE_TH)
40949           return joinTo;
40950         return null;
40951       }
40952       function hasTag(tags, key) {
40953         return tags[key] !== void 0 && tags[key] !== "no";
40954       }
40955       function canConnectWays(way, way2) {
40956         if (way.id === way2.id)
40957           return true;
40958         if ((hasTag(way.tags, "bridge") || hasTag(way2.tags, "bridge")) && !(hasTag(way.tags, "bridge") && hasTag(way2.tags, "bridge")))
40959           return false;
40960         if ((hasTag(way.tags, "tunnel") || hasTag(way2.tags, "tunnel")) && !(hasTag(way.tags, "tunnel") && hasTag(way2.tags, "tunnel")))
40961           return false;
40962         const layer1 = way.tags.layer || "0", layer2 = way2.tags.layer || "0";
40963         if (layer1 !== layer2)
40964           return false;
40965         const level1 = way.tags.level || "0", level2 = way2.tags.level || "0";
40966         if (level1 !== level2)
40967           return false;
40968         return true;
40969       }
40970       function canConnectByExtend(way, endNodeIdx) {
40971         const tipNid = way.nodes[endNodeIdx];
40972         const midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];
40973         const tipNode = graph.entity(tipNid);
40974         const midNode = graph.entity(midNid);
40975         const lon = tipNode.loc[0];
40976         const lat = tipNode.loc[1];
40977         const lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
40978         const lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
40979         const queryExtent = geoExtent([
40980           [lon - lon_range, lat - lat_range],
40981           [lon + lon_range, lat + lat_range]
40982         ]);
40983         const edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
40984         const t = EXTEND_TH_METERS / edgeLen + 1;
40985         const extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
40986         const segmentInfos = tree.waySegments(queryExtent, graph);
40987         for (let i2 = 0; i2 < segmentInfos.length; i2++) {
40988           let segmentInfo = segmentInfos[i2];
40989           let way2 = graph.entity(segmentInfo.wayId);
40990           if (!isHighway(way2))
40991             continue;
40992           if (!canConnectWays(way, way2))
40993             continue;
40994           let nAid = segmentInfo.nodes[0], nBid = segmentInfo.nodes[1];
40995           if (nAid === tipNid || nBid === tipNid)
40996             continue;
40997           let nA = graph.entity(nAid), nB = graph.entity(nBid);
40998           let crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
40999           if (crossLoc) {
41000             return {
41001               mid: midNode,
41002               node: tipNode,
41003               wid: way2.id,
41004               edge: [nA.id, nB.id],
41005               cross_loc: crossLoc
41006             };
41007           }
41008         }
41009         return null;
41010       }
41011     };
41012     validation.type = type2;
41013     return validation;
41014   }
41015
41016   // modules/validations/close_nodes.js
41017   function validationCloseNodes(context) {
41018     var type2 = "close_nodes";
41019     var pointThresholdMeters = 0.2;
41020     var validation = function(entity, graph) {
41021       if (entity.type === "node") {
41022         return getIssuesForNode(entity);
41023       } else if (entity.type === "way") {
41024         return getIssuesForWay(entity);
41025       }
41026       return [];
41027       function getIssuesForNode(node) {
41028         var parentWays = graph.parentWays(node);
41029         if (parentWays.length) {
41030           return getIssuesForVertex(node, parentWays);
41031         } else {
41032           return getIssuesForDetachedPoint(node);
41033         }
41034       }
41035       function wayTypeFor(way) {
41036         if (way.tags.boundary && way.tags.boundary !== "no")
41037           return "boundary";
41038         if (way.tags.indoor && way.tags.indoor !== "no")
41039           return "indoor";
41040         if (way.tags.building && way.tags.building !== "no" || way.tags["building:part"] && way.tags["building:part"] !== "no")
41041           return "building";
41042         if (osmPathHighwayTagValues[way.tags.highway])
41043           return "path";
41044         var parentRelations = graph.parentRelations(way);
41045         for (var i2 in parentRelations) {
41046           var relation = parentRelations[i2];
41047           if (relation.tags.type === "boundary")
41048             return "boundary";
41049           if (relation.isMultipolygon()) {
41050             if (relation.tags.indoor && relation.tags.indoor !== "no")
41051               return "indoor";
41052             if (relation.tags.building && relation.tags.building !== "no" || relation.tags["building:part"] && relation.tags["building:part"] !== "no")
41053               return "building";
41054           }
41055         }
41056         return "other";
41057       }
41058       function shouldCheckWay(way) {
41059         if (way.nodes.length <= 2 || way.isClosed() && way.nodes.length <= 4)
41060           return false;
41061         var bbox2 = way.extent(graph).bbox();
41062         var hypotenuseMeters = geoSphericalDistance([bbox2.minX, bbox2.minY], [bbox2.maxX, bbox2.maxY]);
41063         if (hypotenuseMeters < 1.5)
41064           return false;
41065         return true;
41066       }
41067       function getIssuesForWay(way) {
41068         if (!shouldCheckWay(way))
41069           return [];
41070         var issues = [], nodes = graph.childNodes(way);
41071         for (var i2 = 0; i2 < nodes.length - 1; i2++) {
41072           var node1 = nodes[i2];
41073           var node2 = nodes[i2 + 1];
41074           var issue = getWayIssueIfAny(node1, node2, way);
41075           if (issue)
41076             issues.push(issue);
41077         }
41078         return issues;
41079       }
41080       function getIssuesForVertex(node, parentWays) {
41081         var issues = [];
41082         function checkForCloseness(node1, node2, way) {
41083           var issue = getWayIssueIfAny(node1, node2, way);
41084           if (issue)
41085             issues.push(issue);
41086         }
41087         for (var i2 = 0; i2 < parentWays.length; i2++) {
41088           var parentWay = parentWays[i2];
41089           if (!shouldCheckWay(parentWay))
41090             continue;
41091           var lastIndex = parentWay.nodes.length - 1;
41092           for (var j2 = 0; j2 < parentWay.nodes.length; j2++) {
41093             if (j2 !== 0) {
41094               if (parentWay.nodes[j2 - 1] === node.id) {
41095                 checkForCloseness(node, graph.entity(parentWay.nodes[j2]), parentWay);
41096               }
41097             }
41098             if (j2 !== lastIndex) {
41099               if (parentWay.nodes[j2 + 1] === node.id) {
41100                 checkForCloseness(graph.entity(parentWay.nodes[j2]), node, parentWay);
41101               }
41102             }
41103           }
41104         }
41105         return issues;
41106       }
41107       function thresholdMetersForWay(way) {
41108         if (!shouldCheckWay(way))
41109           return 0;
41110         var wayType = wayTypeFor(way);
41111         if (wayType === "boundary")
41112           return 0;
41113         if (wayType === "indoor")
41114           return 0.01;
41115         if (wayType === "building")
41116           return 0.05;
41117         if (wayType === "path")
41118           return 0.1;
41119         return 0.2;
41120       }
41121       function getIssuesForDetachedPoint(node) {
41122         var issues = [];
41123         var lon = node.loc[0];
41124         var lat = node.loc[1];
41125         var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
41126         var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
41127         var queryExtent = geoExtent([
41128           [lon - lon_range, lat - lat_range],
41129           [lon + lon_range, lat + lat_range]
41130         ]);
41131         var intersected = context.history().tree().intersects(queryExtent, graph);
41132         for (var j2 = 0; j2 < intersected.length; j2++) {
41133           var nearby = intersected[j2];
41134           if (nearby.id === node.id)
41135             continue;
41136           if (nearby.type !== "node" || nearby.geometry(graph) !== "point")
41137             continue;
41138           if (nearby.loc === node.loc || geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
41139             if ("memorial:type" in node.tags && "memorial:type" in nearby.tags && node.tags["memorial:type"] === "stolperstein" && nearby.tags["memorial:type"] === "stolperstein")
41140               continue;
41141             if ("memorial" in node.tags && "memorial" in nearby.tags && node.tags.memorial === "stolperstein" && nearby.tags.memorial === "stolperstein")
41142               continue;
41143             var zAxisKeys = { layer: true, level: true, "addr:housenumber": true, "addr:unit": true };
41144             var zAxisDifferentiates = false;
41145             for (var key in zAxisKeys) {
41146               var nodeValue = node.tags[key] || "0";
41147               var nearbyValue = nearby.tags[key] || "0";
41148               if (nodeValue !== nearbyValue) {
41149                 zAxisDifferentiates = true;
41150                 break;
41151               }
41152             }
41153             if (zAxisDifferentiates)
41154               continue;
41155             issues.push(new validationIssue({
41156               type: type2,
41157               subtype: "detached",
41158               severity: "warning",
41159               message: function(context2) {
41160                 var entity2 = context2.hasEntity(this.entityIds[0]), entity22 = context2.hasEntity(this.entityIds[1]);
41161                 return entity2 && entity22 ? _t.append("issues.close_nodes.detached.message", {
41162                   feature: utilDisplayLabel(entity2, context2.graph()),
41163                   feature2: utilDisplayLabel(entity22, context2.graph())
41164                 }) : "";
41165               },
41166               reference: showReference,
41167               entityIds: [node.id, nearby.id],
41168               dynamicFixes: function() {
41169                 return [
41170                   new validationIssueFix({
41171                     icon: "iD-operation-disconnect",
41172                     title: _t.append("issues.fix.move_points_apart.title")
41173                   }),
41174                   new validationIssueFix({
41175                     icon: "iD-icon-layers",
41176                     title: _t.append("issues.fix.use_different_layers_or_levels.title")
41177                   })
41178                 ];
41179               }
41180             }));
41181           }
41182         }
41183         return issues;
41184         function showReference(selection2) {
41185           var referenceText = _t("issues.close_nodes.detached.reference");
41186           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").html(referenceText);
41187         }
41188       }
41189       function getWayIssueIfAny(node1, node2, way) {
41190         if (node1.id === node2.id || node1.hasInterestingTags() && node2.hasInterestingTags()) {
41191           return null;
41192         }
41193         if (node1.loc !== node2.loc) {
41194           var parentWays1 = graph.parentWays(node1);
41195           var parentWays2 = new Set(graph.parentWays(node2));
41196           var sharedWays = parentWays1.filter(function(parentWay) {
41197             return parentWays2.has(parentWay);
41198           });
41199           var thresholds = sharedWays.map(function(parentWay) {
41200             return thresholdMetersForWay(parentWay);
41201           });
41202           var threshold = Math.min(...thresholds);
41203           var distance = geoSphericalDistance(node1.loc, node2.loc);
41204           if (distance > threshold)
41205             return null;
41206         }
41207         return new validationIssue({
41208           type: type2,
41209           subtype: "vertices",
41210           severity: "warning",
41211           message: function(context2) {
41212             var entity2 = context2.hasEntity(this.entityIds[0]);
41213             return entity2 ? _t.append("issues.close_nodes.message", { way: utilDisplayLabel(entity2, context2.graph()) }) : "";
41214           },
41215           reference: showReference,
41216           entityIds: [way.id, node1.id, node2.id],
41217           loc: node1.loc,
41218           dynamicFixes: function() {
41219             return [
41220               new validationIssueFix({
41221                 icon: "iD-icon-plus",
41222                 title: _t.append("issues.fix.merge_points.title"),
41223                 onClick: function(context2) {
41224                   var entityIds = this.issue.entityIds;
41225                   var action = actionMergeNodes([entityIds[1], entityIds[2]]);
41226                   context2.perform(action, _t("issues.fix.merge_close_vertices.annotation"));
41227                 }
41228               }),
41229               new validationIssueFix({
41230                 icon: "iD-operation-disconnect",
41231                 title: _t.append("issues.fix.move_points_apart.title")
41232               })
41233             ];
41234           }
41235         });
41236         function showReference(selection2) {
41237           var referenceText = _t("issues.close_nodes.reference");
41238           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").html(referenceText);
41239         }
41240       }
41241     };
41242     validation.type = type2;
41243     return validation;
41244   }
41245
41246   // modules/validations/crossing_ways.js
41247   function validationCrossingWays(context) {
41248     var type2 = "crossing_ways";
41249     function getFeatureWithFeatureTypeTagsForWay(way, graph) {
41250       if (getFeatureType(way, graph) === null) {
41251         var parentRels = graph.parentRelations(way);
41252         for (var i2 = 0; i2 < parentRels.length; i2++) {
41253           var rel = parentRels[i2];
41254           if (getFeatureType(rel, graph) !== null) {
41255             return rel;
41256           }
41257         }
41258       }
41259       return way;
41260     }
41261     function hasTag(tags, key) {
41262       return tags[key] !== void 0 && tags[key] !== "no";
41263     }
41264     function taggedAsIndoor(tags) {
41265       return hasTag(tags, "indoor") || hasTag(tags, "level") || tags.highway === "corridor";
41266     }
41267     function allowsBridge(featureType) {
41268       return featureType === "highway" || featureType === "railway" || featureType === "waterway";
41269     }
41270     function allowsTunnel(featureType) {
41271       return featureType === "highway" || featureType === "railway" || featureType === "waterway";
41272     }
41273     var ignoredBuildings = {
41274       demolished: true,
41275       dismantled: true,
41276       proposed: true,
41277       razed: true
41278     };
41279     function getFeatureType(entity, graph) {
41280       var geometry = entity.geometry(graph);
41281       if (geometry !== "line" && geometry !== "area")
41282         return null;
41283       var tags = entity.tags;
41284       if (hasTag(tags, "building") && !ignoredBuildings[tags.building])
41285         return "building";
41286       if (hasTag(tags, "highway") && osmRoutableHighwayTagValues[tags.highway])
41287         return "highway";
41288       if (geometry !== "line")
41289         return null;
41290       if (hasTag(tags, "railway") && osmRailwayTrackTagValues[tags.railway])
41291         return "railway";
41292       if (hasTag(tags, "waterway") && osmFlowingWaterwayTagValues[tags.waterway])
41293         return "waterway";
41294       return null;
41295     }
41296     function isLegitCrossing(tags1, featureType1, tags2, featureType2) {
41297       var level1 = tags1.level || "0";
41298       var level2 = tags2.level || "0";
41299       if (taggedAsIndoor(tags1) && taggedAsIndoor(tags2) && level1 !== level2) {
41300         return true;
41301       }
41302       var layer1 = tags1.layer || "0";
41303       var layer2 = tags2.layer || "0";
41304       if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
41305         if (hasTag(tags1, "bridge") && !hasTag(tags2, "bridge"))
41306           return true;
41307         if (!hasTag(tags1, "bridge") && hasTag(tags2, "bridge"))
41308           return true;
41309         if (hasTag(tags1, "bridge") && hasTag(tags2, "bridge") && layer1 !== layer2)
41310           return true;
41311       } else if (allowsBridge(featureType1) && hasTag(tags1, "bridge"))
41312         return true;
41313       else if (allowsBridge(featureType2) && hasTag(tags2, "bridge"))
41314         return true;
41315       if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
41316         if (hasTag(tags1, "tunnel") && !hasTag(tags2, "tunnel"))
41317           return true;
41318         if (!hasTag(tags1, "tunnel") && hasTag(tags2, "tunnel"))
41319           return true;
41320         if (hasTag(tags1, "tunnel") && hasTag(tags2, "tunnel") && layer1 !== layer2)
41321           return true;
41322       } else if (allowsTunnel(featureType1) && hasTag(tags1, "tunnel"))
41323         return true;
41324       else if (allowsTunnel(featureType2) && hasTag(tags2, "tunnel"))
41325         return true;
41326       if (featureType1 === "waterway" && featureType2 === "highway" && tags2.man_made === "pier")
41327         return true;
41328       if (featureType2 === "waterway" && featureType1 === "highway" && tags1.man_made === "pier")
41329         return true;
41330       if (featureType1 === "building" || featureType2 === "building" || taggedAsIndoor(tags1) || taggedAsIndoor(tags2)) {
41331         if (layer1 !== layer2)
41332           return true;
41333       }
41334       return false;
41335     }
41336     var highwaysDisallowingFords = {
41337       motorway: true,
41338       motorway_link: true,
41339       trunk: true,
41340       trunk_link: true,
41341       primary: true,
41342       primary_link: true,
41343       secondary: true,
41344       secondary_link: true
41345     };
41346     var nonCrossingHighways = { track: true };
41347     function tagsForConnectionNodeIfAllowed(entity1, entity2, graph) {
41348       var featureType1 = getFeatureType(entity1, graph);
41349       var featureType2 = getFeatureType(entity2, graph);
41350       var geometry1 = entity1.geometry(graph);
41351       var geometry2 = entity2.geometry(graph);
41352       var bothLines = geometry1 === "line" && geometry2 === "line";
41353       if (featureType1 === featureType2) {
41354         if (featureType1 === "highway") {
41355           var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
41356           var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
41357           if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
41358             var roadFeature = entity1IsPath ? entity2 : entity1;
41359             if (nonCrossingHighways[roadFeature.tags.highway]) {
41360               return {};
41361             }
41362             var pathFeature = entity1IsPath ? entity1 : entity2;
41363             if (["marked", "unmarked", "traffic_signals", "uncontrolled"].indexOf(pathFeature.tags.crossing) !== -1) {
41364               return bothLines ? { highway: "crossing", crossing: pathFeature.tags.crossing } : {};
41365             }
41366             return bothLines ? { highway: "crossing" } : {};
41367           }
41368           return {};
41369         }
41370         if (featureType1 === "waterway")
41371           return {};
41372         if (featureType1 === "railway")
41373           return {};
41374       } else {
41375         var featureTypes = [featureType1, featureType2];
41376         if (featureTypes.indexOf("highway") !== -1) {
41377           if (featureTypes.indexOf("railway") !== -1) {
41378             if (!bothLines)
41379               return {};
41380             var isTram = entity1.tags.railway === "tram" || entity2.tags.railway === "tram";
41381             if (osmPathHighwayTagValues[entity1.tags.highway] || osmPathHighwayTagValues[entity2.tags.highway]) {
41382               if (isTram)
41383                 return { railway: "tram_crossing" };
41384               return { railway: "crossing" };
41385             } else {
41386               if (isTram)
41387                 return { railway: "tram_level_crossing" };
41388               return { railway: "level_crossing" };
41389             }
41390           }
41391           if (featureTypes.indexOf("waterway") !== -1) {
41392             if (hasTag(entity1.tags, "tunnel") && hasTag(entity2.tags, "tunnel"))
41393               return null;
41394             if (hasTag(entity1.tags, "bridge") && hasTag(entity2.tags, "bridge"))
41395               return null;
41396             if (highwaysDisallowingFords[entity1.tags.highway] || highwaysDisallowingFords[entity2.tags.highway]) {
41397               return null;
41398             }
41399             return bothLines ? { ford: "yes" } : {};
41400           }
41401         }
41402       }
41403       return null;
41404     }
41405     function findCrossingsByWay(way1, graph, tree) {
41406       var edgeCrossInfos = [];
41407       if (way1.type !== "way")
41408         return edgeCrossInfos;
41409       var taggedFeature1 = getFeatureWithFeatureTypeTagsForWay(way1, graph);
41410       var way1FeatureType = getFeatureType(taggedFeature1, graph);
41411       if (way1FeatureType === null)
41412         return edgeCrossInfos;
41413       var checkedSingleCrossingWays = {};
41414       var i2, j2;
41415       var extent;
41416       var n1, n2, nA, nB, nAId, nBId;
41417       var segment1, segment2;
41418       var oneOnly;
41419       var segmentInfos, segment2Info, way2, taggedFeature2, way2FeatureType;
41420       var way1Nodes = graph.childNodes(way1);
41421       var comparedWays = {};
41422       for (i2 = 0; i2 < way1Nodes.length - 1; i2++) {
41423         n1 = way1Nodes[i2];
41424         n2 = way1Nodes[i2 + 1];
41425         extent = geoExtent([
41426           [
41427             Math.min(n1.loc[0], n2.loc[0]),
41428             Math.min(n1.loc[1], n2.loc[1])
41429           ],
41430           [
41431             Math.max(n1.loc[0], n2.loc[0]),
41432             Math.max(n1.loc[1], n2.loc[1])
41433           ]
41434         ]);
41435         segmentInfos = tree.waySegments(extent, graph);
41436         for (j2 = 0; j2 < segmentInfos.length; j2++) {
41437           segment2Info = segmentInfos[j2];
41438           if (segment2Info.wayId === way1.id)
41439             continue;
41440           if (checkedSingleCrossingWays[segment2Info.wayId])
41441             continue;
41442           comparedWays[segment2Info.wayId] = true;
41443           way2 = graph.hasEntity(segment2Info.wayId);
41444           if (!way2)
41445             continue;
41446           taggedFeature2 = getFeatureWithFeatureTypeTagsForWay(way2, graph);
41447           way2FeatureType = getFeatureType(taggedFeature2, graph);
41448           if (way2FeatureType === null || isLegitCrossing(taggedFeature1.tags, way1FeatureType, taggedFeature2.tags, way2FeatureType)) {
41449             continue;
41450           }
41451           oneOnly = way1FeatureType === "building" || way2FeatureType === "building";
41452           nAId = segment2Info.nodes[0];
41453           nBId = segment2Info.nodes[1];
41454           if (nAId === n1.id || nAId === n2.id || nBId === n1.id || nBId === n2.id) {
41455             continue;
41456           }
41457           nA = graph.hasEntity(nAId);
41458           if (!nA)
41459             continue;
41460           nB = graph.hasEntity(nBId);
41461           if (!nB)
41462             continue;
41463           segment1 = [n1.loc, n2.loc];
41464           segment2 = [nA.loc, nB.loc];
41465           var point2 = geoLineIntersection(segment1, segment2);
41466           if (point2) {
41467             edgeCrossInfos.push({
41468               wayInfos: [
41469                 {
41470                   way: way1,
41471                   featureType: way1FeatureType,
41472                   edge: [n1.id, n2.id]
41473                 },
41474                 {
41475                   way: way2,
41476                   featureType: way2FeatureType,
41477                   edge: [nA.id, nB.id]
41478                 }
41479               ],
41480               crossPoint: point2
41481             });
41482             if (oneOnly) {
41483               checkedSingleCrossingWays[way2.id] = true;
41484               break;
41485             }
41486           }
41487         }
41488       }
41489       return edgeCrossInfos;
41490     }
41491     function waysToCheck(entity, graph) {
41492       var featureType = getFeatureType(entity, graph);
41493       if (!featureType)
41494         return [];
41495       if (entity.type === "way") {
41496         return [entity];
41497       } else if (entity.type === "relation") {
41498         return entity.members.reduce(function(array2, member) {
41499           if (member.type === "way" && // only look at geometry ways
41500           (!member.role || member.role === "outer" || member.role === "inner")) {
41501             var entity2 = graph.hasEntity(member.id);
41502             if (entity2 && array2.indexOf(entity2) === -1) {
41503               array2.push(entity2);
41504             }
41505           }
41506           return array2;
41507         }, []);
41508       }
41509       return [];
41510     }
41511     var validation = function checkCrossingWays(entity, graph) {
41512       var tree = context.history().tree();
41513       var ways = waysToCheck(entity, graph);
41514       var issues = [];
41515       var wayIndex, crossingIndex, crossings;
41516       for (wayIndex in ways) {
41517         crossings = findCrossingsByWay(ways[wayIndex], graph, tree);
41518         for (crossingIndex in crossings) {
41519           issues.push(createIssue(crossings[crossingIndex], graph));
41520         }
41521       }
41522       return issues;
41523     };
41524     function createIssue(crossing, graph) {
41525       crossing.wayInfos.sort(function(way1Info, way2Info) {
41526         var type1 = way1Info.featureType;
41527         var type22 = way2Info.featureType;
41528         if (type1 === type22) {
41529           return utilDisplayLabel(way1Info.way, graph) > utilDisplayLabel(way2Info.way, graph);
41530         } else if (type1 === "waterway") {
41531           return true;
41532         } else if (type22 === "waterway") {
41533           return false;
41534         }
41535         return type1 < type22;
41536       });
41537       var entities = crossing.wayInfos.map(function(wayInfo) {
41538         return getFeatureWithFeatureTypeTagsForWay(wayInfo.way, graph);
41539       });
41540       var edges = [crossing.wayInfos[0].edge, crossing.wayInfos[1].edge];
41541       var featureTypes = [crossing.wayInfos[0].featureType, crossing.wayInfos[1].featureType];
41542       var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph);
41543       var featureType1 = crossing.wayInfos[0].featureType;
41544       var featureType2 = crossing.wayInfos[1].featureType;
41545       var isCrossingIndoors = taggedAsIndoor(entities[0].tags) && taggedAsIndoor(entities[1].tags);
41546       var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, "tunnel") && allowsTunnel(featureType2) && hasTag(entities[1].tags, "tunnel");
41547       var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, "bridge") && allowsBridge(featureType2) && hasTag(entities[1].tags, "bridge");
41548       var subtype = [featureType1, featureType2].sort().join("-");
41549       var crossingTypeID = subtype;
41550       if (isCrossingIndoors) {
41551         crossingTypeID = "indoor-indoor";
41552       } else if (isCrossingTunnels) {
41553         crossingTypeID = "tunnel-tunnel";
41554       } else if (isCrossingBridges) {
41555         crossingTypeID = "bridge-bridge";
41556       }
41557       if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
41558         crossingTypeID += "_connectable";
41559       }
41560       var uniqueID = crossing.crossPoint[0].toFixed(4) + "," + crossing.crossPoint[1].toFixed(4);
41561       return new validationIssue({
41562         type: type2,
41563         subtype,
41564         severity: "warning",
41565         message: function(context2) {
41566           var graph2 = context2.graph();
41567           var entity1 = graph2.hasEntity(this.entityIds[0]), entity2 = graph2.hasEntity(this.entityIds[1]);
41568           return entity1 && entity2 ? _t.append("issues.crossing_ways.message", {
41569             feature: utilDisplayLabel(entity1, graph2),
41570             feature2: utilDisplayLabel(entity2, graph2)
41571           }) : "";
41572         },
41573         reference: showReference,
41574         entityIds: entities.map(function(entity) {
41575           return entity.id;
41576         }),
41577         data: {
41578           edges,
41579           featureTypes,
41580           connectionTags
41581         },
41582         hash: uniqueID,
41583         loc: crossing.crossPoint,
41584         dynamicFixes: function(context2) {
41585           var mode = context2.mode();
41586           if (!mode || mode.id !== "select" || mode.selectedIDs().length !== 1)
41587             return [];
41588           var selectedIndex = this.entityIds[0] === mode.selectedIDs()[0] ? 0 : 1;
41589           var selectedFeatureType = this.data.featureTypes[selectedIndex];
41590           var otherFeatureType = this.data.featureTypes[selectedIndex === 0 ? 1 : 0];
41591           var fixes = [];
41592           if (connectionTags) {
41593             fixes.push(makeConnectWaysFix(this.data.connectionTags));
41594           }
41595           if (isCrossingIndoors) {
41596             fixes.push(new validationIssueFix({
41597               icon: "iD-icon-layers",
41598               title: _t.append("issues.fix.use_different_levels.title")
41599             }));
41600           } else if (isCrossingTunnels || isCrossingBridges || featureType1 === "building" || featureType2 === "building") {
41601             fixes.push(makeChangeLayerFix("higher"));
41602             fixes.push(makeChangeLayerFix("lower"));
41603           } else if (context2.graph().geometry(this.entityIds[0]) === "line" && context2.graph().geometry(this.entityIds[1]) === "line") {
41604             if (allowsBridge(selectedFeatureType) && selectedFeatureType !== "waterway") {
41605               fixes.push(makeAddBridgeOrTunnelFix("add_a_bridge", "temaki-bridge", "bridge"));
41606             }
41607             var skipTunnelFix = otherFeatureType === "waterway" && selectedFeatureType !== "waterway";
41608             if (allowsTunnel(selectedFeatureType) && !skipTunnelFix) {
41609               fixes.push(makeAddBridgeOrTunnelFix("add_a_tunnel", "temaki-tunnel", "tunnel"));
41610             }
41611           }
41612           fixes.push(new validationIssueFix({
41613             icon: "iD-operation-move",
41614             title: _t.append("issues.fix.reposition_features.title")
41615           }));
41616           return fixes;
41617         }
41618       });
41619       function showReference(selection2) {
41620         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.crossing_ways." + crossingTypeID + ".reference"));
41621       }
41622     }
41623     function makeAddBridgeOrTunnelFix(fixTitleID, iconName, bridgeOrTunnel) {
41624       return new validationIssueFix({
41625         icon: iconName,
41626         title: _t.append("issues.fix." + fixTitleID + ".title"),
41627         onClick: function(context2) {
41628           var mode = context2.mode();
41629           if (!mode || mode.id !== "select")
41630             return;
41631           var selectedIDs = mode.selectedIDs();
41632           if (selectedIDs.length !== 1)
41633             return;
41634           var selectedWayID = selectedIDs[0];
41635           if (!context2.hasEntity(selectedWayID))
41636             return;
41637           var resultWayIDs = [selectedWayID];
41638           var edge, crossedEdge, crossedWayID;
41639           if (this.issue.entityIds[0] === selectedWayID) {
41640             edge = this.issue.data.edges[0];
41641             crossedEdge = this.issue.data.edges[1];
41642             crossedWayID = this.issue.entityIds[1];
41643           } else {
41644             edge = this.issue.data.edges[1];
41645             crossedEdge = this.issue.data.edges[0];
41646             crossedWayID = this.issue.entityIds[0];
41647           }
41648           var crossingLoc = this.issue.loc;
41649           var projection2 = context2.projection;
41650           var action = function actionAddStructure(graph) {
41651             var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
41652             var crossedWay = graph.hasEntity(crossedWayID);
41653             var structLengthMeters = crossedWay && isFinite(crossedWay.tags.width) && Number(crossedWay.tags.width);
41654             if (!structLengthMeters) {
41655               structLengthMeters = crossedWay && crossedWay.impliedLineWidthMeters();
41656             }
41657             if (structLengthMeters) {
41658               if (getFeatureType(crossedWay, graph) === "railway") {
41659                 structLengthMeters *= 2;
41660               }
41661             } else {
41662               structLengthMeters = 8;
41663             }
41664             var a1 = geoAngle(edgeNodes[0], edgeNodes[1], projection2) + Math.PI;
41665             var a2 = geoAngle(graph.entity(crossedEdge[0]), graph.entity(crossedEdge[1]), projection2) + Math.PI;
41666             var crossingAngle = Math.max(a1, a2) - Math.min(a1, a2);
41667             if (crossingAngle > Math.PI)
41668               crossingAngle -= Math.PI;
41669             structLengthMeters = structLengthMeters / 2 / Math.sin(crossingAngle) * 2;
41670             structLengthMeters += 4;
41671             structLengthMeters = Math.min(Math.max(structLengthMeters, 4), 50);
41672             function geomToProj(geoPoint) {
41673               return [
41674                 geoLonToMeters(geoPoint[0], geoPoint[1]),
41675                 geoLatToMeters(geoPoint[1])
41676               ];
41677             }
41678             function projToGeom(projPoint) {
41679               var lat = geoMetersToLat(projPoint[1]);
41680               return [
41681                 geoMetersToLon(projPoint[0], lat),
41682                 lat
41683               ];
41684             }
41685             var projEdgeNode1 = geomToProj(edgeNodes[0].loc);
41686             var projEdgeNode2 = geomToProj(edgeNodes[1].loc);
41687             var projectedAngle = geoVecAngle(projEdgeNode1, projEdgeNode2);
41688             var projectedCrossingLoc = geomToProj(crossingLoc);
41689             var linearToSphericalMetersRatio = geoVecLength(projEdgeNode1, projEdgeNode2) / geoSphericalDistance(edgeNodes[0].loc, edgeNodes[1].loc);
41690             function locSphericalDistanceFromCrossingLoc(angle2, distanceMeters) {
41691               var lengthSphericalMeters = distanceMeters * linearToSphericalMetersRatio;
41692               return projToGeom([
41693                 projectedCrossingLoc[0] + Math.cos(angle2) * lengthSphericalMeters,
41694                 projectedCrossingLoc[1] + Math.sin(angle2) * lengthSphericalMeters
41695               ]);
41696             }
41697             var endpointLocGetter1 = function(lengthMeters) {
41698               return locSphericalDistanceFromCrossingLoc(projectedAngle, lengthMeters);
41699             };
41700             var endpointLocGetter2 = function(lengthMeters) {
41701               return locSphericalDistanceFromCrossingLoc(projectedAngle + Math.PI, lengthMeters);
41702             };
41703             var minEdgeLengthMeters = 0.55;
41704             function determineEndpoint(edge2, endNode, locGetter) {
41705               var newNode;
41706               var idealLengthMeters = structLengthMeters / 2;
41707               var crossingToEdgeEndDistance = geoSphericalDistance(crossingLoc, endNode.loc);
41708               if (crossingToEdgeEndDistance - idealLengthMeters > minEdgeLengthMeters) {
41709                 var idealNodeLoc = locGetter(idealLengthMeters);
41710                 newNode = osmNode();
41711                 graph = actionAddMidpoint({ loc: idealNodeLoc, edge: edge2 }, newNode)(graph);
41712               } else {
41713                 var edgeCount = 0;
41714                 endNode.parentIntersectionWays(graph).forEach(function(way) {
41715                   way.nodes.forEach(function(nodeID) {
41716                     if (nodeID === endNode.id) {
41717                       if (endNode.id === way.first() && endNode.id !== way.last() || endNode.id === way.last() && endNode.id !== way.first()) {
41718                         edgeCount += 1;
41719                       } else {
41720                         edgeCount += 2;
41721                       }
41722                     }
41723                   });
41724                 });
41725                 if (edgeCount >= 3) {
41726                   var insetLength = crossingToEdgeEndDistance - minEdgeLengthMeters;
41727                   if (insetLength > minEdgeLengthMeters) {
41728                     var insetNodeLoc = locGetter(insetLength);
41729                     newNode = osmNode();
41730                     graph = actionAddMidpoint({ loc: insetNodeLoc, edge: edge2 }, newNode)(graph);
41731                   }
41732                 }
41733               }
41734               if (!newNode)
41735                 newNode = endNode;
41736               var splitAction = actionSplit([newNode.id]).limitWays(resultWayIDs);
41737               graph = splitAction(graph);
41738               if (splitAction.getCreatedWayIDs().length) {
41739                 resultWayIDs.push(splitAction.getCreatedWayIDs()[0]);
41740               }
41741               return newNode;
41742             }
41743             var structEndNode1 = determineEndpoint(edge, edgeNodes[1], endpointLocGetter1);
41744             var structEndNode2 = determineEndpoint([edgeNodes[0].id, structEndNode1.id], edgeNodes[0], endpointLocGetter2);
41745             var structureWay = resultWayIDs.map(function(id2) {
41746               return graph.entity(id2);
41747             }).find(function(way) {
41748               return way.nodes.indexOf(structEndNode1.id) !== -1 && way.nodes.indexOf(structEndNode2.id) !== -1;
41749             });
41750             var tags = Object.assign({}, structureWay.tags);
41751             if (bridgeOrTunnel === "bridge") {
41752               tags.bridge = "yes";
41753               tags.layer = "1";
41754             } else {
41755               var tunnelValue = "yes";
41756               if (getFeatureType(structureWay, graph) === "waterway") {
41757                 tunnelValue = "culvert";
41758               }
41759               tags.tunnel = tunnelValue;
41760               tags.layer = "-1";
41761             }
41762             graph = actionChangeTags(structureWay.id, tags)(graph);
41763             return graph;
41764           };
41765           context2.perform(action, _t("issues.fix." + fixTitleID + ".annotation"));
41766           context2.enter(modeSelect(context2, resultWayIDs));
41767         }
41768       });
41769     }
41770     function makeConnectWaysFix(connectionTags) {
41771       var fixTitleID = "connect_features";
41772       if (connectionTags.ford) {
41773         fixTitleID = "connect_using_ford";
41774       }
41775       return new validationIssueFix({
41776         icon: "iD-icon-crossing",
41777         title: _t.append("issues.fix." + fixTitleID + ".title"),
41778         onClick: function(context2) {
41779           var loc = this.issue.loc;
41780           var connectionTags2 = this.issue.data.connectionTags;
41781           var edges = this.issue.data.edges;
41782           context2.perform(
41783             function actionConnectCrossingWays(graph) {
41784               var node = osmNode({ loc, tags: connectionTags2 });
41785               graph = graph.replace(node);
41786               var nodesToMerge = [node.id];
41787               var mergeThresholdInMeters = 0.75;
41788               edges.forEach(function(edge) {
41789                 var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
41790                 var nearby = geoSphericalClosestNode(edgeNodes, loc);
41791                 if ((!nearby.node.hasInterestingTags() || nearby.node.isCrossing()) && nearby.distance < mergeThresholdInMeters) {
41792                   nodesToMerge.push(nearby.node.id);
41793                 } else {
41794                   graph = actionAddMidpoint({ loc, edge }, node)(graph);
41795                 }
41796               });
41797               if (nodesToMerge.length > 1) {
41798                 graph = actionMergeNodes(nodesToMerge, loc)(graph);
41799               }
41800               return graph;
41801             },
41802             _t("issues.fix.connect_crossing_features.annotation")
41803           );
41804         }
41805       });
41806     }
41807     function makeChangeLayerFix(higherOrLower) {
41808       return new validationIssueFix({
41809         icon: "iD-icon-" + (higherOrLower === "higher" ? "up" : "down"),
41810         title: _t.append("issues.fix.tag_this_as_" + higherOrLower + ".title"),
41811         onClick: function(context2) {
41812           var mode = context2.mode();
41813           if (!mode || mode.id !== "select")
41814             return;
41815           var selectedIDs = mode.selectedIDs();
41816           if (selectedIDs.length !== 1)
41817             return;
41818           var selectedID = selectedIDs[0];
41819           if (!this.issue.entityIds.some(function(entityId) {
41820             return entityId === selectedID;
41821           }))
41822             return;
41823           var entity = context2.hasEntity(selectedID);
41824           if (!entity)
41825             return;
41826           var tags = Object.assign({}, entity.tags);
41827           var layer = tags.layer && Number(tags.layer);
41828           if (layer && !isNaN(layer)) {
41829             if (higherOrLower === "higher") {
41830               layer += 1;
41831             } else {
41832               layer -= 1;
41833             }
41834           } else {
41835             if (higherOrLower === "higher") {
41836               layer = 1;
41837             } else {
41838               layer = -1;
41839             }
41840           }
41841           tags.layer = layer.toString();
41842           context2.perform(
41843             actionChangeTags(entity.id, tags),
41844             _t("operations.change_tags.annotation")
41845           );
41846         }
41847       });
41848     }
41849     validation.type = type2;
41850     return validation;
41851   }
41852
41853   // modules/behavior/draw_way.js
41854   function behaviorDrawWay(context, wayID, mode, startGraph) {
41855     const keybinding = utilKeybinding("drawWay");
41856     var dispatch10 = dispatch_default("rejectedSelfIntersection");
41857     var behavior = behaviorDraw(context);
41858     var _nodeIndex;
41859     var _origWay;
41860     var _wayGeometry;
41861     var _headNodeID;
41862     var _annotation;
41863     var _pointerHasMoved = false;
41864     var _drawNode;
41865     var _didResolveTempEdit = false;
41866     function createDrawNode(loc) {
41867       _drawNode = osmNode({ loc });
41868       context.pauseChangeDispatch();
41869       context.replace(function actionAddDrawNode(graph) {
41870         var way = graph.entity(wayID);
41871         return graph.replace(_drawNode).replace(way.addNode(_drawNode.id, _nodeIndex));
41872       }, _annotation);
41873       context.resumeChangeDispatch();
41874       setActiveElements();
41875     }
41876     function removeDrawNode() {
41877       context.pauseChangeDispatch();
41878       context.replace(
41879         function actionDeleteDrawNode(graph) {
41880           var way = graph.entity(wayID);
41881           return graph.replace(way.removeNode(_drawNode.id)).remove(_drawNode);
41882         },
41883         _annotation
41884       );
41885       _drawNode = void 0;
41886       context.resumeChangeDispatch();
41887     }
41888     function keydown(d3_event) {
41889       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
41890         if (context.surface().classed("nope")) {
41891           context.surface().classed("nope-suppressed", true);
41892         }
41893         context.surface().classed("nope", false).classed("nope-disabled", true);
41894       }
41895     }
41896     function keyup(d3_event) {
41897       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
41898         if (context.surface().classed("nope-suppressed")) {
41899           context.surface().classed("nope", true);
41900         }
41901         context.surface().classed("nope-suppressed", false).classed("nope-disabled", false);
41902       }
41903     }
41904     function allowsVertex(d) {
41905       return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
41906     }
41907     function move(d3_event, datum2) {
41908       var loc = context.map().mouseCoordinates();
41909       if (!_drawNode)
41910         createDrawNode(loc);
41911       context.surface().classed("nope-disabled", d3_event.altKey);
41912       var targetLoc = datum2 && datum2.properties && datum2.properties.entity && allowsVertex(datum2.properties.entity) && datum2.properties.entity.loc;
41913       var targetNodes = datum2 && datum2.properties && datum2.properties.nodes;
41914       if (targetLoc) {
41915         loc = targetLoc;
41916       } else if (targetNodes) {
41917         var choice = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, _drawNode.id);
41918         if (choice) {
41919           loc = choice.loc;
41920         }
41921       }
41922       context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
41923       _drawNode = context.entity(_drawNode.id);
41924       checkGeometry(
41925         true
41926         /* includeDrawNode */
41927       );
41928     }
41929     function checkGeometry(includeDrawNode) {
41930       var nopeDisabled = context.surface().classed("nope-disabled");
41931       var isInvalid = isInvalidGeometry(includeDrawNode);
41932       if (nopeDisabled) {
41933         context.surface().classed("nope", false).classed("nope-suppressed", isInvalid);
41934       } else {
41935         context.surface().classed("nope", isInvalid).classed("nope-suppressed", false);
41936       }
41937     }
41938     function isInvalidGeometry(includeDrawNode) {
41939       var testNode = _drawNode;
41940       var parentWay = context.graph().entity(wayID);
41941       var nodes = context.graph().childNodes(parentWay).slice();
41942       if (includeDrawNode) {
41943         if (parentWay.isClosed()) {
41944           nodes.pop();
41945         }
41946       } else {
41947         if (parentWay.isClosed()) {
41948           if (nodes.length < 3)
41949             return false;
41950           if (_drawNode)
41951             nodes.splice(-2, 1);
41952           testNode = nodes[nodes.length - 2];
41953         } else {
41954           return false;
41955         }
41956       }
41957       return testNode && geoHasSelfIntersections(nodes, testNode.id);
41958     }
41959     function undone() {
41960       _didResolveTempEdit = true;
41961       context.pauseChangeDispatch();
41962       var nextMode;
41963       if (context.graph() === startGraph) {
41964         nextMode = modeSelect(context, [wayID]);
41965       } else {
41966         context.pop(1);
41967         nextMode = mode;
41968       }
41969       context.perform(actionNoop());
41970       context.pop(1);
41971       context.resumeChangeDispatch();
41972       context.enter(nextMode);
41973     }
41974     function setActiveElements() {
41975       if (!_drawNode)
41976         return;
41977       context.surface().selectAll("." + _drawNode.id).classed("active", true);
41978     }
41979     function resetToStartGraph() {
41980       while (context.graph() !== startGraph) {
41981         context.pop();
41982       }
41983     }
41984     var drawWay = function(surface) {
41985       _drawNode = void 0;
41986       _didResolveTempEdit = false;
41987       _origWay = context.entity(wayID);
41988       if (typeof _nodeIndex === "number") {
41989         _headNodeID = _origWay.nodes[_nodeIndex];
41990       } else if (_origWay.isClosed()) {
41991         _headNodeID = _origWay.nodes[_origWay.nodes.length - 2];
41992       } else {
41993         _headNodeID = _origWay.nodes[_origWay.nodes.length - 1];
41994       }
41995       _wayGeometry = _origWay.geometry(context.graph());
41996       _annotation = _t(
41997         (_origWay.nodes.length === (_origWay.isClosed() ? 2 : 1) ? "operations.start.annotation." : "operations.continue.annotation.") + _wayGeometry
41998       );
41999       _pointerHasMoved = false;
42000       context.pauseChangeDispatch();
42001       context.perform(actionNoop(), _annotation);
42002       context.resumeChangeDispatch();
42003       behavior.hover().initialNodeID(_headNodeID);
42004       behavior.on("move", function() {
42005         _pointerHasMoved = true;
42006         move.apply(this, arguments);
42007       }).on("down", function() {
42008         move.apply(this, arguments);
42009       }).on("downcancel", function() {
42010         if (_drawNode)
42011           removeDrawNode();
42012       }).on("click", drawWay.add).on("clickWay", drawWay.addWay).on("clickNode", drawWay.addNode).on("undo", context.undo).on("cancel", drawWay.cancel).on("finish", drawWay.finish);
42013       select_default2(window).on("keydown.drawWay", keydown).on("keyup.drawWay", keyup);
42014       context.map().dblclickZoomEnable(false).on("drawn.draw", setActiveElements);
42015       setActiveElements();
42016       surface.call(behavior);
42017       context.history().on("undone.draw", undone);
42018     };
42019     drawWay.off = function(surface) {
42020       if (!_didResolveTempEdit) {
42021         context.pauseChangeDispatch();
42022         resetToStartGraph();
42023         context.resumeChangeDispatch();
42024       }
42025       _drawNode = void 0;
42026       _nodeIndex = void 0;
42027       context.map().on("drawn.draw", null);
42028       surface.call(behavior.off).selectAll(".active").classed("active", false);
42029       surface.classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false);
42030       select_default2(window).on("keydown.drawWay", null).on("keyup.drawWay", null);
42031       context.history().on("undone.draw", null);
42032     };
42033     function attemptAdd(d, loc, doAdd) {
42034       if (_drawNode) {
42035         context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
42036         _drawNode = context.entity(_drawNode.id);
42037       } else {
42038         createDrawNode(loc);
42039       }
42040       checkGeometry(
42041         true
42042         /* includeDrawNode */
42043       );
42044       if (d && d.properties && d.properties.nope || context.surface().classed("nope")) {
42045         if (!_pointerHasMoved) {
42046           removeDrawNode();
42047         }
42048         dispatch10.call("rejectedSelfIntersection", this);
42049         return;
42050       }
42051       context.pauseChangeDispatch();
42052       doAdd();
42053       _didResolveTempEdit = true;
42054       context.resumeChangeDispatch();
42055       context.enter(mode);
42056     }
42057     drawWay.add = function(loc, d) {
42058       attemptAdd(d, loc, function() {
42059       });
42060     };
42061     drawWay.addWay = function(loc, edge, d) {
42062       attemptAdd(d, loc, function() {
42063         context.replace(
42064           actionAddMidpoint({ loc, edge }, _drawNode),
42065           _annotation
42066         );
42067       });
42068     };
42069     drawWay.addNode = function(node, d) {
42070       if (node.id === _headNodeID || // or the first node when drawing an area
42071       _origWay.isClosed() && node.id === _origWay.first()) {
42072         drawWay.finish();
42073         return;
42074       }
42075       attemptAdd(d, node.loc, function() {
42076         context.replace(
42077           function actionReplaceDrawNode(graph) {
42078             graph = graph.replace(graph.entity(wayID).removeNode(_drawNode.id)).remove(_drawNode);
42079             return graph.replace(graph.entity(wayID).addNode(node.id, _nodeIndex));
42080           },
42081           _annotation
42082         );
42083       });
42084     };
42085     function getFeatureType(ways) {
42086       if (ways.every((way) => way.isClosed()))
42087         return "area";
42088       if (ways.every((way) => !way.isClosed()))
42089         return "line";
42090       return "generic";
42091     }
42092     function followMode() {
42093       if (_didResolveTempEdit)
42094         return;
42095       try {
42096         const isDrawingArea = _origWay.nodes[0] === _origWay.nodes.slice(-1)[0];
42097         const [secondLastNodeId, lastNodeId] = _origWay.nodes.slice(isDrawingArea ? -3 : -2);
42098         const historyGraph = context.history().graph();
42099         if (!lastNodeId || !secondLastNodeId || !historyGraph.hasEntity(lastNodeId) || !historyGraph.hasEntity(secondLastNodeId)) {
42100           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("operations.follow.error.needs_more_initial_nodes"))();
42101           return;
42102         }
42103         const lastNodesParents = historyGraph.parentWays(historyGraph.entity(lastNodeId)).filter((w) => w.id !== wayID);
42104         const secondLastNodesParents = historyGraph.parentWays(historyGraph.entity(secondLastNodeId)).filter((w) => w.id !== wayID);
42105         const featureType = getFeatureType(lastNodesParents);
42106         if (lastNodesParents.length !== 1 || secondLastNodesParents.length === 0) {
42107           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(`operations.follow.error.intersection_of_multiple_ways.${featureType}`))();
42108           return;
42109         }
42110         if (!secondLastNodesParents.some((n2) => n2.id === lastNodesParents[0].id)) {
42111           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(`operations.follow.error.intersection_of_different_ways.${featureType}`))();
42112           return;
42113         }
42114         const way = lastNodesParents[0];
42115         const indexOfLast = way.nodes.indexOf(lastNodeId);
42116         const indexOfSecondLast = way.nodes.indexOf(secondLastNodeId);
42117         const isDescendingPastZero = indexOfLast === way.nodes.length - 2 && indexOfSecondLast === 0;
42118         let nextNodeIndex = indexOfLast + (indexOfLast > indexOfSecondLast && !isDescendingPastZero ? 1 : -1);
42119         if (nextNodeIndex === -1)
42120           nextNodeIndex = indexOfSecondLast === 1 ? way.nodes.length - 2 : 1;
42121         const nextNode = historyGraph.entity(way.nodes[nextNodeIndex]);
42122         drawWay.addNode(nextNode, {
42123           geometry: { type: "Point", coordinates: nextNode.loc },
42124           id: nextNode.id,
42125           properties: { target: true, entity: nextNode }
42126         });
42127       } catch (ex) {
42128         context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("operations.follow.error.unknown"))();
42129       }
42130     }
42131     keybinding.on(_t("operations.follow.key"), followMode);
42132     select_default2(document).call(keybinding);
42133     drawWay.finish = function() {
42134       checkGeometry(
42135         false
42136         /* includeDrawNode */
42137       );
42138       if (context.surface().classed("nope")) {
42139         dispatch10.call("rejectedSelfIntersection", this);
42140         return;
42141       }
42142       context.pauseChangeDispatch();
42143       context.pop(1);
42144       _didResolveTempEdit = true;
42145       context.resumeChangeDispatch();
42146       var way = context.hasEntity(wayID);
42147       if (!way || way.isDegenerate()) {
42148         drawWay.cancel();
42149         return;
42150       }
42151       window.setTimeout(function() {
42152         context.map().dblclickZoomEnable(true);
42153       }, 1e3);
42154       var isNewFeature = !mode.isContinuing;
42155       context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
42156     };
42157     drawWay.cancel = function() {
42158       context.pauseChangeDispatch();
42159       resetToStartGraph();
42160       context.resumeChangeDispatch();
42161       window.setTimeout(function() {
42162         context.map().dblclickZoomEnable(true);
42163       }, 1e3);
42164       context.surface().classed("nope", false).classed("nope-disabled", false).classed("nope-suppressed", false);
42165       context.enter(modeBrowse(context));
42166     };
42167     drawWay.nodeIndex = function(val) {
42168       if (!arguments.length)
42169         return _nodeIndex;
42170       _nodeIndex = val;
42171       return drawWay;
42172     };
42173     drawWay.activeID = function() {
42174       if (!arguments.length)
42175         return _drawNode && _drawNode.id;
42176       return drawWay;
42177     };
42178     return utilRebind(drawWay, dispatch10, "on");
42179   }
42180
42181   // modules/modes/draw_line.js
42182   function modeDrawLine(context, wayID, startGraph, button, affix, continuing) {
42183     var mode = {
42184       button,
42185       id: "draw-line"
42186     };
42187     var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on("rejectedSelfIntersection.modeDrawLine", function() {
42188       context.ui().flash.iconName("#iD-icon-no").label(_t.append("self_intersection.error.lines"))();
42189     });
42190     mode.wayID = wayID;
42191     mode.isContinuing = continuing;
42192     mode.enter = function() {
42193       behavior.nodeIndex(affix === "prefix" ? 0 : void 0);
42194       context.install(behavior);
42195     };
42196     mode.exit = function() {
42197       context.uninstall(behavior);
42198     };
42199     mode.selectedIDs = function() {
42200       return [wayID];
42201     };
42202     mode.activeID = function() {
42203       return behavior && behavior.activeID() || [];
42204     };
42205     return mode;
42206   }
42207
42208   // modules/validations/disconnected_way.js
42209   function validationDisconnectedWay() {
42210     var type2 = "disconnected_way";
42211     function isTaggedAsHighway(entity) {
42212       return osmRoutableHighwayTagValues[entity.tags.highway];
42213     }
42214     var validation = function checkDisconnectedWay(entity, graph) {
42215       var routingIslandWays = routingIslandForEntity(entity);
42216       if (!routingIslandWays)
42217         return [];
42218       return [new validationIssue({
42219         type: type2,
42220         subtype: "highway",
42221         severity: "warning",
42222         message: function(context) {
42223           var entity2 = this.entityIds.length && context.hasEntity(this.entityIds[0]);
42224           var label = entity2 && utilDisplayLabel(entity2, context.graph());
42225           return _t.append("issues.disconnected_way.routable.message", { count: this.entityIds.length, highway: label });
42226         },
42227         reference: showReference,
42228         entityIds: Array.from(routingIslandWays).map(function(way) {
42229           return way.id;
42230         }),
42231         dynamicFixes: makeFixes
42232       })];
42233       function makeFixes(context) {
42234         var fixes = [];
42235         var singleEntity = this.entityIds.length === 1 && context.hasEntity(this.entityIds[0]);
42236         if (singleEntity) {
42237           if (singleEntity.type === "way" && !singleEntity.isClosed()) {
42238             var textDirection = _mainLocalizer.textDirection();
42239             var startFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.first(), "start");
42240             if (startFix)
42241               fixes.push(startFix);
42242             var endFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.last(), "end");
42243             if (endFix)
42244               fixes.push(endFix);
42245           }
42246           if (!fixes.length) {
42247             fixes.push(new validationIssueFix({
42248               title: _t.append("issues.fix.connect_feature.title")
42249             }));
42250           }
42251           fixes.push(new validationIssueFix({
42252             icon: "iD-operation-delete",
42253             title: _t.append("issues.fix.delete_feature.title"),
42254             entityIds: [singleEntity.id],
42255             onClick: function(context2) {
42256               var id2 = this.issue.entityIds[0];
42257               var operation = operationDelete(context2, [id2]);
42258               if (!operation.disabled()) {
42259                 operation();
42260               }
42261             }
42262           }));
42263         } else {
42264           fixes.push(new validationIssueFix({
42265             title: _t.append("issues.fix.connect_features.title")
42266           }));
42267         }
42268         return fixes;
42269       }
42270       function showReference(selection2) {
42271         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.disconnected_way.routable.reference"));
42272       }
42273       function routingIslandForEntity(entity2) {
42274         var routingIsland = /* @__PURE__ */ new Set();
42275         var waysToCheck = [];
42276         function queueParentWays(node) {
42277           graph.parentWays(node).forEach(function(parentWay) {
42278             if (!routingIsland.has(parentWay) && // only check each feature once
42279             isRoutableWay(parentWay, false)) {
42280               routingIsland.add(parentWay);
42281               waysToCheck.push(parentWay);
42282             }
42283           });
42284         }
42285         if (entity2.type === "way" && isRoutableWay(entity2, true)) {
42286           routingIsland.add(entity2);
42287           waysToCheck.push(entity2);
42288         } else if (entity2.type === "node" && isRoutableNode(entity2)) {
42289           routingIsland.add(entity2);
42290           queueParentWays(entity2);
42291         } else {
42292           return null;
42293         }
42294         while (waysToCheck.length) {
42295           var wayToCheck = waysToCheck.pop();
42296           var childNodes = graph.childNodes(wayToCheck);
42297           for (var i2 in childNodes) {
42298             var vertex = childNodes[i2];
42299             if (isConnectedVertex(vertex)) {
42300               return null;
42301             }
42302             if (isRoutableNode(vertex)) {
42303               routingIsland.add(vertex);
42304             }
42305             queueParentWays(vertex);
42306           }
42307         }
42308         return routingIsland;
42309       }
42310       function isConnectedVertex(vertex) {
42311         var osm = services.osm;
42312         if (osm && !osm.isDataLoaded(vertex.loc))
42313           return true;
42314         if (vertex.tags.entrance && vertex.tags.entrance !== "no")
42315           return true;
42316         if (vertex.tags.amenity === "parking_entrance")
42317           return true;
42318         return false;
42319       }
42320       function isRoutableNode(node) {
42321         if (node.tags.highway === "elevator")
42322           return true;
42323         return false;
42324       }
42325       function isRoutableWay(way, ignoreInnerWays) {
42326         if (isTaggedAsHighway(way) || way.tags.route === "ferry")
42327           return true;
42328         return graph.parentRelations(way).some(function(parentRelation) {
42329           if (parentRelation.tags.type === "route" && parentRelation.tags.route === "ferry")
42330             return true;
42331           if (parentRelation.isMultipolygon() && isTaggedAsHighway(parentRelation) && (!ignoreInnerWays || parentRelation.memberById(way.id).role !== "inner"))
42332             return true;
42333           return false;
42334         });
42335       }
42336       function makeContinueDrawingFixIfAllowed(textDirection, vertexID, whichEnd) {
42337         var vertex = graph.hasEntity(vertexID);
42338         if (!vertex || vertex.tags.noexit === "yes")
42339           return null;
42340         var useLeftContinue = whichEnd === "start" && textDirection === "ltr" || whichEnd === "end" && textDirection === "rtl";
42341         return new validationIssueFix({
42342           icon: "iD-operation-continue" + (useLeftContinue ? "-left" : ""),
42343           title: _t.append("issues.fix.continue_from_" + whichEnd + ".title"),
42344           entityIds: [vertexID],
42345           onClick: function(context) {
42346             var wayId = this.issue.entityIds[0];
42347             var way = context.hasEntity(wayId);
42348             var vertexId = this.entityIds[0];
42349             var vertex2 = context.hasEntity(vertexId);
42350             if (!way || !vertex2)
42351               return;
42352             var map2 = context.map();
42353             if (!context.editable() || !map2.trimmedExtent().contains(vertex2.loc)) {
42354               map2.zoomToEase(vertex2);
42355             }
42356             context.enter(
42357               modeDrawLine(context, wayId, context.graph(), "line", way.affix(vertexId), true)
42358             );
42359           }
42360         });
42361       }
42362     };
42363     validation.type = type2;
42364     return validation;
42365   }
42366
42367   // modules/validations/invalid_format.js
42368   function validationFormatting() {
42369     var type2 = "invalid_format";
42370     var validation = function(entity) {
42371       var issues = [];
42372       function isValidEmail(email) {
42373         var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i;
42374         return !email || valid_email.test(email);
42375       }
42376       function showReferenceEmail(selection2) {
42377         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.invalid_format.email.reference"));
42378       }
42379       if (entity.tags.email) {
42380         var emails = entity.tags.email.split(";").map(function(s) {
42381           return s.trim();
42382         }).filter(function(x) {
42383           return !isValidEmail(x);
42384         });
42385         if (emails.length) {
42386           issues.push(new validationIssue({
42387             type: type2,
42388             subtype: "email",
42389             severity: "warning",
42390             message: function(context) {
42391               var entity2 = context.hasEntity(this.entityIds[0]);
42392               return entity2 ? _t.append(
42393                 "issues.invalid_format.email.message" + this.data,
42394                 { feature: utilDisplayLabel(entity2, context.graph()), email: emails.join(", ") }
42395               ) : "";
42396             },
42397             reference: showReferenceEmail,
42398             entityIds: [entity.id],
42399             hash: emails.join(),
42400             data: emails.length > 1 ? "_multi" : ""
42401           }));
42402         }
42403       }
42404       return issues;
42405     };
42406     validation.type = type2;
42407     return validation;
42408   }
42409
42410   // modules/validations/help_request.js
42411   function validationHelpRequest(context) {
42412     var type2 = "help_request";
42413     var validation = function checkFixmeTag(entity) {
42414       if (!entity.tags.fixme)
42415         return [];
42416       if (entity.version === void 0)
42417         return [];
42418       if (entity.v !== void 0) {
42419         var baseEntity = context.history().base().hasEntity(entity.id);
42420         if (!baseEntity || !baseEntity.tags.fixme)
42421           return [];
42422       }
42423       return [new validationIssue({
42424         type: type2,
42425         subtype: "fixme_tag",
42426         severity: "warning",
42427         message: function(context2) {
42428           var entity2 = context2.hasEntity(this.entityIds[0]);
42429           return entity2 ? _t.append("issues.fixme_tag.message", {
42430             feature: utilDisplayLabel(
42431               entity2,
42432               context2.graph(),
42433               true
42434               /* verbose */
42435             )
42436           }) : "";
42437         },
42438         dynamicFixes: function() {
42439           return [
42440             new validationIssueFix({
42441               title: _t.append("issues.fix.address_the_concern.title")
42442             })
42443           ];
42444         },
42445         reference: showReference,
42446         entityIds: [entity.id]
42447       })];
42448       function showReference(selection2) {
42449         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.fixme_tag.reference"));
42450       }
42451     };
42452     validation.type = type2;
42453     return validation;
42454   }
42455
42456   // modules/validations/impossible_oneway.js
42457   function validationImpossibleOneway() {
42458     var type2 = "impossible_oneway";
42459     var validation = function checkImpossibleOneway(entity, graph) {
42460       if (entity.type !== "way" || entity.geometry(graph) !== "line")
42461         return [];
42462       if (entity.isClosed())
42463         return [];
42464       if (!typeForWay(entity))
42465         return [];
42466       if (!isOneway(entity))
42467         return [];
42468       var firstIssues = issuesForNode(entity, entity.first());
42469       var lastIssues = issuesForNode(entity, entity.last());
42470       return firstIssues.concat(lastIssues);
42471       function typeForWay(way) {
42472         if (way.geometry(graph) !== "line")
42473           return null;
42474         if (osmRoutableHighwayTagValues[way.tags.highway])
42475           return "highway";
42476         if (osmFlowingWaterwayTagValues[way.tags.waterway])
42477           return "waterway";
42478         return null;
42479       }
42480       function isOneway(way) {
42481         if (way.tags.oneway === "yes")
42482           return true;
42483         if (way.tags.oneway)
42484           return false;
42485         for (var key in way.tags) {
42486           if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
42487             return true;
42488           }
42489         }
42490         return false;
42491       }
42492       function nodeOccursMoreThanOnce(way, nodeID) {
42493         var occurrences = 0;
42494         for (var index in way.nodes) {
42495           if (way.nodes[index] === nodeID) {
42496             occurrences += 1;
42497             if (occurrences > 1)
42498               return true;
42499           }
42500         }
42501         return false;
42502       }
42503       function isConnectedViaOtherTypes(way, node) {
42504         var wayType = typeForWay(way);
42505         if (wayType === "highway") {
42506           if (node.tags.entrance && node.tags.entrance !== "no")
42507             return true;
42508           if (node.tags.amenity === "parking_entrance")
42509             return true;
42510         } else if (wayType === "waterway") {
42511           if (node.id === way.first()) {
42512             if (node.tags.natural === "spring")
42513               return true;
42514           } else {
42515             if (node.tags.manhole === "drain")
42516               return true;
42517           }
42518         }
42519         return graph.parentWays(node).some(function(parentWay) {
42520           if (parentWay.id === way.id)
42521             return false;
42522           if (wayType === "highway") {
42523             if (parentWay.geometry(graph) === "area" && osmRoutableHighwayTagValues[parentWay.tags.highway])
42524               return true;
42525             if (parentWay.tags.route === "ferry")
42526               return true;
42527             return graph.parentRelations(parentWay).some(function(parentRelation) {
42528               if (parentRelation.tags.type === "route" && parentRelation.tags.route === "ferry")
42529                 return true;
42530               return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
42531             });
42532           } else if (wayType === "waterway") {
42533             if (parentWay.tags.natural === "water" || parentWay.tags.natural === "coastline")
42534               return true;
42535           }
42536           return false;
42537         });
42538       }
42539       function issuesForNode(way, nodeID) {
42540         var isFirst = nodeID === way.first();
42541         var wayType = typeForWay(way);
42542         if (nodeOccursMoreThanOnce(way, nodeID))
42543           return [];
42544         var osm = services.osm;
42545         if (!osm)
42546           return [];
42547         var node = graph.hasEntity(nodeID);
42548         if (!node || !osm.isDataLoaded(node.loc))
42549           return [];
42550         if (isConnectedViaOtherTypes(way, node))
42551           return [];
42552         var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
42553           if (parentWay.id === way.id)
42554             return false;
42555           return typeForWay(parentWay) === wayType;
42556         });
42557         if (wayType === "waterway" && attachedWaysOfSameType.length === 0)
42558           return [];
42559         var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
42560           return isOneway(attachedWay);
42561         });
42562         if (attachedOneways.length < attachedWaysOfSameType.length)
42563           return [];
42564         if (attachedOneways.length) {
42565           var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
42566             if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID)
42567               return true;
42568             if (nodeOccursMoreThanOnce(attachedOneway, nodeID))
42569               return true;
42570             return false;
42571           });
42572           if (connectedEndpointsOkay)
42573             return [];
42574         }
42575         var placement = isFirst ? "start" : "end", messageID = wayType + ".", referenceID = wayType + ".";
42576         if (wayType === "waterway") {
42577           messageID += "connected." + placement;
42578           referenceID += "connected";
42579         } else {
42580           messageID += placement;
42581           referenceID += placement;
42582         }
42583         return [new validationIssue({
42584           type: type2,
42585           subtype: wayType,
42586           severity: "warning",
42587           message: function(context) {
42588             var entity2 = context.hasEntity(this.entityIds[0]);
42589             return entity2 ? _t.append("issues.impossible_oneway." + messageID + ".message", {
42590               feature: utilDisplayLabel(entity2, context.graph())
42591             }) : "";
42592           },
42593           reference: getReference(referenceID),
42594           entityIds: [way.id, node.id],
42595           dynamicFixes: function() {
42596             var fixes = [];
42597             if (attachedOneways.length) {
42598               fixes.push(new validationIssueFix({
42599                 icon: "iD-operation-reverse",
42600                 title: _t.append("issues.fix.reverse_feature.title"),
42601                 entityIds: [way.id],
42602                 onClick: function(context) {
42603                   var id2 = this.issue.entityIds[0];
42604                   context.perform(actionReverse(id2), _t("operations.reverse.annotation.line", { n: 1 }));
42605                 }
42606               }));
42607             }
42608             if (node.tags.noexit !== "yes") {
42609               var textDirection = _mainLocalizer.textDirection();
42610               var useLeftContinue = isFirst && textDirection === "ltr" || !isFirst && textDirection === "rtl";
42611               fixes.push(new validationIssueFix({
42612                 icon: "iD-operation-continue" + (useLeftContinue ? "-left" : ""),
42613                 title: _t.append("issues.fix.continue_from_" + (isFirst ? "start" : "end") + ".title"),
42614                 onClick: function(context) {
42615                   var entityID = this.issue.entityIds[0];
42616                   var vertexID = this.issue.entityIds[1];
42617                   var way2 = context.entity(entityID);
42618                   var vertex = context.entity(vertexID);
42619                   continueDrawing(way2, vertex, context);
42620                 }
42621               }));
42622             }
42623             return fixes;
42624           },
42625           loc: node.loc
42626         })];
42627         function getReference(referenceID2) {
42628           return function showReference(selection2) {
42629             selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.impossible_oneway." + referenceID2 + ".reference"));
42630           };
42631         }
42632       }
42633     };
42634     function continueDrawing(way, vertex, context) {
42635       var map2 = context.map();
42636       if (!context.editable() || !map2.trimmedExtent().contains(vertex.loc)) {
42637         map2.zoomToEase(vertex);
42638       }
42639       context.enter(
42640         modeDrawLine(context, way.id, context.graph(), "line", way.affix(vertex.id), true)
42641       );
42642     }
42643     validation.type = type2;
42644     return validation;
42645   }
42646
42647   // modules/validations/incompatible_source.js
42648   function validationIncompatibleSource() {
42649     const type2 = "incompatible_source";
42650     const incompatibleRules = [
42651       {
42652         id: "amap",
42653         regex: /(^amap$|^amap\.com|autonavi|mapabc|高德)/i
42654       },
42655       {
42656         id: "baidu",
42657         regex: /(baidu|mapbar|百度)/i
42658       },
42659       {
42660         id: "google",
42661         regex: /google/i,
42662         exceptRegex: /((books|drive)\.google|google\s?(books|drive|plus))|(esri\/Google_Africa_Buildings)/i
42663       }
42664     ];
42665     const validation = function checkIncompatibleSource(entity) {
42666       const entitySources = entity.tags && entity.tags.source && entity.tags.source.split(";");
42667       if (!entitySources)
42668         return [];
42669       const entityID = entity.id;
42670       return entitySources.map((source) => {
42671         const matchRule = incompatibleRules.find((rule) => {
42672           if (!rule.regex.test(source))
42673             return false;
42674           if (rule.exceptRegex && rule.exceptRegex.test(source))
42675             return false;
42676           return true;
42677         });
42678         if (!matchRule)
42679           return null;
42680         return new validationIssue({
42681           type: type2,
42682           severity: "warning",
42683           message: (context) => {
42684             const entity2 = context.hasEntity(entityID);
42685             return entity2 ? _t.append("issues.incompatible_source.feature.message", {
42686               feature: utilDisplayLabel(
42687                 entity2,
42688                 context.graph(),
42689                 true
42690                 /* verbose */
42691               ),
42692               value: source
42693             }) : "";
42694           },
42695           reference: getReference(matchRule.id),
42696           entityIds: [entityID],
42697           hash: source,
42698           dynamicFixes: () => {
42699             return [
42700               new validationIssueFix({ title: _t.append("issues.fix.remove_proprietary_data.title") })
42701             ];
42702           }
42703         });
42704       }).filter(Boolean);
42705       function getReference(id2) {
42706         return function showReference(selection2) {
42707           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append(`issues.incompatible_source.reference.${id2}`));
42708         };
42709       }
42710     };
42711     validation.type = type2;
42712     return validation;
42713   }
42714
42715   // modules/validations/maprules.js
42716   function validationMaprules() {
42717     var type2 = "maprules";
42718     var validation = function checkMaprules(entity, graph) {
42719       if (!services.maprules)
42720         return [];
42721       var rules = services.maprules.validationRules();
42722       var issues = [];
42723       for (var i2 = 0; i2 < rules.length; i2++) {
42724         var rule = rules[i2];
42725         rule.findIssues(entity, graph, issues);
42726       }
42727       return issues;
42728     };
42729     validation.type = type2;
42730     return validation;
42731   }
42732
42733   // modules/validations/mismatched_geometry.js
42734   var import_fast_deep_equal4 = __toESM(require_fast_deep_equal());
42735   function validationMismatchedGeometry() {
42736     var type2 = "mismatched_geometry";
42737     function tagSuggestingLineIsArea(entity) {
42738       if (entity.type !== "way" || entity.isClosed())
42739         return null;
42740       var tagSuggestingArea = entity.tagSuggestingArea();
42741       if (!tagSuggestingArea) {
42742         return null;
42743       }
42744       var asLine = _mainPresetIndex.matchTags(tagSuggestingArea, "line");
42745       var asArea = _mainPresetIndex.matchTags(tagSuggestingArea, "area");
42746       if (asLine && asArea && asLine === asArea) {
42747         return null;
42748       }
42749       return tagSuggestingArea;
42750     }
42751     function makeConnectEndpointsFixOnClick(way, graph) {
42752       if (way.nodes.length < 3)
42753         return null;
42754       var nodes = graph.childNodes(way), testNodes;
42755       var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length - 1].loc);
42756       if (firstToLastDistanceMeters < 0.75) {
42757         testNodes = nodes.slice();
42758         testNodes.pop();
42759         testNodes.push(testNodes[0]);
42760         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
42761           return function(context) {
42762             var way2 = context.entity(this.issue.entityIds[0]);
42763             context.perform(
42764               actionMergeNodes([way2.nodes[0], way2.nodes[way2.nodes.length - 1]], nodes[0].loc),
42765               _t("issues.fix.connect_endpoints.annotation")
42766             );
42767           };
42768         }
42769       }
42770       testNodes = nodes.slice();
42771       testNodes.push(testNodes[0]);
42772       if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
42773         return function(context) {
42774           var wayId = this.issue.entityIds[0];
42775           var way2 = context.entity(wayId);
42776           var nodeId = way2.nodes[0];
42777           var index = way2.nodes.length;
42778           context.perform(
42779             actionAddVertex(wayId, nodeId, index),
42780             _t("issues.fix.connect_endpoints.annotation")
42781           );
42782         };
42783       }
42784     }
42785     function lineTaggedAsAreaIssue(entity) {
42786       var tagSuggestingArea = tagSuggestingLineIsArea(entity);
42787       if (!tagSuggestingArea)
42788         return null;
42789       var validAsLine = false;
42790       var presetAsLine = _mainPresetIndex.matchTags(entity.tags, "line");
42791       if (presetAsLine) {
42792         validAsLine = true;
42793         var key = Object.keys(tagSuggestingArea)[0];
42794         if (presetAsLine.tags[key] && presetAsLine.tags[key] === "*") {
42795           validAsLine = false;
42796         }
42797         if (Object.keys(presetAsLine.tags).length === 0) {
42798           validAsLine = false;
42799         }
42800       }
42801       return new validationIssue({
42802         type: type2,
42803         subtype: "area_as_line",
42804         severity: "warning",
42805         message: function(context) {
42806           var entity2 = context.hasEntity(this.entityIds[0]);
42807           return entity2 ? _t.append("issues.tag_suggests_area.message", {
42808             feature: utilDisplayLabel(
42809               entity2,
42810               "area",
42811               true
42812               /* verbose */
42813             ),
42814             tag: utilTagText({ tags: tagSuggestingArea })
42815           }) : "";
42816         },
42817         reference: showReference,
42818         entityIds: [entity.id],
42819         hash: JSON.stringify(tagSuggestingArea),
42820         dynamicFixes: function(context) {
42821           var fixes = [];
42822           var entity2 = context.entity(this.entityIds[0]);
42823           var connectEndsOnClick = makeConnectEndpointsFixOnClick(entity2, context.graph());
42824           if (!validAsLine) {
42825             fixes.push(new validationIssueFix({
42826               title: _t.append("issues.fix.connect_endpoints.title"),
42827               onClick: connectEndsOnClick
42828             }));
42829           }
42830           fixes.push(new validationIssueFix({
42831             icon: "iD-operation-delete",
42832             title: _t.append("issues.fix.remove_tag.title"),
42833             onClick: function(context2) {
42834               var entityId = this.issue.entityIds[0];
42835               var entity3 = context2.entity(entityId);
42836               var tags = Object.assign({}, entity3.tags);
42837               for (var key2 in tagSuggestingArea) {
42838                 delete tags[key2];
42839               }
42840               context2.perform(
42841                 actionChangeTags(entityId, tags),
42842                 _t("issues.fix.remove_tag.annotation")
42843               );
42844             }
42845           }));
42846           return fixes;
42847         }
42848       });
42849       function showReference(selection2) {
42850         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.tag_suggests_area.reference"));
42851       }
42852     }
42853     function vertexPointIssue(entity, graph) {
42854       if (entity.type !== "node")
42855         return null;
42856       if (Object.keys(entity.tags).length === 0)
42857         return null;
42858       if (entity.isOnAddressLine(graph))
42859         return null;
42860       var geometry = entity.geometry(graph);
42861       var allowedGeometries = osmNodeGeometriesForTags(entity.tags);
42862       if (geometry === "point" && !allowedGeometries.point && allowedGeometries.vertex) {
42863         return new validationIssue({
42864           type: type2,
42865           subtype: "vertex_as_point",
42866           severity: "warning",
42867           message: function(context) {
42868             var entity2 = context.hasEntity(this.entityIds[0]);
42869             return entity2 ? _t.append("issues.vertex_as_point.message", {
42870               feature: utilDisplayLabel(
42871                 entity2,
42872                 "vertex",
42873                 true
42874                 /* verbose */
42875               )
42876             }) : "";
42877           },
42878           reference: function showReference(selection2) {
42879             selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.vertex_as_point.reference"));
42880           },
42881           entityIds: [entity.id]
42882         });
42883       } else if (geometry === "vertex" && !allowedGeometries.vertex && allowedGeometries.point) {
42884         return new validationIssue({
42885           type: type2,
42886           subtype: "point_as_vertex",
42887           severity: "warning",
42888           message: function(context) {
42889             var entity2 = context.hasEntity(this.entityIds[0]);
42890             return entity2 ? _t.append("issues.point_as_vertex.message", {
42891               feature: utilDisplayLabel(
42892                 entity2,
42893                 "point",
42894                 true
42895                 /* verbose */
42896               )
42897             }) : "";
42898           },
42899           reference: function showReference(selection2) {
42900             selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.point_as_vertex.reference"));
42901           },
42902           entityIds: [entity.id],
42903           dynamicFixes: extractPointDynamicFixes
42904         });
42905       }
42906       return null;
42907     }
42908     function otherMismatchIssue(entity, graph) {
42909       if (!entity.hasInterestingTags())
42910         return null;
42911       if (entity.type !== "node" && entity.type !== "way")
42912         return null;
42913       if (entity.type === "node" && entity.isOnAddressLine(graph))
42914         return null;
42915       var sourceGeom = entity.geometry(graph);
42916       var targetGeoms = entity.type === "way" ? ["point", "vertex"] : ["line", "area"];
42917       if (sourceGeom === "area")
42918         targetGeoms.unshift("line");
42919       var asSource = _mainPresetIndex.match(entity, graph);
42920       var targetGeom = targetGeoms.find((nodeGeom) => {
42921         var asTarget = _mainPresetIndex.matchTags(entity.tags, nodeGeom);
42922         if (!asSource || !asTarget || asSource === asTarget || // sometimes there are two presets with the same tags for different geometries
42923         (0, import_fast_deep_equal4.default)(asSource.tags, asTarget.tags))
42924           return false;
42925         if (asTarget.isFallback())
42926           return false;
42927         var primaryKey = Object.keys(asTarget.tags)[0];
42928         if (primaryKey === "building")
42929           return false;
42930         if (asTarget.tags[primaryKey] === "*")
42931           return false;
42932         return asSource.isFallback() || asSource.tags[primaryKey] === "*";
42933       });
42934       if (!targetGeom)
42935         return null;
42936       var subtype = targetGeom + "_as_" + sourceGeom;
42937       if (targetGeom === "vertex")
42938         targetGeom = "point";
42939       if (sourceGeom === "vertex")
42940         sourceGeom = "point";
42941       var referenceId = targetGeom + "_as_" + sourceGeom;
42942       var dynamicFixes;
42943       if (targetGeom === "point") {
42944         dynamicFixes = extractPointDynamicFixes;
42945       } else if (sourceGeom === "area" && targetGeom === "line") {
42946         dynamicFixes = lineToAreaDynamicFixes;
42947       }
42948       return new validationIssue({
42949         type: type2,
42950         subtype,
42951         severity: "warning",
42952         message: function(context) {
42953           var entity2 = context.hasEntity(this.entityIds[0]);
42954           return entity2 ? _t.append("issues." + referenceId + ".message", {
42955             feature: utilDisplayLabel(
42956               entity2,
42957               targetGeom,
42958               true
42959               /* verbose */
42960             )
42961           }) : "";
42962         },
42963         reference: function showReference(selection2) {
42964           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.mismatched_geometry.reference"));
42965         },
42966         entityIds: [entity.id],
42967         dynamicFixes
42968       });
42969     }
42970     function lineToAreaDynamicFixes(context) {
42971       var convertOnClick;
42972       var entityId = this.entityIds[0];
42973       var entity = context.entity(entityId);
42974       var tags = Object.assign({}, entity.tags);
42975       delete tags.area;
42976       if (!osmTagSuggestingArea(tags)) {
42977         convertOnClick = function(context2) {
42978           var entityId2 = this.issue.entityIds[0];
42979           var entity2 = context2.entity(entityId2);
42980           var tags2 = Object.assign({}, entity2.tags);
42981           if (tags2.area) {
42982             delete tags2.area;
42983           }
42984           context2.perform(
42985             actionChangeTags(entityId2, tags2),
42986             _t("issues.fix.convert_to_line.annotation")
42987           );
42988         };
42989       }
42990       return [
42991         new validationIssueFix({
42992           icon: "iD-icon-line",
42993           title: _t.append("issues.fix.convert_to_line.title"),
42994           onClick: convertOnClick
42995         })
42996       ];
42997     }
42998     function extractPointDynamicFixes(context) {
42999       var entityId = this.entityIds[0];
43000       var extractOnClick = null;
43001       if (!context.hasHiddenConnections(entityId)) {
43002         extractOnClick = function(context2) {
43003           var entityId2 = this.issue.entityIds[0];
43004           var action = actionExtract(entityId2, context2.projection);
43005           context2.perform(
43006             action,
43007             _t("operations.extract.annotation", { n: 1 })
43008           );
43009           context2.enter(modeSelect(context2, [action.getExtractedNodeID()]));
43010         };
43011       }
43012       return [
43013         new validationIssueFix({
43014           icon: "iD-operation-extract",
43015           title: _t.append("issues.fix.extract_point.title"),
43016           onClick: extractOnClick
43017         })
43018       ];
43019     }
43020     function unclosedMultipolygonPartIssues(entity, graph) {
43021       if (entity.type !== "relation" || !entity.isMultipolygon() || entity.isDegenerate() || // cannot determine issues for incompletely-downloaded relations
43022       !entity.isComplete(graph))
43023         return [];
43024       var sequences = osmJoinWays(entity.members, graph);
43025       var issues = [];
43026       for (var i2 in sequences) {
43027         var sequence = sequences[i2];
43028         if (!sequence.nodes)
43029           continue;
43030         var firstNode = sequence.nodes[0];
43031         var lastNode = sequence.nodes[sequence.nodes.length - 1];
43032         if (firstNode === lastNode)
43033           continue;
43034         var issue = new validationIssue({
43035           type: type2,
43036           subtype: "unclosed_multipolygon_part",
43037           severity: "warning",
43038           message: function(context) {
43039             var entity2 = context.hasEntity(this.entityIds[0]);
43040             return entity2 ? _t.append("issues.unclosed_multipolygon_part.message", {
43041               feature: utilDisplayLabel(
43042                 entity2,
43043                 context.graph(),
43044                 true
43045                 /* verbose */
43046               )
43047             }) : "";
43048           },
43049           reference: showReference,
43050           loc: sequence.nodes[0].loc,
43051           entityIds: [entity.id],
43052           hash: sequence.map(function(way) {
43053             return way.id;
43054           }).join()
43055         });
43056         issues.push(issue);
43057       }
43058       return issues;
43059       function showReference(selection2) {
43060         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unclosed_multipolygon_part.reference"));
43061       }
43062     }
43063     var validation = function checkMismatchedGeometry(entity, graph) {
43064       var vertexPoint = vertexPointIssue(entity, graph);
43065       if (vertexPoint)
43066         return [vertexPoint];
43067       var lineAsArea = lineTaggedAsAreaIssue(entity);
43068       if (lineAsArea)
43069         return [lineAsArea];
43070       var mismatch = otherMismatchIssue(entity, graph);
43071       if (mismatch)
43072         return [mismatch];
43073       return unclosedMultipolygonPartIssues(entity, graph);
43074     };
43075     validation.type = type2;
43076     return validation;
43077   }
43078
43079   // modules/validations/missing_role.js
43080   function validationMissingRole() {
43081     var type2 = "missing_role";
43082     var validation = function checkMissingRole(entity, graph) {
43083       var issues = [];
43084       if (entity.type === "way") {
43085         graph.parentRelations(entity).forEach(function(relation) {
43086           if (!relation.isMultipolygon())
43087             return;
43088           var member = relation.memberById(entity.id);
43089           if (member && isMissingRole(member)) {
43090             issues.push(makeIssue(entity, relation, member));
43091           }
43092         });
43093       } else if (entity.type === "relation" && entity.isMultipolygon()) {
43094         entity.indexedMembers().forEach(function(member) {
43095           var way = graph.hasEntity(member.id);
43096           if (way && isMissingRole(member)) {
43097             issues.push(makeIssue(way, entity, member));
43098           }
43099         });
43100       }
43101       return issues;
43102     };
43103     function isMissingRole(member) {
43104       return !member.role || !member.role.trim().length;
43105     }
43106     function makeIssue(way, relation, member) {
43107       return new validationIssue({
43108         type: type2,
43109         severity: "warning",
43110         message: function(context) {
43111           var member2 = context.hasEntity(this.entityIds[1]), relation2 = context.hasEntity(this.entityIds[0]);
43112           return member2 && relation2 ? _t.append("issues.missing_role.message", {
43113             member: utilDisplayLabel(member2, context.graph()),
43114             relation: utilDisplayLabel(relation2, context.graph())
43115           }) : "";
43116         },
43117         reference: showReference,
43118         entityIds: [relation.id, way.id],
43119         data: {
43120           member
43121         },
43122         hash: member.index.toString(),
43123         dynamicFixes: function() {
43124           return [
43125             makeAddRoleFix("inner"),
43126             makeAddRoleFix("outer"),
43127             new validationIssueFix({
43128               icon: "iD-operation-delete",
43129               title: _t.append("issues.fix.remove_from_relation.title"),
43130               onClick: function(context) {
43131                 context.perform(
43132                   actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
43133                   _t("operations.delete_member.annotation", {
43134                     n: 1
43135                   })
43136                 );
43137               }
43138             })
43139           ];
43140         }
43141       });
43142       function showReference(selection2) {
43143         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.missing_role.multipolygon.reference"));
43144       }
43145     }
43146     function makeAddRoleFix(role) {
43147       return new validationIssueFix({
43148         title: _t.append("issues.fix.set_as_" + role + ".title"),
43149         onClick: function(context) {
43150           var oldMember = this.issue.data.member;
43151           var member = { id: this.issue.entityIds[1], type: oldMember.type, role };
43152           context.perform(
43153             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
43154             _t("operations.change_role.annotation", {
43155               n: 1
43156             })
43157           );
43158         }
43159       });
43160     }
43161     validation.type = type2;
43162     return validation;
43163   }
43164
43165   // modules/validations/missing_tag.js
43166   function validationMissingTag(context) {
43167     var type2 = "missing_tag";
43168     function hasDescriptiveTags(entity, graph) {
43169       var onlyAttributeKeys = ["description", "name", "note", "start_date"];
43170       var entityDescriptiveKeys = Object.keys(entity.tags).filter(function(k) {
43171         if (k === "area" || !osmIsInterestingTag(k))
43172           return false;
43173         return !onlyAttributeKeys.some(function(attributeKey) {
43174           return k === attributeKey || k.indexOf(attributeKey + ":") === 0;
43175         });
43176       });
43177       if (entity.type === "relation" && entityDescriptiveKeys.length === 1 && entity.tags.type === "multipolygon") {
43178         return osmOldMultipolygonOuterMemberOfRelation(entity, graph);
43179       }
43180       return entityDescriptiveKeys.length > 0;
43181     }
43182     function isUnknownRoad(entity) {
43183       return entity.type === "way" && entity.tags.highway === "road";
43184     }
43185     function isUntypedRelation(entity) {
43186       return entity.type === "relation" && !entity.tags.type;
43187     }
43188     var validation = function checkMissingTag(entity, graph) {
43189       var subtype;
43190       var osm = context.connection();
43191       var isUnloadedNode = entity.type === "node" && osm && !osm.isDataLoaded(entity.loc);
43192       if (!isUnloadedNode && // allow untagged nodes that are part of ways
43193       entity.geometry(graph) !== "vertex" && // allow untagged entities that are part of relations
43194       !entity.hasParentRelations(graph)) {
43195         if (Object.keys(entity.tags).length === 0) {
43196           subtype = "any";
43197         } else if (!hasDescriptiveTags(entity, graph)) {
43198           subtype = "descriptive";
43199         } else if (isUntypedRelation(entity)) {
43200           subtype = "relation_type";
43201         }
43202       }
43203       if (!subtype && isUnknownRoad(entity)) {
43204         subtype = "highway_classification";
43205       }
43206       if (!subtype)
43207         return [];
43208       var messageID = subtype === "highway_classification" ? "unknown_road" : "missing_tag." + subtype;
43209       var referenceID = subtype === "highway_classification" ? "unknown_road" : "missing_tag";
43210       var canDelete = entity.version === void 0 || entity.v !== void 0;
43211       var severity = canDelete && subtype !== "highway_classification" ? "error" : "warning";
43212       return [new validationIssue({
43213         type: type2,
43214         subtype,
43215         severity,
43216         message: function(context2) {
43217           var entity2 = context2.hasEntity(this.entityIds[0]);
43218           return entity2 ? _t.append("issues." + messageID + ".message", {
43219             feature: utilDisplayLabel(entity2, context2.graph())
43220           }) : "";
43221         },
43222         reference: showReference,
43223         entityIds: [entity.id],
43224         dynamicFixes: function(context2) {
43225           var fixes = [];
43226           var selectFixType = subtype === "highway_classification" ? "select_road_type" : "select_preset";
43227           fixes.push(new validationIssueFix({
43228             icon: "iD-icon-search",
43229             title: _t.append("issues.fix." + selectFixType + ".title"),
43230             onClick: function(context3) {
43231               context3.ui().sidebar.showPresetList();
43232             }
43233           }));
43234           var deleteOnClick;
43235           var id2 = this.entityIds[0];
43236           var operation = operationDelete(context2, [id2]);
43237           var disabledReasonID = operation.disabled();
43238           if (!disabledReasonID) {
43239             deleteOnClick = function(context3) {
43240               var id3 = this.issue.entityIds[0];
43241               var operation2 = operationDelete(context3, [id3]);
43242               if (!operation2.disabled()) {
43243                 operation2();
43244               }
43245             };
43246           }
43247           fixes.push(
43248             new validationIssueFix({
43249               icon: "iD-operation-delete",
43250               title: _t.append("issues.fix.delete_feature.title"),
43251               disabledReason: disabledReasonID ? _t("operations.delete." + disabledReasonID + ".single") : void 0,
43252               onClick: deleteOnClick
43253             })
43254           );
43255           return fixes;
43256         }
43257       })];
43258       function showReference(selection2) {
43259         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues." + referenceID + ".reference"));
43260       }
43261     };
43262     validation.type = type2;
43263     return validation;
43264   }
43265
43266   // modules/validations/outdated_tags.js
43267   function validationOutdatedTags() {
43268     const type2 = "outdated_tags";
43269     let _waitingForDeprecated = true;
43270     let _dataDeprecated;
43271     _mainFileFetcher.get("deprecated").then((d) => _dataDeprecated = d).catch(() => {
43272     }).finally(() => _waitingForDeprecated = false);
43273     function oldTagIssues(entity, graph) {
43274       if (!entity.hasInterestingTags())
43275         return [];
43276       let preset = _mainPresetIndex.match(entity, graph);
43277       if (!preset)
43278         return [];
43279       const oldTags = Object.assign({}, entity.tags);
43280       let subtype = "deprecated_tags";
43281       if (preset.replacement) {
43282         const newPreset = _mainPresetIndex.item(preset.replacement);
43283         graph = actionChangePreset(
43284           entity.id,
43285           preset,
43286           newPreset,
43287           true
43288           /* skip field defaults */
43289         )(graph);
43290         entity = graph.entity(entity.id);
43291         preset = newPreset;
43292       }
43293       if (_dataDeprecated) {
43294         const deprecatedTags = entity.deprecatedTags(_dataDeprecated);
43295         if (deprecatedTags.length) {
43296           deprecatedTags.forEach((tag) => {
43297             graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
43298           });
43299           entity = graph.entity(entity.id);
43300         }
43301       }
43302       let newTags = Object.assign({}, entity.tags);
43303       if (preset.tags !== preset.addTags) {
43304         Object.keys(preset.addTags).forEach((k) => {
43305           if (!newTags[k]) {
43306             if (preset.addTags[k] === "*") {
43307               newTags[k] = "yes";
43308             } else {
43309               newTags[k] = preset.addTags[k];
43310             }
43311           }
43312         });
43313       }
43314       const nsi = services.nsi;
43315       let waitingForNsi = false;
43316       let nsiResult;
43317       if (nsi) {
43318         waitingForNsi = nsi.status() === "loading";
43319         if (!waitingForNsi) {
43320           const loc = entity.extent(graph).center();
43321           nsiResult = nsi.upgradeTags(newTags, loc);
43322           if (nsiResult) {
43323             newTags = nsiResult.newTags;
43324             subtype = "noncanonical_brand";
43325           }
43326         }
43327       }
43328       let issues = [];
43329       issues.provisional = _waitingForDeprecated || waitingForNsi;
43330       const tagDiff = utilTagDiff(oldTags, newTags);
43331       if (!tagDiff.length)
43332         return issues;
43333       const isOnlyAddingTags = tagDiff.every((d) => d.type === "+");
43334       let prefix = "";
43335       if (nsiResult) {
43336         prefix = "noncanonical_brand.";
43337       } else if (subtype === "deprecated_tags" && isOnlyAddingTags) {
43338         subtype = "incomplete_tags";
43339         prefix = "incomplete.";
43340       }
43341       let autoArgs = subtype !== "noncanonical_brand" ? [doUpgrade, _t("issues.fix.upgrade_tags.annotation")] : null;
43342       issues.push(new validationIssue({
43343         type: type2,
43344         subtype,
43345         severity: "warning",
43346         message: showMessage,
43347         reference: showReference,
43348         entityIds: [entity.id],
43349         hash: utilHashcode(JSON.stringify(tagDiff)),
43350         dynamicFixes: () => {
43351           let fixes = [
43352             new validationIssueFix({
43353               autoArgs,
43354               title: _t.append("issues.fix.upgrade_tags.title"),
43355               onClick: (context) => {
43356                 context.perform(doUpgrade, _t("issues.fix.upgrade_tags.annotation"));
43357               }
43358             })
43359           ];
43360           const item = nsiResult && nsiResult.matched;
43361           if (item) {
43362             fixes.push(
43363               new validationIssueFix({
43364                 title: _t.append("issues.fix.tag_as_not.title", { name: item.displayName }),
43365                 onClick: (context) => {
43366                   context.perform(addNotTag, _t("issues.fix.tag_as_not.annotation"));
43367                 }
43368               })
43369             );
43370           }
43371           return fixes;
43372         }
43373       }));
43374       return issues;
43375       function doUpgrade(graph2) {
43376         const currEntity = graph2.hasEntity(entity.id);
43377         if (!currEntity)
43378           return graph2;
43379         let newTags2 = Object.assign({}, currEntity.tags);
43380         tagDiff.forEach((diff) => {
43381           if (diff.type === "-") {
43382             delete newTags2[diff.key];
43383           } else if (diff.type === "+") {
43384             newTags2[diff.key] = diff.newVal;
43385           }
43386         });
43387         return actionChangeTags(currEntity.id, newTags2)(graph2);
43388       }
43389       function addNotTag(graph2) {
43390         const currEntity = graph2.hasEntity(entity.id);
43391         if (!currEntity)
43392           return graph2;
43393         const item = nsiResult && nsiResult.matched;
43394         if (!item)
43395           return graph2;
43396         let newTags2 = Object.assign({}, currEntity.tags);
43397         const wd = item.mainTag;
43398         const notwd = `not:${wd}`;
43399         const qid = item.tags[wd];
43400         newTags2[notwd] = qid;
43401         if (newTags2[wd] === qid) {
43402           const wp = item.mainTag.replace("wikidata", "wikipedia");
43403           delete newTags2[wd];
43404           delete newTags2[wp];
43405         }
43406         return actionChangeTags(currEntity.id, newTags2)(graph2);
43407       }
43408       function showMessage(context) {
43409         const currEntity = context.hasEntity(entity.id);
43410         if (!currEntity)
43411           return "";
43412         let messageID = `issues.outdated_tags.${prefix}message`;
43413         if (subtype === "noncanonical_brand" && isOnlyAddingTags) {
43414           messageID += "_incomplete";
43415         }
43416         return _t.append(messageID, {
43417           feature: utilDisplayLabel(
43418             currEntity,
43419             context.graph(),
43420             true
43421             /* verbose */
43422           )
43423         });
43424       }
43425       function showReference(selection2) {
43426         let enter = selection2.selectAll(".issue-reference").data([0]).enter();
43427         enter.append("div").attr("class", "issue-reference").call(_t.append(`issues.outdated_tags.${prefix}reference`));
43428         enter.append("strong").call(_t.append("issues.suggested"));
43429         enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", (d) => {
43430           let klass = d.type === "+" ? "add" : "remove";
43431           return `tagDiff-cell tagDiff-cell-${klass}`;
43432         }).html((d) => d.display);
43433       }
43434     }
43435     function oldMultipolygonIssues(entity, graph) {
43436       let multipolygon, outerWay;
43437       if (entity.type === "relation") {
43438         outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
43439         multipolygon = entity;
43440       } else if (entity.type === "way") {
43441         multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
43442         outerWay = entity;
43443       } else {
43444         return [];
43445       }
43446       if (!multipolygon || !outerWay)
43447         return [];
43448       return [new validationIssue({
43449         type: type2,
43450         subtype: "old_multipolygon",
43451         severity: "warning",
43452         message: showMessage,
43453         reference: showReference,
43454         entityIds: [outerWay.id, multipolygon.id],
43455         dynamicFixes: () => {
43456           return [
43457             new validationIssueFix({
43458               autoArgs: [doUpgrade, _t("issues.fix.move_tags.annotation")],
43459               title: _t.append("issues.fix.move_tags.title"),
43460               onClick: (context) => {
43461                 context.perform(doUpgrade, _t("issues.fix.move_tags.annotation"));
43462               }
43463             })
43464           ];
43465         }
43466       })];
43467       function doUpgrade(graph2) {
43468         let currMultipolygon = graph2.hasEntity(multipolygon.id);
43469         let currOuterWay = graph2.hasEntity(outerWay.id);
43470         if (!currMultipolygon || !currOuterWay)
43471           return graph2;
43472         currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
43473         graph2 = graph2.replace(currMultipolygon);
43474         return actionChangeTags(currOuterWay.id, {})(graph2);
43475       }
43476       function showMessage(context) {
43477         let currMultipolygon = context.hasEntity(multipolygon.id);
43478         if (!currMultipolygon)
43479           return "";
43480         return _t.append(
43481           "issues.old_multipolygon.message",
43482           { multipolygon: utilDisplayLabel(
43483             currMultipolygon,
43484             context.graph(),
43485             true
43486             /* verbose */
43487           ) }
43488         );
43489       }
43490       function showReference(selection2) {
43491         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.old_multipolygon.reference"));
43492       }
43493     }
43494     let validation = function checkOutdatedTags(entity, graph) {
43495       let issues = oldMultipolygonIssues(entity, graph);
43496       if (!issues.length)
43497         issues = oldTagIssues(entity, graph);
43498       return issues;
43499     };
43500     validation.type = type2;
43501     return validation;
43502   }
43503
43504   // modules/validations/private_data.js
43505   function validationPrivateData() {
43506     var type2 = "private_data";
43507     var privateBuildingValues = {
43508       detached: true,
43509       farm: true,
43510       house: true,
43511       houseboat: true,
43512       residential: true,
43513       semidetached_house: true,
43514       static_caravan: true
43515     };
43516     var publicKeys = {
43517       amenity: true,
43518       craft: true,
43519       historic: true,
43520       leisure: true,
43521       office: true,
43522       shop: true,
43523       tourism: true
43524     };
43525     var personalTags = {
43526       "contact:email": true,
43527       "contact:fax": true,
43528       "contact:phone": true,
43529       email: true,
43530       fax: true,
43531       phone: true
43532     };
43533     var validation = function checkPrivateData(entity) {
43534       var tags = entity.tags;
43535       if (!tags.building || !privateBuildingValues[tags.building])
43536         return [];
43537       var keepTags = {};
43538       for (var k in tags) {
43539         if (publicKeys[k])
43540           return [];
43541         if (!personalTags[k]) {
43542           keepTags[k] = tags[k];
43543         }
43544       }
43545       var tagDiff = utilTagDiff(tags, keepTags);
43546       if (!tagDiff.length)
43547         return [];
43548       var fixID = tagDiff.length === 1 ? "remove_tag" : "remove_tags";
43549       return [new validationIssue({
43550         type: type2,
43551         severity: "warning",
43552         message: showMessage,
43553         reference: showReference,
43554         entityIds: [entity.id],
43555         dynamicFixes: function() {
43556           return [
43557             new validationIssueFix({
43558               icon: "iD-operation-delete",
43559               title: _t.append("issues.fix." + fixID + ".title"),
43560               onClick: function(context) {
43561                 context.perform(doUpgrade, _t("issues.fix.remove_tag.annotation"));
43562               }
43563             })
43564           ];
43565         }
43566       })];
43567       function doUpgrade(graph) {
43568         var currEntity = graph.hasEntity(entity.id);
43569         if (!currEntity)
43570           return graph;
43571         var newTags = Object.assign({}, currEntity.tags);
43572         tagDiff.forEach(function(diff) {
43573           if (diff.type === "-") {
43574             delete newTags[diff.key];
43575           } else if (diff.type === "+") {
43576             newTags[diff.key] = diff.newVal;
43577           }
43578         });
43579         return actionChangeTags(currEntity.id, newTags)(graph);
43580       }
43581       function showMessage(context) {
43582         var currEntity = context.hasEntity(this.entityIds[0]);
43583         if (!currEntity)
43584           return "";
43585         return _t.append(
43586           "issues.private_data.contact.message",
43587           { feature: utilDisplayLabel(currEntity, context.graph()) }
43588         );
43589       }
43590       function showReference(selection2) {
43591         var enter = selection2.selectAll(".issue-reference").data([0]).enter();
43592         enter.append("div").attr("class", "issue-reference").call(_t.append("issues.private_data.reference"));
43593         enter.append("strong").call(_t.append("issues.suggested"));
43594         enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", function(d) {
43595           var klass = d.type === "+" ? "add" : "remove";
43596           return "tagDiff-cell tagDiff-cell-" + klass;
43597         }).html(function(d) {
43598           return d.display;
43599         });
43600       }
43601     };
43602     validation.type = type2;
43603     return validation;
43604   }
43605
43606   // modules/validations/suspicious_name.js
43607   function validationSuspiciousName() {
43608     const type2 = "suspicious_name";
43609     const keysToTestForGenericValues = [
43610       "aerialway",
43611       "aeroway",
43612       "amenity",
43613       "building",
43614       "craft",
43615       "highway",
43616       "leisure",
43617       "railway",
43618       "man_made",
43619       "office",
43620       "shop",
43621       "tourism",
43622       "waterway"
43623     ];
43624     let _waitingForNsi = false;
43625     function isGenericMatchInNsi(tags) {
43626       const nsi = services.nsi;
43627       if (nsi) {
43628         _waitingForNsi = nsi.status() === "loading";
43629         if (!_waitingForNsi) {
43630           return nsi.isGenericName(tags);
43631         }
43632       }
43633       return false;
43634     }
43635     function nameMatchesRawTag(lowercaseName, tags) {
43636       for (let i2 = 0; i2 < keysToTestForGenericValues.length; i2++) {
43637         let key = keysToTestForGenericValues[i2];
43638         let val = tags[key];
43639         if (val) {
43640           val = val.toLowerCase();
43641           if (key === lowercaseName || val === lowercaseName || key.replace(/\_/g, " ") === lowercaseName || val.replace(/\_/g, " ") === lowercaseName) {
43642             return true;
43643           }
43644         }
43645       }
43646       return false;
43647     }
43648     function isGenericName(name, tags) {
43649       name = name.toLowerCase();
43650       return nameMatchesRawTag(name, tags) || isGenericMatchInNsi(tags);
43651     }
43652     function makeGenericNameIssue(entityId, nameKey, genericName, langCode) {
43653       return new validationIssue({
43654         type: type2,
43655         subtype: "generic_name",
43656         severity: "warning",
43657         message: function(context) {
43658           let entity = context.hasEntity(this.entityIds[0]);
43659           if (!entity)
43660             return "";
43661           let preset = _mainPresetIndex.match(entity, context.graph());
43662           let langName = langCode && _mainLocalizer.languageName(langCode);
43663           return _t.append(
43664             "issues.generic_name.message" + (langName ? "_language" : ""),
43665             { feature: preset.name(), name: genericName, language: langName }
43666           );
43667         },
43668         reference: showReference,
43669         entityIds: [entityId],
43670         hash: `${nameKey}=${genericName}`,
43671         dynamicFixes: function() {
43672           return [
43673             new validationIssueFix({
43674               icon: "iD-operation-delete",
43675               title: _t.append("issues.fix.remove_the_name.title"),
43676               onClick: function(context) {
43677                 let entityId2 = this.issue.entityIds[0];
43678                 let entity = context.entity(entityId2);
43679                 let tags = Object.assign({}, entity.tags);
43680                 delete tags[nameKey];
43681                 context.perform(
43682                   actionChangeTags(entityId2, tags),
43683                   _t("issues.fix.remove_generic_name.annotation")
43684                 );
43685               }
43686             })
43687           ];
43688         }
43689       });
43690       function showReference(selection2) {
43691         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.generic_name.reference"));
43692       }
43693     }
43694     function makeIncorrectNameIssue(entityId, nameKey, incorrectName, langCode) {
43695       return new validationIssue({
43696         type: type2,
43697         subtype: "not_name",
43698         severity: "warning",
43699         message: function(context) {
43700           const entity = context.hasEntity(this.entityIds[0]);
43701           if (!entity)
43702             return "";
43703           const preset = _mainPresetIndex.match(entity, context.graph());
43704           const langName = langCode && _mainLocalizer.languageName(langCode);
43705           return _t.append(
43706             "issues.incorrect_name.message" + (langName ? "_language" : ""),
43707             { feature: preset.name(), name: incorrectName, language: langName }
43708           );
43709         },
43710         reference: showReference,
43711         entityIds: [entityId],
43712         hash: `${nameKey}=${incorrectName}`,
43713         dynamicFixes: function() {
43714           return [
43715             new validationIssueFix({
43716               icon: "iD-operation-delete",
43717               title: _t.append("issues.fix.remove_the_name.title"),
43718               onClick: function(context) {
43719                 const entityId2 = this.issue.entityIds[0];
43720                 const entity = context.entity(entityId2);
43721                 let tags = Object.assign({}, entity.tags);
43722                 delete tags[nameKey];
43723                 context.perform(
43724                   actionChangeTags(entityId2, tags),
43725                   _t("issues.fix.remove_mistaken_name.annotation")
43726                 );
43727               }
43728             })
43729           ];
43730         }
43731       });
43732       function showReference(selection2) {
43733         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.generic_name.reference"));
43734       }
43735     }
43736     let validation = function checkGenericName(entity) {
43737       const tags = entity.tags;
43738       const hasWikidata = !!tags.wikidata || !!tags["brand:wikidata"] || !!tags["operator:wikidata"];
43739       if (hasWikidata)
43740         return [];
43741       let issues = [];
43742       const notNames2 = (tags["not:name"] || "").split(";");
43743       for (let key in tags) {
43744         const m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/);
43745         if (!m)
43746           continue;
43747         const langCode = m.length >= 2 ? m[1] : null;
43748         const value = tags[key];
43749         if (notNames2.length) {
43750           for (let i2 in notNames2) {
43751             const notName = notNames2[i2];
43752             if (notName && value === notName) {
43753               issues.push(makeIncorrectNameIssue(entity.id, key, value, langCode));
43754               continue;
43755             }
43756           }
43757         }
43758         if (isGenericName(value, tags)) {
43759           issues.provisional = _waitingForNsi;
43760           issues.push(makeGenericNameIssue(entity.id, key, value, langCode));
43761         }
43762       }
43763       return issues;
43764     };
43765     validation.type = type2;
43766     return validation;
43767   }
43768
43769   // modules/validations/unsquare_way.js
43770   function validationUnsquareWay(context) {
43771     var type2 = "unsquare_way";
43772     var DEFAULT_DEG_THRESHOLD = 5;
43773     var epsilon3 = 0.05;
43774     var nodeThreshold = 10;
43775     function isBuilding(entity, graph) {
43776       if (entity.type !== "way" || entity.geometry(graph) !== "area")
43777         return false;
43778       return entity.tags.building && entity.tags.building !== "no";
43779     }
43780     var validation = function checkUnsquareWay(entity, graph) {
43781       if (!isBuilding(entity, graph))
43782         return [];
43783       if (entity.tags.nonsquare === "yes")
43784         return [];
43785       var isClosed = entity.isClosed();
43786       if (!isClosed)
43787         return [];
43788       var nodes = graph.childNodes(entity).slice();
43789       if (nodes.length > nodeThreshold + 1)
43790         return [];
43791       var osm = services.osm;
43792       if (!osm || nodes.some(function(node) {
43793         return !osm.isDataLoaded(node.loc);
43794       }))
43795         return [];
43796       var hasConnectedSquarableWays = nodes.some(function(node) {
43797         return graph.parentWays(node).some(function(way) {
43798           if (way.id === entity.id)
43799             return false;
43800           if (isBuilding(way, graph))
43801             return true;
43802           return graph.parentRelations(way).some(function(parentRelation) {
43803             return parentRelation.isMultipolygon() && parentRelation.tags.building && parentRelation.tags.building !== "no";
43804           });
43805         });
43806       });
43807       if (hasConnectedSquarableWays)
43808         return [];
43809       var storedDegreeThreshold = corePreferences("validate-square-degrees");
43810       var degreeThreshold = isFinite(storedDegreeThreshold) ? Number(storedDegreeThreshold) : DEFAULT_DEG_THRESHOLD;
43811       var points = nodes.map(function(node) {
43812         return context.projection(node.loc);
43813       });
43814       if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon3, degreeThreshold, true))
43815         return [];
43816       var autoArgs;
43817       if (!entity.tags.wikidata) {
43818         var autoAction = actionOrthogonalize(entity.id, context.projection, void 0, degreeThreshold);
43819         autoAction.transitionable = false;
43820         autoArgs = [autoAction, _t("operations.orthogonalize.annotation.feature", { n: 1 })];
43821       }
43822       return [new validationIssue({
43823         type: type2,
43824         subtype: "building",
43825         severity: "warning",
43826         message: function(context2) {
43827           var entity2 = context2.hasEntity(this.entityIds[0]);
43828           return entity2 ? _t.append("issues.unsquare_way.message", {
43829             feature: utilDisplayLabel(entity2, context2.graph())
43830           }) : "";
43831         },
43832         reference: showReference,
43833         entityIds: [entity.id],
43834         hash: degreeThreshold,
43835         dynamicFixes: function() {
43836           return [
43837             new validationIssueFix({
43838               icon: "iD-operation-orthogonalize",
43839               title: _t.append("issues.fix.square_feature.title"),
43840               autoArgs,
43841               onClick: function(context2, completionHandler) {
43842                 var entityId = this.issue.entityIds[0];
43843                 context2.perform(
43844                   actionOrthogonalize(entityId, context2.projection, void 0, degreeThreshold),
43845                   _t("operations.orthogonalize.annotation.feature", { n: 1 })
43846                 );
43847                 window.setTimeout(function() {
43848                   completionHandler();
43849                 }, 175);
43850               }
43851             })
43852             /*
43853             new validationIssueFix({
43854                 title: t.append('issues.fix.tag_as_unsquare.title'),
43855                 onClick: function(context) {
43856                     var entityId = this.issue.entityIds[0];
43857                     var entity = context.entity(entityId);
43858                     var tags = Object.assign({}, entity.tags);  // shallow copy
43859                     tags.nonsquare = 'yes';
43860                     context.perform(
43861                         actionChangeTags(entityId, tags),
43862                         t('issues.fix.tag_as_unsquare.annotation')
43863                     );
43864                 }
43865             })
43866             */
43867           ];
43868         }
43869       })];
43870       function showReference(selection2) {
43871         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unsquare_way.buildings.reference"));
43872       }
43873     };
43874     validation.type = type2;
43875     return validation;
43876   }
43877
43878   // modules/core/validator.js
43879   function coreValidator(context) {
43880     let dispatch10 = dispatch_default("validated", "focusedIssue");
43881     let validator = utilRebind({}, dispatch10, "on");
43882     let _rules = {};
43883     let _disabledRules = {};
43884     let _ignoredIssueIDs = /* @__PURE__ */ new Set();
43885     let _resolvedIssueIDs = /* @__PURE__ */ new Set();
43886     let _baseCache = validationCache("base");
43887     let _headCache = validationCache("head");
43888     let _completeDiff = {};
43889     let _headIsCurrent = false;
43890     let _deferredRIC = {};
43891     let _deferredST = /* @__PURE__ */ new Set();
43892     let _headPromise;
43893     const RETRY = 5e3;
43894     const _errorOverrides = parseHashParam(context.initialHashParams.validationError);
43895     const _warningOverrides = parseHashParam(context.initialHashParams.validationWarning);
43896     const _disableOverrides = parseHashParam(context.initialHashParams.validationDisable);
43897     function parseHashParam(param) {
43898       let result = [];
43899       let rules = (param || "").split(",");
43900       rules.forEach((rule) => {
43901         rule = rule.trim();
43902         const parts = rule.split("/", 2);
43903         const type2 = parts[0];
43904         const subtype = parts[1] || "*";
43905         if (!type2 || !subtype)
43906           return;
43907         result.push({ type: makeRegExp(type2), subtype: makeRegExp(subtype) });
43908       });
43909       return result;
43910       function makeRegExp(str2) {
43911         const escaped = str2.replace(/[-\/\\^$+?.()|[\]{}]/g, "\\$&").replace(/\*/g, ".*");
43912         return new RegExp("^" + escaped + "$");
43913       }
43914     }
43915     validator.init = () => {
43916       Object.values(validations_exports).forEach((validation) => {
43917         if (typeof validation !== "function")
43918           return;
43919         const fn = validation(context);
43920         const key = fn.type;
43921         _rules[key] = fn;
43922       });
43923       let disabledRules = corePreferences("validate-disabledRules");
43924       if (disabledRules) {
43925         disabledRules.split(",").forEach((k) => _disabledRules[k] = true);
43926       }
43927     };
43928     function reset(resetIgnored) {
43929       _baseCache.queue = [];
43930       _headCache.queue = [];
43931       Object.keys(_deferredRIC).forEach((key) => {
43932         window.cancelIdleCallback(key);
43933         _deferredRIC[key]();
43934       });
43935       _deferredRIC = {};
43936       _deferredST.forEach(window.clearTimeout);
43937       _deferredST.clear();
43938       if (resetIgnored)
43939         _ignoredIssueIDs.clear();
43940       _resolvedIssueIDs.clear();
43941       _baseCache = validationCache("base");
43942       _headCache = validationCache("head");
43943       _completeDiff = {};
43944       _headIsCurrent = false;
43945     }
43946     validator.reset = () => {
43947       reset(true);
43948     };
43949     validator.resetIgnoredIssues = () => {
43950       _ignoredIssueIDs.clear();
43951       dispatch10.call("validated");
43952     };
43953     validator.revalidateUnsquare = () => {
43954       revalidateUnsquare(_headCache);
43955       revalidateUnsquare(_baseCache);
43956       dispatch10.call("validated");
43957     };
43958     function revalidateUnsquare(cache) {
43959       const checkUnsquareWay = _rules.unsquare_way;
43960       if (!cache.graph || typeof checkUnsquareWay !== "function")
43961         return;
43962       cache.uncacheIssuesOfType("unsquare_way");
43963       const buildings = context.history().tree().intersects(geoExtent([-180, -90], [180, 90]), cache.graph).filter((entity) => entity.type === "way" && entity.tags.building && entity.tags.building !== "no");
43964       buildings.forEach((entity) => {
43965         const detected = checkUnsquareWay(entity, cache.graph);
43966         if (!detected.length)
43967           return;
43968         cache.cacheIssues(detected);
43969       });
43970     }
43971     validator.getIssues = (options2) => {
43972       const opts = Object.assign({ what: "all", where: "all", includeIgnored: false, includeDisabledRules: false }, options2);
43973       const view = context.map().extent();
43974       let seen = /* @__PURE__ */ new Set();
43975       let results = [];
43976       if (_headCache.graph && _headCache.graph !== _baseCache.graph) {
43977         Object.values(_headCache.issuesByIssueID).forEach((issue) => {
43978           const userModified = (issue.entityIds || []).some((id2) => _completeDiff.hasOwnProperty(id2));
43979           if (opts.what === "edited" && !userModified)
43980             return;
43981           if (!filter2(issue))
43982             return;
43983           seen.add(issue.id);
43984           results.push(issue);
43985         });
43986       }
43987       if (opts.what === "all") {
43988         Object.values(_baseCache.issuesByIssueID).forEach((issue) => {
43989           if (!filter2(issue))
43990             return;
43991           seen.add(issue.id);
43992           results.push(issue);
43993         });
43994       }
43995       return results;
43996       function filter2(issue) {
43997         if (!issue)
43998           return false;
43999         if (seen.has(issue.id))
44000           return false;
44001         if (_resolvedIssueIDs.has(issue.id))
44002           return false;
44003         if (opts.includeDisabledRules === "only" && !_disabledRules[issue.type])
44004           return false;
44005         if (!opts.includeDisabledRules && _disabledRules[issue.type])
44006           return false;
44007         if (opts.includeIgnored === "only" && !_ignoredIssueIDs.has(issue.id))
44008           return false;
44009         if (!opts.includeIgnored && _ignoredIssueIDs.has(issue.id))
44010           return false;
44011         if ((issue.entityIds || []).some((id2) => !context.hasEntity(id2)))
44012           return false;
44013         if (opts.where === "visible") {
44014           const extent = issue.extent(context.graph());
44015           if (!view.intersects(extent))
44016             return false;
44017         }
44018         return true;
44019       }
44020     };
44021     validator.getResolvedIssues = () => {
44022       return Array.from(_resolvedIssueIDs).map((issueID) => _baseCache.issuesByIssueID[issueID]).filter(Boolean);
44023     };
44024     validator.focusIssue = (issue) => {
44025       const graph = context.graph();
44026       let selectID;
44027       let focusCenter;
44028       const issueExtent = issue.extent(graph);
44029       if (issueExtent) {
44030         focusCenter = issueExtent.center();
44031       }
44032       if (issue.entityIds && issue.entityIds.length) {
44033         selectID = issue.entityIds[0];
44034         if (selectID && selectID.charAt(0) === "r") {
44035           const ids = utilEntityAndDeepMemberIDs([selectID], graph);
44036           let nodeID = ids.find((id2) => id2.charAt(0) === "n" && graph.hasEntity(id2));
44037           if (!nodeID) {
44038             const wayID = ids.find((id2) => id2.charAt(0) === "w" && graph.hasEntity(id2));
44039             if (wayID) {
44040               nodeID = graph.entity(wayID).first();
44041             }
44042           }
44043           if (nodeID) {
44044             focusCenter = graph.entity(nodeID).loc;
44045           }
44046         }
44047       }
44048       if (focusCenter) {
44049         const setZoom = Math.max(context.map().zoom(), 19);
44050         context.map().unobscuredCenterZoomEase(focusCenter, setZoom);
44051       }
44052       if (selectID) {
44053         window.setTimeout(() => {
44054           context.enter(modeSelect(context, [selectID]));
44055           dispatch10.call("focusedIssue", this, issue);
44056         }, 250);
44057       }
44058     };
44059     validator.getIssuesBySeverity = (options2) => {
44060       let groups = utilArrayGroupBy(validator.getIssues(options2), "severity");
44061       groups.error = groups.error || [];
44062       groups.warning = groups.warning || [];
44063       return groups;
44064     };
44065     validator.getSharedEntityIssues = (entityIDs, options2) => {
44066       const orderedIssueTypes = [
44067         // Show some issue types in a particular order:
44068         "missing_tag",
44069         "missing_role",
44070         // - missing data first
44071         "outdated_tags",
44072         "mismatched_geometry",
44073         // - identity issues
44074         "crossing_ways",
44075         "almost_junction",
44076         // - geometry issues where fixing them might solve connectivity issues
44077         "disconnected_way",
44078         "impossible_oneway"
44079         // - finally connectivity issues
44080       ];
44081       const allIssues = validator.getIssues(options2);
44082       const forEntityIDs = new Set(entityIDs);
44083       return allIssues.filter((issue) => (issue.entityIds || []).some((entityID) => forEntityIDs.has(entityID))).sort((issue1, issue2) => {
44084         if (issue1.type === issue2.type) {
44085           return issue1.id < issue2.id ? -1 : 1;
44086         }
44087         const index1 = orderedIssueTypes.indexOf(issue1.type);
44088         const index2 = orderedIssueTypes.indexOf(issue2.type);
44089         if (index1 !== -1 && index2 !== -1) {
44090           return index1 - index2;
44091         } else if (index1 === -1 && index2 === -1) {
44092           return issue1.type < issue2.type ? -1 : 1;
44093         } else {
44094           return index1 !== -1 ? -1 : 1;
44095         }
44096       });
44097     };
44098     validator.getEntityIssues = (entityID, options2) => {
44099       return validator.getSharedEntityIssues([entityID], options2);
44100     };
44101     validator.getRuleKeys = () => {
44102       return Object.keys(_rules);
44103     };
44104     validator.isRuleEnabled = (key) => {
44105       return !_disabledRules[key];
44106     };
44107     validator.toggleRule = (key) => {
44108       if (_disabledRules[key]) {
44109         delete _disabledRules[key];
44110       } else {
44111         _disabledRules[key] = true;
44112       }
44113       corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(","));
44114       validator.validate();
44115     };
44116     validator.disableRules = (keys) => {
44117       _disabledRules = {};
44118       keys.forEach((k) => _disabledRules[k] = true);
44119       corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(","));
44120       validator.validate();
44121     };
44122     validator.ignoreIssue = (issueID) => {
44123       _ignoredIssueIDs.add(issueID);
44124     };
44125     validator.validate = () => {
44126       const baseGraph = context.history().base();
44127       if (!_headCache.graph)
44128         _headCache.graph = baseGraph;
44129       if (!_baseCache.graph)
44130         _baseCache.graph = baseGraph;
44131       const prevGraph = _headCache.graph;
44132       const currGraph = context.graph();
44133       if (currGraph === prevGraph) {
44134         _headIsCurrent = true;
44135         dispatch10.call("validated");
44136         return Promise.resolve();
44137       }
44138       if (_headPromise) {
44139         _headIsCurrent = false;
44140         return _headPromise;
44141       }
44142       _headCache.graph = currGraph;
44143       _completeDiff = context.history().difference().complete();
44144       const incrementalDiff = coreDifference(prevGraph, currGraph);
44145       let entityIDs = Object.keys(incrementalDiff.complete());
44146       entityIDs = _headCache.withAllRelatedEntities(entityIDs);
44147       if (!entityIDs.size) {
44148         dispatch10.call("validated");
44149         return Promise.resolve();
44150       }
44151       _headPromise = validateEntitiesAsync(entityIDs, _headCache).then(() => updateResolvedIssues(entityIDs)).then(() => dispatch10.call("validated")).catch(() => {
44152       }).then(() => {
44153         _headPromise = null;
44154         if (!_headIsCurrent) {
44155           validator.validate();
44156         }
44157       });
44158       return _headPromise;
44159     };
44160     context.history().on("restore.validator", validator.validate).on("undone.validator", validator.validate).on("redone.validator", validator.validate).on("reset.validator", () => {
44161       reset(false);
44162       validator.validate();
44163     });
44164     context.on("exit.validator", validator.validate);
44165     context.history().on("merge.validator", (entities) => {
44166       if (!entities)
44167         return;
44168       const baseGraph = context.history().base();
44169       if (!_headCache.graph)
44170         _headCache.graph = baseGraph;
44171       if (!_baseCache.graph)
44172         _baseCache.graph = baseGraph;
44173       let entityIDs = entities.map((entity) => entity.id);
44174       entityIDs = _baseCache.withAllRelatedEntities(entityIDs);
44175       validateEntitiesAsync(entityIDs, _baseCache);
44176     });
44177     function validateEntity(entity, graph) {
44178       let result = { issues: [], provisional: false };
44179       Object.keys(_rules).forEach(runValidation);
44180       return result;
44181       function runValidation(key) {
44182         const fn = _rules[key];
44183         if (typeof fn !== "function") {
44184           console.error("no such validation rule = " + key);
44185           return;
44186         }
44187         let detected = fn(entity, graph);
44188         if (detected.provisional) {
44189           result.provisional = true;
44190         }
44191         detected = detected.filter(applySeverityOverrides);
44192         result.issues = result.issues.concat(detected);
44193         function applySeverityOverrides(issue) {
44194           const type2 = issue.type;
44195           const subtype = issue.subtype || "";
44196           let i2;
44197           for (i2 = 0; i2 < _errorOverrides.length; i2++) {
44198             if (_errorOverrides[i2].type.test(type2) && _errorOverrides[i2].subtype.test(subtype)) {
44199               issue.severity = "error";
44200               return true;
44201             }
44202           }
44203           for (i2 = 0; i2 < _warningOverrides.length; i2++) {
44204             if (_warningOverrides[i2].type.test(type2) && _warningOverrides[i2].subtype.test(subtype)) {
44205               issue.severity = "warning";
44206               return true;
44207             }
44208           }
44209           for (i2 = 0; i2 < _disableOverrides.length; i2++) {
44210             if (_disableOverrides[i2].type.test(type2) && _disableOverrides[i2].subtype.test(subtype)) {
44211               return false;
44212             }
44213           }
44214           return true;
44215         }
44216       }
44217     }
44218     function updateResolvedIssues(entityIDs) {
44219       entityIDs.forEach((entityID) => {
44220         const baseIssues = _baseCache.issuesByEntityID[entityID];
44221         if (!baseIssues)
44222           return;
44223         baseIssues.forEach((issueID) => {
44224           const issue = _baseCache.issuesByIssueID[issueID];
44225           const userModified = (issue.entityIds || []).some((id2) => _completeDiff.hasOwnProperty(id2));
44226           if (userModified && !_headCache.issuesByIssueID[issueID]) {
44227             _resolvedIssueIDs.add(issueID);
44228           } else {
44229             _resolvedIssueIDs.delete(issueID);
44230           }
44231         });
44232       });
44233     }
44234     function validateEntitiesAsync(entityIDs, cache) {
44235       const jobs = Array.from(entityIDs).map((entityID) => {
44236         if (cache.queuedEntityIDs.has(entityID))
44237           return null;
44238         cache.queuedEntityIDs.add(entityID);
44239         cache.uncacheEntityID(entityID);
44240         return () => {
44241           cache.queuedEntityIDs.delete(entityID);
44242           const graph = cache.graph;
44243           if (!graph)
44244             return;
44245           const entity = graph.hasEntity(entityID);
44246           if (!entity)
44247             return;
44248           const result = validateEntity(entity, graph);
44249           if (result.provisional) {
44250             cache.provisionalEntityIDs.add(entityID);
44251           }
44252           cache.cacheIssues(result.issues);
44253         };
44254       }).filter(Boolean);
44255       cache.queue = cache.queue.concat(utilArrayChunk(jobs, 100));
44256       if (cache.queuePromise)
44257         return cache.queuePromise;
44258       cache.queuePromise = processQueue(cache).then(() => revalidateProvisionalEntities(cache)).catch(() => {
44259       }).finally(() => cache.queuePromise = null);
44260       return cache.queuePromise;
44261     }
44262     function revalidateProvisionalEntities(cache) {
44263       if (!cache.provisionalEntityIDs.size)
44264         return;
44265       const handle = window.setTimeout(() => {
44266         _deferredST.delete(handle);
44267         if (!cache.provisionalEntityIDs.size)
44268           return;
44269         validateEntitiesAsync(Array.from(cache.provisionalEntityIDs), cache);
44270       }, RETRY);
44271       _deferredST.add(handle);
44272     }
44273     function processQueue(cache) {
44274       if (!cache.queue.length)
44275         return Promise.resolve();
44276       const chunk = cache.queue.pop();
44277       return new Promise((resolvePromise, rejectPromise) => {
44278         const handle = window.requestIdleCallback(() => {
44279           delete _deferredRIC[handle];
44280           chunk.forEach((job) => job());
44281           resolvePromise();
44282         });
44283         _deferredRIC[handle] = rejectPromise;
44284       }).then(() => {
44285         if (cache.queue.length % 25 === 0)
44286           dispatch10.call("validated");
44287       }).then(() => processQueue(cache));
44288     }
44289     return validator;
44290   }
44291   function validationCache(which) {
44292     let cache = {
44293       which,
44294       graph: null,
44295       queue: [],
44296       queuePromise: null,
44297       queuedEntityIDs: /* @__PURE__ */ new Set(),
44298       provisionalEntityIDs: /* @__PURE__ */ new Set(),
44299       issuesByIssueID: {},
44300       // issue.id -> issue
44301       issuesByEntityID: {}
44302       // entity.id -> Set(issue.id)
44303     };
44304     cache.cacheIssue = (issue) => {
44305       (issue.entityIds || []).forEach((entityID) => {
44306         if (!cache.issuesByEntityID[entityID]) {
44307           cache.issuesByEntityID[entityID] = /* @__PURE__ */ new Set();
44308         }
44309         cache.issuesByEntityID[entityID].add(issue.id);
44310       });
44311       cache.issuesByIssueID[issue.id] = issue;
44312     };
44313     cache.uncacheIssue = (issue) => {
44314       (issue.entityIds || []).forEach((entityID) => {
44315         if (cache.issuesByEntityID[entityID]) {
44316           cache.issuesByEntityID[entityID].delete(issue.id);
44317         }
44318       });
44319       delete cache.issuesByIssueID[issue.id];
44320     };
44321     cache.cacheIssues = (issues) => {
44322       issues.forEach(cache.cacheIssue);
44323     };
44324     cache.uncacheIssues = (issues) => {
44325       issues.forEach(cache.uncacheIssue);
44326     };
44327     cache.uncacheIssuesOfType = (type2) => {
44328       const issuesOfType = Object.values(cache.issuesByIssueID).filter((issue) => issue.type === type2);
44329       cache.uncacheIssues(issuesOfType);
44330     };
44331     cache.uncacheEntityID = (entityID) => {
44332       const entityIssueIDs = cache.issuesByEntityID[entityID];
44333       if (entityIssueIDs) {
44334         entityIssueIDs.forEach((issueID) => {
44335           const issue = cache.issuesByIssueID[issueID];
44336           if (issue) {
44337             cache.uncacheIssue(issue);
44338           } else {
44339             delete cache.issuesByIssueID[issueID];
44340           }
44341         });
44342       }
44343       delete cache.issuesByEntityID[entityID];
44344       cache.provisionalEntityIDs.delete(entityID);
44345     };
44346     cache.withAllRelatedEntities = (entityIDs) => {
44347       let result = /* @__PURE__ */ new Set();
44348       (entityIDs || []).forEach((entityID) => {
44349         result.add(entityID);
44350         const entityIssueIDs = cache.issuesByEntityID[entityID];
44351         if (entityIssueIDs) {
44352           entityIssueIDs.forEach((issueID) => {
44353             const issue = cache.issuesByIssueID[issueID];
44354             if (issue) {
44355               (issue.entityIds || []).forEach((relatedID) => result.add(relatedID));
44356             } else {
44357               delete cache.issuesByIssueID[issueID];
44358             }
44359           });
44360         }
44361       });
44362       return result;
44363     };
44364     return cache;
44365   }
44366
44367   // modules/core/uploader.js
44368   function coreUploader(context) {
44369     var dispatch10 = dispatch_default(
44370       // Start and end events are dispatched exactly once each per legitimate outside call to `save`
44371       "saveStarted",
44372       // dispatched as soon as a call to `save` has been deemed legitimate
44373       "saveEnded",
44374       // dispatched after the result event has been dispatched
44375       "willAttemptUpload",
44376       // dispatched before the actual upload call occurs, if it will
44377       "progressChanged",
44378       // Each save results in one of these outcomes:
44379       "resultNoChanges",
44380       // upload wasn't attempted since there were no edits
44381       "resultErrors",
44382       // upload failed due to errors
44383       "resultConflicts",
44384       // upload failed due to data conflicts
44385       "resultSuccess"
44386       // upload completed without errors
44387     );
44388     var _isSaving = false;
44389     var _conflicts = [];
44390     var _errors = [];
44391     var _origChanges;
44392     var _discardTags = {};
44393     _mainFileFetcher.get("discarded").then(function(d) {
44394       _discardTags = d;
44395     }).catch(function() {
44396     });
44397     var uploader = utilRebind({}, dispatch10, "on");
44398     uploader.isSaving = function() {
44399       return _isSaving;
44400     };
44401     uploader.save = function(changeset, tryAgain, checkConflicts) {
44402       if (_isSaving && !tryAgain) {
44403         return;
44404       }
44405       var osm = context.connection();
44406       if (!osm)
44407         return;
44408       if (!osm.authenticated()) {
44409         osm.authenticate(function(err) {
44410           if (!err) {
44411             uploader.save(changeset, tryAgain, checkConflicts);
44412           }
44413         });
44414         return;
44415       }
44416       if (!_isSaving) {
44417         _isSaving = true;
44418         dispatch10.call("saveStarted", this);
44419       }
44420       var history = context.history();
44421       _conflicts = [];
44422       _errors = [];
44423       _origChanges = history.changes(actionDiscardTags(history.difference(), _discardTags));
44424       if (!tryAgain) {
44425         history.perform(actionNoop());
44426       }
44427       if (!checkConflicts) {
44428         upload(changeset);
44429       } else {
44430         performFullConflictCheck(changeset);
44431       }
44432     };
44433     function performFullConflictCheck(changeset) {
44434       var osm = context.connection();
44435       if (!osm)
44436         return;
44437       var history = context.history();
44438       var localGraph = context.graph();
44439       var remoteGraph = coreGraph(history.base(), true);
44440       var summary = history.difference().summary();
44441       var _toCheck = [];
44442       for (var i2 = 0; i2 < summary.length; i2++) {
44443         var item = summary[i2];
44444         if (item.changeType === "modified") {
44445           _toCheck.push(item.entity.id);
44446         }
44447       }
44448       var _toLoad = withChildNodes(_toCheck, localGraph);
44449       var _loaded = {};
44450       var _toLoadCount = 0;
44451       var _toLoadTotal = _toLoad.length;
44452       if (_toCheck.length) {
44453         dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal);
44454         _toLoad.forEach(function(id2) {
44455           _loaded[id2] = false;
44456         });
44457         osm.loadMultiple(_toLoad, loaded);
44458       } else {
44459         upload(changeset);
44460       }
44461       return;
44462       function withChildNodes(ids, graph) {
44463         var s = new Set(ids);
44464         ids.forEach(function(id2) {
44465           var entity = graph.entity(id2);
44466           if (entity.type !== "way")
44467             return;
44468           graph.childNodes(entity).forEach(function(child) {
44469             if (child.version !== void 0) {
44470               s.add(child.id);
44471             }
44472           });
44473         });
44474         return Array.from(s);
44475       }
44476       function loaded(err, result) {
44477         if (_errors.length)
44478           return;
44479         if (err) {
44480           _errors.push({
44481             msg: err.message || err.responseText,
44482             details: [_t("save.status_code", { code: err.status })]
44483           });
44484           didResultInErrors();
44485         } else {
44486           var loadMore = [];
44487           result.data.forEach(function(entity) {
44488             remoteGraph.replace(entity);
44489             _loaded[entity.id] = true;
44490             _toLoad = _toLoad.filter(function(val) {
44491               return val !== entity.id;
44492             });
44493             if (!entity.visible)
44494               return;
44495             var i3, id2;
44496             if (entity.type === "way") {
44497               for (i3 = 0; i3 < entity.nodes.length; i3++) {
44498                 id2 = entity.nodes[i3];
44499                 if (_loaded[id2] === void 0) {
44500                   _loaded[id2] = false;
44501                   loadMore.push(id2);
44502                 }
44503               }
44504             } else if (entity.type === "relation" && entity.isMultipolygon()) {
44505               for (i3 = 0; i3 < entity.members.length; i3++) {
44506                 id2 = entity.members[i3].id;
44507                 if (_loaded[id2] === void 0) {
44508                   _loaded[id2] = false;
44509                   loadMore.push(id2);
44510                 }
44511               }
44512             }
44513           });
44514           _toLoadCount += result.data.length;
44515           _toLoadTotal += loadMore.length;
44516           dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal);
44517           if (loadMore.length) {
44518             _toLoad.push.apply(_toLoad, loadMore);
44519             osm.loadMultiple(loadMore, loaded);
44520           }
44521           if (!_toLoad.length) {
44522             detectConflicts();
44523             upload(changeset);
44524           }
44525         }
44526       }
44527       function detectConflicts() {
44528         function choice(id2, text2, action) {
44529           return {
44530             id: id2,
44531             text: text2,
44532             action: function() {
44533               history.replace(action);
44534             }
44535           };
44536         }
44537         function formatUser(d) {
44538           return '<a href="' + osm.userURL(d) + '" target="_blank">' + escape_default(d) + "</a>";
44539         }
44540         function entityName(entity) {
44541           return utilDisplayName(entity) || utilDisplayType(entity.id) + " " + entity.id;
44542         }
44543         function sameVersions(local, remote) {
44544           if (local.version !== remote.version)
44545             return false;
44546           if (local.type === "way") {
44547             var children2 = utilArrayUnion(local.nodes, remote.nodes);
44548             for (var i3 = 0; i3 < children2.length; i3++) {
44549               var a = localGraph.hasEntity(children2[i3]);
44550               var b = remoteGraph.hasEntity(children2[i3]);
44551               if (a && b && a.version !== b.version)
44552                 return false;
44553             }
44554           }
44555           return true;
44556         }
44557         _toCheck.forEach(function(id2) {
44558           var local = localGraph.entity(id2);
44559           var remote = remoteGraph.entity(id2);
44560           if (sameVersions(local, remote))
44561             return;
44562           var merge3 = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags, formatUser);
44563           history.replace(merge3);
44564           var mergeConflicts = merge3.conflicts();
44565           if (!mergeConflicts.length)
44566             return;
44567           var forceLocal = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_local");
44568           var forceRemote = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_remote");
44569           var keepMine = _t("save.conflict." + (remote.visible ? "keep_local" : "restore"));
44570           var keepTheirs = _t("save.conflict." + (remote.visible ? "keep_remote" : "delete"));
44571           _conflicts.push({
44572             id: id2,
44573             name: entityName(local),
44574             details: mergeConflicts,
44575             chosen: 1,
44576             choices: [
44577               choice(id2, keepMine, forceLocal),
44578               choice(id2, keepTheirs, forceRemote)
44579             ]
44580           });
44581         });
44582       }
44583     }
44584     function upload(changeset) {
44585       var osm = context.connection();
44586       if (!osm) {
44587         _errors.push({ msg: "No OSM Service" });
44588       }
44589       if (_conflicts.length) {
44590         didResultInConflicts(changeset);
44591       } else if (_errors.length) {
44592         didResultInErrors();
44593       } else {
44594         var history = context.history();
44595         var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
44596         if (changes.modified.length || changes.created.length || changes.deleted.length) {
44597           dispatch10.call("willAttemptUpload", this);
44598           osm.putChangeset(changeset, changes, uploadCallback);
44599         } else {
44600           didResultInNoChanges();
44601         }
44602       }
44603     }
44604     function uploadCallback(err, changeset) {
44605       if (err) {
44606         if (err.status === 409) {
44607           uploader.save(changeset, true, true);
44608         } else {
44609           _errors.push({
44610             msg: err.message || err.responseText,
44611             details: [_t("save.status_code", { code: err.status })]
44612           });
44613           didResultInErrors();
44614         }
44615       } else {
44616         didResultInSuccess(changeset);
44617       }
44618     }
44619     function didResultInNoChanges() {
44620       dispatch10.call("resultNoChanges", this);
44621       endSave();
44622       context.flush();
44623     }
44624     function didResultInErrors() {
44625       context.history().pop();
44626       dispatch10.call("resultErrors", this, _errors);
44627       endSave();
44628     }
44629     function didResultInConflicts(changeset) {
44630       _conflicts.sort(function(a, b) {
44631         return b.id.localeCompare(a.id);
44632       });
44633       dispatch10.call("resultConflicts", this, changeset, _conflicts, _origChanges);
44634       endSave();
44635     }
44636     function didResultInSuccess(changeset) {
44637       context.history().clearSaved();
44638       dispatch10.call("resultSuccess", this, changeset);
44639       window.setTimeout(function() {
44640         endSave();
44641         context.flush();
44642       }, 2500);
44643     }
44644     function endSave() {
44645       _isSaving = false;
44646       dispatch10.call("saveEnded", this);
44647     }
44648     uploader.cancelConflictResolution = function() {
44649       context.history().pop();
44650     };
44651     uploader.processResolvedConflicts = function(changeset) {
44652       var history = context.history();
44653       for (var i2 = 0; i2 < _conflicts.length; i2++) {
44654         if (_conflicts[i2].chosen === 1) {
44655           var entity = context.hasEntity(_conflicts[i2].id);
44656           if (entity && entity.type === "way") {
44657             var children2 = utilArrayUniq(entity.nodes);
44658             for (var j2 = 0; j2 < children2.length; j2++) {
44659               history.replace(actionRevert(children2[j2]));
44660             }
44661           }
44662           history.replace(actionRevert(_conflicts[i2].id));
44663         }
44664       }
44665       uploader.save(changeset, true, false);
44666     };
44667     uploader.reset = function() {
44668     };
44669     return uploader;
44670   }
44671
44672   // modules/renderer/background_source.js
44673   var import_lodash2 = __toESM(require_lodash());
44674
44675   // modules/util/IntervalTasksQueue.js
44676   var IntervalTasksQueue = class {
44677     /**
44678      * Interval in milliseconds inside which only 1 task can execute.
44679      * e.g. if interval is 200ms, and 5 async tasks are unqueued,
44680      * they will complete in ~1s if not cleared
44681      * @param {number} intervalInMs
44682      */
44683     constructor(intervalInMs) {
44684       this.intervalInMs = intervalInMs;
44685       this.pendingHandles = [];
44686       this.time = 0;
44687     }
44688     enqueue(task) {
44689       let taskTimeout = this.time;
44690       this.time += this.intervalInMs;
44691       this.pendingHandles.push(setTimeout(() => {
44692         this.time -= this.intervalInMs;
44693         task();
44694       }, taskTimeout));
44695     }
44696     clear() {
44697       this.pendingHandles.forEach((timeoutHandle) => {
44698         clearTimeout(timeoutHandle);
44699       });
44700       this.pendingHandles = [];
44701       this.time = 0;
44702     }
44703   };
44704
44705   // modules/renderer/background_source.js
44706   var isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
44707   window.matchMedia(`
44708         (-webkit-min-device-pixel-ratio: 2), /* Safari */
44709         (min-resolution: 2dppx),             /* standard */
44710         (min-resolution: 192dpi)             /* fallback */
44711     `).addListener(function() {
44712     isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
44713   });
44714   function localeDateString(s) {
44715     if (!s)
44716       return null;
44717     var options2 = { day: "numeric", month: "short", year: "numeric" };
44718     var d = new Date(s);
44719     if (isNaN(d.getTime()))
44720       return null;
44721     return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
44722   }
44723   function vintageRange(vintage) {
44724     var s;
44725     if (vintage.start || vintage.end) {
44726       s = vintage.start || "?";
44727       if (vintage.start !== vintage.end) {
44728         s += " - " + (vintage.end || "?");
44729       }
44730     }
44731     return s;
44732   }
44733   function rendererBackgroundSource(data) {
44734     var source = Object.assign({}, data);
44735     var _offset = [0, 0];
44736     var _name = source.name;
44737     var _description = source.description;
44738     var _best = !!source.best;
44739     var _template = source.encrypted ? utilAesDecrypt(source.template) : source.template;
44740     source.tileSize = data.tileSize || 256;
44741     source.zoomExtent = data.zoomExtent || [0, 22];
44742     source.overzoom = data.overzoom !== false;
44743     source.offset = function(val) {
44744       if (!arguments.length)
44745         return _offset;
44746       _offset = val;
44747       return source;
44748     };
44749     source.nudge = function(val, zoomlevel) {
44750       _offset[0] += val[0] / Math.pow(2, zoomlevel);
44751       _offset[1] += val[1] / Math.pow(2, zoomlevel);
44752       return source;
44753     };
44754     source.name = function() {
44755       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
44756       return _t("imagery." + id_safe + ".name", { default: (0, import_lodash2.escape)(_name) });
44757     };
44758     source.label = function() {
44759       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
44760       return _t.append("imagery." + id_safe + ".name", { default: (0, import_lodash2.escape)(_name) });
44761     };
44762     source.hasDescription = function() {
44763       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
44764       var descriptionText = _mainLocalizer.tInfo("imagery." + id_safe + ".description", { default: (0, import_lodash2.escape)(_description) }).text;
44765       return descriptionText !== "";
44766     };
44767     source.description = function() {
44768       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
44769       return _t.append("imagery." + id_safe + ".description", { default: (0, import_lodash2.escape)(_description) });
44770     };
44771     source.best = function() {
44772       return _best;
44773     };
44774     source.area = function() {
44775       if (!data.polygon)
44776         return Number.MAX_VALUE;
44777       var area = area_default({ type: "MultiPolygon", coordinates: [data.polygon] });
44778       return isNaN(area) ? 0 : area;
44779     };
44780     source.imageryUsed = function() {
44781       return _name || source.id;
44782     };
44783     source.template = function(val) {
44784       if (!arguments.length)
44785         return _template;
44786       if (source.id === "custom" || source.id === "Bing") {
44787         _template = val;
44788       }
44789       return source;
44790     };
44791     source.url = function(coord2) {
44792       var result = _template.replace(/#[\s\S]*/u, "");
44793       if (result === "")
44794         return result;
44795       if (!source.type || source.id === "custom") {
44796         if (/SERVICE=WMS|\{(proj|wkid|bbox)\}/.test(result)) {
44797           source.type = "wms";
44798           source.projection = "EPSG:3857";
44799         } else if (/\{(x|y)\}/.test(result)) {
44800           source.type = "tms";
44801         } else if (/\{u\}/.test(result)) {
44802           source.type = "bing";
44803         }
44804       }
44805       if (source.type === "wms") {
44806         var tileToProjectedCoords = function(x, y, z) {
44807           var zoomSize = Math.pow(2, z);
44808           var lon = x / zoomSize * Math.PI * 2 - Math.PI;
44809           var lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / zoomSize)));
44810           switch (source.projection) {
44811             case "EPSG:4326":
44812               return {
44813                 x: lon * 180 / Math.PI,
44814                 y: lat * 180 / Math.PI
44815               };
44816             default:
44817               var mercCoords = mercatorRaw(lon, lat);
44818               return {
44819                 x: 2003750834e-2 / Math.PI * mercCoords[0],
44820                 y: 2003750834e-2 / Math.PI * mercCoords[1]
44821               };
44822           }
44823         };
44824         var tileSize = source.tileSize;
44825         var projection2 = source.projection;
44826         var minXmaxY = tileToProjectedCoords(coord2[0], coord2[1], coord2[2]);
44827         var maxXminY = tileToProjectedCoords(coord2[0] + 1, coord2[1] + 1, coord2[2]);
44828         result = result.replace(/\{(\w+)\}/g, function(token, key) {
44829           switch (key) {
44830             case "width":
44831             case "height":
44832               return tileSize;
44833             case "proj":
44834               return projection2;
44835             case "wkid":
44836               return projection2.replace(/^EPSG:/, "");
44837             case "bbox":
44838               if (projection2 === "EPSG:4326" && // The CRS parameter implies version 1.3 (prior versions use SRS)
44839               /VERSION=1.3|CRS={proj}/.test(source.template().toUpperCase())) {
44840                 return maxXminY.y + "," + minXmaxY.x + "," + minXmaxY.y + "," + maxXminY.x;
44841               } else {
44842                 return minXmaxY.x + "," + maxXminY.y + "," + maxXminY.x + "," + minXmaxY.y;
44843               }
44844             case "w":
44845               return minXmaxY.x;
44846             case "s":
44847               return maxXminY.y;
44848             case "n":
44849               return maxXminY.x;
44850             case "e":
44851               return minXmaxY.y;
44852             default:
44853               return token;
44854           }
44855         });
44856       } else if (source.type === "tms") {
44857         result = result.replace("{x}", coord2[0]).replace("{y}", coord2[1]).replace(/\{[t-]y\}/, Math.pow(2, coord2[2]) - coord2[1] - 1).replace(/\{z(oom)?\}/, coord2[2]).replace(/\{@2x\}|\{r\}/, isRetina ? "@2x" : "");
44858       } else if (source.type === "bing") {
44859         result = result.replace("{u}", function() {
44860           var u = "";
44861           for (var zoom = coord2[2]; zoom > 0; zoom--) {
44862             var b = 0;
44863             var mask = 1 << zoom - 1;
44864             if ((coord2[0] & mask) !== 0)
44865               b++;
44866             if ((coord2[1] & mask) !== 0)
44867               b += 2;
44868             u += b.toString();
44869           }
44870           return u;
44871         });
44872       }
44873       result = result.replace(/\{switch:([^}]+)\}/, function(s, r) {
44874         var subdomains = r.split(",");
44875         return subdomains[(coord2[0] + coord2[1]) % subdomains.length];
44876       });
44877       return result;
44878     };
44879     source.validZoom = function(z) {
44880       return source.zoomExtent[0] <= z && (source.overzoom || source.zoomExtent[1] > z);
44881     };
44882     source.isLocatorOverlay = function() {
44883       return source.id === "mapbox_locator_overlay";
44884     };
44885     source.isHidden = function() {
44886       return source.id === "DigitalGlobe-Premium-vintage" || source.id === "DigitalGlobe-Standard-vintage";
44887     };
44888     source.copyrightNotices = function() {
44889     };
44890     source.getMetadata = function(center, tileCoord, callback) {
44891       var vintage = {
44892         start: localeDateString(source.startDate),
44893         end: localeDateString(source.endDate)
44894       };
44895       vintage.range = vintageRange(vintage);
44896       var metadata = { vintage };
44897       callback(null, metadata);
44898     };
44899     return source;
44900   }
44901   rendererBackgroundSource.Bing = function(data, dispatch10) {
44902     data.template = "https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=1&pr=odbl&n=z";
44903     var bing = rendererBackgroundSource(data);
44904     var key = utilAesDecrypt("5c875730b09c6b422433e807e1ff060b6536c791dbfffcffc4c6b18a1bdba1f14593d151adb50e19e1be1ab19aef813bf135d0f103475e5c724dec94389e45d0");
44905     const strictParam = "n";
44906     var url = "https://dev.virtualearth.net/REST/v1/Imagery/Metadata/AerialOSM?include=ImageryProviders&uriScheme=https&key=" + key;
44907     var cache = {};
44908     var inflight = {};
44909     var providers = [];
44910     var taskQueue = new IntervalTasksQueue(250);
44911     var metadataLastZoom = -1;
44912     json_default(url).then(function(json) {
44913       let imageryResource = json.resourceSets[0].resources[0];
44914       let template = imageryResource.imageUrl;
44915       let subDomains = imageryResource.imageUrlSubdomains;
44916       let subDomainNumbers = subDomains.map((subDomain) => {
44917         return subDomain.substring(1);
44918       }).join(",");
44919       template = template.replace("{subdomain}", `t{switch:${subDomainNumbers}}`).replace("{quadkey}", "{u}");
44920       if (!new URLSearchParams(template).has(strictParam)) {
44921         template += `&${strictParam}=z`;
44922       }
44923       bing.template(template);
44924       providers = imageryResource.imageryProviders.map(function(provider) {
44925         return {
44926           attribution: provider.attribution,
44927           areas: provider.coverageAreas.map(function(area) {
44928             return {
44929               zoom: [area.zoomMin, area.zoomMax],
44930               extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
44931             };
44932           })
44933         };
44934       });
44935       dispatch10.call("change");
44936     }).catch(function() {
44937     });
44938     bing.copyrightNotices = function(zoom, extent) {
44939       zoom = Math.min(zoom, 21);
44940       return providers.filter(function(provider) {
44941         return provider.areas.some(function(area) {
44942           return extent.intersects(area.extent) && area.zoom[0] <= zoom && area.zoom[1] >= zoom;
44943         });
44944       }).map(function(provider) {
44945         return provider.attribution;
44946       }).join(", ");
44947     };
44948     bing.getMetadata = function(center, tileCoord, callback) {
44949       var tileID = tileCoord.slice(0, 3).join("/");
44950       var zoom = Math.min(tileCoord[2], 21);
44951       var centerPoint = center[1] + "," + center[0];
44952       var url2 = "https://dev.virtualearth.net/REST/v1/Imagery/BasicMetadata/AerialOSM/" + centerPoint + "?zl=" + zoom + "&key=" + key;
44953       if (inflight[tileID])
44954         return;
44955       if (!cache[tileID]) {
44956         cache[tileID] = {};
44957       }
44958       if (cache[tileID] && cache[tileID].metadata) {
44959         return callback(null, cache[tileID].metadata);
44960       }
44961       inflight[tileID] = true;
44962       if (metadataLastZoom !== tileCoord[2]) {
44963         metadataLastZoom = tileCoord[2];
44964         taskQueue.clear();
44965       }
44966       taskQueue.enqueue(() => {
44967         json_default(url2).then(function(result) {
44968           delete inflight[tileID];
44969           if (!result) {
44970             throw new Error("Unknown Error");
44971           }
44972           var vintage = {
44973             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
44974             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
44975           };
44976           vintage.range = vintageRange(vintage);
44977           var metadata = { vintage };
44978           cache[tileID].metadata = metadata;
44979           if (callback)
44980             callback(null, metadata);
44981         }).catch(function(err) {
44982           delete inflight[tileID];
44983           if (callback)
44984             callback(err.message);
44985         });
44986       });
44987     };
44988     bing.terms_url = "https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details";
44989     return bing;
44990   };
44991   rendererBackgroundSource.Esri = function(data) {
44992     if (data.template.match(/blankTile/) === null) {
44993       data.template = data.template + "?blankTile=false";
44994     }
44995     var esri = rendererBackgroundSource(data);
44996     var cache = {};
44997     var inflight = {};
44998     var _prevCenter;
44999     esri.fetchTilemap = function(center) {
45000       if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5e3)
45001         return;
45002       _prevCenter = center;
45003       var z = 20;
45004       var dummyUrl = esri.url([1, 2, 3]);
45005       var x = Math.floor((center[0] + 180) / 360 * Math.pow(2, z));
45006       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));
45007       var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, "tilemap") + "/" + z + "/" + y + "/" + x + "/8/8";
45008       json_default(tilemapUrl).then(function(tilemap) {
45009         if (!tilemap) {
45010           throw new Error("Unknown Error");
45011         }
45012         var hasTiles = true;
45013         for (var i2 = 0; i2 < tilemap.data.length; i2++) {
45014           if (!tilemap.data[i2]) {
45015             hasTiles = false;
45016             break;
45017           }
45018         }
45019         esri.zoomExtent[1] = hasTiles ? 22 : 19;
45020       }).catch(function() {
45021       });
45022     };
45023     esri.getMetadata = function(center, tileCoord, callback) {
45024       if (esri.id !== "EsriWorldImagery") {
45025         return callback(null, {});
45026       }
45027       var tileID = tileCoord.slice(0, 3).join("/");
45028       var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
45029       var centerPoint = center[0] + "," + center[1];
45030       var unknown = _t("info_panels.background.unknown");
45031       var vintage = {};
45032       var metadata = {};
45033       if (inflight[tileID])
45034         return;
45035       var url = "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/4/query";
45036       url += "?returnGeometry=false&geometry=" + centerPoint + "&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json";
45037       if (!cache[tileID]) {
45038         cache[tileID] = {};
45039       }
45040       if (cache[tileID] && cache[tileID].metadata) {
45041         return callback(null, cache[tileID].metadata);
45042       }
45043       inflight[tileID] = true;
45044       json_default(url).then(function(result) {
45045         delete inflight[tileID];
45046         result = result.features.map((f2) => f2.attributes).filter((a) => a.MinMapLevel <= zoom && a.MaxMapLevel >= zoom)[0];
45047         if (!result) {
45048           throw new Error("Unknown Error");
45049         } else if (result.features && result.features.length < 1) {
45050           throw new Error("No Results");
45051         } else if (result.error && result.error.message) {
45052           throw new Error(result.error.message);
45053         }
45054         var captureDate = localeDateString(result.SRC_DATE2);
45055         vintage = {
45056           start: captureDate,
45057           end: captureDate,
45058           range: captureDate
45059         };
45060         metadata = {
45061           vintage,
45062           source: clean2(result.NICE_NAME),
45063           description: clean2(result.NICE_DESC),
45064           resolution: clean2(+Number(result.SRC_RES).toFixed(4)),
45065           accuracy: clean2(+Number(result.SRC_ACC).toFixed(4))
45066         };
45067         if (isFinite(metadata.resolution)) {
45068           metadata.resolution += " m";
45069         }
45070         if (isFinite(metadata.accuracy)) {
45071           metadata.accuracy += " m";
45072         }
45073         cache[tileID].metadata = metadata;
45074         if (callback)
45075           callback(null, metadata);
45076       }).catch(function(err) {
45077         delete inflight[tileID];
45078         if (callback)
45079           callback(err.message);
45080       });
45081       function clean2(val) {
45082         return String(val).trim() || unknown;
45083       }
45084     };
45085     return esri;
45086   };
45087   rendererBackgroundSource.None = function() {
45088     var source = rendererBackgroundSource({ id: "none", template: "" });
45089     source.name = function() {
45090       return _t("background.none");
45091     };
45092     source.label = function() {
45093       return _t.append("background.none");
45094     };
45095     source.imageryUsed = function() {
45096       return null;
45097     };
45098     source.area = function() {
45099       return -1;
45100     };
45101     return source;
45102   };
45103   rendererBackgroundSource.Custom = function(template) {
45104     var source = rendererBackgroundSource({ id: "custom", template });
45105     source.name = function() {
45106       return _t("background.custom");
45107     };
45108     source.label = function() {
45109       return _t.append("background.custom");
45110     };
45111     source.imageryUsed = function() {
45112       var cleaned = source.template();
45113       if (cleaned.indexOf("?") !== -1) {
45114         var parts = cleaned.split("?", 2);
45115         var qs = utilStringQs(parts[1]);
45116         ["access_token", "connectId", "token"].forEach(function(param) {
45117           if (qs[param]) {
45118             qs[param] = "{apikey}";
45119           }
45120         });
45121         cleaned = parts[0] + "?" + utilQsString(qs, true);
45122       }
45123       cleaned = cleaned.replace(/token\/(\w+)/, "token/{apikey}").replace(/key=(\w+)/, "key={apikey}");
45124       return "Custom (" + cleaned + " )";
45125     };
45126     source.area = function() {
45127       return -2;
45128     };
45129     return source;
45130   };
45131
45132   // node_modules/@turf/helpers/dist/es/index.js
45133   var earthRadius = 63710088e-1;
45134   var factors = {
45135     centimeters: earthRadius * 100,
45136     centimetres: earthRadius * 100,
45137     degrees: earthRadius / 111325,
45138     feet: earthRadius * 3.28084,
45139     inches: earthRadius * 39.37,
45140     kilometers: earthRadius / 1e3,
45141     kilometres: earthRadius / 1e3,
45142     meters: earthRadius,
45143     metres: earthRadius,
45144     miles: earthRadius / 1609.344,
45145     millimeters: earthRadius * 1e3,
45146     millimetres: earthRadius * 1e3,
45147     nauticalmiles: earthRadius / 1852,
45148     radians: 1,
45149     yards: earthRadius * 1.0936
45150   };
45151   var unitsFactors = {
45152     centimeters: 100,
45153     centimetres: 100,
45154     degrees: 1 / 111325,
45155     feet: 3.28084,
45156     inches: 39.37,
45157     kilometers: 1 / 1e3,
45158     kilometres: 1 / 1e3,
45159     meters: 1,
45160     metres: 1,
45161     miles: 1 / 1609.344,
45162     millimeters: 1e3,
45163     millimetres: 1e3,
45164     nauticalmiles: 1 / 1852,
45165     radians: 1 / earthRadius,
45166     yards: 1.0936133
45167   };
45168   function feature2(geom, properties, options2) {
45169     if (options2 === void 0) {
45170       options2 = {};
45171     }
45172     var feat = { type: "Feature" };
45173     if (options2.id === 0 || options2.id) {
45174       feat.id = options2.id;
45175     }
45176     if (options2.bbox) {
45177       feat.bbox = options2.bbox;
45178     }
45179     feat.properties = properties || {};
45180     feat.geometry = geom;
45181     return feat;
45182   }
45183   function polygon(coordinates, properties, options2) {
45184     if (options2 === void 0) {
45185       options2 = {};
45186     }
45187     for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
45188       var ring = coordinates_1[_i];
45189       if (ring.length < 4) {
45190         throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
45191       }
45192       for (var j2 = 0; j2 < ring[ring.length - 1].length; j2++) {
45193         if (ring[ring.length - 1][j2] !== ring[0][j2]) {
45194           throw new Error("First and last Position are not equivalent.");
45195         }
45196       }
45197     }
45198     var geom = {
45199       type: "Polygon",
45200       coordinates
45201     };
45202     return feature2(geom, properties, options2);
45203   }
45204   function lineString(coordinates, properties, options2) {
45205     if (options2 === void 0) {
45206       options2 = {};
45207     }
45208     if (coordinates.length < 2) {
45209       throw new Error("coordinates must be an array of two or more positions");
45210     }
45211     var geom = {
45212       type: "LineString",
45213       coordinates
45214     };
45215     return feature2(geom, properties, options2);
45216   }
45217   function multiLineString(coordinates, properties, options2) {
45218     if (options2 === void 0) {
45219       options2 = {};
45220     }
45221     var geom = {
45222       type: "MultiLineString",
45223       coordinates
45224     };
45225     return feature2(geom, properties, options2);
45226   }
45227   function multiPolygon(coordinates, properties, options2) {
45228     if (options2 === void 0) {
45229       options2 = {};
45230     }
45231     var geom = {
45232       type: "MultiPolygon",
45233       coordinates
45234     };
45235     return feature2(geom, properties, options2);
45236   }
45237
45238   // node_modules/@turf/invariant/dist/es/index.js
45239   function getGeom(geojson) {
45240     if (geojson.type === "Feature") {
45241       return geojson.geometry;
45242     }
45243     return geojson;
45244   }
45245
45246   // node_modules/@turf/bbox-clip/dist/es/lib/lineclip.js
45247   function lineclip(points, bbox2, result) {
45248     var len = points.length, codeA = bitCode(points[0], bbox2), part = [], i2, codeB, lastCode;
45249     var a;
45250     var b;
45251     if (!result)
45252       result = [];
45253     for (i2 = 1; i2 < len; i2++) {
45254       a = points[i2 - 1];
45255       b = points[i2];
45256       codeB = lastCode = bitCode(b, bbox2);
45257       while (true) {
45258         if (!(codeA | codeB)) {
45259           part.push(a);
45260           if (codeB !== lastCode) {
45261             part.push(b);
45262             if (i2 < len - 1) {
45263               result.push(part);
45264               part = [];
45265             }
45266           } else if (i2 === len - 1) {
45267             part.push(b);
45268           }
45269           break;
45270         } else if (codeA & codeB) {
45271           break;
45272         } else if (codeA) {
45273           a = intersect(a, b, codeA, bbox2);
45274           codeA = bitCode(a, bbox2);
45275         } else {
45276           b = intersect(a, b, codeB, bbox2);
45277           codeB = bitCode(b, bbox2);
45278         }
45279       }
45280       codeA = lastCode;
45281     }
45282     if (part.length)
45283       result.push(part);
45284     return result;
45285   }
45286   function polygonclip(points, bbox2) {
45287     var result, edge, prev, prevInside, i2, p, inside;
45288     for (edge = 1; edge <= 8; edge *= 2) {
45289       result = [];
45290       prev = points[points.length - 1];
45291       prevInside = !(bitCode(prev, bbox2) & edge);
45292       for (i2 = 0; i2 < points.length; i2++) {
45293         p = points[i2];
45294         inside = !(bitCode(p, bbox2) & edge);
45295         if (inside !== prevInside)
45296           result.push(intersect(prev, p, edge, bbox2));
45297         if (inside)
45298           result.push(p);
45299         prev = p;
45300         prevInside = inside;
45301       }
45302       points = result;
45303       if (!points.length)
45304         break;
45305     }
45306     return result;
45307   }
45308   function intersect(a, b, edge, bbox2) {
45309     return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox2[3] - a[1]) / (b[1] - a[1]), bbox2[3]] : edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox2[1] - a[1]) / (b[1] - a[1]), bbox2[1]] : edge & 2 ? [bbox2[2], a[1] + (b[1] - a[1]) * (bbox2[2] - a[0]) / (b[0] - a[0])] : edge & 1 ? [bbox2[0], a[1] + (b[1] - a[1]) * (bbox2[0] - a[0]) / (b[0] - a[0])] : null;
45310   }
45311   function bitCode(p, bbox2) {
45312     var code = 0;
45313     if (p[0] < bbox2[0])
45314       code |= 1;
45315     else if (p[0] > bbox2[2])
45316       code |= 2;
45317     if (p[1] < bbox2[1])
45318       code |= 4;
45319     else if (p[1] > bbox2[3])
45320       code |= 8;
45321     return code;
45322   }
45323
45324   // node_modules/@turf/bbox-clip/dist/es/index.js
45325   function bboxClip(feature3, bbox2) {
45326     var geom = getGeom(feature3);
45327     var type2 = geom.type;
45328     var properties = feature3.type === "Feature" ? feature3.properties : {};
45329     var coords = geom.coordinates;
45330     switch (type2) {
45331       case "LineString":
45332       case "MultiLineString": {
45333         var lines_1 = [];
45334         if (type2 === "LineString") {
45335           coords = [coords];
45336         }
45337         coords.forEach(function(line) {
45338           lineclip(line, bbox2, lines_1);
45339         });
45340         if (lines_1.length === 1) {
45341           return lineString(lines_1[0], properties);
45342         }
45343         return multiLineString(lines_1, properties);
45344       }
45345       case "Polygon":
45346         return polygon(clipPolygon(coords, bbox2), properties);
45347       case "MultiPolygon":
45348         return multiPolygon(coords.map(function(poly) {
45349           return clipPolygon(poly, bbox2);
45350         }), properties);
45351       default:
45352         throw new Error("geometry " + type2 + " not supported");
45353     }
45354   }
45355   function clipPolygon(rings, bbox2) {
45356     var outRings = [];
45357     for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
45358       var ring = rings_1[_i];
45359       var clipped = polygonclip(ring, bbox2);
45360       if (clipped.length > 0) {
45361         if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
45362           clipped.push(clipped[0]);
45363         }
45364         if (clipped.length >= 4) {
45365           outRings.push(clipped);
45366         }
45367       }
45368     }
45369     return outRings;
45370   }
45371
45372   // node_modules/@turf/meta/dist/es/index.js
45373   function coordEach(geojson, callback, excludeWrapCoord) {
45374     if (geojson === null)
45375       return;
45376     var j2, k, l, geometry, stopG, coords, geometryMaybeCollection, wrapShrink = 0, coordIndex = 0, isGeometryCollection, type2 = geojson.type, isFeatureCollection = type2 === "FeatureCollection", isFeature = type2 === "Feature", stop = isFeatureCollection ? geojson.features.length : 1;
45377     for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
45378       geometryMaybeCollection = isFeatureCollection ? geojson.features[featureIndex].geometry : isFeature ? geojson.geometry : geojson;
45379       isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === "GeometryCollection" : false;
45380       stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
45381       for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
45382         var multiFeatureIndex = 0;
45383         var geometryIndex = 0;
45384         geometry = isGeometryCollection ? geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
45385         if (geometry === null)
45386           continue;
45387         coords = geometry.coordinates;
45388         var geomType = geometry.type;
45389         wrapShrink = excludeWrapCoord && (geomType === "Polygon" || geomType === "MultiPolygon") ? 1 : 0;
45390         switch (geomType) {
45391           case null:
45392             break;
45393           case "Point":
45394             if (callback(
45395               coords,
45396               coordIndex,
45397               featureIndex,
45398               multiFeatureIndex,
45399               geometryIndex
45400             ) === false)
45401               return false;
45402             coordIndex++;
45403             multiFeatureIndex++;
45404             break;
45405           case "LineString":
45406           case "MultiPoint":
45407             for (j2 = 0; j2 < coords.length; j2++) {
45408               if (callback(
45409                 coords[j2],
45410                 coordIndex,
45411                 featureIndex,
45412                 multiFeatureIndex,
45413                 geometryIndex
45414               ) === false)
45415                 return false;
45416               coordIndex++;
45417               if (geomType === "MultiPoint")
45418                 multiFeatureIndex++;
45419             }
45420             if (geomType === "LineString")
45421               multiFeatureIndex++;
45422             break;
45423           case "Polygon":
45424           case "MultiLineString":
45425             for (j2 = 0; j2 < coords.length; j2++) {
45426               for (k = 0; k < coords[j2].length - wrapShrink; k++) {
45427                 if (callback(
45428                   coords[j2][k],
45429                   coordIndex,
45430                   featureIndex,
45431                   multiFeatureIndex,
45432                   geometryIndex
45433                 ) === false)
45434                   return false;
45435                 coordIndex++;
45436               }
45437               if (geomType === "MultiLineString")
45438                 multiFeatureIndex++;
45439               if (geomType === "Polygon")
45440                 geometryIndex++;
45441             }
45442             if (geomType === "Polygon")
45443               multiFeatureIndex++;
45444             break;
45445           case "MultiPolygon":
45446             for (j2 = 0; j2 < coords.length; j2++) {
45447               geometryIndex = 0;
45448               for (k = 0; k < coords[j2].length; k++) {
45449                 for (l = 0; l < coords[j2][k].length - wrapShrink; l++) {
45450                   if (callback(
45451                     coords[j2][k][l],
45452                     coordIndex,
45453                     featureIndex,
45454                     multiFeatureIndex,
45455                     geometryIndex
45456                   ) === false)
45457                     return false;
45458                   coordIndex++;
45459                 }
45460                 geometryIndex++;
45461               }
45462               multiFeatureIndex++;
45463             }
45464             break;
45465           case "GeometryCollection":
45466             for (j2 = 0; j2 < geometry.geometries.length; j2++)
45467               if (coordEach(geometry.geometries[j2], callback, excludeWrapCoord) === false)
45468                 return false;
45469             break;
45470           default:
45471             throw new Error("Unknown Geometry Type");
45472         }
45473       }
45474     }
45475   }
45476
45477   // node_modules/@turf/bbox/dist/es/index.js
45478   function bbox(geojson) {
45479     var result = [Infinity, Infinity, -Infinity, -Infinity];
45480     coordEach(geojson, function(coord2) {
45481       if (result[0] > coord2[0]) {
45482         result[0] = coord2[0];
45483       }
45484       if (result[1] > coord2[1]) {
45485         result[1] = coord2[1];
45486       }
45487       if (result[2] < coord2[0]) {
45488         result[2] = coord2[0];
45489       }
45490       if (result[3] < coord2[1]) {
45491         result[3] = coord2[1];
45492       }
45493     });
45494     return result;
45495   }
45496   bbox["default"] = bbox;
45497   var es_default = bbox;
45498
45499   // modules/renderer/background.js
45500   var import_which_polygon4 = __toESM(require_which_polygon());
45501
45502   // modules/renderer/tile_layer.js
45503   function rendererTileLayer(context) {
45504     var transformProp = utilPrefixCSSProperty("Transform");
45505     var tiler8 = utilTiler();
45506     var _tileSize = 256;
45507     var _projection;
45508     var _cache4 = {};
45509     var _tileOrigin;
45510     var _zoom;
45511     var _source;
45512     function tileSizeAtZoom(d, z) {
45513       var EPSILON = 2e-3;
45514       return _tileSize * Math.pow(2, z - d[2]) / _tileSize + EPSILON;
45515     }
45516     function atZoom(t, distance) {
45517       var power = Math.pow(2, distance);
45518       return [
45519         Math.floor(t[0] * power),
45520         Math.floor(t[1] * power),
45521         t[2] + distance
45522       ];
45523     }
45524     function lookUp(d) {
45525       for (var up = -1; up > -d[2]; up--) {
45526         var tile = atZoom(d, up);
45527         if (_cache4[_source.url(tile)] !== false) {
45528           return tile;
45529         }
45530       }
45531     }
45532     function uniqueBy(a, n2) {
45533       var o = [];
45534       var seen = {};
45535       for (var i2 = 0; i2 < a.length; i2++) {
45536         if (seen[a[i2][n2]] === void 0) {
45537           o.push(a[i2]);
45538           seen[a[i2][n2]] = true;
45539         }
45540       }
45541       return o;
45542     }
45543     function addSource(d) {
45544       d.push(_source.url(d));
45545       return d;
45546     }
45547     function background(selection2) {
45548       _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
45549       var pixelOffset;
45550       if (_source) {
45551         pixelOffset = [
45552           _source.offset()[0] * Math.pow(2, _zoom),
45553           _source.offset()[1] * Math.pow(2, _zoom)
45554         ];
45555       } else {
45556         pixelOffset = [0, 0];
45557       }
45558       var translate = [
45559         _projection.translate()[0] + pixelOffset[0],
45560         _projection.translate()[1] + pixelOffset[1]
45561       ];
45562       tiler8.scale(_projection.scale() * 2 * Math.PI).translate(translate);
45563       _tileOrigin = [
45564         _projection.scale() * Math.PI - translate[0],
45565         _projection.scale() * Math.PI - translate[1]
45566       ];
45567       render(selection2);
45568     }
45569     function render(selection2) {
45570       if (!_source)
45571         return;
45572       var requests = [];
45573       var showDebug = context.getDebug("tile") && !_source.overlay;
45574       if (_source.validZoom(_zoom)) {
45575         tiler8.skipNullIsland(!!_source.overlay);
45576         tiler8().forEach(function(d) {
45577           addSource(d);
45578           if (d[3] === "")
45579             return;
45580           if (typeof d[3] !== "string")
45581             return;
45582           requests.push(d);
45583           if (_cache4[d[3]] === false && lookUp(d)) {
45584             requests.push(addSource(lookUp(d)));
45585           }
45586         });
45587         requests = uniqueBy(requests, 3).filter(function(r) {
45588           return _cache4[r[3]] !== false;
45589         });
45590       }
45591       function load(d3_event, d) {
45592         _cache4[d[3]] = true;
45593         select_default2(this).on("error", null).on("load", null).classed("tile-loaded", true);
45594         render(selection2);
45595       }
45596       function error(d3_event, d) {
45597         _cache4[d[3]] = false;
45598         select_default2(this).on("error", null).on("load", null).remove();
45599         render(selection2);
45600       }
45601       function imageTransform(d) {
45602         var ts = _tileSize * Math.pow(2, _zoom - d[2]);
45603         var scale = tileSizeAtZoom(d, _zoom);
45604         return "translate(" + (d[0] * ts - _tileOrigin[0]) + "px," + (d[1] * ts - _tileOrigin[1]) + "px) scale(" + scale + "," + scale + ")";
45605       }
45606       function tileCenter(d) {
45607         var ts = _tileSize * Math.pow(2, _zoom - d[2]);
45608         return [
45609           d[0] * ts - _tileOrigin[0] + ts / 2,
45610           d[1] * ts - _tileOrigin[1] + ts / 2
45611         ];
45612       }
45613       function debugTransform(d) {
45614         var coord2 = tileCenter(d);
45615         return "translate(" + coord2[0] + "px," + coord2[1] + "px)";
45616       }
45617       var dims = tiler8.size();
45618       var mapCenter = [dims[0] / 2, dims[1] / 2];
45619       var minDist = Math.max(dims[0], dims[1]);
45620       var nearCenter;
45621       requests.forEach(function(d) {
45622         var c = tileCenter(d);
45623         var dist = geoVecLength(c, mapCenter);
45624         if (dist < minDist) {
45625           minDist = dist;
45626           nearCenter = d;
45627         }
45628       });
45629       var image = selection2.selectAll("img").data(requests, function(d) {
45630         return d[3];
45631       });
45632       image.exit().style(transformProp, imageTransform).classed("tile-removing", true).classed("tile-center", false).each(function() {
45633         var tile = select_default2(this);
45634         window.setTimeout(function() {
45635           if (tile.classed("tile-removing")) {
45636             tile.remove();
45637           }
45638         }, 300);
45639       });
45640       image.enter().append("img").attr("class", "tile").attr("alt", "").attr("draggable", "false").style("width", _tileSize + "px").style("height", _tileSize + "px").attr("src", function(d) {
45641         return d[3];
45642       }).on("error", error).on("load", load).merge(image).style(transformProp, imageTransform).classed("tile-debug", showDebug).classed("tile-removing", false).classed("tile-center", function(d) {
45643         return d === nearCenter;
45644       });
45645       var debug2 = selection2.selectAll(".tile-label-debug").data(showDebug ? requests : [], function(d) {
45646         return d[3];
45647       });
45648       debug2.exit().remove();
45649       if (showDebug) {
45650         var debugEnter = debug2.enter().append("div").attr("class", "tile-label-debug");
45651         debugEnter.append("div").attr("class", "tile-label-debug-coord");
45652         debugEnter.append("div").attr("class", "tile-label-debug-vintage");
45653         debug2 = debug2.merge(debugEnter);
45654         debug2.style(transformProp, debugTransform);
45655         debug2.selectAll(".tile-label-debug-coord").text(function(d) {
45656           return d[2] + " / " + d[0] + " / " + d[1];
45657         });
45658         debug2.selectAll(".tile-label-debug-vintage").each(function(d) {
45659           var span = select_default2(this);
45660           var center = context.projection.invert(tileCenter(d));
45661           _source.getMetadata(center, d, function(err, result) {
45662             if (result && result.vintage && result.vintage.range) {
45663               span.text(result.vintage.range);
45664             } else {
45665               span.text("");
45666               span.call(_t.append("info_panels.background.vintage"));
45667               span.append("span").text(": ");
45668               span.call(_t.append("info_panels.background.unknown"));
45669             }
45670           });
45671         });
45672       }
45673     }
45674     background.projection = function(val) {
45675       if (!arguments.length)
45676         return _projection;
45677       _projection = val;
45678       return background;
45679     };
45680     background.dimensions = function(val) {
45681       if (!arguments.length)
45682         return tiler8.size();
45683       tiler8.size(val);
45684       return background;
45685     };
45686     background.source = function(val) {
45687       if (!arguments.length)
45688         return _source;
45689       _source = val;
45690       _tileSize = _source.tileSize;
45691       _cache4 = {};
45692       tiler8.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
45693       return background;
45694     };
45695     return background;
45696   }
45697
45698   // modules/renderer/background.js
45699   var _imageryIndex = null;
45700   function rendererBackground(context) {
45701     const dispatch10 = dispatch_default("change");
45702     const baseLayer = rendererTileLayer(context).projection(context.projection);
45703     let _checkedBlocklists = [];
45704     let _isValid = true;
45705     let _overlayLayers = [];
45706     let _brightness = 1;
45707     let _contrast = 1;
45708     let _saturation = 1;
45709     let _sharpness = 1;
45710     function ensureImageryIndex() {
45711       return _mainFileFetcher.get("imagery").then((sources) => {
45712         if (_imageryIndex)
45713           return _imageryIndex;
45714         _imageryIndex = {
45715           imagery: sources,
45716           features: {}
45717         };
45718         const features = sources.map((source) => {
45719           if (!source.polygon)
45720             return null;
45721           const rings = source.polygon.map((ring) => [ring]);
45722           const feature3 = {
45723             type: "Feature",
45724             properties: { id: source.id },
45725             geometry: { type: "MultiPolygon", coordinates: rings }
45726           };
45727           _imageryIndex.features[source.id] = feature3;
45728           return feature3;
45729         }).filter(Boolean);
45730         _imageryIndex.query = (0, import_which_polygon4.default)({ type: "FeatureCollection", features });
45731         _imageryIndex.backgrounds = sources.map((source) => {
45732           if (source.type === "bing") {
45733             return rendererBackgroundSource.Bing(source, dispatch10);
45734           } else if (/^EsriWorldImagery/.test(source.id)) {
45735             return rendererBackgroundSource.Esri(source);
45736           } else {
45737             return rendererBackgroundSource(source);
45738           }
45739         });
45740         _imageryIndex.backgrounds.unshift(rendererBackgroundSource.None());
45741         let template = corePreferences("background-custom-template") || "";
45742         const custom = rendererBackgroundSource.Custom(template);
45743         _imageryIndex.backgrounds.unshift(custom);
45744         return _imageryIndex;
45745       });
45746     }
45747     function background(selection2) {
45748       const currSource = baseLayer.source();
45749       if (context.map().zoom() > 18) {
45750         if (currSource && /^EsriWorldImagery/.test(currSource.id)) {
45751           const center = context.map().center();
45752           currSource.fetchTilemap(center);
45753         }
45754       }
45755       const sources = background.sources(context.map().extent());
45756       const wasValid = _isValid;
45757       _isValid = !!sources.filter((d) => d === currSource).length;
45758       if (wasValid !== _isValid) {
45759         background.updateImagery();
45760       }
45761       let baseFilter = "";
45762       if (_brightness !== 1) {
45763         baseFilter += ` brightness(${_brightness})`;
45764       }
45765       if (_contrast !== 1) {
45766         baseFilter += ` contrast(${_contrast})`;
45767       }
45768       if (_saturation !== 1) {
45769         baseFilter += ` saturate(${_saturation})`;
45770       }
45771       if (_sharpness < 1) {
45772         const blur = number_default(0.5, 5)(1 - _sharpness);
45773         baseFilter += ` blur(${blur}px)`;
45774       }
45775       let base = selection2.selectAll(".layer-background").data([0]);
45776       base = base.enter().insert("div", ".layer-data").attr("class", "layer layer-background").merge(base);
45777       base.style("filter", baseFilter || null);
45778       let imagery = base.selectAll(".layer-imagery").data([0]);
45779       imagery.enter().append("div").attr("class", "layer layer-imagery").merge(imagery).call(baseLayer);
45780       let maskFilter = "";
45781       let mixBlendMode = "";
45782       if (_sharpness > 1) {
45783         mixBlendMode = "overlay";
45784         maskFilter = "saturate(0) blur(3px) invert(1)";
45785         let contrast = _sharpness - 1;
45786         maskFilter += ` contrast(${contrast})`;
45787         let brightness = number_default(1, 0.85)(_sharpness - 1);
45788         maskFilter += ` brightness(${brightness})`;
45789       }
45790       let mask = base.selectAll(".layer-unsharp-mask").data(_sharpness > 1 ? [0] : []);
45791       mask.exit().remove();
45792       mask.enter().append("div").attr("class", "layer layer-mask layer-unsharp-mask").merge(mask).call(baseLayer).style("filter", maskFilter || null).style("mix-blend-mode", mixBlendMode || null);
45793       let overlays = selection2.selectAll(".layer-overlay").data(_overlayLayers, (d) => d.source().name());
45794       overlays.exit().remove();
45795       overlays.enter().insert("div", ".layer-data").attr("class", "layer layer-overlay").merge(overlays).each((layer, i2, nodes) => select_default2(nodes[i2]).call(layer));
45796     }
45797     background.updateImagery = function() {
45798       let currSource = baseLayer.source();
45799       if (context.inIntro() || !currSource)
45800         return;
45801       let o = _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).map((d) => d.source().id).join(",");
45802       const meters = geoOffsetToMeters(currSource.offset());
45803       const EPSILON = 0.01;
45804       const x = +meters[0].toFixed(2);
45805       const y = +meters[1].toFixed(2);
45806       let hash = utilStringQs(window.location.hash);
45807       let id2 = currSource.id;
45808       if (id2 === "custom") {
45809         id2 = `custom:${currSource.template()}`;
45810       }
45811       if (id2) {
45812         hash.background = id2;
45813       } else {
45814         delete hash.background;
45815       }
45816       if (o) {
45817         hash.overlays = o;
45818       } else {
45819         delete hash.overlays;
45820       }
45821       if (Math.abs(x) > EPSILON || Math.abs(y) > EPSILON) {
45822         hash.offset = `${x},${y}`;
45823       } else {
45824         delete hash.offset;
45825       }
45826       if (!window.mocha) {
45827         window.location.replace("#" + utilQsString(hash, true));
45828       }
45829       let imageryUsed = [];
45830       let photoOverlaysUsed = [];
45831       const currUsed = currSource.imageryUsed();
45832       if (currUsed && _isValid) {
45833         imageryUsed.push(currUsed);
45834       }
45835       _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).forEach((d) => imageryUsed.push(d.source().imageryUsed()));
45836       const dataLayer = context.layers().layer("data");
45837       if (dataLayer && dataLayer.enabled() && dataLayer.hasData()) {
45838         imageryUsed.push(dataLayer.getSrc());
45839       }
45840       const photoOverlayLayers = {
45841         streetside: "Bing Streetside",
45842         mapillary: "Mapillary Images",
45843         "mapillary-map-features": "Mapillary Map Features",
45844         "mapillary-signs": "Mapillary Signs",
45845         kartaview: "KartaView Images"
45846       };
45847       for (let layerID in photoOverlayLayers) {
45848         const layer = context.layers().layer(layerID);
45849         if (layer && layer.enabled()) {
45850           photoOverlaysUsed.push(layerID);
45851           imageryUsed.push(photoOverlayLayers[layerID]);
45852         }
45853       }
45854       context.history().imageryUsed(imageryUsed);
45855       context.history().photoOverlaysUsed(photoOverlaysUsed);
45856     };
45857     background.sources = (extent, zoom, includeCurrent) => {
45858       if (!_imageryIndex)
45859         return [];
45860       let visible = {};
45861       (_imageryIndex.query.bbox(extent.rectangle(), true) || []).forEach((d) => visible[d.id] = true);
45862       const currSource = baseLayer.source();
45863       const osm = context.connection();
45864       const blocklists = osm && osm.imageryBlocklists() || [];
45865       const blocklistChanged = blocklists.length !== _checkedBlocklists.length || blocklists.some((regex, index) => String(regex) !== _checkedBlocklists[index]);
45866       if (blocklistChanged) {
45867         _imageryIndex.backgrounds.forEach((source) => {
45868           source.isBlocked = blocklists.some((regex) => regex.test(source.template()));
45869         });
45870         _checkedBlocklists = blocklists.map((regex) => String(regex));
45871       }
45872       return _imageryIndex.backgrounds.filter((source) => {
45873         if (includeCurrent && currSource === source)
45874           return true;
45875         if (source.isBlocked)
45876           return false;
45877         if (!source.polygon)
45878           return true;
45879         if (zoom && zoom < 6)
45880           return false;
45881         return visible[source.id];
45882       });
45883     };
45884     background.dimensions = (val) => {
45885       if (!val)
45886         return;
45887       baseLayer.dimensions(val);
45888       _overlayLayers.forEach((layer) => layer.dimensions(val));
45889     };
45890     background.baseLayerSource = function(d) {
45891       if (!arguments.length)
45892         return baseLayer.source();
45893       const osm = context.connection();
45894       if (!osm)
45895         return background;
45896       const blocklists = osm.imageryBlocklists();
45897       const template = d.template();
45898       let fail = false;
45899       let tested = 0;
45900       let regex;
45901       for (let i2 = 0; i2 < blocklists.length; i2++) {
45902         regex = blocklists[i2];
45903         fail = regex.test(template);
45904         tested++;
45905         if (fail)
45906           break;
45907       }
45908       if (!tested) {
45909         regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
45910         fail = regex.test(template);
45911       }
45912       baseLayer.source(!fail ? d : background.findSource("none"));
45913       dispatch10.call("change");
45914       background.updateImagery();
45915       return background;
45916     };
45917     background.findSource = (id2) => {
45918       if (!id2 || !_imageryIndex)
45919         return null;
45920       return _imageryIndex.backgrounds.find((d) => d.id && d.id === id2);
45921     };
45922     background.bing = () => {
45923       background.baseLayerSource(background.findSource("Bing"));
45924     };
45925     background.showsLayer = (d) => {
45926       const currSource = baseLayer.source();
45927       if (!d || !currSource)
45928         return false;
45929       return d.id === currSource.id || _overlayLayers.some((layer) => d.id === layer.source().id);
45930     };
45931     background.overlayLayerSources = () => {
45932       return _overlayLayers.map((layer) => layer.source());
45933     };
45934     background.toggleOverlayLayer = (d) => {
45935       let layer;
45936       for (let i2 = 0; i2 < _overlayLayers.length; i2++) {
45937         layer = _overlayLayers[i2];
45938         if (layer.source() === d) {
45939           _overlayLayers.splice(i2, 1);
45940           dispatch10.call("change");
45941           background.updateImagery();
45942           return;
45943         }
45944       }
45945       layer = rendererTileLayer(context).source(d).projection(context.projection).dimensions(
45946         baseLayer.dimensions()
45947       );
45948       _overlayLayers.push(layer);
45949       dispatch10.call("change");
45950       background.updateImagery();
45951     };
45952     background.nudge = (d, zoom) => {
45953       const currSource = baseLayer.source();
45954       if (currSource) {
45955         currSource.nudge(d, zoom);
45956         dispatch10.call("change");
45957         background.updateImagery();
45958       }
45959       return background;
45960     };
45961     background.offset = function(d) {
45962       const currSource = baseLayer.source();
45963       if (!arguments.length) {
45964         return currSource && currSource.offset() || [0, 0];
45965       }
45966       if (currSource) {
45967         currSource.offset(d);
45968         dispatch10.call("change");
45969         background.updateImagery();
45970       }
45971       return background;
45972     };
45973     background.brightness = function(d) {
45974       if (!arguments.length)
45975         return _brightness;
45976       _brightness = d;
45977       if (context.mode())
45978         dispatch10.call("change");
45979       return background;
45980     };
45981     background.contrast = function(d) {
45982       if (!arguments.length)
45983         return _contrast;
45984       _contrast = d;
45985       if (context.mode())
45986         dispatch10.call("change");
45987       return background;
45988     };
45989     background.saturation = function(d) {
45990       if (!arguments.length)
45991         return _saturation;
45992       _saturation = d;
45993       if (context.mode())
45994         dispatch10.call("change");
45995       return background;
45996     };
45997     background.sharpness = function(d) {
45998       if (!arguments.length)
45999         return _sharpness;
46000       _sharpness = d;
46001       if (context.mode())
46002         dispatch10.call("change");
46003       return background;
46004     };
46005     let _loadPromise;
46006     background.ensureLoaded = () => {
46007       if (_loadPromise)
46008         return _loadPromise;
46009       return _loadPromise = ensureImageryIndex();
46010     };
46011     background.init = () => {
46012       const loadPromise = background.ensureLoaded();
46013       const hash = utilStringQs(window.location.hash);
46014       const requestedBackground = hash.background || hash.layer;
46015       const lastUsedBackground = corePreferences("background-last-used");
46016       return loadPromise.then((imageryIndex) => {
46017         const extent = context.map().extent();
46018         const validBackgrounds = background.sources(extent).filter((d) => d.id !== "none" && d.id !== "custom");
46019         const first = validBackgrounds.length && validBackgrounds[0];
46020         const isLastUsedValid = !!validBackgrounds.find((d) => d.id && d.id === lastUsedBackground);
46021         let best;
46022         if (!requestedBackground && extent) {
46023           const viewArea = extent.area();
46024           best = validBackgrounds.find((s) => {
46025             if (!s.best() || s.overlay)
46026               return false;
46027             let bbox2 = es_default(bboxClip(
46028               { type: "MultiPolygon", coordinates: [s.polygon || [extent.polygon()]] },
46029               extent.rectangle()
46030             ));
46031             let area = geoExtent(bbox2.slice(0, 2), bbox2.slice(2, 4)).area();
46032             return area / viewArea > 0.5;
46033           });
46034         }
46035         if (requestedBackground && requestedBackground.indexOf("custom:") === 0) {
46036           const template = requestedBackground.replace(/^custom:/, "");
46037           const custom = background.findSource("custom");
46038           background.baseLayerSource(custom.template(template));
46039           corePreferences("background-custom-template", template);
46040         } else {
46041           background.baseLayerSource(
46042             background.findSource(requestedBackground) || best || isLastUsedValid && background.findSource(lastUsedBackground) || background.findSource("Bing") || first || background.findSource("none")
46043           );
46044         }
46045         const locator = imageryIndex.backgrounds.find((d) => d.overlay && d.default);
46046         if (locator) {
46047           background.toggleOverlayLayer(locator);
46048         }
46049         const overlays = (hash.overlays || "").split(",");
46050         overlays.forEach((overlay) => {
46051           overlay = background.findSource(overlay);
46052           if (overlay) {
46053             background.toggleOverlayLayer(overlay);
46054           }
46055         });
46056         if (hash.gpx) {
46057           const gpx2 = context.layers().layer("data");
46058           if (gpx2) {
46059             gpx2.url(hash.gpx, ".gpx");
46060           }
46061         }
46062         if (hash.offset) {
46063           const offset = hash.offset.replace(/;/g, ",").split(",").map((n2) => !isNaN(n2) && n2);
46064           if (offset.length === 2) {
46065             background.offset(geoMetersToOffset(offset));
46066           }
46067         }
46068       }).catch((err) => {
46069         console.error(err);
46070       });
46071     };
46072     return utilRebind(background, dispatch10, "on");
46073   }
46074
46075   // modules/renderer/features.js
46076   function rendererFeatures(context) {
46077     var dispatch10 = dispatch_default("change", "redraw");
46078     var features = utilRebind({}, dispatch10, "on");
46079     var _deferred2 = /* @__PURE__ */ new Set();
46080     var traffic_roads = {
46081       "motorway": true,
46082       "motorway_link": true,
46083       "trunk": true,
46084       "trunk_link": true,
46085       "primary": true,
46086       "primary_link": true,
46087       "secondary": true,
46088       "secondary_link": true,
46089       "tertiary": true,
46090       "tertiary_link": true,
46091       "residential": true,
46092       "unclassified": true,
46093       "living_street": true,
46094       "busway": true
46095     };
46096     var service_roads = {
46097       "service": true,
46098       "road": true,
46099       "track": true
46100     };
46101     var paths = {
46102       "path": true,
46103       "footway": true,
46104       "cycleway": true,
46105       "bridleway": true,
46106       "steps": true,
46107       "pedestrian": true
46108     };
46109     var _cullFactor = 1;
46110     var _cache4 = {};
46111     var _rules = {};
46112     var _stats = {};
46113     var _keys = [];
46114     var _hidden = [];
46115     var _forceVisible = {};
46116     function update() {
46117       if (!window.mocha) {
46118         var hash = utilStringQs(window.location.hash);
46119         var disabled = features.disabled();
46120         if (disabled.length) {
46121           hash.disable_features = disabled.join(",");
46122         } else {
46123           delete hash.disable_features;
46124         }
46125         window.location.replace("#" + utilQsString(hash, true));
46126         corePreferences("disabled-features", disabled.join(","));
46127       }
46128       _hidden = features.hidden();
46129       dispatch10.call("change");
46130       dispatch10.call("redraw");
46131     }
46132     function defineRule(k, filter2, max3) {
46133       var isEnabled = true;
46134       _keys.push(k);
46135       _rules[k] = {
46136         filter: filter2,
46137         enabled: isEnabled,
46138         // whether the user wants it enabled..
46139         count: 0,
46140         currentMax: max3 || Infinity,
46141         defaultMax: max3 || Infinity,
46142         enable: function() {
46143           this.enabled = true;
46144           this.currentMax = this.defaultMax;
46145         },
46146         disable: function() {
46147           this.enabled = false;
46148           this.currentMax = 0;
46149         },
46150         hidden: function() {
46151           return this.count === 0 && !this.enabled || this.count > this.currentMax * _cullFactor;
46152         },
46153         autoHidden: function() {
46154           return this.hidden() && this.currentMax > 0;
46155         }
46156       };
46157     }
46158     defineRule("points", function isPoint(tags, geometry) {
46159       return geometry === "point";
46160     }, 200);
46161     defineRule("traffic_roads", function isTrafficRoad(tags) {
46162       return traffic_roads[tags.highway];
46163     });
46164     defineRule("service_roads", function isServiceRoad(tags) {
46165       return service_roads[tags.highway];
46166     });
46167     defineRule("paths", function isPath(tags) {
46168       return paths[tags.highway];
46169     });
46170     defineRule("buildings", function isBuilding(tags) {
46171       return !!tags.building && tags.building !== "no" || tags.parking === "multi-storey" || tags.parking === "sheds" || tags.parking === "carports" || tags.parking === "garage_boxes";
46172     }, 250);
46173     defineRule("building_parts", function isBuildingPart(tags) {
46174       return tags["building:part"];
46175     });
46176     defineRule("indoor", function isIndoor(tags) {
46177       return tags.indoor;
46178     });
46179     defineRule("landuse", function isLanduse(tags, geometry) {
46180       return geometry === "area" && !_rules.buildings.filter(tags) && !_rules.building_parts.filter(tags) && !_rules.indoor.filter(tags) && !_rules.water.filter(tags) && !_rules.pistes.filter(tags);
46181     });
46182     defineRule("boundaries", function isBoundary(tags, geometry) {
46183       return (geometry === "line" && !!tags.boundary || geometry === "relation" && tags.type === "boundary") && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway] || tags.waterway || tags.railway || tags.landuse || tags.natural || tags.building || tags.power);
46184     });
46185     defineRule("water", function isWater(tags) {
46186       return !!tags.waterway || tags.natural === "water" || tags.natural === "coastline" || tags.natural === "bay" || tags.landuse === "pond" || tags.landuse === "basin" || tags.landuse === "reservoir" || tags.landuse === "salt_pond";
46187     });
46188     defineRule("rail", function isRail(tags) {
46189       return (!!tags.railway || tags.landuse === "railway") && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]);
46190     });
46191     defineRule("pistes", function isPiste(tags) {
46192       return tags["piste:type"];
46193     });
46194     defineRule("aerialways", function isPiste(tags) {
46195       return tags.aerialway && tags.aerialway !== "yes" && tags.aerialway !== "station";
46196     });
46197     defineRule("power", function isPower(tags) {
46198       return !!tags.power;
46199     });
46200     defineRule("past_future", function isPastFuture(tags) {
46201       if (traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]) {
46202         return false;
46203       }
46204       var strings = Object.keys(tags);
46205       for (var i2 = 0; i2 < strings.length; i2++) {
46206         var s = strings[i2];
46207         if (osmLifecyclePrefixes[s] || osmLifecyclePrefixes[tags[s]])
46208           return true;
46209       }
46210       return false;
46211     });
46212     defineRule("others", function isOther(tags, geometry) {
46213       return geometry === "line" || geometry === "area";
46214     });
46215     features.features = function() {
46216       return _rules;
46217     };
46218     features.keys = function() {
46219       return _keys;
46220     };
46221     features.enabled = function(k) {
46222       if (!arguments.length) {
46223         return _keys.filter(function(k2) {
46224           return _rules[k2].enabled;
46225         });
46226       }
46227       return _rules[k] && _rules[k].enabled;
46228     };
46229     features.disabled = function(k) {
46230       if (!arguments.length) {
46231         return _keys.filter(function(k2) {
46232           return !_rules[k2].enabled;
46233         });
46234       }
46235       return _rules[k] && !_rules[k].enabled;
46236     };
46237     features.hidden = function(k) {
46238       if (!arguments.length) {
46239         return _keys.filter(function(k2) {
46240           return _rules[k2].hidden();
46241         });
46242       }
46243       return _rules[k] && _rules[k].hidden();
46244     };
46245     features.autoHidden = function(k) {
46246       if (!arguments.length) {
46247         return _keys.filter(function(k2) {
46248           return _rules[k2].autoHidden();
46249         });
46250       }
46251       return _rules[k] && _rules[k].autoHidden();
46252     };
46253     features.enable = function(k) {
46254       if (_rules[k] && !_rules[k].enabled) {
46255         _rules[k].enable();
46256         update();
46257       }
46258     };
46259     features.enableAll = function() {
46260       var didEnable = false;
46261       for (var k in _rules) {
46262         if (!_rules[k].enabled) {
46263           didEnable = true;
46264           _rules[k].enable();
46265         }
46266       }
46267       if (didEnable)
46268         update();
46269     };
46270     features.disable = function(k) {
46271       if (_rules[k] && _rules[k].enabled) {
46272         _rules[k].disable();
46273         update();
46274       }
46275     };
46276     features.disableAll = function() {
46277       var didDisable = false;
46278       for (var k in _rules) {
46279         if (_rules[k].enabled) {
46280           didDisable = true;
46281           _rules[k].disable();
46282         }
46283       }
46284       if (didDisable)
46285         update();
46286     };
46287     features.toggle = function(k) {
46288       if (_rules[k]) {
46289         (function(f2) {
46290           return f2.enabled ? f2.disable() : f2.enable();
46291         })(_rules[k]);
46292         update();
46293       }
46294     };
46295     features.resetStats = function() {
46296       for (var i2 = 0; i2 < _keys.length; i2++) {
46297         _rules[_keys[i2]].count = 0;
46298       }
46299       dispatch10.call("change");
46300     };
46301     features.gatherStats = function(d, resolver, dimensions) {
46302       var needsRedraw = false;
46303       var types = utilArrayGroupBy(d, "type");
46304       var entities = [].concat(types.relation || [], types.way || [], types.node || []);
46305       var currHidden, geometry, matches, i2, j2;
46306       for (i2 = 0; i2 < _keys.length; i2++) {
46307         _rules[_keys[i2]].count = 0;
46308       }
46309       _cullFactor = dimensions[0] * dimensions[1] / 1e6;
46310       for (i2 = 0; i2 < entities.length; i2++) {
46311         geometry = entities[i2].geometry(resolver);
46312         matches = Object.keys(features.getMatches(entities[i2], resolver, geometry));
46313         for (j2 = 0; j2 < matches.length; j2++) {
46314           _rules[matches[j2]].count++;
46315         }
46316       }
46317       currHidden = features.hidden();
46318       if (currHidden !== _hidden) {
46319         _hidden = currHidden;
46320         needsRedraw = true;
46321         dispatch10.call("change");
46322       }
46323       return needsRedraw;
46324     };
46325     features.stats = function() {
46326       for (var i2 = 0; i2 < _keys.length; i2++) {
46327         _stats[_keys[i2]] = _rules[_keys[i2]].count;
46328       }
46329       return _stats;
46330     };
46331     features.clear = function(d) {
46332       for (var i2 = 0; i2 < d.length; i2++) {
46333         features.clearEntity(d[i2]);
46334       }
46335     };
46336     features.clearEntity = function(entity) {
46337       delete _cache4[osmEntity.key(entity)];
46338     };
46339     features.reset = function() {
46340       Array.from(_deferred2).forEach(function(handle) {
46341         window.cancelIdleCallback(handle);
46342         _deferred2.delete(handle);
46343       });
46344       _cache4 = {};
46345     };
46346     function relationShouldBeChecked(relation) {
46347       return relation.tags.type === "boundary";
46348     }
46349     features.getMatches = function(entity, resolver, geometry) {
46350       if (geometry === "vertex" || geometry === "relation" && !relationShouldBeChecked(entity))
46351         return {};
46352       var ent = osmEntity.key(entity);
46353       if (!_cache4[ent]) {
46354         _cache4[ent] = {};
46355       }
46356       if (!_cache4[ent].matches) {
46357         var matches = {};
46358         var hasMatch = false;
46359         for (var i2 = 0; i2 < _keys.length; i2++) {
46360           if (_keys[i2] === "others") {
46361             if (hasMatch)
46362               continue;
46363             if (entity.type === "way") {
46364               var parents = features.getParents(entity, resolver, geometry);
46365               if (parents.length === 1 && parents[0].isMultipolygon() || // 2b. or belongs only to boundary relations
46366               parents.length > 0 && parents.every(function(parent) {
46367                 return parent.tags.type === "boundary";
46368               })) {
46369                 var pkey = osmEntity.key(parents[0]);
46370                 if (_cache4[pkey] && _cache4[pkey].matches) {
46371                   matches = Object.assign({}, _cache4[pkey].matches);
46372                   continue;
46373                 }
46374               }
46375             }
46376           }
46377           if (_rules[_keys[i2]].filter(entity.tags, geometry)) {
46378             matches[_keys[i2]] = hasMatch = true;
46379           }
46380         }
46381         _cache4[ent].matches = matches;
46382       }
46383       return _cache4[ent].matches;
46384     };
46385     features.getParents = function(entity, resolver, geometry) {
46386       if (geometry === "point")
46387         return [];
46388       var ent = osmEntity.key(entity);
46389       if (!_cache4[ent]) {
46390         _cache4[ent] = {};
46391       }
46392       if (!_cache4[ent].parents) {
46393         var parents = [];
46394         if (geometry === "vertex") {
46395           parents = resolver.parentWays(entity);
46396         } else {
46397           parents = resolver.parentRelations(entity);
46398         }
46399         _cache4[ent].parents = parents;
46400       }
46401       return _cache4[ent].parents;
46402     };
46403     features.isHiddenPreset = function(preset, geometry) {
46404       if (!_hidden.length)
46405         return false;
46406       if (!preset.tags)
46407         return false;
46408       var test = preset.setTags({}, geometry);
46409       for (var key in _rules) {
46410         if (_rules[key].filter(test, geometry)) {
46411           if (_hidden.indexOf(key) !== -1) {
46412             return key;
46413           }
46414           return false;
46415         }
46416       }
46417       return false;
46418     };
46419     features.isHiddenFeature = function(entity, resolver, geometry) {
46420       if (!_hidden.length)
46421         return false;
46422       if (!entity.version)
46423         return false;
46424       if (_forceVisible[entity.id])
46425         return false;
46426       var matches = Object.keys(features.getMatches(entity, resolver, geometry));
46427       return matches.length && matches.every(function(k) {
46428         return features.hidden(k);
46429       });
46430     };
46431     features.isHiddenChild = function(entity, resolver, geometry) {
46432       if (!_hidden.length)
46433         return false;
46434       if (!entity.version || geometry === "point")
46435         return false;
46436       if (_forceVisible[entity.id])
46437         return false;
46438       var parents = features.getParents(entity, resolver, geometry);
46439       if (!parents.length)
46440         return false;
46441       for (var i2 = 0; i2 < parents.length; i2++) {
46442         if (!features.isHidden(parents[i2], resolver, parents[i2].geometry(resolver))) {
46443           return false;
46444         }
46445       }
46446       return true;
46447     };
46448     features.hasHiddenConnections = function(entity, resolver) {
46449       if (!_hidden.length)
46450         return false;
46451       var childNodes, connections;
46452       if (entity.type === "midpoint") {
46453         childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
46454         connections = [];
46455       } else {
46456         childNodes = entity.nodes ? resolver.childNodes(entity) : [];
46457         connections = features.getParents(entity, resolver, entity.geometry(resolver));
46458       }
46459       connections = childNodes.reduce(function(result, e) {
46460         return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
46461       }, connections);
46462       return connections.some(function(e) {
46463         return features.isHidden(e, resolver, e.geometry(resolver));
46464       });
46465     };
46466     features.isHidden = function(entity, resolver, geometry) {
46467       if (!_hidden.length)
46468         return false;
46469       if (!entity.version)
46470         return false;
46471       var fn = geometry === "vertex" ? features.isHiddenChild : features.isHiddenFeature;
46472       return fn(entity, resolver, geometry);
46473     };
46474     features.filter = function(d, resolver) {
46475       if (!_hidden.length)
46476         return d;
46477       var result = [];
46478       for (var i2 = 0; i2 < d.length; i2++) {
46479         var entity = d[i2];
46480         if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
46481           result.push(entity);
46482         }
46483       }
46484       return result;
46485     };
46486     features.forceVisible = function(entityIDs) {
46487       if (!arguments.length)
46488         return Object.keys(_forceVisible);
46489       _forceVisible = {};
46490       for (var i2 = 0; i2 < entityIDs.length; i2++) {
46491         _forceVisible[entityIDs[i2]] = true;
46492         var entity = context.hasEntity(entityIDs[i2]);
46493         if (entity && entity.type === "relation") {
46494           for (var j2 in entity.members) {
46495             _forceVisible[entity.members[j2].id] = true;
46496           }
46497         }
46498       }
46499       return features;
46500     };
46501     features.init = function() {
46502       var storage = corePreferences("disabled-features");
46503       if (storage) {
46504         var storageDisabled = storage.replace(/;/g, ",").split(",");
46505         storageDisabled.forEach(features.disable);
46506       }
46507       var hash = utilStringQs(window.location.hash);
46508       if (hash.disable_features) {
46509         var hashDisabled = hash.disable_features.replace(/;/g, ",").split(",");
46510         hashDisabled.forEach(features.disable);
46511       }
46512     };
46513     context.history().on("merge.features", function(newEntities) {
46514       if (!newEntities)
46515         return;
46516       var handle = window.requestIdleCallback(function() {
46517         var graph = context.graph();
46518         var types = utilArrayGroupBy(newEntities, "type");
46519         var entities = [].concat(types.relation || [], types.way || [], types.node || []);
46520         for (var i2 = 0; i2 < entities.length; i2++) {
46521           var geometry = entities[i2].geometry(graph);
46522           features.getMatches(entities[i2], graph, geometry);
46523         }
46524       });
46525       _deferred2.add(handle);
46526     });
46527     return features;
46528   }
46529
46530   // modules/svg/areas.js
46531   var import_fast_deep_equal5 = __toESM(require_fast_deep_equal());
46532
46533   // modules/svg/helpers.js
46534   function svgPassiveVertex(node, graph, activeID) {
46535     if (!activeID)
46536       return 1;
46537     if (activeID === node.id)
46538       return 0;
46539     var parents = graph.parentWays(node);
46540     var i2, j2, nodes, isClosed, ix1, ix2, ix3, ix4, max3;
46541     for (i2 = 0; i2 < parents.length; i2++) {
46542       nodes = parents[i2].nodes;
46543       isClosed = parents[i2].isClosed();
46544       for (j2 = 0; j2 < nodes.length; j2++) {
46545         if (nodes[j2] === node.id) {
46546           ix1 = j2 - 2;
46547           ix2 = j2 - 1;
46548           ix3 = j2 + 1;
46549           ix4 = j2 + 2;
46550           if (isClosed) {
46551             max3 = nodes.length - 1;
46552             if (ix1 < 0)
46553               ix1 = max3 + ix1;
46554             if (ix2 < 0)
46555               ix2 = max3 + ix2;
46556             if (ix3 > max3)
46557               ix3 = ix3 - max3;
46558             if (ix4 > max3)
46559               ix4 = ix4 - max3;
46560           }
46561           if (nodes[ix1] === activeID)
46562             return 0;
46563           else if (nodes[ix2] === activeID)
46564             return 2;
46565           else if (nodes[ix3] === activeID)
46566             return 2;
46567           else if (nodes[ix4] === activeID)
46568             return 0;
46569           else if (isClosed && nodes.indexOf(activeID) !== -1)
46570             return 0;
46571         }
46572       }
46573     }
46574     return 1;
46575   }
46576   function svgMarkerSegments(projection2, graph, dt, shouldReverse, bothDirections) {
46577     return function(entity) {
46578       var i2 = 0;
46579       var offset = dt;
46580       var segments = [];
46581       var clip = identity_default2().clipExtent(projection2.clipExtent()).stream;
46582       var coordinates = graph.childNodes(entity).map(function(n2) {
46583         return n2.loc;
46584       });
46585       var a, b;
46586       if (shouldReverse(entity)) {
46587         coordinates.reverse();
46588       }
46589       stream_default({
46590         type: "LineString",
46591         coordinates
46592       }, projection2.stream(clip({
46593         lineStart: function() {
46594         },
46595         lineEnd: function() {
46596           a = null;
46597         },
46598         point: function(x, y) {
46599           b = [x, y];
46600           if (a) {
46601             var span = geoVecLength(a, b) - offset;
46602             if (span >= 0) {
46603               var heading = geoVecAngle(a, b);
46604               var dx = dt * Math.cos(heading);
46605               var dy = dt * Math.sin(heading);
46606               var p = [
46607                 a[0] + offset * Math.cos(heading),
46608                 a[1] + offset * Math.sin(heading)
46609               ];
46610               var coord2 = [a, p];
46611               for (span -= dt; span >= 0; span -= dt) {
46612                 p = geoVecAdd(p, [dx, dy]);
46613                 coord2.push(p);
46614               }
46615               coord2.push(b);
46616               var segment = "";
46617               var j2;
46618               for (j2 = 0; j2 < coord2.length; j2++) {
46619                 segment += (j2 === 0 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1];
46620               }
46621               segments.push({ id: entity.id, index: i2++, d: segment });
46622               if (bothDirections(entity)) {
46623                 segment = "";
46624                 for (j2 = coord2.length - 1; j2 >= 0; j2--) {
46625                   segment += (j2 === coord2.length - 1 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1];
46626                 }
46627                 segments.push({ id: entity.id, index: i2++, d: segment });
46628               }
46629             }
46630             offset = -span;
46631           }
46632           a = b;
46633         }
46634       })));
46635       return segments;
46636     };
46637   }
46638   function svgPath(projection2, graph, isArea) {
46639     var cache = {};
46640     var padding = isArea ? 65 : 5;
46641     var viewport = projection2.clipExtent();
46642     var paddedExtent = [
46643       [viewport[0][0] - padding, viewport[0][1] - padding],
46644       [viewport[1][0] + padding, viewport[1][1] + padding]
46645     ];
46646     var clip = identity_default2().clipExtent(paddedExtent).stream;
46647     var project = projection2.stream;
46648     var path = path_default().projection({ stream: function(output) {
46649       return project(clip(output));
46650     } });
46651     var svgpath = function(entity) {
46652       if (entity.id in cache) {
46653         return cache[entity.id];
46654       } else {
46655         return cache[entity.id] = path(entity.asGeoJSON(graph));
46656       }
46657     };
46658     svgpath.geojson = function(d) {
46659       if (d.__featurehash__ !== void 0) {
46660         if (d.__featurehash__ in cache) {
46661           return cache[d.__featurehash__];
46662         } else {
46663           return cache[d.__featurehash__] = path(d);
46664         }
46665       } else {
46666         return path(d);
46667       }
46668     };
46669     return svgpath;
46670   }
46671   function svgPointTransform(projection2) {
46672     var svgpoint = function(entity) {
46673       var pt = projection2(entity.loc);
46674       return "translate(" + pt[0] + "," + pt[1] + ")";
46675     };
46676     svgpoint.geojson = function(d) {
46677       return svgpoint(d.properties.entity);
46678     };
46679     return svgpoint;
46680   }
46681   function svgRelationMemberTags(graph) {
46682     return function(entity) {
46683       var tags = entity.tags;
46684       var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
46685       graph.parentRelations(entity).forEach(function(relation) {
46686         var type2 = relation.tags.type;
46687         if (type2 === "multipolygon" && shouldCopyMultipolygonTags || type2 === "boundary") {
46688           tags = Object.assign({}, relation.tags, tags);
46689         }
46690       });
46691       return tags;
46692     };
46693   }
46694   function svgSegmentWay(way, graph, activeID) {
46695     if (activeID === void 0) {
46696       return graph.transient(way, "waySegments", getWaySegments);
46697     } else {
46698       return getWaySegments();
46699     }
46700     function getWaySegments() {
46701       var isActiveWay = way.nodes.indexOf(activeID) !== -1;
46702       var features = { passive: [], active: [] };
46703       var start2 = {};
46704       var end = {};
46705       var node, type2;
46706       for (var i2 = 0; i2 < way.nodes.length; i2++) {
46707         node = graph.entity(way.nodes[i2]);
46708         type2 = svgPassiveVertex(node, graph, activeID);
46709         end = { node, type: type2 };
46710         if (start2.type !== void 0) {
46711           if (start2.node.id === activeID || end.node.id === activeID) {
46712           } else if (isActiveWay && (start2.type === 2 || end.type === 2)) {
46713             pushActive(start2, end, i2);
46714           } else if (start2.type === 0 && end.type === 0) {
46715             pushActive(start2, end, i2);
46716           } else {
46717             pushPassive(start2, end, i2);
46718           }
46719         }
46720         start2 = end;
46721       }
46722       return features;
46723       function pushActive(start3, end2, index) {
46724         features.active.push({
46725           type: "Feature",
46726           id: way.id + "-" + index + "-nope",
46727           properties: {
46728             nope: true,
46729             target: true,
46730             entity: way,
46731             nodes: [start3.node, end2.node],
46732             index
46733           },
46734           geometry: {
46735             type: "LineString",
46736             coordinates: [start3.node.loc, end2.node.loc]
46737           }
46738         });
46739       }
46740       function pushPassive(start3, end2, index) {
46741         features.passive.push({
46742           type: "Feature",
46743           id: way.id + "-" + index,
46744           properties: {
46745             target: true,
46746             entity: way,
46747             nodes: [start3.node, end2.node],
46748             index
46749           },
46750           geometry: {
46751             type: "LineString",
46752             coordinates: [start3.node.loc, end2.node.loc]
46753           }
46754         });
46755       }
46756     }
46757   }
46758
46759   // modules/svg/tag_classes.js
46760   function svgTagClasses() {
46761     var primaries = [
46762       "building",
46763       "highway",
46764       "railway",
46765       "waterway",
46766       "aeroway",
46767       "aerialway",
46768       "piste:type",
46769       "boundary",
46770       "power",
46771       "amenity",
46772       "natural",
46773       "landuse",
46774       "leisure",
46775       "military",
46776       "place",
46777       "man_made",
46778       "route",
46779       "attraction",
46780       "building:part",
46781       "indoor"
46782     ];
46783     var statuses = Object.keys(osmLifecyclePrefixes);
46784     var secondaries = [
46785       "oneway",
46786       "bridge",
46787       "tunnel",
46788       "embankment",
46789       "cutting",
46790       "barrier",
46791       "surface",
46792       "tracktype",
46793       "footway",
46794       "crossing",
46795       "service",
46796       "sport",
46797       "public_transport",
46798       "location",
46799       "parking",
46800       "golf",
46801       "type",
46802       "leisure",
46803       "man_made",
46804       "indoor",
46805       "construction",
46806       "proposed"
46807     ];
46808     var _tags = function(entity) {
46809       return entity.tags;
46810     };
46811     var tagClasses = function(selection2) {
46812       selection2.each(function tagClassesEach(entity) {
46813         var value = this.className;
46814         if (value.baseVal !== void 0) {
46815           value = value.baseVal;
46816         }
46817         var t = _tags(entity);
46818         var computed = tagClasses.getClassesString(t, value);
46819         if (computed !== value) {
46820           select_default2(this).attr("class", computed);
46821         }
46822       });
46823     };
46824     tagClasses.getClassesString = function(t, value) {
46825       var primary, status;
46826       var i2, j2, k, v;
46827       var overrideGeometry;
46828       if (/\bstroke\b/.test(value)) {
46829         if (!!t.barrier && t.barrier !== "no") {
46830           overrideGeometry = "line";
46831         }
46832       }
46833       var classes = value.trim().split(/\s+/).filter(function(klass) {
46834         return klass.length && !/^tag-/.test(klass);
46835       }).map(function(klass) {
46836         return klass === "line" || klass === "area" ? overrideGeometry || klass : klass;
46837       });
46838       for (i2 = 0; i2 < primaries.length; i2++) {
46839         k = primaries[i2];
46840         v = t[k];
46841         if (!v || v === "no")
46842           continue;
46843         if (k === "piste:type") {
46844           k = "piste";
46845         } else if (k === "building:part") {
46846           k = "building_part";
46847         }
46848         primary = k;
46849         if (statuses.indexOf(v) !== -1) {
46850           status = v;
46851           classes.push("tag-" + k);
46852         } else {
46853           classes.push("tag-" + k);
46854           classes.push("tag-" + k + "-" + v);
46855         }
46856         break;
46857       }
46858       if (!primary) {
46859         for (i2 = 0; i2 < statuses.length; i2++) {
46860           for (j2 = 0; j2 < primaries.length; j2++) {
46861             k = statuses[i2] + ":" + primaries[j2];
46862             v = t[k];
46863             if (!v || v === "no")
46864               continue;
46865             status = statuses[i2];
46866             break;
46867           }
46868         }
46869       }
46870       if (!status) {
46871         for (i2 = 0; i2 < statuses.length; i2++) {
46872           k = statuses[i2];
46873           v = t[k];
46874           if (!v || v === "no")
46875             continue;
46876           if (v === "yes") {
46877             status = k;
46878           } else if (primary && primary === v) {
46879             status = k;
46880           } else if (!primary && primaries.indexOf(v) !== -1) {
46881             status = k;
46882             primary = v;
46883             classes.push("tag-" + v);
46884           }
46885           if (status)
46886             break;
46887         }
46888       }
46889       if (status) {
46890         classes.push("tag-status");
46891         classes.push("tag-status-" + status);
46892       }
46893       for (i2 = 0; i2 < secondaries.length; i2++) {
46894         k = secondaries[i2];
46895         v = t[k];
46896         if (!v || v === "no" || k === primary)
46897           continue;
46898         classes.push("tag-" + k);
46899         classes.push("tag-" + k + "-" + v);
46900       }
46901       if (primary === "highway" && !osmPathHighwayTagValues[t.highway] || primary === "aeroway") {
46902         var surface = t.highway === "track" ? "unpaved" : "paved";
46903         for (k in t) {
46904           v = t[k];
46905           if (k in osmPavedTags) {
46906             surface = osmPavedTags[k][v] ? "paved" : "unpaved";
46907           }
46908           if (k in osmSemipavedTags && !!osmSemipavedTags[k][v]) {
46909             surface = "semipaved";
46910           }
46911         }
46912         classes.push("tag-" + surface);
46913       }
46914       var qid = t.wikidata || t["flag:wikidata"] || t["brand:wikidata"] || t["network:wikidata"] || t["operator:wikidata"];
46915       if (qid) {
46916         classes.push("tag-wikidata");
46917       }
46918       return classes.join(" ").trim();
46919     };
46920     tagClasses.tags = function(val) {
46921       if (!arguments.length)
46922         return _tags;
46923       _tags = val;
46924       return tagClasses;
46925     };
46926     return tagClasses;
46927   }
46928
46929   // modules/svg/tag_pattern.js
46930   var patterns = {
46931     // tag - pattern name
46932     // -or-
46933     // tag - value - pattern name
46934     // -or-
46935     // tag - value - rules (optional tag-values, pattern name)
46936     // (matches earlier rules first, so fallback should be last entry)
46937     amenity: {
46938       grave_yard: "cemetery",
46939       fountain: "water_standing"
46940     },
46941     landuse: {
46942       cemetery: [
46943         { religion: "christian", pattern: "cemetery_christian" },
46944         { religion: "buddhist", pattern: "cemetery_buddhist" },
46945         { religion: "muslim", pattern: "cemetery_muslim" },
46946         { religion: "jewish", pattern: "cemetery_jewish" },
46947         { pattern: "cemetery" }
46948       ],
46949       construction: "construction",
46950       farmland: "farmland",
46951       farmyard: "farmyard",
46952       forest: [
46953         { leaf_type: "broadleaved", pattern: "forest_broadleaved" },
46954         { leaf_type: "needleleaved", pattern: "forest_needleleaved" },
46955         { leaf_type: "leafless", pattern: "forest_leafless" },
46956         { pattern: "forest" }
46957         // same as 'leaf_type:mixed'
46958       ],
46959       grave_yard: "cemetery",
46960       grass: "grass",
46961       landfill: "landfill",
46962       meadow: "meadow",
46963       military: "construction",
46964       orchard: "orchard",
46965       quarry: "quarry",
46966       vineyard: "vineyard"
46967     },
46968     leisure: {
46969       horse_riding: "farmyard"
46970     },
46971     natural: {
46972       beach: "beach",
46973       grassland: "grass",
46974       sand: "beach",
46975       scrub: "scrub",
46976       water: [
46977         { water: "pond", pattern: "pond" },
46978         { water: "reservoir", pattern: "water_standing" },
46979         { pattern: "waves" }
46980       ],
46981       wetland: [
46982         { wetland: "marsh", pattern: "wetland_marsh" },
46983         { wetland: "swamp", pattern: "wetland_swamp" },
46984         { wetland: "bog", pattern: "wetland_bog" },
46985         { wetland: "reedbed", pattern: "wetland_reedbed" },
46986         { pattern: "wetland" }
46987       ],
46988       wood: [
46989         { leaf_type: "broadleaved", pattern: "forest_broadleaved" },
46990         { leaf_type: "needleleaved", pattern: "forest_needleleaved" },
46991         { leaf_type: "leafless", pattern: "forest_leafless" },
46992         { pattern: "forest" }
46993         // same as 'leaf_type:mixed'
46994       ]
46995     },
46996     golf: {
46997       green: "golf_green",
46998       tee: "grass",
46999       fairway: "grass",
47000       rough: "scrub"
47001     },
47002     surface: {
47003       grass: "grass",
47004       sand: "beach"
47005     }
47006   };
47007   function svgTagPattern(tags) {
47008     if (tags.building && tags.building !== "no") {
47009       return null;
47010     }
47011     for (var tag in patterns) {
47012       var entityValue = tags[tag];
47013       if (!entityValue)
47014         continue;
47015       if (typeof patterns[tag] === "string") {
47016         return "pattern-" + patterns[tag];
47017       } else {
47018         var values = patterns[tag];
47019         for (var value in values) {
47020           if (entityValue !== value)
47021             continue;
47022           var rules = values[value];
47023           if (typeof rules === "string") {
47024             return "pattern-" + rules;
47025           }
47026           for (var ruleKey in rules) {
47027             var rule = rules[ruleKey];
47028             var pass = true;
47029             for (var criterion in rule) {
47030               if (criterion !== "pattern") {
47031                 var v = tags[criterion];
47032                 if (!v || v !== rule[criterion]) {
47033                   pass = false;
47034                   break;
47035                 }
47036               }
47037             }
47038             if (pass) {
47039               return "pattern-" + rule.pattern;
47040             }
47041           }
47042         }
47043       }
47044     }
47045     return null;
47046   }
47047
47048   // modules/svg/areas.js
47049   function svgAreas(projection2, context) {
47050     function getPatternStyle(tags) {
47051       var imageID = svgTagPattern(tags);
47052       if (imageID) {
47053         return 'url("#ideditor-' + imageID + '")';
47054       }
47055       return "";
47056     }
47057     function drawTargets(selection2, graph, entities, filter2) {
47058       var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
47059       var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
47060       var getPath = svgPath(projection2).geojson;
47061       var activeID = context.activeID();
47062       var base = context.history().base();
47063       var data = { targets: [], nopes: [] };
47064       entities.forEach(function(way) {
47065         var features = svgSegmentWay(way, graph, activeID);
47066         data.targets.push.apply(data.targets, features.passive);
47067         data.nopes.push.apply(data.nopes, features.active);
47068       });
47069       var targetData = data.targets.filter(getPath);
47070       var targets = selection2.selectAll(".area.target-allowed").filter(function(d) {
47071         return filter2(d.properties.entity);
47072       }).data(targetData, function key(d) {
47073         return d.id;
47074       });
47075       targets.exit().remove();
47076       var segmentWasEdited = function(d) {
47077         var wayID = d.properties.entity.id;
47078         if (!base.entities[wayID] || !(0, import_fast_deep_equal5.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
47079           return false;
47080         }
47081         return d.properties.nodes.some(function(n2) {
47082           return !base.entities[n2.id] || !(0, import_fast_deep_equal5.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc);
47083         });
47084       };
47085       targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) {
47086         return "way area target target-allowed " + targetClass + d.id;
47087       }).classed("segment-edited", segmentWasEdited);
47088       var nopeData = data.nopes.filter(getPath);
47089       var nopes = selection2.selectAll(".area.target-nope").filter(function(d) {
47090         return filter2(d.properties.entity);
47091       }).data(nopeData, function key(d) {
47092         return d.id;
47093       });
47094       nopes.exit().remove();
47095       nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) {
47096         return "way area target target-nope " + nopeClass + d.id;
47097       }).classed("segment-edited", segmentWasEdited);
47098     }
47099     function drawAreas(selection2, graph, entities, filter2) {
47100       var path = svgPath(projection2, graph, true);
47101       var areas = {};
47102       var multipolygon;
47103       var base = context.history().base();
47104       for (var i2 = 0; i2 < entities.length; i2++) {
47105         var entity = entities[i2];
47106         if (entity.geometry(graph) !== "area")
47107           continue;
47108         multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
47109         if (multipolygon) {
47110           areas[multipolygon.id] = {
47111             entity: multipolygon.mergeTags(entity.tags),
47112             area: Math.abs(entity.area(graph))
47113           };
47114         } else if (!areas[entity.id]) {
47115           areas[entity.id] = {
47116             entity,
47117             area: Math.abs(entity.area(graph))
47118           };
47119         }
47120       }
47121       var fills = Object.values(areas).filter(function hasPath(a) {
47122         return path(a.entity);
47123       });
47124       fills.sort(function areaSort(a, b) {
47125         return b.area - a.area;
47126       });
47127       fills = fills.map(function(a) {
47128         return a.entity;
47129       });
47130       var strokes = fills.filter(function(area) {
47131         return area.type === "way";
47132       });
47133       var data = {
47134         clip: fills,
47135         shadow: strokes,
47136         stroke: strokes,
47137         fill: fills
47138       };
47139       var clipPaths = context.surface().selectAll("defs").selectAll(".clipPath-osm").filter(filter2).data(data.clip, osmEntity.key);
47140       clipPaths.exit().remove();
47141       var clipPathsEnter = clipPaths.enter().append("clipPath").attr("class", "clipPath-osm").attr("id", function(entity2) {
47142         return "ideditor-" + entity2.id + "-clippath";
47143       });
47144       clipPathsEnter.append("path");
47145       clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", path);
47146       var drawLayer = selection2.selectAll(".layer-osm.areas");
47147       var touchLayer = selection2.selectAll(".layer-touch.areas");
47148       var areagroup = drawLayer.selectAll("g.areagroup").data(["fill", "shadow", "stroke"]);
47149       areagroup = areagroup.enter().append("g").attr("class", function(d) {
47150         return "areagroup area-" + d;
47151       }).merge(areagroup);
47152       var paths = areagroup.selectAll("path").filter(filter2).data(function(layer) {
47153         return data[layer];
47154       }, osmEntity.key);
47155       paths.exit().remove();
47156       var fillpaths = selection2.selectAll(".area-fill path.area").nodes();
47157       var bisect = bisector(function(node) {
47158         return -node.__data__.area(graph);
47159       }).left;
47160       function sortedByArea(entity2) {
47161         if (this._parent.__data__ === "fill") {
47162           return fillpaths[bisect(fillpaths, -entity2.area(graph))];
47163         }
47164       }
47165       paths = paths.enter().insert("path", sortedByArea).merge(paths).each(function(entity2) {
47166         var layer = this.parentNode.__data__;
47167         this.setAttribute("class", entity2.type + " area " + layer + " " + entity2.id);
47168         if (layer === "fill") {
47169           this.setAttribute("clip-path", "url(#ideditor-" + entity2.id + "-clippath)");
47170           this.style.fill = this.style.stroke = getPatternStyle(entity2.tags);
47171         }
47172       }).classed("added", function(d) {
47173         return !base.entities[d.id];
47174       }).classed("geometry-edited", function(d) {
47175         return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d.id].nodes, base.entities[d.id].nodes);
47176       }).classed("retagged", function(d) {
47177         return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal5.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
47178       }).call(svgTagClasses()).attr("d", path);
47179       touchLayer.call(drawTargets, graph, data.stroke, filter2);
47180     }
47181     return drawAreas;
47182   }
47183
47184   // modules/svg/data.js
47185   var import_fast_json_stable_stringify = __toESM(require_fast_json_stable_stringify());
47186
47187   // node_modules/@tmcw/togeojson/dist/togeojson.es.mjs
47188   function $(element, tagName) {
47189     return Array.from(element.getElementsByTagName(tagName));
47190   }
47191   function normalizeId(id2) {
47192     return id2[0] === "#" ? id2 : `#${id2}`;
47193   }
47194   function $ns(element, tagName, ns) {
47195     return Array.from(element.getElementsByTagNameNS(ns, tagName));
47196   }
47197   function nodeVal(node) {
47198     node?.normalize();
47199     return node && node.textContent || "";
47200   }
47201   function get1(node, tagName, callback) {
47202     const n2 = node.getElementsByTagName(tagName);
47203     const result = n2.length ? n2[0] : null;
47204     if (result && callback)
47205       callback(result);
47206     return result;
47207   }
47208   function get3(node, tagName, callback) {
47209     const properties = {};
47210     if (!node)
47211       return properties;
47212     const n2 = node.getElementsByTagName(tagName);
47213     const result = n2.length ? n2[0] : null;
47214     if (result && callback) {
47215       return callback(result, properties);
47216     }
47217     return properties;
47218   }
47219   function val1(node, tagName, callback) {
47220     const val = nodeVal(get1(node, tagName));
47221     if (val && callback)
47222       return callback(val) || {};
47223     return {};
47224   }
47225   function $num(node, tagName, callback) {
47226     const val = parseFloat(nodeVal(get1(node, tagName)));
47227     if (isNaN(val))
47228       return void 0;
47229     if (val && callback)
47230       return callback(val) || {};
47231     return {};
47232   }
47233   function num1(node, tagName, callback) {
47234     const val = parseFloat(nodeVal(get1(node, tagName)));
47235     if (isNaN(val))
47236       return void 0;
47237     if (val && callback)
47238       callback(val);
47239     return val;
47240   }
47241   function getMulti(node, propertyNames) {
47242     const properties = {};
47243     for (const property of propertyNames) {
47244       val1(node, property, (val) => {
47245         properties[property] = val;
47246       });
47247     }
47248     return properties;
47249   }
47250   function isElement(node) {
47251     return node?.nodeType === 1;
47252   }
47253   function getLineStyle(node) {
47254     return get3(node, "line", (lineStyle) => {
47255       const val = Object.assign({}, val1(lineStyle, "color", (color2) => {
47256         return { stroke: `#${color2}` };
47257       }), $num(lineStyle, "opacity", (opacity) => {
47258         return { "stroke-opacity": opacity };
47259       }), $num(lineStyle, "width", (width) => {
47260         return { "stroke-width": width * 96 / 25.4 };
47261       }));
47262       return val;
47263     });
47264   }
47265   function getExtensions(node) {
47266     let values = [];
47267     if (node === null)
47268       return values;
47269     for (const child of Array.from(node.childNodes)) {
47270       if (!isElement(child))
47271         continue;
47272       const name = abbreviateName(child.nodeName);
47273       if (name === "gpxtpx:TrackPointExtension") {
47274         values = values.concat(getExtensions(child));
47275       } else {
47276         const val = nodeVal(child);
47277         values.push([name, parseNumeric(val)]);
47278       }
47279     }
47280     return values;
47281   }
47282   function abbreviateName(name) {
47283     return ["heart", "gpxtpx:hr", "hr"].includes(name) ? "heart" : name;
47284   }
47285   function parseNumeric(val) {
47286     const num = parseFloat(val);
47287     return isNaN(num) ? val : num;
47288   }
47289   function coordPair$1(node) {
47290     const ll = [
47291       parseFloat(node.getAttribute("lon") || ""),
47292       parseFloat(node.getAttribute("lat") || "")
47293     ];
47294     if (isNaN(ll[0]) || isNaN(ll[1])) {
47295       return null;
47296     }
47297     num1(node, "ele", (val) => {
47298       ll.push(val);
47299     });
47300     const time = get1(node, "time");
47301     return {
47302       coordinates: ll,
47303       time: time ? nodeVal(time) : null,
47304       extendedValues: getExtensions(get1(node, "extensions"))
47305     };
47306   }
47307   function extractProperties(node) {
47308     const properties = getMulti(node, [
47309       "name",
47310       "cmt",
47311       "desc",
47312       "type",
47313       "time",
47314       "keywords"
47315     ]);
47316     const extensions = Array.from(node.getElementsByTagNameNS("http://www.garmin.com/xmlschemas/GpxExtensions/v3", "*"));
47317     for (const child of extensions) {
47318       if (child.parentNode?.parentNode === node) {
47319         properties[child.tagName.replace(":", "_")] = nodeVal(child);
47320       }
47321     }
47322     const links = $(node, "link");
47323     if (links.length) {
47324       properties.links = links.map((link2) => Object.assign({ href: link2.getAttribute("href") }, getMulti(link2, ["text", "type"])));
47325     }
47326     return properties;
47327   }
47328   function getPoints$1(node, pointname) {
47329     const pts = $(node, pointname);
47330     const line = [];
47331     const times = [];
47332     const extendedValues = {};
47333     for (let i2 = 0; i2 < pts.length; i2++) {
47334       const c = coordPair$1(pts[i2]);
47335       if (!c) {
47336         continue;
47337       }
47338       line.push(c.coordinates);
47339       if (c.time)
47340         times.push(c.time);
47341       for (const [name, val] of c.extendedValues) {
47342         const plural = name === "heart" ? name : name.replace("gpxtpx:", "") + "s";
47343         if (!extendedValues[plural]) {
47344           extendedValues[plural] = Array(pts.length).fill(null);
47345         }
47346         extendedValues[plural][i2] = val;
47347       }
47348     }
47349     if (line.length < 2)
47350       return;
47351     return {
47352       line,
47353       times,
47354       extendedValues
47355     };
47356   }
47357   function getRoute(node) {
47358     const line = getPoints$1(node, "rtept");
47359     if (!line)
47360       return;
47361     return {
47362       type: "Feature",
47363       properties: Object.assign({ _gpxType: "rte" }, extractProperties(node), getLineStyle(get1(node, "extensions"))),
47364       geometry: {
47365         type: "LineString",
47366         coordinates: line.line
47367       }
47368     };
47369   }
47370   function getTrack(node) {
47371     const segments = $(node, "trkseg");
47372     const track = [];
47373     const times = [];
47374     const extractedLines = [];
47375     for (const segment of segments) {
47376       const line = getPoints$1(segment, "trkpt");
47377       if (line) {
47378         extractedLines.push(line);
47379         if (line.times && line.times.length)
47380           times.push(line.times);
47381       }
47382     }
47383     if (extractedLines.length === 0)
47384       return null;
47385     const multi = extractedLines.length > 1;
47386     const properties = Object.assign({ _gpxType: "trk" }, extractProperties(node), getLineStyle(get1(node, "extensions")), times.length ? {
47387       coordinateProperties: {
47388         times: multi ? times : times[0]
47389       }
47390     } : {});
47391     for (const line of extractedLines) {
47392       track.push(line.line);
47393       if (!properties.coordinateProperties) {
47394         properties.coordinateProperties = {};
47395       }
47396       const props = properties.coordinateProperties;
47397       const entries = Object.entries(line.extendedValues);
47398       for (let i2 = 0; i2 < entries.length; i2++) {
47399         const [name, val] = entries[i2];
47400         if (multi) {
47401           if (!props[name]) {
47402             props[name] = extractedLines.map((line2) => new Array(line2.line.length).fill(null));
47403           }
47404           props[name][i2] = val;
47405         } else {
47406           props[name] = val;
47407         }
47408       }
47409     }
47410     return {
47411       type: "Feature",
47412       properties,
47413       geometry: multi ? {
47414         type: "MultiLineString",
47415         coordinates: track
47416       } : {
47417         type: "LineString",
47418         coordinates: track[0]
47419       }
47420     };
47421   }
47422   function getPoint(node) {
47423     const properties = Object.assign(extractProperties(node), getMulti(node, ["sym"]));
47424     const pair2 = coordPair$1(node);
47425     if (!pair2)
47426       return null;
47427     return {
47428       type: "Feature",
47429       properties,
47430       geometry: {
47431         type: "Point",
47432         coordinates: pair2.coordinates
47433       }
47434     };
47435   }
47436   function* gpxGen(node) {
47437     for (const track of $(node, "trk")) {
47438       const feature3 = getTrack(track);
47439       if (feature3)
47440         yield feature3;
47441     }
47442     for (const route of $(node, "rte")) {
47443       const feature3 = getRoute(route);
47444       if (feature3)
47445         yield feature3;
47446     }
47447     for (const waypoint of $(node, "wpt")) {
47448       const point2 = getPoint(waypoint);
47449       if (point2)
47450         yield point2;
47451     }
47452   }
47453   function gpx(node) {
47454     return {
47455       type: "FeatureCollection",
47456       features: Array.from(gpxGen(node))
47457     };
47458   }
47459   function fixColor(v, prefix) {
47460     const properties = {};
47461     const colorProp = prefix == "stroke" || prefix === "fill" ? prefix : prefix + "-color";
47462     if (v[0] === "#") {
47463       v = v.substring(1);
47464     }
47465     if (v.length === 6 || v.length === 3) {
47466       properties[colorProp] = "#" + v;
47467     } else if (v.length === 8) {
47468       properties[prefix + "-opacity"] = parseInt(v.substring(0, 2), 16) / 255;
47469       properties[colorProp] = "#" + v.substring(6, 8) + v.substring(4, 6) + v.substring(2, 4);
47470     }
47471     return properties;
47472   }
47473   function numericProperty(node, source, target) {
47474     const properties = {};
47475     num1(node, source, (val) => {
47476       properties[target] = val;
47477     });
47478     return properties;
47479   }
47480   function getColor(node, output) {
47481     return get3(node, "color", (elem) => fixColor(nodeVal(elem), output));
47482   }
47483   function extractIcon(node) {
47484     return get3(node, "IconStyle", (iconStyle) => {
47485       return Object.assign(getColor(iconStyle, "icon"), numericProperty(iconStyle, "scale", "icon-scale"), numericProperty(iconStyle, "heading", "icon-heading"), get3(iconStyle, "hotSpot", (hotspot) => {
47486         const left = parseFloat(hotspot.getAttribute("x") || "");
47487         const top = parseFloat(hotspot.getAttribute("y") || "");
47488         const xunits = hotspot.getAttribute("xunits") || "";
47489         const yunits = hotspot.getAttribute("yunits") || "";
47490         if (!isNaN(left) && !isNaN(top))
47491           return {
47492             "icon-offset": [left, top],
47493             "icon-offset-units": [xunits, yunits]
47494           };
47495         return {};
47496       }), get3(iconStyle, "Icon", (icon2, properties) => {
47497         val1(icon2, "href", (href) => {
47498           properties.icon = href;
47499         });
47500         return properties;
47501       }));
47502     });
47503   }
47504   function extractLabel(node) {
47505     return get3(node, "LabelStyle", (labelStyle) => {
47506       return Object.assign(getColor(labelStyle, "label"), numericProperty(labelStyle, "scale", "label-scale"));
47507     });
47508   }
47509   function extractLine(node) {
47510     return get3(node, "LineStyle", (lineStyle) => {
47511       return Object.assign(getColor(lineStyle, "stroke"), numericProperty(lineStyle, "width", "stroke-width"));
47512     });
47513   }
47514   function extractPoly(node) {
47515     return get3(node, "PolyStyle", (polyStyle, properties) => {
47516       return Object.assign(properties, get3(polyStyle, "color", (elem) => fixColor(nodeVal(elem), "fill")), val1(polyStyle, "fill", (fill) => {
47517         if (fill === "0")
47518           return { "fill-opacity": 0 };
47519       }), val1(polyStyle, "outline", (outline) => {
47520         if (outline === "0")
47521           return { "stroke-opacity": 0 };
47522       }));
47523     });
47524   }
47525   function extractStyle(node) {
47526     return Object.assign({}, extractPoly(node), extractLine(node), extractLabel(node), extractIcon(node));
47527   }
47528   var removeSpace = /\s*/g;
47529   var trimSpace = /^\s*|\s*$/g;
47530   var splitSpace = /\s+/;
47531   function coord1(value) {
47532     return value.replace(removeSpace, "").split(",").map(parseFloat).filter((num) => !isNaN(num)).slice(0, 3);
47533   }
47534   function coord(value) {
47535     return value.replace(trimSpace, "").split(splitSpace).map(coord1).filter((coord2) => {
47536       return coord2.length >= 2;
47537     });
47538   }
47539   function gxCoords(node) {
47540     let elems = $(node, "coord");
47541     if (elems.length === 0) {
47542       elems = $ns(node, "coord", "*");
47543     }
47544     const coordinates = elems.map((elem) => {
47545       return nodeVal(elem).split(" ").map(parseFloat);
47546     });
47547     if (coordinates.length === 0) {
47548       return null;
47549     }
47550     return {
47551       geometry: coordinates.length > 2 ? {
47552         type: "LineString",
47553         coordinates
47554       } : {
47555         type: "Point",
47556         coordinates: coordinates[0]
47557       },
47558       times: $(node, "when").map((elem) => nodeVal(elem))
47559     };
47560   }
47561   function fixRing(ring) {
47562     if (ring.length === 0)
47563       return ring;
47564     const first = ring[0];
47565     const last = ring[ring.length - 1];
47566     let equal = true;
47567     for (let i2 = 0; i2 < Math.max(first.length, last.length); i2++) {
47568       if (first[i2] !== last[i2]) {
47569         equal = false;
47570         break;
47571       }
47572     }
47573     if (!equal) {
47574       return ring.concat([ring[0]]);
47575     }
47576     return ring;
47577   }
47578   var GEO_TYPES = [
47579     "Polygon",
47580     "LineString",
47581     "Point",
47582     "Track",
47583     "gx:Track"
47584   ];
47585   function getCoordinates(node) {
47586     return nodeVal(get1(node, "coordinates"));
47587   }
47588   function getGeometry(node) {
47589     const geometries = [];
47590     const coordTimes = [];
47591     for (const t of ["MultiGeometry", "MultiTrack", "gx:MultiTrack"]) {
47592       const elem = get1(node, t);
47593       if (elem) {
47594         return getGeometry(elem);
47595       }
47596     }
47597     for (const geoType of GEO_TYPES) {
47598       for (const geomNode of $(node, geoType)) {
47599         switch (geoType) {
47600           case "Point": {
47601             const coordinates = coord1(getCoordinates(geomNode));
47602             if (coordinates.length >= 2) {
47603               geometries.push({
47604                 type: "Point",
47605                 coordinates
47606               });
47607             }
47608             break;
47609           }
47610           case "LineString": {
47611             const coordinates = coord(getCoordinates(geomNode));
47612             if (coordinates.length >= 2) {
47613               geometries.push({
47614                 type: "LineString",
47615                 coordinates
47616               });
47617             }
47618             break;
47619           }
47620           case "Polygon": {
47621             const coords = [];
47622             for (const linearRing of $(geomNode, "LinearRing")) {
47623               const ring = fixRing(coord(getCoordinates(linearRing)));
47624               if (ring.length >= 4) {
47625                 coords.push(ring);
47626               }
47627             }
47628             if (coords.length) {
47629               geometries.push({
47630                 type: "Polygon",
47631                 coordinates: coords
47632               });
47633             }
47634             break;
47635           }
47636           case "Track":
47637           case "gx:Track": {
47638             const gx = gxCoords(geomNode);
47639             if (!gx)
47640               break;
47641             const { times, geometry } = gx;
47642             geometries.push(geometry);
47643             if (times.length)
47644               coordTimes.push(times);
47645             break;
47646           }
47647         }
47648       }
47649     }
47650     return {
47651       geometries,
47652       coordTimes
47653     };
47654   }
47655   function extractExtendedData(node) {
47656     return get3(node, "ExtendedData", (extendedData, properties) => {
47657       for (const data of $(extendedData, "Data")) {
47658         properties[data.getAttribute("name") || ""] = nodeVal(get1(data, "value"));
47659       }
47660       for (const simpleData of $(extendedData, "SimpleData")) {
47661         properties[simpleData.getAttribute("name") || ""] = nodeVal(simpleData);
47662       }
47663       return properties;
47664     });
47665   }
47666   function geometryListToGeometry(geometries) {
47667     return geometries.length === 0 ? null : geometries.length === 1 ? geometries[0] : {
47668       type: "GeometryCollection",
47669       geometries
47670     };
47671   }
47672   function extractTimeSpan(node) {
47673     return get3(node, "TimeSpan", (timeSpan) => {
47674       return {
47675         timespan: {
47676           begin: nodeVal(get1(timeSpan, "begin")),
47677           end: nodeVal(get1(timeSpan, "end"))
47678         }
47679       };
47680     });
47681   }
47682   function extractTimeStamp(node) {
47683     return get3(node, "TimeStamp", (timeStamp) => {
47684       return { timestamp: nodeVal(get1(timeStamp, "when")) };
47685     });
47686   }
47687   function extractCascadedStyle(node, styleMap) {
47688     return val1(node, "styleUrl", (styleUrl) => {
47689       styleUrl = normalizeId(styleUrl);
47690       if (styleMap[styleUrl]) {
47691         return Object.assign({ styleUrl }, styleMap[styleUrl]);
47692       }
47693       return { styleUrl };
47694     });
47695   }
47696   function getMaybeHTMLDescription(node) {
47697     const descriptionNode = get1(node, "description");
47698     for (const c of Array.from(descriptionNode?.childNodes || [])) {
47699       if (c.nodeType === 4) {
47700         return {
47701           description: {
47702             "@type": "html",
47703             value: nodeVal(c)
47704           }
47705         };
47706       }
47707     }
47708     return {};
47709   }
47710   function getPlacemark(node, styleMap) {
47711     const { coordTimes, geometries } = getGeometry(node);
47712     const feature3 = {
47713       type: "Feature",
47714       geometry: geometryListToGeometry(geometries),
47715       properties: Object.assign(getMulti(node, [
47716         "name",
47717         "address",
47718         "visibility",
47719         "open",
47720         "phoneNumber",
47721         "description"
47722       ]), getMaybeHTMLDescription(node), extractCascadedStyle(node, styleMap), extractStyle(node), extractExtendedData(node), extractTimeSpan(node), extractTimeStamp(node), coordTimes.length ? {
47723         coordinateProperties: {
47724           times: coordTimes.length === 1 ? coordTimes[0] : coordTimes
47725         }
47726       } : {})
47727     };
47728     if (feature3.properties?.visibility !== void 0) {
47729       feature3.properties.visibility = feature3.properties.visibility !== "0";
47730     }
47731     const id2 = node.getAttribute("id");
47732     if (id2 !== null && id2 !== "")
47733       feature3.id = id2;
47734     return feature3;
47735   }
47736   function getStyleId(style) {
47737     let id2 = style.getAttribute("id");
47738     const parentNode = style.parentNode;
47739     if (!id2 && isElement(parentNode) && parentNode.localName === "CascadingStyle") {
47740       id2 = parentNode.getAttribute("kml:id") || parentNode.getAttribute("id");
47741     }
47742     return normalizeId(id2 || "");
47743   }
47744   function buildStyleMap(node) {
47745     const styleMap = {};
47746     for (const style of $(node, "Style")) {
47747       styleMap[getStyleId(style)] = extractStyle(style);
47748     }
47749     for (const map2 of $(node, "StyleMap")) {
47750       const id2 = normalizeId(map2.getAttribute("id") || "");
47751       val1(map2, "styleUrl", (styleUrl) => {
47752         styleUrl = normalizeId(styleUrl);
47753         if (styleMap[styleUrl]) {
47754           styleMap[id2] = styleMap[styleUrl];
47755         }
47756       });
47757     }
47758     return styleMap;
47759   }
47760   function* kmlGen(node) {
47761     const styleMap = buildStyleMap(node);
47762     for (const placemark of $(node, "Placemark")) {
47763       const feature3 = getPlacemark(placemark, styleMap);
47764       if (feature3)
47765         yield feature3;
47766     }
47767   }
47768   function kml(node) {
47769     return {
47770       type: "FeatureCollection",
47771       features: Array.from(kmlGen(node))
47772     };
47773   }
47774
47775   // modules/svg/data.js
47776   var _initialized = false;
47777   var _enabled = false;
47778   var _geojson;
47779   function svgData(projection2, context, dispatch10) {
47780     var throttledRedraw = throttle_default(function() {
47781       dispatch10.call("change");
47782     }, 1e3);
47783     var _showLabels = true;
47784     var detected = utilDetect();
47785     var layer = select_default2(null);
47786     var _vtService;
47787     var _fileList;
47788     var _template;
47789     var _src;
47790     function init2() {
47791       if (_initialized)
47792         return;
47793       _geojson = {};
47794       _enabled = true;
47795       function over(d3_event) {
47796         d3_event.stopPropagation();
47797         d3_event.preventDefault();
47798         d3_event.dataTransfer.dropEffect = "copy";
47799       }
47800       context.container().attr("dropzone", "copy").on("drop.svgData", function(d3_event) {
47801         d3_event.stopPropagation();
47802         d3_event.preventDefault();
47803         if (!detected.filedrop)
47804           return;
47805         drawData.fileList(d3_event.dataTransfer.files);
47806       }).on("dragenter.svgData", over).on("dragexit.svgData", over).on("dragover.svgData", over);
47807       _initialized = true;
47808     }
47809     function getService() {
47810       if (services.vectorTile && !_vtService) {
47811         _vtService = services.vectorTile;
47812         _vtService.event.on("loadedData", throttledRedraw);
47813       } else if (!services.vectorTile && _vtService) {
47814         _vtService = null;
47815       }
47816       return _vtService;
47817     }
47818     function showLayer() {
47819       layerOn();
47820       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
47821         dispatch10.call("change");
47822       });
47823     }
47824     function hideLayer() {
47825       throttledRedraw.cancel();
47826       layer.transition().duration(250).style("opacity", 0).on("end", layerOff);
47827     }
47828     function layerOn() {
47829       layer.style("display", "block");
47830     }
47831     function layerOff() {
47832       layer.selectAll(".viewfield-group").remove();
47833       layer.style("display", "none");
47834     }
47835     function ensureIDs(gj) {
47836       if (!gj)
47837         return null;
47838       if (gj.type === "FeatureCollection") {
47839         for (var i2 = 0; i2 < gj.features.length; i2++) {
47840           ensureFeatureID(gj.features[i2]);
47841         }
47842       } else {
47843         ensureFeatureID(gj);
47844       }
47845       return gj;
47846     }
47847     function ensureFeatureID(feature3) {
47848       if (!feature3)
47849         return;
47850       feature3.__featurehash__ = utilHashcode((0, import_fast_json_stable_stringify.default)(feature3));
47851       return feature3;
47852     }
47853     function getFeatures(gj) {
47854       if (!gj)
47855         return [];
47856       if (gj.type === "FeatureCollection") {
47857         return gj.features;
47858       } else {
47859         return [gj];
47860       }
47861     }
47862     function featureKey(d) {
47863       return d.__featurehash__;
47864     }
47865     function isPolygon(d) {
47866       return d.geometry.type === "Polygon" || d.geometry.type === "MultiPolygon";
47867     }
47868     function clipPathID(d) {
47869       return "ideditor-data-" + d.__featurehash__ + "-clippath";
47870     }
47871     function featureClasses(d) {
47872       return [
47873         "data" + d.__featurehash__,
47874         d.geometry.type,
47875         isPolygon(d) ? "area" : "",
47876         d.__layerID__ || ""
47877       ].filter(Boolean).join(" ");
47878     }
47879     function drawData(selection2) {
47880       var vtService = getService();
47881       var getPath = svgPath(projection2).geojson;
47882       var getAreaPath = svgPath(projection2, null, true).geojson;
47883       var hasData = drawData.hasData();
47884       layer = selection2.selectAll(".layer-mapdata").data(_enabled && hasData ? [0] : []);
47885       layer.exit().remove();
47886       layer = layer.enter().append("g").attr("class", "layer-mapdata").merge(layer);
47887       var surface = context.surface();
47888       if (!surface || surface.empty())
47889         return;
47890       var geoData, polygonData;
47891       if (_template && vtService) {
47892         var sourceID = _template;
47893         vtService.loadTiles(sourceID, _template, projection2);
47894         geoData = vtService.data(sourceID, projection2);
47895       } else {
47896         geoData = getFeatures(_geojson);
47897       }
47898       geoData = geoData.filter(getPath);
47899       polygonData = geoData.filter(isPolygon);
47900       var clipPaths = surface.selectAll("defs").selectAll(".clipPath-data").data(polygonData, featureKey);
47901       clipPaths.exit().remove();
47902       var clipPathsEnter = clipPaths.enter().append("clipPath").attr("class", "clipPath-data").attr("id", clipPathID);
47903       clipPathsEnter.append("path");
47904       clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", getAreaPath);
47905       var datagroups = layer.selectAll("g.datagroup").data(["fill", "shadow", "stroke"]);
47906       datagroups = datagroups.enter().append("g").attr("class", function(d) {
47907         return "datagroup datagroup-" + d;
47908       }).merge(datagroups);
47909       var pathData = {
47910         fill: polygonData,
47911         shadow: geoData,
47912         stroke: geoData
47913       };
47914       var paths = datagroups.selectAll("path").data(function(layer2) {
47915         return pathData[layer2];
47916       }, featureKey);
47917       paths.exit().remove();
47918       paths = paths.enter().append("path").attr("class", function(d) {
47919         var datagroup = this.parentNode.__data__;
47920         return "pathdata " + datagroup + " " + featureClasses(d);
47921       }).attr("clip-path", function(d) {
47922         var datagroup = this.parentNode.__data__;
47923         return datagroup === "fill" ? "url(#" + clipPathID(d) + ")" : null;
47924       }).merge(paths).attr("d", function(d) {
47925         var datagroup = this.parentNode.__data__;
47926         return datagroup === "fill" ? getAreaPath(d) : getPath(d);
47927       });
47928       layer.call(drawLabels, "label-halo", geoData).call(drawLabels, "label", geoData);
47929       function drawLabels(selection3, textClass, data) {
47930         var labelPath = path_default(projection2);
47931         var labelData = data.filter(function(d) {
47932           return _showLabels && d.properties && (d.properties.desc || d.properties.name);
47933         });
47934         var labels = selection3.selectAll("text." + textClass).data(labelData, featureKey);
47935         labels.exit().remove();
47936         labels = labels.enter().append("text").attr("class", function(d) {
47937           return textClass + " " + featureClasses(d);
47938         }).merge(labels).text(function(d) {
47939           return d.properties.desc || d.properties.name;
47940         }).attr("x", function(d) {
47941           var centroid = labelPath.centroid(d);
47942           return centroid[0] + 11;
47943         }).attr("y", function(d) {
47944           var centroid = labelPath.centroid(d);
47945           return centroid[1];
47946         });
47947       }
47948     }
47949     function getExtension(fileName) {
47950       if (!fileName)
47951         return;
47952       var re2 = /\.(gpx|kml|(geo)?json)$/i;
47953       var match = fileName.toLowerCase().match(re2);
47954       return match && match.length && match[0];
47955     }
47956     function xmlToDom(textdata) {
47957       return new DOMParser().parseFromString(textdata, "text/xml");
47958     }
47959     function stringifyGeojsonProperties(feature3) {
47960       const properties = feature3.properties;
47961       for (const key in properties) {
47962         const property = properties[key];
47963         if (typeof property === "number" || typeof property === "boolean" || Array.isArray(property)) {
47964           properties[key] = property.toString();
47965         } else if (property === null) {
47966           properties[key] = "null";
47967         } else if (typeof property === "object") {
47968           properties[key] = JSON.stringify(property);
47969         }
47970       }
47971     }
47972     drawData.setFile = function(extension, data) {
47973       _template = null;
47974       _fileList = null;
47975       _geojson = null;
47976       _src = null;
47977       var gj;
47978       switch (extension) {
47979         case ".gpx":
47980           gj = gpx(xmlToDom(data));
47981           break;
47982         case ".kml":
47983           gj = kml(xmlToDom(data));
47984           break;
47985         case ".geojson":
47986         case ".json":
47987           gj = JSON.parse(data);
47988           if (gj.type === "FeatureCollection") {
47989             gj.features.forEach(stringifyGeojsonProperties);
47990           } else if (gj.type === "Feature") {
47991             stringifyGeojsonProperties(gj);
47992           }
47993           break;
47994       }
47995       gj = gj || {};
47996       if (Object.keys(gj).length) {
47997         _geojson = ensureIDs(gj);
47998         _src = extension + " data file";
47999         this.fitZoom();
48000       }
48001       dispatch10.call("change");
48002       return this;
48003     };
48004     drawData.showLabels = function(val) {
48005       if (!arguments.length)
48006         return _showLabels;
48007       _showLabels = val;
48008       return this;
48009     };
48010     drawData.enabled = function(val) {
48011       if (!arguments.length)
48012         return _enabled;
48013       _enabled = val;
48014       if (_enabled) {
48015         showLayer();
48016       } else {
48017         hideLayer();
48018       }
48019       dispatch10.call("change");
48020       return this;
48021     };
48022     drawData.hasData = function() {
48023       var gj = _geojson || {};
48024       return !!(_template || Object.keys(gj).length);
48025     };
48026     drawData.template = function(val, src) {
48027       if (!arguments.length)
48028         return _template;
48029       var osm = context.connection();
48030       if (osm) {
48031         var blocklists = osm.imageryBlocklists();
48032         var fail = false;
48033         var tested = 0;
48034         var regex;
48035         for (var i2 = 0; i2 < blocklists.length; i2++) {
48036           regex = blocklists[i2];
48037           fail = regex.test(val);
48038           tested++;
48039           if (fail)
48040             break;
48041         }
48042         if (!tested) {
48043           regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
48044           fail = regex.test(val);
48045         }
48046       }
48047       _template = val;
48048       _fileList = null;
48049       _geojson = null;
48050       _src = src || "vectortile:" + val.split(/[?#]/)[0];
48051       dispatch10.call("change");
48052       return this;
48053     };
48054     drawData.geojson = function(gj, src) {
48055       if (!arguments.length)
48056         return _geojson;
48057       _template = null;
48058       _fileList = null;
48059       _geojson = null;
48060       _src = null;
48061       gj = gj || {};
48062       if (Object.keys(gj).length) {
48063         _geojson = ensureIDs(gj);
48064         _src = src || "unknown.geojson";
48065       }
48066       dispatch10.call("change");
48067       return this;
48068     };
48069     drawData.fileList = function(fileList) {
48070       if (!arguments.length)
48071         return _fileList;
48072       _template = null;
48073       _fileList = fileList;
48074       _geojson = null;
48075       _src = null;
48076       if (!fileList || !fileList.length)
48077         return this;
48078       var f2 = fileList[0];
48079       var extension = getExtension(f2.name);
48080       var reader = new FileReader();
48081       reader.onload = function() {
48082         return function(e) {
48083           drawData.setFile(extension, e.target.result);
48084         };
48085       }(f2);
48086       reader.readAsText(f2);
48087       return this;
48088     };
48089     drawData.url = function(url, defaultExtension) {
48090       _template = null;
48091       _fileList = null;
48092       _geojson = null;
48093       _src = null;
48094       var testUrl = url.split(/[?#]/)[0];
48095       var extension = getExtension(testUrl) || defaultExtension;
48096       if (extension) {
48097         _template = null;
48098         text_default3(url).then(function(data) {
48099           drawData.setFile(extension, data);
48100         }).catch(function() {
48101         });
48102       } else {
48103         drawData.template(url);
48104       }
48105       return this;
48106     };
48107     drawData.getSrc = function() {
48108       return _src || "";
48109     };
48110     drawData.fitZoom = function() {
48111       var features = getFeatures(_geojson);
48112       if (!features.length)
48113         return;
48114       var map2 = context.map();
48115       var viewport = map2.trimmedExtent().polygon();
48116       var coords = features.reduce(function(coords2, feature3) {
48117         var geom = feature3.geometry;
48118         if (!geom)
48119           return coords2;
48120         var c = geom.coordinates;
48121         switch (geom.type) {
48122           case "Point":
48123             c = [c];
48124           case "MultiPoint":
48125           case "LineString":
48126             break;
48127           case "MultiPolygon":
48128             c = utilArrayFlatten(c);
48129           case "Polygon":
48130           case "MultiLineString":
48131             c = utilArrayFlatten(c);
48132             break;
48133         }
48134         return utilArrayUnion(coords2, c);
48135       }, []);
48136       if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
48137         var extent = geoExtent(bounds_default({ type: "LineString", coordinates: coords }));
48138         map2.centerZoom(extent.center(), map2.trimmedExtentZoom(extent));
48139       }
48140       return this;
48141     };
48142     init2();
48143     return drawData;
48144   }
48145
48146   // modules/svg/debug.js
48147   function svgDebug(projection2, context) {
48148     function drawDebug(selection2) {
48149       const showTile = context.getDebug("tile");
48150       const showCollision = context.getDebug("collision");
48151       const showImagery = context.getDebug("imagery");
48152       const showTouchTargets = context.getDebug("target");
48153       const showDownloaded = context.getDebug("downloaded");
48154       let debugData = [];
48155       if (showTile) {
48156         debugData.push({ class: "red", label: "tile" });
48157       }
48158       if (showCollision) {
48159         debugData.push({ class: "yellow", label: "collision" });
48160       }
48161       if (showImagery) {
48162         debugData.push({ class: "orange", label: "imagery" });
48163       }
48164       if (showTouchTargets) {
48165         debugData.push({ class: "pink", label: "touchTargets" });
48166       }
48167       if (showDownloaded) {
48168         debugData.push({ class: "purple", label: "downloaded" });
48169       }
48170       let legend = context.container().select(".main-content").selectAll(".debug-legend").data(debugData.length ? [0] : []);
48171       legend.exit().remove();
48172       legend = legend.enter().append("div").attr("class", "fillD debug-legend").merge(legend);
48173       let legendItems = legend.selectAll(".debug-legend-item").data(debugData, (d) => d.label);
48174       legendItems.exit().remove();
48175       legendItems.enter().append("span").attr("class", (d) => `debug-legend-item ${d.class}`).text((d) => d.label);
48176       let layer = selection2.selectAll(".layer-debug").data(showImagery || showDownloaded ? [0] : []);
48177       layer.exit().remove();
48178       layer = layer.enter().append("g").attr("class", "layer-debug").merge(layer);
48179       const extent = context.map().extent();
48180       _mainFileFetcher.get("imagery").then((d) => {
48181         const hits = showImagery && d.query.bbox(extent.rectangle(), true) || [];
48182         const features = hits.map((d2) => d2.features[d2.id]);
48183         let imagery = layer.selectAll("path.debug-imagery").data(features);
48184         imagery.exit().remove();
48185         imagery.enter().append("path").attr("class", "debug-imagery debug orange");
48186       }).catch(() => {
48187       });
48188       const osm = context.connection();
48189       let dataDownloaded = [];
48190       if (osm && showDownloaded) {
48191         const rtree = osm.caches("get").tile.rtree;
48192         dataDownloaded = rtree.all().map((bbox2) => {
48193           return {
48194             type: "Feature",
48195             properties: { id: bbox2.id },
48196             geometry: {
48197               type: "Polygon",
48198               coordinates: [[
48199                 [bbox2.minX, bbox2.minY],
48200                 [bbox2.minX, bbox2.maxY],
48201                 [bbox2.maxX, bbox2.maxY],
48202                 [bbox2.maxX, bbox2.minY],
48203                 [bbox2.minX, bbox2.minY]
48204               ]]
48205             }
48206           };
48207         });
48208       }
48209       let downloaded = layer.selectAll("path.debug-downloaded").data(showDownloaded ? dataDownloaded : []);
48210       downloaded.exit().remove();
48211       downloaded.enter().append("path").attr("class", "debug-downloaded debug purple");
48212       layer.selectAll("path").attr("d", svgPath(projection2).geojson);
48213     }
48214     drawDebug.enabled = function() {
48215       if (!arguments.length) {
48216         return context.getDebug("tile") || context.getDebug("collision") || context.getDebug("imagery") || context.getDebug("target") || context.getDebug("downloaded");
48217       } else {
48218         return this;
48219       }
48220     };
48221     return drawDebug;
48222   }
48223
48224   // modules/svg/defs.js
48225   function svgDefs(context) {
48226     var _defsSelection = select_default2(null);
48227     var _spritesheetIds = [
48228       "iD-sprite",
48229       "maki-sprite",
48230       "temaki-sprite",
48231       "fa-sprite",
48232       "community-sprite"
48233     ];
48234     function drawDefs(selection2) {
48235       _defsSelection = selection2.append("defs");
48236       _defsSelection.append("marker").attr("id", "ideditor-oneway-marker").attr("viewBox", "0 0 10 5").attr("refX", 2.5).attr("refY", 2.5).attr("markerWidth", 2).attr("markerHeight", 2).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "oneway-marker-path").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").attr("stroke", "none").attr("fill", "#000").attr("opacity", "0.75");
48237       function addSidedMarker(name, color2, offset) {
48238         _defsSelection.append("marker").attr("id", "ideditor-sided-marker-" + name).attr("viewBox", "0 0 2 2").attr("refX", 1).attr("refY", -offset).attr("markerWidth", 1.5).attr("markerHeight", 1.5).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "sided-marker-path sided-marker-" + name + "-path").attr("d", "M 0,0 L 1,1 L 2,0 z").attr("stroke", "none").attr("fill", color2);
48239       }
48240       addSidedMarker("natural", "rgb(170, 170, 170)", 0);
48241       addSidedMarker("coastline", "#77dede", 1);
48242       addSidedMarker("waterway", "#77dede", 1);
48243       addSidedMarker("barrier", "#ddd", 1);
48244       addSidedMarker("man_made", "#fff", 0);
48245       _defsSelection.append("marker").attr("id", "ideditor-viewfield-marker").attr("viewBox", "0 0 16 16").attr("refX", 8).attr("refY", 16).attr("markerWidth", 4).attr("markerHeight", 4).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "viewfield-marker-path").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").attr("fill", "#333").attr("fill-opacity", "0.75").attr("stroke", "#fff").attr("stroke-width", "0.5px").attr("stroke-opacity", "0.75");
48246       _defsSelection.append("marker").attr("id", "ideditor-viewfield-marker-wireframe").attr("viewBox", "0 0 16 16").attr("refX", 8).attr("refY", 16).attr("markerWidth", 4).attr("markerHeight", 4).attr("markerUnits", "strokeWidth").attr("orient", "auto").append("path").attr("class", "viewfield-marker-path").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").attr("fill", "none").attr("stroke", "#fff").attr("stroke-width", "0.5px").attr("stroke-opacity", "0.75");
48247       var patterns2 = _defsSelection.selectAll("pattern").data([
48248         // pattern name, pattern image name
48249         ["beach", "dots"],
48250         ["construction", "construction"],
48251         ["cemetery", "cemetery"],
48252         ["cemetery_christian", "cemetery_christian"],
48253         ["cemetery_buddhist", "cemetery_buddhist"],
48254         ["cemetery_muslim", "cemetery_muslim"],
48255         ["cemetery_jewish", "cemetery_jewish"],
48256         ["farmland", "farmland"],
48257         ["farmyard", "farmyard"],
48258         ["forest", "forest"],
48259         ["forest_broadleaved", "forest_broadleaved"],
48260         ["forest_needleleaved", "forest_needleleaved"],
48261         ["forest_leafless", "forest_leafless"],
48262         ["golf_green", "grass"],
48263         ["grass", "grass"],
48264         ["landfill", "landfill"],
48265         ["meadow", "grass"],
48266         ["orchard", "orchard"],
48267         ["pond", "pond"],
48268         ["quarry", "quarry"],
48269         ["scrub", "bushes"],
48270         ["vineyard", "vineyard"],
48271         ["water_standing", "lines"],
48272         ["waves", "waves"],
48273         ["wetland", "wetland"],
48274         ["wetland_marsh", "wetland_marsh"],
48275         ["wetland_swamp", "wetland_swamp"],
48276         ["wetland_bog", "wetland_bog"],
48277         ["wetland_reedbed", "wetland_reedbed"]
48278       ]).enter().append("pattern").attr("id", function(d) {
48279         return "ideditor-pattern-" + d[0];
48280       }).attr("width", 32).attr("height", 32).attr("patternUnits", "userSpaceOnUse");
48281       patterns2.append("rect").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("class", function(d) {
48282         return "pattern-color-" + d[0];
48283       });
48284       patterns2.append("image").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("xlink:href", function(d) {
48285         return context.imagePath("pattern/" + d[1] + ".png");
48286       });
48287       _defsSelection.selectAll("clipPath").data([12, 18, 20, 32, 45]).enter().append("clipPath").attr("id", function(d) {
48288         return "ideditor-clip-square-" + d;
48289       }).append("rect").attr("x", 0).attr("y", 0).attr("width", function(d) {
48290         return d;
48291       }).attr("height", function(d) {
48292         return d;
48293       });
48294       addSprites(_spritesheetIds, true);
48295     }
48296     function addSprites(ids, overrideColors) {
48297       _spritesheetIds = utilArrayUniq(_spritesheetIds.concat(ids));
48298       var spritesheets = _defsSelection.selectAll(".spritesheet").data(_spritesheetIds);
48299       spritesheets.enter().append("g").attr("class", function(d) {
48300         return "spritesheet spritesheet-" + d;
48301       }).each(function(d) {
48302         var url = context.imagePath(d + ".svg");
48303         var node = select_default2(this).node();
48304         svg(url).then(function(svg2) {
48305           node.appendChild(
48306             select_default2(svg2.documentElement).attr("id", "ideditor-" + d).node()
48307           );
48308           if (overrideColors && d !== "iD-sprite") {
48309             select_default2(node).selectAll("path").attr("fill", "currentColor");
48310           }
48311         }).catch(function() {
48312         });
48313       });
48314       spritesheets.exit().remove();
48315     }
48316     drawDefs.addSprites = addSprites;
48317     return drawDefs;
48318   }
48319
48320   // modules/svg/keepRight.js
48321   var _layerEnabled = false;
48322   var _qaService;
48323   function svgKeepRight(projection2, context, dispatch10) {
48324     const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
48325     const minZoom3 = 12;
48326     let touchLayer = select_default2(null);
48327     let drawLayer = select_default2(null);
48328     let layerVisible = false;
48329     function markerPath(selection2, klass) {
48330       selection2.attr("class", klass).attr("transform", "translate(-4, -24)").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");
48331     }
48332     function getService() {
48333       if (services.keepRight && !_qaService) {
48334         _qaService = services.keepRight;
48335         _qaService.on("loaded", throttledRedraw);
48336       } else if (!services.keepRight && _qaService) {
48337         _qaService = null;
48338       }
48339       return _qaService;
48340     }
48341     function editOn() {
48342       if (!layerVisible) {
48343         layerVisible = true;
48344         drawLayer.style("display", "block");
48345       }
48346     }
48347     function editOff() {
48348       if (layerVisible) {
48349         layerVisible = false;
48350         drawLayer.style("display", "none");
48351         drawLayer.selectAll(".qaItem.keepRight").remove();
48352         touchLayer.selectAll(".qaItem.keepRight").remove();
48353       }
48354     }
48355     function layerOn() {
48356       editOn();
48357       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
48358     }
48359     function layerOff() {
48360       throttledRedraw.cancel();
48361       drawLayer.interrupt();
48362       touchLayer.selectAll(".qaItem.keepRight").remove();
48363       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
48364         editOff();
48365         dispatch10.call("change");
48366       });
48367     }
48368     function updateMarkers() {
48369       if (!layerVisible || !_layerEnabled)
48370         return;
48371       const service = getService();
48372       const selectedID = context.selectedErrorID();
48373       const data = service ? service.getItems(projection2) : [];
48374       const getTransform = svgPointTransform(projection2);
48375       const markers = drawLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id);
48376       markers.exit().remove();
48377       const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`);
48378       markersEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
48379       markersEnter.append("path").call(markerPath, "shadow");
48380       markersEnter.append("use").attr("class", "qaItem-fill").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").attr("xlink:href", "#iD-icon-bolt");
48381       markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
48382       if (touchLayer.empty())
48383         return;
48384       const fillClass = context.getDebug("target") ? "pink " : "nocolor ";
48385       const targets = touchLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id);
48386       targets.exit().remove();
48387       targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform);
48388       function sortY(a, b) {
48389         return a.id === selectedID ? 1 : b.id === selectedID ? -1 : a.severity === "error" && b.severity !== "error" ? 1 : b.severity === "error" && a.severity !== "error" ? -1 : b.loc[1] - a.loc[1];
48390       }
48391     }
48392     function drawKeepRight(selection2) {
48393       const service = getService();
48394       const surface = context.surface();
48395       if (surface && !surface.empty()) {
48396         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
48397       }
48398       drawLayer = selection2.selectAll(".layer-keepRight").data(service ? [0] : []);
48399       drawLayer.exit().remove();
48400       drawLayer = drawLayer.enter().append("g").attr("class", "layer-keepRight").style("display", _layerEnabled ? "block" : "none").merge(drawLayer);
48401       if (_layerEnabled) {
48402         if (service && ~~context.map().zoom() >= minZoom3) {
48403           editOn();
48404           service.loadIssues(projection2);
48405           updateMarkers();
48406         } else {
48407           editOff();
48408         }
48409       }
48410     }
48411     drawKeepRight.enabled = function(val) {
48412       if (!arguments.length)
48413         return _layerEnabled;
48414       _layerEnabled = val;
48415       if (_layerEnabled) {
48416         layerOn();
48417       } else {
48418         layerOff();
48419         if (context.selectedErrorID()) {
48420           context.enter(modeBrowse(context));
48421         }
48422       }
48423       dispatch10.call("change");
48424       return this;
48425     };
48426     drawKeepRight.supported = () => !!getService();
48427     return drawKeepRight;
48428   }
48429
48430   // modules/svg/geolocate.js
48431   function svgGeolocate(projection2) {
48432     var layer = select_default2(null);
48433     var _position;
48434     function init2() {
48435       if (svgGeolocate.initialized)
48436         return;
48437       svgGeolocate.enabled = false;
48438       svgGeolocate.initialized = true;
48439     }
48440     function showLayer() {
48441       layer.style("display", "block");
48442     }
48443     function hideLayer() {
48444       layer.transition().duration(250).style("opacity", 0);
48445     }
48446     function layerOn() {
48447       layer.style("opacity", 0).transition().duration(250).style("opacity", 1);
48448     }
48449     function layerOff() {
48450       layer.style("display", "none");
48451     }
48452     function transform2(d) {
48453       return svgPointTransform(projection2)(d);
48454     }
48455     function accuracy(accuracy2, loc) {
48456       var degreesRadius = geoMetersToLat(accuracy2), tangentLoc = [loc[0], loc[1] + degreesRadius], projectedTangent = projection2(tangentLoc), projectedLoc = projection2([loc[0], loc[1]]);
48457       return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
48458     }
48459     function update() {
48460       var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
48461       var groups = layer.selectAll(".geolocations").selectAll(".geolocation").data([geolocation]);
48462       groups.exit().remove();
48463       var pointsEnter = groups.enter().append("g").attr("class", "geolocation");
48464       pointsEnter.append("circle").attr("class", "geolocate-radius").attr("dx", "0").attr("dy", "0").attr("fill", "rgb(15,128,225)").attr("fill-opacity", "0.3").attr("r", "0");
48465       pointsEnter.append("circle").attr("dx", "0").attr("dy", "0").attr("fill", "rgb(15,128,225)").attr("stroke", "white").attr("stroke-width", "1.5").attr("r", "6");
48466       groups.merge(pointsEnter).attr("transform", transform2);
48467       layer.select(".geolocate-radius").attr("r", accuracy(_position.coords.accuracy, geolocation.loc));
48468     }
48469     function drawLocation(selection2) {
48470       var enabled = svgGeolocate.enabled;
48471       layer = selection2.selectAll(".layer-geolocate").data([0]);
48472       layer.exit().remove();
48473       var layerEnter = layer.enter().append("g").attr("class", "layer-geolocate").style("display", enabled ? "block" : "none");
48474       layerEnter.append("g").attr("class", "geolocations");
48475       layer = layerEnter.merge(layer);
48476       if (enabled) {
48477         update();
48478       } else {
48479         layerOff();
48480       }
48481     }
48482     drawLocation.enabled = function(position, enabled) {
48483       if (!arguments.length)
48484         return svgGeolocate.enabled;
48485       _position = position;
48486       svgGeolocate.enabled = enabled;
48487       if (svgGeolocate.enabled) {
48488         showLayer();
48489         layerOn();
48490       } else {
48491         hideLayer();
48492       }
48493       return this;
48494     };
48495     init2();
48496     return drawLocation;
48497   }
48498
48499   // modules/svg/labels.js
48500   var import_rbush7 = __toESM(require_rbush_min());
48501   function svgLabels(projection2, context) {
48502     var path = path_default(projection2);
48503     var detected = utilDetect();
48504     var baselineHack = detected.ie || detected.browser.toLowerCase() === "edge" || detected.browser.toLowerCase() === "firefox" && detected.version >= 70;
48505     var _rdrawn = new import_rbush7.default();
48506     var _rskipped = new import_rbush7.default();
48507     var _textWidthCache = {};
48508     var _entitybboxes = {};
48509     var labelStack = [
48510       ["line", "aeroway", "*", 12],
48511       ["line", "highway", "motorway", 12],
48512       ["line", "highway", "trunk", 12],
48513       ["line", "highway", "primary", 12],
48514       ["line", "highway", "secondary", 12],
48515       ["line", "highway", "tertiary", 12],
48516       ["line", "highway", "*", 12],
48517       ["line", "railway", "*", 12],
48518       ["line", "waterway", "*", 12],
48519       ["area", "aeroway", "*", 12],
48520       ["area", "amenity", "*", 12],
48521       ["area", "building", "*", 12],
48522       ["area", "historic", "*", 12],
48523       ["area", "leisure", "*", 12],
48524       ["area", "man_made", "*", 12],
48525       ["area", "natural", "*", 12],
48526       ["area", "shop", "*", 12],
48527       ["area", "tourism", "*", 12],
48528       ["area", "camp_site", "*", 12],
48529       ["point", "aeroway", "*", 10],
48530       ["point", "amenity", "*", 10],
48531       ["point", "building", "*", 10],
48532       ["point", "historic", "*", 10],
48533       ["point", "leisure", "*", 10],
48534       ["point", "man_made", "*", 10],
48535       ["point", "natural", "*", 10],
48536       ["point", "shop", "*", 10],
48537       ["point", "tourism", "*", 10],
48538       ["point", "camp_site", "*", 10],
48539       ["line", "ref", "*", 12],
48540       ["area", "ref", "*", 12],
48541       ["point", "ref", "*", 10],
48542       ["line", "name", "*", 12],
48543       ["area", "name", "*", 12],
48544       ["point", "name", "*", 10]
48545     ];
48546     function shouldSkipIcon(preset) {
48547       var noIcons = ["building", "landuse", "natural"];
48548       return noIcons.some(function(s) {
48549         return preset.id.indexOf(s) >= 0;
48550       });
48551     }
48552     function get4(array2, prop) {
48553       return function(d, i2) {
48554         return array2[i2][prop];
48555       };
48556     }
48557     function textWidth(text2, size, elem) {
48558       var c = _textWidthCache[size];
48559       if (!c)
48560         c = _textWidthCache[size] = {};
48561       if (c[text2]) {
48562         return c[text2];
48563       } else if (elem) {
48564         c[text2] = elem.getComputedTextLength();
48565         return c[text2];
48566       } else {
48567         var str2 = encodeURIComponent(text2).match(/%[CDEFcdef]/g);
48568         if (str2 === null) {
48569           return size / 3 * 2 * text2.length;
48570         } else {
48571           return size / 3 * (2 * text2.length + str2.length);
48572         }
48573       }
48574     }
48575     function drawLinePaths(selection2, entities, filter2, classes, labels) {
48576       var paths = selection2.selectAll("path").filter(filter2).data(entities, osmEntity.key);
48577       paths.exit().remove();
48578       paths.enter().append("path").style("stroke-width", get4(labels, "font-size")).attr("id", function(d) {
48579         return "ideditor-labelpath-" + d.id;
48580       }).attr("class", classes).merge(paths).attr("d", get4(labels, "lineString"));
48581     }
48582     function drawLineLabels(selection2, entities, filter2, classes, labels) {
48583       var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key);
48584       texts.exit().remove();
48585       texts.enter().append("text").attr("class", function(d, i2) {
48586         return classes + " " + labels[i2].classes + " " + d.id;
48587       }).attr("dy", baselineHack ? "0.35em" : null).append("textPath").attr("class", "textpath");
48588       selection2.selectAll("text." + classes).selectAll(".textpath").filter(filter2).data(entities, osmEntity.key).attr("startOffset", "50%").attr("xlink:href", function(d) {
48589         return "#ideditor-labelpath-" + d.id;
48590       }).text(utilDisplayNameForPath);
48591     }
48592     function drawPointLabels(selection2, entities, filter2, classes, labels) {
48593       var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key);
48594       texts.exit().remove();
48595       texts.enter().append("text").attr("class", function(d, i2) {
48596         return classes + " " + labels[i2].classes + " " + d.id;
48597       }).merge(texts).attr("x", get4(labels, "x")).attr("y", get4(labels, "y")).style("text-anchor", get4(labels, "textAnchor")).text(utilDisplayName).each(function(d, i2) {
48598         textWidth(utilDisplayName(d), labels[i2].height, this);
48599       });
48600     }
48601     function drawAreaLabels(selection2, entities, filter2, classes, labels) {
48602       entities = entities.filter(hasText);
48603       labels = labels.filter(hasText);
48604       drawPointLabels(selection2, entities, filter2, classes, labels);
48605       function hasText(d, i2) {
48606         return labels[i2].hasOwnProperty("x") && labels[i2].hasOwnProperty("y");
48607       }
48608     }
48609     function drawAreaIcons(selection2, entities, filter2, classes, labels) {
48610       var icons = selection2.selectAll("use." + classes).filter(filter2).data(entities, osmEntity.key);
48611       icons.exit().remove();
48612       icons.enter().append("use").attr("class", "icon " + classes).attr("width", "17px").attr("height", "17px").merge(icons).attr("transform", get4(labels, "transform")).attr("xlink:href", function(d) {
48613         var preset = _mainPresetIndex.match(d, context.graph());
48614         var picon = preset && preset.icon;
48615         return picon ? "#" + picon : "";
48616       });
48617     }
48618     function drawCollisionBoxes(selection2, rtree, which) {
48619       var classes = "debug " + which + " " + (which === "debug-skipped" ? "orange" : "yellow");
48620       var gj = [];
48621       if (context.getDebug("collision")) {
48622         gj = rtree.all().map(function(d) {
48623           return { type: "Polygon", coordinates: [[
48624             [d.minX, d.minY],
48625             [d.maxX, d.minY],
48626             [d.maxX, d.maxY],
48627             [d.minX, d.maxY],
48628             [d.minX, d.minY]
48629           ]] };
48630         });
48631       }
48632       var boxes = selection2.selectAll("." + which).data(gj);
48633       boxes.exit().remove();
48634       boxes.enter().append("path").attr("class", classes).merge(boxes).attr("d", path_default());
48635     }
48636     function drawLabels(selection2, graph, entities, filter2, dimensions, fullRedraw) {
48637       var wireframe = context.surface().classed("fill-wireframe");
48638       var zoom = geoScaleToZoom(projection2.scale());
48639       var labelable = [];
48640       var renderNodeAs = {};
48641       var i2, j2, k, entity, geometry;
48642       for (i2 = 0; i2 < labelStack.length; i2++) {
48643         labelable.push([]);
48644       }
48645       if (fullRedraw) {
48646         _rdrawn.clear();
48647         _rskipped.clear();
48648         _entitybboxes = {};
48649       } else {
48650         for (i2 = 0; i2 < entities.length; i2++) {
48651           entity = entities[i2];
48652           var toRemove = [].concat(_entitybboxes[entity.id] || []).concat(_entitybboxes[entity.id + "I"] || []);
48653           for (j2 = 0; j2 < toRemove.length; j2++) {
48654             _rdrawn.remove(toRemove[j2]);
48655             _rskipped.remove(toRemove[j2]);
48656           }
48657         }
48658       }
48659       for (i2 = 0; i2 < entities.length; i2++) {
48660         entity = entities[i2];
48661         geometry = entity.geometry(graph);
48662         if (geometry === "point" || geometry === "vertex" && isInterestingVertex(entity)) {
48663           var hasDirections = entity.directions(graph, projection2).length;
48664           var markerPadding;
48665           if (!wireframe && geometry === "point" && !(zoom >= 18 && hasDirections)) {
48666             renderNodeAs[entity.id] = "point";
48667             markerPadding = 20;
48668           } else {
48669             renderNodeAs[entity.id] = "vertex";
48670             markerPadding = 0;
48671           }
48672           var coord2 = projection2(entity.loc);
48673           var nodePadding = 10;
48674           var bbox2 = {
48675             minX: coord2[0] - nodePadding,
48676             minY: coord2[1] - nodePadding - markerPadding,
48677             maxX: coord2[0] + nodePadding,
48678             maxY: coord2[1] + nodePadding
48679           };
48680           doInsert(bbox2, entity.id + "P");
48681         }
48682         if (geometry === "vertex") {
48683           geometry = "point";
48684         }
48685         var preset = geometry === "area" && _mainPresetIndex.match(entity, graph);
48686         var icon2 = preset && !shouldSkipIcon(preset) && preset.icon;
48687         if (!icon2 && !utilDisplayName(entity))
48688           continue;
48689         for (k = 0; k < labelStack.length; k++) {
48690           var matchGeom = labelStack[k][0];
48691           var matchKey = labelStack[k][1];
48692           var matchVal = labelStack[k][2];
48693           var hasVal = entity.tags[matchKey];
48694           if (geometry === matchGeom && hasVal && (matchVal === "*" || matchVal === hasVal)) {
48695             labelable[k].push(entity);
48696             break;
48697           }
48698         }
48699       }
48700       var positions = {
48701         point: [],
48702         line: [],
48703         area: []
48704       };
48705       var labelled = {
48706         point: [],
48707         line: [],
48708         area: []
48709       };
48710       for (k = 0; k < labelable.length; k++) {
48711         var fontSize = labelStack[k][3];
48712         for (i2 = 0; i2 < labelable[k].length; i2++) {
48713           entity = labelable[k][i2];
48714           geometry = entity.geometry(graph);
48715           var getName = geometry === "line" ? utilDisplayNameForPath : utilDisplayName;
48716           var name = getName(entity);
48717           var width = name && textWidth(name, fontSize);
48718           var p = null;
48719           if (geometry === "point" || geometry === "vertex") {
48720             if (wireframe)
48721               continue;
48722             var renderAs = renderNodeAs[entity.id];
48723             if (renderAs === "vertex" && zoom < 17)
48724               continue;
48725             p = getPointLabel(entity, width, fontSize, renderAs);
48726           } else if (geometry === "line") {
48727             p = getLineLabel(entity, width, fontSize);
48728           } else if (geometry === "area") {
48729             p = getAreaLabel(entity, width, fontSize);
48730           }
48731           if (p) {
48732             if (geometry === "vertex") {
48733               geometry = "point";
48734             }
48735             p.classes = geometry + " tag-" + labelStack[k][1];
48736             positions[geometry].push(p);
48737             labelled[geometry].push(entity);
48738           }
48739         }
48740       }
48741       function isInterestingVertex(entity2) {
48742         var selectedIDs = context.selectedIDs();
48743         return entity2.hasInterestingTags() || entity2.isEndpoint(graph) || entity2.isConnected(graph) || selectedIDs.indexOf(entity2.id) !== -1 || graph.parentWays(entity2).some(function(parent) {
48744           return selectedIDs.indexOf(parent.id) !== -1;
48745         });
48746       }
48747       function getPointLabel(entity2, width2, height, geometry2) {
48748         var y = geometry2 === "point" ? -12 : 0;
48749         var pointOffsets = {
48750           ltr: [15, y, "start"],
48751           rtl: [-15, y, "end"]
48752         };
48753         var textDirection = _mainLocalizer.textDirection();
48754         var coord3 = projection2(entity2.loc);
48755         var textPadding = 2;
48756         var offset = pointOffsets[textDirection];
48757         var p2 = {
48758           height,
48759           width: width2,
48760           x: coord3[0] + offset[0],
48761           y: coord3[1] + offset[1],
48762           textAnchor: offset[2]
48763         };
48764         var bbox3;
48765         if (textDirection === "rtl") {
48766           bbox3 = {
48767             minX: p2.x - width2 - textPadding,
48768             minY: p2.y - height / 2 - textPadding,
48769             maxX: p2.x + textPadding,
48770             maxY: p2.y + height / 2 + textPadding
48771           };
48772         } else {
48773           bbox3 = {
48774             minX: p2.x - textPadding,
48775             minY: p2.y - height / 2 - textPadding,
48776             maxX: p2.x + width2 + textPadding,
48777             maxY: p2.y + height / 2 + textPadding
48778           };
48779         }
48780         if (tryInsert([bbox3], entity2.id, true)) {
48781           return p2;
48782         }
48783       }
48784       function getLineLabel(entity2, width2, height) {
48785         var viewport = geoExtent(context.projection.clipExtent()).polygon();
48786         var points = graph.childNodes(entity2).map(function(node) {
48787           return projection2(node.loc);
48788         });
48789         var length = geoPathLength(points);
48790         if (length < width2 + 20)
48791           return;
48792         var lineOffsets = [
48793           50,
48794           45,
48795           55,
48796           40,
48797           60,
48798           35,
48799           65,
48800           30,
48801           70,
48802           25,
48803           75,
48804           20,
48805           80,
48806           15,
48807           95,
48808           10,
48809           90,
48810           5,
48811           95
48812         ];
48813         var padding = 3;
48814         for (var i3 = 0; i3 < lineOffsets.length; i3++) {
48815           var offset = lineOffsets[i3];
48816           var middle = offset / 100 * length;
48817           var start2 = middle - width2 / 2;
48818           if (start2 < 0 || start2 + width2 > length)
48819             continue;
48820           var sub = subpath(points, start2, start2 + width2);
48821           if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
48822             continue;
48823           }
48824           var isReverse = reverse(sub);
48825           if (isReverse) {
48826             sub = sub.reverse();
48827           }
48828           var bboxes = [];
48829           var boxsize = (height + 2) / 2;
48830           for (var j3 = 0; j3 < sub.length - 1; j3++) {
48831             var a = sub[j3];
48832             var b = sub[j3 + 1];
48833             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
48834             for (var box = 0; box < num; box++) {
48835               var p2 = geoVecInterp(a, b, box / num);
48836               var x05 = p2[0] - boxsize - padding;
48837               var y05 = p2[1] - boxsize - padding;
48838               var x12 = p2[0] + boxsize + padding;
48839               var y12 = p2[1] + boxsize + padding;
48840               bboxes.push({
48841                 minX: Math.min(x05, x12),
48842                 minY: Math.min(y05, y12),
48843                 maxX: Math.max(x05, x12),
48844                 maxY: Math.max(y05, y12)
48845               });
48846             }
48847           }
48848           if (tryInsert(bboxes, entity2.id, false)) {
48849             return {
48850               "font-size": height + 2,
48851               lineString: lineString2(sub),
48852               startOffset: offset + "%"
48853             };
48854           }
48855         }
48856         function reverse(p3) {
48857           var angle2 = Math.atan2(p3[1][1] - p3[0][1], p3[1][0] - p3[0][0]);
48858           return !(p3[0][0] < p3[p3.length - 1][0] && angle2 < Math.PI / 2 && angle2 > -Math.PI / 2);
48859         }
48860         function lineString2(points2) {
48861           return "M" + points2.join("L");
48862         }
48863         function subpath(points2, from, to) {
48864           var sofar = 0;
48865           var start3, end, i0, i1;
48866           for (var i4 = 0; i4 < points2.length - 1; i4++) {
48867             var a2 = points2[i4];
48868             var b2 = points2[i4 + 1];
48869             var current = geoVecLength(a2, b2);
48870             var portion;
48871             if (!start3 && sofar + current >= from) {
48872               portion = (from - sofar) / current;
48873               start3 = [
48874                 a2[0] + portion * (b2[0] - a2[0]),
48875                 a2[1] + portion * (b2[1] - a2[1])
48876               ];
48877               i0 = i4 + 1;
48878             }
48879             if (!end && sofar + current >= to) {
48880               portion = (to - sofar) / current;
48881               end = [
48882                 a2[0] + portion * (b2[0] - a2[0]),
48883                 a2[1] + portion * (b2[1] - a2[1])
48884               ];
48885               i1 = i4 + 1;
48886             }
48887             sofar += current;
48888           }
48889           var result = points2.slice(i0, i1);
48890           result.unshift(start3);
48891           result.push(end);
48892           return result;
48893         }
48894       }
48895       function getAreaLabel(entity2, width2, height) {
48896         var centroid = path.centroid(entity2.asGeoJSON(graph));
48897         var extent = entity2.extent(graph);
48898         var areaWidth = projection2(extent[1])[0] - projection2(extent[0])[0];
48899         if (isNaN(centroid[0]) || areaWidth < 20)
48900           return;
48901         var preset2 = _mainPresetIndex.match(entity2, context.graph());
48902         var picon = preset2 && preset2.icon;
48903         var iconSize = 17;
48904         var padding = 2;
48905         var p2 = {};
48906         if (picon) {
48907           if (addIcon()) {
48908             addLabel(iconSize + padding);
48909             return p2;
48910           }
48911         } else {
48912           if (addLabel(0)) {
48913             return p2;
48914           }
48915         }
48916         function addIcon() {
48917           var iconX = centroid[0] - iconSize / 2;
48918           var iconY = centroid[1] - iconSize / 2;
48919           var bbox3 = {
48920             minX: iconX,
48921             minY: iconY,
48922             maxX: iconX + iconSize,
48923             maxY: iconY + iconSize
48924           };
48925           if (tryInsert([bbox3], entity2.id + "I", true)) {
48926             p2.transform = "translate(" + iconX + "," + iconY + ")";
48927             return true;
48928           }
48929           return false;
48930         }
48931         function addLabel(yOffset) {
48932           if (width2 && areaWidth >= width2 + 20) {
48933             var labelX = centroid[0];
48934             var labelY = centroid[1] + yOffset;
48935             var bbox3 = {
48936               minX: labelX - width2 / 2 - padding,
48937               minY: labelY - height / 2 - padding,
48938               maxX: labelX + width2 / 2 + padding,
48939               maxY: labelY + height / 2 + padding
48940             };
48941             if (tryInsert([bbox3], entity2.id, true)) {
48942               p2.x = labelX;
48943               p2.y = labelY;
48944               p2.textAnchor = "middle";
48945               p2.height = height;
48946               return true;
48947             }
48948           }
48949           return false;
48950         }
48951       }
48952       function doInsert(bbox3, id2) {
48953         bbox3.id = id2;
48954         var oldbox = _entitybboxes[id2];
48955         if (oldbox) {
48956           _rdrawn.remove(oldbox);
48957         }
48958         _entitybboxes[id2] = bbox3;
48959         _rdrawn.insert(bbox3);
48960       }
48961       function tryInsert(bboxes, id2, saveSkipped) {
48962         var skipped = false;
48963         for (var i3 = 0; i3 < bboxes.length; i3++) {
48964           var bbox3 = bboxes[i3];
48965           bbox3.id = id2;
48966           if (bbox3.minX < 0 || bbox3.minY < 0 || bbox3.maxX > dimensions[0] || bbox3.maxY > dimensions[1]) {
48967             skipped = true;
48968             break;
48969           }
48970           if (_rdrawn.collides(bbox3)) {
48971             skipped = true;
48972             break;
48973           }
48974         }
48975         _entitybboxes[id2] = bboxes;
48976         if (skipped) {
48977           if (saveSkipped) {
48978             _rskipped.load(bboxes);
48979           }
48980         } else {
48981           _rdrawn.load(bboxes);
48982         }
48983         return !skipped;
48984       }
48985       var layer = selection2.selectAll(".layer-osm.labels");
48986       layer.selectAll(".labels-group").data(["halo", "label", "debug"]).enter().append("g").attr("class", function(d) {
48987         return "labels-group " + d;
48988       });
48989       var halo = layer.selectAll(".labels-group.halo");
48990       var label = layer.selectAll(".labels-group.label");
48991       var debug2 = layer.selectAll(".labels-group.debug");
48992       drawPointLabels(label, labelled.point, filter2, "pointlabel", positions.point);
48993       drawPointLabels(halo, labelled.point, filter2, "pointlabel-halo", positions.point);
48994       drawLinePaths(layer, labelled.line, filter2, "", positions.line);
48995       drawLineLabels(label, labelled.line, filter2, "linelabel", positions.line);
48996       drawLineLabels(halo, labelled.line, filter2, "linelabel-halo", positions.line);
48997       drawAreaLabels(label, labelled.area, filter2, "arealabel", positions.area);
48998       drawAreaLabels(halo, labelled.area, filter2, "arealabel-halo", positions.area);
48999       drawAreaIcons(label, labelled.area, filter2, "areaicon", positions.area);
49000       drawAreaIcons(halo, labelled.area, filter2, "areaicon-halo", positions.area);
49001       drawCollisionBoxes(debug2, _rskipped, "debug-skipped");
49002       drawCollisionBoxes(debug2, _rdrawn, "debug-drawn");
49003       layer.call(filterLabels);
49004     }
49005     function filterLabels(selection2) {
49006       var drawLayer = selection2.selectAll(".layer-osm.labels");
49007       var layers = drawLayer.selectAll(".labels-group.halo, .labels-group.label");
49008       layers.selectAll(".nolabel").classed("nolabel", false);
49009       var mouse = context.map().mouse();
49010       var graph = context.graph();
49011       var selectedIDs = context.selectedIDs();
49012       var ids = [];
49013       var pad2, bbox2;
49014       if (mouse) {
49015         pad2 = 20;
49016         bbox2 = { minX: mouse[0] - pad2, minY: mouse[1] - pad2, maxX: mouse[0] + pad2, maxY: mouse[1] + pad2 };
49017         var nearMouse = _rdrawn.search(bbox2).map(function(entity2) {
49018           return entity2.id;
49019         });
49020         ids.push.apply(ids, nearMouse);
49021       }
49022       for (var i2 = 0; i2 < selectedIDs.length; i2++) {
49023         var entity = graph.hasEntity(selectedIDs[i2]);
49024         if (entity && entity.type === "node") {
49025           ids.push(selectedIDs[i2]);
49026         }
49027       }
49028       layers.selectAll(utilEntitySelector(ids)).classed("nolabel", true);
49029       var debug2 = selection2.selectAll(".labels-group.debug");
49030       var gj = [];
49031       if (context.getDebug("collision")) {
49032         gj = bbox2 ? [{
49033           type: "Polygon",
49034           coordinates: [[
49035             [bbox2.minX, bbox2.minY],
49036             [bbox2.maxX, bbox2.minY],
49037             [bbox2.maxX, bbox2.maxY],
49038             [bbox2.minX, bbox2.maxY],
49039             [bbox2.minX, bbox2.minY]
49040           ]]
49041         }] : [];
49042       }
49043       var box = debug2.selectAll(".debug-mouse").data(gj);
49044       box.exit().remove();
49045       box.enter().append("path").attr("class", "debug debug-mouse yellow").merge(box).attr("d", path_default());
49046     }
49047     var throttleFilterLabels = throttle_default(filterLabels, 100);
49048     drawLabels.observe = function(selection2) {
49049       var listener = function() {
49050         throttleFilterLabels(selection2);
49051       };
49052       selection2.on("mousemove.hidelabels", listener);
49053       context.on("enter.hidelabels", listener);
49054     };
49055     drawLabels.off = function(selection2) {
49056       throttleFilterLabels.cancel();
49057       selection2.on("mousemove.hidelabels", null);
49058       context.on("enter.hidelabels", null);
49059     };
49060     return drawLabels;
49061   }
49062
49063   // modules/svg/improveOSM.js
49064   var _layerEnabled2 = false;
49065   var _qaService2;
49066   function svgImproveOSM(projection2, context, dispatch10) {
49067     const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
49068     const minZoom3 = 12;
49069     let touchLayer = select_default2(null);
49070     let drawLayer = select_default2(null);
49071     let layerVisible = false;
49072     function markerPath(selection2, klass) {
49073       selection2.attr("class", klass).attr("transform", "translate(-10, -28)").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");
49074     }
49075     function getService() {
49076       if (services.improveOSM && !_qaService2) {
49077         _qaService2 = services.improveOSM;
49078         _qaService2.on("loaded", throttledRedraw);
49079       } else if (!services.improveOSM && _qaService2) {
49080         _qaService2 = null;
49081       }
49082       return _qaService2;
49083     }
49084     function editOn() {
49085       if (!layerVisible) {
49086         layerVisible = true;
49087         drawLayer.style("display", "block");
49088       }
49089     }
49090     function editOff() {
49091       if (layerVisible) {
49092         layerVisible = false;
49093         drawLayer.style("display", "none");
49094         drawLayer.selectAll(".qaItem.improveOSM").remove();
49095         touchLayer.selectAll(".qaItem.improveOSM").remove();
49096       }
49097     }
49098     function layerOn() {
49099       editOn();
49100       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
49101     }
49102     function layerOff() {
49103       throttledRedraw.cancel();
49104       drawLayer.interrupt();
49105       touchLayer.selectAll(".qaItem.improveOSM").remove();
49106       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
49107         editOff();
49108         dispatch10.call("change");
49109       });
49110     }
49111     function updateMarkers() {
49112       if (!layerVisible || !_layerEnabled2)
49113         return;
49114       const service = getService();
49115       const selectedID = context.selectedErrorID();
49116       const data = service ? service.getItems(projection2) : [];
49117       const getTransform = svgPointTransform(projection2);
49118       const markers = drawLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id);
49119       markers.exit().remove();
49120       const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
49121       markersEnter.append("polygon").call(markerPath, "shadow");
49122       markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke");
49123       markersEnter.append("polygon").attr("fill", "currentColor").call(markerPath, "qaItem-fill");
49124       markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
49125       markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
49126       if (touchLayer.empty())
49127         return;
49128       const fillClass = context.getDebug("target") ? "pink " : "nocolor ";
49129       const targets = touchLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id);
49130       targets.exit().remove();
49131       targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform);
49132       function sortY(a, b) {
49133         return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
49134       }
49135     }
49136     function drawImproveOSM(selection2) {
49137       const service = getService();
49138       const surface = context.surface();
49139       if (surface && !surface.empty()) {
49140         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
49141       }
49142       drawLayer = selection2.selectAll(".layer-improveOSM").data(service ? [0] : []);
49143       drawLayer.exit().remove();
49144       drawLayer = drawLayer.enter().append("g").attr("class", "layer-improveOSM").style("display", _layerEnabled2 ? "block" : "none").merge(drawLayer);
49145       if (_layerEnabled2) {
49146         if (service && ~~context.map().zoom() >= minZoom3) {
49147           editOn();
49148           service.loadIssues(projection2);
49149           updateMarkers();
49150         } else {
49151           editOff();
49152         }
49153       }
49154     }
49155     drawImproveOSM.enabled = function(val) {
49156       if (!arguments.length)
49157         return _layerEnabled2;
49158       _layerEnabled2 = val;
49159       if (_layerEnabled2) {
49160         layerOn();
49161       } else {
49162         layerOff();
49163         if (context.selectedErrorID()) {
49164           context.enter(modeBrowse(context));
49165         }
49166       }
49167       dispatch10.call("change");
49168       return this;
49169     };
49170     drawImproveOSM.supported = () => !!getService();
49171     return drawImproveOSM;
49172   }
49173
49174   // modules/svg/osmose.js
49175   var _layerEnabled3 = false;
49176   var _qaService3;
49177   function svgOsmose(projection2, context, dispatch10) {
49178     const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
49179     const minZoom3 = 12;
49180     let touchLayer = select_default2(null);
49181     let drawLayer = select_default2(null);
49182     let layerVisible = false;
49183     function markerPath(selection2, klass) {
49184       selection2.attr("class", klass).attr("transform", "translate(-10, -28)").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");
49185     }
49186     function getService() {
49187       if (services.osmose && !_qaService3) {
49188         _qaService3 = services.osmose;
49189         _qaService3.on("loaded", throttledRedraw);
49190       } else if (!services.osmose && _qaService3) {
49191         _qaService3 = null;
49192       }
49193       return _qaService3;
49194     }
49195     function editOn() {
49196       if (!layerVisible) {
49197         layerVisible = true;
49198         drawLayer.style("display", "block");
49199       }
49200     }
49201     function editOff() {
49202       if (layerVisible) {
49203         layerVisible = false;
49204         drawLayer.style("display", "none");
49205         drawLayer.selectAll(".qaItem.osmose").remove();
49206         touchLayer.selectAll(".qaItem.osmose").remove();
49207       }
49208     }
49209     function layerOn() {
49210       editOn();
49211       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
49212     }
49213     function layerOff() {
49214       throttledRedraw.cancel();
49215       drawLayer.interrupt();
49216       touchLayer.selectAll(".qaItem.osmose").remove();
49217       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
49218         editOff();
49219         dispatch10.call("change");
49220       });
49221     }
49222     function updateMarkers() {
49223       if (!layerVisible || !_layerEnabled3)
49224         return;
49225       const service = getService();
49226       const selectedID = context.selectedErrorID();
49227       const data = service ? service.getItems(projection2) : [];
49228       const getTransform = svgPointTransform(projection2);
49229       const markers = drawLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id);
49230       markers.exit().remove();
49231       const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
49232       markersEnter.append("polygon").call(markerPath, "shadow");
49233       markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke");
49234       markersEnter.append("polygon").attr("fill", (d) => service.getColor(d.item)).call(markerPath, "qaItem-fill");
49235       markersEnter.append("use").attr("class", "icon-annotation").attr("transform", "translate(-6, -22)").attr("width", "12px").attr("height", "12px").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
49236       markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
49237       if (touchLayer.empty())
49238         return;
49239       const fillClass = context.getDebug("target") ? "pink" : "nocolor";
49240       const targets = touchLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id);
49241       targets.exit().remove();
49242       targets.enter().append("rect").attr("width", "20px").attr("height", "30px").attr("x", "-10px").attr("y", "-28px").merge(targets).sort(sortY).attr("class", (d) => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`).attr("transform", getTransform);
49243       function sortY(a, b) {
49244         return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
49245       }
49246     }
49247     function drawOsmose(selection2) {
49248       const service = getService();
49249       const surface = context.surface();
49250       if (surface && !surface.empty()) {
49251         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
49252       }
49253       drawLayer = selection2.selectAll(".layer-osmose").data(service ? [0] : []);
49254       drawLayer.exit().remove();
49255       drawLayer = drawLayer.enter().append("g").attr("class", "layer-osmose").style("display", _layerEnabled3 ? "block" : "none").merge(drawLayer);
49256       if (_layerEnabled3) {
49257         if (service && ~~context.map().zoom() >= minZoom3) {
49258           editOn();
49259           service.loadIssues(projection2);
49260           updateMarkers();
49261         } else {
49262           editOff();
49263         }
49264       }
49265     }
49266     drawOsmose.enabled = function(val) {
49267       if (!arguments.length)
49268         return _layerEnabled3;
49269       _layerEnabled3 = val;
49270       if (_layerEnabled3) {
49271         getService().loadStrings().then(layerOn).catch((err) => {
49272           console.log(err);
49273         });
49274       } else {
49275         layerOff();
49276         if (context.selectedErrorID()) {
49277           context.enter(modeBrowse(context));
49278         }
49279       }
49280       dispatch10.call("change");
49281       return this;
49282     };
49283     drawOsmose.supported = () => !!getService();
49284     return drawOsmose;
49285   }
49286
49287   // modules/svg/streetside.js
49288   function svgStreetside(projection2, context, dispatch10) {
49289     var throttledRedraw = throttle_default(function() {
49290       dispatch10.call("change");
49291     }, 1e3);
49292     var minZoom3 = 14;
49293     var minMarkerZoom = 16;
49294     var minViewfieldZoom = 18;
49295     var layer = select_default2(null);
49296     var _viewerYaw = 0;
49297     var _selectedSequence = null;
49298     var _streetside;
49299     function init2() {
49300       if (svgStreetside.initialized)
49301         return;
49302       svgStreetside.enabled = false;
49303       svgStreetside.initialized = true;
49304     }
49305     function getService() {
49306       if (services.streetside && !_streetside) {
49307         _streetside = services.streetside;
49308         _streetside.event.on("viewerChanged.svgStreetside", viewerChanged).on("loadedImages.svgStreetside", throttledRedraw);
49309       } else if (!services.streetside && _streetside) {
49310         _streetside = null;
49311       }
49312       return _streetside;
49313     }
49314     function showLayer() {
49315       var service = getService();
49316       if (!service)
49317         return;
49318       editOn();
49319       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
49320         dispatch10.call("change");
49321       });
49322     }
49323     function hideLayer() {
49324       throttledRedraw.cancel();
49325       layer.transition().duration(250).style("opacity", 0).on("end", editOff);
49326     }
49327     function editOn() {
49328       layer.style("display", "block");
49329     }
49330     function editOff() {
49331       layer.selectAll(".viewfield-group").remove();
49332       layer.style("display", "none");
49333     }
49334     function click(d3_event, d) {
49335       var service = getService();
49336       if (!service)
49337         return;
49338       if (d.sequenceKey !== _selectedSequence) {
49339         _viewerYaw = 0;
49340       }
49341       _selectedSequence = d.sequenceKey;
49342       service.ensureViewerLoaded(context).then(function() {
49343         service.selectImage(context, d.key).yaw(_viewerYaw).showViewer(context);
49344       });
49345       context.map().centerEase(d.loc);
49346     }
49347     function mouseover(d3_event, d) {
49348       var service = getService();
49349       if (service)
49350         service.setStyles(context, d);
49351     }
49352     function mouseout() {
49353       var service = getService();
49354       if (service)
49355         service.setStyles(context, null);
49356     }
49357     function transform2(d) {
49358       var t = svgPointTransform(projection2)(d);
49359       var rot = d.ca + _viewerYaw;
49360       if (rot) {
49361         t += " rotate(" + Math.floor(rot) + ",0,0)";
49362       }
49363       return t;
49364     }
49365     function viewerChanged() {
49366       var service = getService();
49367       if (!service)
49368         return;
49369       var viewer = service.viewer();
49370       if (!viewer)
49371         return;
49372       _viewerYaw = viewer.getYaw();
49373       if (context.map().isTransformed())
49374         return;
49375       layer.selectAll(".viewfield-group.currentView").attr("transform", transform2);
49376     }
49377     function filterBubbles(bubbles) {
49378       var fromDate = context.photos().fromDate();
49379       var toDate = context.photos().toDate();
49380       var usernames = context.photos().usernames();
49381       if (fromDate) {
49382         var fromTimestamp = new Date(fromDate).getTime();
49383         bubbles = bubbles.filter(function(bubble) {
49384           return new Date(bubble.captured_at).getTime() >= fromTimestamp;
49385         });
49386       }
49387       if (toDate) {
49388         var toTimestamp = new Date(toDate).getTime();
49389         bubbles = bubbles.filter(function(bubble) {
49390           return new Date(bubble.captured_at).getTime() <= toTimestamp;
49391         });
49392       }
49393       if (usernames) {
49394         bubbles = bubbles.filter(function(bubble) {
49395           return usernames.indexOf(bubble.captured_by) !== -1;
49396         });
49397       }
49398       return bubbles;
49399     }
49400     function filterSequences(sequences) {
49401       var fromDate = context.photos().fromDate();
49402       var toDate = context.photos().toDate();
49403       var usernames = context.photos().usernames();
49404       if (fromDate) {
49405         var fromTimestamp = new Date(fromDate).getTime();
49406         sequences = sequences.filter(function(sequences2) {
49407           return new Date(sequences2.properties.captured_at).getTime() >= fromTimestamp;
49408         });
49409       }
49410       if (toDate) {
49411         var toTimestamp = new Date(toDate).getTime();
49412         sequences = sequences.filter(function(sequences2) {
49413           return new Date(sequences2.properties.captured_at).getTime() <= toTimestamp;
49414         });
49415       }
49416       if (usernames) {
49417         sequences = sequences.filter(function(sequences2) {
49418           return usernames.indexOf(sequences2.properties.captured_by) !== -1;
49419         });
49420       }
49421       return sequences;
49422     }
49423     function update() {
49424       var viewer = context.container().select(".photoviewer");
49425       var selected = viewer.empty() ? void 0 : viewer.datum();
49426       var z = ~~context.map().zoom();
49427       var showMarkers = z >= minMarkerZoom;
49428       var showViewfields = z >= minViewfieldZoom;
49429       var service = getService();
49430       var sequences = [];
49431       var bubbles = [];
49432       if (context.photos().showsPanoramic()) {
49433         sequences = service ? service.sequences(projection2) : [];
49434         bubbles = service && showMarkers ? service.bubbles(projection2) : [];
49435         sequences = filterSequences(sequences);
49436         bubbles = filterBubbles(bubbles);
49437       }
49438       var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
49439         return d.properties.key;
49440       });
49441       traces.exit().remove();
49442       traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
49443       var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(bubbles, function(d) {
49444         return d.key + (d.sequenceKey ? "v1" : "v0");
49445       });
49446       groups.exit().remove();
49447       var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
49448       groupsEnter.append("g").attr("class", "viewfield-scale");
49449       var markers = groups.merge(groupsEnter).sort(function(a, b) {
49450         return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
49451       }).attr("transform", transform2).select(".viewfield-scale");
49452       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
49453       var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
49454       viewfields.exit().remove();
49455       viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath);
49456       function viewfieldPath() {
49457         var d = this.parentNode.__data__;
49458         if (d.pano) {
49459           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
49460         } else {
49461           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
49462         }
49463       }
49464     }
49465     function drawImages(selection2) {
49466       var enabled = svgStreetside.enabled;
49467       var service = getService();
49468       layer = selection2.selectAll(".layer-streetside-images").data(service ? [0] : []);
49469       layer.exit().remove();
49470       var layerEnter = layer.enter().append("g").attr("class", "layer-streetside-images").style("display", enabled ? "block" : "none");
49471       layerEnter.append("g").attr("class", "sequences");
49472       layerEnter.append("g").attr("class", "markers");
49473       layer = layerEnter.merge(layer);
49474       if (enabled) {
49475         if (service && ~~context.map().zoom() >= minZoom3) {
49476           editOn();
49477           update();
49478           service.loadBubbles(projection2);
49479         } else {
49480           editOff();
49481         }
49482       }
49483     }
49484     drawImages.enabled = function(_) {
49485       if (!arguments.length)
49486         return svgStreetside.enabled;
49487       svgStreetside.enabled = _;
49488       if (svgStreetside.enabled) {
49489         showLayer();
49490         context.photos().on("change.streetside", update);
49491       } else {
49492         hideLayer();
49493         context.photos().on("change.streetside", null);
49494       }
49495       dispatch10.call("change");
49496       return this;
49497     };
49498     drawImages.supported = function() {
49499       return !!getService();
49500     };
49501     init2();
49502     return drawImages;
49503   }
49504
49505   // modules/svg/mapillary_images.js
49506   function svgMapillaryImages(projection2, context, dispatch10) {
49507     const throttledRedraw = throttle_default(function() {
49508       dispatch10.call("change");
49509     }, 1e3);
49510     const minZoom3 = 12;
49511     const minMarkerZoom = 16;
49512     const minViewfieldZoom = 18;
49513     let layer = select_default2(null);
49514     let _mapillary;
49515     function init2() {
49516       if (svgMapillaryImages.initialized)
49517         return;
49518       svgMapillaryImages.enabled = false;
49519       svgMapillaryImages.initialized = true;
49520     }
49521     function getService() {
49522       if (services.mapillary && !_mapillary) {
49523         _mapillary = services.mapillary;
49524         _mapillary.event.on("loadedImages", throttledRedraw);
49525       } else if (!services.mapillary && _mapillary) {
49526         _mapillary = null;
49527       }
49528       return _mapillary;
49529     }
49530     function showLayer() {
49531       const service = getService();
49532       if (!service)
49533         return;
49534       editOn();
49535       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
49536         dispatch10.call("change");
49537       });
49538     }
49539     function hideLayer() {
49540       throttledRedraw.cancel();
49541       layer.transition().duration(250).style("opacity", 0).on("end", editOff);
49542     }
49543     function editOn() {
49544       layer.style("display", "block");
49545     }
49546     function editOff() {
49547       layer.selectAll(".viewfield-group").remove();
49548       layer.style("display", "none");
49549     }
49550     function click(d3_event, image) {
49551       const service = getService();
49552       if (!service)
49553         return;
49554       service.ensureViewerLoaded(context).then(function() {
49555         service.selectImage(context, image.id).showViewer(context);
49556       });
49557       context.map().centerEase(image.loc);
49558     }
49559     function mouseover(d3_event, image) {
49560       const service = getService();
49561       if (service)
49562         service.setStyles(context, image);
49563     }
49564     function mouseout() {
49565       const service = getService();
49566       if (service)
49567         service.setStyles(context, null);
49568     }
49569     function transform2(d) {
49570       let t = svgPointTransform(projection2)(d);
49571       if (d.ca) {
49572         t += " rotate(" + Math.floor(d.ca) + ",0,0)";
49573       }
49574       return t;
49575     }
49576     function filterImages(images) {
49577       const showsPano = context.photos().showsPanoramic();
49578       const showsFlat = context.photos().showsFlat();
49579       const fromDate = context.photos().fromDate();
49580       const toDate = context.photos().toDate();
49581       if (!showsPano || !showsFlat) {
49582         images = images.filter(function(image) {
49583           if (image.is_pano)
49584             return showsPano;
49585           return showsFlat;
49586         });
49587       }
49588       if (fromDate) {
49589         images = images.filter(function(image) {
49590           return new Date(image.captured_at).getTime() >= new Date(fromDate).getTime();
49591         });
49592       }
49593       if (toDate) {
49594         images = images.filter(function(image) {
49595           return new Date(image.captured_at).getTime() <= new Date(toDate).getTime();
49596         });
49597       }
49598       return images;
49599     }
49600     function filterSequences(sequences) {
49601       const showsPano = context.photos().showsPanoramic();
49602       const showsFlat = context.photos().showsFlat();
49603       const fromDate = context.photos().fromDate();
49604       const toDate = context.photos().toDate();
49605       if (!showsPano || !showsFlat) {
49606         sequences = sequences.filter(function(sequence) {
49607           if (sequence.properties.hasOwnProperty("is_pano")) {
49608             if (sequence.properties.is_pano)
49609               return showsPano;
49610             return showsFlat;
49611           }
49612           return false;
49613         });
49614       }
49615       if (fromDate) {
49616         sequences = sequences.filter(function(sequence) {
49617           return new Date(sequence.properties.captured_at).getTime() >= new Date(fromDate).getTime().toString();
49618         });
49619       }
49620       if (toDate) {
49621         sequences = sequences.filter(function(sequence) {
49622           return new Date(sequence.properties.captured_at).getTime() <= new Date(toDate).getTime().toString();
49623         });
49624       }
49625       return sequences;
49626     }
49627     function update() {
49628       const z = ~~context.map().zoom();
49629       const showMarkers = z >= minMarkerZoom;
49630       const showViewfields = z >= minViewfieldZoom;
49631       const service = getService();
49632       let sequences = service ? service.sequences(projection2) : [];
49633       let images = service && showMarkers ? service.images(projection2) : [];
49634       images = filterImages(images);
49635       sequences = filterSequences(sequences, service);
49636       service.filterViewer(context);
49637       let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
49638         return d.properties.id;
49639       });
49640       traces.exit().remove();
49641       traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
49642       const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) {
49643         return d.id;
49644       });
49645       groups.exit().remove();
49646       const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
49647       groupsEnter.append("g").attr("class", "viewfield-scale");
49648       const markers = groups.merge(groupsEnter).sort(function(a, b) {
49649         return b.loc[1] - a.loc[1];
49650       }).attr("transform", transform2).select(".viewfield-scale");
49651       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
49652       const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
49653       viewfields.exit().remove();
49654       viewfields.enter().insert("path", "circle").attr("class", "viewfield").classed("pano", function() {
49655         return this.parentNode.__data__.is_pano;
49656       }).attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath);
49657       function viewfieldPath() {
49658         if (this.parentNode.__data__.is_pano) {
49659           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
49660         } else {
49661           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
49662         }
49663       }
49664     }
49665     function drawImages(selection2) {
49666       const enabled = svgMapillaryImages.enabled;
49667       const service = getService();
49668       layer = selection2.selectAll(".layer-mapillary").data(service ? [0] : []);
49669       layer.exit().remove();
49670       const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary").style("display", enabled ? "block" : "none");
49671       layerEnter.append("g").attr("class", "sequences");
49672       layerEnter.append("g").attr("class", "markers");
49673       layer = layerEnter.merge(layer);
49674       if (enabled) {
49675         if (service && ~~context.map().zoom() >= minZoom3) {
49676           editOn();
49677           update();
49678           service.loadImages(projection2);
49679         } else {
49680           editOff();
49681         }
49682       }
49683     }
49684     drawImages.enabled = function(_) {
49685       if (!arguments.length)
49686         return svgMapillaryImages.enabled;
49687       svgMapillaryImages.enabled = _;
49688       if (svgMapillaryImages.enabled) {
49689         showLayer();
49690         context.photos().on("change.mapillary_images", update);
49691       } else {
49692         hideLayer();
49693         context.photos().on("change.mapillary_images", null);
49694       }
49695       dispatch10.call("change");
49696       return this;
49697     };
49698     drawImages.supported = function() {
49699       return !!getService();
49700     };
49701     init2();
49702     return drawImages;
49703   }
49704
49705   // modules/svg/mapillary_position.js
49706   function svgMapillaryPosition(projection2, context) {
49707     const throttledRedraw = throttle_default(function() {
49708       update();
49709     }, 1e3);
49710     const minZoom3 = 12;
49711     const minViewfieldZoom = 18;
49712     let layer = select_default2(null);
49713     let _mapillary;
49714     let viewerCompassAngle;
49715     function init2() {
49716       if (svgMapillaryPosition.initialized)
49717         return;
49718       svgMapillaryPosition.initialized = true;
49719     }
49720     function getService() {
49721       if (services.mapillary && !_mapillary) {
49722         _mapillary = services.mapillary;
49723         _mapillary.event.on("imageChanged", throttledRedraw);
49724         _mapillary.event.on("bearingChanged", function(e) {
49725           viewerCompassAngle = e.bearing;
49726           if (context.map().isTransformed())
49727             return;
49728           layer.selectAll(".viewfield-group.currentView").filter(function(d) {
49729             return d.is_pano;
49730           }).attr("transform", transform2);
49731         });
49732       } else if (!services.mapillary && _mapillary) {
49733         _mapillary = null;
49734       }
49735       return _mapillary;
49736     }
49737     function editOn() {
49738       layer.style("display", "block");
49739     }
49740     function editOff() {
49741       layer.selectAll(".viewfield-group").remove();
49742       layer.style("display", "none");
49743     }
49744     function transform2(d) {
49745       let t = svgPointTransform(projection2)(d);
49746       if (d.is_pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
49747         t += " rotate(" + Math.floor(viewerCompassAngle) + ",0,0)";
49748       } else if (d.ca) {
49749         t += " rotate(" + Math.floor(d.ca) + ",0,0)";
49750       }
49751       return t;
49752     }
49753     function update() {
49754       const z = ~~context.map().zoom();
49755       const showViewfields = z >= minViewfieldZoom;
49756       const service = getService();
49757       const image = service && service.getActiveImage();
49758       const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(image ? [image] : [], function(d) {
49759         return d.id;
49760       });
49761       groups.exit().remove();
49762       const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group currentView highlighted");
49763       groupsEnter.append("g").attr("class", "viewfield-scale");
49764       const markers = groups.merge(groupsEnter).attr("transform", transform2).select(".viewfield-scale");
49765       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
49766       const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
49767       viewfields.exit().remove();
49768       viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").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");
49769     }
49770     function drawImages(selection2) {
49771       const service = getService();
49772       layer = selection2.selectAll(".layer-mapillary-position").data(service ? [0] : []);
49773       layer.exit().remove();
49774       const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary-position");
49775       layerEnter.append("g").attr("class", "markers");
49776       layer = layerEnter.merge(layer);
49777       if (service && ~~context.map().zoom() >= minZoom3) {
49778         editOn();
49779         update();
49780       } else {
49781         editOff();
49782       }
49783     }
49784     drawImages.enabled = function() {
49785       update();
49786       return this;
49787     };
49788     drawImages.supported = function() {
49789       return !!getService();
49790     };
49791     init2();
49792     return drawImages;
49793   }
49794
49795   // modules/svg/mapillary_signs.js
49796   function svgMapillarySigns(projection2, context, dispatch10) {
49797     const throttledRedraw = throttle_default(function() {
49798       dispatch10.call("change");
49799     }, 1e3);
49800     const minZoom3 = 12;
49801     let layer = select_default2(null);
49802     let _mapillary;
49803     function init2() {
49804       if (svgMapillarySigns.initialized)
49805         return;
49806       svgMapillarySigns.enabled = false;
49807       svgMapillarySigns.initialized = true;
49808     }
49809     function getService() {
49810       if (services.mapillary && !_mapillary) {
49811         _mapillary = services.mapillary;
49812         _mapillary.event.on("loadedSigns", throttledRedraw);
49813       } else if (!services.mapillary && _mapillary) {
49814         _mapillary = null;
49815       }
49816       return _mapillary;
49817     }
49818     function showLayer() {
49819       const service = getService();
49820       if (!service)
49821         return;
49822       service.loadSignResources(context);
49823       editOn();
49824     }
49825     function hideLayer() {
49826       throttledRedraw.cancel();
49827       editOff();
49828     }
49829     function editOn() {
49830       layer.style("display", "block");
49831     }
49832     function editOff() {
49833       layer.selectAll(".icon-sign").remove();
49834       layer.style("display", "none");
49835     }
49836     function click(d3_event, d) {
49837       const service = getService();
49838       if (!service)
49839         return;
49840       context.map().centerEase(d.loc);
49841       const selectedImageId = service.getActiveImage() && service.getActiveImage().id;
49842       service.getDetections(d.id).then((detections) => {
49843         if (detections.length) {
49844           const imageId = detections[0].image.id;
49845           if (imageId === selectedImageId) {
49846             service.highlightDetection(detections[0]).selectImage(context, imageId);
49847           } else {
49848             service.ensureViewerLoaded(context).then(function() {
49849               service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
49850             });
49851           }
49852         }
49853       });
49854     }
49855     function filterData(detectedFeatures) {
49856       var fromDate = context.photos().fromDate();
49857       var toDate = context.photos().toDate();
49858       if (fromDate) {
49859         var fromTimestamp = new Date(fromDate).getTime();
49860         detectedFeatures = detectedFeatures.filter(function(feature3) {
49861           return new Date(feature3.last_seen_at).getTime() >= fromTimestamp;
49862         });
49863       }
49864       if (toDate) {
49865         var toTimestamp = new Date(toDate).getTime();
49866         detectedFeatures = detectedFeatures.filter(function(feature3) {
49867           return new Date(feature3.first_seen_at).getTime() <= toTimestamp;
49868         });
49869       }
49870       return detectedFeatures;
49871     }
49872     function update() {
49873       const service = getService();
49874       let data = service ? service.signs(projection2) : [];
49875       data = filterData(data);
49876       const transform2 = svgPointTransform(projection2);
49877       const signs = layer.selectAll(".icon-sign").data(data, function(d) {
49878         return d.id;
49879       });
49880       signs.exit().remove();
49881       const enter = signs.enter().append("g").attr("class", "icon-sign icon-detected").on("click", click);
49882       enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) {
49883         return "#" + d.value;
49884       });
49885       enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px");
49886       signs.merge(enter).attr("transform", transform2);
49887     }
49888     function drawSigns(selection2) {
49889       const enabled = svgMapillarySigns.enabled;
49890       const service = getService();
49891       layer = selection2.selectAll(".layer-mapillary-signs").data(service ? [0] : []);
49892       layer.exit().remove();
49893       layer = layer.enter().append("g").attr("class", "layer-mapillary-signs layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer);
49894       if (enabled) {
49895         if (service && ~~context.map().zoom() >= minZoom3) {
49896           editOn();
49897           update();
49898           service.loadSigns(projection2);
49899           service.showSignDetections(true);
49900         } else {
49901           editOff();
49902         }
49903       } else if (service) {
49904         service.showSignDetections(false);
49905       }
49906     }
49907     drawSigns.enabled = function(_) {
49908       if (!arguments.length)
49909         return svgMapillarySigns.enabled;
49910       svgMapillarySigns.enabled = _;
49911       if (svgMapillarySigns.enabled) {
49912         showLayer();
49913         context.photos().on("change.mapillary_signs", update);
49914       } else {
49915         hideLayer();
49916         context.photos().on("change.mapillary_signs", null);
49917       }
49918       dispatch10.call("change");
49919       return this;
49920     };
49921     drawSigns.supported = function() {
49922       return !!getService();
49923     };
49924     init2();
49925     return drawSigns;
49926   }
49927
49928   // modules/svg/mapillary_map_features.js
49929   function svgMapillaryMapFeatures(projection2, context, dispatch10) {
49930     const throttledRedraw = throttle_default(function() {
49931       dispatch10.call("change");
49932     }, 1e3);
49933     const minZoom3 = 12;
49934     let layer = select_default2(null);
49935     let _mapillary;
49936     function init2() {
49937       if (svgMapillaryMapFeatures.initialized)
49938         return;
49939       svgMapillaryMapFeatures.enabled = false;
49940       svgMapillaryMapFeatures.initialized = true;
49941     }
49942     function getService() {
49943       if (services.mapillary && !_mapillary) {
49944         _mapillary = services.mapillary;
49945         _mapillary.event.on("loadedMapFeatures", throttledRedraw);
49946       } else if (!services.mapillary && _mapillary) {
49947         _mapillary = null;
49948       }
49949       return _mapillary;
49950     }
49951     function showLayer() {
49952       const service = getService();
49953       if (!service)
49954         return;
49955       service.loadObjectResources(context);
49956       editOn();
49957     }
49958     function hideLayer() {
49959       throttledRedraw.cancel();
49960       editOff();
49961     }
49962     function editOn() {
49963       layer.style("display", "block");
49964     }
49965     function editOff() {
49966       layer.selectAll(".icon-map-feature").remove();
49967       layer.style("display", "none");
49968     }
49969     function click(d3_event, d) {
49970       const service = getService();
49971       if (!service)
49972         return;
49973       context.map().centerEase(d.loc);
49974       const selectedImageId = service.getActiveImage() && service.getActiveImage().id;
49975       service.getDetections(d.id).then((detections) => {
49976         if (detections.length) {
49977           const imageId = detections[0].image.id;
49978           if (imageId === selectedImageId) {
49979             service.highlightDetection(detections[0]).selectImage(context, imageId);
49980           } else {
49981             service.ensureViewerLoaded(context).then(function() {
49982               service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
49983             });
49984           }
49985         }
49986       });
49987     }
49988     function filterData(detectedFeatures) {
49989       const fromDate = context.photos().fromDate();
49990       const toDate = context.photos().toDate();
49991       if (fromDate) {
49992         detectedFeatures = detectedFeatures.filter(function(feature3) {
49993           return new Date(feature3.last_seen_at).getTime() >= new Date(fromDate).getTime();
49994         });
49995       }
49996       if (toDate) {
49997         detectedFeatures = detectedFeatures.filter(function(feature3) {
49998           return new Date(feature3.first_seen_at).getTime() <= new Date(toDate).getTime();
49999         });
50000       }
50001       return detectedFeatures;
50002     }
50003     function update() {
50004       const service = getService();
50005       let data = service ? service.mapFeatures(projection2) : [];
50006       data = filterData(data);
50007       const transform2 = svgPointTransform(projection2);
50008       const mapFeatures = layer.selectAll(".icon-map-feature").data(data, function(d) {
50009         return d.id;
50010       });
50011       mapFeatures.exit().remove();
50012       const enter = mapFeatures.enter().append("g").attr("class", "icon-map-feature icon-detected").on("click", click);
50013       enter.append("title").text(function(d) {
50014         var id2 = d.value.replace(/--/g, ".").replace(/-/g, "_");
50015         return _t("mapillary_map_features." + id2);
50016       });
50017       enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) {
50018         if (d.value === "object--billboard") {
50019           return "#object--sign--advertisement";
50020         }
50021         return "#" + d.value;
50022       });
50023       enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px");
50024       mapFeatures.merge(enter).attr("transform", transform2);
50025     }
50026     function drawMapFeatures(selection2) {
50027       const enabled = svgMapillaryMapFeatures.enabled;
50028       const service = getService();
50029       layer = selection2.selectAll(".layer-mapillary-map-features").data(service ? [0] : []);
50030       layer.exit().remove();
50031       layer = layer.enter().append("g").attr("class", "layer-mapillary-map-features layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer);
50032       if (enabled) {
50033         if (service && ~~context.map().zoom() >= minZoom3) {
50034           editOn();
50035           update();
50036           service.loadMapFeatures(projection2);
50037           service.showFeatureDetections(true);
50038         } else {
50039           editOff();
50040         }
50041       } else if (service) {
50042         service.showFeatureDetections(false);
50043       }
50044     }
50045     drawMapFeatures.enabled = function(_) {
50046       if (!arguments.length)
50047         return svgMapillaryMapFeatures.enabled;
50048       svgMapillaryMapFeatures.enabled = _;
50049       if (svgMapillaryMapFeatures.enabled) {
50050         showLayer();
50051         context.photos().on("change.mapillary_map_features", update);
50052       } else {
50053         hideLayer();
50054         context.photos().on("change.mapillary_map_features", null);
50055       }
50056       dispatch10.call("change");
50057       return this;
50058     };
50059     drawMapFeatures.supported = function() {
50060       return !!getService();
50061     };
50062     init2();
50063     return drawMapFeatures;
50064   }
50065
50066   // modules/svg/kartaview_images.js
50067   function svgKartaviewImages(projection2, context, dispatch10) {
50068     var throttledRedraw = throttle_default(function() {
50069       dispatch10.call("change");
50070     }, 1e3);
50071     var minZoom3 = 12;
50072     var minMarkerZoom = 16;
50073     var minViewfieldZoom = 18;
50074     var layer = select_default2(null);
50075     var _kartaview;
50076     function init2() {
50077       if (svgKartaviewImages.initialized)
50078         return;
50079       svgKartaviewImages.enabled = false;
50080       svgKartaviewImages.initialized = true;
50081     }
50082     function getService() {
50083       if (services.kartaview && !_kartaview) {
50084         _kartaview = services.kartaview;
50085         _kartaview.event.on("loadedImages", throttledRedraw);
50086       } else if (!services.kartaview && _kartaview) {
50087         _kartaview = null;
50088       }
50089       return _kartaview;
50090     }
50091     function showLayer() {
50092       var service = getService();
50093       if (!service)
50094         return;
50095       editOn();
50096       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
50097         dispatch10.call("change");
50098       });
50099     }
50100     function hideLayer() {
50101       throttledRedraw.cancel();
50102       layer.transition().duration(250).style("opacity", 0).on("end", editOff);
50103     }
50104     function editOn() {
50105       layer.style("display", "block");
50106     }
50107     function editOff() {
50108       layer.selectAll(".viewfield-group").remove();
50109       layer.style("display", "none");
50110     }
50111     function click(d3_event, d) {
50112       var service = getService();
50113       if (!service)
50114         return;
50115       service.ensureViewerLoaded(context).then(function() {
50116         service.selectImage(context, d.key).showViewer(context);
50117       });
50118       context.map().centerEase(d.loc);
50119     }
50120     function mouseover(d3_event, d) {
50121       var service = getService();
50122       if (service)
50123         service.setStyles(context, d);
50124     }
50125     function mouseout() {
50126       var service = getService();
50127       if (service)
50128         service.setStyles(context, null);
50129     }
50130     function transform2(d) {
50131       var t = svgPointTransform(projection2)(d);
50132       if (d.ca) {
50133         t += " rotate(" + Math.floor(d.ca) + ",0,0)";
50134       }
50135       return t;
50136     }
50137     function filterImages(images) {
50138       var fromDate = context.photos().fromDate();
50139       var toDate = context.photos().toDate();
50140       var usernames = context.photos().usernames();
50141       if (fromDate) {
50142         var fromTimestamp = new Date(fromDate).getTime();
50143         images = images.filter(function(item) {
50144           return new Date(item.captured_at).getTime() >= fromTimestamp;
50145         });
50146       }
50147       if (toDate) {
50148         var toTimestamp = new Date(toDate).getTime();
50149         images = images.filter(function(item) {
50150           return new Date(item.captured_at).getTime() <= toTimestamp;
50151         });
50152       }
50153       if (usernames) {
50154         images = images.filter(function(item) {
50155           return usernames.indexOf(item.captured_by) !== -1;
50156         });
50157       }
50158       return images;
50159     }
50160     function filterSequences(sequences) {
50161       var fromDate = context.photos().fromDate();
50162       var toDate = context.photos().toDate();
50163       var usernames = context.photos().usernames();
50164       if (fromDate) {
50165         var fromTimestamp = new Date(fromDate).getTime();
50166         sequences = sequences.filter(function(image) {
50167           return new Date(image.properties.captured_at).getTime() >= fromTimestamp;
50168         });
50169       }
50170       if (toDate) {
50171         var toTimestamp = new Date(toDate).getTime();
50172         sequences = sequences.filter(function(image) {
50173           return new Date(image.properties.captured_at).getTime() <= toTimestamp;
50174         });
50175       }
50176       if (usernames) {
50177         sequences = sequences.filter(function(image) {
50178           return usernames.indexOf(image.properties.captured_by) !== -1;
50179         });
50180       }
50181       return sequences;
50182     }
50183     function update() {
50184       var viewer = context.container().select(".photoviewer");
50185       var selected = viewer.empty() ? void 0 : viewer.datum();
50186       var z = ~~context.map().zoom();
50187       var showMarkers = z >= minMarkerZoom;
50188       var showViewfields = z >= minViewfieldZoom;
50189       var service = getService();
50190       var sequences = [];
50191       var images = [];
50192       if (context.photos().showsFlat()) {
50193         sequences = service ? service.sequences(projection2) : [];
50194         images = service && showMarkers ? service.images(projection2) : [];
50195         sequences = filterSequences(sequences);
50196         images = filterImages(images);
50197       }
50198       var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
50199         return d.properties.key;
50200       });
50201       traces.exit().remove();
50202       traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
50203       var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) {
50204         return d.key;
50205       });
50206       groups.exit().remove();
50207       var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
50208       groupsEnter.append("g").attr("class", "viewfield-scale");
50209       var markers = groups.merge(groupsEnter).sort(function(a, b) {
50210         return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
50211       }).attr("transform", transform2).select(".viewfield-scale");
50212       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
50213       var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
50214       viewfields.exit().remove();
50215       viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").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");
50216     }
50217     function drawImages(selection2) {
50218       var enabled = svgKartaviewImages.enabled, service = getService();
50219       layer = selection2.selectAll(".layer-kartaview").data(service ? [0] : []);
50220       layer.exit().remove();
50221       var layerEnter = layer.enter().append("g").attr("class", "layer-kartaview").style("display", enabled ? "block" : "none");
50222       layerEnter.append("g").attr("class", "sequences");
50223       layerEnter.append("g").attr("class", "markers");
50224       layer = layerEnter.merge(layer);
50225       if (enabled) {
50226         if (service && ~~context.map().zoom() >= minZoom3) {
50227           editOn();
50228           update();
50229           service.loadImages(projection2);
50230         } else {
50231           editOff();
50232         }
50233       }
50234     }
50235     drawImages.enabled = function(_) {
50236       if (!arguments.length)
50237         return svgKartaviewImages.enabled;
50238       svgKartaviewImages.enabled = _;
50239       if (svgKartaviewImages.enabled) {
50240         showLayer();
50241         context.photos().on("change.kartaview_images", update);
50242       } else {
50243         hideLayer();
50244         context.photos().on("change.kartaview_images", null);
50245       }
50246       dispatch10.call("change");
50247       return this;
50248     };
50249     drawImages.supported = function() {
50250       return !!getService();
50251     };
50252     init2();
50253     return drawImages;
50254   }
50255
50256   // modules/svg/osm.js
50257   function svgOsm(projection2, context, dispatch10) {
50258     var enabled = true;
50259     function drawOsm(selection2) {
50260       selection2.selectAll(".layer-osm").data(["covered", "areas", "lines", "points", "labels"]).enter().append("g").attr("class", function(d) {
50261         return "layer-osm " + d;
50262       });
50263       selection2.selectAll(".layer-osm.points").selectAll(".points-group").data(["points", "midpoints", "vertices", "turns"]).enter().append("g").attr("class", function(d) {
50264         return "points-group " + d;
50265       });
50266     }
50267     function showLayer() {
50268       var layer = context.surface().selectAll(".data-layer.osm");
50269       layer.interrupt();
50270       layer.classed("disabled", false).style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() {
50271         dispatch10.call("change");
50272       });
50273     }
50274     function hideLayer() {
50275       var layer = context.surface().selectAll(".data-layer.osm");
50276       layer.interrupt();
50277       layer.transition().duration(250).style("opacity", 0).on("end interrupt", function() {
50278         layer.classed("disabled", true);
50279         dispatch10.call("change");
50280       });
50281     }
50282     drawOsm.enabled = function(val) {
50283       if (!arguments.length)
50284         return enabled;
50285       enabled = val;
50286       if (enabled) {
50287         showLayer();
50288       } else {
50289         hideLayer();
50290       }
50291       dispatch10.call("change");
50292       return this;
50293     };
50294     return drawOsm;
50295   }
50296
50297   // modules/svg/notes.js
50298   var _notesEnabled = false;
50299   var _osmService;
50300   function svgNotes(projection2, context, dispatch10) {
50301     if (!dispatch10) {
50302       dispatch10 = dispatch_default("change");
50303     }
50304     var throttledRedraw = throttle_default(function() {
50305       dispatch10.call("change");
50306     }, 1e3);
50307     var minZoom3 = 12;
50308     var touchLayer = select_default2(null);
50309     var drawLayer = select_default2(null);
50310     var _notesVisible = false;
50311     function markerPath(selection2, klass) {
50312       selection2.attr("class", klass).attr("transform", "translate(-8, -22)").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");
50313     }
50314     function getService() {
50315       if (services.osm && !_osmService) {
50316         _osmService = services.osm;
50317         _osmService.on("loadedNotes", throttledRedraw);
50318       } else if (!services.osm && _osmService) {
50319         _osmService = null;
50320       }
50321       return _osmService;
50322     }
50323     function editOn() {
50324       if (!_notesVisible) {
50325         _notesVisible = true;
50326         drawLayer.style("display", "block");
50327       }
50328     }
50329     function editOff() {
50330       if (_notesVisible) {
50331         _notesVisible = false;
50332         drawLayer.style("display", "none");
50333         drawLayer.selectAll(".note").remove();
50334         touchLayer.selectAll(".note").remove();
50335       }
50336     }
50337     function layerOn() {
50338       editOn();
50339       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() {
50340         dispatch10.call("change");
50341       });
50342     }
50343     function layerOff() {
50344       throttledRedraw.cancel();
50345       drawLayer.interrupt();
50346       touchLayer.selectAll(".note").remove();
50347       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", function() {
50348         editOff();
50349         dispatch10.call("change");
50350       });
50351     }
50352     function updateMarkers() {
50353       if (!_notesVisible || !_notesEnabled)
50354         return;
50355       var service = getService();
50356       var selectedID = context.selectedNoteID();
50357       var data = service ? service.notes(projection2) : [];
50358       var getTransform = svgPointTransform(projection2);
50359       var notes = drawLayer.selectAll(".note").data(data, function(d) {
50360         return d.status + d.id;
50361       });
50362       notes.exit().remove();
50363       var notesEnter = notes.enter().append("g").attr("class", function(d) {
50364         return "note note-" + d.id + " " + d.status;
50365       }).classed("new", function(d) {
50366         return d.id < 0;
50367       });
50368       notesEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
50369       notesEnter.append("path").call(markerPath, "shadow");
50370       notesEnter.append("use").attr("class", "note-fill").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").attr("xlink:href", "#iD-icon-note");
50371       notesEnter.selectAll(".icon-annotation").data(function(d) {
50372         return [d];
50373       }).enter().append("use").attr("class", "icon-annotation").attr("width", "10px").attr("height", "10px").attr("x", "-3px").attr("y", "-19px").attr("xlink:href", function(d) {
50374         if (d.id < 0)
50375           return "#iD-icon-plus";
50376         if (d.status === "open")
50377           return "#iD-icon-close";
50378         return "#iD-icon-apply";
50379       });
50380       notes.merge(notesEnter).sort(sortY).classed("selected", function(d) {
50381         var mode = context.mode();
50382         var isMoving = mode && mode.id === "drag-note";
50383         return !isMoving && d.id === selectedID;
50384       }).attr("transform", getTransform);
50385       if (touchLayer.empty())
50386         return;
50387       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
50388       var targets = touchLayer.selectAll(".note").data(data, function(d) {
50389         return d.id;
50390       });
50391       targets.exit().remove();
50392       targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", function(d) {
50393         var newClass = d.id < 0 ? "new" : "";
50394         return "note target note-" + d.id + " " + fillClass + newClass;
50395       }).attr("transform", getTransform);
50396       function sortY(a, b) {
50397         if (a.id === selectedID)
50398           return 1;
50399         if (b.id === selectedID)
50400           return -1;
50401         return b.loc[1] - a.loc[1];
50402       }
50403     }
50404     function drawNotes(selection2) {
50405       var service = getService();
50406       var surface = context.surface();
50407       if (surface && !surface.empty()) {
50408         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
50409       }
50410       drawLayer = selection2.selectAll(".layer-notes").data(service ? [0] : []);
50411       drawLayer.exit().remove();
50412       drawLayer = drawLayer.enter().append("g").attr("class", "layer-notes").style("display", _notesEnabled ? "block" : "none").merge(drawLayer);
50413       if (_notesEnabled) {
50414         if (service && ~~context.map().zoom() >= minZoom3) {
50415           editOn();
50416           service.loadNotes(projection2);
50417           updateMarkers();
50418         } else {
50419           editOff();
50420         }
50421       }
50422     }
50423     drawNotes.enabled = function(val) {
50424       if (!arguments.length)
50425         return _notesEnabled;
50426       _notesEnabled = val;
50427       if (_notesEnabled) {
50428         layerOn();
50429       } else {
50430         layerOff();
50431         if (context.selectedNoteID()) {
50432           context.enter(modeBrowse(context));
50433         }
50434       }
50435       dispatch10.call("change");
50436       return this;
50437     };
50438     return drawNotes;
50439   }
50440
50441   // modules/svg/touch.js
50442   function svgTouch() {
50443     function drawTouch(selection2) {
50444       selection2.selectAll(".layer-touch").data(["areas", "lines", "points", "turns", "markers"]).enter().append("g").attr("class", function(d) {
50445         return "layer-touch " + d;
50446       });
50447     }
50448     return drawTouch;
50449   }
50450
50451   // modules/util/dimensions.js
50452   function refresh(selection2, node) {
50453     var cr = node.getBoundingClientRect();
50454     var prop = [cr.width, cr.height];
50455     selection2.property("__dimensions__", prop);
50456     return prop;
50457   }
50458   function utilGetDimensions(selection2, force) {
50459     if (!selection2 || selection2.empty()) {
50460       return [0, 0];
50461     }
50462     var node = selection2.node(), cached = selection2.property("__dimensions__");
50463     return !cached || force ? refresh(selection2, node) : cached;
50464   }
50465   function utilSetDimensions(selection2, dimensions) {
50466     if (!selection2 || selection2.empty()) {
50467       return selection2;
50468     }
50469     var node = selection2.node();
50470     if (dimensions === null) {
50471       refresh(selection2, node);
50472       return selection2;
50473     }
50474     return selection2.property("__dimensions__", [dimensions[0], dimensions[1]]).attr("width", dimensions[0]).attr("height", dimensions[1]);
50475   }
50476
50477   // modules/svg/layers.js
50478   function svgLayers(projection2, context) {
50479     var dispatch10 = dispatch_default("change");
50480     var svg2 = select_default2(null);
50481     var _layers = [
50482       { id: "osm", layer: svgOsm(projection2, context, dispatch10) },
50483       { id: "notes", layer: svgNotes(projection2, context, dispatch10) },
50484       { id: "data", layer: svgData(projection2, context, dispatch10) },
50485       { id: "keepRight", layer: svgKeepRight(projection2, context, dispatch10) },
50486       { id: "improveOSM", layer: svgImproveOSM(projection2, context, dispatch10) },
50487       { id: "osmose", layer: svgOsmose(projection2, context, dispatch10) },
50488       { id: "streetside", layer: svgStreetside(projection2, context, dispatch10) },
50489       { id: "mapillary", layer: svgMapillaryImages(projection2, context, dispatch10) },
50490       { id: "mapillary-position", layer: svgMapillaryPosition(projection2, context, dispatch10) },
50491       { id: "mapillary-map-features", layer: svgMapillaryMapFeatures(projection2, context, dispatch10) },
50492       { id: "mapillary-signs", layer: svgMapillarySigns(projection2, context, dispatch10) },
50493       { id: "kartaview", layer: svgKartaviewImages(projection2, context, dispatch10) },
50494       { id: "debug", layer: svgDebug(projection2, context, dispatch10) },
50495       { id: "geolocate", layer: svgGeolocate(projection2, context, dispatch10) },
50496       { id: "touch", layer: svgTouch(projection2, context, dispatch10) }
50497     ];
50498     function drawLayers(selection2) {
50499       svg2 = selection2.selectAll(".surface").data([0]);
50500       svg2 = svg2.enter().append("svg").attr("class", "surface").merge(svg2);
50501       var defs = svg2.selectAll(".surface-defs").data([0]);
50502       defs.enter().append("defs").attr("class", "surface-defs");
50503       var groups = svg2.selectAll(".data-layer").data(_layers);
50504       groups.exit().remove();
50505       groups.enter().append("g").attr("class", function(d) {
50506         return "data-layer " + d.id;
50507       }).merge(groups).each(function(d) {
50508         select_default2(this).call(d.layer);
50509       });
50510     }
50511     drawLayers.all = function() {
50512       return _layers;
50513     };
50514     drawLayers.layer = function(id2) {
50515       var obj = _layers.find(function(o) {
50516         return o.id === id2;
50517       });
50518       return obj && obj.layer;
50519     };
50520     drawLayers.only = function(what) {
50521       var arr = [].concat(what);
50522       var all = _layers.map(function(layer) {
50523         return layer.id;
50524       });
50525       return drawLayers.remove(utilArrayDifference(all, arr));
50526     };
50527     drawLayers.remove = function(what) {
50528       var arr = [].concat(what);
50529       arr.forEach(function(id2) {
50530         _layers = _layers.filter(function(o) {
50531           return o.id !== id2;
50532         });
50533       });
50534       dispatch10.call("change");
50535       return this;
50536     };
50537     drawLayers.add = function(what) {
50538       var arr = [].concat(what);
50539       arr.forEach(function(obj) {
50540         if ("id" in obj && "layer" in obj) {
50541           _layers.push(obj);
50542         }
50543       });
50544       dispatch10.call("change");
50545       return this;
50546     };
50547     drawLayers.dimensions = function(val) {
50548       if (!arguments.length)
50549         return utilGetDimensions(svg2);
50550       utilSetDimensions(svg2, val);
50551       return this;
50552     };
50553     return utilRebind(drawLayers, dispatch10, "on");
50554   }
50555
50556   // modules/svg/lines.js
50557   var import_fast_deep_equal6 = __toESM(require_fast_deep_equal());
50558   function svgLines(projection2, context) {
50559     var detected = utilDetect();
50560     var highway_stack = {
50561       motorway: 0,
50562       motorway_link: 1,
50563       trunk: 2,
50564       trunk_link: 3,
50565       primary: 4,
50566       primary_link: 5,
50567       secondary: 6,
50568       tertiary: 7,
50569       unclassified: 8,
50570       residential: 9,
50571       service: 10,
50572       footway: 11
50573     };
50574     function drawTargets(selection2, graph, entities, filter2) {
50575       var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
50576       var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
50577       var getPath = svgPath(projection2).geojson;
50578       var activeID = context.activeID();
50579       var base = context.history().base();
50580       var data = { targets: [], nopes: [] };
50581       entities.forEach(function(way) {
50582         var features = svgSegmentWay(way, graph, activeID);
50583         data.targets.push.apply(data.targets, features.passive);
50584         data.nopes.push.apply(data.nopes, features.active);
50585       });
50586       var targetData = data.targets.filter(getPath);
50587       var targets = selection2.selectAll(".line.target-allowed").filter(function(d) {
50588         return filter2(d.properties.entity);
50589       }).data(targetData, function key(d) {
50590         return d.id;
50591       });
50592       targets.exit().remove();
50593       var segmentWasEdited = function(d) {
50594         var wayID = d.properties.entity.id;
50595         if (!base.entities[wayID] || !(0, import_fast_deep_equal6.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
50596           return false;
50597         }
50598         return d.properties.nodes.some(function(n2) {
50599           return !base.entities[n2.id] || !(0, import_fast_deep_equal6.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc);
50600         });
50601       };
50602       targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) {
50603         return "way line target target-allowed " + targetClass + d.id;
50604       }).classed("segment-edited", segmentWasEdited);
50605       var nopeData = data.nopes.filter(getPath);
50606       var nopes = selection2.selectAll(".line.target-nope").filter(function(d) {
50607         return filter2(d.properties.entity);
50608       }).data(nopeData, function key(d) {
50609         return d.id;
50610       });
50611       nopes.exit().remove();
50612       nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) {
50613         return "way line target target-nope " + nopeClass + d.id;
50614       }).classed("segment-edited", segmentWasEdited);
50615     }
50616     function drawLines(selection2, graph, entities, filter2) {
50617       var base = context.history().base();
50618       function waystack(a, b) {
50619         var selected = context.selectedIDs();
50620         var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
50621         var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
50622         if (a.tags.highway) {
50623           scoreA -= highway_stack[a.tags.highway];
50624         }
50625         if (b.tags.highway) {
50626           scoreB -= highway_stack[b.tags.highway];
50627         }
50628         return scoreA - scoreB;
50629       }
50630       function drawLineGroup(selection3, klass, isSelected) {
50631         var mode = context.mode();
50632         var isDrawing = mode && /^draw/.test(mode.id);
50633         var selectedClass = !isDrawing && isSelected ? "selected " : "";
50634         var lines = selection3.selectAll("path").filter(filter2).data(getPathData(isSelected), osmEntity.key);
50635         lines.exit().remove();
50636         lines.enter().append("path").attr("class", function(d) {
50637           var prefix = "way line";
50638           if (!d.hasInterestingTags()) {
50639             var parentRelations = graph.parentRelations(d);
50640             var parentMultipolygons = parentRelations.filter(function(relation) {
50641               return relation.isMultipolygon();
50642             });
50643             if (parentMultipolygons.length > 0 && // and only multipolygon relations
50644             parentRelations.length === parentMultipolygons.length) {
50645               prefix = "relation area";
50646             }
50647           }
50648           var oldMPClass = oldMultiPolygonOuters[d.id] ? "old-multipolygon " : "";
50649           return prefix + " " + klass + " " + selectedClass + oldMPClass + d.id;
50650         }).classed("added", function(d) {
50651           return !base.entities[d.id];
50652         }).classed("geometry-edited", function(d) {
50653           return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d.id].nodes, base.entities[d.id].nodes);
50654         }).classed("retagged", function(d) {
50655           return graph.entities[d.id] && base.entities[d.id] && !(0, import_fast_deep_equal6.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
50656         }).call(svgTagClasses()).merge(lines).sort(waystack).attr("d", getPath).call(svgTagClasses().tags(svgRelationMemberTags(graph)));
50657         return selection3;
50658       }
50659       function getPathData(isSelected) {
50660         return function() {
50661           var layer = this.parentNode.__data__;
50662           var data = pathdata[layer] || [];
50663           return data.filter(function(d) {
50664             if (isSelected) {
50665               return context.selectedIDs().indexOf(d.id) !== -1;
50666             } else {
50667               return context.selectedIDs().indexOf(d.id) === -1;
50668             }
50669           });
50670         };
50671       }
50672       function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
50673         var markergroup = layergroup.selectAll("g." + groupclass).data([pathclass]);
50674         markergroup = markergroup.enter().append("g").attr("class", groupclass).merge(markergroup);
50675         var markers = markergroup.selectAll("path").filter(filter2).data(
50676           function data() {
50677             return groupdata[this.parentNode.__data__] || [];
50678           },
50679           function key(d) {
50680             return [d.id, d.index];
50681           }
50682         );
50683         markers.exit().remove();
50684         markers = markers.enter().append("path").attr("class", pathclass).merge(markers).attr("marker-mid", marker).attr("d", function(d) {
50685           return d.d;
50686         });
50687         if (detected.ie) {
50688           markers.each(function() {
50689             this.parentNode.insertBefore(this, this);
50690           });
50691         }
50692       }
50693       var getPath = svgPath(projection2, graph);
50694       var ways = [];
50695       var onewaydata = {};
50696       var sideddata = {};
50697       var oldMultiPolygonOuters = {};
50698       for (var i2 = 0; i2 < entities.length; i2++) {
50699         var entity = entities[i2];
50700         var outer = osmOldMultipolygonOuterMember(entity, graph);
50701         if (outer) {
50702           ways.push(entity.mergeTags(outer.tags));
50703           oldMultiPolygonOuters[outer.id] = true;
50704         } else if (entity.geometry(graph) === "line" || entity.geometry(graph) === "area" && entity.sidednessIdentifier && entity.sidednessIdentifier() === "coastline") {
50705           ways.push(entity);
50706         }
50707       }
50708       ways = ways.filter(getPath);
50709       var pathdata = utilArrayGroupBy(ways, function(way) {
50710         return way.layer();
50711       });
50712       Object.keys(pathdata).forEach(function(k) {
50713         var v = pathdata[k];
50714         var onewayArr = v.filter(function(d) {
50715           return d.isOneWay();
50716         });
50717         var onewaySegments = svgMarkerSegments(
50718           projection2,
50719           graph,
50720           35,
50721           function shouldReverse(entity2) {
50722             return entity2.tags.oneway === "-1";
50723           },
50724           function bothDirections(entity2) {
50725             return entity2.tags.oneway === "reversible" || entity2.tags.oneway === "alternating";
50726           }
50727         );
50728         onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
50729         var sidedArr = v.filter(function(d) {
50730           return d.isSided();
50731         });
50732         var sidedSegments = svgMarkerSegments(
50733           projection2,
50734           graph,
50735           30,
50736           function shouldReverse() {
50737             return false;
50738           },
50739           function bothDirections() {
50740             return false;
50741           }
50742         );
50743         sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
50744       });
50745       var covered = selection2.selectAll(".layer-osm.covered");
50746       var uncovered = selection2.selectAll(".layer-osm.lines");
50747       var touchLayer = selection2.selectAll(".layer-touch.lines");
50748       [covered, uncovered].forEach(function(selection3) {
50749         var range3 = selection3 === covered ? range(-10, 0) : range(0, 11);
50750         var layergroup = selection3.selectAll("g.layergroup").data(range3);
50751         layergroup = layergroup.enter().append("g").attr("class", function(d) {
50752           return "layergroup layer" + String(d);
50753         }).merge(layergroup);
50754         layergroup.selectAll("g.linegroup").data(["shadow", "casing", "stroke", "shadow-highlighted", "casing-highlighted", "stroke-highlighted"]).enter().append("g").attr("class", function(d) {
50755           return "linegroup line-" + d;
50756         });
50757         layergroup.selectAll("g.line-shadow").call(drawLineGroup, "shadow", false);
50758         layergroup.selectAll("g.line-casing").call(drawLineGroup, "casing", false);
50759         layergroup.selectAll("g.line-stroke").call(drawLineGroup, "stroke", false);
50760         layergroup.selectAll("g.line-shadow-highlighted").call(drawLineGroup, "shadow", true);
50761         layergroup.selectAll("g.line-casing-highlighted").call(drawLineGroup, "casing", true);
50762         layergroup.selectAll("g.line-stroke-highlighted").call(drawLineGroup, "stroke", true);
50763         addMarkers(layergroup, "oneway", "onewaygroup", onewaydata, "url(#ideditor-oneway-marker)");
50764         addMarkers(
50765           layergroup,
50766           "sided",
50767           "sidedgroup",
50768           sideddata,
50769           function marker(d) {
50770             var category = graph.entity(d.id).sidednessIdentifier();
50771             return "url(#ideditor-sided-marker-" + category + ")";
50772           }
50773         );
50774       });
50775       touchLayer.call(drawTargets, graph, ways, filter2);
50776     }
50777     return drawLines;
50778   }
50779
50780   // modules/svg/midpoints.js
50781   function svgMidpoints(projection2, context) {
50782     var targetRadius = 8;
50783     function drawTargets(selection2, graph, entities, filter2) {
50784       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
50785       var getTransform = svgPointTransform(projection2).geojson;
50786       var data = entities.map(function(midpoint) {
50787         return {
50788           type: "Feature",
50789           id: midpoint.id,
50790           properties: {
50791             target: true,
50792             entity: midpoint
50793           },
50794           geometry: {
50795             type: "Point",
50796             coordinates: midpoint.loc
50797           }
50798         };
50799       });
50800       var targets = selection2.selectAll(".midpoint.target").filter(function(d) {
50801         return filter2(d.properties.entity);
50802       }).data(data, function key(d) {
50803         return d.id;
50804       });
50805       targets.exit().remove();
50806       targets.enter().append("circle").attr("r", targetRadius).merge(targets).attr("class", function(d) {
50807         return "node midpoint target " + fillClass + d.id;
50808       }).attr("transform", getTransform);
50809     }
50810     function drawMidpoints(selection2, graph, entities, filter2, extent) {
50811       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.midpoints");
50812       var touchLayer = selection2.selectAll(".layer-touch.points");
50813       var mode = context.mode();
50814       if (mode && mode.id !== "select" || !context.map().withinEditableZoom()) {
50815         drawLayer.selectAll(".midpoint").remove();
50816         touchLayer.selectAll(".midpoint.target").remove();
50817         return;
50818       }
50819       var poly = extent.polygon();
50820       var midpoints = {};
50821       for (var i2 = 0; i2 < entities.length; i2++) {
50822         var entity = entities[i2];
50823         if (entity.type !== "way")
50824           continue;
50825         if (!filter2(entity))
50826           continue;
50827         if (context.selectedIDs().indexOf(entity.id) < 0)
50828           continue;
50829         var nodes = graph.childNodes(entity);
50830         for (var j2 = 0; j2 < nodes.length - 1; j2++) {
50831           var a = nodes[j2];
50832           var b = nodes[j2 + 1];
50833           var id2 = [a.id, b.id].sort().join("-");
50834           if (midpoints[id2]) {
50835             midpoints[id2].parents.push(entity);
50836           } else if (geoVecLength(projection2(a.loc), projection2(b.loc)) > 40) {
50837             var point2 = geoVecInterp(a.loc, b.loc, 0.5);
50838             var loc = null;
50839             if (extent.intersects(point2)) {
50840               loc = point2;
50841             } else {
50842               for (var k = 0; k < 4; k++) {
50843                 point2 = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
50844                 if (point2 && geoVecLength(projection2(a.loc), projection2(point2)) > 20 && geoVecLength(projection2(b.loc), projection2(point2)) > 20) {
50845                   loc = point2;
50846                   break;
50847                 }
50848               }
50849             }
50850             if (loc) {
50851               midpoints[id2] = {
50852                 type: "midpoint",
50853                 id: id2,
50854                 loc,
50855                 edge: [a.id, b.id],
50856                 parents: [entity]
50857               };
50858             }
50859           }
50860         }
50861       }
50862       function midpointFilter(d) {
50863         if (midpoints[d.id])
50864           return true;
50865         for (var i3 = 0; i3 < d.parents.length; i3++) {
50866           if (filter2(d.parents[i3])) {
50867             return true;
50868           }
50869         }
50870         return false;
50871       }
50872       var groups = drawLayer.selectAll(".midpoint").filter(midpointFilter).data(Object.values(midpoints), function(d) {
50873         return d.id;
50874       });
50875       groups.exit().remove();
50876       var enter = groups.enter().insert("g", ":first-child").attr("class", "midpoint");
50877       enter.append("polygon").attr("points", "-6,8 10,0 -6,-8").attr("class", "shadow");
50878       enter.append("polygon").attr("points", "-3,4 5,0 -3,-4").attr("class", "fill");
50879       groups = groups.merge(enter).attr("transform", function(d) {
50880         var translate = svgPointTransform(projection2);
50881         var a2 = graph.entity(d.edge[0]);
50882         var b2 = graph.entity(d.edge[1]);
50883         var angle2 = geoAngle(a2, b2, projection2) * (180 / Math.PI);
50884         return translate(d) + " rotate(" + angle2 + ")";
50885       }).call(svgTagClasses().tags(
50886         function(d) {
50887           return d.parents[0].tags;
50888         }
50889       ));
50890       groups.select("polygon.shadow");
50891       groups.select("polygon.fill");
50892       touchLayer.call(drawTargets, graph, Object.values(midpoints), midpointFilter);
50893     }
50894     return drawMidpoints;
50895   }
50896
50897   // modules/svg/points.js
50898   var import_fast_deep_equal7 = __toESM(require_fast_deep_equal());
50899   function svgPoints(projection2, context) {
50900     function markerPath(selection2, klass) {
50901       selection2.attr("class", klass).attr("transform", "translate(-8, -23)").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");
50902     }
50903     function sortY(a, b) {
50904       return b.loc[1] - a.loc[1];
50905     }
50906     function fastEntityKey(d) {
50907       var mode = context.mode();
50908       var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
50909       return isMoving ? d.id : osmEntity.key(d);
50910     }
50911     function drawTargets(selection2, graph, entities, filter2) {
50912       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
50913       var getTransform = svgPointTransform(projection2).geojson;
50914       var activeID = context.activeID();
50915       var data = [];
50916       entities.forEach(function(node) {
50917         if (activeID === node.id)
50918           return;
50919         data.push({
50920           type: "Feature",
50921           id: node.id,
50922           properties: {
50923             target: true,
50924             entity: node
50925           },
50926           geometry: node.asGeoJSON()
50927         });
50928       });
50929       var targets = selection2.selectAll(".point.target").filter(function(d) {
50930         return filter2(d.properties.entity);
50931       }).data(data, function key(d) {
50932         return d.id;
50933       });
50934       targets.exit().remove();
50935       targets.enter().append("rect").attr("x", -10).attr("y", -26).attr("width", 20).attr("height", 30).merge(targets).attr("class", function(d) {
50936         return "node point target " + fillClass + d.id;
50937       }).attr("transform", getTransform);
50938     }
50939     function drawPoints(selection2, graph, entities, filter2) {
50940       var wireframe = context.surface().classed("fill-wireframe");
50941       var zoom = geoScaleToZoom(projection2.scale());
50942       var base = context.history().base();
50943       function renderAsPoint(entity) {
50944         return entity.geometry(graph) === "point" && !(zoom >= 18 && entity.directions(graph, projection2).length);
50945       }
50946       var points = wireframe ? [] : entities.filter(renderAsPoint);
50947       points.sort(sortY);
50948       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.points");
50949       var touchLayer = selection2.selectAll(".layer-touch.points");
50950       var groups = drawLayer.selectAll("g.point").filter(filter2).data(points, fastEntityKey);
50951       groups.exit().remove();
50952       var enter = groups.enter().append("g").attr("class", function(d) {
50953         return "node point " + d.id;
50954       }).order();
50955       enter.append("path").call(markerPath, "shadow");
50956       enter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
50957       enter.append("path").call(markerPath, "stroke");
50958       enter.append("use").attr("transform", "translate(-5.5, -20)").attr("class", "icon").attr("width", "12px").attr("height", "12px");
50959       groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("added", function(d) {
50960         return !base.entities[d.id];
50961       }).classed("moved", function(d) {
50962         return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].loc, base.entities[d.id].loc);
50963       }).classed("retagged", function(d) {
50964         return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
50965       }).call(svgTagClasses());
50966       groups.select(".shadow");
50967       groups.select(".stroke");
50968       groups.select(".icon").attr("xlink:href", function(entity) {
50969         var preset = _mainPresetIndex.match(entity, graph);
50970         var picon = preset && preset.icon;
50971         return picon ? "#" + picon : "";
50972       });
50973       touchLayer.call(drawTargets, graph, points, filter2);
50974     }
50975     return drawPoints;
50976   }
50977
50978   // modules/svg/turns.js
50979   function svgTurns(projection2, context) {
50980     function icon2(turn) {
50981       var u = turn.u ? "-u" : "";
50982       if (turn.no)
50983         return "#iD-turn-no" + u;
50984       if (turn.only)
50985         return "#iD-turn-only" + u;
50986       return "#iD-turn-yes" + u;
50987     }
50988     function drawTurns(selection2, graph, turns) {
50989       function turnTransform(d) {
50990         var pxRadius = 50;
50991         var toWay = graph.entity(d.to.way);
50992         var toPoints = graph.childNodes(toWay).map(function(n2) {
50993           return n2.loc;
50994         }).map(projection2);
50995         var toLength = geoPathLength(toPoints);
50996         var mid = toLength / 2;
50997         var toNode = graph.entity(d.to.node);
50998         var toVertex = graph.entity(d.to.vertex);
50999         var a = geoAngle(toVertex, toNode, projection2);
51000         var o = projection2(toVertex.loc);
51001         var r = d.u ? 0 : !toWay.__via ? pxRadius : Math.min(mid, pxRadius);
51002         return "translate(" + (r * Math.cos(a) + o[0]) + "," + (r * Math.sin(a) + o[1]) + ") rotate(" + a * 180 / Math.PI + ")";
51003       }
51004       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.turns");
51005       var touchLayer = selection2.selectAll(".layer-touch.turns");
51006       var groups = drawLayer.selectAll("g.turn").data(turns, function(d) {
51007         return d.key;
51008       });
51009       groups.exit().remove();
51010       var groupsEnter = groups.enter().append("g").attr("class", function(d) {
51011         return "turn " + d.key;
51012       });
51013       var turnsEnter = groupsEnter.filter(function(d) {
51014         return !d.u;
51015       });
51016       turnsEnter.append("rect").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
51017       turnsEnter.append("use").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
51018       var uEnter = groupsEnter.filter(function(d) {
51019         return d.u;
51020       });
51021       uEnter.append("circle").attr("r", "16");
51022       uEnter.append("use").attr("transform", "translate(-16, -16)").attr("width", "32").attr("height", "32");
51023       groups = groups.merge(groupsEnter).attr("opacity", function(d) {
51024         return d.direct === false ? "0.7" : null;
51025       }).attr("transform", turnTransform);
51026       groups.select("use").attr("xlink:href", icon2);
51027       groups.select("rect");
51028       groups.select("circle");
51029       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
51030       groups = touchLayer.selectAll("g.turn").data(turns, function(d) {
51031         return d.key;
51032       });
51033       groups.exit().remove();
51034       groupsEnter = groups.enter().append("g").attr("class", function(d) {
51035         return "turn " + d.key;
51036       });
51037       turnsEnter = groupsEnter.filter(function(d) {
51038         return !d.u;
51039       });
51040       turnsEnter.append("rect").attr("class", "target " + fillClass).attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
51041       uEnter = groupsEnter.filter(function(d) {
51042         return d.u;
51043       });
51044       uEnter.append("circle").attr("class", "target " + fillClass).attr("r", "16");
51045       groups = groups.merge(groupsEnter).attr("transform", turnTransform);
51046       groups.select("rect");
51047       groups.select("circle");
51048       return this;
51049     }
51050     return drawTurns;
51051   }
51052
51053   // modules/svg/vertices.js
51054   var import_fast_deep_equal8 = __toESM(require_fast_deep_equal());
51055   function svgVertices(projection2, context) {
51056     var radiuses = {
51057       //       z16-, z17,   z18+,  w/icon
51058       shadow: [6, 7.5, 7.5, 12],
51059       stroke: [2.5, 3.5, 3.5, 8],
51060       fill: [1, 1.5, 1.5, 1.5]
51061     };
51062     var _currHoverTarget;
51063     var _currPersistent = {};
51064     var _currHover = {};
51065     var _prevHover = {};
51066     var _currSelected = {};
51067     var _prevSelected = {};
51068     var _radii = {};
51069     function sortY(a, b) {
51070       return b.loc[1] - a.loc[1];
51071     }
51072     function fastEntityKey(d) {
51073       var mode = context.mode();
51074       var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
51075       return isMoving ? d.id : osmEntity.key(d);
51076     }
51077     function draw(selection2, graph, vertices, sets2, filter2) {
51078       sets2 = sets2 || { selected: {}, important: {}, hovered: {} };
51079       var icons = {};
51080       var directions = {};
51081       var wireframe = context.surface().classed("fill-wireframe");
51082       var zoom = geoScaleToZoom(projection2.scale());
51083       var z = zoom < 17 ? 0 : zoom < 18 ? 1 : 2;
51084       var activeID = context.activeID();
51085       var base = context.history().base();
51086       function getIcon(d) {
51087         var entity = graph.entity(d.id);
51088         if (entity.id in icons)
51089           return icons[entity.id];
51090         icons[entity.id] = entity.hasInterestingTags() && _mainPresetIndex.match(entity, graph).icon;
51091         return icons[entity.id];
51092       }
51093       function getDirections(entity) {
51094         if (entity.id in directions)
51095           return directions[entity.id];
51096         var angles = entity.directions(graph, projection2);
51097         directions[entity.id] = angles.length ? angles : false;
51098         return angles;
51099       }
51100       function updateAttributes(selection3) {
51101         ["shadow", "stroke", "fill"].forEach(function(klass) {
51102           var rads = radiuses[klass];
51103           selection3.selectAll("." + klass).each(function(entity) {
51104             var i2 = z && getIcon(entity);
51105             var r = rads[i2 ? 3 : z];
51106             if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
51107               r += 1.5;
51108             }
51109             if (klass === "shadow") {
51110               _radii[entity.id] = r;
51111             }
51112             select_default2(this).attr("r", r).attr("visibility", i2 && klass === "fill" ? "hidden" : null);
51113           });
51114         });
51115       }
51116       vertices.sort(sortY);
51117       var groups = selection2.selectAll("g.vertex").filter(filter2).data(vertices, fastEntityKey);
51118       groups.exit().remove();
51119       var enter = groups.enter().append("g").attr("class", function(d) {
51120         return "node vertex " + d.id;
51121       }).order();
51122       enter.append("circle").attr("class", "shadow");
51123       enter.append("circle").attr("class", "stroke");
51124       enter.filter(function(d) {
51125         return d.hasInterestingTags();
51126       }).append("circle").attr("class", "fill");
51127       groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("sibling", function(d) {
51128         return d.id in sets2.selected;
51129       }).classed("shared", function(d) {
51130         return graph.isShared(d);
51131       }).classed("endpoint", function(d) {
51132         return d.isEndpoint(graph);
51133       }).classed("added", function(d) {
51134         return !base.entities[d.id];
51135       }).classed("moved", function(d) {
51136         return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].loc, base.entities[d.id].loc);
51137       }).classed("retagged", function(d) {
51138         return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
51139       }).call(updateAttributes);
51140       var iconUse = groups.selectAll(".icon").data(function data(d) {
51141         return zoom >= 17 && getIcon(d) ? [d] : [];
51142       }, fastEntityKey);
51143       iconUse.exit().remove();
51144       iconUse.enter().append("use").attr("class", "icon").attr("width", "12px").attr("height", "12px").attr("transform", "translate(-6, -6)").attr("xlink:href", function(d) {
51145         var picon = getIcon(d);
51146         return picon ? "#" + picon : "";
51147       });
51148       var dgroups = groups.selectAll(".viewfieldgroup").data(function data(d) {
51149         return zoom >= 18 && getDirections(d) ? [d] : [];
51150       }, fastEntityKey);
51151       dgroups.exit().remove();
51152       dgroups = dgroups.enter().insert("g", ".shadow").attr("class", "viewfieldgroup").merge(dgroups);
51153       var viewfields = dgroups.selectAll(".viewfield").data(getDirections, function key(d) {
51154         return osmEntity.key(d);
51155       });
51156       viewfields.exit().remove();
51157       viewfields.enter().append("path").attr("class", "viewfield").attr("d", "M0,0H0").merge(viewfields).attr("marker-start", "url(#ideditor-viewfield-marker" + (wireframe ? "-wireframe" : "") + ")").attr("transform", function(d) {
51158         return "rotate(" + d + ")";
51159       });
51160     }
51161     function drawTargets(selection2, graph, entities, filter2) {
51162       var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
51163       var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
51164       var getTransform = svgPointTransform(projection2).geojson;
51165       var activeID = context.activeID();
51166       var data = { targets: [], nopes: [] };
51167       entities.forEach(function(node) {
51168         if (activeID === node.id)
51169           return;
51170         var vertexType = svgPassiveVertex(node, graph, activeID);
51171         if (vertexType !== 0) {
51172           data.targets.push({
51173             type: "Feature",
51174             id: node.id,
51175             properties: {
51176               target: true,
51177               entity: node
51178             },
51179             geometry: node.asGeoJSON()
51180           });
51181         } else {
51182           data.nopes.push({
51183             type: "Feature",
51184             id: node.id + "-nope",
51185             properties: {
51186               nope: true,
51187               target: true,
51188               entity: node
51189             },
51190             geometry: node.asGeoJSON()
51191           });
51192         }
51193       });
51194       var targets = selection2.selectAll(".vertex.target-allowed").filter(function(d) {
51195         return filter2(d.properties.entity);
51196       }).data(data.targets, function key(d) {
51197         return d.id;
51198       });
51199       targets.exit().remove();
51200       targets.enter().append("circle").attr("r", function(d) {
51201         return _radii[d.id] || radiuses.shadow[3];
51202       }).merge(targets).attr("class", function(d) {
51203         return "node vertex target target-allowed " + targetClass + d.id;
51204       }).attr("transform", getTransform);
51205       var nopes = selection2.selectAll(".vertex.target-nope").filter(function(d) {
51206         return filter2(d.properties.entity);
51207       }).data(data.nopes, function key(d) {
51208         return d.id;
51209       });
51210       nopes.exit().remove();
51211       nopes.enter().append("circle").attr("r", function(d) {
51212         return _radii[d.properties.entity.id] || radiuses.shadow[3];
51213       }).merge(nopes).attr("class", function(d) {
51214         return "node vertex target target-nope " + nopeClass + d.id;
51215       }).attr("transform", getTransform);
51216     }
51217     function renderAsVertex(entity, graph, wireframe, zoom) {
51218       var geometry = entity.geometry(graph);
51219       return geometry === "vertex" || geometry === "point" && (wireframe || zoom >= 18 && entity.directions(graph, projection2).length);
51220     }
51221     function isEditedNode(node, base, head) {
51222       var baseNode = base.entities[node.id];
51223       var headNode = head.entities[node.id];
51224       return !headNode || !baseNode || !(0, import_fast_deep_equal8.default)(headNode.tags, baseNode.tags) || !(0, import_fast_deep_equal8.default)(headNode.loc, baseNode.loc);
51225     }
51226     function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
51227       var results = {};
51228       var seenIds = {};
51229       function addChildVertices(entity) {
51230         if (seenIds[entity.id])
51231           return;
51232         seenIds[entity.id] = true;
51233         var geometry = entity.geometry(graph);
51234         if (!context.features().isHiddenFeature(entity, graph, geometry)) {
51235           var i2;
51236           if (entity.type === "way") {
51237             for (i2 = 0; i2 < entity.nodes.length; i2++) {
51238               var child = graph.hasEntity(entity.nodes[i2]);
51239               if (child) {
51240                 addChildVertices(child);
51241               }
51242             }
51243           } else if (entity.type === "relation") {
51244             for (i2 = 0; i2 < entity.members.length; i2++) {
51245               var member = graph.hasEntity(entity.members[i2].id);
51246               if (member) {
51247                 addChildVertices(member);
51248               }
51249             }
51250           } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
51251             results[entity.id] = entity;
51252           }
51253         }
51254       }
51255       ids.forEach(function(id2) {
51256         var entity = graph.hasEntity(id2);
51257         if (!entity)
51258           return;
51259         if (entity.type === "node") {
51260           if (renderAsVertex(entity, graph, wireframe, zoom)) {
51261             results[entity.id] = entity;
51262             graph.parentWays(entity).forEach(function(entity2) {
51263               addChildVertices(entity2);
51264             });
51265           }
51266         } else {
51267           addChildVertices(entity);
51268         }
51269       });
51270       return results;
51271     }
51272     function drawVertices(selection2, graph, entities, filter2, extent, fullRedraw) {
51273       var wireframe = context.surface().classed("fill-wireframe");
51274       var visualDiff = context.surface().classed("highlight-edited");
51275       var zoom = geoScaleToZoom(projection2.scale());
51276       var mode = context.mode();
51277       var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
51278       var base = context.history().base();
51279       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.vertices");
51280       var touchLayer = selection2.selectAll(".layer-touch.points");
51281       if (fullRedraw) {
51282         _currPersistent = {};
51283         _radii = {};
51284       }
51285       for (var i2 = 0; i2 < entities.length; i2++) {
51286         var entity = entities[i2];
51287         var geometry = entity.geometry(graph);
51288         var keep = false;
51289         if (geometry === "point" && renderAsVertex(entity, graph, wireframe, zoom)) {
51290           _currPersistent[entity.id] = entity;
51291           keep = true;
51292         } else if (geometry === "vertex" && (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph) || visualDiff && isEditedNode(entity, base, graph))) {
51293           _currPersistent[entity.id] = entity;
51294           keep = true;
51295         }
51296         if (!keep && !fullRedraw) {
51297           delete _currPersistent[entity.id];
51298         }
51299       }
51300       var sets2 = {
51301         persistent: _currPersistent,
51302         // persistent = important vertices (render always)
51303         selected: _currSelected,
51304         // selected + siblings of selected (render always)
51305         hovered: _currHover
51306         // hovered + siblings of hovered (render only in draw modes)
51307       };
51308       var all = Object.assign({}, isMoving ? _currHover : {}, _currSelected, _currPersistent);
51309       var filterRendered = function(d) {
51310         return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter2(d);
51311       };
51312       drawLayer.call(draw, graph, currentVisible(all), sets2, filterRendered);
51313       var filterTouch = function(d) {
51314         return isMoving ? true : filterRendered(d);
51315       };
51316       touchLayer.call(drawTargets, graph, currentVisible(all), filterTouch);
51317       function currentVisible(which) {
51318         return Object.keys(which).map(graph.hasEntity, graph).filter(function(entity2) {
51319           return entity2 && entity2.intersects(extent, graph);
51320         });
51321       }
51322     }
51323     drawVertices.drawSelected = function(selection2, graph, extent) {
51324       var wireframe = context.surface().classed("fill-wireframe");
51325       var zoom = geoScaleToZoom(projection2.scale());
51326       _prevSelected = _currSelected || {};
51327       if (context.map().isInWideSelection()) {
51328         _currSelected = {};
51329         context.selectedIDs().forEach(function(id2) {
51330           var entity = graph.hasEntity(id2);
51331           if (!entity)
51332             return;
51333           if (entity.type === "node") {
51334             if (renderAsVertex(entity, graph, wireframe, zoom)) {
51335               _currSelected[entity.id] = entity;
51336             }
51337           }
51338         });
51339       } else {
51340         _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
51341       }
51342       var filter2 = function(d) {
51343         return d.id in _prevSelected;
51344       };
51345       drawVertices(selection2, graph, Object.values(_prevSelected), filter2, extent, false);
51346     };
51347     drawVertices.drawHover = function(selection2, graph, target, extent) {
51348       if (target === _currHoverTarget)
51349         return;
51350       var wireframe = context.surface().classed("fill-wireframe");
51351       var zoom = geoScaleToZoom(projection2.scale());
51352       _prevHover = _currHover || {};
51353       _currHoverTarget = target;
51354       var entity = target && target.properties && target.properties.entity;
51355       if (entity) {
51356         _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
51357       } else {
51358         _currHover = {};
51359       }
51360       var filter2 = function(d) {
51361         return d.id in _prevHover;
51362       };
51363       drawVertices(selection2, graph, Object.values(_prevHover), filter2, extent, false);
51364     };
51365     return drawVertices;
51366   }
51367
51368   // modules/util/bind_once.js
51369   function utilBindOnce(target, type2, listener, capture) {
51370     var typeOnce = type2 + ".once";
51371     function one2() {
51372       target.on(typeOnce, null);
51373       listener.apply(this, arguments);
51374     }
51375     target.on(typeOnce, one2, capture);
51376     return this;
51377   }
51378
51379   // modules/util/zoom_pan.js
51380   function defaultFilter3(d3_event) {
51381     return !d3_event.ctrlKey && !d3_event.button;
51382   }
51383   function defaultExtent2() {
51384     var e = this;
51385     if (e instanceof SVGElement) {
51386       e = e.ownerSVGElement || e;
51387       if (e.hasAttribute("viewBox")) {
51388         e = e.viewBox.baseVal;
51389         return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
51390       }
51391       return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
51392     }
51393     return [[0, 0], [e.clientWidth, e.clientHeight]];
51394   }
51395   function defaultWheelDelta2(d3_event) {
51396     return -d3_event.deltaY * (d3_event.deltaMode === 1 ? 0.05 : d3_event.deltaMode ? 1 : 2e-3);
51397   }
51398   function defaultConstrain2(transform2, extent, translateExtent) {
51399     var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1];
51400     return transform2.translate(
51401       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
51402       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
51403     );
51404   }
51405   function utilZoomPan() {
51406     var filter2 = defaultFilter3, extent = defaultExtent2, constrain = defaultConstrain2, wheelDelta = defaultWheelDelta2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], interpolate = zoom_default, dispatch10 = dispatch_default("start", "zoom", "end"), _wheelDelay = 150, _transform = identity2, _activeGesture;
51407     function zoom(selection2) {
51408       selection2.on("pointerdown.zoom", pointerdown).on("wheel.zoom", wheeled).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
51409       select_default2(window).on("pointermove.zoompan", pointermove).on("pointerup.zoompan pointercancel.zoompan", pointerup);
51410     }
51411     zoom.transform = function(collection, transform2, point2) {
51412       var selection2 = collection.selection ? collection.selection() : collection;
51413       if (collection !== selection2) {
51414         schedule(collection, transform2, point2);
51415       } else {
51416         selection2.interrupt().each(function() {
51417           gesture(this, arguments).start(null).zoom(null, null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(null);
51418         });
51419       }
51420     };
51421     zoom.scaleBy = function(selection2, k, p) {
51422       zoom.scaleTo(selection2, function() {
51423         var k0 = _transform.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
51424         return k0 * k1;
51425       }, p);
51426     };
51427     zoom.scaleTo = function(selection2, k, p) {
51428       zoom.transform(selection2, function() {
51429         var e = extent.apply(this, arguments), t0 = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p02), k1 = typeof k === "function" ? k.apply(this, arguments) : k;
51430         return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent);
51431       }, p);
51432     };
51433     zoom.translateBy = function(selection2, x, y) {
51434       zoom.transform(selection2, function() {
51435         return constrain(_transform.translate(
51436           typeof x === "function" ? x.apply(this, arguments) : x,
51437           typeof y === "function" ? y.apply(this, arguments) : y
51438         ), extent.apply(this, arguments), translateExtent);
51439       });
51440     };
51441     zoom.translateTo = function(selection2, x, y, p) {
51442       zoom.transform(selection2, function() {
51443         var e = extent.apply(this, arguments), t = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
51444         return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate(
51445           typeof x === "function" ? -x.apply(this, arguments) : -x,
51446           typeof y === "function" ? -y.apply(this, arguments) : -y
51447         ), e, translateExtent);
51448       }, p);
51449     };
51450     function scale(transform2, k) {
51451       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
51452       return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
51453     }
51454     function translate(transform2, p02, p1) {
51455       var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k;
51456       return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y);
51457     }
51458     function centroid(extent2) {
51459       return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
51460     }
51461     function schedule(transition2, transform2, point2) {
51462       transition2.on("start.zoom", function() {
51463         gesture(this, arguments).start(null);
51464       }).on("interrupt.zoom end.zoom", function() {
51465         gesture(this, arguments).end(null);
51466       }).tween("zoom", function() {
51467         var that = this, args = arguments, g = gesture(that, args), e = extent.apply(that, args), p = !point2 ? centroid(e) : typeof point2 === "function" ? point2.apply(that, args) : point2, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = _transform, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i2 = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
51468         return function(t) {
51469           if (t === 1) {
51470             t = b;
51471           } else {
51472             var l = i2(t);
51473             var k = w / l[2];
51474             t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
51475           }
51476           g.zoom(null, null, t);
51477         };
51478       });
51479     }
51480     function gesture(that, args, clean2) {
51481       return !clean2 && _activeGesture || new Gesture(that, args);
51482     }
51483     function Gesture(that, args) {
51484       this.that = that;
51485       this.args = args;
51486       this.active = 0;
51487       this.extent = extent.apply(that, args);
51488     }
51489     Gesture.prototype = {
51490       start: function(d3_event) {
51491         if (++this.active === 1) {
51492           _activeGesture = this;
51493           dispatch10.call("start", this, d3_event);
51494         }
51495         return this;
51496       },
51497       zoom: function(d3_event, key, transform2) {
51498         if (this.mouse && key !== "mouse")
51499           this.mouse[1] = transform2.invert(this.mouse[0]);
51500         if (this.pointer0 && key !== "touch")
51501           this.pointer0[1] = transform2.invert(this.pointer0[0]);
51502         if (this.pointer1 && key !== "touch")
51503           this.pointer1[1] = transform2.invert(this.pointer1[0]);
51504         _transform = transform2;
51505         dispatch10.call("zoom", this, d3_event, key, transform2);
51506         return this;
51507       },
51508       end: function(d3_event) {
51509         if (--this.active === 0) {
51510           _activeGesture = null;
51511           dispatch10.call("end", this, d3_event);
51512         }
51513         return this;
51514       }
51515     };
51516     function wheeled(d3_event) {
51517       if (!filter2.apply(this, arguments))
51518         return;
51519       var g = gesture(this, arguments), t = _transform, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = utilFastMouse(this)(d3_event);
51520       if (g.wheel) {
51521         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
51522           g.mouse[1] = t.invert(g.mouse[0] = p);
51523         }
51524         clearTimeout(g.wheel);
51525       } else {
51526         g.mouse = [p, t.invert(p)];
51527         interrupt_default(this);
51528         g.start(d3_event);
51529       }
51530       d3_event.preventDefault();
51531       d3_event.stopImmediatePropagation();
51532       g.wheel = setTimeout(wheelidled, _wheelDelay);
51533       g.zoom(d3_event, "mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
51534       function wheelidled() {
51535         g.wheel = null;
51536         g.end(d3_event);
51537       }
51538     }
51539     var _downPointerIDs = /* @__PURE__ */ new Set();
51540     var _pointerLocGetter;
51541     function pointerdown(d3_event) {
51542       _downPointerIDs.add(d3_event.pointerId);
51543       if (!filter2.apply(this, arguments))
51544         return;
51545       var g = gesture(this, arguments, _downPointerIDs.size === 1);
51546       var started;
51547       d3_event.stopImmediatePropagation();
51548       _pointerLocGetter = utilFastMouse(this);
51549       var loc = _pointerLocGetter(d3_event);
51550       var p = [loc, _transform.invert(loc), d3_event.pointerId];
51551       if (!g.pointer0) {
51552         g.pointer0 = p;
51553         started = true;
51554       } else if (!g.pointer1 && g.pointer0[2] !== p[2]) {
51555         g.pointer1 = p;
51556       }
51557       if (started) {
51558         interrupt_default(this);
51559         g.start(d3_event);
51560       }
51561     }
51562     function pointermove(d3_event) {
51563       if (!_downPointerIDs.has(d3_event.pointerId))
51564         return;
51565       if (!_activeGesture || !_pointerLocGetter)
51566         return;
51567       var g = gesture(this, arguments);
51568       var isPointer0 = g.pointer0 && g.pointer0[2] === d3_event.pointerId;
51569       var isPointer1 = !isPointer0 && g.pointer1 && g.pointer1[2] === d3_event.pointerId;
51570       if ((isPointer0 || isPointer1) && "buttons" in d3_event && !d3_event.buttons) {
51571         if (g.pointer0)
51572           _downPointerIDs.delete(g.pointer0[2]);
51573         if (g.pointer1)
51574           _downPointerIDs.delete(g.pointer1[2]);
51575         g.end(d3_event);
51576         return;
51577       }
51578       d3_event.preventDefault();
51579       d3_event.stopImmediatePropagation();
51580       var loc = _pointerLocGetter(d3_event);
51581       var t, p, l;
51582       if (isPointer0)
51583         g.pointer0[0] = loc;
51584       else if (isPointer1)
51585         g.pointer1[0] = loc;
51586       t = _transform;
51587       if (g.pointer1) {
51588         var p02 = g.pointer0[0], l0 = g.pointer0[1], p1 = g.pointer1[0], l1 = g.pointer1[1], dp = (dp = p1[0] - p02[0]) * dp + (dp = p1[1] - p02[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
51589         t = scale(t, Math.sqrt(dp / dl));
51590         p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2];
51591         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
51592       } else if (g.pointer0) {
51593         p = g.pointer0[0];
51594         l = g.pointer0[1];
51595       } else {
51596         return;
51597       }
51598       g.zoom(d3_event, "touch", constrain(translate(t, p, l), g.extent, translateExtent));
51599     }
51600     function pointerup(d3_event) {
51601       if (!_downPointerIDs.has(d3_event.pointerId))
51602         return;
51603       _downPointerIDs.delete(d3_event.pointerId);
51604       if (!_activeGesture)
51605         return;
51606       var g = gesture(this, arguments);
51607       d3_event.stopImmediatePropagation();
51608       if (g.pointer0 && g.pointer0[2] === d3_event.pointerId)
51609         delete g.pointer0;
51610       else if (g.pointer1 && g.pointer1[2] === d3_event.pointerId)
51611         delete g.pointer1;
51612       if (g.pointer1 && !g.pointer0) {
51613         g.pointer0 = g.pointer1;
51614         delete g.pointer1;
51615       }
51616       if (g.pointer0) {
51617         g.pointer0[1] = _transform.invert(g.pointer0[0]);
51618       } else {
51619         g.end(d3_event);
51620       }
51621     }
51622     zoom.wheelDelta = function(_) {
51623       return arguments.length ? (wheelDelta = utilFunctor(+_), zoom) : wheelDelta;
51624     };
51625     zoom.filter = function(_) {
51626       return arguments.length ? (filter2 = utilFunctor(!!_), zoom) : filter2;
51627     };
51628     zoom.extent = function(_) {
51629       return arguments.length ? (extent = utilFunctor([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
51630     };
51631     zoom.scaleExtent = function(_) {
51632       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
51633     };
51634     zoom.translateExtent = function(_) {
51635       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]]];
51636     };
51637     zoom.constrain = function(_) {
51638       return arguments.length ? (constrain = _, zoom) : constrain;
51639     };
51640     zoom.interpolate = function(_) {
51641       return arguments.length ? (interpolate = _, zoom) : interpolate;
51642     };
51643     zoom._transform = function(_) {
51644       return arguments.length ? (_transform = _, zoom) : _transform;
51645     };
51646     return utilRebind(zoom, dispatch10, "on");
51647   }
51648
51649   // modules/util/double_up.js
51650   function utilDoubleUp() {
51651     var dispatch10 = dispatch_default("doubleUp");
51652     var _maxTimespan = 500;
51653     var _maxDistance = 20;
51654     var _pointer;
51655     function pointerIsValidFor(loc) {
51656       return new Date().getTime() - _pointer.startTime <= _maxTimespan && // all pointer events must occur within a small distance of the first pointerdown
51657       geoVecLength(_pointer.startLoc, loc) <= _maxDistance;
51658     }
51659     function pointerdown(d3_event) {
51660       if (d3_event.ctrlKey || d3_event.button === 2)
51661         return;
51662       var loc = [d3_event.clientX, d3_event.clientY];
51663       if (_pointer && !pointerIsValidFor(loc)) {
51664         _pointer = void 0;
51665       }
51666       if (!_pointer) {
51667         _pointer = {
51668           startLoc: loc,
51669           startTime: new Date().getTime(),
51670           upCount: 0,
51671           pointerId: d3_event.pointerId
51672         };
51673       } else {
51674         _pointer.pointerId = d3_event.pointerId;
51675       }
51676     }
51677     function pointerup(d3_event) {
51678       if (d3_event.ctrlKey || d3_event.button === 2)
51679         return;
51680       if (!_pointer || _pointer.pointerId !== d3_event.pointerId)
51681         return;
51682       _pointer.upCount += 1;
51683       if (_pointer.upCount === 2) {
51684         var loc = [d3_event.clientX, d3_event.clientY];
51685         if (pointerIsValidFor(loc)) {
51686           var locInThis = utilFastMouse(this)(d3_event);
51687           dispatch10.call("doubleUp", this, d3_event, locInThis);
51688         }
51689         _pointer = void 0;
51690       }
51691     }
51692     function doubleUp(selection2) {
51693       if ("PointerEvent" in window) {
51694         selection2.on("pointerdown.doubleUp", pointerdown).on("pointerup.doubleUp", pointerup);
51695       } else {
51696         selection2.on("dblclick.doubleUp", function(d3_event) {
51697           dispatch10.call("doubleUp", this, d3_event, utilFastMouse(this)(d3_event));
51698         });
51699       }
51700     }
51701     doubleUp.off = function(selection2) {
51702       selection2.on("pointerdown.doubleUp", null).on("pointerup.doubleUp", null).on("dblclick.doubleUp", null);
51703     };
51704     return utilRebind(doubleUp, dispatch10, "on");
51705   }
51706
51707   // modules/renderer/map.js
51708   var TILESIZE = 256;
51709   var minZoom2 = 2;
51710   var maxZoom = 24;
51711   var kMin = geoZoomToScale(minZoom2, TILESIZE);
51712   var kMax = geoZoomToScale(maxZoom, TILESIZE);
51713   function clamp(num, min3, max3) {
51714     return Math.max(min3, Math.min(num, max3));
51715   }
51716   function rendererMap(context) {
51717     var dispatch10 = dispatch_default(
51718       "move",
51719       "drawn",
51720       "crossEditableZoom",
51721       "hitMinZoom",
51722       "changeHighlighting",
51723       "changeAreaFill"
51724     );
51725     var projection2 = context.projection;
51726     var curtainProjection = context.curtainProjection;
51727     var drawLayers;
51728     var drawPoints;
51729     var drawVertices;
51730     var drawLines;
51731     var drawAreas;
51732     var drawMidpoints;
51733     var drawLabels;
51734     var _selection = select_default2(null);
51735     var supersurface = select_default2(null);
51736     var wrapper = select_default2(null);
51737     var surface = select_default2(null);
51738     var _dimensions = [1, 1];
51739     var _dblClickZoomEnabled = true;
51740     var _redrawEnabled = true;
51741     var _gestureTransformStart;
51742     var _transformStart = projection2.transform();
51743     var _transformLast;
51744     var _isTransformed = false;
51745     var _minzoom = 0;
51746     var _getMouseCoords;
51747     var _lastPointerEvent;
51748     var _lastWithinEditableZoom;
51749     var _pointerDown = false;
51750     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
51751     var _zoomerPannerFunction = "PointerEvent" in window ? utilZoomPan : zoom_default2;
51752     var _zoomerPanner = _zoomerPannerFunction().scaleExtent([kMin, kMax]).interpolate(value_default).filter(zoomEventFilter).on("zoom.map", zoomPan).on("start.map", function(d3_event) {
51753       _pointerDown = d3_event && (d3_event.type === "pointerdown" || d3_event.sourceEvent && d3_event.sourceEvent.type === "pointerdown");
51754     }).on("end.map", function() {
51755       _pointerDown = false;
51756     });
51757     var _doubleUpHandler = utilDoubleUp();
51758     var scheduleRedraw = throttle_default(redraw, 750);
51759     function cancelPendingRedraw() {
51760       scheduleRedraw.cancel();
51761     }
51762     function map2(selection2) {
51763       _selection = selection2;
51764       context.on("change.map", immediateRedraw);
51765       var osm = context.connection();
51766       if (osm) {
51767         osm.on("change.map", immediateRedraw);
51768       }
51769       function didUndoOrRedo(targetTransform) {
51770         var mode = context.mode().id;
51771         if (mode !== "browse" && mode !== "select")
51772           return;
51773         if (targetTransform) {
51774           map2.transformEase(targetTransform);
51775         }
51776       }
51777       context.history().on("merge.map", function() {
51778         scheduleRedraw();
51779       }).on("change.map", immediateRedraw).on("undone.map", function(stack, fromStack) {
51780         didUndoOrRedo(fromStack.transform);
51781       }).on("redone.map", function(stack) {
51782         didUndoOrRedo(stack.transform);
51783       });
51784       context.background().on("change.map", immediateRedraw);
51785       context.features().on("redraw.map", immediateRedraw);
51786       drawLayers.on("change.map", function() {
51787         context.background().updateImagery();
51788         immediateRedraw();
51789       });
51790       selection2.on("wheel.map mousewheel.map", function(d3_event) {
51791         d3_event.preventDefault();
51792       }).call(_zoomerPanner).call(_zoomerPanner.transform, projection2.transform()).on("dblclick.zoom", null);
51793       map2.supersurface = supersurface = selection2.append("div").attr("class", "supersurface").call(utilSetTransform, 0, 0);
51794       wrapper = supersurface.append("div").attr("class", "layer layer-data");
51795       map2.surface = surface = wrapper.call(drawLayers).selectAll(".surface");
51796       surface.call(drawLabels.observe).call(_doubleUpHandler).on(_pointerPrefix + "down.zoom", function(d3_event) {
51797         _lastPointerEvent = d3_event;
51798         if (d3_event.button === 2) {
51799           d3_event.stopPropagation();
51800         }
51801       }, true).on(_pointerPrefix + "up.zoom", function(d3_event) {
51802         _lastPointerEvent = d3_event;
51803         if (resetTransform()) {
51804           immediateRedraw();
51805         }
51806       }).on(_pointerPrefix + "move.map", function(d3_event) {
51807         _lastPointerEvent = d3_event;
51808       }).on(_pointerPrefix + "over.vertices", function(d3_event) {
51809         if (map2.editableDataEnabled() && !_isTransformed) {
51810           var hover = d3_event.target.__data__;
51811           surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent());
51812           dispatch10.call("drawn", this, { full: false });
51813         }
51814       }).on(_pointerPrefix + "out.vertices", function(d3_event) {
51815         if (map2.editableDataEnabled() && !_isTransformed) {
51816           var hover = d3_event.relatedTarget && d3_event.relatedTarget.__data__;
51817           surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent());
51818           dispatch10.call("drawn", this, { full: false });
51819         }
51820       });
51821       var detected = utilDetect();
51822       if ("GestureEvent" in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping,
51823       // but we only need to do this on desktop Safari anyway. – #7694
51824       !detected.isMobileWebKit) {
51825         surface.on("gesturestart.surface", function(d3_event) {
51826           d3_event.preventDefault();
51827           _gestureTransformStart = projection2.transform();
51828         }).on("gesturechange.surface", gestureChange);
51829       }
51830       updateAreaFill();
51831       _doubleUpHandler.on("doubleUp.map", function(d3_event, p02) {
51832         if (!_dblClickZoomEnabled)
51833           return;
51834         if (typeof d3_event.target.__data__ === "object" && // or area fills
51835         !select_default2(d3_event.target).classed("fill"))
51836           return;
51837         var zoomOut2 = d3_event.shiftKey;
51838         var t = projection2.transform();
51839         var p1 = t.invert(p02);
51840         t = t.scale(zoomOut2 ? 0.5 : 2);
51841         t.x = p02[0] - p1[0] * t.k;
51842         t.y = p02[1] - p1[1] * t.k;
51843         map2.transformEase(t);
51844       });
51845       context.on("enter.map", function() {
51846         if (!map2.editableDataEnabled(
51847           true
51848           /* skip zoom check */
51849         ))
51850           return;
51851         if (_isTransformed)
51852           return;
51853         var graph = context.graph();
51854         var selectedAndParents = {};
51855         context.selectedIDs().forEach(function(id2) {
51856           var entity = graph.hasEntity(id2);
51857           if (entity) {
51858             selectedAndParents[entity.id] = entity;
51859             if (entity.type === "node") {
51860               graph.parentWays(entity).forEach(function(parent) {
51861                 selectedAndParents[parent.id] = parent;
51862               });
51863             }
51864           }
51865         });
51866         var data = Object.values(selectedAndParents);
51867         var filter2 = function(d) {
51868           return d.id in selectedAndParents;
51869         };
51870         data = context.features().filter(data, graph);
51871         surface.call(drawVertices.drawSelected, graph, map2.extent()).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent());
51872         dispatch10.call("drawn", this, { full: false });
51873         scheduleRedraw();
51874       });
51875       map2.dimensions(utilGetDimensions(selection2));
51876     }
51877     function zoomEventFilter(d3_event) {
51878       if (d3_event.type === "mousedown") {
51879         var hasOrphan = false;
51880         var listeners = window.__on;
51881         for (var i2 = 0; i2 < listeners.length; i2++) {
51882           var listener = listeners[i2];
51883           if (listener.name === "zoom" && listener.type === "mouseup") {
51884             hasOrphan = true;
51885             break;
51886           }
51887         }
51888         if (hasOrphan) {
51889           var event = window.CustomEvent;
51890           if (event) {
51891             event = new event("mouseup");
51892           } else {
51893             event = window.document.createEvent("Event");
51894             event.initEvent("mouseup", false, false);
51895           }
51896           event.view = window;
51897           window.dispatchEvent(event);
51898         }
51899       }
51900       return d3_event.button !== 2;
51901     }
51902     function pxCenter() {
51903       return [_dimensions[0] / 2, _dimensions[1] / 2];
51904     }
51905     function drawEditable(difference, extent) {
51906       var mode = context.mode();
51907       var graph = context.graph();
51908       var features = context.features();
51909       var all = context.history().intersects(map2.extent());
51910       var fullRedraw = false;
51911       var data;
51912       var set3;
51913       var filter2;
51914       var applyFeatureLayerFilters = true;
51915       if (map2.isInWideSelection()) {
51916         data = [];
51917         utilEntityAndDeepMemberIDs(mode.selectedIDs(), context.graph()).forEach(function(id2) {
51918           var entity = context.hasEntity(id2);
51919           if (entity)
51920             data.push(entity);
51921         });
51922         fullRedraw = true;
51923         filter2 = utilFunctor(true);
51924         applyFeatureLayerFilters = false;
51925       } else if (difference) {
51926         var complete = difference.complete(map2.extent());
51927         data = Object.values(complete).filter(Boolean);
51928         set3 = new Set(Object.keys(complete));
51929         filter2 = function(d) {
51930           return set3.has(d.id);
51931         };
51932         features.clear(data);
51933       } else {
51934         if (features.gatherStats(all, graph, _dimensions)) {
51935           extent = void 0;
51936         }
51937         if (extent) {
51938           data = context.history().intersects(map2.extent().intersection(extent));
51939           set3 = new Set(data.map(function(entity) {
51940             return entity.id;
51941           }));
51942           filter2 = function(d) {
51943             return set3.has(d.id);
51944           };
51945         } else {
51946           data = all;
51947           fullRedraw = true;
51948           filter2 = utilFunctor(true);
51949         }
51950       }
51951       if (applyFeatureLayerFilters) {
51952         data = features.filter(data, graph);
51953       } else {
51954         context.features().resetStats();
51955       }
51956       if (mode && mode.id === "select") {
51957         surface.call(drawVertices.drawSelected, graph, map2.extent());
51958       }
51959       surface.call(drawVertices, graph, data, filter2, map2.extent(), fullRedraw).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent()).call(drawLabels, graph, data, filter2, _dimensions, fullRedraw).call(drawPoints, graph, data, filter2);
51960       dispatch10.call("drawn", this, { full: true });
51961     }
51962     map2.init = function() {
51963       drawLayers = svgLayers(projection2, context);
51964       drawPoints = svgPoints(projection2, context);
51965       drawVertices = svgVertices(projection2, context);
51966       drawLines = svgLines(projection2, context);
51967       drawAreas = svgAreas(projection2, context);
51968       drawMidpoints = svgMidpoints(projection2, context);
51969       drawLabels = svgLabels(projection2, context);
51970     };
51971     function editOff() {
51972       context.features().resetStats();
51973       surface.selectAll(".layer-osm *").remove();
51974       surface.selectAll(".layer-touch:not(.markers) *").remove();
51975       var allowed = {
51976         "browse": true,
51977         "save": true,
51978         "select-note": true,
51979         "select-data": true,
51980         "select-error": true
51981       };
51982       var mode = context.mode();
51983       if (mode && !allowed[mode.id]) {
51984         context.enter(modeBrowse(context));
51985       }
51986       dispatch10.call("drawn", this, { full: true });
51987     }
51988     function gestureChange(d3_event) {
51989       var e = d3_event;
51990       e.preventDefault();
51991       var props = {
51992         deltaMode: 0,
51993         // dummy values to ignore in zoomPan
51994         deltaY: 1,
51995         // dummy values to ignore in zoomPan
51996         clientX: e.clientX,
51997         clientY: e.clientY,
51998         screenX: e.screenX,
51999         screenY: e.screenY,
52000         x: e.x,
52001         y: e.y
52002       };
52003       var e22 = new WheelEvent("wheel", props);
52004       e22._scale = e.scale;
52005       e22._rotation = e.rotation;
52006       _selection.node().dispatchEvent(e22);
52007     }
52008     function zoomPan(event, key, transform2) {
52009       var source = event && event.sourceEvent || event;
52010       var eventTransform = transform2 || event && event.transform;
52011       var x = eventTransform.x;
52012       var y = eventTransform.y;
52013       var k = eventTransform.k;
52014       if (source && source.type === "wheel") {
52015         if (_pointerDown)
52016           return;
52017         var detected = utilDetect();
52018         var dX = source.deltaX;
52019         var dY = source.deltaY;
52020         var x2 = x;
52021         var y2 = y;
52022         var k2 = k;
52023         var t0, p02, p1;
52024         if (source.deltaMode === 1) {
52025           var lines = Math.abs(source.deltaY);
52026           var sign2 = source.deltaY > 0 ? 1 : -1;
52027           dY = sign2 * clamp(
52028             Math.exp((lines - 1) * 0.75) * 4.000244140625,
52029             4.000244140625,
52030             // min
52031             350.000244140625
52032             // max
52033           );
52034           if (detected.os !== "mac") {
52035             dY *= 5;
52036           }
52037           t0 = _isTransformed ? _transformLast : _transformStart;
52038           p02 = _getMouseCoords(source);
52039           p1 = t0.invert(p02);
52040           k2 = t0.k * Math.pow(2, -dY / 500);
52041           k2 = clamp(k2, kMin, kMax);
52042           x2 = p02[0] - p1[0] * k2;
52043           y2 = p02[1] - p1[1] * k2;
52044         } else if (source._scale) {
52045           t0 = _gestureTransformStart;
52046           p02 = _getMouseCoords(source);
52047           p1 = t0.invert(p02);
52048           k2 = t0.k * source._scale;
52049           k2 = clamp(k2, kMin, kMax);
52050           x2 = p02[0] - p1[0] * k2;
52051           y2 = p02[1] - p1[1] * k2;
52052         } else if (source.ctrlKey && !isInteger(dY)) {
52053           dY *= 6;
52054           t0 = _isTransformed ? _transformLast : _transformStart;
52055           p02 = _getMouseCoords(source);
52056           p1 = t0.invert(p02);
52057           k2 = t0.k * Math.pow(2, -dY / 500);
52058           k2 = clamp(k2, kMin, kMax);
52059           x2 = p02[0] - p1[0] * k2;
52060           y2 = p02[1] - p1[1] * k2;
52061         } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
52062           t0 = _isTransformed ? _transformLast : _transformStart;
52063           p02 = _getMouseCoords(source);
52064           p1 = t0.invert(p02);
52065           k2 = t0.k * Math.pow(2, -dY / 500);
52066           k2 = clamp(k2, kMin, kMax);
52067           x2 = p02[0] - p1[0] * k2;
52068           y2 = p02[1] - p1[1] * k2;
52069         } else if (detected.os === "mac" && detected.browser !== "Firefox" && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
52070           p1 = projection2.translate();
52071           x2 = p1[0] - dX;
52072           y2 = p1[1] - dY;
52073           k2 = projection2.scale();
52074           k2 = clamp(k2, kMin, kMax);
52075         }
52076         if (x2 !== x || y2 !== y || k2 !== k) {
52077           x = x2;
52078           y = y2;
52079           k = k2;
52080           eventTransform = identity2.translate(x2, y2).scale(k2);
52081           if (_zoomerPanner._transform) {
52082             _zoomerPanner._transform(eventTransform);
52083           } else {
52084             _selection.node().__zoom = eventTransform;
52085           }
52086         }
52087       }
52088       if (_transformStart.x === x && _transformStart.y === y && _transformStart.k === k) {
52089         return;
52090       }
52091       if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
52092         surface.interrupt();
52093         dispatch10.call("hitMinZoom", this, map2);
52094         setCenterZoom(map2.center(), context.minEditableZoom(), 0, true);
52095         scheduleRedraw();
52096         dispatch10.call("move", this, map2);
52097         return;
52098       }
52099       projection2.transform(eventTransform);
52100       var withinEditableZoom = map2.withinEditableZoom();
52101       if (_lastWithinEditableZoom !== withinEditableZoom) {
52102         if (_lastWithinEditableZoom !== void 0) {
52103           dispatch10.call("crossEditableZoom", this, withinEditableZoom);
52104         }
52105         _lastWithinEditableZoom = withinEditableZoom;
52106       }
52107       var scale = k / _transformStart.k;
52108       var tX = (x / scale - _transformStart.x) * scale;
52109       var tY = (y / scale - _transformStart.y) * scale;
52110       if (context.inIntro()) {
52111         curtainProjection.transform({
52112           x: x - tX,
52113           y: y - tY,
52114           k
52115         });
52116       }
52117       if (source) {
52118         _lastPointerEvent = event;
52119       }
52120       _isTransformed = true;
52121       _transformLast = eventTransform;
52122       utilSetTransform(supersurface, tX, tY, scale);
52123       scheduleRedraw();
52124       dispatch10.call("move", this, map2);
52125       function isInteger(val) {
52126         return typeof val === "number" && isFinite(val) && Math.floor(val) === val;
52127       }
52128     }
52129     function resetTransform() {
52130       if (!_isTransformed)
52131         return false;
52132       utilSetTransform(supersurface, 0, 0);
52133       _isTransformed = false;
52134       if (context.inIntro()) {
52135         curtainProjection.transform(projection2.transform());
52136       }
52137       return true;
52138     }
52139     function redraw(difference, extent) {
52140       if (surface.empty() || !_redrawEnabled)
52141         return;
52142       if (resetTransform()) {
52143         difference = extent = void 0;
52144       }
52145       var zoom = map2.zoom();
52146       var z = String(~~zoom);
52147       if (surface.attr("data-zoom") !== z) {
52148         surface.attr("data-zoom", z);
52149       }
52150       var lat = map2.center()[1];
52151       var lowzoom = linear3().domain([-60, 0, 60]).range([17, 18.5, 17]).clamp(true);
52152       surface.classed("low-zoom", zoom <= lowzoom(lat));
52153       if (!difference) {
52154         supersurface.call(context.background());
52155         wrapper.call(drawLayers);
52156       }
52157       if (map2.editableDataEnabled() || map2.isInWideSelection()) {
52158         context.loadTiles(projection2);
52159         drawEditable(difference, extent);
52160       } else {
52161         editOff();
52162       }
52163       _transformStart = projection2.transform();
52164       return map2;
52165     }
52166     var immediateRedraw = function(difference, extent) {
52167       if (!difference && !extent)
52168         cancelPendingRedraw();
52169       redraw(difference, extent);
52170     };
52171     map2.lastPointerEvent = function() {
52172       return _lastPointerEvent;
52173     };
52174     map2.mouse = function(d3_event) {
52175       var event = d3_event || _lastPointerEvent;
52176       if (event) {
52177         var s;
52178         while (s = event.sourceEvent) {
52179           event = s;
52180         }
52181         return _getMouseCoords(event);
52182       }
52183       return null;
52184     };
52185     map2.mouseCoordinates = function() {
52186       var coord2 = map2.mouse() || pxCenter();
52187       return projection2.invert(coord2);
52188     };
52189     map2.dblclickZoomEnable = function(val) {
52190       if (!arguments.length)
52191         return _dblClickZoomEnabled;
52192       _dblClickZoomEnabled = val;
52193       return map2;
52194     };
52195     map2.redrawEnable = function(val) {
52196       if (!arguments.length)
52197         return _redrawEnabled;
52198       _redrawEnabled = val;
52199       return map2;
52200     };
52201     map2.isTransformed = function() {
52202       return _isTransformed;
52203     };
52204     function setTransform(t2, duration, force) {
52205       var t = projection2.transform();
52206       if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y)
52207         return false;
52208       if (duration) {
52209         _selection.transition().duration(duration).on("start", function() {
52210           map2.startEase();
52211         }).call(_zoomerPanner.transform, identity2.translate(t2.x, t2.y).scale(t2.k));
52212       } else {
52213         projection2.transform(t2);
52214         _transformStart = t2;
52215         _selection.call(_zoomerPanner.transform, _transformStart);
52216       }
52217       return true;
52218     }
52219     function setCenterZoom(loc2, z2, duration, force) {
52220       var c = map2.center();
52221       var z = map2.zoom();
52222       if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force)
52223         return false;
52224       var proj = geoRawMercator().transform(projection2.transform());
52225       var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
52226       proj.scale(k2);
52227       var t = proj.translate();
52228       var point2 = proj(loc2);
52229       var center = pxCenter();
52230       t[0] += center[0] - point2[0];
52231       t[1] += center[1] - point2[1];
52232       return setTransform(identity2.translate(t[0], t[1]).scale(k2), duration, force);
52233     }
52234     map2.pan = function(delta, duration) {
52235       var t = projection2.translate();
52236       var k = projection2.scale();
52237       t[0] += delta[0];
52238       t[1] += delta[1];
52239       if (duration) {
52240         _selection.transition().duration(duration).on("start", function() {
52241           map2.startEase();
52242         }).call(_zoomerPanner.transform, identity2.translate(t[0], t[1]).scale(k));
52243       } else {
52244         projection2.translate(t);
52245         _transformStart = projection2.transform();
52246         _selection.call(_zoomerPanner.transform, _transformStart);
52247         dispatch10.call("move", this, map2);
52248         immediateRedraw();
52249       }
52250       return map2;
52251     };
52252     map2.dimensions = function(val) {
52253       if (!arguments.length)
52254         return _dimensions;
52255       _dimensions = val;
52256       drawLayers.dimensions(_dimensions);
52257       context.background().dimensions(_dimensions);
52258       projection2.clipExtent([[0, 0], _dimensions]);
52259       _getMouseCoords = utilFastMouse(supersurface.node());
52260       scheduleRedraw();
52261       return map2;
52262     };
52263     function zoomIn(delta) {
52264       setCenterZoom(map2.center(), ~~map2.zoom() + delta, 250, true);
52265     }
52266     function zoomOut(delta) {
52267       setCenterZoom(map2.center(), ~~map2.zoom() - delta, 250, true);
52268     }
52269     map2.zoomIn = function() {
52270       zoomIn(1);
52271     };
52272     map2.zoomInFurther = function() {
52273       zoomIn(4);
52274     };
52275     map2.canZoomIn = function() {
52276       return map2.zoom() < maxZoom;
52277     };
52278     map2.zoomOut = function() {
52279       zoomOut(1);
52280     };
52281     map2.zoomOutFurther = function() {
52282       zoomOut(4);
52283     };
52284     map2.canZoomOut = function() {
52285       return map2.zoom() > minZoom2;
52286     };
52287     map2.center = function(loc2) {
52288       if (!arguments.length) {
52289         return projection2.invert(pxCenter());
52290       }
52291       if (setCenterZoom(loc2, map2.zoom())) {
52292         dispatch10.call("move", this, map2);
52293       }
52294       scheduleRedraw();
52295       return map2;
52296     };
52297     map2.unobscuredCenterZoomEase = function(loc, zoom) {
52298       var offset = map2.unobscuredOffsetPx();
52299       var proj = geoRawMercator().transform(projection2.transform());
52300       proj.scale(geoZoomToScale(zoom, TILESIZE));
52301       var locPx = proj(loc);
52302       var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
52303       var offsetLoc = proj.invert(offsetLocPx);
52304       map2.centerZoomEase(offsetLoc, zoom);
52305     };
52306     map2.unobscuredOffsetPx = function() {
52307       var openPane = context.container().select(".map-panes .map-pane.shown");
52308       if (!openPane.empty()) {
52309         return [openPane.node().offsetWidth / 2, 0];
52310       }
52311       return [0, 0];
52312     };
52313     map2.zoom = function(z2) {
52314       if (!arguments.length) {
52315         return Math.max(geoScaleToZoom(projection2.scale(), TILESIZE), 0);
52316       }
52317       if (z2 < _minzoom) {
52318         surface.interrupt();
52319         dispatch10.call("hitMinZoom", this, map2);
52320         z2 = context.minEditableZoom();
52321       }
52322       if (setCenterZoom(map2.center(), z2)) {
52323         dispatch10.call("move", this, map2);
52324       }
52325       scheduleRedraw();
52326       return map2;
52327     };
52328     map2.centerZoom = function(loc2, z2) {
52329       if (setCenterZoom(loc2, z2)) {
52330         dispatch10.call("move", this, map2);
52331       }
52332       scheduleRedraw();
52333       return map2;
52334     };
52335     map2.zoomTo = function(entity) {
52336       var extent = entity.extent(context.graph());
52337       if (!isFinite(extent.area()))
52338         return map2;
52339       var z2 = clamp(map2.trimmedExtentZoom(extent), 0, 20);
52340       return map2.centerZoom(extent.center(), z2);
52341     };
52342     map2.centerEase = function(loc2, duration) {
52343       duration = duration || 250;
52344       setCenterZoom(loc2, map2.zoom(), duration);
52345       return map2;
52346     };
52347     map2.zoomEase = function(z2, duration) {
52348       duration = duration || 250;
52349       setCenterZoom(map2.center(), z2, duration, false);
52350       return map2;
52351     };
52352     map2.centerZoomEase = function(loc2, z2, duration) {
52353       duration = duration || 250;
52354       setCenterZoom(loc2, z2, duration, false);
52355       return map2;
52356     };
52357     map2.transformEase = function(t2, duration) {
52358       duration = duration || 250;
52359       setTransform(
52360         t2,
52361         duration,
52362         false
52363         /* don't force */
52364       );
52365       return map2;
52366     };
52367     map2.zoomToEase = function(obj, duration) {
52368       var extent;
52369       if (Array.isArray(obj)) {
52370         obj.forEach(function(entity) {
52371           var entityExtent = entity.extent(context.graph());
52372           if (!extent) {
52373             extent = entityExtent;
52374           } else {
52375             extent = extent.extend(entityExtent);
52376           }
52377         });
52378       } else {
52379         extent = obj.extent(context.graph());
52380       }
52381       if (!isFinite(extent.area()))
52382         return map2;
52383       var z2 = clamp(map2.trimmedExtentZoom(extent), 0, 20);
52384       return map2.centerZoomEase(extent.center(), z2, duration);
52385     };
52386     map2.startEase = function() {
52387       utilBindOnce(surface, _pointerPrefix + "down.ease", function() {
52388         map2.cancelEase();
52389       });
52390       return map2;
52391     };
52392     map2.cancelEase = function() {
52393       _selection.interrupt();
52394       return map2;
52395     };
52396     map2.extent = function(val) {
52397       if (!arguments.length) {
52398         return new geoExtent(
52399           projection2.invert([0, _dimensions[1]]),
52400           projection2.invert([_dimensions[0], 0])
52401         );
52402       } else {
52403         var extent = geoExtent(val);
52404         map2.centerZoom(extent.center(), map2.extentZoom(extent));
52405       }
52406     };
52407     map2.trimmedExtent = function(val) {
52408       if (!arguments.length) {
52409         var headerY = 71;
52410         var footerY = 30;
52411         var pad2 = 10;
52412         return new geoExtent(
52413           projection2.invert([pad2, _dimensions[1] - footerY - pad2]),
52414           projection2.invert([_dimensions[0] - pad2, headerY + pad2])
52415         );
52416       } else {
52417         var extent = geoExtent(val);
52418         map2.centerZoom(extent.center(), map2.trimmedExtentZoom(extent));
52419       }
52420     };
52421     function calcExtentZoom(extent, dim) {
52422       var tl = projection2([extent[0][0], extent[1][1]]);
52423       var br = projection2([extent[1][0], extent[0][1]]);
52424       var hFactor = (br[0] - tl[0]) / dim[0];
52425       var vFactor = (br[1] - tl[1]) / dim[1];
52426       var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
52427       var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
52428       var newZoom = map2.zoom() - Math.max(hZoomDiff, vZoomDiff);
52429       return newZoom;
52430     }
52431     map2.extentZoom = function(val) {
52432       return calcExtentZoom(geoExtent(val), _dimensions);
52433     };
52434     map2.trimmedExtentZoom = function(val) {
52435       var trimY = 120;
52436       var trimX = 40;
52437       var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
52438       return calcExtentZoom(geoExtent(val), trimmed);
52439     };
52440     map2.withinEditableZoom = function() {
52441       return map2.zoom() >= context.minEditableZoom();
52442     };
52443     map2.isInWideSelection = function() {
52444       return !map2.withinEditableZoom() && context.selectedIDs().length;
52445     };
52446     map2.editableDataEnabled = function(skipZoomCheck) {
52447       var layer = context.layers().layer("osm");
52448       if (!layer || !layer.enabled())
52449         return false;
52450       return skipZoomCheck || map2.withinEditableZoom();
52451     };
52452     map2.notesEditable = function() {
52453       var layer = context.layers().layer("notes");
52454       if (!layer || !layer.enabled())
52455         return false;
52456       return map2.withinEditableZoom();
52457     };
52458     map2.minzoom = function(val) {
52459       if (!arguments.length)
52460         return _minzoom;
52461       _minzoom = val;
52462       return map2;
52463     };
52464     map2.toggleHighlightEdited = function() {
52465       surface.classed("highlight-edited", !surface.classed("highlight-edited"));
52466       map2.pan([0, 0]);
52467       dispatch10.call("changeHighlighting", this);
52468     };
52469     map2.areaFillOptions = ["wireframe", "partial", "full"];
52470     map2.activeAreaFill = function(val) {
52471       if (!arguments.length)
52472         return corePreferences("area-fill") || "partial";
52473       corePreferences("area-fill", val);
52474       if (val !== "wireframe") {
52475         corePreferences("area-fill-toggle", val);
52476       }
52477       updateAreaFill();
52478       map2.pan([0, 0]);
52479       dispatch10.call("changeAreaFill", this);
52480       return map2;
52481     };
52482     map2.toggleWireframe = function() {
52483       var activeFill = map2.activeAreaFill();
52484       if (activeFill === "wireframe") {
52485         activeFill = corePreferences("area-fill-toggle") || "partial";
52486       } else {
52487         activeFill = "wireframe";
52488       }
52489       map2.activeAreaFill(activeFill);
52490     };
52491     function updateAreaFill() {
52492       var activeFill = map2.activeAreaFill();
52493       map2.areaFillOptions.forEach(function(opt) {
52494         surface.classed("fill-" + opt, Boolean(opt === activeFill));
52495       });
52496     }
52497     map2.layers = () => drawLayers;
52498     map2.doubleUpHandler = function() {
52499       return _doubleUpHandler;
52500     };
52501     return utilRebind(map2, dispatch10, "on");
52502   }
52503
52504   // modules/renderer/photos.js
52505   function rendererPhotos(context) {
52506     var dispatch10 = dispatch_default("change");
52507     var _layerIDs = ["streetside", "mapillary", "mapillary-map-features", "mapillary-signs", "kartaview"];
52508     var _allPhotoTypes = ["flat", "panoramic"];
52509     var _shownPhotoTypes = _allPhotoTypes.slice();
52510     var _dateFilters = ["fromDate", "toDate"];
52511     var _fromDate;
52512     var _toDate;
52513     var _usernames;
52514     function photos() {
52515     }
52516     function updateStorage() {
52517       if (window.mocha)
52518         return;
52519       var hash = utilStringQs(window.location.hash);
52520       var enabled = context.layers().all().filter(function(d) {
52521         return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
52522       }).map(function(d) {
52523         return d.id;
52524       });
52525       if (enabled.length) {
52526         hash.photo_overlay = enabled.join(",");
52527       } else {
52528         delete hash.photo_overlay;
52529       }
52530       window.location.replace("#" + utilQsString(hash, true));
52531     }
52532     photos.overlayLayerIDs = function() {
52533       return _layerIDs;
52534     };
52535     photos.allPhotoTypes = function() {
52536       return _allPhotoTypes;
52537     };
52538     photos.dateFilters = function() {
52539       return _dateFilters;
52540     };
52541     photos.dateFilterValue = function(val) {
52542       return val === _dateFilters[0] ? _fromDate : _toDate;
52543     };
52544     photos.setDateFilter = function(type2, val, updateUrl) {
52545       var date = val && new Date(val);
52546       if (date && !isNaN(date)) {
52547         val = date.toISOString().slice(0, 10);
52548       } else {
52549         val = null;
52550       }
52551       if (type2 === _dateFilters[0]) {
52552         _fromDate = val;
52553         if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
52554           _toDate = _fromDate;
52555         }
52556       }
52557       if (type2 === _dateFilters[1]) {
52558         _toDate = val;
52559         if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
52560           _fromDate = _toDate;
52561         }
52562       }
52563       dispatch10.call("change", this);
52564       if (updateUrl) {
52565         var rangeString;
52566         if (_fromDate || _toDate) {
52567           rangeString = (_fromDate || "") + "_" + (_toDate || "");
52568         }
52569         setUrlFilterValue("photo_dates", rangeString);
52570       }
52571     };
52572     photos.setUsernameFilter = function(val, updateUrl) {
52573       if (val && typeof val === "string")
52574         val = val.replace(/;/g, ",").split(",");
52575       if (val) {
52576         val = val.map((d) => d.trim()).filter(Boolean);
52577         if (!val.length) {
52578           val = null;
52579         }
52580       }
52581       _usernames = val;
52582       dispatch10.call("change", this);
52583       if (updateUrl) {
52584         var hashString;
52585         if (_usernames) {
52586           hashString = _usernames.join(",");
52587         }
52588         setUrlFilterValue("photo_username", hashString);
52589       }
52590     };
52591     function setUrlFilterValue(property, val) {
52592       if (!window.mocha) {
52593         var hash = utilStringQs(window.location.hash);
52594         if (val) {
52595           if (hash[property] === val)
52596             return;
52597           hash[property] = val;
52598         } else {
52599           if (!(property in hash))
52600             return;
52601           delete hash[property];
52602         }
52603         window.location.replace("#" + utilQsString(hash, true));
52604       }
52605     }
52606     function showsLayer(id2) {
52607       var layer = context.layers().layer(id2);
52608       return layer && layer.supported() && layer.enabled();
52609     }
52610     photos.shouldFilterByDate = function() {
52611       return showsLayer("mapillary") || showsLayer("kartaview") || showsLayer("streetside");
52612     };
52613     photos.shouldFilterByPhotoType = function() {
52614       return showsLayer("mapillary") || showsLayer("streetside") && showsLayer("kartaview");
52615     };
52616     photos.shouldFilterByUsername = function() {
52617       return !showsLayer("mapillary") && showsLayer("kartaview") && !showsLayer("streetside");
52618     };
52619     photos.showsPhotoType = function(val) {
52620       if (!photos.shouldFilterByPhotoType())
52621         return true;
52622       return _shownPhotoTypes.indexOf(val) !== -1;
52623     };
52624     photos.showsFlat = function() {
52625       return photos.showsPhotoType("flat");
52626     };
52627     photos.showsPanoramic = function() {
52628       return photos.showsPhotoType("panoramic");
52629     };
52630     photos.fromDate = function() {
52631       return _fromDate;
52632     };
52633     photos.toDate = function() {
52634       return _toDate;
52635     };
52636     photos.togglePhotoType = function(val) {
52637       var index = _shownPhotoTypes.indexOf(val);
52638       if (index !== -1) {
52639         _shownPhotoTypes.splice(index, 1);
52640       } else {
52641         _shownPhotoTypes.push(val);
52642       }
52643       dispatch10.call("change", this);
52644       return photos;
52645     };
52646     photos.usernames = function() {
52647       return _usernames;
52648     };
52649     photos.init = function() {
52650       var hash = utilStringQs(window.location.hash);
52651       if (hash.photo_dates) {
52652         var parts = /^(.*)[–_](.*)$/g.exec(hash.photo_dates.trim());
52653         this.setDateFilter("fromDate", parts && parts.length >= 2 && parts[1], false);
52654         this.setDateFilter("toDate", parts && parts.length >= 3 && parts[2], false);
52655       }
52656       if (hash.photo_username) {
52657         this.setUsernameFilter(hash.photo_username, false);
52658       }
52659       if (hash.photo_overlay) {
52660         var hashOverlayIDs = hash.photo_overlay.replace(/;/g, ",").split(",");
52661         hashOverlayIDs.forEach(function(id2) {
52662           if (id2 === "openstreetcam")
52663             id2 = "kartaview";
52664           var layer2 = _layerIDs.indexOf(id2) !== -1 && context.layers().layer(id2);
52665           if (layer2 && !layer2.enabled())
52666             layer2.enabled(true);
52667         });
52668       }
52669       if (hash.photo) {
52670         var photoIds = hash.photo.replace(/;/g, ",").split(",");
52671         var photoId = photoIds.length && photoIds[0].trim();
52672         var results = /(.*)\/(.*)/g.exec(photoId);
52673         if (results && results.length >= 3) {
52674           var serviceId = results[1];
52675           if (serviceId === "openstreetcam")
52676             serviceId = "kartaview";
52677           var photoKey = results[2];
52678           var service = services[serviceId];
52679           if (service && service.ensureViewerLoaded) {
52680             var layer = _layerIDs.indexOf(serviceId) !== -1 && context.layers().layer(serviceId);
52681             if (layer && !layer.enabled())
52682               layer.enabled(true);
52683             var baselineTime = Date.now();
52684             service.on("loadedImages.rendererPhotos", function() {
52685               if (Date.now() - baselineTime > 45e3) {
52686                 service.on("loadedImages.rendererPhotos", null);
52687                 return;
52688               }
52689               if (!service.cachedImage(photoKey))
52690                 return;
52691               service.on("loadedImages.rendererPhotos", null);
52692               service.ensureViewerLoaded(context).then(function() {
52693                 service.selectImage(context, photoKey).showViewer(context);
52694               });
52695             });
52696           }
52697         }
52698       }
52699       context.layers().on("change.rendererPhotos", updateStorage);
52700     };
52701     return utilRebind(photos, dispatch10, "on");
52702   }
52703
52704   // modules/ui/account.js
52705   function uiAccount(context) {
52706     const osm = context.connection();
52707     function updateUserDetails(selection2) {
52708       if (!osm)
52709         return;
52710       if (!osm.authenticated()) {
52711         render(selection2, null);
52712       } else {
52713         osm.userDetails((err, user) => render(selection2, user));
52714       }
52715     }
52716     function render(selection2, user) {
52717       let userInfo = selection2.select(".userInfo");
52718       let loginLogout = selection2.select(".loginLogout");
52719       if (user) {
52720         userInfo.html("").classed("hide", false);
52721         let userLink = userInfo.append("a").attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
52722         if (user.image_url) {
52723           userLink.append("img").attr("class", "icon pre-text user-icon").attr("src", user.image_url);
52724         } else {
52725           userLink.call(svgIcon("#iD-icon-avatar", "pre-text light"));
52726         }
52727         userLink.append("span").attr("class", "label").html(user.display_name);
52728         loginLogout.classed("hide", false).select("a").text(_t("logout")).on("click", (e) => {
52729           e.preventDefault();
52730           osm.logout();
52731           tryLogout();
52732         });
52733       } else {
52734         userInfo.html("").classed("hide", true);
52735         loginLogout.classed("hide", false).select("a").text(_t("login")).on("click", (e) => {
52736           e.preventDefault();
52737           osm.authenticate();
52738         });
52739       }
52740     }
52741     function tryLogout() {
52742       if (!osm)
52743         return;
52744       const url = osm.getUrlRoot() + "/logout?referer=%2Flogin";
52745       const w = 600;
52746       const h = 550;
52747       const settings = [
52748         ["width", w],
52749         ["height", h],
52750         ["left", window.screen.width / 2 - w / 2],
52751         ["top", window.screen.height / 2 - h / 2]
52752       ].map((x) => x.join("=")).join(",");
52753       window.open(url, "_blank", settings);
52754     }
52755     return function(selection2) {
52756       if (!osm)
52757         return;
52758       selection2.append("li").attr("class", "userInfo").classed("hide", true);
52759       selection2.append("li").attr("class", "loginLogout").classed("hide", true).append("a").attr("href", "#");
52760       osm.on("change.account", () => updateUserDetails(selection2));
52761       updateUserDetails(selection2);
52762     };
52763   }
52764
52765   // modules/ui/attribution.js
52766   function uiAttribution(context) {
52767     let _selection = select_default2(null);
52768     function render(selection2, data, klass) {
52769       let div = selection2.selectAll(`.${klass}`).data([0]);
52770       div = div.enter().append("div").attr("class", klass).merge(div);
52771       let attributions = div.selectAll(".attribution").data(data, (d) => d.id);
52772       attributions.exit().remove();
52773       attributions = attributions.enter().append("span").attr("class", "attribution").each((d, i2, nodes) => {
52774         let attribution = select_default2(nodes[i2]);
52775         if (d.terms_html) {
52776           attribution.html(d.terms_html);
52777           return;
52778         }
52779         if (d.terms_url) {
52780           attribution = attribution.append("a").attr("href", d.terms_url).attr("target", "_blank");
52781         }
52782         const sourceID = d.id.replace(/\./g, "<TX_DOT>");
52783         const terms_text = _t(
52784           `imagery.${sourceID}.attribution.text`,
52785           { default: d.terms_text || d.id || d.name() }
52786         );
52787         if (d.icon && !d.overlay) {
52788           attribution.append("img").attr("class", "source-image").attr("src", d.icon);
52789         }
52790         attribution.append("span").attr("class", "attribution-text").text(terms_text);
52791       }).merge(attributions);
52792       let copyright = attributions.selectAll(".copyright-notice").data((d) => {
52793         let notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
52794         return notice ? [notice] : [];
52795       });
52796       copyright.exit().remove();
52797       copyright = copyright.enter().append("span").attr("class", "copyright-notice").merge(copyright);
52798       copyright.text(String);
52799     }
52800     function update() {
52801       let baselayer = context.background().baseLayerSource();
52802       _selection.call(render, baselayer ? [baselayer] : [], "base-layer-attribution");
52803       const z = context.map().zoom();
52804       let overlays = context.background().overlayLayerSources() || [];
52805       _selection.call(render, overlays.filter((s) => s.validZoom(z)), "overlay-layer-attribution");
52806     }
52807     return function(selection2) {
52808       _selection = selection2;
52809       context.background().on("change.attribution", update);
52810       context.map().on("move.attribution", throttle_default(update, 400, { leading: false }));
52811       update();
52812     };
52813   }
52814
52815   // modules/ui/contributors.js
52816   function uiContributors(context) {
52817     var osm = context.connection(), debouncedUpdate = debounce_default(function() {
52818       update();
52819     }, 1e3), limit = 4, hidden = false, wrap2 = select_default2(null);
52820     function update() {
52821       if (!osm)
52822         return;
52823       var users = {}, entities = context.history().intersects(context.map().extent());
52824       entities.forEach(function(entity) {
52825         if (entity && entity.user)
52826           users[entity.user] = true;
52827       });
52828       var u = Object.keys(users), subset = u.slice(0, u.length > limit ? limit - 1 : limit);
52829       wrap2.html("").call(svgIcon("#iD-icon-nearby", "pre-text light"));
52830       var userList = select_default2(document.createElement("span"));
52831       userList.selectAll().data(subset).enter().append("a").attr("class", "user-link").attr("href", function(d) {
52832         return osm.userURL(d);
52833       }).attr("target", "_blank").text(String);
52834       if (u.length > limit) {
52835         var count = select_default2(document.createElement("span"));
52836         var othersNum = u.length - limit + 1;
52837         count.append("a").attr("target", "_blank").attr("href", function() {
52838           return osm.changesetsURL(context.map().center(), context.map().zoom());
52839         }).text(othersNum);
52840         wrap2.append("span").html(_t.html("contributors.truncated_list", { n: othersNum, users: { html: userList.html() }, count: { html: count.html() } }));
52841       } else {
52842         wrap2.append("span").html(_t.html("contributors.list", { users: { html: userList.html() } }));
52843       }
52844       if (!u.length) {
52845         hidden = true;
52846         wrap2.transition().style("opacity", 0);
52847       } else if (hidden) {
52848         wrap2.transition().style("opacity", 1);
52849       }
52850     }
52851     return function(selection2) {
52852       if (!osm)
52853         return;
52854       wrap2 = selection2;
52855       update();
52856       osm.on("loaded.contributors", debouncedUpdate);
52857       context.map().on("move.contributors", debouncedUpdate);
52858     };
52859   }
52860
52861   // modules/ui/popover.js
52862   var _popoverID = 0;
52863   function uiPopover(klass) {
52864     var _id = _popoverID++;
52865     var _anchorSelection = select_default2(null);
52866     var popover = function(selection2) {
52867       _anchorSelection = selection2;
52868       selection2.each(setup);
52869     };
52870     var _animation = utilFunctor(false);
52871     var _placement = utilFunctor("top");
52872     var _alignment = utilFunctor("center");
52873     var _scrollContainer = utilFunctor(select_default2(null));
52874     var _content;
52875     var _displayType = utilFunctor("");
52876     var _hasArrow = utilFunctor(true);
52877     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
52878     popover.displayType = function(val) {
52879       if (arguments.length) {
52880         _displayType = utilFunctor(val);
52881         return popover;
52882       } else {
52883         return _displayType;
52884       }
52885     };
52886     popover.hasArrow = function(val) {
52887       if (arguments.length) {
52888         _hasArrow = utilFunctor(val);
52889         return popover;
52890       } else {
52891         return _hasArrow;
52892       }
52893     };
52894     popover.placement = function(val) {
52895       if (arguments.length) {
52896         _placement = utilFunctor(val);
52897         return popover;
52898       } else {
52899         return _placement;
52900       }
52901     };
52902     popover.alignment = function(val) {
52903       if (arguments.length) {
52904         _alignment = utilFunctor(val);
52905         return popover;
52906       } else {
52907         return _alignment;
52908       }
52909     };
52910     popover.scrollContainer = function(val) {
52911       if (arguments.length) {
52912         _scrollContainer = utilFunctor(val);
52913         return popover;
52914       } else {
52915         return _scrollContainer;
52916       }
52917     };
52918     popover.content = function(val) {
52919       if (arguments.length) {
52920         _content = val;
52921         return popover;
52922       } else {
52923         return _content;
52924       }
52925     };
52926     popover.isShown = function() {
52927       var popoverSelection = _anchorSelection.select(".popover-" + _id);
52928       return !popoverSelection.empty() && popoverSelection.classed("in");
52929     };
52930     popover.show = function() {
52931       _anchorSelection.each(show);
52932     };
52933     popover.updateContent = function() {
52934       _anchorSelection.each(updateContent);
52935     };
52936     popover.hide = function() {
52937       _anchorSelection.each(hide);
52938     };
52939     popover.toggle = function() {
52940       _anchorSelection.each(toggle);
52941     };
52942     popover.destroy = function(selection2, selector) {
52943       selector = selector || ".popover-" + _id;
52944       selection2.on(_pointerPrefix + "enter.popover", null).on(_pointerPrefix + "leave.popover", null).on(_pointerPrefix + "up.popover", null).on(_pointerPrefix + "down.popover", null).on("click.popover", null).attr("title", function() {
52945         return this.getAttribute("data-original-title") || this.getAttribute("title");
52946       }).attr("data-original-title", null).selectAll(selector).remove();
52947     };
52948     popover.destroyAny = function(selection2) {
52949       selection2.call(popover.destroy, ".popover");
52950     };
52951     function setup() {
52952       var anchor = select_default2(this);
52953       var animate = _animation.apply(this, arguments);
52954       var popoverSelection = anchor.selectAll(".popover-" + _id).data([0]);
52955       var enter = popoverSelection.enter().append("div").attr("class", "popover popover-" + _id + " " + (klass ? klass : "")).classed("arrowed", _hasArrow.apply(this, arguments));
52956       enter.append("div").attr("class", "popover-arrow");
52957       enter.append("div").attr("class", "popover-inner");
52958       popoverSelection = enter.merge(popoverSelection);
52959       if (animate) {
52960         popoverSelection.classed("fade", true);
52961       }
52962       var display = _displayType.apply(this, arguments);
52963       if (display === "hover") {
52964         var _lastNonMouseEnterTime;
52965         anchor.on(_pointerPrefix + "enter.popover", function(d3_event) {
52966           if (d3_event.pointerType) {
52967             if (d3_event.pointerType !== "mouse") {
52968               _lastNonMouseEnterTime = d3_event.timeStamp;
52969               return;
52970             } else if (_lastNonMouseEnterTime && d3_event.timeStamp - _lastNonMouseEnterTime < 1500) {
52971               return;
52972             }
52973           }
52974           if (d3_event.buttons !== 0)
52975             return;
52976           show.apply(this, arguments);
52977         }).on(_pointerPrefix + "leave.popover", function() {
52978           hide.apply(this, arguments);
52979         }).on("focus.popover", function() {
52980           show.apply(this, arguments);
52981         }).on("blur.popover", function() {
52982           hide.apply(this, arguments);
52983         });
52984       } else if (display === "clickFocus") {
52985         anchor.on(_pointerPrefix + "down.popover", function(d3_event) {
52986           d3_event.preventDefault();
52987           d3_event.stopPropagation();
52988         }).on(_pointerPrefix + "up.popover", function(d3_event) {
52989           d3_event.preventDefault();
52990           d3_event.stopPropagation();
52991         }).on("click.popover", toggle);
52992         popoverSelection.attr("tabindex", 0).on("blur.popover", function() {
52993           anchor.each(function() {
52994             hide.apply(this, arguments);
52995           });
52996         });
52997       }
52998     }
52999     function show() {
53000       var anchor = select_default2(this);
53001       var popoverSelection = anchor.selectAll(".popover-" + _id);
53002       if (popoverSelection.empty()) {
53003         anchor.call(popover.destroy);
53004         anchor.each(setup);
53005         popoverSelection = anchor.selectAll(".popover-" + _id);
53006       }
53007       popoverSelection.classed("in", true);
53008       var displayType = _displayType.apply(this, arguments);
53009       if (displayType === "clickFocus") {
53010         anchor.classed("active", true);
53011         popoverSelection.node().focus();
53012       }
53013       anchor.each(updateContent);
53014     }
53015     function updateContent() {
53016       var anchor = select_default2(this);
53017       if (_content) {
53018         anchor.selectAll(".popover-" + _id + " > .popover-inner").call(_content.apply(this, arguments));
53019       }
53020       updatePosition.apply(this, arguments);
53021       updatePosition.apply(this, arguments);
53022       updatePosition.apply(this, arguments);
53023     }
53024     function updatePosition() {
53025       var anchor = select_default2(this);
53026       var popoverSelection = anchor.selectAll(".popover-" + _id);
53027       var scrollContainer = _scrollContainer && _scrollContainer.apply(this, arguments);
53028       var scrollNode = scrollContainer && !scrollContainer.empty() && scrollContainer.node();
53029       var scrollLeft = scrollNode ? scrollNode.scrollLeft : 0;
53030       var scrollTop = scrollNode ? scrollNode.scrollTop : 0;
53031       var placement = _placement.apply(this, arguments);
53032       popoverSelection.classed("left", false).classed("right", false).classed("top", false).classed("bottom", false).classed(placement, true);
53033       var alignment = _alignment.apply(this, arguments);
53034       var alignFactor = 0.5;
53035       if (alignment === "leading") {
53036         alignFactor = 0;
53037       } else if (alignment === "trailing") {
53038         alignFactor = 1;
53039       }
53040       var anchorFrame = getFrame(anchor.node());
53041       var popoverFrame = getFrame(popoverSelection.node());
53042       var position;
53043       switch (placement) {
53044         case "top":
53045           position = {
53046             x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
53047             y: anchorFrame.y - popoverFrame.h
53048           };
53049           break;
53050         case "bottom":
53051           position = {
53052             x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
53053             y: anchorFrame.y + anchorFrame.h
53054           };
53055           break;
53056         case "left":
53057           position = {
53058             x: anchorFrame.x - popoverFrame.w,
53059             y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
53060           };
53061           break;
53062         case "right":
53063           position = {
53064             x: anchorFrame.x + anchorFrame.w,
53065             y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
53066           };
53067           break;
53068       }
53069       if (position) {
53070         if (scrollNode && (placement === "top" || placement === "bottom")) {
53071           var initialPosX = position.x;
53072           if (position.x + popoverFrame.w > scrollNode.offsetWidth - 10) {
53073             position.x = scrollNode.offsetWidth - 10 - popoverFrame.w;
53074           } else if (position.x < 10) {
53075             position.x = 10;
53076           }
53077           var arrow = anchor.selectAll(".popover-" + _id + " > .popover-arrow");
53078           var arrowPosX = Math.min(Math.max(popoverFrame.w / 2 - (position.x - initialPosX), 10), popoverFrame.w - 10);
53079           arrow.style("left", ~~arrowPosX + "px");
53080         }
53081         popoverSelection.style("left", ~~position.x + "px").style("top", ~~position.y + "px");
53082       } else {
53083         popoverSelection.style("left", null).style("top", null);
53084       }
53085       function getFrame(node) {
53086         var positionStyle = select_default2(node).style("position");
53087         if (positionStyle === "absolute" || positionStyle === "static") {
53088           return {
53089             x: node.offsetLeft - scrollLeft,
53090             y: node.offsetTop - scrollTop,
53091             w: node.offsetWidth,
53092             h: node.offsetHeight
53093           };
53094         } else {
53095           return {
53096             x: 0,
53097             y: 0,
53098             w: node.offsetWidth,
53099             h: node.offsetHeight
53100           };
53101         }
53102       }
53103     }
53104     function hide() {
53105       var anchor = select_default2(this);
53106       if (_displayType.apply(this, arguments) === "clickFocus") {
53107         anchor.classed("active", false);
53108       }
53109       anchor.selectAll(".popover-" + _id).classed("in", false);
53110     }
53111     function toggle() {
53112       if (select_default2(this).select(".popover-" + _id).classed("in")) {
53113         hide.apply(this, arguments);
53114       } else {
53115         show.apply(this, arguments);
53116       }
53117     }
53118     return popover;
53119   }
53120
53121   // modules/ui/tooltip.js
53122   function uiTooltip(klass) {
53123     var tooltip = uiPopover((klass || "") + " tooltip").displayType("hover");
53124     var _title = function() {
53125       var title = this.getAttribute("data-original-title");
53126       if (title) {
53127         return title;
53128       } else {
53129         title = this.getAttribute("title");
53130         this.removeAttribute("title");
53131         this.setAttribute("data-original-title", title);
53132       }
53133       return title;
53134     };
53135     var _heading = utilFunctor(null);
53136     var _keys = utilFunctor(null);
53137     tooltip.title = function(val) {
53138       if (!arguments.length)
53139         return _title;
53140       _title = utilFunctor(val);
53141       return tooltip;
53142     };
53143     tooltip.heading = function(val) {
53144       if (!arguments.length)
53145         return _heading;
53146       _heading = utilFunctor(val);
53147       return tooltip;
53148     };
53149     tooltip.keys = function(val) {
53150       if (!arguments.length)
53151         return _keys;
53152       _keys = utilFunctor(val);
53153       return tooltip;
53154     };
53155     tooltip.content(function() {
53156       var heading = _heading.apply(this, arguments);
53157       var text2 = _title.apply(this, arguments);
53158       var keys = _keys.apply(this, arguments);
53159       var headingCallback = typeof heading === "function" ? heading : (s) => s.text(heading);
53160       var textCallback = typeof text2 === "function" ? text2 : (s) => s.text(text2);
53161       return function(selection2) {
53162         var headingSelect = selection2.selectAll(".tooltip-heading").data(heading ? [heading] : []);
53163         headingSelect.exit().remove();
53164         headingSelect.enter().append("div").attr("class", "tooltip-heading").merge(headingSelect).text("").call(headingCallback);
53165         var textSelect = selection2.selectAll(".tooltip-text").data(text2 ? [text2] : []);
53166         textSelect.exit().remove();
53167         textSelect.enter().append("div").attr("class", "tooltip-text").merge(textSelect).text("").call(textCallback);
53168         var keyhintWrap = selection2.selectAll(".keyhint-wrap").data(keys && keys.length ? [0] : []);
53169         keyhintWrap.exit().remove();
53170         var keyhintWrapEnter = keyhintWrap.enter().append("div").attr("class", "keyhint-wrap");
53171         keyhintWrapEnter.append("span").call(_t.append("tooltip_keyhint"));
53172         keyhintWrap = keyhintWrapEnter.merge(keyhintWrap);
53173         keyhintWrap.selectAll("kbd.shortcut").data(keys && keys.length ? keys : []).enter().append("kbd").attr("class", "shortcut").text(function(d) {
53174           return d;
53175         });
53176       };
53177     });
53178     return tooltip;
53179   }
53180
53181   // modules/ui/edit_menu.js
53182   function uiEditMenu(context) {
53183     var dispatch10 = dispatch_default("toggled");
53184     var _menu = select_default2(null);
53185     var _operations = [];
53186     var _anchorLoc = [0, 0];
53187     var _anchorLocLonLat = [0, 0];
53188     var _triggerType = "";
53189     var _vpTopMargin = 85;
53190     var _vpBottomMargin = 45;
53191     var _vpSideMargin = 35;
53192     var _menuTop = false;
53193     var _menuHeight;
53194     var _menuWidth;
53195     var _verticalPadding = 4;
53196     var _tooltipWidth = 210;
53197     var _menuSideMargin = 10;
53198     var _tooltips = [];
53199     var editMenu = function(selection2) {
53200       var isTouchMenu = _triggerType.includes("touch") || _triggerType.includes("pen");
53201       var ops = _operations.filter(function(op) {
53202         return !isTouchMenu || !op.mouseOnly;
53203       });
53204       if (!ops.length)
53205         return;
53206       _tooltips = [];
53207       _menuTop = isTouchMenu;
53208       var showLabels = isTouchMenu;
53209       var buttonHeight = showLabels ? 32 : 34;
53210       if (showLabels) {
53211         _menuWidth = 52 + Math.min(120, 6 * Math.max.apply(Math, ops.map(function(op) {
53212           return op.title.length;
53213         })));
53214       } else {
53215         _menuWidth = 44;
53216       }
53217       _menuHeight = _verticalPadding * 2 + ops.length * buttonHeight;
53218       _menu = selection2.append("div").attr("class", "edit-menu").classed("touch-menu", isTouchMenu).style("padding", _verticalPadding + "px 0");
53219       var buttons = _menu.selectAll(".edit-menu-item").data(ops);
53220       var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
53221         return "edit-menu-item edit-menu-item-" + d.id;
53222       }).style("height", buttonHeight + "px").on("click", click).on("pointerup", pointerup).on("pointerdown mousedown", function pointerdown(d3_event) {
53223         d3_event.stopPropagation();
53224       }).on("mouseenter.highlight", function(d3_event, d) {
53225         if (!d.relatedEntityIds || select_default2(this).classed("disabled"))
53226           return;
53227         utilHighlightEntities(d.relatedEntityIds(), true, context);
53228       }).on("mouseleave.highlight", function(d3_event, d) {
53229         if (!d.relatedEntityIds)
53230           return;
53231         utilHighlightEntities(d.relatedEntityIds(), false, context);
53232       });
53233       buttonsEnter.each(function(d) {
53234         var tooltip = uiTooltip().heading(() => d.title).title(d.tooltip).keys([d.keys[0]]);
53235         _tooltips.push(tooltip);
53236         select_default2(this).call(tooltip).append("div").attr("class", "icon-wrap").call(svgIcon(d.icon && d.icon() || "#iD-operation-" + d.id, "operation"));
53237       });
53238       if (showLabels) {
53239         buttonsEnter.append("span").attr("class", "label").html(function(d) {
53240           return d.title;
53241         });
53242       }
53243       buttonsEnter.merge(buttons).classed("disabled", function(d) {
53244         return d.disabled();
53245       });
53246       updatePosition();
53247       var initialScale = context.projection.scale();
53248       context.map().on("move.edit-menu", function() {
53249         if (initialScale !== context.projection.scale()) {
53250           editMenu.close();
53251         }
53252       }).on("drawn.edit-menu", function(info) {
53253         if (info.full)
53254           updatePosition();
53255       });
53256       var lastPointerUpType;
53257       function pointerup(d3_event) {
53258         lastPointerUpType = d3_event.pointerType;
53259       }
53260       function click(d3_event, operation) {
53261         d3_event.stopPropagation();
53262         if (operation.relatedEntityIds) {
53263           utilHighlightEntities(operation.relatedEntityIds(), false, context);
53264         }
53265         if (operation.disabled()) {
53266           if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
53267             context.ui().flash.duration(4e3).iconName("#iD-operation-" + operation.id).iconClass("operation disabled").label(operation.tooltip())();
53268           }
53269         } else {
53270           if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
53271             context.ui().flash.duration(2e3).iconName("#iD-operation-" + operation.id).iconClass("operation").label(operation.annotation() || operation.title)();
53272           }
53273           operation();
53274           editMenu.close();
53275         }
53276         lastPointerUpType = null;
53277       }
53278       dispatch10.call("toggled", this, true);
53279     };
53280     function updatePosition() {
53281       if (!_menu || _menu.empty())
53282         return;
53283       var anchorLoc = context.projection(_anchorLocLonLat);
53284       var viewport = context.surfaceRect();
53285       if (anchorLoc[0] < 0 || anchorLoc[0] > viewport.width || anchorLoc[1] < 0 || anchorLoc[1] > viewport.height) {
53286         editMenu.close();
53287         return;
53288       }
53289       var menuLeft = displayOnLeft(viewport);
53290       var offset = [0, 0];
53291       offset[0] = menuLeft ? -1 * (_menuSideMargin + _menuWidth) : _menuSideMargin;
53292       if (_menuTop) {
53293         if (anchorLoc[1] - _menuHeight < _vpTopMargin) {
53294           offset[1] = -anchorLoc[1] + _vpTopMargin;
53295         } else {
53296           offset[1] = -_menuHeight;
53297         }
53298       } else {
53299         if (anchorLoc[1] + _menuHeight > viewport.height - _vpBottomMargin) {
53300           offset[1] = -anchorLoc[1] - _menuHeight + viewport.height - _vpBottomMargin;
53301         } else {
53302           offset[1] = 0;
53303         }
53304       }
53305       var origin = geoVecAdd(anchorLoc, offset);
53306       _menu.style("left", origin[0] + "px").style("top", origin[1] + "px");
53307       var tooltipSide = tooltipPosition(viewport, menuLeft);
53308       _tooltips.forEach(function(tooltip) {
53309         tooltip.placement(tooltipSide);
53310       });
53311       function displayOnLeft(viewport2) {
53312         if (_mainLocalizer.textDirection() === "ltr") {
53313           if (anchorLoc[0] + _menuSideMargin + _menuWidth > viewport2.width - _vpSideMargin) {
53314             return true;
53315           }
53316           return false;
53317         } else {
53318           if (anchorLoc[0] - _menuSideMargin - _menuWidth < _vpSideMargin) {
53319             return false;
53320           }
53321           return true;
53322         }
53323       }
53324       function tooltipPosition(viewport2, menuLeft2) {
53325         if (_mainLocalizer.textDirection() === "ltr") {
53326           if (menuLeft2) {
53327             return "left";
53328           }
53329           if (anchorLoc[0] + _menuSideMargin + _menuWidth + _tooltipWidth > viewport2.width - _vpSideMargin) {
53330             return "left";
53331           }
53332           return "right";
53333         } else {
53334           if (!menuLeft2) {
53335             return "right";
53336           }
53337           if (anchorLoc[0] - _menuSideMargin - _menuWidth - _tooltipWidth < _vpSideMargin) {
53338             return "right";
53339           }
53340           return "left";
53341         }
53342       }
53343     }
53344     editMenu.close = function() {
53345       context.map().on("move.edit-menu", null).on("drawn.edit-menu", null);
53346       _menu.remove();
53347       _tooltips = [];
53348       dispatch10.call("toggled", this, false);
53349     };
53350     editMenu.anchorLoc = function(val) {
53351       if (!arguments.length)
53352         return _anchorLoc;
53353       _anchorLoc = val;
53354       _anchorLocLonLat = context.projection.invert(_anchorLoc);
53355       return editMenu;
53356     };
53357     editMenu.triggerType = function(val) {
53358       if (!arguments.length)
53359         return _triggerType;
53360       _triggerType = val;
53361       return editMenu;
53362     };
53363     editMenu.operations = function(val) {
53364       if (!arguments.length)
53365         return _operations;
53366       _operations = val;
53367       return editMenu;
53368     };
53369     return utilRebind(editMenu, dispatch10, "on");
53370   }
53371
53372   // modules/ui/feature_info.js
53373   function uiFeatureInfo(context) {
53374     function update(selection2) {
53375       var features = context.features();
53376       var stats = features.stats();
53377       var count = 0;
53378       var hiddenList = features.hidden().map(function(k) {
53379         if (stats[k]) {
53380           count += stats[k];
53381           return _t.append("inspector.title_count", {
53382             title: _t("feature." + k + ".description"),
53383             count: stats[k]
53384           });
53385         }
53386         return null;
53387       }).filter(Boolean);
53388       selection2.text("");
53389       if (hiddenList.length) {
53390         var tooltipBehavior = uiTooltip().placement("top").title(function() {
53391           return (selection3) => {
53392             hiddenList.forEach((hiddenFeature) => {
53393               selection3.append("div").call(hiddenFeature);
53394             });
53395           };
53396         });
53397         selection2.append("a").attr("class", "chip").attr("href", "#").call(_t.append("feature_info.hidden_warning", { count })).call(tooltipBehavior).on("click", function(d3_event) {
53398           tooltipBehavior.hide();
53399           d3_event.preventDefault();
53400           context.ui().togglePanes(context.container().select(".map-panes .map-data-pane"));
53401         });
53402       }
53403       selection2.classed("hide", !hiddenList.length);
53404     }
53405     return function(selection2) {
53406       update(selection2);
53407       context.features().on("change.feature_info", function() {
53408         update(selection2);
53409       });
53410     };
53411   }
53412
53413   // modules/ui/flash.js
53414   function uiFlash(context) {
53415     var _flashTimer;
53416     var _duration = 2e3;
53417     var _iconName = "#iD-icon-no";
53418     var _iconClass = "disabled";
53419     var _label = (s) => s.text("");
53420     function flash() {
53421       if (_flashTimer) {
53422         _flashTimer.stop();
53423       }
53424       context.container().select(".main-footer-wrap").classed("footer-hide", true).classed("footer-show", false);
53425       context.container().select(".flash-wrap").classed("footer-hide", false).classed("footer-show", true);
53426       var content = context.container().select(".flash-wrap").selectAll(".flash-content").data([0]);
53427       var contentEnter = content.enter().append("div").attr("class", "flash-content");
53428       var iconEnter = contentEnter.append("svg").attr("class", "flash-icon icon").append("g").attr("transform", "translate(10,10)");
53429       iconEnter.append("circle").attr("r", 9);
53430       iconEnter.append("use").attr("transform", "translate(-7,-7)").attr("width", "14").attr("height", "14");
53431       contentEnter.append("div").attr("class", "flash-text");
53432       content = content.merge(contentEnter);
53433       content.selectAll(".flash-icon").attr("class", "icon flash-icon " + (_iconClass || ""));
53434       content.selectAll(".flash-icon use").attr("xlink:href", _iconName);
53435       content.selectAll(".flash-text").attr("class", "flash-text").call(_label);
53436       _flashTimer = timeout_default(function() {
53437         _flashTimer = null;
53438         context.container().select(".main-footer-wrap").classed("footer-hide", false).classed("footer-show", true);
53439         context.container().select(".flash-wrap").classed("footer-hide", true).classed("footer-show", false);
53440       }, _duration);
53441       return content;
53442     }
53443     flash.duration = function(_) {
53444       if (!arguments.length)
53445         return _duration;
53446       _duration = _;
53447       return flash;
53448     };
53449     flash.label = function(_) {
53450       if (!arguments.length)
53451         return _label;
53452       if (typeof _ !== "function") {
53453         _label = (selection2) => selection2.text(_);
53454       } else {
53455         _label = (selection2) => selection2.text("").call(_);
53456       }
53457       return flash;
53458     };
53459     flash.iconName = function(_) {
53460       if (!arguments.length)
53461         return _iconName;
53462       _iconName = _;
53463       return flash;
53464     };
53465     flash.iconClass = function(_) {
53466       if (!arguments.length)
53467         return _iconClass;
53468       _iconClass = _;
53469       return flash;
53470     };
53471     return flash;
53472   }
53473
53474   // modules/ui/full_screen.js
53475   function uiFullScreen(context) {
53476     var element = context.container().node();
53477     function getFullScreenFn() {
53478       if (element.requestFullscreen) {
53479         return element.requestFullscreen;
53480       } else if (element.msRequestFullscreen) {
53481         return element.msRequestFullscreen;
53482       } else if (element.mozRequestFullScreen) {
53483         return element.mozRequestFullScreen;
53484       } else if (element.webkitRequestFullscreen) {
53485         return element.webkitRequestFullscreen;
53486       }
53487     }
53488     function getExitFullScreenFn() {
53489       if (document.exitFullscreen) {
53490         return document.exitFullscreen;
53491       } else if (document.msExitFullscreen) {
53492         return document.msExitFullscreen;
53493       } else if (document.mozCancelFullScreen) {
53494         return document.mozCancelFullScreen;
53495       } else if (document.webkitExitFullscreen) {
53496         return document.webkitExitFullscreen;
53497       }
53498     }
53499     function isFullScreen() {
53500       return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
53501     }
53502     function isSupported() {
53503       return !!getFullScreenFn();
53504     }
53505     function fullScreen(d3_event) {
53506       d3_event.preventDefault();
53507       if (!isFullScreen()) {
53508         getFullScreenFn().apply(element);
53509       } else {
53510         getExitFullScreenFn().apply(document);
53511       }
53512     }
53513     return function() {
53514       if (!isSupported())
53515         return;
53516       var detected = utilDetect();
53517       var keys = detected.os === "mac" ? [uiCmd("\u2303\u2318F"), "f11"] : ["f11"];
53518       context.keybinding().on(keys, fullScreen);
53519     };
53520   }
53521
53522   // modules/ui/geolocate.js
53523   function uiGeolocate(context) {
53524     var _geolocationOptions = {
53525       // prioritize speed and power usage over precision
53526       enableHighAccuracy: false,
53527       // don't hang indefinitely getting the location
53528       timeout: 6e3
53529       // 6sec
53530     };
53531     var _locating = uiLoading(context).message(_t.html("geolocate.locating")).blocking(true);
53532     var _layer = context.layers().layer("geolocate");
53533     var _position;
53534     var _extent;
53535     var _timeoutID;
53536     var _button = select_default2(null);
53537     function click() {
53538       if (context.inIntro())
53539         return;
53540       if (!_layer.enabled() && !_locating.isShown()) {
53541         _timeoutID = setTimeout(
53542           error,
53543           1e4
53544           /* 10sec */
53545         );
53546         context.container().call(_locating);
53547         navigator.geolocation.getCurrentPosition(success, error, _geolocationOptions);
53548       } else {
53549         _locating.close();
53550         _layer.enabled(null, false);
53551         updateButtonState();
53552       }
53553     }
53554     function zoomTo() {
53555       context.enter(modeBrowse(context));
53556       var map2 = context.map();
53557       _layer.enabled(_position, true);
53558       updateButtonState();
53559       map2.centerZoomEase(_extent.center(), Math.min(20, map2.extentZoom(_extent)));
53560     }
53561     function success(geolocation) {
53562       _position = geolocation;
53563       var coords = _position.coords;
53564       _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
53565       zoomTo();
53566       finish();
53567     }
53568     function error() {
53569       if (_position) {
53570         zoomTo();
53571       } else {
53572         context.ui().flash.label(_t.append("geolocate.location_unavailable")).iconName("#iD-icon-geolocate")();
53573       }
53574       finish();
53575     }
53576     function finish() {
53577       _locating.close();
53578       if (_timeoutID) {
53579         clearTimeout(_timeoutID);
53580       }
53581       _timeoutID = void 0;
53582     }
53583     function updateButtonState() {
53584       _button.classed("active", _layer.enabled());
53585       _button.attr("aria-pressed", _layer.enabled());
53586     }
53587     return function(selection2) {
53588       if (!navigator.geolocation || !navigator.geolocation.getCurrentPosition)
53589         return;
53590       _button = selection2.append("button").on("click", click).attr("aria-pressed", false).call(svgIcon("#iD-icon-geolocate", "light")).call(
53591         uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(() => _t.append("geolocate.title")).keys([_t("geolocate.key")])
53592       );
53593       context.keybinding().on(_t("geolocate.key"), click);
53594     };
53595   }
53596
53597   // modules/ui/panels/background.js
53598   function uiPanelBackground(context) {
53599     var background = context.background();
53600     var _currSourceName = null;
53601     var _metadata = {};
53602     var _metadataKeys = [
53603       "zoom",
53604       "vintage",
53605       "source",
53606       "description",
53607       "resolution",
53608       "accuracy"
53609     ];
53610     var debouncedRedraw = debounce_default(redraw, 250);
53611     function redraw(selection2) {
53612       var source = background.baseLayerSource();
53613       if (!source)
53614         return;
53615       var isDG = source.id.match(/^DigitalGlobe/i) !== null;
53616       var sourceLabel = source.label();
53617       if (_currSourceName !== sourceLabel) {
53618         _currSourceName = sourceLabel;
53619         _metadata = {};
53620       }
53621       selection2.text("");
53622       var list = selection2.append("ul").attr("class", "background-info");
53623       list.append("li").call(_currSourceName);
53624       _metadataKeys.forEach(function(k) {
53625         if (isDG && k === "vintage")
53626           return;
53627         list.append("li").attr("class", "background-info-list-" + k).classed("hide", !_metadata[k]).call(_t.append("info_panels.background." + k, { suffix: ":" })).append("span").attr("class", "background-info-span-" + k).text(_metadata[k]);
53628       });
53629       debouncedGetMetadata(selection2);
53630       var toggleTiles = context.getDebug("tile") ? "hide_tiles" : "show_tiles";
53631       selection2.append("a").call(_t.append("info_panels.background." + toggleTiles)).attr("href", "#").attr("class", "button button-toggle-tiles").on("click", function(d3_event) {
53632         d3_event.preventDefault();
53633         context.setDebug("tile", !context.getDebug("tile"));
53634         selection2.call(redraw);
53635       });
53636       if (isDG) {
53637         var key = source.id + "-vintage";
53638         var sourceVintage = context.background().findSource(key);
53639         var showsVintage = context.background().showsLayer(sourceVintage);
53640         var toggleVintage = showsVintage ? "hide_vintage" : "show_vintage";
53641         selection2.append("a").call(_t.append("info_panels.background." + toggleVintage)).attr("href", "#").attr("class", "button button-toggle-vintage").on("click", function(d3_event) {
53642           d3_event.preventDefault();
53643           context.background().toggleOverlayLayer(sourceVintage);
53644           selection2.call(redraw);
53645         });
53646       }
53647       ["DigitalGlobe-Premium", "DigitalGlobe-Standard"].forEach(function(layerId) {
53648         if (source.id !== layerId) {
53649           var key2 = layerId + "-vintage";
53650           var sourceVintage2 = context.background().findSource(key2);
53651           if (context.background().showsLayer(sourceVintage2)) {
53652             context.background().toggleOverlayLayer(sourceVintage2);
53653           }
53654         }
53655       });
53656     }
53657     var debouncedGetMetadata = debounce_default(getMetadata, 250);
53658     function getMetadata(selection2) {
53659       var tile = context.container().select(".layer-background img.tile-center");
53660       if (tile.empty())
53661         return;
53662       var sourceName = _currSourceName;
53663       var d = tile.datum();
53664       var zoom = d && d.length >= 3 && d[2] || Math.floor(context.map().zoom());
53665       var center = context.map().center();
53666       _metadata.zoom = String(zoom);
53667       selection2.selectAll(".background-info-list-zoom").classed("hide", false).selectAll(".background-info-span-zoom").text(_metadata.zoom);
53668       if (!d || !d.length >= 3)
53669         return;
53670       background.baseLayerSource().getMetadata(center, d, function(err, result) {
53671         if (err || _currSourceName !== sourceName)
53672           return;
53673         var vintage = result.vintage;
53674         _metadata.vintage = vintage && vintage.range || _t("info_panels.background.unknown");
53675         selection2.selectAll(".background-info-list-vintage").classed("hide", false).selectAll(".background-info-span-vintage").text(_metadata.vintage);
53676         _metadataKeys.forEach(function(k) {
53677           if (k === "zoom" || k === "vintage")
53678             return;
53679           var val = result[k];
53680           _metadata[k] = val;
53681           selection2.selectAll(".background-info-list-" + k).classed("hide", !val).selectAll(".background-info-span-" + k).text(val);
53682         });
53683       });
53684     }
53685     var panel = function(selection2) {
53686       selection2.call(redraw);
53687       context.map().on("drawn.info-background", function() {
53688         selection2.call(debouncedRedraw);
53689       }).on("move.info-background", function() {
53690         selection2.call(debouncedGetMetadata);
53691       });
53692     };
53693     panel.off = function() {
53694       context.map().on("drawn.info-background", null).on("move.info-background", null);
53695     };
53696     panel.id = "background";
53697     panel.label = _t.append("info_panels.background.title");
53698     panel.key = _t("info_panels.background.key");
53699     return panel;
53700   }
53701
53702   // modules/ui/panels/history.js
53703   function uiPanelHistory(context) {
53704     var osm;
53705     function displayTimestamp(timestamp) {
53706       if (!timestamp)
53707         return _t("info_panels.history.unknown");
53708       var options2 = {
53709         day: "numeric",
53710         month: "short",
53711         year: "numeric",
53712         hour: "numeric",
53713         minute: "numeric",
53714         second: "numeric"
53715       };
53716       var d = new Date(timestamp);
53717       if (isNaN(d.getTime()))
53718         return _t("info_panels.history.unknown");
53719       return d.toLocaleString(_mainLocalizer.localeCode(), options2);
53720     }
53721     function displayUser(selection2, userName) {
53722       if (!userName) {
53723         selection2.append("span").call(_t.append("info_panels.history.unknown"));
53724         return;
53725       }
53726       selection2.append("span").attr("class", "user-name").text(userName);
53727       var links = selection2.append("div").attr("class", "links");
53728       if (osm) {
53729         links.append("a").attr("class", "user-osm-link").attr("href", osm.userURL(userName)).attr("target", "_blank").call(_t.append("info_panels.history.profile_link"));
53730       }
53731       links.append("a").attr("class", "user-hdyc-link").attr("href", "https://hdyc.neis-one.org/?" + userName).attr("target", "_blank").attr("tabindex", -1).text("HDYC");
53732     }
53733     function displayChangeset(selection2, changeset) {
53734       if (!changeset) {
53735         selection2.append("span").call(_t.append("info_panels.history.unknown"));
53736         return;
53737       }
53738       selection2.append("span").attr("class", "changeset-id").text(changeset);
53739       var links = selection2.append("div").attr("class", "links");
53740       if (osm) {
53741         links.append("a").attr("class", "changeset-osm-link").attr("href", osm.changesetURL(changeset)).attr("target", "_blank").call(_t.append("info_panels.history.changeset_link"));
53742       }
53743       links.append("a").attr("class", "changeset-osmcha-link").attr("href", "https://osmcha.org/changesets/" + changeset).attr("target", "_blank").text("OSMCha");
53744       links.append("a").attr("class", "changeset-achavi-link").attr("href", "https://overpass-api.de/achavi/?changeset=" + changeset).attr("target", "_blank").text("Achavi");
53745     }
53746     function redraw(selection2) {
53747       var selectedNoteID = context.selectedNoteID();
53748       osm = context.connection();
53749       var selected, note, entity;
53750       if (selectedNoteID && osm) {
53751         selected = [_t.html("note.note") + " " + selectedNoteID];
53752         note = osm.getNote(selectedNoteID);
53753       } else {
53754         selected = context.selectedIDs().filter(function(e) {
53755           return context.hasEntity(e);
53756         });
53757         if (selected.length) {
53758           entity = context.entity(selected[0]);
53759         }
53760       }
53761       var singular = selected.length === 1 ? selected[0] : null;
53762       selection2.html("");
53763       if (singular) {
53764         selection2.append("h4").attr("class", "history-heading").html(singular);
53765       } else {
53766         selection2.append("h4").attr("class", "history-heading").call(_t.append("info_panels.selected", { n: selected.length }));
53767       }
53768       if (!singular)
53769         return;
53770       if (entity) {
53771         selection2.call(redrawEntity, entity);
53772       } else if (note) {
53773         selection2.call(redrawNote, note);
53774       }
53775     }
53776     function redrawNote(selection2, note) {
53777       if (!note || note.isNew()) {
53778         selection2.append("div").call(_t.append("info_panels.history.note_no_history"));
53779         return;
53780       }
53781       var list = selection2.append("ul");
53782       list.append("li").call(_t.append("info_panels.history.note_comments", { suffix: ":" })).append("span").text(note.comments.length);
53783       if (note.comments.length) {
53784         list.append("li").call(_t.append("info_panels.history.note_created_date", { suffix: ":" })).append("span").text(displayTimestamp(note.comments[0].date));
53785         list.append("li").call(_t.append("info_panels.history.note_created_user", { suffix: ":" })).call(displayUser, note.comments[0].user);
53786       }
53787       if (osm) {
53788         selection2.append("a").attr("class", "view-history-on-osm").attr("target", "_blank").attr("href", osm.noteURL(note)).call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("info_panels.history.note_link_text"));
53789       }
53790     }
53791     function redrawEntity(selection2, entity) {
53792       if (!entity || entity.isNew()) {
53793         selection2.append("div").call(_t.append("info_panels.history.no_history"));
53794         return;
53795       }
53796       var links = selection2.append("div").attr("class", "links");
53797       if (osm) {
53798         links.append("a").attr("class", "view-history-on-osm").attr("href", osm.historyURL(entity)).attr("target", "_blank").call(_t.append("info_panels.history.history_link"));
53799       }
53800       links.append("a").attr("class", "pewu-history-viewer-link").attr("href", "https://pewu.github.io/osm-history/#/" + entity.type + "/" + entity.osmId()).attr("target", "_blank").attr("tabindex", -1).text("PeWu");
53801       var list = selection2.append("ul");
53802       list.append("li").call(_t.append("info_panels.history.version", { suffix: ":" })).append("span").text(entity.version);
53803       list.append("li").call(_t.append("info_panels.history.last_edit", { suffix: ":" })).append("span").text(displayTimestamp(entity.timestamp));
53804       list.append("li").call(_t.append("info_panels.history.edited_by", { suffix: ":" })).call(displayUser, entity.user);
53805       list.append("li").call(_t.append("info_panels.history.changeset", { suffix: ":" })).call(displayChangeset, entity.changeset);
53806     }
53807     var panel = function(selection2) {
53808       selection2.call(redraw);
53809       context.map().on("drawn.info-history", function() {
53810         selection2.call(redraw);
53811       });
53812       context.on("enter.info-history", function() {
53813         selection2.call(redraw);
53814       });
53815     };
53816     panel.off = function() {
53817       context.map().on("drawn.info-history", null);
53818       context.on("enter.info-history", null);
53819     };
53820     panel.id = "history";
53821     panel.label = _t.append("info_panels.history.title");
53822     panel.key = _t("info_panels.history.key");
53823     return panel;
53824   }
53825
53826   // modules/util/units.js
53827   var OSM_PRECISION = 7;
53828   function displayLength(m, isImperial) {
53829     var d = m * (isImperial ? 3.28084 : 1);
53830     var unit2;
53831     if (isImperial) {
53832       if (d >= 5280) {
53833         d /= 5280;
53834         unit2 = "miles";
53835       } else {
53836         unit2 = "feet";
53837       }
53838     } else {
53839       if (d >= 1e3) {
53840         d /= 1e3;
53841         unit2 = "kilometers";
53842       } else {
53843         unit2 = "meters";
53844       }
53845     }
53846     return _t("units." + unit2, {
53847       quantity: d.toLocaleString(_mainLocalizer.localeCode(), {
53848         maximumSignificantDigits: 4
53849       })
53850     });
53851   }
53852   function displayArea(m2, isImperial) {
53853     var locale2 = _mainLocalizer.localeCode();
53854     var d = m2 * (isImperial ? 10.7639111056 : 1);
53855     var d1, d2, area;
53856     var unit1 = "";
53857     var unit2 = "";
53858     if (isImperial) {
53859       if (d >= 6969600) {
53860         d1 = d / 27878400;
53861         unit1 = "square_miles";
53862       } else {
53863         d1 = d;
53864         unit1 = "square_feet";
53865       }
53866       if (d > 4356 && d < 4356e4) {
53867         d2 = d / 43560;
53868         unit2 = "acres";
53869       }
53870     } else {
53871       if (d >= 25e4) {
53872         d1 = d / 1e6;
53873         unit1 = "square_kilometers";
53874       } else {
53875         d1 = d;
53876         unit1 = "square_meters";
53877       }
53878       if (d > 1e3 && d < 1e7) {
53879         d2 = d / 1e4;
53880         unit2 = "hectares";
53881       }
53882     }
53883     area = _t("units." + unit1, {
53884       quantity: d1.toLocaleString(locale2, {
53885         maximumSignificantDigits: 4
53886       })
53887     });
53888     if (d2) {
53889       return _t("units.area_pair", {
53890         area1: area,
53891         area2: _t("units." + unit2, {
53892           quantity: d2.toLocaleString(locale2, {
53893             maximumSignificantDigits: 2
53894           })
53895         })
53896       });
53897     } else {
53898       return area;
53899     }
53900   }
53901   function wrap(x, min3, max3) {
53902     var d = max3 - min3;
53903     return ((x - min3) % d + d) % d + min3;
53904   }
53905   function clamp2(x, min3, max3) {
53906     return Math.max(min3, Math.min(x, max3));
53907   }
53908   function displayCoordinate(deg, pos, neg) {
53909     var locale2 = _mainLocalizer.localeCode();
53910     var min3 = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
53911     var sec = (min3 - Math.floor(min3)) * 60;
53912     var displayDegrees = _t("units.arcdegrees", {
53913       quantity: Math.floor(Math.abs(deg)).toLocaleString(locale2)
53914     });
53915     var displayCoordinate2;
53916     if (Math.floor(sec) > 0) {
53917       displayCoordinate2 = displayDegrees + _t("units.arcminutes", {
53918         quantity: Math.floor(min3).toLocaleString(locale2)
53919       }) + _t("units.arcseconds", {
53920         quantity: Math.round(sec).toLocaleString(locale2)
53921       });
53922     } else if (Math.floor(min3) > 0) {
53923       displayCoordinate2 = displayDegrees + _t("units.arcminutes", {
53924         quantity: Math.round(min3).toLocaleString(locale2)
53925       });
53926     } else {
53927       displayCoordinate2 = _t("units.arcdegrees", {
53928         quantity: Math.round(Math.abs(deg)).toLocaleString(locale2)
53929       });
53930     }
53931     if (deg === 0) {
53932       return displayCoordinate2;
53933     } else {
53934       return _t("units.coordinate", {
53935         coordinate: displayCoordinate2,
53936         direction: _t("units." + (deg > 0 ? pos : neg))
53937       });
53938     }
53939   }
53940   function dmsCoordinatePair(coord2) {
53941     return _t("units.coordinate_pair", {
53942       latitude: displayCoordinate(clamp2(coord2[1], -90, 90), "north", "south"),
53943       longitude: displayCoordinate(wrap(coord2[0], -180, 180), "east", "west")
53944     });
53945   }
53946   function decimalCoordinatePair(coord2) {
53947     return _t("units.coordinate_pair", {
53948       latitude: clamp2(coord2[1], -90, 90).toFixed(OSM_PRECISION),
53949       longitude: wrap(coord2[0], -180, 180).toFixed(OSM_PRECISION)
53950     });
53951   }
53952
53953   // modules/ui/panels/location.js
53954   function uiPanelLocation(context) {
53955     var currLocation = "";
53956     function redraw(selection2) {
53957       selection2.html("");
53958       var list = selection2.append("ul");
53959       var coord2 = context.map().mouseCoordinates();
53960       if (coord2.some(isNaN)) {
53961         coord2 = context.map().center();
53962       }
53963       list.append("li").text(dmsCoordinatePair(coord2)).append("li").text(decimalCoordinatePair(coord2));
53964       selection2.append("div").attr("class", "location-info").text(currLocation || " ");
53965       debouncedGetLocation(selection2, coord2);
53966     }
53967     var debouncedGetLocation = debounce_default(getLocation, 250);
53968     function getLocation(selection2, coord2) {
53969       if (!services.geocoder) {
53970         currLocation = _t("info_panels.location.unknown_location");
53971         selection2.selectAll(".location-info").text(currLocation);
53972       } else {
53973         services.geocoder.reverse(coord2, function(err, result) {
53974           currLocation = result ? result.display_name : _t("info_panels.location.unknown_location");
53975           selection2.selectAll(".location-info").text(currLocation);
53976         });
53977       }
53978     }
53979     var panel = function(selection2) {
53980       selection2.call(redraw);
53981       context.surface().on(("PointerEvent" in window ? "pointer" : "mouse") + "move.info-location", function() {
53982         selection2.call(redraw);
53983       });
53984     };
53985     panel.off = function() {
53986       context.surface().on(".info-location", null);
53987     };
53988     panel.id = "location";
53989     panel.label = _t.append("info_panels.location.title");
53990     panel.key = _t("info_panels.location.key");
53991     return panel;
53992   }
53993
53994   // modules/ui/panels/measurement.js
53995   function uiPanelMeasurement(context) {
53996     function radiansToMeters(r) {
53997       return r * 63710071809e-4;
53998     }
53999     function steradiansToSqmeters(r) {
54000       return r / (4 * Math.PI) * 510065621724e3;
54001     }
54002     function toLineString(feature3) {
54003       if (feature3.type === "LineString")
54004         return feature3;
54005       var result = { type: "LineString", coordinates: [] };
54006       if (feature3.type === "Polygon") {
54007         result.coordinates = feature3.coordinates[0];
54008       } else if (feature3.type === "MultiPolygon") {
54009         result.coordinates = feature3.coordinates[0][0];
54010       }
54011       return result;
54012     }
54013     var _isImperial = !_mainLocalizer.usesMetric();
54014     function redraw(selection2) {
54015       var graph = context.graph();
54016       var selectedNoteID = context.selectedNoteID();
54017       var osm = services.osm;
54018       var localeCode = _mainLocalizer.localeCode();
54019       var heading;
54020       var center, location, centroid;
54021       var closed, geometry;
54022       var totalNodeCount, length = 0, area = 0, distance;
54023       if (selectedNoteID && osm) {
54024         var note = osm.getNote(selectedNoteID);
54025         heading = _t.html("note.note") + " " + selectedNoteID;
54026         location = note.loc;
54027         geometry = "note";
54028       } else {
54029         var selectedIDs = context.selectedIDs().filter(function(id2) {
54030           return context.hasEntity(id2);
54031         });
54032         var selected = selectedIDs.map(function(id2) {
54033           return context.entity(id2);
54034         });
54035         heading = selected.length === 1 ? selected[0].id : _t.html("info_panels.selected", { n: selected.length });
54036         if (selected.length) {
54037           var extent = geoExtent();
54038           for (var i2 in selected) {
54039             var entity = selected[i2];
54040             extent._extend(entity.extent(graph));
54041             geometry = entity.geometry(graph);
54042             if (geometry === "line" || geometry === "area") {
54043               closed = entity.type === "relation" || entity.isClosed() && !entity.isDegenerate();
54044               var feature3 = entity.asGeoJSON(graph);
54045               length += radiansToMeters(length_default(toLineString(feature3)));
54046               centroid = path_default(context.projection).centroid(entity.asGeoJSON(graph));
54047               centroid = centroid && context.projection.invert(centroid);
54048               if (!centroid || !isFinite(centroid[0]) || !isFinite(centroid[1])) {
54049                 centroid = entity.extent(graph).center();
54050               }
54051               if (closed) {
54052                 area += steradiansToSqmeters(entity.area(graph));
54053               }
54054             }
54055           }
54056           if (selected.length > 1) {
54057             geometry = null;
54058             closed = null;
54059             centroid = null;
54060           }
54061           if (selected.length === 2 && selected[0].type === "node" && selected[1].type === "node") {
54062             distance = geoSphericalDistance(selected[0].loc, selected[1].loc);
54063           }
54064           if (selected.length === 1 && selected[0].type === "node") {
54065             location = selected[0].loc;
54066           } else {
54067             totalNodeCount = utilGetAllNodes(selectedIDs, context.graph()).length;
54068           }
54069           if (!location && !centroid) {
54070             center = extent.center();
54071           }
54072         }
54073       }
54074       selection2.html("");
54075       if (heading) {
54076         selection2.append("h4").attr("class", "measurement-heading").html(heading);
54077       }
54078       var list = selection2.append("ul");
54079       var coordItem;
54080       if (geometry) {
54081         list.append("li").call(_t.append("info_panels.measurement.geometry", { suffix: ":" })).append("span").html(
54082           closed ? _t.html("info_panels.measurement.closed_" + geometry) : _t.html("geometry." + geometry)
54083         );
54084       }
54085       if (totalNodeCount) {
54086         list.append("li").call(_t.append("info_panels.measurement.node_count", { suffix: ":" })).append("span").text(totalNodeCount.toLocaleString(localeCode));
54087       }
54088       if (area) {
54089         list.append("li").call(_t.append("info_panels.measurement.area", { suffix: ":" })).append("span").text(displayArea(area, _isImperial));
54090       }
54091       if (length) {
54092         list.append("li").call(_t.append("info_panels.measurement." + (closed ? "perimeter" : "length"), { suffix: ":" })).append("span").text(displayLength(length, _isImperial));
54093       }
54094       if (typeof distance === "number") {
54095         list.append("li").call(_t.append("info_panels.measurement.distance", { suffix: ":" })).append("span").text(displayLength(distance, _isImperial));
54096       }
54097       if (location) {
54098         coordItem = list.append("li").call(_t.append("info_panels.measurement.location", { suffix: ":" }));
54099         coordItem.append("span").text(dmsCoordinatePair(location));
54100         coordItem.append("span").text(decimalCoordinatePair(location));
54101       }
54102       if (centroid) {
54103         coordItem = list.append("li").call(_t.append("info_panels.measurement.centroid", { suffix: ":" }));
54104         coordItem.append("span").text(dmsCoordinatePair(centroid));
54105         coordItem.append("span").text(decimalCoordinatePair(centroid));
54106       }
54107       if (center) {
54108         coordItem = list.append("li").call(_t.append("info_panels.measurement.center", { suffix: ":" }));
54109         coordItem.append("span").text(dmsCoordinatePair(center));
54110         coordItem.append("span").text(decimalCoordinatePair(center));
54111       }
54112       if (length || area || typeof distance === "number") {
54113         var toggle = _isImperial ? "imperial" : "metric";
54114         selection2.append("a").call(_t.append("info_panels.measurement." + toggle)).attr("href", "#").attr("class", "button button-toggle-units").on("click", function(d3_event) {
54115           d3_event.preventDefault();
54116           _isImperial = !_isImperial;
54117           selection2.call(redraw);
54118         });
54119       }
54120     }
54121     var panel = function(selection2) {
54122       selection2.call(redraw);
54123       context.map().on("drawn.info-measurement", function() {
54124         selection2.call(redraw);
54125       });
54126       context.on("enter.info-measurement", function() {
54127         selection2.call(redraw);
54128       });
54129     };
54130     panel.off = function() {
54131       context.map().on("drawn.info-measurement", null);
54132       context.on("enter.info-measurement", null);
54133     };
54134     panel.id = "measurement";
54135     panel.label = _t.append("info_panels.measurement.title");
54136     panel.key = _t("info_panels.measurement.key");
54137     return panel;
54138   }
54139
54140   // modules/ui/panels/index.js
54141   var uiInfoPanels = {
54142     background: uiPanelBackground,
54143     history: uiPanelHistory,
54144     location: uiPanelLocation,
54145     measurement: uiPanelMeasurement
54146   };
54147
54148   // modules/ui/info.js
54149   function uiInfo(context) {
54150     var ids = Object.keys(uiInfoPanels);
54151     var wasActive = ["measurement"];
54152     var panels = {};
54153     var active = {};
54154     ids.forEach(function(k) {
54155       if (!panels[k]) {
54156         panels[k] = uiInfoPanels[k](context);
54157         active[k] = false;
54158       }
54159     });
54160     function info(selection2) {
54161       function redraw() {
54162         var activeids = ids.filter(function(k) {
54163           return active[k];
54164         }).sort();
54165         var containers = infoPanels.selectAll(".panel-container").data(activeids, function(k) {
54166           return k;
54167         });
54168         containers.exit().style("opacity", 1).transition().duration(200).style("opacity", 0).on("end", function(d) {
54169           select_default2(this).call(panels[d].off).remove();
54170         });
54171         var enter = containers.enter().append("div").attr("class", function(d) {
54172           return "fillD2 panel-container panel-container-" + d;
54173         });
54174         enter.style("opacity", 0).transition().duration(200).style("opacity", 1);
54175         var title = enter.append("div").attr("class", "panel-title fillD2");
54176         title.append("h3").each(function(d) {
54177           return panels[d].label(select_default2(this));
54178         });
54179         title.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function(d3_event, d) {
54180           d3_event.stopImmediatePropagation();
54181           d3_event.preventDefault();
54182           info.toggle(d);
54183         }).call(svgIcon("#iD-icon-close"));
54184         enter.append("div").attr("class", function(d) {
54185           return "panel-content panel-content-" + d;
54186         });
54187         infoPanels.selectAll(".panel-content").each(function(d) {
54188           select_default2(this).call(panels[d]);
54189         });
54190       }
54191       info.toggle = function(which) {
54192         var activeids = ids.filter(function(k) {
54193           return active[k];
54194         });
54195         if (which) {
54196           active[which] = !active[which];
54197           if (activeids.length === 1 && activeids[0] === which) {
54198             wasActive = [which];
54199           }
54200           context.container().select("." + which + "-panel-toggle-item").classed("active", active[which]).select("input").property("checked", active[which]);
54201         } else {
54202           if (activeids.length) {
54203             wasActive = activeids;
54204             activeids.forEach(function(k) {
54205               active[k] = false;
54206             });
54207           } else {
54208             wasActive.forEach(function(k) {
54209               active[k] = true;
54210             });
54211           }
54212         }
54213         redraw();
54214       };
54215       var infoPanels = selection2.selectAll(".info-panels").data([0]);
54216       infoPanels = infoPanels.enter().append("div").attr("class", "info-panels").merge(infoPanels);
54217       redraw();
54218       context.keybinding().on(uiCmd("\u2318" + _t("info_panels.key")), function(d3_event) {
54219         d3_event.stopImmediatePropagation();
54220         d3_event.preventDefault();
54221         info.toggle();
54222       });
54223       ids.forEach(function(k) {
54224         var key = _t("info_panels." + k + ".key", { default: null });
54225         if (!key)
54226           return;
54227         context.keybinding().on(uiCmd("\u2318\u21E7" + key), function(d3_event) {
54228           d3_event.stopImmediatePropagation();
54229           d3_event.preventDefault();
54230           info.toggle(k);
54231         });
54232       });
54233     }
54234     return info;
54235   }
54236
54237   // modules/ui/intro/helper.js
54238   function pointBox(loc, context) {
54239     var rect = context.surfaceRect();
54240     var point2 = context.curtainProjection(loc);
54241     return {
54242       left: point2[0] + rect.left - 40,
54243       top: point2[1] + rect.top - 60,
54244       width: 80,
54245       height: 90
54246     };
54247   }
54248   function pad(locOrBox, padding, context) {
54249     var box;
54250     if (locOrBox instanceof Array) {
54251       var rect = context.surfaceRect();
54252       var point2 = context.curtainProjection(locOrBox);
54253       box = {
54254         left: point2[0] + rect.left,
54255         top: point2[1] + rect.top
54256       };
54257     } else {
54258       box = locOrBox;
54259     }
54260     return {
54261       left: box.left - padding,
54262       top: box.top - padding,
54263       width: (box.width || 0) + 2 * padding,
54264       height: (box.width || 0) + 2 * padding
54265     };
54266   }
54267   function icon(name, svgklass, useklass) {
54268     return '<svg class="icon ' + (svgklass || "") + '"><use xlink:href="' + name + '"' + (useklass ? ' class="' + useklass + '"' : "") + "></use></svg>";
54269   }
54270   var helpStringReplacements;
54271   function helpHtml(id2, replacements) {
54272     if (!helpStringReplacements) {
54273       helpStringReplacements = {
54274         // insert icons corresponding to various UI elements
54275         point_icon: icon("#iD-icon-point", "inline"),
54276         line_icon: icon("#iD-icon-line", "inline"),
54277         area_icon: icon("#iD-icon-area", "inline"),
54278         note_icon: icon("#iD-icon-note", "inline add-note"),
54279         plus: icon("#iD-icon-plus", "inline"),
54280         minus: icon("#iD-icon-minus", "inline"),
54281         layers_icon: icon("#iD-icon-layers", "inline"),
54282         data_icon: icon("#iD-icon-data", "inline"),
54283         inspect: icon("#iD-icon-inspect", "inline"),
54284         help_icon: icon("#iD-icon-help", "inline"),
54285         undo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo", "inline"),
54286         redo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-undo" : "#iD-icon-redo", "inline"),
54287         save_icon: icon("#iD-icon-save", "inline"),
54288         // operation icons
54289         circularize_icon: icon("#iD-operation-circularize", "inline operation"),
54290         continue_icon: icon("#iD-operation-continue", "inline operation"),
54291         copy_icon: icon("#iD-operation-copy", "inline operation"),
54292         delete_icon: icon("#iD-operation-delete", "inline operation"),
54293         disconnect_icon: icon("#iD-operation-disconnect", "inline operation"),
54294         downgrade_icon: icon("#iD-operation-downgrade", "inline operation"),
54295         extract_icon: icon("#iD-operation-extract", "inline operation"),
54296         merge_icon: icon("#iD-operation-merge", "inline operation"),
54297         move_icon: icon("#iD-operation-move", "inline operation"),
54298         orthogonalize_icon: icon("#iD-operation-orthogonalize", "inline operation"),
54299         paste_icon: icon("#iD-operation-paste", "inline operation"),
54300         reflect_long_icon: icon("#iD-operation-reflect-long", "inline operation"),
54301         reflect_short_icon: icon("#iD-operation-reflect-short", "inline operation"),
54302         reverse_icon: icon("#iD-operation-reverse", "inline operation"),
54303         rotate_icon: icon("#iD-operation-rotate", "inline operation"),
54304         split_icon: icon("#iD-operation-split", "inline operation"),
54305         straighten_icon: icon("#iD-operation-straighten", "inline operation"),
54306         // interaction icons
54307         leftclick: icon("#iD-walkthrough-mouse-left", "inline operation"),
54308         rightclick: icon("#iD-walkthrough-mouse-right", "inline operation"),
54309         mousewheel_icon: icon("#iD-walkthrough-mousewheel", "inline operation"),
54310         tap_icon: icon("#iD-walkthrough-tap", "inline operation"),
54311         doubletap_icon: icon("#iD-walkthrough-doubletap", "inline operation"),
54312         longpress_icon: icon("#iD-walkthrough-longpress", "inline operation"),
54313         touchdrag_icon: icon("#iD-walkthrough-touchdrag", "inline operation"),
54314         pinch_icon: icon("#iD-walkthrough-pinch-apart", "inline operation"),
54315         // insert keys; may be localized and platform-dependent
54316         shift: uiCmd.display("\u21E7"),
54317         alt: uiCmd.display("\u2325"),
54318         return: uiCmd.display("\u21B5"),
54319         esc: _t.html("shortcuts.key.esc"),
54320         space: _t.html("shortcuts.key.space"),
54321         add_note_key: _t.html("modes.add_note.key"),
54322         help_key: _t.html("help.key"),
54323         shortcuts_key: _t.html("shortcuts.toggle.key"),
54324         // reference localized UI labels directly so that they'll always match
54325         save: _t.html("save.title"),
54326         undo: _t.html("undo.title"),
54327         redo: _t.html("redo.title"),
54328         upload: _t.html("commit.save"),
54329         point: _t.html("modes.add_point.title"),
54330         line: _t.html("modes.add_line.title"),
54331         area: _t.html("modes.add_area.title"),
54332         note: _t.html("modes.add_note.label"),
54333         circularize: _t.html("operations.circularize.title"),
54334         continue: _t.html("operations.continue.title"),
54335         copy: _t.html("operations.copy.title"),
54336         delete: _t.html("operations.delete.title"),
54337         disconnect: _t.html("operations.disconnect.title"),
54338         downgrade: _t.html("operations.downgrade.title"),
54339         extract: _t.html("operations.extract.title"),
54340         merge: _t.html("operations.merge.title"),
54341         move: _t.html("operations.move.title"),
54342         orthogonalize: _t.html("operations.orthogonalize.title"),
54343         paste: _t.html("operations.paste.title"),
54344         reflect_long: _t.html("operations.reflect.title.long"),
54345         reflect_short: _t.html("operations.reflect.title.short"),
54346         reverse: _t.html("operations.reverse.title"),
54347         rotate: _t.html("operations.rotate.title"),
54348         split: _t.html("operations.split.title"),
54349         straighten: _t.html("operations.straighten.title"),
54350         map_data: _t.html("map_data.title"),
54351         osm_notes: _t.html("map_data.layers.notes.title"),
54352         fields: _t.html("inspector.fields"),
54353         tags: _t.html("inspector.tags"),
54354         relations: _t.html("inspector.relations"),
54355         new_relation: _t.html("inspector.new_relation"),
54356         turn_restrictions: _t.html("_tagging.presets.fields.restrictions.label"),
54357         background_settings: _t.html("background.description"),
54358         imagery_offset: _t.html("background.fix_misalignment"),
54359         start_the_walkthrough: _t.html("splash.walkthrough"),
54360         help: _t.html("help.title"),
54361         ok: _t.html("intro.ok")
54362       };
54363       for (var key in helpStringReplacements) {
54364         helpStringReplacements[key] = { html: helpStringReplacements[key] };
54365       }
54366     }
54367     var reps;
54368     if (replacements) {
54369       reps = Object.assign(replacements, helpStringReplacements);
54370     } else {
54371       reps = helpStringReplacements;
54372     }
54373     return _t.html(id2, reps).replace(/\`(.*?)\`/g, "<kbd>$1</kbd>");
54374   }
54375   function slugify(text2) {
54376     return text2.toString().toLowerCase().replace(/\s+/g, "-").replace(/[^\w\-]+/g, "").replace(/\-\-+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
54377   }
54378   var missingStrings = {};
54379   function checkKey(key, text2) {
54380     if (_t(key, { default: void 0 }) === void 0) {
54381       if (missingStrings.hasOwnProperty(key))
54382         return;
54383       missingStrings[key] = text2;
54384       var missing = key + ": " + text2;
54385       if (typeof console !== "undefined")
54386         console.log(missing);
54387     }
54388   }
54389   function localize(obj) {
54390     var key;
54391     var name = obj.tags && obj.tags.name;
54392     if (name) {
54393       key = "intro.graph.name." + slugify(name);
54394       obj.tags.name = _t(key, { default: name });
54395       checkKey(key, name);
54396     }
54397     var street = obj.tags && obj.tags["addr:street"];
54398     if (street) {
54399       key = "intro.graph.name." + slugify(street);
54400       obj.tags["addr:street"] = _t(key, { default: street });
54401       checkKey(key, street);
54402       var addrTags = [
54403         "block_number",
54404         "city",
54405         "county",
54406         "district",
54407         "hamlet",
54408         "neighbourhood",
54409         "postcode",
54410         "province",
54411         "quarter",
54412         "state",
54413         "subdistrict",
54414         "suburb"
54415       ];
54416       addrTags.forEach(function(k) {
54417         var key2 = "intro.graph." + k;
54418         var tag = "addr:" + k;
54419         var val = obj.tags && obj.tags[tag];
54420         var str2 = _t(key2, { default: val });
54421         if (str2) {
54422           if (str2.match(/^<.*>$/) !== null) {
54423             delete obj.tags[tag];
54424           } else {
54425             obj.tags[tag] = str2;
54426           }
54427         }
54428       });
54429     }
54430     return obj;
54431   }
54432   function isMostlySquare(points) {
54433     var threshold = 15;
54434     var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);
54435     var upperBound = Math.cos(threshold * Math.PI / 180);
54436     for (var i2 = 0; i2 < points.length; i2++) {
54437       var a = points[(i2 - 1 + points.length) % points.length];
54438       var origin = points[i2];
54439       var b = points[(i2 + 1) % points.length];
54440       var dotp = geoVecNormalizedDot(a, b, origin);
54441       var mag = Math.abs(dotp);
54442       if (mag > lowerBound && mag < upperBound) {
54443         return false;
54444       }
54445     }
54446     return true;
54447   }
54448   function selectMenuItem(context, operation) {
54449     return context.container().select(".edit-menu .edit-menu-item-" + operation);
54450   }
54451   function transitionTime(point1, point2) {
54452     var distance = geoSphericalDistance(point1, point2);
54453     if (distance === 0) {
54454       return 0;
54455     } else if (distance < 80) {
54456       return 500;
54457     } else {
54458       return 1e3;
54459     }
54460   }
54461
54462   // modules/ui/toggle.js
54463   function uiToggle(show, callback) {
54464     return function(selection2) {
54465       selection2.style("opacity", show ? 0 : 1).classed("hide", false).transition().style("opacity", show ? 1 : 0).on("end", function() {
54466         select_default2(this).classed("hide", !show).style("opacity", null);
54467         if (callback)
54468           callback.apply(this);
54469       });
54470     };
54471   }
54472
54473   // modules/ui/curtain.js
54474   function uiCurtain(containerNode) {
54475     var surface = select_default2(null), tooltip = select_default2(null), darkness = select_default2(null);
54476     function curtain(selection2) {
54477       surface = selection2.append("svg").attr("class", "curtain").style("top", 0).style("left", 0);
54478       darkness = surface.append("path").attr("x", 0).attr("y", 0).attr("class", "curtain-darkness");
54479       select_default2(window).on("resize.curtain", resize);
54480       tooltip = selection2.append("div").attr("class", "tooltip");
54481       tooltip.append("div").attr("class", "popover-arrow");
54482       tooltip.append("div").attr("class", "popover-inner");
54483       resize();
54484       function resize() {
54485         surface.attr("width", containerNode.clientWidth).attr("height", containerNode.clientHeight);
54486         curtain.cut(darkness.datum());
54487       }
54488     }
54489     curtain.reveal = function(box, html2, options2) {
54490       options2 = options2 || {};
54491       if (typeof box === "string") {
54492         box = select_default2(box).node();
54493       }
54494       if (box && box.getBoundingClientRect) {
54495         box = copyBox(box.getBoundingClientRect());
54496         var containerRect = containerNode.getBoundingClientRect();
54497         box.top -= containerRect.top;
54498         box.left -= containerRect.left;
54499       }
54500       if (box && options2.padding) {
54501         box.top -= options2.padding;
54502         box.left -= options2.padding;
54503         box.bottom += options2.padding;
54504         box.right += options2.padding;
54505         box.height += options2.padding * 2;
54506         box.width += options2.padding * 2;
54507       }
54508       var tooltipBox;
54509       if (options2.tooltipBox) {
54510         tooltipBox = options2.tooltipBox;
54511         if (typeof tooltipBox === "string") {
54512           tooltipBox = select_default2(tooltipBox).node();
54513         }
54514         if (tooltipBox && tooltipBox.getBoundingClientRect) {
54515           tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
54516         }
54517       } else {
54518         tooltipBox = box;
54519       }
54520       if (tooltipBox && html2) {
54521         if (html2.indexOf("**") !== -1) {
54522           if (html2.indexOf("<span") === 0) {
54523             html2 = html2.replace(/^(<span.*?>)(.+?)(\*\*)/, "$1<span>$2</span>$3");
54524           } else {
54525             html2 = html2.replace(/^(.+?)(\*\*)/, "<span>$1</span>$2");
54526           }
54527           html2 = html2.replace(/\*\*(.*?)\*\*/g, '<span class="instruction">$1</span>');
54528         }
54529         html2 = html2.replace(/\*(.*?)\*/g, "<em>$1</em>");
54530         html2 = html2.replace(/\{br\}/g, "<br/><br/>");
54531         if (options2.buttonText && options2.buttonCallback) {
54532           html2 += '<div class="button-section"><button href="#" class="button action">' + options2.buttonText + "</button></div>";
54533         }
54534         var classes = "curtain-tooltip popover tooltip arrowed in " + (options2.tooltipClass || "");
54535         tooltip.classed(classes, true).selectAll(".popover-inner").html(html2);
54536         if (options2.buttonText && options2.buttonCallback) {
54537           var button = tooltip.selectAll(".button-section .button.action");
54538           button.on("click", function(d3_event) {
54539             d3_event.preventDefault();
54540             options2.buttonCallback();
54541           });
54542         }
54543         var tip = copyBox(tooltip.node().getBoundingClientRect()), w = containerNode.clientWidth, h = containerNode.clientHeight, tooltipWidth = 200, tooltipArrow = 5, side, pos;
54544         if (options2.tooltipClass === "intro-mouse") {
54545           tip.height += 80;
54546         }
54547         if (tooltipBox.top + tooltipBox.height > h) {
54548           tooltipBox.height -= tooltipBox.top + tooltipBox.height - h;
54549         }
54550         if (tooltipBox.left + tooltipBox.width > w) {
54551           tooltipBox.width -= tooltipBox.left + tooltipBox.width - w;
54552         }
54553         if (tooltipBox.top + tooltipBox.height < 100) {
54554           side = "bottom";
54555           pos = [
54556             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
54557             tooltipBox.top + tooltipBox.height
54558           ];
54559         } else if (tooltipBox.top > h - 140) {
54560           side = "top";
54561           pos = [
54562             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
54563             tooltipBox.top - tip.height
54564           ];
54565         } else {
54566           var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
54567           if (_mainLocalizer.textDirection() === "rtl") {
54568             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
54569               side = "right";
54570               pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
54571             } else {
54572               side = "left";
54573               pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
54574             }
54575           } else {
54576             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
54577               side = "left";
54578               pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
54579             } else {
54580               side = "right";
54581               pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
54582             }
54583           }
54584         }
54585         if (options2.duration !== 0 || !tooltip.classed(side)) {
54586           tooltip.call(uiToggle(true));
54587         }
54588         tooltip.style("top", pos[1] + "px").style("left", pos[0] + "px").attr("class", classes + " " + side);
54589         var shiftY = 0;
54590         if (side === "left" || side === "right") {
54591           if (pos[1] < 60) {
54592             shiftY = 60 - pos[1];
54593           } else if (pos[1] + tip.height > h - 100) {
54594             shiftY = h - pos[1] - tip.height - 100;
54595           }
54596         }
54597         tooltip.selectAll(".popover-inner").style("top", shiftY + "px");
54598       } else {
54599         tooltip.classed("in", false).call(uiToggle(false));
54600       }
54601       curtain.cut(box, options2.duration);
54602       return tooltip;
54603     };
54604     curtain.cut = function(datum2, duration) {
54605       darkness.datum(datum2).interrupt();
54606       var selection2;
54607       if (duration === 0) {
54608         selection2 = darkness;
54609       } else {
54610         selection2 = darkness.transition().duration(duration || 600).ease(linear2);
54611       }
54612       selection2.attr("d", function(d) {
54613         var containerWidth = containerNode.clientWidth;
54614         var containerHeight = containerNode.clientHeight;
54615         var string = "M 0,0 L 0," + containerHeight + " L " + containerWidth + "," + containerHeight + "L" + containerWidth + ",0 Z";
54616         if (!d)
54617           return string;
54618         return string + "M" + d.left + "," + d.top + "L" + d.left + "," + (d.top + d.height) + "L" + (d.left + d.width) + "," + (d.top + d.height) + "L" + (d.left + d.width) + "," + d.top + "Z";
54619       });
54620     };
54621     curtain.remove = function() {
54622       surface.remove();
54623       tooltip.remove();
54624       select_default2(window).on("resize.curtain", null);
54625     };
54626     function copyBox(src) {
54627       return {
54628         top: src.top,
54629         right: src.right,
54630         bottom: src.bottom,
54631         left: src.left,
54632         width: src.width,
54633         height: src.height
54634       };
54635     }
54636     return curtain;
54637   }
54638
54639   // modules/ui/intro/welcome.js
54640   function uiIntroWelcome(context, reveal) {
54641     var dispatch10 = dispatch_default("done");
54642     var chapter = {
54643       title: "intro.welcome.title"
54644     };
54645     function welcome() {
54646       context.map().centerZoom([-85.63591, 41.94285], 19);
54647       reveal(
54648         ".intro-nav-wrap .chapter-welcome",
54649         helpHtml("intro.welcome.welcome"),
54650         { buttonText: _t.html("intro.ok"), buttonCallback: practice }
54651       );
54652     }
54653     function practice() {
54654       reveal(
54655         ".intro-nav-wrap .chapter-welcome",
54656         helpHtml("intro.welcome.practice"),
54657         { buttonText: _t.html("intro.ok"), buttonCallback: words }
54658       );
54659     }
54660     function words() {
54661       reveal(
54662         ".intro-nav-wrap .chapter-welcome",
54663         helpHtml("intro.welcome.words"),
54664         { buttonText: _t.html("intro.ok"), buttonCallback: chapters }
54665       );
54666     }
54667     function chapters() {
54668       dispatch10.call("done");
54669       reveal(
54670         ".intro-nav-wrap .chapter-navigation",
54671         helpHtml("intro.welcome.chapters", { next: _t("intro.navigation.title") })
54672       );
54673     }
54674     chapter.enter = function() {
54675       welcome();
54676     };
54677     chapter.exit = function() {
54678       context.container().select(".curtain-tooltip.intro-mouse").selectAll(".counter").remove();
54679     };
54680     chapter.restart = function() {
54681       chapter.exit();
54682       chapter.enter();
54683     };
54684     return utilRebind(chapter, dispatch10, "on");
54685   }
54686
54687   // modules/ui/intro/navigation.js
54688   function uiIntroNavigation(context, reveal) {
54689     var dispatch10 = dispatch_default("done");
54690     var timeouts = [];
54691     var hallId = "n2061";
54692     var townHall = [-85.63591, 41.94285];
54693     var springStreetId = "w397";
54694     var springStreetEndId = "n1834";
54695     var springStreet = [-85.63582, 41.94255];
54696     var onewayField = _mainPresetIndex.field("oneway");
54697     var maxspeedField = _mainPresetIndex.field("maxspeed");
54698     var chapter = {
54699       title: "intro.navigation.title"
54700     };
54701     function timeout2(f2, t) {
54702       timeouts.push(window.setTimeout(f2, t));
54703     }
54704     function eventCancel(d3_event) {
54705       d3_event.stopPropagation();
54706       d3_event.preventDefault();
54707     }
54708     function isTownHallSelected() {
54709       var ids = context.selectedIDs();
54710       return ids.length === 1 && ids[0] === hallId;
54711     }
54712     function dragMap() {
54713       context.enter(modeBrowse(context));
54714       context.history().reset("initial");
54715       var msec = transitionTime(townHall, context.map().center());
54716       if (msec) {
54717         reveal(null, null, { duration: 0 });
54718       }
54719       context.map().centerZoomEase(townHall, 19, msec);
54720       timeout2(function() {
54721         var centerStart = context.map().center();
54722         var textId = context.lastPointerType() === "mouse" ? "drag" : "drag_touch";
54723         var dragString = helpHtml("intro.navigation.map_info") + "{br}" + helpHtml("intro.navigation." + textId);
54724         reveal(".surface", dragString);
54725         context.map().on("drawn.intro", function() {
54726           reveal(".surface", dragString, { duration: 0 });
54727         });
54728         context.map().on("move.intro", function() {
54729           var centerNow = context.map().center();
54730           if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
54731             context.map().on("move.intro", null);
54732             timeout2(function() {
54733               continueTo(zoomMap);
54734             }, 3e3);
54735           }
54736         });
54737       }, msec + 100);
54738       function continueTo(nextStep) {
54739         context.map().on("move.intro drawn.intro", null);
54740         nextStep();
54741       }
54742     }
54743     function zoomMap() {
54744       var zoomStart = context.map().zoom();
54745       var textId = context.lastPointerType() === "mouse" ? "zoom" : "zoom_touch";
54746       var zoomString = helpHtml("intro.navigation." + textId);
54747       reveal(".surface", zoomString);
54748       context.map().on("drawn.intro", function() {
54749         reveal(".surface", zoomString, { duration: 0 });
54750       });
54751       context.map().on("move.intro", function() {
54752         if (context.map().zoom() !== zoomStart) {
54753           context.map().on("move.intro", null);
54754           timeout2(function() {
54755             continueTo(features);
54756           }, 3e3);
54757         }
54758       });
54759       function continueTo(nextStep) {
54760         context.map().on("move.intro drawn.intro", null);
54761         nextStep();
54762       }
54763     }
54764     function features() {
54765       var onClick = function() {
54766         continueTo(pointsLinesAreas);
54767       };
54768       reveal(
54769         ".surface",
54770         helpHtml("intro.navigation.features"),
54771         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54772       );
54773       context.map().on("drawn.intro", function() {
54774         reveal(
54775           ".surface",
54776           helpHtml("intro.navigation.features"),
54777           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54778         );
54779       });
54780       function continueTo(nextStep) {
54781         context.map().on("drawn.intro", null);
54782         nextStep();
54783       }
54784     }
54785     function pointsLinesAreas() {
54786       var onClick = function() {
54787         continueTo(nodesWays);
54788       };
54789       reveal(
54790         ".surface",
54791         helpHtml("intro.navigation.points_lines_areas"),
54792         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54793       );
54794       context.map().on("drawn.intro", function() {
54795         reveal(
54796           ".surface",
54797           helpHtml("intro.navigation.points_lines_areas"),
54798           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54799         );
54800       });
54801       function continueTo(nextStep) {
54802         context.map().on("drawn.intro", null);
54803         nextStep();
54804       }
54805     }
54806     function nodesWays() {
54807       var onClick = function() {
54808         continueTo(clickTownHall);
54809       };
54810       reveal(
54811         ".surface",
54812         helpHtml("intro.navigation.nodes_ways"),
54813         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54814       );
54815       context.map().on("drawn.intro", function() {
54816         reveal(
54817           ".surface",
54818           helpHtml("intro.navigation.nodes_ways"),
54819           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54820         );
54821       });
54822       function continueTo(nextStep) {
54823         context.map().on("drawn.intro", null);
54824         nextStep();
54825       }
54826     }
54827     function clickTownHall() {
54828       context.enter(modeBrowse(context));
54829       context.history().reset("initial");
54830       var entity = context.hasEntity(hallId);
54831       if (!entity)
54832         return;
54833       reveal(null, null, { duration: 0 });
54834       context.map().centerZoomEase(entity.loc, 19, 500);
54835       timeout2(function() {
54836         var entity2 = context.hasEntity(hallId);
54837         if (!entity2)
54838           return;
54839         var box = pointBox(entity2.loc, context);
54840         var textId = context.lastPointerType() === "mouse" ? "click_townhall" : "tap_townhall";
54841         reveal(box, helpHtml("intro.navigation." + textId));
54842         context.map().on("move.intro drawn.intro", function() {
54843           var entity3 = context.hasEntity(hallId);
54844           if (!entity3)
54845             return;
54846           var box2 = pointBox(entity3.loc, context);
54847           reveal(box2, helpHtml("intro.navigation." + textId), { duration: 0 });
54848         });
54849         context.on("enter.intro", function() {
54850           if (isTownHallSelected())
54851             continueTo(selectedTownHall);
54852         });
54853       }, 550);
54854       context.history().on("change.intro", function() {
54855         if (!context.hasEntity(hallId)) {
54856           continueTo(clickTownHall);
54857         }
54858       });
54859       function continueTo(nextStep) {
54860         context.on("enter.intro", null);
54861         context.map().on("move.intro drawn.intro", null);
54862         context.history().on("change.intro", null);
54863         nextStep();
54864       }
54865     }
54866     function selectedTownHall() {
54867       if (!isTownHallSelected())
54868         return clickTownHall();
54869       var entity = context.hasEntity(hallId);
54870       if (!entity)
54871         return clickTownHall();
54872       var box = pointBox(entity.loc, context);
54873       var onClick = function() {
54874         continueTo(editorTownHall);
54875       };
54876       reveal(
54877         box,
54878         helpHtml("intro.navigation.selected_townhall"),
54879         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54880       );
54881       context.map().on("move.intro drawn.intro", function() {
54882         var entity2 = context.hasEntity(hallId);
54883         if (!entity2)
54884           return;
54885         var box2 = pointBox(entity2.loc, context);
54886         reveal(
54887           box2,
54888           helpHtml("intro.navigation.selected_townhall"),
54889           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54890         );
54891       });
54892       context.history().on("change.intro", function() {
54893         if (!context.hasEntity(hallId)) {
54894           continueTo(clickTownHall);
54895         }
54896       });
54897       function continueTo(nextStep) {
54898         context.map().on("move.intro drawn.intro", null);
54899         context.history().on("change.intro", null);
54900         nextStep();
54901       }
54902     }
54903     function editorTownHall() {
54904       if (!isTownHallSelected())
54905         return clickTownHall();
54906       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
54907       var onClick = function() {
54908         continueTo(presetTownHall);
54909       };
54910       reveal(
54911         ".entity-editor-pane",
54912         helpHtml("intro.navigation.editor_townhall"),
54913         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54914       );
54915       context.on("exit.intro", function() {
54916         continueTo(clickTownHall);
54917       });
54918       context.history().on("change.intro", function() {
54919         if (!context.hasEntity(hallId)) {
54920           continueTo(clickTownHall);
54921         }
54922       });
54923       function continueTo(nextStep) {
54924         context.on("exit.intro", null);
54925         context.history().on("change.intro", null);
54926         context.container().select(".inspector-wrap").on("wheel.intro", null);
54927         nextStep();
54928       }
54929     }
54930     function presetTownHall() {
54931       if (!isTownHallSelected())
54932         return clickTownHall();
54933       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
54934       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
54935       var entity = context.entity(context.selectedIDs()[0]);
54936       var preset = _mainPresetIndex.match(entity, context.graph());
54937       var onClick = function() {
54938         continueTo(fieldsTownHall);
54939       };
54940       reveal(
54941         ".entity-editor-pane .section-feature-type",
54942         helpHtml("intro.navigation.preset_townhall", { preset: preset.name() }),
54943         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54944       );
54945       context.on("exit.intro", function() {
54946         continueTo(clickTownHall);
54947       });
54948       context.history().on("change.intro", function() {
54949         if (!context.hasEntity(hallId)) {
54950           continueTo(clickTownHall);
54951         }
54952       });
54953       function continueTo(nextStep) {
54954         context.on("exit.intro", null);
54955         context.history().on("change.intro", null);
54956         context.container().select(".inspector-wrap").on("wheel.intro", null);
54957         nextStep();
54958       }
54959     }
54960     function fieldsTownHall() {
54961       if (!isTownHallSelected())
54962         return clickTownHall();
54963       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
54964       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
54965       var onClick = function() {
54966         continueTo(closeTownHall);
54967       };
54968       reveal(
54969         ".entity-editor-pane .section-preset-fields",
54970         helpHtml("intro.navigation.fields_townhall"),
54971         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
54972       );
54973       context.on("exit.intro", function() {
54974         continueTo(clickTownHall);
54975       });
54976       context.history().on("change.intro", function() {
54977         if (!context.hasEntity(hallId)) {
54978           continueTo(clickTownHall);
54979         }
54980       });
54981       function continueTo(nextStep) {
54982         context.on("exit.intro", null);
54983         context.history().on("change.intro", null);
54984         context.container().select(".inspector-wrap").on("wheel.intro", null);
54985         nextStep();
54986       }
54987     }
54988     function closeTownHall() {
54989       if (!isTownHallSelected())
54990         return clickTownHall();
54991       var selector = ".entity-editor-pane button.close svg use";
54992       var href = select_default2(selector).attr("href") || "#iD-icon-close";
54993       reveal(
54994         ".entity-editor-pane",
54995         helpHtml("intro.navigation.close_townhall", { button: { html: icon(href, "inline") } })
54996       );
54997       context.on("exit.intro", function() {
54998         continueTo(searchStreet);
54999       });
55000       context.history().on("change.intro", function() {
55001         var selector2 = ".entity-editor-pane button.close svg use";
55002         var href2 = select_default2(selector2).attr("href") || "#iD-icon-close";
55003         reveal(
55004           ".entity-editor-pane",
55005           helpHtml("intro.navigation.close_townhall", { button: { html: icon(href2, "inline") } }),
55006           { duration: 0 }
55007         );
55008       });
55009       function continueTo(nextStep) {
55010         context.on("exit.intro", null);
55011         context.history().on("change.intro", null);
55012         nextStep();
55013       }
55014     }
55015     function searchStreet() {
55016       context.enter(modeBrowse(context));
55017       context.history().reset("initial");
55018       var msec = transitionTime(springStreet, context.map().center());
55019       if (msec) {
55020         reveal(null, null, { duration: 0 });
55021       }
55022       context.map().centerZoomEase(springStreet, 19, msec);
55023       timeout2(function() {
55024         reveal(
55025           ".search-header input",
55026           helpHtml("intro.navigation.search_street", { name: _t("intro.graph.name.spring-street") })
55027         );
55028         context.container().select(".search-header input").on("keyup.intro", checkSearchResult);
55029       }, msec + 100);
55030     }
55031     function checkSearchResult() {
55032       var first = context.container().select(".feature-list-item:nth-child(0n+2)");
55033       var firstName = first.select(".entity-name");
55034       var name = _t("intro.graph.name.spring-street");
55035       if (!firstName.empty() && firstName.html() === name) {
55036         reveal(
55037           first.node(),
55038           helpHtml("intro.navigation.choose_street", { name }),
55039           { duration: 300 }
55040         );
55041         context.on("exit.intro", function() {
55042           continueTo(selectedStreet);
55043         });
55044         context.container().select(".search-header input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
55045       }
55046       function continueTo(nextStep) {
55047         context.on("exit.intro", null);
55048         context.container().select(".search-header input").on("keydown.intro", null).on("keyup.intro", null);
55049         nextStep();
55050       }
55051     }
55052     function selectedStreet() {
55053       if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
55054         return searchStreet();
55055       }
55056       var onClick = function() {
55057         continueTo(editorStreet);
55058       };
55059       var entity = context.entity(springStreetEndId);
55060       var box = pointBox(entity.loc, context);
55061       box.height = 500;
55062       reveal(
55063         box,
55064         helpHtml("intro.navigation.selected_street", { name: _t("intro.graph.name.spring-street") }),
55065         { duration: 600, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55066       );
55067       timeout2(function() {
55068         context.map().on("move.intro drawn.intro", function() {
55069           var entity2 = context.hasEntity(springStreetEndId);
55070           if (!entity2)
55071             return;
55072           var box2 = pointBox(entity2.loc, context);
55073           box2.height = 500;
55074           reveal(
55075             box2,
55076             helpHtml("intro.navigation.selected_street", { name: _t("intro.graph.name.spring-street") }),
55077             { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55078           );
55079         });
55080       }, 600);
55081       context.on("enter.intro", function(mode) {
55082         if (!context.hasEntity(springStreetId)) {
55083           return continueTo(searchStreet);
55084         }
55085         var ids = context.selectedIDs();
55086         if (mode.id !== "select" || !ids.length || ids[0] !== springStreetId) {
55087           context.enter(modeSelect(context, [springStreetId]));
55088         }
55089       });
55090       context.history().on("change.intro", function() {
55091         if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
55092           timeout2(function() {
55093             continueTo(searchStreet);
55094           }, 300);
55095         }
55096       });
55097       function continueTo(nextStep) {
55098         context.map().on("move.intro drawn.intro", null);
55099         context.on("enter.intro", null);
55100         context.history().on("change.intro", null);
55101         nextStep();
55102       }
55103     }
55104     function editorStreet() {
55105       var selector = ".entity-editor-pane button.close svg use";
55106       var href = select_default2(selector).attr("href") || "#iD-icon-close";
55107       reveal(".entity-editor-pane", helpHtml("intro.navigation.street_different_fields") + "{br}" + helpHtml("intro.navigation.editor_street", {
55108         button: { html: icon(href, "inline") },
55109         field1: onewayField.title(),
55110         field2: maxspeedField.title()
55111       }));
55112       context.on("exit.intro", function() {
55113         continueTo(play);
55114       });
55115       context.history().on("change.intro", function() {
55116         var selector2 = ".entity-editor-pane button.close svg use";
55117         var href2 = select_default2(selector2).attr("href") || "#iD-icon-close";
55118         reveal(
55119           ".entity-editor-pane",
55120           helpHtml("intro.navigation.street_different_fields") + "{br}" + helpHtml("intro.navigation.editor_street", {
55121             button: { html: icon(href2, "inline") },
55122             field1: onewayField.title(),
55123             field2: maxspeedField.title()
55124           }),
55125           { duration: 0 }
55126         );
55127       });
55128       function continueTo(nextStep) {
55129         context.on("exit.intro", null);
55130         context.history().on("change.intro", null);
55131         nextStep();
55132       }
55133     }
55134     function play() {
55135       dispatch10.call("done");
55136       reveal(
55137         ".ideditor",
55138         helpHtml("intro.navigation.play", { next: _t("intro.points.title") }),
55139         {
55140           tooltipBox: ".intro-nav-wrap .chapter-point",
55141           buttonText: _t.html("intro.ok"),
55142           buttonCallback: function() {
55143             reveal(".ideditor");
55144           }
55145         }
55146       );
55147     }
55148     chapter.enter = function() {
55149       dragMap();
55150     };
55151     chapter.exit = function() {
55152       timeouts.forEach(window.clearTimeout);
55153       context.on("enter.intro exit.intro", null);
55154       context.map().on("move.intro drawn.intro", null);
55155       context.history().on("change.intro", null);
55156       context.container().select(".inspector-wrap").on("wheel.intro", null);
55157       context.container().select(".search-header input").on("keydown.intro keyup.intro", null);
55158     };
55159     chapter.restart = function() {
55160       chapter.exit();
55161       chapter.enter();
55162     };
55163     return utilRebind(chapter, dispatch10, "on");
55164   }
55165
55166   // modules/ui/intro/point.js
55167   function uiIntroPoint(context, reveal) {
55168     var dispatch10 = dispatch_default("done");
55169     var timeouts = [];
55170     var intersection = [-85.63279, 41.94394];
55171     var building = [-85.632422, 41.944045];
55172     var cafePreset = _mainPresetIndex.item("amenity/cafe");
55173     var _pointID = null;
55174     var chapter = {
55175       title: "intro.points.title"
55176     };
55177     function timeout2(f2, t) {
55178       timeouts.push(window.setTimeout(f2, t));
55179     }
55180     function eventCancel(d3_event) {
55181       d3_event.stopPropagation();
55182       d3_event.preventDefault();
55183     }
55184     function addPoint() {
55185       context.enter(modeBrowse(context));
55186       context.history().reset("initial");
55187       var msec = transitionTime(intersection, context.map().center());
55188       if (msec) {
55189         reveal(null, null, { duration: 0 });
55190       }
55191       context.map().centerZoomEase(intersection, 19, msec);
55192       timeout2(function() {
55193         var tooltip = reveal(
55194           "button.add-point",
55195           helpHtml("intro.points.points_info") + "{br}" + helpHtml("intro.points.add_point")
55196         );
55197         _pointID = null;
55198         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-points");
55199         context.on("enter.intro", function(mode) {
55200           if (mode.id !== "add-point")
55201             return;
55202           continueTo(placePoint);
55203         });
55204       }, msec + 100);
55205       function continueTo(nextStep) {
55206         context.on("enter.intro", null);
55207         nextStep();
55208       }
55209     }
55210     function placePoint() {
55211       if (context.mode().id !== "add-point") {
55212         return chapter.restart();
55213       }
55214       var pointBox2 = pad(building, 150, context);
55215       var textId = context.lastPointerType() === "mouse" ? "place_point" : "place_point_touch";
55216       reveal(pointBox2, helpHtml("intro.points." + textId));
55217       context.map().on("move.intro drawn.intro", function() {
55218         pointBox2 = pad(building, 150, context);
55219         reveal(pointBox2, helpHtml("intro.points." + textId), { duration: 0 });
55220       });
55221       context.on("enter.intro", function(mode) {
55222         if (mode.id !== "select")
55223           return chapter.restart();
55224         _pointID = context.mode().selectedIDs()[0];
55225         continueTo(searchPreset);
55226       });
55227       function continueTo(nextStep) {
55228         context.map().on("move.intro drawn.intro", null);
55229         context.on("enter.intro", null);
55230         nextStep();
55231       }
55232     }
55233     function searchPreset() {
55234       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55235         return addPoint();
55236       }
55237       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55238       context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
55239       reveal(
55240         ".preset-search-input",
55241         helpHtml("intro.points.search_cafe", { preset: cafePreset.name() })
55242       );
55243       context.on("enter.intro", function(mode) {
55244         if (!_pointID || !context.hasEntity(_pointID)) {
55245           return continueTo(addPoint);
55246         }
55247         var ids = context.selectedIDs();
55248         if (mode.id !== "select" || !ids.length || ids[0] !== _pointID) {
55249           context.enter(modeSelect(context, [_pointID]));
55250           context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55251           context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
55252           reveal(
55253             ".preset-search-input",
55254             helpHtml("intro.points.search_cafe", { preset: cafePreset.name() })
55255           );
55256           context.history().on("change.intro", null);
55257         }
55258       });
55259       function checkPresetSearch() {
55260         var first = context.container().select(".preset-list-item:first-child");
55261         if (first.classed("preset-amenity-cafe")) {
55262           context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
55263           reveal(
55264             first.select(".preset-list-button").node(),
55265             helpHtml("intro.points.choose_cafe", { preset: cafePreset.name() }),
55266             { duration: 300 }
55267           );
55268           context.history().on("change.intro", function() {
55269             continueTo(aboutFeatureEditor);
55270           });
55271         }
55272       }
55273       function continueTo(nextStep) {
55274         context.on("enter.intro", null);
55275         context.history().on("change.intro", null);
55276         context.container().select(".inspector-wrap").on("wheel.intro", null);
55277         context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
55278         nextStep();
55279       }
55280     }
55281     function aboutFeatureEditor() {
55282       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55283         return addPoint();
55284       }
55285       timeout2(function() {
55286         reveal(".entity-editor-pane", helpHtml("intro.points.feature_editor"), {
55287           tooltipClass: "intro-points-describe",
55288           buttonText: _t.html("intro.ok"),
55289           buttonCallback: function() {
55290             continueTo(addName);
55291           }
55292         });
55293       }, 400);
55294       context.on("exit.intro", function() {
55295         continueTo(reselectPoint);
55296       });
55297       function continueTo(nextStep) {
55298         context.on("exit.intro", null);
55299         nextStep();
55300       }
55301     }
55302     function addName() {
55303       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55304         return addPoint();
55305       }
55306       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55307       var addNameString = helpHtml("intro.points.fields_info") + "{br}" + helpHtml("intro.points.add_name");
55308       timeout2(function() {
55309         var entity = context.entity(_pointID);
55310         if (entity.tags.name) {
55311           var tooltip = reveal(".entity-editor-pane", addNameString, {
55312             tooltipClass: "intro-points-describe",
55313             buttonText: _t.html("intro.ok"),
55314             buttonCallback: function() {
55315               continueTo(addCloseEditor);
55316             }
55317           });
55318           tooltip.select(".instruction").style("display", "none");
55319         } else {
55320           reveal(
55321             ".entity-editor-pane",
55322             addNameString,
55323             { tooltipClass: "intro-points-describe" }
55324           );
55325         }
55326       }, 400);
55327       context.history().on("change.intro", function() {
55328         continueTo(addCloseEditor);
55329       });
55330       context.on("exit.intro", function() {
55331         continueTo(reselectPoint);
55332       });
55333       function continueTo(nextStep) {
55334         context.on("exit.intro", null);
55335         context.history().on("change.intro", null);
55336         nextStep();
55337       }
55338     }
55339     function addCloseEditor() {
55340       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55341       var selector = ".entity-editor-pane button.close svg use";
55342       var href = select_default2(selector).attr("href") || "#iD-icon-close";
55343       context.on("exit.intro", function() {
55344         continueTo(reselectPoint);
55345       });
55346       reveal(
55347         ".entity-editor-pane",
55348         helpHtml("intro.points.add_close", { button: { html: icon(href, "inline") } })
55349       );
55350       function continueTo(nextStep) {
55351         context.on("exit.intro", null);
55352         nextStep();
55353       }
55354     }
55355     function reselectPoint() {
55356       if (!_pointID)
55357         return chapter.restart();
55358       var entity = context.hasEntity(_pointID);
55359       if (!entity)
55360         return chapter.restart();
55361       var oldPreset = _mainPresetIndex.match(entity, context.graph());
55362       context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
55363       context.enter(modeBrowse(context));
55364       var msec = transitionTime(entity.loc, context.map().center());
55365       if (msec) {
55366         reveal(null, null, { duration: 0 });
55367       }
55368       context.map().centerEase(entity.loc, msec);
55369       timeout2(function() {
55370         var box = pointBox(entity.loc, context);
55371         reveal(box, helpHtml("intro.points.reselect"), { duration: 600 });
55372         timeout2(function() {
55373           context.map().on("move.intro drawn.intro", function() {
55374             var entity2 = context.hasEntity(_pointID);
55375             if (!entity2)
55376               return chapter.restart();
55377             var box2 = pointBox(entity2.loc, context);
55378             reveal(box2, helpHtml("intro.points.reselect"), { duration: 0 });
55379           });
55380         }, 600);
55381         context.on("enter.intro", function(mode) {
55382           if (mode.id !== "select")
55383             return;
55384           continueTo(updatePoint);
55385         });
55386       }, msec + 100);
55387       function continueTo(nextStep) {
55388         context.map().on("move.intro drawn.intro", null);
55389         context.on("enter.intro", null);
55390         nextStep();
55391       }
55392     }
55393     function updatePoint() {
55394       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55395         return continueTo(reselectPoint);
55396       }
55397       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55398       context.on("exit.intro", function() {
55399         continueTo(reselectPoint);
55400       });
55401       context.history().on("change.intro", function() {
55402         continueTo(updateCloseEditor);
55403       });
55404       timeout2(function() {
55405         reveal(
55406           ".entity-editor-pane",
55407           helpHtml("intro.points.update"),
55408           { tooltipClass: "intro-points-describe" }
55409         );
55410       }, 400);
55411       function continueTo(nextStep) {
55412         context.on("exit.intro", null);
55413         context.history().on("change.intro", null);
55414         nextStep();
55415       }
55416     }
55417     function updateCloseEditor() {
55418       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55419         return continueTo(reselectPoint);
55420       }
55421       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55422       context.on("exit.intro", function() {
55423         continueTo(rightClickPoint);
55424       });
55425       timeout2(function() {
55426         reveal(
55427           ".entity-editor-pane",
55428           helpHtml("intro.points.update_close", { button: { html: icon("#iD-icon-close", "inline") } })
55429         );
55430       }, 500);
55431       function continueTo(nextStep) {
55432         context.on("exit.intro", null);
55433         nextStep();
55434       }
55435     }
55436     function rightClickPoint() {
55437       if (!_pointID)
55438         return chapter.restart();
55439       var entity = context.hasEntity(_pointID);
55440       if (!entity)
55441         return chapter.restart();
55442       context.enter(modeBrowse(context));
55443       var box = pointBox(entity.loc, context);
55444       var textId = context.lastPointerType() === "mouse" ? "rightclick" : "edit_menu_touch";
55445       reveal(box, helpHtml("intro.points." + textId), { duration: 600 });
55446       timeout2(function() {
55447         context.map().on("move.intro", function() {
55448           var entity2 = context.hasEntity(_pointID);
55449           if (!entity2)
55450             return chapter.restart();
55451           var box2 = pointBox(entity2.loc, context);
55452           reveal(box2, helpHtml("intro.points." + textId), { duration: 0 });
55453         });
55454       }, 600);
55455       context.on("enter.intro", function(mode) {
55456         if (mode.id !== "select")
55457           return;
55458         var ids = context.selectedIDs();
55459         if (ids.length !== 1 || ids[0] !== _pointID)
55460           return;
55461         timeout2(function() {
55462           var node = selectMenuItem(context, "delete").node();
55463           if (!node)
55464             return;
55465           continueTo(enterDelete);
55466         }, 50);
55467       });
55468       function continueTo(nextStep) {
55469         context.on("enter.intro", null);
55470         context.map().on("move.intro", null);
55471         nextStep();
55472       }
55473     }
55474     function enterDelete() {
55475       if (!_pointID)
55476         return chapter.restart();
55477       var entity = context.hasEntity(_pointID);
55478       if (!entity)
55479         return chapter.restart();
55480       var node = selectMenuItem(context, "delete").node();
55481       if (!node) {
55482         return continueTo(rightClickPoint);
55483       }
55484       reveal(
55485         ".edit-menu",
55486         helpHtml("intro.points.delete"),
55487         { padding: 50 }
55488       );
55489       timeout2(function() {
55490         context.map().on("move.intro", function() {
55491           reveal(
55492             ".edit-menu",
55493             helpHtml("intro.points.delete"),
55494             { duration: 0, padding: 50 }
55495           );
55496         });
55497       }, 300);
55498       context.on("exit.intro", function() {
55499         if (!_pointID)
55500           return chapter.restart();
55501         var entity2 = context.hasEntity(_pointID);
55502         if (entity2)
55503           return continueTo(rightClickPoint);
55504       });
55505       context.history().on("change.intro", function(changed) {
55506         if (changed.deleted().length) {
55507           continueTo(undo);
55508         }
55509       });
55510       function continueTo(nextStep) {
55511         context.map().on("move.intro", null);
55512         context.history().on("change.intro", null);
55513         context.on("exit.intro", null);
55514         nextStep();
55515       }
55516     }
55517     function undo() {
55518       context.history().on("change.intro", function() {
55519         continueTo(play);
55520       });
55521       reveal(
55522         ".top-toolbar button.undo-button",
55523         helpHtml("intro.points.undo")
55524       );
55525       function continueTo(nextStep) {
55526         context.history().on("change.intro", null);
55527         nextStep();
55528       }
55529     }
55530     function play() {
55531       dispatch10.call("done");
55532       reveal(
55533         ".ideditor",
55534         helpHtml("intro.points.play", { next: _t("intro.areas.title") }),
55535         {
55536           tooltipBox: ".intro-nav-wrap .chapter-area",
55537           buttonText: _t.html("intro.ok"),
55538           buttonCallback: function() {
55539             reveal(".ideditor");
55540           }
55541         }
55542       );
55543     }
55544     chapter.enter = function() {
55545       addPoint();
55546     };
55547     chapter.exit = function() {
55548       timeouts.forEach(window.clearTimeout);
55549       context.on("enter.intro exit.intro", null);
55550       context.map().on("move.intro drawn.intro", null);
55551       context.history().on("change.intro", null);
55552       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55553       context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
55554     };
55555     chapter.restart = function() {
55556       chapter.exit();
55557       chapter.enter();
55558     };
55559     return utilRebind(chapter, dispatch10, "on");
55560   }
55561
55562   // modules/ui/intro/area.js
55563   function uiIntroArea(context, reveal) {
55564     var dispatch10 = dispatch_default("done");
55565     var playground = [-85.63552, 41.94159];
55566     var playgroundPreset = _mainPresetIndex.item("leisure/playground");
55567     var nameField = _mainPresetIndex.field("name");
55568     var descriptionField = _mainPresetIndex.field("description");
55569     var timeouts = [];
55570     var _areaID;
55571     var chapter = {
55572       title: "intro.areas.title"
55573     };
55574     function timeout2(f2, t) {
55575       timeouts.push(window.setTimeout(f2, t));
55576     }
55577     function eventCancel(d3_event) {
55578       d3_event.stopPropagation();
55579       d3_event.preventDefault();
55580     }
55581     function revealPlayground(center, text2, options2) {
55582       var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
55583       var box = pad(center, padding, context);
55584       reveal(box, text2, options2);
55585     }
55586     function addArea() {
55587       context.enter(modeBrowse(context));
55588       context.history().reset("initial");
55589       _areaID = null;
55590       var msec = transitionTime(playground, context.map().center());
55591       if (msec) {
55592         reveal(null, null, { duration: 0 });
55593       }
55594       context.map().centerZoomEase(playground, 19, msec);
55595       timeout2(function() {
55596         var tooltip = reveal(
55597           "button.add-area",
55598           helpHtml("intro.areas.add_playground")
55599         );
55600         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-areas");
55601         context.on("enter.intro", function(mode) {
55602           if (mode.id !== "add-area")
55603             return;
55604           continueTo(startPlayground);
55605         });
55606       }, msec + 100);
55607       function continueTo(nextStep) {
55608         context.on("enter.intro", null);
55609         nextStep();
55610       }
55611     }
55612     function startPlayground() {
55613       if (context.mode().id !== "add-area") {
55614         return chapter.restart();
55615       }
55616       _areaID = null;
55617       context.map().zoomEase(19.5, 500);
55618       timeout2(function() {
55619         var textId = context.lastPointerType() === "mouse" ? "starting_node_click" : "starting_node_tap";
55620         var startDrawString = helpHtml("intro.areas.start_playground") + helpHtml("intro.areas." + textId);
55621         revealPlayground(
55622           playground,
55623           startDrawString,
55624           { duration: 250 }
55625         );
55626         timeout2(function() {
55627           context.map().on("move.intro drawn.intro", function() {
55628             revealPlayground(
55629               playground,
55630               startDrawString,
55631               { duration: 0 }
55632             );
55633           });
55634           context.on("enter.intro", function(mode) {
55635             if (mode.id !== "draw-area")
55636               return chapter.restart();
55637             continueTo(continuePlayground);
55638           });
55639         }, 250);
55640       }, 550);
55641       function continueTo(nextStep) {
55642         context.map().on("move.intro drawn.intro", null);
55643         context.on("enter.intro", null);
55644         nextStep();
55645       }
55646     }
55647     function continuePlayground() {
55648       if (context.mode().id !== "draw-area") {
55649         return chapter.restart();
55650       }
55651       _areaID = null;
55652       revealPlayground(
55653         playground,
55654         helpHtml("intro.areas.continue_playground"),
55655         { duration: 250 }
55656       );
55657       timeout2(function() {
55658         context.map().on("move.intro drawn.intro", function() {
55659           revealPlayground(
55660             playground,
55661             helpHtml("intro.areas.continue_playground"),
55662             { duration: 0 }
55663           );
55664         });
55665       }, 250);
55666       context.on("enter.intro", function(mode) {
55667         if (mode.id === "draw-area") {
55668           var entity = context.hasEntity(context.selectedIDs()[0]);
55669           if (entity && entity.nodes.length >= 6) {
55670             return continueTo(finishPlayground);
55671           } else {
55672             return;
55673           }
55674         } else if (mode.id === "select") {
55675           _areaID = context.selectedIDs()[0];
55676           return continueTo(searchPresets);
55677         } else {
55678           return chapter.restart();
55679         }
55680       });
55681       function continueTo(nextStep) {
55682         context.map().on("move.intro drawn.intro", null);
55683         context.on("enter.intro", null);
55684         nextStep();
55685       }
55686     }
55687     function finishPlayground() {
55688       if (context.mode().id !== "draw-area") {
55689         return chapter.restart();
55690       }
55691       _areaID = null;
55692       var finishString = helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.areas.finish_playground");
55693       revealPlayground(
55694         playground,
55695         finishString,
55696         { duration: 250 }
55697       );
55698       timeout2(function() {
55699         context.map().on("move.intro drawn.intro", function() {
55700           revealPlayground(
55701             playground,
55702             finishString,
55703             { duration: 0 }
55704           );
55705         });
55706       }, 250);
55707       context.on("enter.intro", function(mode) {
55708         if (mode.id === "draw-area") {
55709           return;
55710         } else if (mode.id === "select") {
55711           _areaID = context.selectedIDs()[0];
55712           return continueTo(searchPresets);
55713         } else {
55714           return chapter.restart();
55715         }
55716       });
55717       function continueTo(nextStep) {
55718         context.map().on("move.intro drawn.intro", null);
55719         context.on("enter.intro", null);
55720         nextStep();
55721       }
55722     }
55723     function searchPresets() {
55724       if (!_areaID || !context.hasEntity(_areaID)) {
55725         return addArea();
55726       }
55727       var ids = context.selectedIDs();
55728       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
55729         context.enter(modeSelect(context, [_areaID]));
55730       }
55731       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55732       timeout2(function() {
55733         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
55734         context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
55735         reveal(
55736           ".preset-search-input",
55737           helpHtml("intro.areas.search_playground", { preset: playgroundPreset.name() })
55738         );
55739       }, 400);
55740       context.on("enter.intro", function(mode) {
55741         if (!_areaID || !context.hasEntity(_areaID)) {
55742           return continueTo(addArea);
55743         }
55744         var ids2 = context.selectedIDs();
55745         if (mode.id !== "select" || !ids2.length || ids2[0] !== _areaID) {
55746           context.enter(modeSelect(context, [_areaID]));
55747           context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
55748           context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55749           context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
55750           reveal(
55751             ".preset-search-input",
55752             helpHtml("intro.areas.search_playground", { preset: playgroundPreset.name() })
55753           );
55754           context.history().on("change.intro", null);
55755         }
55756       });
55757       function checkPresetSearch() {
55758         var first = context.container().select(".preset-list-item:first-child");
55759         if (first.classed("preset-leisure-playground")) {
55760           reveal(
55761             first.select(".preset-list-button").node(),
55762             helpHtml("intro.areas.choose_playground", { preset: playgroundPreset.name() }),
55763             { duration: 300 }
55764           );
55765           context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
55766           context.history().on("change.intro", function() {
55767             continueTo(clickAddField);
55768           });
55769         }
55770       }
55771       function continueTo(nextStep) {
55772         context.container().select(".inspector-wrap").on("wheel.intro", null);
55773         context.on("enter.intro", null);
55774         context.history().on("change.intro", null);
55775         context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
55776         nextStep();
55777       }
55778     }
55779     function clickAddField() {
55780       if (!_areaID || !context.hasEntity(_areaID)) {
55781         return addArea();
55782       }
55783       var ids = context.selectedIDs();
55784       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
55785         return searchPresets();
55786       }
55787       if (!context.container().select(".form-field-description").empty()) {
55788         return continueTo(describePlayground);
55789       }
55790       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55791       timeout2(function() {
55792         context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55793         var entity = context.entity(_areaID);
55794         if (entity.tags.description) {
55795           return continueTo(play);
55796         }
55797         var box = context.container().select(".more-fields").node().getBoundingClientRect();
55798         if (box.top > 300) {
55799           var pane = context.container().select(".entity-editor-pane .inspector-body");
55800           var start2 = pane.node().scrollTop;
55801           var end = start2 + (box.top - 300);
55802           pane.transition().duration(250).tween("scroll.inspector", function() {
55803             var node = this;
55804             var i2 = number_default(start2, end);
55805             return function(t) {
55806               node.scrollTop = i2(t);
55807             };
55808           });
55809         }
55810         timeout2(function() {
55811           reveal(
55812             ".more-fields .combobox-input",
55813             helpHtml("intro.areas.add_field", {
55814               name: nameField.title(),
55815               description: descriptionField.title()
55816             }),
55817             { duration: 300 }
55818           );
55819           context.container().select(".more-fields .combobox-input").on("click.intro", function() {
55820             var watcher;
55821             watcher = window.setInterval(function() {
55822               if (!context.container().select("div.combobox").empty()) {
55823                 window.clearInterval(watcher);
55824                 continueTo(chooseDescriptionField);
55825               }
55826             }, 300);
55827           });
55828         }, 300);
55829       }, 400);
55830       context.on("exit.intro", function() {
55831         return continueTo(searchPresets);
55832       });
55833       function continueTo(nextStep) {
55834         context.container().select(".inspector-wrap").on("wheel.intro", null);
55835         context.container().select(".more-fields .combobox-input").on("click.intro", null);
55836         context.on("exit.intro", null);
55837         nextStep();
55838       }
55839     }
55840     function chooseDescriptionField() {
55841       if (!_areaID || !context.hasEntity(_areaID)) {
55842         return addArea();
55843       }
55844       var ids = context.selectedIDs();
55845       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
55846         return searchPresets();
55847       }
55848       if (!context.container().select(".form-field-description").empty()) {
55849         return continueTo(describePlayground);
55850       }
55851       if (context.container().select("div.combobox").empty()) {
55852         return continueTo(clickAddField);
55853       }
55854       var watcher;
55855       watcher = window.setInterval(function() {
55856         if (context.container().select("div.combobox").empty()) {
55857           window.clearInterval(watcher);
55858           timeout2(function() {
55859             if (context.container().select(".form-field-description").empty()) {
55860               continueTo(retryChooseDescription);
55861             } else {
55862               continueTo(describePlayground);
55863             }
55864           }, 300);
55865         }
55866       }, 300);
55867       reveal(
55868         "div.combobox",
55869         helpHtml("intro.areas.choose_field", { field: descriptionField.title() }),
55870         { duration: 300 }
55871       );
55872       context.on("exit.intro", function() {
55873         return continueTo(searchPresets);
55874       });
55875       function continueTo(nextStep) {
55876         if (watcher)
55877           window.clearInterval(watcher);
55878         context.on("exit.intro", null);
55879         nextStep();
55880       }
55881     }
55882     function describePlayground() {
55883       if (!_areaID || !context.hasEntity(_areaID)) {
55884         return addArea();
55885       }
55886       var ids = context.selectedIDs();
55887       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
55888         return searchPresets();
55889       }
55890       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55891       if (context.container().select(".form-field-description").empty()) {
55892         return continueTo(retryChooseDescription);
55893       }
55894       context.on("exit.intro", function() {
55895         continueTo(play);
55896       });
55897       reveal(
55898         ".entity-editor-pane",
55899         helpHtml("intro.areas.describe_playground", { button: { html: icon("#iD-icon-close", "inline") } }),
55900         { duration: 300 }
55901       );
55902       function continueTo(nextStep) {
55903         context.on("exit.intro", null);
55904         nextStep();
55905       }
55906     }
55907     function retryChooseDescription() {
55908       if (!_areaID || !context.hasEntity(_areaID)) {
55909         return addArea();
55910       }
55911       var ids = context.selectedIDs();
55912       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
55913         return searchPresets();
55914       }
55915       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55916       reveal(
55917         ".entity-editor-pane",
55918         helpHtml("intro.areas.retry_add_field", { field: descriptionField.title() }),
55919         {
55920           buttonText: _t.html("intro.ok"),
55921           buttonCallback: function() {
55922             continueTo(clickAddField);
55923           }
55924         }
55925       );
55926       context.on("exit.intro", function() {
55927         return continueTo(searchPresets);
55928       });
55929       function continueTo(nextStep) {
55930         context.on("exit.intro", null);
55931         nextStep();
55932       }
55933     }
55934     function play() {
55935       dispatch10.call("done");
55936       reveal(
55937         ".ideditor",
55938         helpHtml("intro.areas.play", { next: _t("intro.lines.title") }),
55939         {
55940           tooltipBox: ".intro-nav-wrap .chapter-line",
55941           buttonText: _t.html("intro.ok"),
55942           buttonCallback: function() {
55943             reveal(".ideditor");
55944           }
55945         }
55946       );
55947     }
55948     chapter.enter = function() {
55949       addArea();
55950     };
55951     chapter.exit = function() {
55952       timeouts.forEach(window.clearTimeout);
55953       context.on("enter.intro exit.intro", null);
55954       context.map().on("move.intro drawn.intro", null);
55955       context.history().on("change.intro", null);
55956       context.container().select(".inspector-wrap").on("wheel.intro", null);
55957       context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
55958       context.container().select(".more-fields .combobox-input").on("click.intro", null);
55959     };
55960     chapter.restart = function() {
55961       chapter.exit();
55962       chapter.enter();
55963     };
55964     return utilRebind(chapter, dispatch10, "on");
55965   }
55966
55967   // modules/ui/intro/line.js
55968   function uiIntroLine(context, reveal) {
55969     var dispatch10 = dispatch_default("done");
55970     var timeouts = [];
55971     var _tulipRoadID = null;
55972     var flowerRoadID = "w646";
55973     var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
55974     var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
55975     var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
55976     var roadCategory = _mainPresetIndex.item("category-road_minor");
55977     var residentialPreset = _mainPresetIndex.item("highway/residential");
55978     var woodRoadID = "w525";
55979     var woodRoadEndID = "n2862";
55980     var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
55981     var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
55982     var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
55983     var washingtonStreetID = "w522";
55984     var twelfthAvenueID = "w1";
55985     var eleventhAvenueEndID = "n3550";
55986     var twelfthAvenueEndID = "n5";
55987     var _washingtonSegmentID = null;
55988     var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
55989     var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
55990     var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
55991     var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
55992     var chapter = {
55993       title: "intro.lines.title"
55994     };
55995     function timeout2(f2, t) {
55996       timeouts.push(window.setTimeout(f2, t));
55997     }
55998     function eventCancel(d3_event) {
55999       d3_event.stopPropagation();
56000       d3_event.preventDefault();
56001     }
56002     function addLine() {
56003       context.enter(modeBrowse(context));
56004       context.history().reset("initial");
56005       var msec = transitionTime(tulipRoadStart, context.map().center());
56006       if (msec) {
56007         reveal(null, null, { duration: 0 });
56008       }
56009       context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
56010       timeout2(function() {
56011         var tooltip = reveal(
56012           "button.add-line",
56013           helpHtml("intro.lines.add_line")
56014         );
56015         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-lines");
56016         context.on("enter.intro", function(mode) {
56017           if (mode.id !== "add-line")
56018             return;
56019           continueTo(startLine);
56020         });
56021       }, msec + 100);
56022       function continueTo(nextStep) {
56023         context.on("enter.intro", null);
56024         nextStep();
56025       }
56026     }
56027     function startLine() {
56028       if (context.mode().id !== "add-line")
56029         return chapter.restart();
56030       _tulipRoadID = null;
56031       var padding = 70 * Math.pow(2, context.map().zoom() - 18);
56032       var box = pad(tulipRoadStart, padding, context);
56033       box.height = box.height + 100;
56034       var textId = context.lastPointerType() === "mouse" ? "start_line" : "start_line_tap";
56035       var startLineString = helpHtml("intro.lines.missing_road") + "{br}" + helpHtml("intro.lines.line_draw_info") + helpHtml("intro.lines." + textId);
56036       reveal(box, startLineString);
56037       context.map().on("move.intro drawn.intro", function() {
56038         padding = 70 * Math.pow(2, context.map().zoom() - 18);
56039         box = pad(tulipRoadStart, padding, context);
56040         box.height = box.height + 100;
56041         reveal(box, startLineString, { duration: 0 });
56042       });
56043       context.on("enter.intro", function(mode) {
56044         if (mode.id !== "draw-line")
56045           return chapter.restart();
56046         continueTo(drawLine);
56047       });
56048       function continueTo(nextStep) {
56049         context.map().on("move.intro drawn.intro", null);
56050         context.on("enter.intro", null);
56051         nextStep();
56052       }
56053     }
56054     function drawLine() {
56055       if (context.mode().id !== "draw-line")
56056         return chapter.restart();
56057       _tulipRoadID = context.mode().selectedIDs()[0];
56058       context.map().centerEase(tulipRoadMidpoint, 500);
56059       timeout2(function() {
56060         var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
56061         var box = pad(tulipRoadMidpoint, padding, context);
56062         box.height = box.height * 2;
56063         reveal(
56064           box,
56065           helpHtml("intro.lines.intersect", { name: _t("intro.graph.name.flower-street") })
56066         );
56067         context.map().on("move.intro drawn.intro", function() {
56068           padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
56069           box = pad(tulipRoadMidpoint, padding, context);
56070           box.height = box.height * 2;
56071           reveal(
56072             box,
56073             helpHtml("intro.lines.intersect", { name: _t("intro.graph.name.flower-street") }),
56074             { duration: 0 }
56075           );
56076         });
56077       }, 550);
56078       context.history().on("change.intro", function() {
56079         if (isLineConnected()) {
56080           continueTo(continueLine);
56081         }
56082       });
56083       context.on("enter.intro", function(mode) {
56084         if (mode.id === "draw-line") {
56085           return;
56086         } else if (mode.id === "select") {
56087           continueTo(retryIntersect);
56088           return;
56089         } else {
56090           return chapter.restart();
56091         }
56092       });
56093       function continueTo(nextStep) {
56094         context.map().on("move.intro drawn.intro", null);
56095         context.history().on("change.intro", null);
56096         context.on("enter.intro", null);
56097         nextStep();
56098       }
56099     }
56100     function isLineConnected() {
56101       var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
56102       if (!entity)
56103         return false;
56104       var drawNodes = context.graph().childNodes(entity);
56105       return drawNodes.some(function(node) {
56106         return context.graph().parentWays(node).some(function(parent) {
56107           return parent.id === flowerRoadID;
56108         });
56109       });
56110     }
56111     function retryIntersect() {
56112       select_default2(window).on("pointerdown.intro mousedown.intro", eventCancel, true);
56113       var box = pad(tulipRoadIntersection, 80, context);
56114       reveal(
56115         box,
56116         helpHtml("intro.lines.retry_intersect", { name: _t("intro.graph.name.flower-street") })
56117       );
56118       timeout2(chapter.restart, 3e3);
56119     }
56120     function continueLine() {
56121       if (context.mode().id !== "draw-line")
56122         return chapter.restart();
56123       var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
56124       if (!entity)
56125         return chapter.restart();
56126       context.map().centerEase(tulipRoadIntersection, 500);
56127       var continueLineText = helpHtml("intro.lines.continue_line") + "{br}" + helpHtml("intro.lines.finish_line_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.lines.finish_road");
56128       reveal(".surface", continueLineText);
56129       context.on("enter.intro", function(mode) {
56130         if (mode.id === "draw-line") {
56131           return;
56132         } else if (mode.id === "select") {
56133           return continueTo(chooseCategoryRoad);
56134         } else {
56135           return chapter.restart();
56136         }
56137       });
56138       function continueTo(nextStep) {
56139         context.on("enter.intro", null);
56140         nextStep();
56141       }
56142     }
56143     function chooseCategoryRoad() {
56144       if (context.mode().id !== "select")
56145         return chapter.restart();
56146       context.on("exit.intro", function() {
56147         return chapter.restart();
56148       });
56149       var button = context.container().select(".preset-category-road_minor .preset-list-button");
56150       if (button.empty())
56151         return chapter.restart();
56152       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56153       timeout2(function() {
56154         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
56155         reveal(
56156           button.node(),
56157           helpHtml("intro.lines.choose_category_road", { category: roadCategory.name() })
56158         );
56159         button.on("click.intro", function() {
56160           continueTo(choosePresetResidential);
56161         });
56162       }, 400);
56163       function continueTo(nextStep) {
56164         context.container().select(".inspector-wrap").on("wheel.intro", null);
56165         context.container().select(".preset-list-button").on("click.intro", null);
56166         context.on("exit.intro", null);
56167         nextStep();
56168       }
56169     }
56170     function choosePresetResidential() {
56171       if (context.mode().id !== "select")
56172         return chapter.restart();
56173       context.on("exit.intro", function() {
56174         return chapter.restart();
56175       });
56176       var subgrid = context.container().select(".preset-category-road_minor .subgrid");
56177       if (subgrid.empty())
56178         return chapter.restart();
56179       subgrid.selectAll(":not(.preset-highway-residential) .preset-list-button").on("click.intro", function() {
56180         continueTo(retryPresetResidential);
56181       });
56182       subgrid.selectAll(".preset-highway-residential .preset-list-button").on("click.intro", function() {
56183         continueTo(nameRoad);
56184       });
56185       timeout2(function() {
56186         reveal(
56187           subgrid.node(),
56188           helpHtml("intro.lines.choose_preset_residential", { preset: residentialPreset.name() }),
56189           { tooltipBox: ".preset-highway-residential .preset-list-button", duration: 300 }
56190         );
56191       }, 300);
56192       function continueTo(nextStep) {
56193         context.container().select(".preset-list-button").on("click.intro", null);
56194         context.on("exit.intro", null);
56195         nextStep();
56196       }
56197     }
56198     function retryPresetResidential() {
56199       if (context.mode().id !== "select")
56200         return chapter.restart();
56201       context.on("exit.intro", function() {
56202         return chapter.restart();
56203       });
56204       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56205       timeout2(function() {
56206         var button = context.container().select(".entity-editor-pane .preset-list-button");
56207         reveal(
56208           button.node(),
56209           helpHtml("intro.lines.retry_preset_residential", { preset: residentialPreset.name() })
56210         );
56211         button.on("click.intro", function() {
56212           continueTo(chooseCategoryRoad);
56213         });
56214       }, 500);
56215       function continueTo(nextStep) {
56216         context.container().select(".inspector-wrap").on("wheel.intro", null);
56217         context.container().select(".preset-list-button").on("click.intro", null);
56218         context.on("exit.intro", null);
56219         nextStep();
56220       }
56221     }
56222     function nameRoad() {
56223       context.on("exit.intro", function() {
56224         continueTo(didNameRoad);
56225       });
56226       timeout2(function() {
56227         reveal(
56228           ".entity-editor-pane",
56229           helpHtml("intro.lines.name_road", { button: { html: icon("#iD-icon-close", "inline") } }),
56230           { tooltipClass: "intro-lines-name_road" }
56231         );
56232       }, 500);
56233       function continueTo(nextStep) {
56234         context.on("exit.intro", null);
56235         nextStep();
56236       }
56237     }
56238     function didNameRoad() {
56239       context.history().checkpoint("doneAddLine");
56240       timeout2(function() {
56241         reveal(".surface", helpHtml("intro.lines.did_name_road"), {
56242           buttonText: _t.html("intro.ok"),
56243           buttonCallback: function() {
56244             continueTo(updateLine);
56245           }
56246         });
56247       }, 500);
56248       function continueTo(nextStep) {
56249         nextStep();
56250       }
56251     }
56252     function updateLine() {
56253       context.history().reset("doneAddLine");
56254       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56255         return chapter.restart();
56256       }
56257       var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
56258       if (msec) {
56259         reveal(null, null, { duration: 0 });
56260       }
56261       context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
56262       timeout2(function() {
56263         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
56264         var box = pad(woodRoadDragMidpoint, padding, context);
56265         var advance = function() {
56266           continueTo(addNode);
56267         };
56268         reveal(
56269           box,
56270           helpHtml("intro.lines.update_line"),
56271           { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56272         );
56273         context.map().on("move.intro drawn.intro", function() {
56274           var padding2 = 250 * Math.pow(2, context.map().zoom() - 19);
56275           var box2 = pad(woodRoadDragMidpoint, padding2, context);
56276           reveal(
56277             box2,
56278             helpHtml("intro.lines.update_line"),
56279             { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
56280           );
56281         });
56282       }, msec + 100);
56283       function continueTo(nextStep) {
56284         context.map().on("move.intro drawn.intro", null);
56285         nextStep();
56286       }
56287     }
56288     function addNode() {
56289       context.history().reset("doneAddLine");
56290       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56291         return chapter.restart();
56292       }
56293       var padding = 40 * Math.pow(2, context.map().zoom() - 19);
56294       var box = pad(woodRoadAddNode, padding, context);
56295       var addNodeString = helpHtml("intro.lines.add_node" + (context.lastPointerType() === "mouse" ? "" : "_touch"));
56296       reveal(box, addNodeString);
56297       context.map().on("move.intro drawn.intro", function() {
56298         var padding2 = 40 * Math.pow(2, context.map().zoom() - 19);
56299         var box2 = pad(woodRoadAddNode, padding2, context);
56300         reveal(box2, addNodeString, { duration: 0 });
56301       });
56302       context.history().on("change.intro", function(changed) {
56303         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56304           return continueTo(updateLine);
56305         }
56306         if (changed.created().length === 1) {
56307           timeout2(function() {
56308             continueTo(startDragEndpoint);
56309           }, 500);
56310         }
56311       });
56312       context.on("enter.intro", function(mode) {
56313         if (mode.id !== "select") {
56314           continueTo(updateLine);
56315         }
56316       });
56317       function continueTo(nextStep) {
56318         context.map().on("move.intro drawn.intro", null);
56319         context.history().on("change.intro", null);
56320         context.on("enter.intro", null);
56321         nextStep();
56322       }
56323     }
56324     function startDragEndpoint() {
56325       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56326         return continueTo(updateLine);
56327       }
56328       var padding = 100 * Math.pow(2, context.map().zoom() - 19);
56329       var box = pad(woodRoadDragEndpoint, padding, context);
56330       var startDragString = helpHtml("intro.lines.start_drag_endpoint" + (context.lastPointerType() === "mouse" ? "" : "_touch")) + helpHtml("intro.lines.drag_to_intersection");
56331       reveal(box, startDragString);
56332       context.map().on("move.intro drawn.intro", function() {
56333         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56334           return continueTo(updateLine);
56335         }
56336         var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
56337         var box2 = pad(woodRoadDragEndpoint, padding2, context);
56338         reveal(box2, startDragString, { duration: 0 });
56339         var entity = context.entity(woodRoadEndID);
56340         if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
56341           continueTo(finishDragEndpoint);
56342         }
56343       });
56344       function continueTo(nextStep) {
56345         context.map().on("move.intro drawn.intro", null);
56346         nextStep();
56347       }
56348     }
56349     function finishDragEndpoint() {
56350       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56351         return continueTo(updateLine);
56352       }
56353       var padding = 100 * Math.pow(2, context.map().zoom() - 19);
56354       var box = pad(woodRoadDragEndpoint, padding, context);
56355       var finishDragString = helpHtml("intro.lines.spot_looks_good") + helpHtml("intro.lines.finish_drag_endpoint" + (context.lastPointerType() === "mouse" ? "" : "_touch"));
56356       reveal(box, finishDragString);
56357       context.map().on("move.intro drawn.intro", function() {
56358         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56359           return continueTo(updateLine);
56360         }
56361         var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
56362         var box2 = pad(woodRoadDragEndpoint, padding2, context);
56363         reveal(box2, finishDragString, { duration: 0 });
56364         var entity = context.entity(woodRoadEndID);
56365         if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
56366           continueTo(startDragEndpoint);
56367         }
56368       });
56369       context.on("enter.intro", function() {
56370         continueTo(startDragMidpoint);
56371       });
56372       function continueTo(nextStep) {
56373         context.map().on("move.intro drawn.intro", null);
56374         context.on("enter.intro", null);
56375         nextStep();
56376       }
56377     }
56378     function startDragMidpoint() {
56379       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56380         return continueTo(updateLine);
56381       }
56382       if (context.selectedIDs().indexOf(woodRoadID) === -1) {
56383         context.enter(modeSelect(context, [woodRoadID]));
56384       }
56385       var padding = 80 * Math.pow(2, context.map().zoom() - 19);
56386       var box = pad(woodRoadDragMidpoint, padding, context);
56387       reveal(box, helpHtml("intro.lines.start_drag_midpoint"));
56388       context.map().on("move.intro drawn.intro", function() {
56389         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56390           return continueTo(updateLine);
56391         }
56392         var padding2 = 80 * Math.pow(2, context.map().zoom() - 19);
56393         var box2 = pad(woodRoadDragMidpoint, padding2, context);
56394         reveal(box2, helpHtml("intro.lines.start_drag_midpoint"), { duration: 0 });
56395       });
56396       context.history().on("change.intro", function(changed) {
56397         if (changed.created().length === 1) {
56398           continueTo(continueDragMidpoint);
56399         }
56400       });
56401       context.on("enter.intro", function(mode) {
56402         if (mode.id !== "select") {
56403           context.enter(modeSelect(context, [woodRoadID]));
56404         }
56405       });
56406       function continueTo(nextStep) {
56407         context.map().on("move.intro drawn.intro", null);
56408         context.history().on("change.intro", null);
56409         context.on("enter.intro", null);
56410         nextStep();
56411       }
56412     }
56413     function continueDragMidpoint() {
56414       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56415         return continueTo(updateLine);
56416       }
56417       var padding = 100 * Math.pow(2, context.map().zoom() - 19);
56418       var box = pad(woodRoadDragEndpoint, padding, context);
56419       box.height += 400;
56420       var advance = function() {
56421         context.history().checkpoint("doneUpdateLine");
56422         continueTo(deleteLines);
56423       };
56424       reveal(
56425         box,
56426         helpHtml("intro.lines.continue_drag_midpoint"),
56427         { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56428       );
56429       context.map().on("move.intro drawn.intro", function() {
56430         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56431           return continueTo(updateLine);
56432         }
56433         var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
56434         var box2 = pad(woodRoadDragEndpoint, padding2, context);
56435         box2.height += 400;
56436         reveal(
56437           box2,
56438           helpHtml("intro.lines.continue_drag_midpoint"),
56439           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
56440         );
56441       });
56442       function continueTo(nextStep) {
56443         context.map().on("move.intro drawn.intro", null);
56444         nextStep();
56445       }
56446     }
56447     function deleteLines() {
56448       context.history().reset("doneUpdateLine");
56449       context.enter(modeBrowse(context));
56450       if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56451         return chapter.restart();
56452       }
56453       var msec = transitionTime(deleteLinesLoc, context.map().center());
56454       if (msec) {
56455         reveal(null, null, { duration: 0 });
56456       }
56457       context.map().centerZoomEase(deleteLinesLoc, 18, msec);
56458       timeout2(function() {
56459         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56460         var box = pad(deleteLinesLoc, padding, context);
56461         box.top -= 200;
56462         box.height += 400;
56463         var advance = function() {
56464           continueTo(rightClickIntersection);
56465         };
56466         reveal(
56467           box,
56468           helpHtml("intro.lines.delete_lines", { street: _t("intro.graph.name.12th-avenue") }),
56469           { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56470         );
56471         context.map().on("move.intro drawn.intro", function() {
56472           var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
56473           var box2 = pad(deleteLinesLoc, padding2, context);
56474           box2.top -= 200;
56475           box2.height += 400;
56476           reveal(
56477             box2,
56478             helpHtml("intro.lines.delete_lines", { street: _t("intro.graph.name.12th-avenue") }),
56479             { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
56480           );
56481         });
56482         context.history().on("change.intro", function() {
56483           timeout2(function() {
56484             continueTo(deleteLines);
56485           }, 500);
56486         });
56487       }, msec + 100);
56488       function continueTo(nextStep) {
56489         context.map().on("move.intro drawn.intro", null);
56490         context.history().on("change.intro", null);
56491         nextStep();
56492       }
56493     }
56494     function rightClickIntersection() {
56495       context.history().reset("doneUpdateLine");
56496       context.enter(modeBrowse(context));
56497       context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
56498       var rightClickString = helpHtml("intro.lines.split_street", {
56499         street1: _t("intro.graph.name.11th-avenue"),
56500         street2: _t("intro.graph.name.washington-street")
56501       }) + helpHtml("intro.lines." + (context.lastPointerType() === "mouse" ? "rightclick_intersection" : "edit_menu_intersection_touch"));
56502       timeout2(function() {
56503         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
56504         var box = pad(eleventhAvenueEnd, padding, context);
56505         reveal(box, rightClickString);
56506         context.map().on("move.intro drawn.intro", function() {
56507           var padding2 = 60 * Math.pow(2, context.map().zoom() - 18);
56508           var box2 = pad(eleventhAvenueEnd, padding2, context);
56509           reveal(
56510             box2,
56511             rightClickString,
56512             { duration: 0 }
56513           );
56514         });
56515         context.on("enter.intro", function(mode) {
56516           if (mode.id !== "select")
56517             return;
56518           var ids = context.selectedIDs();
56519           if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID)
56520             return;
56521           timeout2(function() {
56522             var node = selectMenuItem(context, "split").node();
56523             if (!node)
56524               return;
56525             continueTo(splitIntersection);
56526           }, 50);
56527         });
56528         context.history().on("change.intro", function() {
56529           timeout2(function() {
56530             continueTo(deleteLines);
56531           }, 300);
56532         });
56533       }, 600);
56534       function continueTo(nextStep) {
56535         context.map().on("move.intro drawn.intro", null);
56536         context.on("enter.intro", null);
56537         context.history().on("change.intro", null);
56538         nextStep();
56539       }
56540     }
56541     function splitIntersection() {
56542       if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56543         return continueTo(deleteLines);
56544       }
56545       var node = selectMenuItem(context, "split").node();
56546       if (!node) {
56547         return continueTo(rightClickIntersection);
56548       }
56549       var wasChanged = false;
56550       _washingtonSegmentID = null;
56551       reveal(
56552         ".edit-menu",
56553         helpHtml(
56554           "intro.lines.split_intersection",
56555           { street: _t("intro.graph.name.washington-street") }
56556         ),
56557         { padding: 50 }
56558       );
56559       context.map().on("move.intro drawn.intro", function() {
56560         var node2 = selectMenuItem(context, "split").node();
56561         if (!wasChanged && !node2) {
56562           return continueTo(rightClickIntersection);
56563         }
56564         reveal(
56565           ".edit-menu",
56566           helpHtml(
56567             "intro.lines.split_intersection",
56568             { street: _t("intro.graph.name.washington-street") }
56569           ),
56570           { duration: 0, padding: 50 }
56571         );
56572       });
56573       context.history().on("change.intro", function(changed) {
56574         wasChanged = true;
56575         timeout2(function() {
56576           if (context.history().undoAnnotation() === _t("operations.split.annotation.line", { n: 1 })) {
56577             _washingtonSegmentID = changed.created()[0].id;
56578             continueTo(didSplit);
56579           } else {
56580             _washingtonSegmentID = null;
56581             continueTo(retrySplit);
56582           }
56583         }, 300);
56584       });
56585       function continueTo(nextStep) {
56586         context.map().on("move.intro drawn.intro", null);
56587         context.history().on("change.intro", null);
56588         nextStep();
56589       }
56590     }
56591     function retrySplit() {
56592       context.enter(modeBrowse(context));
56593       context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
56594       var advance = function() {
56595         continueTo(rightClickIntersection);
56596       };
56597       var padding = 60 * Math.pow(2, context.map().zoom() - 18);
56598       var box = pad(eleventhAvenueEnd, padding, context);
56599       reveal(
56600         box,
56601         helpHtml("intro.lines.retry_split"),
56602         { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56603       );
56604       context.map().on("move.intro drawn.intro", function() {
56605         var padding2 = 60 * Math.pow(2, context.map().zoom() - 18);
56606         var box2 = pad(eleventhAvenueEnd, padding2, context);
56607         reveal(
56608           box2,
56609           helpHtml("intro.lines.retry_split"),
56610           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
56611         );
56612       });
56613       function continueTo(nextStep) {
56614         context.map().on("move.intro drawn.intro", null);
56615         nextStep();
56616       }
56617     }
56618     function didSplit() {
56619       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56620         return continueTo(rightClickIntersection);
56621       }
56622       var ids = context.selectedIDs();
56623       var string = "intro.lines.did_split_" + (ids.length > 1 ? "multi" : "single");
56624       var street = _t("intro.graph.name.washington-street");
56625       var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56626       var box = pad(twelfthAvenue, padding, context);
56627       box.width = box.width / 2;
56628       reveal(
56629         box,
56630         helpHtml(string, { street1: street, street2: street }),
56631         { duration: 500 }
56632       );
56633       timeout2(function() {
56634         context.map().centerZoomEase(twelfthAvenue, 18, 500);
56635         context.map().on("move.intro drawn.intro", function() {
56636           var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
56637           var box2 = pad(twelfthAvenue, padding2, context);
56638           box2.width = box2.width / 2;
56639           reveal(
56640             box2,
56641             helpHtml(string, { street1: street, street2: street }),
56642             { duration: 0 }
56643           );
56644         });
56645       }, 600);
56646       context.on("enter.intro", function() {
56647         var ids2 = context.selectedIDs();
56648         if (ids2.length === 1 && ids2[0] === _washingtonSegmentID) {
56649           continueTo(multiSelect);
56650         }
56651       });
56652       context.history().on("change.intro", function() {
56653         if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56654           return continueTo(rightClickIntersection);
56655         }
56656       });
56657       function continueTo(nextStep) {
56658         context.map().on("move.intro drawn.intro", null);
56659         context.on("enter.intro", null);
56660         context.history().on("change.intro", null);
56661         nextStep();
56662       }
56663     }
56664     function multiSelect() {
56665       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56666         return continueTo(rightClickIntersection);
56667       }
56668       var ids = context.selectedIDs();
56669       var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
56670       var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
56671       if (hasWashington && hasTwelfth) {
56672         return continueTo(multiRightClick);
56673       } else if (!hasWashington && !hasTwelfth) {
56674         return continueTo(didSplit);
56675       }
56676       context.map().centerZoomEase(twelfthAvenue, 18, 500);
56677       timeout2(function() {
56678         var selected, other, padding, box;
56679         if (hasWashington) {
56680           selected = _t("intro.graph.name.washington-street");
56681           other = _t("intro.graph.name.12th-avenue");
56682           padding = 60 * Math.pow(2, context.map().zoom() - 18);
56683           box = pad(twelfthAvenueEnd, padding, context);
56684           box.width *= 3;
56685         } else {
56686           selected = _t("intro.graph.name.12th-avenue");
56687           other = _t("intro.graph.name.washington-street");
56688           padding = 200 * Math.pow(2, context.map().zoom() - 18);
56689           box = pad(twelfthAvenue, padding, context);
56690           box.width /= 2;
56691         }
56692         reveal(
56693           box,
56694           helpHtml(
56695             "intro.lines.multi_select",
56696             { selected, other1: other }
56697           ) + " " + helpHtml(
56698             "intro.lines.add_to_selection_" + (context.lastPointerType() === "mouse" ? "click" : "touch"),
56699             { selected, other2: other }
56700           )
56701         );
56702         context.map().on("move.intro drawn.intro", function() {
56703           if (hasWashington) {
56704             selected = _t("intro.graph.name.washington-street");
56705             other = _t("intro.graph.name.12th-avenue");
56706             padding = 60 * Math.pow(2, context.map().zoom() - 18);
56707             box = pad(twelfthAvenueEnd, padding, context);
56708             box.width *= 3;
56709           } else {
56710             selected = _t("intro.graph.name.12th-avenue");
56711             other = _t("intro.graph.name.washington-street");
56712             padding = 200 * Math.pow(2, context.map().zoom() - 18);
56713             box = pad(twelfthAvenue, padding, context);
56714             box.width /= 2;
56715           }
56716           reveal(
56717             box,
56718             helpHtml(
56719               "intro.lines.multi_select",
56720               { selected, other1: other }
56721             ) + " " + helpHtml(
56722               "intro.lines.add_to_selection_" + (context.lastPointerType() === "mouse" ? "click" : "touch"),
56723               { selected, other2: other }
56724             ),
56725             { duration: 0 }
56726           );
56727         });
56728         context.on("enter.intro", function() {
56729           continueTo(multiSelect);
56730         });
56731         context.history().on("change.intro", function() {
56732           if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56733             return continueTo(rightClickIntersection);
56734           }
56735         });
56736       }, 600);
56737       function continueTo(nextStep) {
56738         context.map().on("move.intro drawn.intro", null);
56739         context.on("enter.intro", null);
56740         context.history().on("change.intro", null);
56741         nextStep();
56742       }
56743     }
56744     function multiRightClick() {
56745       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56746         return continueTo(rightClickIntersection);
56747       }
56748       var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56749       var box = pad(twelfthAvenue, padding, context);
56750       var rightClickString = helpHtml("intro.lines.multi_select_success") + helpHtml("intro.lines.multi_" + (context.lastPointerType() === "mouse" ? "rightclick" : "edit_menu_touch"));
56751       reveal(box, rightClickString);
56752       context.map().on("move.intro drawn.intro", function() {
56753         var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
56754         var box2 = pad(twelfthAvenue, padding2, context);
56755         reveal(box2, rightClickString, { duration: 0 });
56756       });
56757       context.ui().editMenu().on("toggled.intro", function(open) {
56758         if (!open)
56759           return;
56760         timeout2(function() {
56761           var ids = context.selectedIDs();
56762           if (ids.length === 2 && ids.indexOf(twelfthAvenueID) !== -1 && ids.indexOf(_washingtonSegmentID) !== -1) {
56763             var node = selectMenuItem(context, "delete").node();
56764             if (!node)
56765               return;
56766             continueTo(multiDelete);
56767           } else if (ids.length === 1 && ids.indexOf(_washingtonSegmentID) !== -1) {
56768             return continueTo(multiSelect);
56769           } else {
56770             return continueTo(didSplit);
56771           }
56772         }, 300);
56773       });
56774       context.history().on("change.intro", function() {
56775         if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56776           return continueTo(rightClickIntersection);
56777         }
56778       });
56779       function continueTo(nextStep) {
56780         context.map().on("move.intro drawn.intro", null);
56781         context.ui().editMenu().on("toggled.intro", null);
56782         context.history().on("change.intro", null);
56783         nextStep();
56784       }
56785     }
56786     function multiDelete() {
56787       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56788         return continueTo(rightClickIntersection);
56789       }
56790       var node = selectMenuItem(context, "delete").node();
56791       if (!node)
56792         return continueTo(multiRightClick);
56793       reveal(
56794         ".edit-menu",
56795         helpHtml("intro.lines.multi_delete"),
56796         { padding: 50 }
56797       );
56798       context.map().on("move.intro drawn.intro", function() {
56799         reveal(
56800           ".edit-menu",
56801           helpHtml("intro.lines.multi_delete"),
56802           { duration: 0, padding: 50 }
56803         );
56804       });
56805       context.on("exit.intro", function() {
56806         if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
56807           return continueTo(multiSelect);
56808         }
56809       });
56810       context.history().on("change.intro", function() {
56811         if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
56812           continueTo(retryDelete);
56813         } else {
56814           continueTo(play);
56815         }
56816       });
56817       function continueTo(nextStep) {
56818         context.map().on("move.intro drawn.intro", null);
56819         context.on("exit.intro", null);
56820         context.history().on("change.intro", null);
56821         nextStep();
56822       }
56823     }
56824     function retryDelete() {
56825       context.enter(modeBrowse(context));
56826       var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56827       var box = pad(twelfthAvenue, padding, context);
56828       reveal(box, helpHtml("intro.lines.retry_delete"), {
56829         buttonText: _t.html("intro.ok"),
56830         buttonCallback: function() {
56831           continueTo(multiSelect);
56832         }
56833       });
56834       function continueTo(nextStep) {
56835         nextStep();
56836       }
56837     }
56838     function play() {
56839       dispatch10.call("done");
56840       reveal(
56841         ".ideditor",
56842         helpHtml("intro.lines.play", { next: _t("intro.buildings.title") }),
56843         {
56844           tooltipBox: ".intro-nav-wrap .chapter-building",
56845           buttonText: _t.html("intro.ok"),
56846           buttonCallback: function() {
56847             reveal(".ideditor");
56848           }
56849         }
56850       );
56851     }
56852     chapter.enter = function() {
56853       addLine();
56854     };
56855     chapter.exit = function() {
56856       timeouts.forEach(window.clearTimeout);
56857       select_default2(window).on("pointerdown.intro mousedown.intro", null, true);
56858       context.on("enter.intro exit.intro", null);
56859       context.map().on("move.intro drawn.intro", null);
56860       context.history().on("change.intro", null);
56861       context.container().select(".inspector-wrap").on("wheel.intro", null);
56862       context.container().select(".preset-list-button").on("click.intro", null);
56863     };
56864     chapter.restart = function() {
56865       chapter.exit();
56866       chapter.enter();
56867     };
56868     return utilRebind(chapter, dispatch10, "on");
56869   }
56870
56871   // modules/ui/intro/building.js
56872   function uiIntroBuilding(context, reveal) {
56873     var dispatch10 = dispatch_default("done");
56874     var house = [-85.62815, 41.95638];
56875     var tank = [-85.62732, 41.95347];
56876     var buildingCatetory = _mainPresetIndex.item("category-building");
56877     var housePreset = _mainPresetIndex.item("building/house");
56878     var tankPreset = _mainPresetIndex.item("man_made/storage_tank");
56879     var timeouts = [];
56880     var _houseID = null;
56881     var _tankID = null;
56882     var chapter = {
56883       title: "intro.buildings.title"
56884     };
56885     function timeout2(f2, t) {
56886       timeouts.push(window.setTimeout(f2, t));
56887     }
56888     function eventCancel(d3_event) {
56889       d3_event.stopPropagation();
56890       d3_event.preventDefault();
56891     }
56892     function revealHouse(center, text2, options2) {
56893       var padding = 160 * Math.pow(2, context.map().zoom() - 20);
56894       var box = pad(center, padding, context);
56895       reveal(box, text2, options2);
56896     }
56897     function revealTank(center, text2, options2) {
56898       var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
56899       var box = pad(center, padding, context);
56900       reveal(box, text2, options2);
56901     }
56902     function addHouse() {
56903       context.enter(modeBrowse(context));
56904       context.history().reset("initial");
56905       _houseID = null;
56906       var msec = transitionTime(house, context.map().center());
56907       if (msec) {
56908         reveal(null, null, { duration: 0 });
56909       }
56910       context.map().centerZoomEase(house, 19, msec);
56911       timeout2(function() {
56912         var tooltip = reveal(
56913           "button.add-area",
56914           helpHtml("intro.buildings.add_building")
56915         );
56916         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-buildings");
56917         context.on("enter.intro", function(mode) {
56918           if (mode.id !== "add-area")
56919             return;
56920           continueTo(startHouse);
56921         });
56922       }, msec + 100);
56923       function continueTo(nextStep) {
56924         context.on("enter.intro", null);
56925         nextStep();
56926       }
56927     }
56928     function startHouse() {
56929       if (context.mode().id !== "add-area") {
56930         return continueTo(addHouse);
56931       }
56932       _houseID = null;
56933       context.map().zoomEase(20, 500);
56934       timeout2(function() {
56935         var startString = helpHtml("intro.buildings.start_building") + helpHtml("intro.buildings.building_corner_" + (context.lastPointerType() === "mouse" ? "click" : "tap"));
56936         revealHouse(house, startString);
56937         context.map().on("move.intro drawn.intro", function() {
56938           revealHouse(house, startString, { duration: 0 });
56939         });
56940         context.on("enter.intro", function(mode) {
56941           if (mode.id !== "draw-area")
56942             return chapter.restart();
56943           continueTo(continueHouse);
56944         });
56945       }, 550);
56946       function continueTo(nextStep) {
56947         context.map().on("move.intro drawn.intro", null);
56948         context.on("enter.intro", null);
56949         nextStep();
56950       }
56951     }
56952     function continueHouse() {
56953       if (context.mode().id !== "draw-area") {
56954         return continueTo(addHouse);
56955       }
56956       _houseID = null;
56957       var continueString = helpHtml("intro.buildings.continue_building") + "{br}" + helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.buildings.finish_building");
56958       revealHouse(house, continueString);
56959       context.map().on("move.intro drawn.intro", function() {
56960         revealHouse(house, continueString, { duration: 0 });
56961       });
56962       context.on("enter.intro", function(mode) {
56963         if (mode.id === "draw-area") {
56964           return;
56965         } else if (mode.id === "select") {
56966           var graph = context.graph();
56967           var way = context.entity(context.selectedIDs()[0]);
56968           var nodes = graph.childNodes(way);
56969           var points = utilArrayUniq(nodes).map(function(n2) {
56970             return context.projection(n2.loc);
56971           });
56972           if (isMostlySquare(points)) {
56973             _houseID = way.id;
56974             return continueTo(chooseCategoryBuilding);
56975           } else {
56976             return continueTo(retryHouse);
56977           }
56978         } else {
56979           return chapter.restart();
56980         }
56981       });
56982       function continueTo(nextStep) {
56983         context.map().on("move.intro drawn.intro", null);
56984         context.on("enter.intro", null);
56985         nextStep();
56986       }
56987     }
56988     function retryHouse() {
56989       var onClick = function() {
56990         continueTo(addHouse);
56991       };
56992       revealHouse(
56993         house,
56994         helpHtml("intro.buildings.retry_building"),
56995         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
56996       );
56997       context.map().on("move.intro drawn.intro", function() {
56998         revealHouse(
56999           house,
57000           helpHtml("intro.buildings.retry_building"),
57001           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
57002         );
57003       });
57004       function continueTo(nextStep) {
57005         context.map().on("move.intro drawn.intro", null);
57006         nextStep();
57007       }
57008     }
57009     function chooseCategoryBuilding() {
57010       if (!_houseID || !context.hasEntity(_houseID)) {
57011         return addHouse();
57012       }
57013       var ids = context.selectedIDs();
57014       if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
57015         context.enter(modeSelect(context, [_houseID]));
57016       }
57017       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57018       timeout2(function() {
57019         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57020         var button = context.container().select(".preset-category-building .preset-list-button");
57021         reveal(
57022           button.node(),
57023           helpHtml("intro.buildings.choose_category_building", { category: buildingCatetory.name() })
57024         );
57025         button.on("click.intro", function() {
57026           button.on("click.intro", null);
57027           continueTo(choosePresetHouse);
57028         });
57029       }, 400);
57030       context.on("enter.intro", function(mode) {
57031         if (!_houseID || !context.hasEntity(_houseID)) {
57032           return continueTo(addHouse);
57033         }
57034         var ids2 = context.selectedIDs();
57035         if (mode.id !== "select" || !ids2.length || ids2[0] !== _houseID) {
57036           return continueTo(chooseCategoryBuilding);
57037         }
57038       });
57039       function continueTo(nextStep) {
57040         context.container().select(".inspector-wrap").on("wheel.intro", null);
57041         context.container().select(".preset-list-button").on("click.intro", null);
57042         context.on("enter.intro", null);
57043         nextStep();
57044       }
57045     }
57046     function choosePresetHouse() {
57047       if (!_houseID || !context.hasEntity(_houseID)) {
57048         return addHouse();
57049       }
57050       var ids = context.selectedIDs();
57051       if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
57052         context.enter(modeSelect(context, [_houseID]));
57053       }
57054       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57055       timeout2(function() {
57056         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57057         var button = context.container().select(".preset-building-house .preset-list-button");
57058         reveal(
57059           button.node(),
57060           helpHtml("intro.buildings.choose_preset_house", { preset: housePreset.name() }),
57061           { duration: 300 }
57062         );
57063         button.on("click.intro", function() {
57064           button.on("click.intro", null);
57065           continueTo(closeEditorHouse);
57066         });
57067       }, 400);
57068       context.on("enter.intro", function(mode) {
57069         if (!_houseID || !context.hasEntity(_houseID)) {
57070           return continueTo(addHouse);
57071         }
57072         var ids2 = context.selectedIDs();
57073         if (mode.id !== "select" || !ids2.length || ids2[0] !== _houseID) {
57074           return continueTo(chooseCategoryBuilding);
57075         }
57076       });
57077       function continueTo(nextStep) {
57078         context.container().select(".inspector-wrap").on("wheel.intro", null);
57079         context.container().select(".preset-list-button").on("click.intro", null);
57080         context.on("enter.intro", null);
57081         nextStep();
57082       }
57083     }
57084     function closeEditorHouse() {
57085       if (!_houseID || !context.hasEntity(_houseID)) {
57086         return addHouse();
57087       }
57088       var ids = context.selectedIDs();
57089       if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
57090         context.enter(modeSelect(context, [_houseID]));
57091       }
57092       context.history().checkpoint("hasHouse");
57093       context.on("exit.intro", function() {
57094         continueTo(rightClickHouse);
57095       });
57096       timeout2(function() {
57097         reveal(
57098           ".entity-editor-pane",
57099           helpHtml("intro.buildings.close", { button: { html: icon("#iD-icon-close", "inline") } })
57100         );
57101       }, 500);
57102       function continueTo(nextStep) {
57103         context.on("exit.intro", null);
57104         nextStep();
57105       }
57106     }
57107     function rightClickHouse() {
57108       if (!_houseID)
57109         return chapter.restart();
57110       context.enter(modeBrowse(context));
57111       context.history().reset("hasHouse");
57112       var zoom = context.map().zoom();
57113       if (zoom < 20) {
57114         zoom = 20;
57115       }
57116       context.map().centerZoomEase(house, zoom, 500);
57117       context.on("enter.intro", function(mode) {
57118         if (mode.id !== "select")
57119           return;
57120         var ids = context.selectedIDs();
57121         if (ids.length !== 1 || ids[0] !== _houseID)
57122           return;
57123         timeout2(function() {
57124           var node = selectMenuItem(context, "orthogonalize").node();
57125           if (!node)
57126             return;
57127           continueTo(clickSquare);
57128         }, 50);
57129       });
57130       context.map().on("move.intro drawn.intro", function() {
57131         var rightclickString = helpHtml("intro.buildings." + (context.lastPointerType() === "mouse" ? "rightclick_building" : "edit_menu_building_touch"));
57132         revealHouse(house, rightclickString, { duration: 0 });
57133       });
57134       context.history().on("change.intro", function() {
57135         continueTo(rightClickHouse);
57136       });
57137       function continueTo(nextStep) {
57138         context.on("enter.intro", null);
57139         context.map().on("move.intro drawn.intro", null);
57140         context.history().on("change.intro", null);
57141         nextStep();
57142       }
57143     }
57144     function clickSquare() {
57145       if (!_houseID)
57146         return chapter.restart();
57147       var entity = context.hasEntity(_houseID);
57148       if (!entity)
57149         return continueTo(rightClickHouse);
57150       var node = selectMenuItem(context, "orthogonalize").node();
57151       if (!node) {
57152         return continueTo(rightClickHouse);
57153       }
57154       var wasChanged = false;
57155       reveal(
57156         ".edit-menu",
57157         helpHtml("intro.buildings.square_building"),
57158         { padding: 50 }
57159       );
57160       context.on("enter.intro", function(mode) {
57161         if (mode.id === "browse") {
57162           continueTo(rightClickHouse);
57163         } else if (mode.id === "move" || mode.id === "rotate") {
57164           continueTo(retryClickSquare);
57165         }
57166       });
57167       context.map().on("move.intro", function() {
57168         var node2 = selectMenuItem(context, "orthogonalize").node();
57169         if (!wasChanged && !node2) {
57170           return continueTo(rightClickHouse);
57171         }
57172         reveal(
57173           ".edit-menu",
57174           helpHtml("intro.buildings.square_building"),
57175           { duration: 0, padding: 50 }
57176         );
57177       });
57178       context.history().on("change.intro", function() {
57179         wasChanged = true;
57180         context.history().on("change.intro", null);
57181         timeout2(function() {
57182           if (context.history().undoAnnotation() === _t("operations.orthogonalize.annotation.feature", { n: 1 })) {
57183             continueTo(doneSquare);
57184           } else {
57185             continueTo(retryClickSquare);
57186           }
57187         }, 500);
57188       });
57189       function continueTo(nextStep) {
57190         context.on("enter.intro", null);
57191         context.map().on("move.intro", null);
57192         context.history().on("change.intro", null);
57193         nextStep();
57194       }
57195     }
57196     function retryClickSquare() {
57197       context.enter(modeBrowse(context));
57198       revealHouse(house, helpHtml("intro.buildings.retry_square"), {
57199         buttonText: _t.html("intro.ok"),
57200         buttonCallback: function() {
57201           continueTo(rightClickHouse);
57202         }
57203       });
57204       function continueTo(nextStep) {
57205         nextStep();
57206       }
57207     }
57208     function doneSquare() {
57209       context.history().checkpoint("doneSquare");
57210       revealHouse(house, helpHtml("intro.buildings.done_square"), {
57211         buttonText: _t.html("intro.ok"),
57212         buttonCallback: function() {
57213           continueTo(addTank);
57214         }
57215       });
57216       function continueTo(nextStep) {
57217         nextStep();
57218       }
57219     }
57220     function addTank() {
57221       context.enter(modeBrowse(context));
57222       context.history().reset("doneSquare");
57223       _tankID = null;
57224       var msec = transitionTime(tank, context.map().center());
57225       if (msec) {
57226         reveal(null, null, { duration: 0 });
57227       }
57228       context.map().centerZoomEase(tank, 19.5, msec);
57229       timeout2(function() {
57230         reveal(
57231           "button.add-area",
57232           helpHtml("intro.buildings.add_tank")
57233         );
57234         context.on("enter.intro", function(mode) {
57235           if (mode.id !== "add-area")
57236             return;
57237           continueTo(startTank);
57238         });
57239       }, msec + 100);
57240       function continueTo(nextStep) {
57241         context.on("enter.intro", null);
57242         nextStep();
57243       }
57244     }
57245     function startTank() {
57246       if (context.mode().id !== "add-area") {
57247         return continueTo(addTank);
57248       }
57249       _tankID = null;
57250       timeout2(function() {
57251         var startString = helpHtml("intro.buildings.start_tank") + helpHtml("intro.buildings.tank_edge_" + (context.lastPointerType() === "mouse" ? "click" : "tap"));
57252         revealTank(tank, startString);
57253         context.map().on("move.intro drawn.intro", function() {
57254           revealTank(tank, startString, { duration: 0 });
57255         });
57256         context.on("enter.intro", function(mode) {
57257           if (mode.id !== "draw-area")
57258             return chapter.restart();
57259           continueTo(continueTank);
57260         });
57261       }, 550);
57262       function continueTo(nextStep) {
57263         context.map().on("move.intro drawn.intro", null);
57264         context.on("enter.intro", null);
57265         nextStep();
57266       }
57267     }
57268     function continueTank() {
57269       if (context.mode().id !== "draw-area") {
57270         return continueTo(addTank);
57271       }
57272       _tankID = null;
57273       var continueString = helpHtml("intro.buildings.continue_tank") + "{br}" + helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.buildings.finish_tank");
57274       revealTank(tank, continueString);
57275       context.map().on("move.intro drawn.intro", function() {
57276         revealTank(tank, continueString, { duration: 0 });
57277       });
57278       context.on("enter.intro", function(mode) {
57279         if (mode.id === "draw-area") {
57280           return;
57281         } else if (mode.id === "select") {
57282           _tankID = context.selectedIDs()[0];
57283           return continueTo(searchPresetTank);
57284         } else {
57285           return continueTo(addTank);
57286         }
57287       });
57288       function continueTo(nextStep) {
57289         context.map().on("move.intro drawn.intro", null);
57290         context.on("enter.intro", null);
57291         nextStep();
57292       }
57293     }
57294     function searchPresetTank() {
57295       if (!_tankID || !context.hasEntity(_tankID)) {
57296         return addTank();
57297       }
57298       var ids = context.selectedIDs();
57299       if (context.mode().id !== "select" || !ids.length || ids[0] !== _tankID) {
57300         context.enter(modeSelect(context, [_tankID]));
57301       }
57302       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57303       timeout2(function() {
57304         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57305         context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
57306         reveal(
57307           ".preset-search-input",
57308           helpHtml("intro.buildings.search_tank", { preset: tankPreset.name() })
57309         );
57310       }, 400);
57311       context.on("enter.intro", function(mode) {
57312         if (!_tankID || !context.hasEntity(_tankID)) {
57313           return continueTo(addTank);
57314         }
57315         var ids2 = context.selectedIDs();
57316         if (mode.id !== "select" || !ids2.length || ids2[0] !== _tankID) {
57317           context.enter(modeSelect(context, [_tankID]));
57318           context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57319           context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57320           context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
57321           reveal(
57322             ".preset-search-input",
57323             helpHtml("intro.buildings.search_tank", { preset: tankPreset.name() })
57324           );
57325           context.history().on("change.intro", null);
57326         }
57327       });
57328       function checkPresetSearch() {
57329         var first = context.container().select(".preset-list-item:first-child");
57330         if (first.classed("preset-man_made-storage_tank")) {
57331           reveal(
57332             first.select(".preset-list-button").node(),
57333             helpHtml("intro.buildings.choose_tank", { preset: tankPreset.name() }),
57334             { duration: 300 }
57335           );
57336           context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
57337           context.history().on("change.intro", function() {
57338             continueTo(closeEditorTank);
57339           });
57340         }
57341       }
57342       function continueTo(nextStep) {
57343         context.container().select(".inspector-wrap").on("wheel.intro", null);
57344         context.on("enter.intro", null);
57345         context.history().on("change.intro", null);
57346         context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
57347         nextStep();
57348       }
57349     }
57350     function closeEditorTank() {
57351       if (!_tankID || !context.hasEntity(_tankID)) {
57352         return addTank();
57353       }
57354       var ids = context.selectedIDs();
57355       if (context.mode().id !== "select" || !ids.length || ids[0] !== _tankID) {
57356         context.enter(modeSelect(context, [_tankID]));
57357       }
57358       context.history().checkpoint("hasTank");
57359       context.on("exit.intro", function() {
57360         continueTo(rightClickTank);
57361       });
57362       timeout2(function() {
57363         reveal(
57364           ".entity-editor-pane",
57365           helpHtml("intro.buildings.close", { button: { html: icon("#iD-icon-close", "inline") } })
57366         );
57367       }, 500);
57368       function continueTo(nextStep) {
57369         context.on("exit.intro", null);
57370         nextStep();
57371       }
57372     }
57373     function rightClickTank() {
57374       if (!_tankID)
57375         return continueTo(addTank);
57376       context.enter(modeBrowse(context));
57377       context.history().reset("hasTank");
57378       context.map().centerEase(tank, 500);
57379       timeout2(function() {
57380         context.on("enter.intro", function(mode) {
57381           if (mode.id !== "select")
57382             return;
57383           var ids = context.selectedIDs();
57384           if (ids.length !== 1 || ids[0] !== _tankID)
57385             return;
57386           timeout2(function() {
57387             var node = selectMenuItem(context, "circularize").node();
57388             if (!node)
57389               return;
57390             continueTo(clickCircle);
57391           }, 50);
57392         });
57393         var rightclickString = helpHtml("intro.buildings." + (context.lastPointerType() === "mouse" ? "rightclick_tank" : "edit_menu_tank_touch"));
57394         revealTank(tank, rightclickString);
57395         context.map().on("move.intro drawn.intro", function() {
57396           revealTank(tank, rightclickString, { duration: 0 });
57397         });
57398         context.history().on("change.intro", function() {
57399           continueTo(rightClickTank);
57400         });
57401       }, 600);
57402       function continueTo(nextStep) {
57403         context.on("enter.intro", null);
57404         context.map().on("move.intro drawn.intro", null);
57405         context.history().on("change.intro", null);
57406         nextStep();
57407       }
57408     }
57409     function clickCircle() {
57410       if (!_tankID)
57411         return chapter.restart();
57412       var entity = context.hasEntity(_tankID);
57413       if (!entity)
57414         return continueTo(rightClickTank);
57415       var node = selectMenuItem(context, "circularize").node();
57416       if (!node) {
57417         return continueTo(rightClickTank);
57418       }
57419       var wasChanged = false;
57420       reveal(
57421         ".edit-menu",
57422         helpHtml("intro.buildings.circle_tank"),
57423         { padding: 50 }
57424       );
57425       context.on("enter.intro", function(mode) {
57426         if (mode.id === "browse") {
57427           continueTo(rightClickTank);
57428         } else if (mode.id === "move" || mode.id === "rotate") {
57429           continueTo(retryClickCircle);
57430         }
57431       });
57432       context.map().on("move.intro", function() {
57433         var node2 = selectMenuItem(context, "circularize").node();
57434         if (!wasChanged && !node2) {
57435           return continueTo(rightClickTank);
57436         }
57437         reveal(
57438           ".edit-menu",
57439           helpHtml("intro.buildings.circle_tank"),
57440           { duration: 0, padding: 50 }
57441         );
57442       });
57443       context.history().on("change.intro", function() {
57444         wasChanged = true;
57445         context.history().on("change.intro", null);
57446         timeout2(function() {
57447           if (context.history().undoAnnotation() === _t("operations.circularize.annotation.feature", { n: 1 })) {
57448             continueTo(play);
57449           } else {
57450             continueTo(retryClickCircle);
57451           }
57452         }, 500);
57453       });
57454       function continueTo(nextStep) {
57455         context.on("enter.intro", null);
57456         context.map().on("move.intro", null);
57457         context.history().on("change.intro", null);
57458         nextStep();
57459       }
57460     }
57461     function retryClickCircle() {
57462       context.enter(modeBrowse(context));
57463       revealTank(tank, helpHtml("intro.buildings.retry_circle"), {
57464         buttonText: _t.html("intro.ok"),
57465         buttonCallback: function() {
57466           continueTo(rightClickTank);
57467         }
57468       });
57469       function continueTo(nextStep) {
57470         nextStep();
57471       }
57472     }
57473     function play() {
57474       dispatch10.call("done");
57475       reveal(
57476         ".ideditor",
57477         helpHtml("intro.buildings.play", { next: _t("intro.startediting.title") }),
57478         {
57479           tooltipBox: ".intro-nav-wrap .chapter-startEditing",
57480           buttonText: _t.html("intro.ok"),
57481           buttonCallback: function() {
57482             reveal(".ideditor");
57483           }
57484         }
57485       );
57486     }
57487     chapter.enter = function() {
57488       addHouse();
57489     };
57490     chapter.exit = function() {
57491       timeouts.forEach(window.clearTimeout);
57492       context.on("enter.intro exit.intro", null);
57493       context.map().on("move.intro drawn.intro", null);
57494       context.history().on("change.intro", null);
57495       context.container().select(".inspector-wrap").on("wheel.intro", null);
57496       context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
57497       context.container().select(".more-fields .combobox-input").on("click.intro", null);
57498     };
57499     chapter.restart = function() {
57500       chapter.exit();
57501       chapter.enter();
57502     };
57503     return utilRebind(chapter, dispatch10, "on");
57504   }
57505
57506   // modules/ui/intro/start_editing.js
57507   function uiIntroStartEditing(context, reveal) {
57508     var dispatch10 = dispatch_default("done", "startEditing");
57509     var modalSelection = select_default2(null);
57510     var chapter = {
57511       title: "intro.startediting.title"
57512     };
57513     function showHelp() {
57514       reveal(
57515         ".map-control.help-control",
57516         helpHtml("intro.startediting.help"),
57517         {
57518           buttonText: _t.html("intro.ok"),
57519           buttonCallback: function() {
57520             shortcuts();
57521           }
57522         }
57523       );
57524     }
57525     function shortcuts() {
57526       reveal(
57527         ".map-control.help-control",
57528         helpHtml("intro.startediting.shortcuts"),
57529         {
57530           buttonText: _t.html("intro.ok"),
57531           buttonCallback: function() {
57532             showSave();
57533           }
57534         }
57535       );
57536     }
57537     function showSave() {
57538       context.container().selectAll(".shaded").remove();
57539       reveal(
57540         ".top-toolbar button.save",
57541         helpHtml("intro.startediting.save"),
57542         {
57543           buttonText: _t.html("intro.ok"),
57544           buttonCallback: function() {
57545             showStart();
57546           }
57547         }
57548       );
57549     }
57550     function showStart() {
57551       context.container().selectAll(".shaded").remove();
57552       modalSelection = uiModal(context.container());
57553       modalSelection.select(".modal").attr("class", "modal-splash modal");
57554       modalSelection.selectAll(".close").remove();
57555       var startbutton = modalSelection.select(".content").attr("class", "fillL").append("button").attr("class", "modal-section huge-modal-button").on("click", function() {
57556         modalSelection.remove();
57557       });
57558       startbutton.append("svg").attr("class", "illustration").append("use").attr("xlink:href", "#iD-logo-walkthrough");
57559       startbutton.append("h2").call(_t.append("intro.startediting.start"));
57560       dispatch10.call("startEditing");
57561     }
57562     chapter.enter = function() {
57563       showHelp();
57564     };
57565     chapter.exit = function() {
57566       modalSelection.remove();
57567       context.container().selectAll(".shaded").remove();
57568     };
57569     return utilRebind(chapter, dispatch10, "on");
57570   }
57571
57572   // modules/ui/intro/intro.js
57573   var chapterUi = {
57574     welcome: uiIntroWelcome,
57575     navigation: uiIntroNavigation,
57576     point: uiIntroPoint,
57577     area: uiIntroArea,
57578     line: uiIntroLine,
57579     building: uiIntroBuilding,
57580     startEditing: uiIntroStartEditing
57581   };
57582   var chapterFlow = [
57583     "welcome",
57584     "navigation",
57585     "point",
57586     "area",
57587     "line",
57588     "building",
57589     "startEditing"
57590   ];
57591   function uiIntro(context) {
57592     const INTRO_IMAGERY = "EsriWorldImageryClarity";
57593     let _introGraph = {};
57594     let _currChapter;
57595     function intro(selection2) {
57596       _mainFileFetcher.get("intro_graph").then((dataIntroGraph) => {
57597         for (let id2 in dataIntroGraph) {
57598           if (!_introGraph[id2]) {
57599             _introGraph[id2] = osmEntity(localize(dataIntroGraph[id2]));
57600           }
57601         }
57602         selection2.call(startIntro);
57603       }).catch(function() {
57604       });
57605     }
57606     function startIntro(selection2) {
57607       context.enter(modeBrowse(context));
57608       let osm = context.connection();
57609       let history = context.history().toJSON();
57610       let hash = window.location.hash;
57611       let center = context.map().center();
57612       let zoom = context.map().zoom();
57613       let background = context.background().baseLayerSource();
57614       let overlays = context.background().overlayLayerSources();
57615       let opacity = context.container().selectAll(".main-map .layer-background").style("opacity");
57616       let caches = osm && osm.caches();
57617       let baseEntities = context.history().graph().base().entities;
57618       context.ui().sidebar.expand();
57619       context.container().selectAll("button.sidebar-toggle").classed("disabled", true);
57620       context.inIntro(true);
57621       if (osm) {
57622         osm.toggle(false).reset();
57623       }
57624       context.history().reset();
57625       context.history().merge(Object.values(coreGraph().load(_introGraph).entities));
57626       context.history().checkpoint("initial");
57627       let imagery = context.background().findSource(INTRO_IMAGERY);
57628       if (imagery) {
57629         context.background().baseLayerSource(imagery);
57630       } else {
57631         context.background().bing();
57632       }
57633       overlays.forEach((d) => context.background().toggleOverlayLayer(d));
57634       let layers = context.layers();
57635       layers.all().forEach((item) => {
57636         if (typeof item.layer.enabled === "function") {
57637           item.layer.enabled(item.id === "osm");
57638         }
57639       });
57640       context.container().selectAll(".main-map .layer-background").style("opacity", 1);
57641       let curtain = uiCurtain(context.container().node());
57642       selection2.call(curtain);
57643       corePreferences("walkthrough_started", "yes");
57644       let storedProgress = corePreferences("walkthrough_progress") || "";
57645       let progress = storedProgress.split(";").filter(Boolean);
57646       let chapters = chapterFlow.map((chapter, i2) => {
57647         let s = chapterUi[chapter](context, curtain.reveal).on("done", () => {
57648           buttons.filter((d) => d.title === s.title).classed("finished", true);
57649           if (i2 < chapterFlow.length - 1) {
57650             const next = chapterFlow[i2 + 1];
57651             context.container().select(`button.chapter-${next}`).classed("next", true);
57652           }
57653           progress.push(chapter);
57654           corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";"));
57655         });
57656         return s;
57657       });
57658       chapters[chapters.length - 1].on("startEditing", () => {
57659         progress.push("startEditing");
57660         corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";"));
57661         let incomplete = utilArrayDifference(chapterFlow, progress);
57662         if (!incomplete.length) {
57663           corePreferences("walkthrough_completed", "yes");
57664         }
57665         curtain.remove();
57666         navwrap.remove();
57667         context.container().selectAll(".main-map .layer-background").style("opacity", opacity);
57668         context.container().selectAll("button.sidebar-toggle").classed("disabled", false);
57669         if (osm) {
57670           osm.toggle(true).reset().caches(caches);
57671         }
57672         context.history().reset().merge(Object.values(baseEntities));
57673         context.background().baseLayerSource(background);
57674         overlays.forEach((d) => context.background().toggleOverlayLayer(d));
57675         if (history) {
57676           context.history().fromJSON(history, false);
57677         }
57678         context.map().centerZoom(center, zoom);
57679         window.location.replace(hash);
57680         context.inIntro(false);
57681       });
57682       let navwrap = selection2.append("div").attr("class", "intro-nav-wrap fillD");
57683       navwrap.append("svg").attr("class", "intro-nav-wrap-logo").append("use").attr("xlink:href", "#iD-logo-walkthrough");
57684       let buttonwrap = navwrap.append("div").attr("class", "joined").selectAll("button.chapter");
57685       let buttons = buttonwrap.data(chapters).enter().append("button").attr("class", (d, i2) => `chapter chapter-${chapterFlow[i2]}`).on("click", enterChapter);
57686       buttons.append("span").html((d) => _t.html(d.title));
57687       buttons.append("span").attr("class", "status").call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward", "inline"));
57688       enterChapter(null, chapters[0]);
57689       function enterChapter(d3_event, newChapter) {
57690         if (_currChapter) {
57691           _currChapter.exit();
57692         }
57693         context.enter(modeBrowse(context));
57694         _currChapter = newChapter;
57695         _currChapter.enter();
57696         buttons.classed("next", false).classed("active", (d) => d.title === _currChapter.title);
57697       }
57698     }
57699     return intro;
57700   }
57701
57702   // modules/ui/issues_info.js
57703   function uiIssuesInfo(context) {
57704     var warningsItem = {
57705       id: "warnings",
57706       count: 0,
57707       iconID: "iD-icon-alert",
57708       descriptionID: "issues.warnings_and_errors"
57709     };
57710     var resolvedItem = {
57711       id: "resolved",
57712       count: 0,
57713       iconID: "iD-icon-apply",
57714       descriptionID: "issues.user_resolved_issues"
57715     };
57716     function update(selection2) {
57717       var shownItems = [];
57718       var liveIssues = context.validator().getIssues({
57719         what: corePreferences("validate-what") || "edited",
57720         where: corePreferences("validate-where") || "all"
57721       });
57722       if (liveIssues.length) {
57723         warningsItem.count = liveIssues.length;
57724         shownItems.push(warningsItem);
57725       }
57726       if (corePreferences("validate-what") === "all") {
57727         var resolvedIssues = context.validator().getResolvedIssues();
57728         if (resolvedIssues.length) {
57729           resolvedItem.count = resolvedIssues.length;
57730           shownItems.push(resolvedItem);
57731         }
57732       }
57733       var chips = selection2.selectAll(".chip").data(shownItems, function(d) {
57734         return d.id;
57735       });
57736       chips.exit().remove();
57737       var enter = chips.enter().append("a").attr("class", function(d) {
57738         return "chip " + d.id + "-count";
57739       }).attr("href", "#").each(function(d) {
57740         var chipSelection = select_default2(this);
57741         var tooltipBehavior = uiTooltip().placement("top").title(() => _t.append(d.descriptionID));
57742         chipSelection.call(tooltipBehavior).on("click", function(d3_event) {
57743           d3_event.preventDefault();
57744           tooltipBehavior.hide(select_default2(this));
57745           context.ui().togglePanes(context.container().select(".map-panes .issues-pane"));
57746         });
57747         chipSelection.call(svgIcon("#" + d.iconID));
57748       });
57749       enter.append("span").attr("class", "count");
57750       enter.merge(chips).selectAll("span.count").text(function(d) {
57751         return d.count.toString();
57752       });
57753     }
57754     return function(selection2) {
57755       update(selection2);
57756       context.validator().on("validated.infobox", function() {
57757         update(selection2);
57758       });
57759     };
57760   }
57761
57762   // modules/ui/map_in_map.js
57763   function uiMapInMap(context) {
57764     function mapInMap(selection2) {
57765       var backgroundLayer = rendererTileLayer(context);
57766       var overlayLayers = {};
57767       var projection2 = geoRawMercator();
57768       var dataLayer = svgData(projection2, context).showLabels(false);
57769       var debugLayer = svgDebug(projection2, context);
57770       var zoom = zoom_default2().scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)]).on("start", zoomStarted).on("zoom", zoomed).on("end", zoomEnded);
57771       var wrap2 = select_default2(null);
57772       var tiles = select_default2(null);
57773       var viewport = select_default2(null);
57774       var _isTransformed = false;
57775       var _isHidden = true;
57776       var _skipEvents = false;
57777       var _gesture = null;
57778       var _zDiff = 6;
57779       var _dMini;
57780       var _cMini;
57781       var _tStart;
57782       var _tCurr;
57783       var _timeoutID;
57784       function zoomStarted() {
57785         if (_skipEvents)
57786           return;
57787         _tStart = _tCurr = projection2.transform();
57788         _gesture = null;
57789       }
57790       function zoomed(d3_event) {
57791         if (_skipEvents)
57792           return;
57793         var x = d3_event.transform.x;
57794         var y = d3_event.transform.y;
57795         var k = d3_event.transform.k;
57796         var isZooming = k !== _tStart.k;
57797         var isPanning = x !== _tStart.x || y !== _tStart.y;
57798         if (!isZooming && !isPanning) {
57799           return;
57800         }
57801         if (!_gesture) {
57802           _gesture = isZooming ? "zoom" : "pan";
57803         }
57804         var tMini = projection2.transform();
57805         var tX, tY, scale;
57806         if (_gesture === "zoom") {
57807           scale = k / tMini.k;
57808           tX = (_cMini[0] / scale - _cMini[0]) * scale;
57809           tY = (_cMini[1] / scale - _cMini[1]) * scale;
57810         } else {
57811           k = tMini.k;
57812           scale = 1;
57813           tX = x - tMini.x;
57814           tY = y - tMini.y;
57815         }
57816         utilSetTransform(tiles, tX, tY, scale);
57817         utilSetTransform(viewport, 0, 0, scale);
57818         _isTransformed = true;
57819         _tCurr = identity2.translate(x, y).scale(k);
57820         var zMain = geoScaleToZoom(context.projection.scale());
57821         var zMini = geoScaleToZoom(k);
57822         _zDiff = zMain - zMini;
57823         queueRedraw();
57824       }
57825       function zoomEnded() {
57826         if (_skipEvents)
57827           return;
57828         if (_gesture !== "pan")
57829           return;
57830         updateProjection();
57831         _gesture = null;
57832         context.map().center(projection2.invert(_cMini));
57833       }
57834       function updateProjection() {
57835         var loc = context.map().center();
57836         var tMain = context.projection.transform();
57837         var zMain = geoScaleToZoom(tMain.k);
57838         var zMini = Math.max(zMain - _zDiff, 0.5);
57839         var kMini = geoZoomToScale(zMini);
57840         projection2.translate([tMain.x, tMain.y]).scale(kMini);
57841         var point2 = projection2(loc);
57842         var mouse = _gesture === "pan" ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
57843         var xMini = _cMini[0] - point2[0] + tMain.x + mouse[0];
57844         var yMini = _cMini[1] - point2[1] + tMain.y + mouse[1];
57845         projection2.translate([xMini, yMini]).clipExtent([[0, 0], _dMini]);
57846         _tCurr = projection2.transform();
57847         if (_isTransformed) {
57848           utilSetTransform(tiles, 0, 0);
57849           utilSetTransform(viewport, 0, 0);
57850           _isTransformed = false;
57851         }
57852         zoom.scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
57853         _skipEvents = true;
57854         wrap2.call(zoom.transform, _tCurr);
57855         _skipEvents = false;
57856       }
57857       function redraw() {
57858         clearTimeout(_timeoutID);
57859         if (_isHidden)
57860           return;
57861         updateProjection();
57862         var zMini = geoScaleToZoom(projection2.scale());
57863         tiles = wrap2.selectAll(".map-in-map-tiles").data([0]);
57864         tiles = tiles.enter().append("div").attr("class", "map-in-map-tiles").merge(tiles);
57865         backgroundLayer.source(context.background().baseLayerSource()).projection(projection2).dimensions(_dMini);
57866         var background = tiles.selectAll(".map-in-map-background").data([0]);
57867         background.enter().append("div").attr("class", "map-in-map-background").merge(background).call(backgroundLayer);
57868         var overlaySources = context.background().overlayLayerSources();
57869         var activeOverlayLayers = [];
57870         for (var i2 = 0; i2 < overlaySources.length; i2++) {
57871           if (overlaySources[i2].validZoom(zMini)) {
57872             if (!overlayLayers[i2])
57873               overlayLayers[i2] = rendererTileLayer(context);
57874             activeOverlayLayers.push(overlayLayers[i2].source(overlaySources[i2]).projection(projection2).dimensions(_dMini));
57875           }
57876         }
57877         var overlay = tiles.selectAll(".map-in-map-overlay").data([0]);
57878         overlay = overlay.enter().append("div").attr("class", "map-in-map-overlay").merge(overlay);
57879         var overlays = overlay.selectAll("div").data(activeOverlayLayers, function(d) {
57880           return d.source().name();
57881         });
57882         overlays.exit().remove();
57883         overlays = overlays.enter().append("div").merge(overlays).each(function(layer) {
57884           select_default2(this).call(layer);
57885         });
57886         var dataLayers = tiles.selectAll(".map-in-map-data").data([0]);
57887         dataLayers.exit().remove();
57888         dataLayers = dataLayers.enter().append("svg").attr("class", "map-in-map-data").merge(dataLayers).call(dataLayer).call(debugLayer);
57889         if (_gesture !== "pan") {
57890           var getPath = path_default(projection2);
57891           var bbox2 = { type: "Polygon", coordinates: [context.map().extent().polygon()] };
57892           viewport = wrap2.selectAll(".map-in-map-viewport").data([0]);
57893           viewport = viewport.enter().append("svg").attr("class", "map-in-map-viewport").merge(viewport);
57894           var path = viewport.selectAll(".map-in-map-bbox").data([bbox2]);
57895           path.enter().append("path").attr("class", "map-in-map-bbox").merge(path).attr("d", getPath).classed("thick", function(d) {
57896             return getPath.area(d) < 30;
57897           });
57898         }
57899       }
57900       function queueRedraw() {
57901         clearTimeout(_timeoutID);
57902         _timeoutID = setTimeout(function() {
57903           redraw();
57904         }, 750);
57905       }
57906       function toggle(d3_event) {
57907         if (d3_event)
57908           d3_event.preventDefault();
57909         _isHidden = !_isHidden;
57910         context.container().select(".minimap-toggle-item").classed("active", !_isHidden).select("input").property("checked", !_isHidden);
57911         if (_isHidden) {
57912           wrap2.style("display", "block").style("opacity", "1").transition().duration(200).style("opacity", "0").on("end", function() {
57913             selection2.selectAll(".map-in-map").style("display", "none");
57914           });
57915         } else {
57916           wrap2.style("display", "block").style("opacity", "0").transition().duration(200).style("opacity", "1").on("end", function() {
57917             redraw();
57918           });
57919         }
57920       }
57921       uiMapInMap.toggle = toggle;
57922       wrap2 = selection2.selectAll(".map-in-map").data([0]);
57923       wrap2 = wrap2.enter().append("div").attr("class", "map-in-map").style("display", _isHidden ? "none" : "block").call(zoom).on("dblclick.zoom", null).merge(wrap2);
57924       _dMini = [200, 150];
57925       _cMini = geoVecScale(_dMini, 0.5);
57926       context.map().on("drawn.map-in-map", function(drawn) {
57927         if (drawn.full === true) {
57928           redraw();
57929         }
57930       });
57931       redraw();
57932       context.keybinding().on(_t("background.minimap.key"), toggle);
57933     }
57934     return mapInMap;
57935   }
57936
57937   // modules/ui/notice.js
57938   function uiNotice(context) {
57939     return function(selection2) {
57940       var div = selection2.append("div").attr("class", "notice");
57941       var button = div.append("button").attr("class", "zoom-to notice fillD").on("click", function() {
57942         context.map().zoomEase(context.minEditableZoom());
57943       }).on("wheel", function(d3_event) {
57944         var e22 = new WheelEvent(d3_event.type, d3_event);
57945         context.surface().node().dispatchEvent(e22);
57946       });
57947       button.call(svgIcon("#iD-icon-plus", "pre-text")).append("span").attr("class", "label").call(_t.append("zoom_in_edit"));
57948       function disableTooHigh() {
57949         var canEdit = context.map().zoom() >= context.minEditableZoom();
57950         div.style("display", canEdit ? "none" : "block");
57951       }
57952       context.map().on("move.notice", debounce_default(disableTooHigh, 500));
57953       disableTooHigh();
57954     };
57955   }
57956
57957   // modules/ui/photoviewer.js
57958   function uiPhotoviewer(context) {
57959     var dispatch10 = dispatch_default("resize");
57960     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
57961     function photoviewer(selection2) {
57962       selection2.append("button").attr("class", "thumb-hide").attr("title", _t("icons.close")).on("click", function() {
57963         if (services.streetside) {
57964           services.streetside.hideViewer(context);
57965         }
57966         if (services.mapillary) {
57967           services.mapillary.hideViewer(context);
57968         }
57969         if (services.kartaview) {
57970           services.kartaview.hideViewer(context);
57971         }
57972       }).append("div").call(svgIcon("#iD-icon-close"));
57973       function preventDefault(d3_event) {
57974         d3_event.preventDefault();
57975       }
57976       selection2.append("button").attr("class", "resize-handle-xy").on("touchstart touchdown touchend", preventDefault).on(
57977         _pointerPrefix + "down",
57978         buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true, resizeOnY: true })
57979       );
57980       selection2.append("button").attr("class", "resize-handle-x").on("touchstart touchdown touchend", preventDefault).on(
57981         _pointerPrefix + "down",
57982         buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true })
57983       );
57984       selection2.append("button").attr("class", "resize-handle-y").on("touchstart touchdown touchend", preventDefault).on(
57985         _pointerPrefix + "down",
57986         buildResizeListener(selection2, "resize", dispatch10, { resizeOnY: true })
57987       );
57988       function buildResizeListener(target, eventName, dispatch11, options2) {
57989         var resizeOnX = !!options2.resizeOnX;
57990         var resizeOnY = !!options2.resizeOnY;
57991         var minHeight = options2.minHeight || 240;
57992         var minWidth = options2.minWidth || 320;
57993         var pointerId;
57994         var startX;
57995         var startY;
57996         var startWidth;
57997         var startHeight;
57998         function startResize(d3_event) {
57999           if (pointerId !== (d3_event.pointerId || "mouse"))
58000             return;
58001           d3_event.preventDefault();
58002           d3_event.stopPropagation();
58003           var mapSize = context.map().dimensions();
58004           if (resizeOnX) {
58005             var maxWidth = mapSize[0];
58006             var newWidth = clamp3(startWidth + d3_event.clientX - startX, minWidth, maxWidth);
58007             target.style("width", newWidth + "px");
58008           }
58009           if (resizeOnY) {
58010             var maxHeight = mapSize[1] - 90;
58011             var newHeight = clamp3(startHeight + startY - d3_event.clientY, minHeight, maxHeight);
58012             target.style("height", newHeight + "px");
58013           }
58014           dispatch11.call(eventName, target, utilGetDimensions(target, true));
58015         }
58016         function clamp3(num, min3, max3) {
58017           return Math.max(min3, Math.min(num, max3));
58018         }
58019         function stopResize(d3_event) {
58020           if (pointerId !== (d3_event.pointerId || "mouse"))
58021             return;
58022           d3_event.preventDefault();
58023           d3_event.stopPropagation();
58024           select_default2(window).on("." + eventName, null);
58025         }
58026         return function initResize(d3_event) {
58027           d3_event.preventDefault();
58028           d3_event.stopPropagation();
58029           pointerId = d3_event.pointerId || "mouse";
58030           startX = d3_event.clientX;
58031           startY = d3_event.clientY;
58032           var targetRect = target.node().getBoundingClientRect();
58033           startWidth = targetRect.width;
58034           startHeight = targetRect.height;
58035           select_default2(window).on(_pointerPrefix + "move." + eventName, startResize, false).on(_pointerPrefix + "up." + eventName, stopResize, false);
58036           if (_pointerPrefix === "pointer") {
58037             select_default2(window).on("pointercancel." + eventName, stopResize, false);
58038           }
58039         };
58040       }
58041     }
58042     photoviewer.onMapResize = function() {
58043       var photoviewer2 = context.container().select(".photoviewer");
58044       var content = context.container().select(".main-content");
58045       var mapDimensions = utilGetDimensions(content, true);
58046       var photoDimensions = utilGetDimensions(photoviewer2, true);
58047       if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > mapDimensions[1] - 90) {
58048         var setPhotoDimensions = [
58049           Math.min(photoDimensions[0], mapDimensions[0]),
58050           Math.min(photoDimensions[1], mapDimensions[1] - 90)
58051         ];
58052         photoviewer2.style("width", setPhotoDimensions[0] + "px").style("height", setPhotoDimensions[1] + "px");
58053         dispatch10.call("resize", photoviewer2, setPhotoDimensions);
58054       }
58055     };
58056     return utilRebind(photoviewer, dispatch10, "on");
58057   }
58058
58059   // modules/ui/restore.js
58060   function uiRestore(context) {
58061     return function(selection2) {
58062       if (!context.history().hasRestorableChanges())
58063         return;
58064       let modalSelection = uiModal(selection2, true);
58065       modalSelection.select(".modal").attr("class", "modal fillL");
58066       let introModal = modalSelection.select(".content");
58067       introModal.append("div").attr("class", "modal-section").append("h3").call(_t.append("restore.heading"));
58068       introModal.append("div").attr("class", "modal-section").append("p").call(_t.append("restore.description"));
58069       let buttonWrap = introModal.append("div").attr("class", "modal-actions");
58070       let restore = buttonWrap.append("button").attr("class", "restore").on("click", () => {
58071         context.history().restore();
58072         modalSelection.remove();
58073       });
58074       restore.append("svg").attr("class", "logo logo-restore").append("use").attr("xlink:href", "#iD-logo-restore");
58075       restore.append("div").call(_t.append("restore.restore"));
58076       let reset = buttonWrap.append("button").attr("class", "reset").on("click", () => {
58077         context.history().clearSaved();
58078         modalSelection.remove();
58079       });
58080       reset.append("svg").attr("class", "logo logo-reset").append("use").attr("xlink:href", "#iD-logo-reset");
58081       reset.append("div").call(_t.append("restore.reset"));
58082       restore.node().focus();
58083     };
58084   }
58085
58086   // modules/ui/scale.js
58087   function uiScale(context) {
58088     var projection2 = context.projection, isImperial = !_mainLocalizer.usesMetric(), maxLength = 180, tickHeight = 8;
58089     function scaleDefs(loc1, loc2) {
58090       var lat = (loc2[1] + loc1[1]) / 2, conversion = isImperial ? 3.28084 : 1, dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion, scale = { dist: 0, px: 0, text: "" }, buckets, i2, val, dLon;
58091       if (isImperial) {
58092         buckets = [528e4, 528e3, 52800, 5280, 500, 50, 5, 1];
58093       } else {
58094         buckets = [5e6, 5e5, 5e4, 5e3, 500, 50, 5, 1];
58095       }
58096       for (i2 = 0; i2 < buckets.length; i2++) {
58097         val = buckets[i2];
58098         if (dist >= val) {
58099           scale.dist = Math.floor(dist / val) * val;
58100           break;
58101         } else {
58102           scale.dist = +dist.toFixed(2);
58103         }
58104       }
58105       dLon = geoMetersToLon(scale.dist / conversion, lat);
58106       scale.px = Math.round(projection2([loc1[0] + dLon, loc1[1]])[0]);
58107       scale.text = displayLength(scale.dist / conversion, isImperial);
58108       return scale;
58109     }
58110     function update(selection2) {
58111       var dims = context.map().dimensions(), loc1 = projection2.invert([0, dims[1]]), loc2 = projection2.invert([maxLength, dims[1]]), scale = scaleDefs(loc1, loc2);
58112       selection2.select(".scale-path").attr("d", "M0.5,0.5v" + tickHeight + "h" + scale.px + "v-" + tickHeight);
58113       selection2.select(".scale-text").style(_mainLocalizer.textDirection() === "ltr" ? "left" : "right", scale.px + 16 + "px").text(scale.text);
58114     }
58115     return function(selection2) {
58116       function switchUnits() {
58117         isImperial = !isImperial;
58118         selection2.call(update);
58119       }
58120       var scalegroup = selection2.append("svg").attr("class", "scale").on("click", switchUnits).append("g").attr("transform", "translate(10,11)");
58121       scalegroup.append("path").attr("class", "scale-path");
58122       selection2.append("div").attr("class", "scale-text");
58123       selection2.call(update);
58124       context.map().on("move.scale", function() {
58125         update(selection2);
58126       });
58127     };
58128   }
58129
58130   // modules/ui/shortcuts.js
58131   function uiShortcuts(context) {
58132     var detected = utilDetect();
58133     var _activeTab = 0;
58134     var _modalSelection;
58135     var _selection = select_default2(null);
58136     var _dataShortcuts;
58137     function shortcutsModal(_modalSelection2) {
58138       _modalSelection2.select(".modal").classed("modal-shortcuts", true);
58139       var content = _modalSelection2.select(".content");
58140       content.append("div").attr("class", "modal-section header").append("h2").call(_t.append("shortcuts.title"));
58141       _mainFileFetcher.get("shortcuts").then(function(data) {
58142         _dataShortcuts = data;
58143         content.call(render);
58144       }).catch(function() {
58145       });
58146     }
58147     function render(selection2) {
58148       if (!_dataShortcuts)
58149         return;
58150       var wrapper = selection2.selectAll(".wrapper").data([0]);
58151       var wrapperEnter = wrapper.enter().append("div").attr("class", "wrapper modal-section");
58152       var tabsBar = wrapperEnter.append("div").attr("class", "tabs-bar");
58153       var shortcutsList = wrapperEnter.append("div").attr("class", "shortcuts-list");
58154       wrapper = wrapper.merge(wrapperEnter);
58155       var tabs = tabsBar.selectAll(".tab").data(_dataShortcuts);
58156       var tabsEnter = tabs.enter().append("a").attr("class", "tab").attr("href", "#").on("click", function(d3_event, d) {
58157         d3_event.preventDefault();
58158         var i2 = _dataShortcuts.indexOf(d);
58159         _activeTab = i2;
58160         render(selection2);
58161       });
58162       tabsEnter.append("span").html(function(d) {
58163         return _t.html(d.text);
58164       });
58165       wrapper.selectAll(".tab").classed("active", function(d, i2) {
58166         return i2 === _activeTab;
58167       });
58168       var shortcuts = shortcutsList.selectAll(".shortcut-tab").data(_dataShortcuts);
58169       var shortcutsEnter = shortcuts.enter().append("div").attr("class", function(d) {
58170         return "shortcut-tab shortcut-tab-" + d.tab;
58171       });
58172       var columnsEnter = shortcutsEnter.selectAll(".shortcut-column").data(function(d) {
58173         return d.columns;
58174       }).enter().append("table").attr("class", "shortcut-column");
58175       var rowsEnter = columnsEnter.selectAll(".shortcut-row").data(function(d) {
58176         return d.rows;
58177       }).enter().append("tr").attr("class", "shortcut-row");
58178       var sectionRows = rowsEnter.filter(function(d) {
58179         return !d.shortcuts;
58180       });
58181       sectionRows.append("td");
58182       sectionRows.append("td").attr("class", "shortcut-section").append("h3").html(function(d) {
58183         return _t.html(d.text);
58184       });
58185       var shortcutRows = rowsEnter.filter(function(d) {
58186         return d.shortcuts;
58187       });
58188       var shortcutKeys = shortcutRows.append("td").attr("class", "shortcut-keys");
58189       var modifierKeys = shortcutKeys.filter(function(d) {
58190         return d.modifiers;
58191       });
58192       modifierKeys.selectAll("kbd.modifier").data(function(d) {
58193         if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") {
58194           return ["\u2318"];
58195         } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") {
58196           return [];
58197         } else {
58198           return d.modifiers;
58199         }
58200       }).enter().each(function() {
58201         var selection3 = select_default2(this);
58202         selection3.append("kbd").attr("class", "modifier").text(function(d) {
58203           return uiCmd.display(d);
58204         });
58205         selection3.append("span").text("+");
58206       });
58207       shortcutKeys.selectAll("kbd.shortcut").data(function(d) {
58208         var arr = d.shortcuts;
58209         if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") {
58210           arr = ["Y"];
58211         } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") {
58212           arr = ["F11"];
58213         }
58214         arr = arr.map(function(s) {
58215           return uiCmd.display(s.indexOf(".") !== -1 ? _t(s) : s);
58216         });
58217         return utilArrayUniq(arr).map(function(s) {
58218           return {
58219             shortcut: s,
58220             separator: d.separator,
58221             suffix: d.suffix
58222           };
58223         });
58224       }).enter().each(function(d, i2, nodes) {
58225         var selection3 = select_default2(this);
58226         var click = d.shortcut.toLowerCase().match(/(.*).click/);
58227         if (click && click[1]) {
58228           selection3.call(svgIcon("#iD-walkthrough-mouse-" + click[1], "operation"));
58229         } else if (d.shortcut.toLowerCase() === "long-press") {
58230           selection3.call(svgIcon("#iD-walkthrough-longpress", "longpress operation"));
58231         } else if (d.shortcut.toLowerCase() === "tap") {
58232           selection3.call(svgIcon("#iD-walkthrough-tap", "tap operation"));
58233         } else {
58234           selection3.append("kbd").attr("class", "shortcut").text(function(d2) {
58235             return d2.shortcut;
58236           });
58237         }
58238         if (i2 < nodes.length - 1) {
58239           selection3.append("span").html(d.separator || "\xA0" + _t.html("shortcuts.or") + "\xA0");
58240         } else if (i2 === nodes.length - 1 && d.suffix) {
58241           selection3.append("span").text(d.suffix);
58242         }
58243       });
58244       shortcutKeys.filter(function(d) {
58245         return d.gesture;
58246       }).each(function() {
58247         var selection3 = select_default2(this);
58248         selection3.append("span").text("+");
58249         selection3.append("span").attr("class", "gesture").html(function(d) {
58250           return _t.html(d.gesture);
58251         });
58252       });
58253       shortcutRows.append("td").attr("class", "shortcut-desc").html(function(d) {
58254         return d.text ? _t.html(d.text) : "\xA0";
58255       });
58256       wrapper.selectAll(".shortcut-tab").style("display", function(d, i2) {
58257         return i2 === _activeTab ? "flex" : "none";
58258       });
58259     }
58260     return function(selection2, show) {
58261       _selection = selection2;
58262       if (show) {
58263         _modalSelection = uiModal(selection2);
58264         _modalSelection.call(shortcutsModal);
58265       } else {
58266         context.keybinding().on([_t("shortcuts.toggle.key"), "?"], function() {
58267           if (context.container().selectAll(".modal-shortcuts").size()) {
58268             if (_modalSelection) {
58269               _modalSelection.close();
58270               _modalSelection = null;
58271             }
58272           } else {
58273             _modalSelection = uiModal(_selection);
58274             _modalSelection.call(shortcutsModal);
58275           }
58276         });
58277       }
58278     };
58279   }
58280
58281   // modules/ui/data_header.js
58282   function uiDataHeader() {
58283     var _datum;
58284     function dataHeader(selection2) {
58285       var header = selection2.selectAll(".data-header").data(
58286         _datum ? [_datum] : [],
58287         function(d) {
58288           return d.__featurehash__;
58289         }
58290       );
58291       header.exit().remove();
58292       var headerEnter = header.enter().append("div").attr("class", "data-header");
58293       var iconEnter = headerEnter.append("div").attr("class", "data-header-icon");
58294       iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-data", "note-fill"));
58295       headerEnter.append("div").attr("class", "data-header-label").call(_t.append("map_data.layers.custom.title"));
58296     }
58297     dataHeader.datum = function(val) {
58298       if (!arguments.length)
58299         return _datum;
58300       _datum = val;
58301       return this;
58302     };
58303     return dataHeader;
58304   }
58305
58306   // modules/ui/combobox.js
58307   var _comboHideTimerID;
58308   function uiCombobox(context, klass) {
58309     var dispatch10 = dispatch_default("accept", "cancel", "update");
58310     var container = context.container();
58311     var _suggestions = [];
58312     var _data = [];
58313     var _fetched = {};
58314     var _selected = null;
58315     var _canAutocomplete = true;
58316     var _caseSensitive = false;
58317     var _cancelFetch = false;
58318     var _minItems = 2;
58319     var _tDown = 0;
58320     var _mouseEnterHandler, _mouseLeaveHandler;
58321     var _fetcher = function(val, cb) {
58322       cb(_data.filter(function(d) {
58323         var terms = d.terms || [];
58324         terms.push(d.value);
58325         if (d.key) {
58326           terms.push(d.key);
58327         }
58328         return terms.some(function(term) {
58329           return term.toString().toLowerCase().indexOf(val.toLowerCase()) !== -1;
58330         });
58331       }));
58332     };
58333     var combobox = function(input, attachTo) {
58334       if (!input || input.empty())
58335         return;
58336       input.classed("combobox-input", true).on("focus.combo-input", focus).on("blur.combo-input", blur).on("keydown.combo-input", keydown).on("keyup.combo-input", keyup).on("input.combo-input", change).on("mousedown.combo-input", mousedown).each(function() {
58337         var parent = this.parentNode;
58338         var sibling = this.nextSibling;
58339         select_default2(parent).selectAll(".combobox-caret").filter(function(d) {
58340           return d === input.node();
58341         }).data([input.node()]).enter().insert("div", function() {
58342           return sibling;
58343         }).attr("class", "combobox-caret").on("mousedown.combo-caret", function(d3_event) {
58344           d3_event.preventDefault();
58345           input.node().focus();
58346           mousedown(d3_event);
58347         }).on("mouseup.combo-caret", function(d3_event) {
58348           d3_event.preventDefault();
58349           mouseup(d3_event);
58350         });
58351       });
58352       function mousedown(d3_event) {
58353         if (d3_event.button !== 0)
58354           return;
58355         if (input.classed("disabled"))
58356           return;
58357         _tDown = +new Date();
58358         var start2 = input.property("selectionStart");
58359         var end = input.property("selectionEnd");
58360         if (start2 !== end) {
58361           var val = utilGetSetValue(input);
58362           input.node().setSelectionRange(val.length, val.length);
58363           return;
58364         }
58365         input.on("mouseup.combo-input", mouseup);
58366       }
58367       function mouseup(d3_event) {
58368         input.on("mouseup.combo-input", null);
58369         if (d3_event.button !== 0)
58370           return;
58371         if (input.classed("disabled"))
58372           return;
58373         if (input.node() !== document.activeElement)
58374           return;
58375         var start2 = input.property("selectionStart");
58376         var end = input.property("selectionEnd");
58377         if (start2 !== end)
58378           return;
58379         var combo = container.selectAll(".combobox");
58380         if (combo.empty() || combo.datum() !== input.node()) {
58381           var tOrig = _tDown;
58382           window.setTimeout(function() {
58383             if (tOrig !== _tDown)
58384               return;
58385             fetchComboData("", function() {
58386               show();
58387               render();
58388             });
58389           }, 250);
58390         } else {
58391           hide();
58392         }
58393       }
58394       function focus() {
58395         fetchComboData("");
58396       }
58397       function blur() {
58398         _comboHideTimerID = window.setTimeout(hide, 75);
58399       }
58400       function show() {
58401         hide();
58402         container.insert("div", ":first-child").datum(input.node()).attr("class", "combobox" + (klass ? " combobox-" + klass : "")).style("position", "absolute").style("display", "block").style("left", "0px").on("mousedown.combo-container", function(d3_event) {
58403           d3_event.preventDefault();
58404         });
58405         container.on("scroll.combo-scroll", render, true);
58406       }
58407       function hide() {
58408         if (_comboHideTimerID) {
58409           window.clearTimeout(_comboHideTimerID);
58410           _comboHideTimerID = void 0;
58411         }
58412         container.selectAll(".combobox").remove();
58413         container.on("scroll.combo-scroll", null);
58414       }
58415       function keydown(d3_event) {
58416         var shown = !container.selectAll(".combobox").empty();
58417         var tagName = input.node() ? input.node().tagName.toLowerCase() : "";
58418         switch (d3_event.keyCode) {
58419           case 8:
58420           case 46:
58421             d3_event.stopPropagation();
58422             _selected = null;
58423             render();
58424             input.on("input.combo-input", function() {
58425               var start2 = input.property("selectionStart");
58426               input.node().setSelectionRange(start2, start2);
58427               input.on("input.combo-input", change);
58428               change(false);
58429             });
58430             break;
58431           case 9:
58432             accept(d3_event);
58433             break;
58434           case 13:
58435             d3_event.preventDefault();
58436             d3_event.stopPropagation();
58437             accept(d3_event);
58438             break;
58439           case 38:
58440             if (tagName === "textarea" && !shown)
58441               return;
58442             d3_event.preventDefault();
58443             if (tagName === "input" && !shown) {
58444               show();
58445             }
58446             nav(-1);
58447             break;
58448           case 40:
58449             if (tagName === "textarea" && !shown)
58450               return;
58451             d3_event.preventDefault();
58452             if (tagName === "input" && !shown) {
58453               show();
58454             }
58455             nav(1);
58456             break;
58457         }
58458       }
58459       function keyup(d3_event) {
58460         switch (d3_event.keyCode) {
58461           case 27:
58462             cancel();
58463             break;
58464         }
58465       }
58466       function change(doAutoComplete) {
58467         if (doAutoComplete === void 0)
58468           doAutoComplete = true;
58469         fetchComboData(value(), function() {
58470           _selected = null;
58471           var val = input.property("value");
58472           if (_suggestions.length) {
58473             if (doAutoComplete && input.property("selectionEnd") === val.length) {
58474               _selected = tryAutocomplete();
58475             }
58476             if (!_selected) {
58477               _selected = val;
58478             }
58479           }
58480           if (val.length) {
58481             var combo = container.selectAll(".combobox");
58482             if (combo.empty()) {
58483               show();
58484             }
58485           } else {
58486             hide();
58487           }
58488           render();
58489         });
58490       }
58491       function nav(dir) {
58492         if (_suggestions.length) {
58493           var index = -1;
58494           for (var i2 = 0; i2 < _suggestions.length; i2++) {
58495             if (_selected && _suggestions[i2].value === _selected) {
58496               index = i2;
58497               break;
58498             }
58499           }
58500           index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
58501           _selected = _suggestions[index].value;
58502           utilGetSetValue(input, _selected);
58503           dispatch10.call("update");
58504         }
58505         render();
58506         ensureVisible();
58507       }
58508       function ensureVisible() {
58509         var combo = container.selectAll(".combobox");
58510         if (combo.empty())
58511           return;
58512         var containerRect = container.node().getBoundingClientRect();
58513         var comboRect = combo.node().getBoundingClientRect();
58514         if (comboRect.bottom > containerRect.bottom) {
58515           var node = attachTo ? attachTo.node() : input.node();
58516           node.scrollIntoView({ behavior: "instant", block: "center" });
58517           render();
58518         }
58519         var selected = combo.selectAll(".combobox-option.selected").node();
58520         if (selected) {
58521           selected.scrollIntoView({ behavior: "smooth", block: "nearest" });
58522         }
58523       }
58524       function value() {
58525         var value2 = input.property("value");
58526         var start2 = input.property("selectionStart");
58527         var end = input.property("selectionEnd");
58528         if (start2 && end) {
58529           value2 = value2.substring(0, start2);
58530         }
58531         return value2;
58532       }
58533       function fetchComboData(v, cb) {
58534         _cancelFetch = false;
58535         _fetcher.call(input, v, function(results) {
58536           if (_cancelFetch)
58537             return;
58538           _suggestions = results;
58539           results.forEach(function(d) {
58540             _fetched[d.value] = d;
58541           });
58542           if (cb) {
58543             cb();
58544           }
58545         });
58546       }
58547       function tryAutocomplete() {
58548         if (!_canAutocomplete)
58549           return;
58550         var val = _caseSensitive ? value() : value().toLowerCase();
58551         if (!val)
58552           return;
58553         if (isFinite(val))
58554           return;
58555         const suggestionValues = [];
58556         _suggestions.forEach((s) => {
58557           suggestionValues.push(s.value);
58558           if (s.key && s.key !== s.value) {
58559             suggestionValues.push(s.key);
58560           }
58561         });
58562         var bestIndex = -1;
58563         for (var i2 = 0; i2 < suggestionValues.length; i2++) {
58564           var suggestion = suggestionValues[i2];
58565           var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
58566           if (compare === val) {
58567             bestIndex = i2;
58568             break;
58569           } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
58570             bestIndex = i2;
58571           }
58572         }
58573         if (bestIndex !== -1) {
58574           var bestVal = suggestionValues[bestIndex];
58575           input.property("value", bestVal);
58576           input.node().setSelectionRange(val.length, bestVal.length);
58577           dispatch10.call("update");
58578           return bestVal;
58579         }
58580       }
58581       function render() {
58582         if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
58583           hide();
58584           return;
58585         }
58586         var shown = !container.selectAll(".combobox").empty();
58587         if (!shown)
58588           return;
58589         var combo = container.selectAll(".combobox");
58590         var options2 = combo.selectAll(".combobox-option").data(_suggestions, function(d) {
58591           return d.value;
58592         });
58593         options2.exit().remove();
58594         options2.enter().append("a").attr("class", function(d) {
58595           return "combobox-option " + (d.klass || "");
58596         }).attr("title", function(d) {
58597           return d.title;
58598         }).each(function(d) {
58599           if (d.display) {
58600             d.display(select_default2(this));
58601           } else {
58602             select_default2(this).text(d.value);
58603           }
58604         }).on("mouseenter", _mouseEnterHandler).on("mouseleave", _mouseLeaveHandler).merge(options2).classed("selected", function(d) {
58605           return d.value === _selected || d.key === _selected;
58606         }).on("click.combo-option", accept).order();
58607         var node = attachTo ? attachTo.node() : input.node();
58608         var containerRect = container.node().getBoundingClientRect();
58609         var rect = node.getBoundingClientRect();
58610         combo.style("left", rect.left + 5 - containerRect.left + "px").style("width", rect.width - 10 + "px").style("top", rect.height + rect.top - containerRect.top + "px");
58611       }
58612       function accept(d3_event, d) {
58613         _cancelFetch = true;
58614         var thiz = input.node();
58615         if (d) {
58616           utilGetSetValue(input, d.value);
58617           utilTriggerEvent(input, "change");
58618         }
58619         var val = utilGetSetValue(input);
58620         thiz.setSelectionRange(val.length, val.length);
58621         d = _fetched[val];
58622         dispatch10.call("accept", thiz, d, val);
58623         hide();
58624       }
58625       function cancel() {
58626         _cancelFetch = true;
58627         var thiz = input.node();
58628         var val = utilGetSetValue(input);
58629         var start2 = input.property("selectionStart");
58630         var end = input.property("selectionEnd");
58631         val = val.slice(0, start2) + val.slice(end);
58632         utilGetSetValue(input, val);
58633         thiz.setSelectionRange(val.length, val.length);
58634         dispatch10.call("cancel", thiz);
58635         hide();
58636       }
58637     };
58638     combobox.canAutocomplete = function(val) {
58639       if (!arguments.length)
58640         return _canAutocomplete;
58641       _canAutocomplete = val;
58642       return combobox;
58643     };
58644     combobox.caseSensitive = function(val) {
58645       if (!arguments.length)
58646         return _caseSensitive;
58647       _caseSensitive = val;
58648       return combobox;
58649     };
58650     combobox.data = function(val) {
58651       if (!arguments.length)
58652         return _data;
58653       _data = val;
58654       return combobox;
58655     };
58656     combobox.fetcher = function(val) {
58657       if (!arguments.length)
58658         return _fetcher;
58659       _fetcher = val;
58660       return combobox;
58661     };
58662     combobox.minItems = function(val) {
58663       if (!arguments.length)
58664         return _minItems;
58665       _minItems = val;
58666       return combobox;
58667     };
58668     combobox.itemsMouseEnter = function(val) {
58669       if (!arguments.length)
58670         return _mouseEnterHandler;
58671       _mouseEnterHandler = val;
58672       return combobox;
58673     };
58674     combobox.itemsMouseLeave = function(val) {
58675       if (!arguments.length)
58676         return _mouseLeaveHandler;
58677       _mouseLeaveHandler = val;
58678       return combobox;
58679     };
58680     return utilRebind(combobox, dispatch10, "on");
58681   }
58682   uiCombobox.off = function(input, context) {
58683     input.on("focus.combo-input", null).on("blur.combo-input", null).on("keydown.combo-input", null).on("keyup.combo-input", null).on("input.combo-input", null).on("mousedown.combo-input", null).on("mouseup.combo-input", null);
58684     context.container().on("scroll.combo-scroll", null);
58685   };
58686
58687   // modules/ui/disclosure.js
58688   function uiDisclosure(context, key, expandedDefault) {
58689     var dispatch10 = dispatch_default("toggled");
58690     var _expanded;
58691     var _label = utilFunctor("");
58692     var _updatePreference = true;
58693     var _content = function() {
58694     };
58695     var disclosure = function(selection2) {
58696       if (_expanded === void 0 || _expanded === null) {
58697         var preference = corePreferences("disclosure." + key + ".expanded");
58698         _expanded = preference === null ? !!expandedDefault : preference === "true";
58699       }
58700       var hideToggle = selection2.selectAll(".hide-toggle-" + key).data([0]);
58701       var hideToggleEnter = hideToggle.enter().append("h3").append("a").attr("role", "button").attr("href", "#").attr("class", "hide-toggle hide-toggle-" + key).call(svgIcon("", "pre-text", "hide-toggle-icon"));
58702       hideToggleEnter.append("span").attr("class", "hide-toggle-text");
58703       hideToggle = hideToggleEnter.merge(hideToggle);
58704       hideToggle.on("click", toggle).attr("title", _t(`icons.${_expanded ? "collapse" : "expand"}`)).attr("aria-expanded", _expanded).classed("expanded", _expanded);
58705       const label = _label();
58706       const labelSelection = hideToggle.selectAll(".hide-toggle-text");
58707       if (typeof label !== "function") {
58708         labelSelection.text(_label());
58709       } else {
58710         labelSelection.text("").call(label);
58711       }
58712       hideToggle.selectAll(".hide-toggle-icon").attr(
58713         "xlink:href",
58714         _expanded ? "#iD-icon-down" : _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward"
58715       );
58716       var wrap2 = selection2.selectAll(".disclosure-wrap").data([0]);
58717       wrap2 = wrap2.enter().append("div").attr("class", "disclosure-wrap disclosure-wrap-" + key).merge(wrap2).classed("hide", !_expanded);
58718       if (_expanded) {
58719         wrap2.call(_content);
58720       }
58721       function toggle(d3_event) {
58722         d3_event.preventDefault();
58723         _expanded = !_expanded;
58724         if (_updatePreference) {
58725           corePreferences("disclosure." + key + ".expanded", _expanded);
58726         }
58727         hideToggle.classed("expanded", _expanded).attr("aria-expanded", _expanded).attr("title", _t(`icons.${_expanded ? "collapse" : "expand"}`));
58728         hideToggle.selectAll(".hide-toggle-icon").attr(
58729           "xlink:href",
58730           _expanded ? "#iD-icon-down" : _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward"
58731         );
58732         wrap2.call(uiToggle(_expanded));
58733         if (_expanded) {
58734           wrap2.call(_content);
58735         }
58736         dispatch10.call("toggled", this, _expanded);
58737       }
58738     };
58739     disclosure.label = function(val) {
58740       if (!arguments.length)
58741         return _label;
58742       _label = utilFunctor(val);
58743       return disclosure;
58744     };
58745     disclosure.expanded = function(val) {
58746       if (!arguments.length)
58747         return _expanded;
58748       _expanded = val;
58749       return disclosure;
58750     };
58751     disclosure.updatePreference = function(val) {
58752       if (!arguments.length)
58753         return _updatePreference;
58754       _updatePreference = val;
58755       return disclosure;
58756     };
58757     disclosure.content = function(val) {
58758       if (!arguments.length)
58759         return _content;
58760       _content = val;
58761       return disclosure;
58762     };
58763     return utilRebind(disclosure, dispatch10, "on");
58764   }
58765
58766   // modules/ui/section.js
58767   function uiSection(id2, context) {
58768     var _classes = utilFunctor("");
58769     var _shouldDisplay;
58770     var _content;
58771     var _disclosure;
58772     var _label;
58773     var _expandedByDefault = utilFunctor(true);
58774     var _disclosureContent;
58775     var _disclosureExpanded;
58776     var _containerSelection = select_default2(null);
58777     var section = {
58778       id: id2
58779     };
58780     section.classes = function(val) {
58781       if (!arguments.length)
58782         return _classes;
58783       _classes = utilFunctor(val);
58784       return section;
58785     };
58786     section.label = function(val) {
58787       if (!arguments.length)
58788         return _label;
58789       _label = utilFunctor(val);
58790       return section;
58791     };
58792     section.expandedByDefault = function(val) {
58793       if (!arguments.length)
58794         return _expandedByDefault;
58795       _expandedByDefault = utilFunctor(val);
58796       return section;
58797     };
58798     section.shouldDisplay = function(val) {
58799       if (!arguments.length)
58800         return _shouldDisplay;
58801       _shouldDisplay = utilFunctor(val);
58802       return section;
58803     };
58804     section.content = function(val) {
58805       if (!arguments.length)
58806         return _content;
58807       _content = val;
58808       return section;
58809     };
58810     section.disclosureContent = function(val) {
58811       if (!arguments.length)
58812         return _disclosureContent;
58813       _disclosureContent = val;
58814       return section;
58815     };
58816     section.disclosureExpanded = function(val) {
58817       if (!arguments.length)
58818         return _disclosureExpanded;
58819       _disclosureExpanded = val;
58820       return section;
58821     };
58822     section.render = function(selection2) {
58823       _containerSelection = selection2.selectAll(".section-" + id2).data([0]);
58824       var sectionEnter = _containerSelection.enter().append("div").attr("class", "section section-" + id2 + " " + (_classes && _classes() || ""));
58825       _containerSelection = sectionEnter.merge(_containerSelection);
58826       _containerSelection.call(renderContent);
58827     };
58828     section.reRender = function() {
58829       _containerSelection.call(renderContent);
58830     };
58831     section.selection = function() {
58832       return _containerSelection;
58833     };
58834     section.disclosure = function() {
58835       return _disclosure;
58836     };
58837     function renderContent(selection2) {
58838       if (_shouldDisplay) {
58839         var shouldDisplay = _shouldDisplay();
58840         selection2.classed("hide", !shouldDisplay);
58841         if (!shouldDisplay) {
58842           selection2.html("");
58843           return;
58844         }
58845       }
58846       if (_disclosureContent) {
58847         if (!_disclosure) {
58848           _disclosure = uiDisclosure(context, id2.replace(/-/g, "_"), _expandedByDefault()).label(_label || "").content(_disclosureContent);
58849         }
58850         if (_disclosureExpanded !== void 0) {
58851           _disclosure.expanded(_disclosureExpanded);
58852           _disclosureExpanded = void 0;
58853         }
58854         selection2.call(_disclosure);
58855         return;
58856       }
58857       if (_content) {
58858         selection2.call(_content);
58859       }
58860     }
58861     return section;
58862   }
58863
58864   // modules/ui/tag_reference.js
58865   function uiTagReference(what) {
58866     var wikibase = what.qid ? services.wikidata : services.osmWikibase;
58867     var tagReference = {};
58868     var _button = select_default2(null);
58869     var _body = select_default2(null);
58870     var _loaded;
58871     var _showing;
58872     function load() {
58873       if (!wikibase)
58874         return;
58875       _button.classed("tag-reference-loading", true);
58876       wikibase.getDocs(what, gotDocs);
58877     }
58878     function gotDocs(err, docs) {
58879       _body.html("");
58880       if (!docs || !docs.title) {
58881         _body.append("p").attr("class", "tag-reference-description").call(_t.append("inspector.no_documentation_key"));
58882         done();
58883         return;
58884       }
58885       if (docs.imageURL) {
58886         _body.append("img").attr("class", "tag-reference-wiki-image").attr("alt", docs.description).attr("src", docs.imageURL).on("load", function() {
58887           done();
58888         }).on("error", function() {
58889           select_default2(this).remove();
58890           done();
58891         });
58892       } else {
58893         done();
58894       }
58895       var tagReferenceDescription = _body.append("p").attr("class", "tag-reference-description").append("span");
58896       if (docs.description) {
58897         tagReferenceDescription = tagReferenceDescription.attr("class", "localized-text").attr("lang", docs.descriptionLocaleCode || "und").text(docs.description);
58898       } else {
58899         tagReferenceDescription = tagReferenceDescription.call(_t.append("inspector.no_documentation_key"));
58900       }
58901       tagReferenceDescription.append("a").attr("class", "tag-reference-edit").attr("target", "_blank").attr("title", _t("inspector.edit_reference")).attr("href", docs.editURL).call(svgIcon("#iD-icon-edit", "inline"));
58902       if (docs.wiki) {
58903         _body.append("a").attr("class", "tag-reference-link").attr("target", "_blank").attr("href", docs.wiki.url).call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append(docs.wiki.text));
58904       }
58905       if (what.key === "comment") {
58906         _body.append("a").attr("class", "tag-reference-comment-link").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", _t("commit.about_changeset_comments_link")).append("span").call(_t.append("commit.about_changeset_comments"));
58907       }
58908     }
58909     function done() {
58910       _loaded = true;
58911       _button.classed("tag-reference-loading", false);
58912       _body.classed("expanded", true).transition().duration(200).style("max-height", "200px").style("opacity", "1");
58913       _showing = true;
58914       _button.selectAll("svg.icon use").each(function() {
58915         var iconUse = select_default2(this);
58916         if (iconUse.attr("href") === "#iD-icon-info") {
58917           iconUse.attr("href", "#iD-icon-info-filled");
58918         }
58919       });
58920     }
58921     function hide() {
58922       _body.transition().duration(200).style("max-height", "0px").style("opacity", "0").on("end", function() {
58923         _body.classed("expanded", false);
58924       });
58925       _showing = false;
58926       _button.selectAll("svg.icon use").each(function() {
58927         var iconUse = select_default2(this);
58928         if (iconUse.attr("href") === "#iD-icon-info-filled") {
58929           iconUse.attr("href", "#iD-icon-info");
58930         }
58931       });
58932     }
58933     tagReference.button = function(selection2, klass, iconName) {
58934       _button = selection2.selectAll(".tag-reference-button").data([0]);
58935       _button = _button.enter().append("button").attr("class", "tag-reference-button " + (klass || "")).attr("title", _t("icons.information")).call(svgIcon("#iD-icon-" + (iconName || "inspect"))).merge(_button);
58936       _button.on("click", function(d3_event) {
58937         d3_event.stopPropagation();
58938         d3_event.preventDefault();
58939         this.blur();
58940         if (_showing) {
58941           hide();
58942         } else if (_loaded) {
58943           done();
58944         } else {
58945           load();
58946         }
58947       });
58948     };
58949     tagReference.body = function(selection2) {
58950       var itemID = what.qid || what.key + "-" + (what.value || "");
58951       _body = selection2.selectAll(".tag-reference-body").data([itemID], function(d) {
58952         return d;
58953       });
58954       _body.exit().remove();
58955       _body = _body.enter().append("div").attr("class", "tag-reference-body").style("max-height", "0").style("opacity", "0").merge(_body);
58956       if (_showing === false) {
58957         hide();
58958       }
58959     };
58960     tagReference.showing = function(val) {
58961       if (!arguments.length)
58962         return _showing;
58963       _showing = val;
58964       return tagReference;
58965     };
58966     return tagReference;
58967   }
58968
58969   // modules/ui/field_help.js
58970   function uiFieldHelp(context, fieldName) {
58971     var fieldHelp = {};
58972     var _inspector = select_default2(null);
58973     var _wrap = select_default2(null);
58974     var _body = select_default2(null);
58975     var fieldHelpKeys = {
58976       restrictions: [
58977         ["about", [
58978           "about",
58979           "from_via_to",
58980           "maxdist",
58981           "maxvia"
58982         ]],
58983         ["inspecting", [
58984           "about",
58985           "from_shadow",
58986           "allow_shadow",
58987           "restrict_shadow",
58988           "only_shadow",
58989           "restricted",
58990           "only"
58991         ]],
58992         ["modifying", [
58993           "about",
58994           "indicators",
58995           "allow_turn",
58996           "restrict_turn",
58997           "only_turn"
58998         ]],
58999         ["tips", [
59000           "simple",
59001           "simple_example",
59002           "indirect",
59003           "indirect_example",
59004           "indirect_noedit"
59005         ]]
59006       ]
59007     };
59008     var fieldHelpHeadings = {};
59009     var replacements = {
59010       distField: { html: _t.html("restriction.controls.distance") },
59011       viaField: { html: _t.html("restriction.controls.via") },
59012       fromShadow: { html: icon("#iD-turn-shadow", "inline shadow from") },
59013       allowShadow: { html: icon("#iD-turn-shadow", "inline shadow allow") },
59014       restrictShadow: { html: icon("#iD-turn-shadow", "inline shadow restrict") },
59015       onlyShadow: { html: icon("#iD-turn-shadow", "inline shadow only") },
59016       allowTurn: { html: icon("#iD-turn-yes", "inline turn") },
59017       restrictTurn: { html: icon("#iD-turn-no", "inline turn") },
59018       onlyTurn: { html: icon("#iD-turn-only", "inline turn") }
59019     };
59020     var docs = fieldHelpKeys[fieldName].map(function(key) {
59021       var helpkey = "help.field." + fieldName + "." + key[0];
59022       var text2 = key[1].reduce(function(all, part) {
59023         var subkey = helpkey + "." + part;
59024         var depth = fieldHelpHeadings[subkey];
59025         var hhh = depth ? Array(depth + 1).join("#") + " " : "";
59026         return all + hhh + _t.html(subkey, replacements) + "\n\n";
59027       }, "");
59028       return {
59029         key: helpkey,
59030         title: _t.html(helpkey + ".title"),
59031         html: marked(text2.trim())
59032       };
59033     });
59034     function show() {
59035       updatePosition();
59036       _body.classed("hide", false).style("opacity", "0").transition().duration(200).style("opacity", "1");
59037     }
59038     function hide() {
59039       _body.classed("hide", true).transition().duration(200).style("opacity", "0").on("end", function() {
59040         _body.classed("hide", true);
59041       });
59042     }
59043     function clickHelp(index) {
59044       var d = docs[index];
59045       var tkeys = fieldHelpKeys[fieldName][index][1];
59046       _body.selectAll(".field-help-nav-item").classed("active", function(d2, i2) {
59047         return i2 === index;
59048       });
59049       var content = _body.selectAll(".field-help-content").html(d.html);
59050       content.selectAll("p").attr("class", function(d2, i2) {
59051         return tkeys[i2];
59052       });
59053       if (d.key === "help.field.restrictions.inspecting") {
59054         content.insert("img", "p.from_shadow").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_inspect.gif"));
59055       } else if (d.key === "help.field.restrictions.modifying") {
59056         content.insert("img", "p.allow_turn").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_modify.gif"));
59057       }
59058     }
59059     fieldHelp.button = function(selection2) {
59060       if (_body.empty())
59061         return;
59062       var button = selection2.selectAll(".field-help-button").data([0]);
59063       button.enter().append("button").attr("class", "field-help-button").call(svgIcon("#iD-icon-help")).merge(button).on("click", function(d3_event) {
59064         d3_event.stopPropagation();
59065         d3_event.preventDefault();
59066         if (_body.classed("hide")) {
59067           show();
59068         } else {
59069           hide();
59070         }
59071       });
59072     };
59073     function updatePosition() {
59074       var wrap2 = _wrap.node();
59075       var inspector = _inspector.node();
59076       var wRect = wrap2.getBoundingClientRect();
59077       var iRect = inspector.getBoundingClientRect();
59078       _body.style("top", wRect.top + inspector.scrollTop - iRect.top + "px");
59079     }
59080     fieldHelp.body = function(selection2) {
59081       _wrap = selection2.selectAll(".form-field-input-wrap");
59082       if (_wrap.empty())
59083         return;
59084       _inspector = context.container().select(".sidebar .entity-editor-pane .inspector-body");
59085       if (_inspector.empty())
59086         return;
59087       _body = _inspector.selectAll(".field-help-body").data([0]);
59088       var enter = _body.enter().append("div").attr("class", "field-help-body hide");
59089       var titleEnter = enter.append("div").attr("class", "field-help-title cf");
59090       titleEnter.append("h2").attr("class", _mainLocalizer.textDirection() === "rtl" ? "fr" : "fl").call(_t.append("help.field." + fieldName + ".title"));
59091       titleEnter.append("button").attr("class", "fr close").attr("title", _t("icons.close")).on("click", function(d3_event) {
59092         d3_event.stopPropagation();
59093         d3_event.preventDefault();
59094         hide();
59095       }).call(svgIcon("#iD-icon-close"));
59096       var navEnter = enter.append("div").attr("class", "field-help-nav cf");
59097       var titles = docs.map(function(d) {
59098         return d.title;
59099       });
59100       navEnter.selectAll(".field-help-nav-item").data(titles).enter().append("div").attr("class", "field-help-nav-item").html(function(d) {
59101         return d;
59102       }).on("click", function(d3_event, d) {
59103         d3_event.stopPropagation();
59104         d3_event.preventDefault();
59105         clickHelp(titles.indexOf(d));
59106       });
59107       enter.append("div").attr("class", "field-help-content");
59108       _body = _body.merge(enter);
59109       clickHelp(0);
59110     };
59111     return fieldHelp;
59112   }
59113
59114   // modules/ui/fields/check.js
59115   function uiFieldCheck(field, context) {
59116     var dispatch10 = dispatch_default("change");
59117     var options2 = field.options;
59118     var values = [];
59119     var texts = [];
59120     var _tags;
59121     var input = select_default2(null);
59122     var text2 = select_default2(null);
59123     var label = select_default2(null);
59124     var reverser = select_default2(null);
59125     var _impliedYes;
59126     var _entityIDs = [];
59127     var _value;
59128     var stringsField = field.resolveReference("stringsCrossReference");
59129     if (!options2 && stringsField.options) {
59130       options2 = stringsField.options;
59131     }
59132     if (options2) {
59133       for (var i2 in options2) {
59134         var v = options2[i2];
59135         values.push(v === "undefined" ? void 0 : v);
59136         texts.push(stringsField.t.html("options." + v, { "default": v }));
59137       }
59138     } else {
59139       values = [void 0, "yes"];
59140       texts = [_t.html("inspector.unknown"), _t.html("inspector.check.yes")];
59141       if (field.type !== "defaultCheck") {
59142         values.push("no");
59143         texts.push(_t.html("inspector.check.no"));
59144       }
59145     }
59146     function checkImpliedYes() {
59147       _impliedYes = field.id === "oneway_yes";
59148       if (field.id === "oneway") {
59149         var entity = context.entity(_entityIDs[0]);
59150         for (var key in entity.tags) {
59151           if (key in osmOneWayTags && entity.tags[key] in osmOneWayTags[key]) {
59152             _impliedYes = true;
59153             texts[0] = _t.html("_tagging.presets.fields.oneway_yes.options.undefined");
59154             break;
59155           }
59156         }
59157       }
59158     }
59159     function reverserHidden() {
59160       if (!context.container().select("div.inspector-hover").empty())
59161         return true;
59162       return !(_value === "yes" || _impliedYes && !_value);
59163     }
59164     function reverserSetText(selection2) {
59165       var entity = _entityIDs.length && context.hasEntity(_entityIDs[0]);
59166       if (reverserHidden() || !entity)
59167         return selection2;
59168       var first = entity.first();
59169       var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
59170       var pseudoDirection = first < last;
59171       var icon2 = pseudoDirection ? "#iD-icon-forward" : "#iD-icon-backward";
59172       selection2.selectAll(".reverser-span").html("").call(_t.append("inspector.check.reverser")).call(svgIcon(icon2, "inline"));
59173       return selection2;
59174     }
59175     var check = function(selection2) {
59176       checkImpliedYes();
59177       label = selection2.selectAll(".form-field-input-wrap").data([0]);
59178       var enter = label.enter().append("label").attr("class", "form-field-input-wrap form-field-input-check");
59179       enter.append("input").property("indeterminate", field.type !== "defaultCheck").attr("type", "checkbox").attr("id", field.domId);
59180       enter.append("span").html(texts[0]).attr("class", "value");
59181       if (field.type === "onewayCheck") {
59182         enter.append("button").attr("class", "reverser" + (reverserHidden() ? " hide" : "")).append("span").attr("class", "reverser-span");
59183       }
59184       label = label.merge(enter);
59185       input = label.selectAll("input");
59186       text2 = label.selectAll("span.value");
59187       input.on("click", function(d3_event) {
59188         d3_event.stopPropagation();
59189         var t = {};
59190         if (Array.isArray(_tags[field.key])) {
59191           if (values.indexOf("yes") !== -1) {
59192             t[field.key] = "yes";
59193           } else {
59194             t[field.key] = values[0];
59195           }
59196         } else {
59197           t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
59198         }
59199         if (t[field.key] === "reversible" || t[field.key] === "alternating") {
59200           t[field.key] = values[0];
59201         }
59202         dispatch10.call("change", this, t);
59203       });
59204       if (field.type === "onewayCheck") {
59205         reverser = label.selectAll(".reverser");
59206         reverser.call(reverserSetText).on("click", function(d3_event) {
59207           d3_event.preventDefault();
59208           d3_event.stopPropagation();
59209           context.perform(
59210             function(graph) {
59211               for (var i3 in _entityIDs) {
59212                 graph = actionReverse(_entityIDs[i3])(graph);
59213               }
59214               return graph;
59215             },
59216             _t("operations.reverse.annotation.line", { n: 1 })
59217           );
59218           context.validator().validate();
59219           select_default2(this).call(reverserSetText);
59220         });
59221       }
59222     };
59223     check.entityIDs = function(val) {
59224       if (!arguments.length)
59225         return _entityIDs;
59226       _entityIDs = val;
59227       return check;
59228     };
59229     check.tags = function(tags) {
59230       _tags = tags;
59231       function isChecked(val) {
59232         return val !== "no" && val !== "" && val !== void 0 && val !== null;
59233       }
59234       function textFor(val) {
59235         if (val === "")
59236           val = void 0;
59237         var index = values.indexOf(val);
59238         return index !== -1 ? texts[index] : '"' + val + '"';
59239       }
59240       checkImpliedYes();
59241       var isMixed = Array.isArray(tags[field.key]);
59242       _value = !isMixed && tags[field.key] && tags[field.key].toLowerCase();
59243       if (field.type === "onewayCheck" && (_value === "1" || _value === "-1")) {
59244         _value = "yes";
59245       }
59246       input.property("indeterminate", isMixed || field.type !== "defaultCheck" && !_value).property("checked", isChecked(_value));
59247       text2.html(isMixed ? _t.html("inspector.multiple_values") : textFor(_value)).classed("mixed", isMixed);
59248       label.classed("set", !!_value);
59249       if (field.type === "onewayCheck") {
59250         reverser.classed("hide", reverserHidden()).call(reverserSetText);
59251       }
59252     };
59253     check.focus = function() {
59254       input.node().focus();
59255     };
59256     return utilRebind(check, dispatch10, "on");
59257   }
59258
59259   // modules/ui/length_indicator.js
59260   function uiLengthIndicator(maxChars) {
59261     var _wrap = select_default2(null);
59262     var _tooltip = uiPopover("tooltip max-length-warning").placement("bottom").hasArrow(true).content(() => (selection2) => {
59263       selection2.text("");
59264       selection2.call(svgIcon("#iD-icon-alert", "inline"));
59265       selection2.call(_t.append("inspector.max_length_reached", { maxChars }));
59266     });
59267     var _silent = false;
59268     var lengthIndicator = function(selection2) {
59269       _wrap = selection2.selectAll("span.length-indicator-wrap").data([0]);
59270       _wrap = _wrap.enter().append("span").merge(_wrap).classed("length-indicator-wrap", true);
59271       selection2.call(_tooltip);
59272     };
59273     lengthIndicator.update = function(val) {
59274       const strLen = utilUnicodeCharsCount(utilCleanOsmString(val, Number.POSITIVE_INFINITY));
59275       let indicator = _wrap.selectAll("span.length-indicator").data([strLen]);
59276       indicator.enter().append("span").merge(indicator).classed("length-indicator", true).classed("limit-reached", (d) => d > maxChars).style("border-right-width", (d) => `${Math.abs(maxChars - d) * 2}px`).style("margin-right", (d) => d > maxChars ? `${(maxChars - d) * 2}px` : 0).style("opacity", (d) => d > maxChars * 0.8 ? Math.min(1, (d / maxChars - 0.8) / (1 - 0.8)) : 0).style("pointer-events", (d) => d > maxChars * 0.8 ? null : "none");
59277       if (_silent)
59278         return;
59279       if (strLen > maxChars) {
59280         _tooltip.show();
59281       } else {
59282         _tooltip.hide();
59283       }
59284     };
59285     lengthIndicator.silent = function(val) {
59286       if (!arguments.length)
59287         return _silent;
59288       _silent = val;
59289       return lengthIndicator;
59290     };
59291     return lengthIndicator;
59292   }
59293
59294   // modules/ui/fields/combo.js
59295   var valueIcons = {
59296     "crossing:markings": [
59297       "dashes",
59298       "dots",
59299       "ladder:paired",
59300       "ladder:skewed",
59301       "ladder",
59302       "lines:paired",
59303       "lines",
59304       "surface",
59305       "zebra:bicolour",
59306       "zebra:double",
59307       "zebra:paired",
59308       "zebra"
59309     ]
59310   };
59311   function uiFieldCombo(field, context) {
59312     var dispatch10 = dispatch_default("change");
59313     var _isMulti = field.type === "multiCombo" || field.type === "manyCombo";
59314     var _isNetwork = field.type === "networkCombo";
59315     var _isSemi = field.type === "semiCombo";
59316     var _showTagInfoSuggestions = field.type !== "manyCombo" && field.autoSuggestions !== false;
59317     var _allowCustomValues = field.type !== "manyCombo" && field.customValues !== false;
59318     var _snake_case = field.snake_case || field.snake_case === void 0;
59319     var _combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(field.caseSensitive).minItems(1);
59320     var _container = select_default2(null);
59321     var _inputWrap = select_default2(null);
59322     var _input = select_default2(null);
59323     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue());
59324     var _comboData = [];
59325     var _multiData = [];
59326     var _entityIDs = [];
59327     var _tags;
59328     var _countryCode;
59329     var _staticPlaceholder;
59330     var _dataDeprecated = [];
59331     _mainFileFetcher.get("deprecated").then(function(d) {
59332       _dataDeprecated = d;
59333     }).catch(function() {
59334     });
59335     if (_isMulti && field.key && /[^:]$/.test(field.key)) {
59336       field.key += ":";
59337     }
59338     function snake(s) {
59339       return s.replace(/\s+/g, "_");
59340     }
59341     function clean2(s) {
59342       return s.split(";").map(function(s2) {
59343         return s2.trim();
59344       }).join(";");
59345     }
59346     function tagValue(dval) {
59347       dval = clean2(dval || "");
59348       var found = getOptions().find(function(o) {
59349         return o.key && clean2(o.value) === dval;
59350       });
59351       if (found)
59352         return found.key;
59353       if (field.type === "typeCombo" && !dval) {
59354         return "yes";
59355       }
59356       return restrictTagValueSpelling(dval) || void 0;
59357     }
59358     function restrictTagValueSpelling(dval) {
59359       if (_snake_case) {
59360         dval = snake(dval);
59361       }
59362       if (!field.caseSensitive) {
59363         dval = dval.toLowerCase();
59364       }
59365       return dval;
59366     }
59367     function getLabelId(field2, v) {
59368       return field2.hasTextForStringId(`options.${v}.title`) ? `options.${v}.title` : `options.${v}`;
59369     }
59370     function displayValue(tval) {
59371       tval = tval || "";
59372       var stringsField = field.resolveReference("stringsCrossReference");
59373       const labelId = getLabelId(stringsField, tval);
59374       if (stringsField.hasTextForStringId(labelId)) {
59375         return stringsField.t(labelId, { default: tval });
59376       }
59377       if (field.type === "typeCombo" && tval.toLowerCase() === "yes") {
59378         return "";
59379       }
59380       return tval;
59381     }
59382     function renderValue(tval) {
59383       tval = tval || "";
59384       var stringsField = field.resolveReference("stringsCrossReference");
59385       const labelId = getLabelId(stringsField, tval);
59386       if (stringsField.hasTextForStringId(labelId)) {
59387         return stringsField.t.append(labelId, { default: tval });
59388       }
59389       if (field.type === "typeCombo" && tval.toLowerCase() === "yes") {
59390         tval = "";
59391       }
59392       return (selection2) => selection2.text(tval);
59393     }
59394     function objectDifference(a, b) {
59395       return a.filter(function(d1) {
59396         return !b.some(function(d2) {
59397           return !d2.isMixed && d1.value === d2.value;
59398         });
59399       });
59400     }
59401     function initCombo(selection2, attachTo) {
59402       if (!_allowCustomValues) {
59403         selection2.attr("readonly", "readonly");
59404       }
59405       if (_showTagInfoSuggestions && services.taginfo) {
59406         selection2.call(_combobox.fetcher(setTaginfoValues), attachTo);
59407         setTaginfoValues("", setPlaceholder);
59408       } else {
59409         selection2.call(_combobox, attachTo);
59410         setStaticValues(setPlaceholder);
59411       }
59412     }
59413     function getOptions() {
59414       var stringsField = field.resolveReference("stringsCrossReference");
59415       if (!(field.options || stringsField.options))
59416         return [];
59417       return (field.options || stringsField.options).map(function(v) {
59418         const labelId = getLabelId(stringsField, v);
59419         return {
59420           key: v,
59421           value: stringsField.t(labelId, { default: v }),
59422           title: stringsField.t(`options.${v}.description`, { default: v }),
59423           display: addComboboxIcons(stringsField.t.append(labelId, { default: v }), v),
59424           klass: stringsField.hasTextForStringId(labelId) ? "" : "raw-option"
59425         };
59426       });
59427     }
59428     function setStaticValues(callback, filter2) {
59429       _comboData = getOptions();
59430       if (filter2 !== void 0) {
59431         _comboData = _comboData.filter(filter2);
59432       }
59433       _comboData = objectDifference(_comboData, _multiData);
59434       _combobox.data(_comboData);
59435       if (callback)
59436         callback(_comboData);
59437     }
59438     function setTaginfoValues(q, callback) {
59439       var queryFilter = (d) => d.value.toLowerCase().includes(q.toLowerCase()) || d.key.toLowerCase().includes(q.toLowerCase());
59440       setStaticValues(callback, queryFilter);
59441       var stringsField = field.resolveReference("stringsCrossReference");
59442       var fn = _isMulti ? "multikeys" : "values";
59443       var query = (_isMulti ? field.key : "") + q;
59444       var hasCountryPrefix = _isNetwork && _countryCode && _countryCode.indexOf(q.toLowerCase()) === 0;
59445       if (hasCountryPrefix) {
59446         query = _countryCode + ":";
59447       }
59448       var params = {
59449         debounce: q !== "",
59450         key: field.key,
59451         query
59452       };
59453       if (_entityIDs.length) {
59454         params.geometry = context.graph().geometry(_entityIDs[0]);
59455       }
59456       services.taginfo[fn](params, function(err, data) {
59457         if (err)
59458           return;
59459         data = data.filter((d) => field.type !== "typeCombo" || d.value !== "yes");
59460         data = data.filter((d) => {
59461           var value = d.value;
59462           if (_isMulti) {
59463             value = value.slice(field.key.length);
59464           }
59465           return value === restrictTagValueSpelling(value);
59466         });
59467         var deprecatedValues = osmEntity.deprecatedTagValuesByKey(_dataDeprecated)[field.key];
59468         if (deprecatedValues) {
59469           data = data.filter((d) => !deprecatedValues.includes(d.value));
59470         }
59471         if (hasCountryPrefix) {
59472           data = data.filter((d) => d.value.toLowerCase().indexOf(_countryCode + ":") === 0);
59473         }
59474         const additionalOptions = (field.options || stringsField.options || []).filter((v) => !data.some((dv) => dv.value === (_isMulti ? field.key + v : v))).map((v) => ({ value: v }));
59475         _container.classed("empty-combobox", data.length === 0);
59476         _comboData = data.concat(additionalOptions).map(function(d) {
59477           var v = d.value;
59478           if (_isMulti)
59479             v = v.replace(field.key, "");
59480           const labelId = getLabelId(stringsField, v);
59481           var isLocalizable = stringsField.hasTextForStringId(labelId);
59482           var label = stringsField.t(labelId, { default: v });
59483           return {
59484             key: v,
59485             value: label,
59486             title: stringsField.t(`options.${v}.description`, { default: isLocalizable ? v : d.title !== label ? d.title : "" }),
59487             display: addComboboxIcons(stringsField.t.append(labelId, { default: v }), v),
59488             klass: isLocalizable ? "" : "raw-option"
59489           };
59490         });
59491         _comboData = _comboData.filter(queryFilter);
59492         _comboData = objectDifference(_comboData, _multiData);
59493         if (callback)
59494           callback(_comboData);
59495       });
59496     }
59497     function addComboboxIcons(disp, value) {
59498       if (valueIcons[field.key]) {
59499         return function(selection2) {
59500           var span = selection2.insert("span", ":first-child").attr("class", "tag-value-icon");
59501           if (valueIcons[field.key].indexOf(value) !== -1) {
59502             span.call(svgIcon("#iD-" + field.key.replace(/:/g, "_") + "-" + value.replace(/:/g, "_")));
59503           }
59504           disp.call(this, selection2);
59505         };
59506       }
59507       return disp;
59508     }
59509     function setPlaceholder(values) {
59510       if (_isMulti || _isSemi) {
59511         _staticPlaceholder = field.placeholder() || _t("inspector.add");
59512       } else {
59513         var vals = values.map(function(d) {
59514           return d.value;
59515         }).filter(function(s) {
59516           return s.length < 20;
59517         });
59518         var placeholders = vals.length > 1 ? vals : values.map(function(d) {
59519           return d.key;
59520         });
59521         _staticPlaceholder = field.placeholder() || placeholders.slice(0, 3).join(", ");
59522       }
59523       if (!/(…|\.\.\.)$/.test(_staticPlaceholder)) {
59524         _staticPlaceholder += "\u2026";
59525       }
59526       var ph;
59527       if (!_isMulti && !_isSemi && _tags && Array.isArray(_tags[field.key])) {
59528         ph = _t("inspector.multiple_values");
59529       } else {
59530         ph = _staticPlaceholder;
59531       }
59532       _container.selectAll("input").attr("placeholder", ph);
59533     }
59534     function change() {
59535       var t = {};
59536       var val;
59537       if (_isMulti || _isSemi) {
59538         var vals;
59539         if (_isMulti) {
59540           vals = [tagValue(utilGetSetValue(_input))];
59541         } else if (_isSemi) {
59542           val = tagValue(utilGetSetValue(_input)) || "";
59543           val = val.replace(/,/g, ";");
59544           vals = val.split(";");
59545         }
59546         vals = vals.filter(Boolean);
59547         if (!vals.length)
59548           return;
59549         _container.classed("active", false);
59550         utilGetSetValue(_input, "");
59551         if (_isMulti) {
59552           utilArrayUniq(vals).forEach(function(v) {
59553             var key = (field.key || "") + v;
59554             if (_tags) {
59555               var old = _tags[key];
59556               if (typeof old === "string" && old.toLowerCase() !== "no")
59557                 return;
59558             }
59559             key = context.cleanTagKey(key);
59560             field.keys.push(key);
59561             t[key] = "yes";
59562           });
59563         } else if (_isSemi) {
59564           var arr = _multiData.map(function(d) {
59565             return d.key;
59566           });
59567           arr = arr.concat(vals);
59568           t[field.key] = context.cleanTagValue(utilArrayUniq(arr).filter(Boolean).join(";"));
59569         }
59570         window.setTimeout(function() {
59571           _input.node().focus();
59572         }, 10);
59573       } else {
59574         var rawValue = utilGetSetValue(_input);
59575         if (!rawValue && Array.isArray(_tags[field.key]))
59576           return;
59577         val = context.cleanTagValue(tagValue(rawValue));
59578         t[field.key] = val || void 0;
59579       }
59580       dispatch10.call("change", this, t);
59581     }
59582     function removeMultikey(d3_event, d) {
59583       d3_event.preventDefault();
59584       d3_event.stopPropagation();
59585       var t = {};
59586       if (_isMulti) {
59587         t[d.key] = void 0;
59588       } else if (_isSemi) {
59589         var arr = _multiData.map(function(md) {
59590           return md.key === d.key ? null : md.key;
59591         }).filter(Boolean);
59592         arr = utilArrayUniq(arr);
59593         t[field.key] = arr.length ? arr.join(";") : void 0;
59594         _lengthIndicator.update(t[field.key]);
59595       }
59596       dispatch10.call("change", this, t);
59597     }
59598     function combo(selection2) {
59599       _container = selection2.selectAll(".form-field-input-wrap").data([0]);
59600       var type2 = _isMulti || _isSemi ? "multicombo" : "combo";
59601       _container = _container.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + type2).merge(_container);
59602       if (_isMulti || _isSemi) {
59603         _container = _container.selectAll(".chiplist").data([0]);
59604         var listClass = "chiplist";
59605         if (field.key === "destination" || field.key === "via") {
59606           listClass += " full-line-chips";
59607         }
59608         _container = _container.enter().append("ul").attr("class", listClass).on("click", function() {
59609           window.setTimeout(function() {
59610             _input.node().focus();
59611           }, 10);
59612         }).merge(_container);
59613         _inputWrap = _container.selectAll(".input-wrap").data([0]);
59614         _inputWrap = _inputWrap.enter().append("li").attr("class", "input-wrap").merge(_inputWrap);
59615         _input = _inputWrap.selectAll("input").data([0]);
59616       } else {
59617         _input = _container.selectAll("input").data([0]);
59618       }
59619       _input = _input.enter().append("input").attr("type", "text").attr("id", field.domId).call(utilNoAuto).call(initCombo, selection2).merge(_input);
59620       if (_isSemi) {
59621         _inputWrap.call(_lengthIndicator);
59622       } else if (!_isMulti) {
59623         _container.call(_lengthIndicator);
59624       }
59625       if (_isNetwork) {
59626         var extent = combinedEntityExtent();
59627         var countryCode = extent && iso1A2Code(extent.center());
59628         _countryCode = countryCode && countryCode.toLowerCase();
59629       }
59630       _input.on("change", change).on("blur", change).on("input", function() {
59631         let val = utilGetSetValue(_input);
59632         updateIcon(val);
59633         if (_isSemi && _tags[field.key]) {
59634           val += ";" + _tags[field.key];
59635         }
59636         _lengthIndicator.update(val);
59637       });
59638       _input.on("keydown.field", function(d3_event) {
59639         switch (d3_event.keyCode) {
59640           case 13:
59641             _input.node().blur();
59642             d3_event.stopPropagation();
59643             break;
59644         }
59645       });
59646       if (_isMulti || _isSemi) {
59647         _combobox.on("accept", function() {
59648           _input.node().blur();
59649           _input.node().focus();
59650         });
59651         _input.on("focus", function() {
59652           _container.classed("active", true);
59653         });
59654       }
59655       _combobox.on("cancel", function() {
59656         _input.node().blur();
59657       }).on("update", function() {
59658         updateIcon(utilGetSetValue(_input));
59659       });
59660     }
59661     function updateIcon(value) {
59662       value = tagValue(value);
59663       if (valueIcons[field.key]) {
59664         _container.selectAll(".tag-value-icon").remove();
59665         if (valueIcons[field.key].indexOf(value) !== -1) {
59666           _container.selectAll(".tag-value-icon").data([value]).enter().insert("div", "input").attr("class", "tag-value-icon").call(svgIcon("#iD-" + field.key.replace(/:/g, "_") + "-" + value.replace(/:/g, "_")));
59667         }
59668       }
59669     }
59670     combo.tags = function(tags) {
59671       _tags = tags;
59672       var stringsField = field.resolveReference("stringsCrossReference");
59673       if (_isMulti || _isSemi) {
59674         _multiData = [];
59675         var maxLength;
59676         if (_isMulti) {
59677           for (var k in tags) {
59678             if (field.key && k.indexOf(field.key) !== 0)
59679               continue;
59680             if (!field.key && field.keys.indexOf(k) === -1)
59681               continue;
59682             var v = tags[k];
59683             if (!v || typeof v === "string" && v.toLowerCase() === "no")
59684               continue;
59685             var suffix = field.key ? k.slice(field.key.length) : k;
59686             _multiData.push({
59687               key: k,
59688               value: displayValue(suffix),
59689               display: renderValue(suffix),
59690               isMixed: Array.isArray(v)
59691             });
59692           }
59693           if (field.key) {
59694             field.keys = _multiData.map(function(d) {
59695               return d.key;
59696             });
59697             maxLength = context.maxCharsForTagKey() - utilUnicodeCharsCount(field.key);
59698           } else {
59699             maxLength = context.maxCharsForTagKey();
59700           }
59701         } else if (_isSemi) {
59702           var allValues = [];
59703           var commonValues;
59704           if (Array.isArray(tags[field.key])) {
59705             tags[field.key].forEach(function(tagVal) {
59706               var thisVals = utilArrayUniq((tagVal || "").split(";")).filter(Boolean);
59707               allValues = allValues.concat(thisVals);
59708               if (!commonValues) {
59709                 commonValues = thisVals;
59710               } else {
59711                 commonValues = commonValues.filter((value) => thisVals.includes(value));
59712               }
59713             });
59714             allValues = utilArrayUniq(allValues).filter(Boolean);
59715           } else {
59716             allValues = utilArrayUniq((tags[field.key] || "").split(";")).filter(Boolean);
59717             commonValues = allValues;
59718           }
59719           _multiData = allValues.map(function(v2) {
59720             return {
59721               key: v2,
59722               value: displayValue(v2),
59723               display: renderValue(v2),
59724               isMixed: !commonValues.includes(v2)
59725             };
59726           });
59727           var currLength = utilUnicodeCharsCount(commonValues.join(";"));
59728           maxLength = context.maxCharsForTagValue() - currLength;
59729           if (currLength > 0) {
59730             maxLength -= 1;
59731           }
59732         }
59733         maxLength = Math.max(0, maxLength);
59734         var allowDragAndDrop = _isSemi && !Array.isArray(tags[field.key]);
59735         var available = objectDifference(_comboData, _multiData);
59736         _combobox.data(available);
59737         var hideAdd = !_allowCustomValues && !available.length || maxLength <= 0;
59738         _container.selectAll(".chiplist .input-wrap").style("display", hideAdd ? "none" : null);
59739         var chips = _container.selectAll(".chip").data(_multiData);
59740         chips.exit().remove();
59741         var enter = chips.enter().insert("li", ".input-wrap").attr("class", "chip");
59742         enter.append("span");
59743         enter.append("a");
59744         chips = chips.merge(enter).order().classed("raw-value", function(d) {
59745           var k2 = d.key;
59746           if (_isMulti)
59747             k2 = k2.replace(field.key, "");
59748           return !stringsField.hasTextForStringId("options." + k2);
59749         }).classed("draggable", allowDragAndDrop).classed("mixed", function(d) {
59750           return d.isMixed;
59751         }).attr("title", function(d) {
59752           return d.isMixed ? _t("inspector.unshared_value_tooltip") : null;
59753         });
59754         if (allowDragAndDrop) {
59755           registerDragAndDrop(chips);
59756         }
59757         chips.select("span").each(function(d) {
59758           const selection2 = select_default2(this);
59759           if (d.display) {
59760             selection2.text("");
59761             d.display(selection2);
59762           } else {
59763             selection2.text(d.value);
59764           }
59765         });
59766         chips.select("a").attr("href", "#").on("click", removeMultikey).attr("class", "remove").text("\xD7");
59767       } else {
59768         var isMixed = Array.isArray(tags[field.key]);
59769         var mixedValues = isMixed && tags[field.key].map(function(val) {
59770           return displayValue(val);
59771         }).filter(Boolean);
59772         var showsValue = !isMixed && tags[field.key] && !(field.type === "typeCombo" && tags[field.key] === "yes");
59773         var isRawValue = showsValue && !stringsField.hasTextForStringId(`options.${tags[field.key]}`) && !stringsField.hasTextForStringId(`options.${tags[field.key]}.title`);
59774         var isKnownValue = showsValue && !isRawValue;
59775         var isReadOnly = !_allowCustomValues || isKnownValue;
59776         utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : "").classed("raw-value", isRawValue).classed("known-value", isKnownValue).attr("readonly", isReadOnly ? "readonly" : void 0).attr("title", isMixed ? mixedValues.join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _staticPlaceholder || "").classed("mixed", isMixed).on("keydown.deleteCapture", function(d3_event) {
59777           if (isReadOnly && isKnownValue && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) {
59778             d3_event.preventDefault();
59779             d3_event.stopPropagation();
59780             var t = {};
59781             t[field.key] = void 0;
59782             dispatch10.call("change", this, t);
59783           }
59784         });
59785         if (!Array.isArray(tags[field.key])) {
59786           updateIcon(tags[field.key]);
59787         }
59788         if (!isMixed) {
59789           _lengthIndicator.update(tags[field.key]);
59790         }
59791       }
59792     };
59793     function registerDragAndDrop(selection2) {
59794       var dragOrigin, targetIndex;
59795       selection2.call(
59796         drag_default().on("start", function(d3_event) {
59797           dragOrigin = {
59798             x: d3_event.x,
59799             y: d3_event.y
59800           };
59801           targetIndex = null;
59802         }).on("drag", function(d3_event) {
59803           var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y;
59804           if (!select_default2(this).classed("dragging") && // don't display drag until dragging beyond a distance threshold
59805           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5)
59806             return;
59807           var index = selection2.nodes().indexOf(this);
59808           select_default2(this).classed("dragging", true);
59809           targetIndex = null;
59810           var targetIndexOffsetTop = null;
59811           var draggedTagWidth = select_default2(this).node().offsetWidth;
59812           if (field.key === "destination" || field.key === "via") {
59813             _container.selectAll(".chip").style("transform", function(d2, index2) {
59814               var node = select_default2(this).node();
59815               if (index === index2) {
59816                 return "translate(" + x + "px, " + y + "px)";
59817               } else if (index2 > index && d3_event.y > node.offsetTop) {
59818                 if (targetIndex === null || index2 > targetIndex) {
59819                   targetIndex = index2;
59820                 }
59821                 return "translateY(-100%)";
59822               } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
59823                 if (targetIndex === null || index2 < targetIndex) {
59824                   targetIndex = index2;
59825                 }
59826                 return "translateY(100%)";
59827               }
59828               return null;
59829             });
59830           } else {
59831             _container.selectAll(".chip").each(function(d2, index2) {
59832               var node = select_default2(this).node();
59833               if (index !== index2 && d3_event.x < node.offsetLeft + node.offsetWidth + 5 && d3_event.x > node.offsetLeft && d3_event.y < node.offsetTop + node.offsetHeight && d3_event.y > node.offsetTop) {
59834                 targetIndex = index2;
59835                 targetIndexOffsetTop = node.offsetTop;
59836               }
59837             }).style("transform", function(d2, index2) {
59838               var node = select_default2(this).node();
59839               if (index === index2) {
59840                 return "translate(" + x + "px, " + y + "px)";
59841               }
59842               if (node.offsetTop === targetIndexOffsetTop) {
59843                 if (index2 < index && index2 >= targetIndex) {
59844                   return "translateX(" + draggedTagWidth + "px)";
59845                 } else if (index2 > index && index2 <= targetIndex) {
59846                   return "translateX(-" + draggedTagWidth + "px)";
59847                 }
59848               }
59849               return null;
59850             });
59851           }
59852         }).on("end", function() {
59853           if (!select_default2(this).classed("dragging")) {
59854             return;
59855           }
59856           var index = selection2.nodes().indexOf(this);
59857           select_default2(this).classed("dragging", false);
59858           _container.selectAll(".chip").style("transform", null);
59859           if (typeof targetIndex === "number") {
59860             var element = _multiData[index];
59861             _multiData.splice(index, 1);
59862             _multiData.splice(targetIndex, 0, element);
59863             var t = {};
59864             if (_multiData.length) {
59865               t[field.key] = _multiData.map(function(element2) {
59866                 return element2.key;
59867               }).join(";");
59868             } else {
59869               t[field.key] = void 0;
59870             }
59871             dispatch10.call("change", this, t);
59872           }
59873           dragOrigin = void 0;
59874           targetIndex = void 0;
59875         })
59876       );
59877     }
59878     combo.focus = function() {
59879       _input.node().focus();
59880     };
59881     combo.entityIDs = function(val) {
59882       if (!arguments.length)
59883         return _entityIDs;
59884       _entityIDs = val;
59885       return combo;
59886     };
59887     function combinedEntityExtent() {
59888       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
59889     }
59890     return utilRebind(combo, dispatch10, "on");
59891   }
59892
59893   // modules/ui/fields/input.js
59894   function uiFieldText(field, context) {
59895     var dispatch10 = dispatch_default("change");
59896     var input = select_default2(null);
59897     var outlinkButton = select_default2(null);
59898     var wrap2 = select_default2(null);
59899     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue());
59900     var _entityIDs = [];
59901     var _tags;
59902     var _phoneFormats = {};
59903     const isDirectionField = field.key.split(":").some((keyPart) => keyPart === "direction");
59904     if (field.type === "tel") {
59905       _mainFileFetcher.get("phone_formats").then(function(d) {
59906         _phoneFormats = d;
59907         updatePhonePlaceholder();
59908       }).catch(function() {
59909       });
59910     }
59911     function calcLocked() {
59912       var isLocked = (field.id === "brand" || field.id === "network" || field.id === "operator" || field.id === "flag") && _entityIDs.length && _entityIDs.some(function(entityID) {
59913         var entity = context.graph().hasEntity(entityID);
59914         if (!entity)
59915           return false;
59916         if (entity.tags.wikidata)
59917           return true;
59918         var preset = _mainPresetIndex.match(entity, context.graph());
59919         var isSuggestion = preset && preset.suggestion;
59920         var which = field.id;
59921         return isSuggestion && !!entity.tags[which] && !!entity.tags[which + ":wikidata"];
59922       });
59923       field.locked(isLocked);
59924     }
59925     function i2(selection2) {
59926       calcLocked();
59927       var isLocked = field.locked();
59928       wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
59929       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
59930       input = wrap2.selectAll("input").data([0]);
59931       input = input.enter().append("input").attr("type", field.type === "identifier" ? "text" : field.type).attr("id", field.domId).classed(field.type, true).call(utilNoAuto).merge(input);
59932       input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change());
59933       wrap2.call(_lengthIndicator);
59934       if (field.type === "tel") {
59935         updatePhonePlaceholder();
59936       } else if (field.type === "number") {
59937         var rtl = _mainLocalizer.textDirection() === "rtl";
59938         input.attr("type", "text");
59939         var inc = field.increment;
59940         var buttons = wrap2.selectAll(".increment, .decrement").data(rtl ? [inc, -inc] : [-inc, inc]);
59941         buttons.enter().append("button").attr("class", function(d) {
59942           var which = d > 0 ? "increment" : "decrement";
59943           return "form-field-button " + which;
59944         }).attr("title", function(d) {
59945           var which = d > 0 ? "increment" : "decrement";
59946           return _t(`inspector.${which}`);
59947         }).merge(buttons).on("click", function(d3_event, d) {
59948           d3_event.preventDefault();
59949           var isMixed = Array.isArray(_tags[field.key]);
59950           if (isMixed)
59951             return;
59952           var raw_vals = input.node().value || "0";
59953           var vals = raw_vals.split(";");
59954           vals = vals.map(function(v) {
59955             var num = Number(v);
59956             if (isDirectionField) {
59957               const compassDir = cardinal[v.trim().toLowerCase()];
59958               if (compassDir !== void 0) {
59959                 num = compassDir;
59960               }
59961             }
59962             if (!isFinite(num)) {
59963               return v.trim();
59964             }
59965             num += d;
59966             if (isDirectionField) {
59967               num = (num % 360 + 360) % 360;
59968             }
59969             const numDecimals = v.includes(".") ? v.split(".")[1].length : 0;
59970             return clamped(num).toFixed(numDecimals);
59971           });
59972           input.node().value = vals.join(";");
59973           change()();
59974         });
59975       } else if (field.type === "identifier" && field.urlFormat && field.pattern) {
59976         input.attr("type", "text");
59977         outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]);
59978         outlinkButton.enter().append("button").call(svgIcon("#iD-icon-out-link")).attr("class", "form-field-button foreign-id-permalink").attr("title", function() {
59979           var domainResults = /^https?:\/\/(.{1,}?)\//.exec(field.urlFormat);
59980           if (domainResults.length >= 2 && domainResults[1]) {
59981             var domain2 = domainResults[1];
59982             return _t("icons.view_on", { domain: domain2 });
59983           }
59984           return "";
59985         }).on("click", function(d3_event) {
59986           d3_event.preventDefault();
59987           var value = validIdentifierValueForLink();
59988           if (value) {
59989             var url = field.urlFormat.replace(/{value}/, encodeURIComponent(value));
59990             window.open(url, "_blank");
59991           }
59992         }).merge(outlinkButton);
59993       } else if (field.type === "url") {
59994         input.attr("type", "text");
59995         outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]);
59996         outlinkButton.enter().append("button").call(svgIcon("#iD-icon-out-link")).attr("class", "form-field-button foreign-id-permalink").attr("title", () => _t("icons.visit_website")).on("click", function(d3_event) {
59997           d3_event.preventDefault();
59998           const value = validIdentifierValueForLink();
59999           if (value)
60000             window.open(value, "_blank");
60001         }).merge(outlinkButton);
60002       } else if (field.type === "colour") {
60003         input.attr("type", "text");
60004         updateColourPreview();
60005       }
60006     }
60007     function isColourValid(colour) {
60008       if (!colour.match(/^(#([0-9a-fA-F]{3}){1,2}|\w+)$/)) {
60009         return false;
60010       } else if (!CSS.supports("color", colour) || ["unset", "inherit", "initial", "revert"].includes(colour)) {
60011         return false;
60012       }
60013       return true;
60014     }
60015     function updateColourPreview() {
60016       wrap2.selectAll(".colour-preview").remove();
60017       const colour = utilGetSetValue(input);
60018       if (!isColourValid(colour) && colour !== "")
60019         return;
60020       var colourSelector = wrap2.selectAll(".colour-selector").data([0]);
60021       outlinkButton = wrap2.selectAll(".colour-preview").data([colour]);
60022       colourSelector.enter().append("input").attr("type", "color").attr("class", "form-field-button colour-selector").attr("value", colour).on("input", debounce_default(function(d3_event) {
60023         d3_event.preventDefault();
60024         var colour2 = this.value;
60025         if (!isColourValid(colour2))
60026           return;
60027         utilGetSetValue(input, this.value);
60028         change()();
60029         updateColourPreview();
60030       }, 100));
60031       outlinkButton = outlinkButton.enter().append("div").attr("class", "form-field-button colour-preview").append("div").style("background-color", (d) => d).attr("class", "colour-box");
60032       if (colour === "") {
60033         outlinkButton = outlinkButton.call(svgIcon("#iD-icon-edit"));
60034       }
60035       outlinkButton.on("click", () => wrap2.select(".colour-selector").node().click()).merge(outlinkButton);
60036     }
60037     function updatePhonePlaceholder() {
60038       if (input.empty() || !Object.keys(_phoneFormats).length)
60039         return;
60040       var extent = combinedEntityExtent();
60041       var countryCode = extent && iso1A2Code(extent.center());
60042       var format2 = countryCode && _phoneFormats[countryCode.toLowerCase()];
60043       if (format2)
60044         input.attr("placeholder", format2);
60045     }
60046     function validIdentifierValueForLink() {
60047       const value = utilGetSetValue(input).trim();
60048       if (field.type === "url" && value) {
60049         try {
60050           return new URL(value).href;
60051         } catch (e) {
60052           return null;
60053         }
60054       }
60055       if (field.type === "identifier" && field.pattern) {
60056         return value && value.match(new RegExp(field.pattern))[0];
60057       }
60058       return null;
60059     }
60060     function clamped(num) {
60061       if (field.minValue !== void 0) {
60062         num = Math.max(num, field.minValue);
60063       }
60064       if (field.maxValue !== void 0) {
60065         num = Math.min(num, field.maxValue);
60066       }
60067       return num;
60068     }
60069     function change(onInput) {
60070       return function() {
60071         var t = {};
60072         var val = utilGetSetValue(input);
60073         if (!onInput)
60074           val = context.cleanTagValue(val);
60075         if (!val && Array.isArray(_tags[field.key]))
60076           return;
60077         if (!onInput) {
60078           if (field.type === "number" && val) {
60079             var vals = val.split(";");
60080             vals = vals.map(function(v) {
60081               var num = Number(v);
60082               return isFinite(num) ? clamped(num) : v.trim();
60083             });
60084             val = vals.join(";");
60085           }
60086           utilGetSetValue(input, val);
60087         }
60088         t[field.key] = val || void 0;
60089         dispatch10.call("change", this, t, onInput);
60090       };
60091     }
60092     i2.entityIDs = function(val) {
60093       if (!arguments.length)
60094         return _entityIDs;
60095       _entityIDs = val;
60096       return i2;
60097     };
60098     i2.tags = function(tags) {
60099       _tags = tags;
60100       var isMixed = Array.isArray(tags[field.key]);
60101       utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed);
60102       if (field.type === "number") {
60103         const buttons = wrap2.selectAll(".increment, .decrement");
60104         if (isMixed) {
60105           buttons.attr("disabled", "disabled").classed("disabled", true);
60106         } else {
60107           var raw_vals = tags[field.key] || "0";
60108           const canIncDec = raw_vals.split(";").some((val) => isFinite(Number(val)) || isDirectionField && cardinal[val.trim().toLowerCase()]);
60109           buttons.attr("disabled", canIncDec ? null : "disabled").classed("disabled", !canIncDec);
60110         }
60111       }
60112       if (field.type === "tel")
60113         updatePhonePlaceholder();
60114       if (field.key.split(":").includes("colour"))
60115         updateColourPreview();
60116       if (outlinkButton && !outlinkButton.empty()) {
60117         var disabled = !validIdentifierValueForLink();
60118         outlinkButton.classed("disabled", disabled);
60119       }
60120       if (!isMixed) {
60121         _lengthIndicator.update(tags[field.key]);
60122       }
60123     };
60124     i2.focus = function() {
60125       var node = input.node();
60126       if (node)
60127         node.focus();
60128     };
60129     function combinedEntityExtent() {
60130       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
60131     }
60132     return utilRebind(i2, dispatch10, "on");
60133   }
60134
60135   // modules/ui/fields/access.js
60136   function uiFieldAccess(field, context) {
60137     var dispatch10 = dispatch_default("change");
60138     var items = select_default2(null);
60139     var _tags;
60140     function access(selection2) {
60141       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
60142       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
60143       var list = wrap2.selectAll("ul").data([0]);
60144       list = list.enter().append("ul").attr("class", "rows").merge(list);
60145       items = list.selectAll("li").data(field.keys);
60146       var enter = items.enter().append("li").attr("class", function(d) {
60147         return "labeled-input preset-access-" + d;
60148       });
60149       enter.append("span").attr("class", "label preset-label-access").attr("for", function(d) {
60150         return "preset-input-access-" + d;
60151       }).html(function(d) {
60152         return field.t.html("types." + d);
60153       });
60154       enter.append("div").attr("class", "preset-input-access-wrap").append("input").attr("type", "text").attr("class", function(d) {
60155         return "preset-input-access preset-input-access-" + d;
60156       }).call(utilNoAuto).each(function(d) {
60157         select_default2(this).call(
60158           uiCombobox(context, "access-" + d).data(access.options(d))
60159         );
60160       });
60161       items = items.merge(enter);
60162       wrap2.selectAll(".preset-input-access").on("change", change).on("blur", change);
60163     }
60164     function change(d3_event, d) {
60165       var tag = {};
60166       var value = context.cleanTagValue(utilGetSetValue(select_default2(this)));
60167       if (!value && typeof _tags[d] !== "string")
60168         return;
60169       tag[d] = value || void 0;
60170       dispatch10.call("change", this, tag);
60171     }
60172     access.options = function(type2) {
60173       var options2 = [
60174         "yes",
60175         "no",
60176         "designated",
60177         "permissive",
60178         "destination",
60179         "customers",
60180         "private",
60181         "permit",
60182         "unknown"
60183       ];
60184       if (type2 === "access") {
60185         options2 = options2.filter((v) => v !== "yes" && v !== "designated");
60186       }
60187       if (type2 === "bicycle") {
60188         options2.splice(options2.length - 4, 0, "dismount");
60189       }
60190       var stringsField = field.resolveReference("stringsCrossReference");
60191       return options2.map(function(option) {
60192         return {
60193           title: stringsField.t("options." + option + ".description"),
60194           value: option
60195         };
60196       });
60197     };
60198     const placeholdersByTag = {
60199       highway: {
60200         footway: {
60201           foot: "designated",
60202           motor_vehicle: "no"
60203         },
60204         steps: {
60205           foot: "yes",
60206           motor_vehicle: "no",
60207           bicycle: "no",
60208           horse: "no"
60209         },
60210         pedestrian: {
60211           foot: "yes",
60212           motor_vehicle: "no"
60213         },
60214         cycleway: {
60215           motor_vehicle: "no",
60216           bicycle: "designated"
60217         },
60218         bridleway: {
60219           motor_vehicle: "no",
60220           horse: "designated"
60221         },
60222         path: {
60223           foot: "yes",
60224           motor_vehicle: "no",
60225           bicycle: "yes",
60226           horse: "yes"
60227         },
60228         motorway: {
60229           foot: "no",
60230           motor_vehicle: "yes",
60231           bicycle: "no",
60232           horse: "no"
60233         },
60234         trunk: {
60235           motor_vehicle: "yes"
60236         },
60237         primary: {
60238           foot: "yes",
60239           motor_vehicle: "yes",
60240           bicycle: "yes",
60241           horse: "yes"
60242         },
60243         secondary: {
60244           foot: "yes",
60245           motor_vehicle: "yes",
60246           bicycle: "yes",
60247           horse: "yes"
60248         },
60249         tertiary: {
60250           foot: "yes",
60251           motor_vehicle: "yes",
60252           bicycle: "yes",
60253           horse: "yes"
60254         },
60255         residential: {
60256           foot: "yes",
60257           motor_vehicle: "yes",
60258           bicycle: "yes",
60259           horse: "yes"
60260         },
60261         unclassified: {
60262           foot: "yes",
60263           motor_vehicle: "yes",
60264           bicycle: "yes",
60265           horse: "yes"
60266         },
60267         service: {
60268           foot: "yes",
60269           motor_vehicle: "yes",
60270           bicycle: "yes",
60271           horse: "yes"
60272         },
60273         motorway_link: {
60274           foot: "no",
60275           motor_vehicle: "yes",
60276           bicycle: "no",
60277           horse: "no"
60278         },
60279         trunk_link: {
60280           motor_vehicle: "yes"
60281         },
60282         primary_link: {
60283           foot: "yes",
60284           motor_vehicle: "yes",
60285           bicycle: "yes",
60286           horse: "yes"
60287         },
60288         secondary_link: {
60289           foot: "yes",
60290           motor_vehicle: "yes",
60291           bicycle: "yes",
60292           horse: "yes"
60293         },
60294         tertiary_link: {
60295           foot: "yes",
60296           motor_vehicle: "yes",
60297           bicycle: "yes",
60298           horse: "yes"
60299         },
60300         construction: {
60301           access: "no"
60302         }
60303       },
60304       barrier: {
60305         bollard: {
60306           access: "no",
60307           bicycle: "yes",
60308           foot: "yes"
60309         },
60310         bus_trap: {
60311           motor_vehicle: "no",
60312           psv: "yes",
60313           foot: "yes",
60314           bicycle: "yes"
60315         },
60316         city_wall: {
60317           access: "no"
60318         },
60319         coupure: {
60320           access: "yes"
60321         },
60322         cycle_barrier: {
60323           motor_vehicle: "no"
60324         },
60325         ditch: {
60326           access: "no"
60327         },
60328         entrance: {
60329           access: "yes"
60330         },
60331         fence: {
60332           access: "no"
60333         },
60334         hedge: {
60335           access: "no"
60336         },
60337         jersey_barrier: {
60338           access: "no"
60339         },
60340         motorcycle_barrier: {
60341           motor_vehicle: "no"
60342         },
60343         rail_guard: {
60344           access: "no"
60345         }
60346       }
60347     };
60348     access.tags = function(tags) {
60349       _tags = tags;
60350       utilGetSetValue(items.selectAll(".preset-input-access"), function(d) {
60351         return typeof tags[d] === "string" ? tags[d] : "";
60352       }).classed("mixed", function(d) {
60353         return tags[d] && Array.isArray(tags[d]);
60354       }).attr("title", function(d) {
60355         return tags[d] && Array.isArray(tags[d]) && tags[d].filter(Boolean).join("\n");
60356       }).attr("placeholder", function(d) {
60357         if (tags[d] && Array.isArray(tags[d])) {
60358           return _t("inspector.multiple_values");
60359         }
60360         if (d === "bicycle" || d === "motor_vehicle") {
60361           if (tags.vehicle && typeof tags.vehicle === "string") {
60362             return tags.vehicle;
60363           }
60364         }
60365         if (tags.access && typeof tags.access === "string") {
60366           return tags.access;
60367         }
60368         function getPlaceholdersByTag(key, placeholdersByKey) {
60369           if (typeof tags[key] === "string") {
60370             if (placeholdersByKey[tags[key]] && placeholdersByKey[tags[key]][d]) {
60371               return placeholdersByKey[tags[key]][d];
60372             }
60373           } else {
60374             var impliedAccesses = tags[key].filter(Boolean).map(function(val) {
60375               return placeholdersByKey[val] && placeholdersByKey[val][d];
60376             }).filter(Boolean);
60377             if (impliedAccesses.length === tags[key].length && new Set(impliedAccesses).size === 1) {
60378               return impliedAccesses[0];
60379             }
60380           }
60381         }
60382         for (const key in placeholdersByTag) {
60383           if (tags[key]) {
60384             const impliedAccess = getPlaceholdersByTag(key, placeholdersByTag[key]);
60385             if (impliedAccess) {
60386               return impliedAccess;
60387             }
60388           }
60389         }
60390         if (d === "access" && !tags.barrier) {
60391           return "yes";
60392         }
60393         return field.placeholder();
60394       });
60395     };
60396     access.focus = function() {
60397       items.selectAll(".preset-input-access").node().focus();
60398     };
60399     return utilRebind(access, dispatch10, "on");
60400   }
60401
60402   // modules/ui/fields/address.js
60403   function uiFieldAddress(field, context) {
60404     var dispatch10 = dispatch_default("change");
60405     var _selection = select_default2(null);
60406     var _wrap = select_default2(null);
60407     var addrField = _mainPresetIndex.field("address");
60408     var _entityIDs = [];
60409     var _tags;
60410     var _countryCode;
60411     var _addressFormats = [{
60412       format: [
60413         ["housenumber", "street"],
60414         ["city", "postcode"]
60415       ]
60416     }];
60417     _mainFileFetcher.get("address_formats").then(function(d) {
60418       _addressFormats = d;
60419       if (!_selection.empty()) {
60420         _selection.call(address);
60421       }
60422     }).catch(function() {
60423     });
60424     function getNearStreets() {
60425       var extent = combinedEntityExtent();
60426       var l = extent.center();
60427       var box = geoExtent(l).padByMeters(200);
60428       var streets = context.history().intersects(box).filter(isAddressable).map(function(d) {
60429         var loc = context.projection([
60430           (extent[0][0] + extent[1][0]) / 2,
60431           (extent[0][1] + extent[1][1]) / 2
60432         ]);
60433         var choice = geoChooseEdge(context.graph().childNodes(d), loc, context.projection);
60434         return {
60435           title: d.tags.name,
60436           value: d.tags.name,
60437           dist: choice.distance
60438         };
60439       }).sort(function(a, b) {
60440         return a.dist - b.dist;
60441       });
60442       return utilArrayUniqBy(streets, "value");
60443       function isAddressable(d) {
60444         return d.tags.highway && d.tags.name && d.type === "way";
60445       }
60446     }
60447     function getNearCities() {
60448       var extent = combinedEntityExtent();
60449       var l = extent.center();
60450       var box = geoExtent(l).padByMeters(200);
60451       var cities = context.history().intersects(box).filter(isAddressable).map(function(d) {
60452         return {
60453           title: d.tags["addr:city"] || d.tags.name,
60454           value: d.tags["addr:city"] || d.tags.name,
60455           dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
60456         };
60457       }).sort(function(a, b) {
60458         return a.dist - b.dist;
60459       });
60460       return utilArrayUniqBy(cities, "value");
60461       function isAddressable(d) {
60462         if (d.tags.name) {
60463           if (d.tags.admin_level === "8" && d.tags.boundary === "administrative")
60464             return true;
60465           if (d.tags.border_type === "city")
60466             return true;
60467           if (d.tags.place === "city" || d.tags.place === "town" || d.tags.place === "village")
60468             return true;
60469         }
60470         if (d.tags["addr:city"])
60471           return true;
60472         return false;
60473       }
60474     }
60475     function getNearValues(key) {
60476       var extent = combinedEntityExtent();
60477       var l = extent.center();
60478       var box = geoExtent(l).padByMeters(200);
60479       var results = context.history().intersects(box).filter(function hasTag(d) {
60480         return _entityIDs.indexOf(d.id) === -1 && d.tags[key];
60481       }).map(function(d) {
60482         return {
60483           title: d.tags[key],
60484           value: d.tags[key],
60485           dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
60486         };
60487       }).sort(function(a, b) {
60488         return a.dist - b.dist;
60489       });
60490       return utilArrayUniqBy(results, "value");
60491     }
60492     function updateForCountryCode() {
60493       if (!_countryCode)
60494         return;
60495       var addressFormat;
60496       for (var i2 = 0; i2 < _addressFormats.length; i2++) {
60497         var format2 = _addressFormats[i2];
60498         if (!format2.countryCodes) {
60499           addressFormat = format2;
60500         } else if (format2.countryCodes.indexOf(_countryCode) !== -1) {
60501           addressFormat = format2;
60502           break;
60503         }
60504       }
60505       var dropdowns = addressFormat.dropdowns || [
60506         "city",
60507         "county",
60508         "country",
60509         "district",
60510         "hamlet",
60511         "neighbourhood",
60512         "place",
60513         "postcode",
60514         "province",
60515         "quarter",
60516         "state",
60517         "street",
60518         "subdistrict",
60519         "suburb"
60520       ];
60521       var widths = addressFormat.widths || {
60522         housenumber: 1 / 3,
60523         street: 2 / 3,
60524         city: 2 / 3,
60525         state: 1 / 4,
60526         postcode: 1 / 3
60527       };
60528       function row(r) {
60529         var total = r.reduce(function(sum, key) {
60530           return sum + (widths[key] || 0.5);
60531         }, 0);
60532         return r.map(function(key) {
60533           return {
60534             id: key,
60535             width: (widths[key] || 0.5) / total
60536           };
60537         });
60538       }
60539       var rows = _wrap.selectAll(".addr-row").data(addressFormat.format, function(d) {
60540         return d.toString();
60541       });
60542       rows.exit().remove();
60543       rows.enter().append("div").attr("class", "addr-row").selectAll("input").data(row).enter().append("input").property("type", "text").call(updatePlaceholder).attr("class", function(d) {
60544         return "addr-" + d.id;
60545       }).call(utilNoAuto).each(addDropdown).style("width", function(d) {
60546         return d.width * 100 + "%";
60547       });
60548       function addDropdown(d) {
60549         if (dropdowns.indexOf(d.id) === -1)
60550           return;
60551         var nearValues = d.id === "street" ? getNearStreets : d.id === "city" ? getNearCities : getNearValues;
60552         select_default2(this).call(
60553           uiCombobox(context, "address-" + d.id).minItems(1).caseSensitive(true).fetcher(function(value, callback) {
60554             callback(nearValues("addr:" + d.id));
60555           })
60556         );
60557       }
60558       _wrap.selectAll("input").on("blur", change()).on("change", change());
60559       _wrap.selectAll("input:not(.combobox-input)").on("input", change(true));
60560       if (_tags)
60561         updateTags(_tags);
60562     }
60563     function address(selection2) {
60564       _selection = selection2;
60565       _wrap = selection2.selectAll(".form-field-input-wrap").data([0]);
60566       _wrap = _wrap.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(_wrap);
60567       var extent = combinedEntityExtent();
60568       if (extent) {
60569         var countryCode;
60570         if (context.inIntro()) {
60571           countryCode = _t("intro.graph.countrycode");
60572         } else {
60573           var center = extent.center();
60574           countryCode = iso1A2Code(center);
60575         }
60576         if (countryCode) {
60577           _countryCode = countryCode.toLowerCase();
60578           updateForCountryCode();
60579         }
60580       }
60581     }
60582     function change(onInput) {
60583       return function() {
60584         var tags = {};
60585         _wrap.selectAll("input").each(function(subfield) {
60586           var key = field.key + ":" + subfield.id;
60587           var value = this.value;
60588           if (!onInput)
60589             value = context.cleanTagValue(value);
60590           if (Array.isArray(_tags[key]) && !value)
60591             return;
60592           tags[key] = value || void 0;
60593         });
60594         dispatch10.call("change", this, tags, onInput);
60595       };
60596     }
60597     function updatePlaceholder(inputSelection) {
60598       return inputSelection.attr("placeholder", function(subfield) {
60599         if (_tags && Array.isArray(_tags[field.key + ":" + subfield.id])) {
60600           return _t("inspector.multiple_values");
60601         }
60602         if (_countryCode) {
60603           var localkey = subfield.id + "!" + _countryCode;
60604           var tkey = addrField.hasTextForStringId("placeholders." + localkey) ? localkey : subfield.id;
60605           return addrField.t("placeholders." + tkey);
60606         }
60607       });
60608     }
60609     function updateTags(tags) {
60610       utilGetSetValue(_wrap.selectAll("input"), function(subfield) {
60611         var val = tags[field.key + ":" + subfield.id];
60612         return typeof val === "string" ? val : "";
60613       }).attr("title", function(subfield) {
60614         var val = tags[field.key + ":" + subfield.id];
60615         return val && Array.isArray(val) ? val.filter(Boolean).join("\n") : void 0;
60616       }).classed("mixed", function(subfield) {
60617         return Array.isArray(tags[field.key + ":" + subfield.id]);
60618       }).call(updatePlaceholder);
60619     }
60620     function combinedEntityExtent() {
60621       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
60622     }
60623     address.entityIDs = function(val) {
60624       if (!arguments.length)
60625         return _entityIDs;
60626       _entityIDs = val;
60627       return address;
60628     };
60629     address.tags = function(tags) {
60630       _tags = tags;
60631       updateTags(tags);
60632     };
60633     address.focus = function() {
60634       var node = _wrap.selectAll("input").node();
60635       if (node)
60636         node.focus();
60637     };
60638     return utilRebind(address, dispatch10, "on");
60639   }
60640
60641   // modules/ui/fields/directional_combo.js
60642   function uiFieldDirectionalCombo(field, context) {
60643     var dispatch10 = dispatch_default("change");
60644     var items = select_default2(null);
60645     var wrap2 = select_default2(null);
60646     var _tags;
60647     var _combos = {};
60648     function directionalCombo(selection2) {
60649       function stripcolon(s) {
60650         return s.replace(":", "");
60651       }
60652       wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
60653       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
60654       var div = wrap2.selectAll("ul").data([0]);
60655       div = div.enter().append("ul").attr("class", "rows").merge(div);
60656       var keys = field.keys.slice(1);
60657       items = div.selectAll("li").data(keys);
60658       var enter = items.enter().append("li").attr("class", function(d) {
60659         return "labeled-input preset-directionalcombo-" + stripcolon(d);
60660       });
60661       enter.append("span").attr("class", "label preset-label-directionalcombo").attr("for", function(d) {
60662         return "preset-input-directionalcombo-" + stripcolon(d);
60663       }).html(function(d) {
60664         return field.t.html("types." + d);
60665       });
60666       enter.append("div").attr("class", "preset-input-directionalcombo-wrap form-field-input-wrap").each(function(key) {
60667         const subField = {
60668           ...field,
60669           type: "combo",
60670           key
60671         };
60672         const combo = uiFieldCombo(subField, context);
60673         combo.on("change", (t) => change(key, t[key]));
60674         _combos[key] = combo;
60675         select_default2(this).call(combo);
60676       });
60677       items = items.merge(enter);
60678       wrap2.selectAll(".preset-input-directionalcombo").on("change", change).on("blur", change);
60679     }
60680     function change(key, newValue) {
60681       const commonKey = field.keys[0];
60682       const otherKey = key === field.keys[1] ? field.keys[2] : field.keys[1];
60683       dispatch10.call("change", this, (tags) => {
60684         const otherValue = tags[otherKey] || tags[commonKey];
60685         if (newValue === otherValue) {
60686           tags[commonKey] = newValue;
60687           delete tags[key];
60688           delete tags[otherKey];
60689         } else {
60690           tags[key] = newValue;
60691           delete tags[commonKey];
60692           tags[otherKey] = otherValue;
60693         }
60694         return tags;
60695       });
60696     }
60697     directionalCombo.tags = function(tags) {
60698       _tags = tags;
60699       const commonKey = field.keys[0];
60700       for (let key in _combos) {
60701         const uniqueValues = [...new Set([].concat(_tags[commonKey]).concat(_tags[key]).filter(Boolean))];
60702         _combos[key].tags({ [key]: uniqueValues.length > 1 ? uniqueValues : uniqueValues[0] });
60703       }
60704     };
60705     directionalCombo.focus = function() {
60706       var node = wrap2.selectAll("input").node();
60707       if (node)
60708         node.focus();
60709     };
60710     return utilRebind(directionalCombo, dispatch10, "on");
60711   }
60712
60713   // modules/ui/fields/lanes.js
60714   function uiFieldLanes(field, context) {
60715     var dispatch10 = dispatch_default("change");
60716     var LANE_WIDTH = 40;
60717     var LANE_HEIGHT = 200;
60718     var _entityIDs = [];
60719     function lanes(selection2) {
60720       var lanesData = context.entity(_entityIDs[0]).lanes();
60721       if (!context.container().select(".inspector-wrap.inspector-hidden").empty() || !selection2.node().parentNode) {
60722         selection2.call(lanes.off);
60723         return;
60724       }
60725       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
60726       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
60727       var surface = wrap2.selectAll(".surface").data([0]);
60728       var d = utilGetDimensions(wrap2);
60729       var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
60730       surface = surface.enter().append("svg").attr("width", d[0]).attr("height", 300).attr("class", "surface").merge(surface);
60731       var lanesSelection = surface.selectAll(".lanes").data([0]);
60732       lanesSelection = lanesSelection.enter().append("g").attr("class", "lanes").merge(lanesSelection);
60733       lanesSelection.attr("transform", function() {
60734         return "translate(" + freeSpace / 2 + ", 0)";
60735       });
60736       var lane = lanesSelection.selectAll(".lane").data(lanesData.lanes);
60737       lane.exit().remove();
60738       var enter = lane.enter().append("g").attr("class", "lane");
60739       enter.append("g").append("rect").attr("y", 50).attr("width", LANE_WIDTH).attr("height", LANE_HEIGHT);
60740       enter.append("g").attr("class", "forward").append("text").attr("y", 40).attr("x", 14).text("\u25B2");
60741       enter.append("g").attr("class", "bothways").append("text").attr("y", 40).attr("x", 14).text("\u25B2\u25BC");
60742       enter.append("g").attr("class", "backward").append("text").attr("y", 40).attr("x", 14).text("\u25BC");
60743       lane = lane.merge(enter);
60744       lane.attr("transform", function(d2) {
60745         return "translate(" + LANE_WIDTH * d2.index * 1.5 + ", 0)";
60746       });
60747       lane.select(".forward").style("visibility", function(d2) {
60748         return d2.direction === "forward" ? "visible" : "hidden";
60749       });
60750       lane.select(".bothways").style("visibility", function(d2) {
60751         return d2.direction === "bothways" ? "visible" : "hidden";
60752       });
60753       lane.select(".backward").style("visibility", function(d2) {
60754         return d2.direction === "backward" ? "visible" : "hidden";
60755       });
60756     }
60757     lanes.entityIDs = function(val) {
60758       _entityIDs = val;
60759     };
60760     lanes.tags = function() {
60761     };
60762     lanes.focus = function() {
60763     };
60764     lanes.off = function() {
60765     };
60766     return utilRebind(lanes, dispatch10, "on");
60767   }
60768   uiFieldLanes.supportsMultiselection = false;
60769
60770   // modules/ui/fields/localized.js
60771   var _languagesArray = [];
60772   function uiFieldLocalized(field, context) {
60773     var dispatch10 = dispatch_default("change", "input");
60774     var wikipedia = services.wikipedia;
60775     var input = select_default2(null);
60776     var localizedInputs = select_default2(null);
60777     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue());
60778     var _countryCode;
60779     var _tags;
60780     _mainFileFetcher.get("languages").then(loadLanguagesArray).catch(function() {
60781     });
60782     var _territoryLanguages = {};
60783     _mainFileFetcher.get("territory_languages").then(function(d) {
60784       _territoryLanguages = d;
60785     }).catch(function() {
60786     });
60787     var langCombo = uiCombobox(context, "localized-lang").fetcher(fetchLanguages).minItems(0);
60788     var _selection = select_default2(null);
60789     var _multilingual = [];
60790     var _buttonTip = uiTooltip().title(() => _t.append("translate.translate")).placement("left");
60791     var _wikiTitles;
60792     var _entityIDs = [];
60793     function loadLanguagesArray(dataLanguages) {
60794       if (_languagesArray.length !== 0)
60795         return;
60796       var replacements = {
60797         sr: "sr-Cyrl",
60798         // in OSM, `sr` implies Cyrillic
60799         "sr-Cyrl": false
60800         // `sr-Cyrl` isn't used in OSM
60801       };
60802       for (var code in dataLanguages) {
60803         if (replacements[code] === false)
60804           continue;
60805         var metaCode = code;
60806         if (replacements[code])
60807           metaCode = replacements[code];
60808         _languagesArray.push({
60809           localName: _mainLocalizer.languageName(metaCode, { localOnly: true }),
60810           nativeName: dataLanguages[metaCode].nativeName,
60811           code,
60812           label: _mainLocalizer.languageName(metaCode)
60813         });
60814       }
60815     }
60816     function calcLocked() {
60817       var isLocked = field.id === "name" && _entityIDs.length && _entityIDs.some(function(entityID) {
60818         var entity = context.graph().hasEntity(entityID);
60819         if (!entity)
60820           return false;
60821         if (entity.tags.wikidata)
60822           return true;
60823         if (entity.tags["name:etymology:wikidata"])
60824           return true;
60825         var preset = _mainPresetIndex.match(entity, context.graph());
60826         if (preset) {
60827           var isSuggestion = preset.suggestion;
60828           var fields = preset.fields();
60829           var showsBrandField = fields.some(function(d) {
60830             return d.id === "brand";
60831           });
60832           var showsOperatorField = fields.some(function(d) {
60833             return d.id === "operator";
60834           });
60835           var setsName = preset.addTags.name;
60836           var setsBrandWikidata = preset.addTags["brand:wikidata"];
60837           var setsOperatorWikidata = preset.addTags["operator:wikidata"];
60838           return isSuggestion && setsName && (setsBrandWikidata && !showsBrandField || setsOperatorWikidata && !showsOperatorField);
60839         }
60840         return false;
60841       });
60842       field.locked(isLocked);
60843     }
60844     function calcMultilingual(tags) {
60845       var existingLangsOrdered = _multilingual.map(function(item2) {
60846         return item2.lang;
60847       });
60848       var existingLangs = new Set(existingLangsOrdered.filter(Boolean));
60849       for (var k in tags) {
60850         var m = k.match(/^(.*):([a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2})?)$/);
60851         if (m && m[1] === field.key && m[2]) {
60852           var item = { lang: m[2], value: tags[k] };
60853           if (existingLangs.has(item.lang)) {
60854             _multilingual[existingLangsOrdered.indexOf(item.lang)].value = item.value;
60855             existingLangs.delete(item.lang);
60856           } else {
60857             _multilingual.push(item);
60858           }
60859         }
60860       }
60861       _multilingual.forEach(function(item2) {
60862         if (item2.lang && existingLangs.has(item2.lang)) {
60863           item2.value = "";
60864         }
60865       });
60866     }
60867     function localized(selection2) {
60868       _selection = selection2;
60869       calcLocked();
60870       var isLocked = field.locked();
60871       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
60872       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
60873       input = wrap2.selectAll(".localized-main").data([0]);
60874       input = input.enter().append("input").attr("type", "text").attr("id", field.domId).attr("class", "localized-main").call(utilNoAuto).merge(input);
60875       input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change());
60876       wrap2.call(_lengthIndicator);
60877       var translateButton = wrap2.selectAll(".localized-add").data([0]);
60878       translateButton = translateButton.enter().append("button").attr("class", "localized-add form-field-button").attr("aria-label", _t("icons.plus")).call(svgIcon("#iD-icon-plus")).merge(translateButton);
60879       translateButton.classed("disabled", !!isLocked).call(isLocked ? _buttonTip.destroy : _buttonTip).on("click", addNew);
60880       if (_tags && !_multilingual.length) {
60881         calcMultilingual(_tags);
60882       }
60883       localizedInputs = selection2.selectAll(".localized-multilingual").data([0]);
60884       localizedInputs = localizedInputs.enter().append("div").attr("class", "localized-multilingual").merge(localizedInputs);
60885       localizedInputs.call(renderMultilingual);
60886       localizedInputs.selectAll("button, input").classed("disabled", !!isLocked).attr("readonly", isLocked || null);
60887       selection2.selectAll(".combobox-caret").classed("nope", true);
60888       function addNew(d3_event) {
60889         d3_event.preventDefault();
60890         if (field.locked())
60891           return;
60892         var defaultLang = _mainLocalizer.languageCode().toLowerCase();
60893         var langExists = _multilingual.find(function(datum2) {
60894           return datum2.lang === defaultLang;
60895         });
60896         var isLangEn = defaultLang.indexOf("en") > -1;
60897         if (isLangEn || langExists) {
60898           defaultLang = "";
60899           langExists = _multilingual.find(function(datum2) {
60900             return datum2.lang === defaultLang;
60901           });
60902         }
60903         if (!langExists) {
60904           _multilingual.unshift({ lang: defaultLang, value: "" });
60905           localizedInputs.call(renderMultilingual);
60906         }
60907       }
60908       function change(onInput) {
60909         return function(d3_event) {
60910           if (field.locked()) {
60911             d3_event.preventDefault();
60912             return;
60913           }
60914           var val = utilGetSetValue(select_default2(this));
60915           if (!onInput)
60916             val = context.cleanTagValue(val);
60917           if (!val && Array.isArray(_tags[field.key]))
60918             return;
60919           var t = {};
60920           t[field.key] = val || void 0;
60921           dispatch10.call("change", this, t, onInput);
60922         };
60923       }
60924     }
60925     function key(lang) {
60926       return field.key + ":" + lang;
60927     }
60928     function changeLang(d3_event, d) {
60929       var tags = {};
60930       var lang = utilGetSetValue(select_default2(this)).toLowerCase();
60931       var language = _languagesArray.find(function(d2) {
60932         return d2.label.toLowerCase() === lang || d2.localName && d2.localName.toLowerCase() === lang || d2.nativeName && d2.nativeName.toLowerCase() === lang;
60933       });
60934       if (language)
60935         lang = language.code;
60936       if (d.lang && d.lang !== lang) {
60937         tags[key(d.lang)] = void 0;
60938       }
60939       var newKey = lang && context.cleanTagKey(key(lang));
60940       var value = utilGetSetValue(select_default2(this.parentNode).selectAll(".localized-value"));
60941       if (newKey && value) {
60942         tags[newKey] = value;
60943       } else if (newKey && _wikiTitles && _wikiTitles[d.lang]) {
60944         tags[newKey] = _wikiTitles[d.lang];
60945       }
60946       d.lang = lang;
60947       dispatch10.call("change", this, tags);
60948     }
60949     function changeValue(d3_event, d) {
60950       if (!d.lang)
60951         return;
60952       var value = context.cleanTagValue(utilGetSetValue(select_default2(this))) || void 0;
60953       if (!value && Array.isArray(d.value))
60954         return;
60955       var t = {};
60956       t[key(d.lang)] = value;
60957       d.value = value;
60958       dispatch10.call("change", this, t);
60959     }
60960     function fetchLanguages(value, cb) {
60961       var v = value.toLowerCase();
60962       var langCodes = [_mainLocalizer.localeCode(), _mainLocalizer.languageCode()];
60963       if (_countryCode && _territoryLanguages[_countryCode]) {
60964         langCodes = langCodes.concat(_territoryLanguages[_countryCode]);
60965       }
60966       var langItems = [];
60967       langCodes.forEach(function(code) {
60968         var langItem = _languagesArray.find(function(item) {
60969           return item.code === code;
60970         });
60971         if (langItem)
60972           langItems.push(langItem);
60973       });
60974       langItems = utilArrayUniq(langItems.concat(_languagesArray));
60975       cb(langItems.filter(function(d) {
60976         return d.label.toLowerCase().indexOf(v) >= 0 || d.localName && d.localName.toLowerCase().indexOf(v) >= 0 || d.nativeName && d.nativeName.toLowerCase().indexOf(v) >= 0 || d.code.toLowerCase().indexOf(v) >= 0;
60977       }).map(function(d) {
60978         return { value: d.label };
60979       }));
60980     }
60981     function renderMultilingual(selection2) {
60982       var entries = selection2.selectAll("div.entry").data(_multilingual, function(d) {
60983         return d.lang;
60984       });
60985       entries.exit().style("top", "0").style("max-height", "240px").transition().duration(200).style("opacity", "0").style("max-height", "0px").remove();
60986       var entriesEnter = entries.enter().append("div").attr("class", "entry").each(function(_, index) {
60987         var wrap2 = select_default2(this);
60988         var domId = utilUniqueDomId(index);
60989         var label = wrap2.append("label").attr("class", "field-label").attr("for", domId);
60990         var text2 = label.append("span").attr("class", "label-text");
60991         text2.append("span").attr("class", "label-textvalue").call(_t.append("translate.localized_translation_label"));
60992         text2.append("span").attr("class", "label-textannotation");
60993         label.append("button").attr("class", "remove-icon-multilingual").attr("title", _t("icons.remove")).on("click", function(d3_event, d) {
60994           if (field.locked())
60995             return;
60996           d3_event.preventDefault();
60997           _multilingual.splice(_multilingual.indexOf(d), 1);
60998           var langKey = d.lang && key(d.lang);
60999           if (langKey && langKey in _tags) {
61000             delete _tags[langKey];
61001             var t = {};
61002             t[langKey] = void 0;
61003             dispatch10.call("change", this, t);
61004             return;
61005           }
61006           renderMultilingual(selection2);
61007         }).call(svgIcon("#iD-operation-delete"));
61008         wrap2.append("input").attr("class", "localized-lang").attr("id", domId).attr("type", "text").attr("placeholder", _t("translate.localized_translation_language")).on("blur", changeLang).on("change", changeLang).call(langCombo);
61009         wrap2.append("input").attr("type", "text").attr("class", "localized-value").on("blur", changeValue).on("change", changeValue);
61010       });
61011       entriesEnter.style("margin-top", "0px").style("max-height", "0px").style("opacity", "0").transition().duration(200).style("margin-top", "10px").style("max-height", "240px").style("opacity", "1").on("end", function() {
61012         select_default2(this).style("max-height", "").style("overflow", "visible");
61013       });
61014       entries = entries.merge(entriesEnter);
61015       entries.order();
61016       entries.classed("present", true);
61017       utilGetSetValue(entries.select(".localized-lang"), function(d) {
61018         var langItem = _languagesArray.find(function(item) {
61019           return item.code === d.lang;
61020         });
61021         if (langItem)
61022           return langItem.label;
61023         return d.lang;
61024       });
61025       utilGetSetValue(entries.select(".localized-value"), function(d) {
61026         return typeof d.value === "string" ? d.value : "";
61027       }).attr("title", function(d) {
61028         return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : null;
61029       }).attr("placeholder", function(d) {
61030         return Array.isArray(d.value) ? _t("inspector.multiple_values") : _t("translate.localized_translation_name");
61031       }).classed("mixed", function(d) {
61032         return Array.isArray(d.value);
61033       });
61034     }
61035     localized.tags = function(tags) {
61036       _tags = tags;
61037       if (typeof tags.wikipedia === "string" && !_wikiTitles) {
61038         _wikiTitles = {};
61039         var wm = tags.wikipedia.match(/([^:]+):(.+)/);
61040         if (wm && wm[0] && wm[1]) {
61041           wikipedia.translations(wm[1], wm[2], function(err, d) {
61042             if (err || !d)
61043               return;
61044             _wikiTitles = d;
61045           });
61046         }
61047       }
61048       var isMixed = Array.isArray(tags[field.key]);
61049       utilGetSetValue(input, typeof tags[field.key] === "string" ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder()).classed("mixed", isMixed);
61050       calcMultilingual(tags);
61051       _selection.call(localized);
61052       if (!isMixed) {
61053         _lengthIndicator.update(tags[field.key]);
61054       }
61055     };
61056     localized.focus = function() {
61057       input.node().focus();
61058     };
61059     localized.entityIDs = function(val) {
61060       if (!arguments.length)
61061         return _entityIDs;
61062       _entityIDs = val;
61063       _multilingual = [];
61064       loadCountryCode();
61065       return localized;
61066     };
61067     function loadCountryCode() {
61068       var extent = combinedEntityExtent();
61069       var countryCode = extent && iso1A2Code(extent.center());
61070       _countryCode = countryCode && countryCode.toLowerCase();
61071     }
61072     function combinedEntityExtent() {
61073       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
61074     }
61075     return utilRebind(localized, dispatch10, "on");
61076   }
61077
61078   // modules/ui/fields/roadheight.js
61079   function uiFieldRoadheight(field, context) {
61080     var dispatch10 = dispatch_default("change");
61081     var primaryUnitInput = select_default2(null);
61082     var primaryInput = select_default2(null);
61083     var secondaryInput = select_default2(null);
61084     var secondaryUnitInput = select_default2(null);
61085     var _entityIDs = [];
61086     var _tags;
61087     var _isImperial;
61088     var primaryUnits = [
61089       {
61090         value: "m",
61091         title: _t("inspector.roadheight.meter")
61092       },
61093       {
61094         value: "ft",
61095         title: _t("inspector.roadheight.foot")
61096       }
61097     ];
61098     var unitCombo = uiCombobox(context, "roadheight-unit").data(primaryUnits);
61099     function roadheight(selection2) {
61100       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61101       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61102       primaryInput = wrap2.selectAll("input.roadheight-number").data([0]);
61103       primaryInput = primaryInput.enter().append("input").attr("type", "text").attr("class", "roadheight-number").attr("id", field.domId).call(utilNoAuto).merge(primaryInput);
61104       primaryInput.on("change", change).on("blur", change);
61105       var loc = combinedEntityExtent().center();
61106       _isImperial = roadHeightUnit(loc) === "ft";
61107       primaryUnitInput = wrap2.selectAll("input.roadheight-unit").data([0]);
61108       primaryUnitInput = primaryUnitInput.enter().append("input").attr("type", "text").attr("class", "roadheight-unit").call(unitCombo).merge(primaryUnitInput);
61109       primaryUnitInput.on("blur", changeUnits).on("change", changeUnits);
61110       secondaryInput = wrap2.selectAll("input.roadheight-secondary-number").data([0]);
61111       secondaryInput = secondaryInput.enter().append("input").attr("type", "text").attr("class", "roadheight-secondary-number").call(utilNoAuto).merge(secondaryInput);
61112       secondaryInput.on("change", change).on("blur", change);
61113       secondaryUnitInput = wrap2.selectAll("input.roadheight-secondary-unit").data([0]);
61114       secondaryUnitInput = secondaryUnitInput.enter().append("input").attr("type", "text").call(utilNoAuto).classed("disabled", true).classed("roadheight-secondary-unit", true).attr("readonly", "readonly").merge(secondaryUnitInput);
61115       function changeUnits() {
61116         var primaryUnit = utilGetSetValue(primaryUnitInput);
61117         if (primaryUnit === "m") {
61118           _isImperial = false;
61119         } else if (primaryUnit === "ft") {
61120           _isImperial = true;
61121         }
61122         utilGetSetValue(primaryUnitInput, _isImperial ? "ft" : "m");
61123         setUnitSuggestions();
61124         change();
61125       }
61126     }
61127     function setUnitSuggestions() {
61128       utilGetSetValue(primaryUnitInput, _isImperial ? "ft" : "m");
61129     }
61130     function change() {
61131       var tag = {};
61132       var primaryValue = utilGetSetValue(primaryInput).trim();
61133       var secondaryValue = utilGetSetValue(secondaryInput).trim();
61134       if (!primaryValue && !secondaryValue && Array.isArray(_tags[field.key]))
61135         return;
61136       if (!primaryValue && !secondaryValue) {
61137         tag[field.key] = void 0;
61138       } else if (isNaN(primaryValue) || isNaN(secondaryValue) || !_isImperial) {
61139         tag[field.key] = context.cleanTagValue(primaryValue);
61140       } else {
61141         if (primaryValue !== "") {
61142           primaryValue = context.cleanTagValue(primaryValue + "'");
61143         }
61144         if (secondaryValue !== "") {
61145           secondaryValue = context.cleanTagValue(secondaryValue + '"');
61146         }
61147         tag[field.key] = primaryValue + secondaryValue;
61148       }
61149       dispatch10.call("change", this, tag);
61150     }
61151     roadheight.tags = function(tags) {
61152       _tags = tags;
61153       var primaryValue = tags[field.key];
61154       var secondaryValue;
61155       var isMixed = Array.isArray(primaryValue);
61156       if (!isMixed) {
61157         if (primaryValue && (primaryValue.indexOf("'") >= 0 || primaryValue.indexOf('"') >= 0)) {
61158           secondaryValue = primaryValue.match(/(-?[\d.]+)"/);
61159           if (secondaryValue !== null) {
61160             secondaryValue = secondaryValue[1];
61161           }
61162           primaryValue = primaryValue.match(/(-?[\d.]+)'/);
61163           if (primaryValue !== null) {
61164             primaryValue = primaryValue[1];
61165           }
61166           _isImperial = true;
61167         } else if (primaryValue) {
61168           _isImperial = false;
61169         }
61170       }
61171       setUnitSuggestions();
61172       utilGetSetValue(primaryInput, typeof primaryValue === "string" ? primaryValue : "").attr("title", isMixed ? primaryValue.filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : _t("inspector.unknown")).classed("mixed", isMixed);
61173       utilGetSetValue(secondaryInput, typeof secondaryValue === "string" ? secondaryValue : "").attr("placeholder", isMixed ? _t("inspector.multiple_values") : _isImperial ? "0" : null).classed("mixed", isMixed).classed("disabled", !_isImperial).attr("readonly", _isImperial ? null : "readonly");
61174       secondaryUnitInput.attr("value", _isImperial ? _t("inspector.roadheight.inch") : null);
61175     };
61176     roadheight.focus = function() {
61177       primaryInput.node().focus();
61178     };
61179     roadheight.entityIDs = function(val) {
61180       _entityIDs = val;
61181     };
61182     function combinedEntityExtent() {
61183       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
61184     }
61185     return utilRebind(roadheight, dispatch10, "on");
61186   }
61187
61188   // modules/ui/fields/roadspeed.js
61189   function uiFieldRoadspeed(field, context) {
61190     var dispatch10 = dispatch_default("change");
61191     var unitInput = select_default2(null);
61192     var input = select_default2(null);
61193     var _entityIDs = [];
61194     var _tags;
61195     var _isImperial;
61196     var speedCombo = uiCombobox(context, "roadspeed");
61197     var unitCombo = uiCombobox(context, "roadspeed-unit").data(["km/h", "mph"].map(comboValues));
61198     var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
61199     var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
61200     function roadspeed(selection2) {
61201       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61202       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61203       input = wrap2.selectAll("input.roadspeed-number").data([0]);
61204       input = input.enter().append("input").attr("type", "text").attr("class", "roadspeed-number").attr("id", field.domId).call(utilNoAuto).call(speedCombo).merge(input);
61205       input.on("change", change).on("blur", change);
61206       var loc = combinedEntityExtent().center();
61207       _isImperial = roadSpeedUnit(loc) === "mph";
61208       unitInput = wrap2.selectAll("input.roadspeed-unit").data([0]);
61209       unitInput = unitInput.enter().append("input").attr("type", "text").attr("class", "roadspeed-unit").attr("aria-label", _t("inspector.speed_unit")).call(unitCombo).merge(unitInput);
61210       unitInput.on("blur", changeUnits).on("change", changeUnits);
61211       function changeUnits() {
61212         var unit2 = utilGetSetValue(unitInput);
61213         if (unit2 === "km/h") {
61214           _isImperial = false;
61215         } else if (unit2 === "mph") {
61216           _isImperial = true;
61217         }
61218         utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h");
61219         setUnitSuggestions();
61220         change();
61221       }
61222     }
61223     function setUnitSuggestions() {
61224       speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
61225       utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h");
61226     }
61227     function comboValues(d) {
61228       return {
61229         value: d.toString(),
61230         title: d.toString()
61231       };
61232     }
61233     function change() {
61234       var tag = {};
61235       var value = utilGetSetValue(input).trim();
61236       if (!value && Array.isArray(_tags[field.key]))
61237         return;
61238       if (!value) {
61239         tag[field.key] = void 0;
61240       } else if (isNaN(value) || !_isImperial) {
61241         tag[field.key] = context.cleanTagValue(value);
61242       } else {
61243         tag[field.key] = context.cleanTagValue(value + " mph");
61244       }
61245       dispatch10.call("change", this, tag);
61246     }
61247     roadspeed.tags = function(tags) {
61248       _tags = tags;
61249       var value = tags[field.key];
61250       var isMixed = Array.isArray(value);
61251       if (!isMixed) {
61252         if (value && value.indexOf("mph") >= 0) {
61253           value = parseInt(value, 10).toString();
61254           _isImperial = true;
61255         } else if (value) {
61256           _isImperial = false;
61257         }
61258       }
61259       setUnitSuggestions();
61260       utilGetSetValue(input, typeof value === "string" ? value : "").attr("title", isMixed ? value.filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder()).classed("mixed", isMixed);
61261     };
61262     roadspeed.focus = function() {
61263       input.node().focus();
61264     };
61265     roadspeed.entityIDs = function(val) {
61266       _entityIDs = val;
61267     };
61268     function combinedEntityExtent() {
61269       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
61270     }
61271     return utilRebind(roadspeed, dispatch10, "on");
61272   }
61273
61274   // modules/ui/fields/radio.js
61275   function uiFieldRadio(field, context) {
61276     var dispatch10 = dispatch_default("change");
61277     var placeholder = select_default2(null);
61278     var wrap2 = select_default2(null);
61279     var labels = select_default2(null);
61280     var radios = select_default2(null);
61281     var radioData = (field.options || field.keys).slice();
61282     var typeField;
61283     var layerField;
61284     var _oldType = {};
61285     var _entityIDs = [];
61286     function selectedKey() {
61287       var node = wrap2.selectAll(".form-field-input-radio label.active input");
61288       return !node.empty() && node.datum();
61289     }
61290     function radio(selection2) {
61291       selection2.classed("preset-radio", true);
61292       wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61293       var enter = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-radio");
61294       enter.append("span").attr("class", "placeholder");
61295       wrap2 = wrap2.merge(enter);
61296       placeholder = wrap2.selectAll(".placeholder");
61297       labels = wrap2.selectAll("label").data(radioData);
61298       enter = labels.enter().append("label");
61299       var stringsField = field.resolveReference("stringsCrossReference");
61300       enter.append("input").attr("type", "radio").attr("name", field.id).attr("value", function(d) {
61301         return stringsField.t("options." + d, { "default": d });
61302       }).attr("checked", false);
61303       enter.append("span").each(function(d) {
61304         stringsField.t.append("options." + d, { "default": d })(select_default2(this));
61305       });
61306       labels = labels.merge(enter);
61307       radios = labels.selectAll("input").on("change", changeRadio);
61308     }
61309     function structureExtras(selection2, tags) {
61310       var selected = selectedKey() || tags.layer !== void 0;
61311       var type2 = _mainPresetIndex.field(selected);
61312       var layer = _mainPresetIndex.field("layer");
61313       var showLayer = selected === "bridge" || selected === "tunnel" || tags.layer !== void 0;
61314       var extrasWrap = selection2.selectAll(".structure-extras-wrap").data(selected ? [0] : []);
61315       extrasWrap.exit().remove();
61316       extrasWrap = extrasWrap.enter().append("div").attr("class", "structure-extras-wrap").merge(extrasWrap);
61317       var list = extrasWrap.selectAll("ul").data([0]);
61318       list = list.enter().append("ul").attr("class", "rows").merge(list);
61319       if (type2) {
61320         if (!typeField || typeField.id !== selected) {
61321           typeField = uiField(context, type2, _entityIDs, { wrap: false }).on("change", changeType);
61322         }
61323         typeField.tags(tags);
61324       } else {
61325         typeField = null;
61326       }
61327       var typeItem = list.selectAll(".structure-type-item").data(typeField ? [typeField] : [], function(d) {
61328         return d.id;
61329       });
61330       typeItem.exit().remove();
61331       var typeEnter = typeItem.enter().insert("li", ":first-child").attr("class", "labeled-input structure-type-item");
61332       typeEnter.append("span").attr("class", "label structure-label-type").attr("for", "preset-input-" + selected).call(_t.append("inspector.radio.structure.type"));
61333       typeEnter.append("div").attr("class", "structure-input-type-wrap");
61334       typeItem = typeItem.merge(typeEnter);
61335       if (typeField) {
61336         typeItem.selectAll(".structure-input-type-wrap").call(typeField.render);
61337       }
61338       if (layer && showLayer) {
61339         if (!layerField) {
61340           layerField = uiField(context, layer, _entityIDs, { wrap: false }).on("change", changeLayer);
61341         }
61342         layerField.tags(tags);
61343         field.keys = utilArrayUnion(field.keys, ["layer"]);
61344       } else {
61345         layerField = null;
61346         field.keys = field.keys.filter(function(k) {
61347           return k !== "layer";
61348         });
61349       }
61350       var layerItem = list.selectAll(".structure-layer-item").data(layerField ? [layerField] : []);
61351       layerItem.exit().remove();
61352       var layerEnter = layerItem.enter().append("li").attr("class", "labeled-input structure-layer-item");
61353       layerEnter.append("span").attr("class", "label structure-label-layer").attr("for", "preset-input-layer").call(_t.append("inspector.radio.structure.layer"));
61354       layerEnter.append("div").attr("class", "structure-input-layer-wrap");
61355       layerItem = layerItem.merge(layerEnter);
61356       if (layerField) {
61357         layerItem.selectAll(".structure-input-layer-wrap").call(layerField.render);
61358       }
61359     }
61360     function changeType(t, onInput) {
61361       var key = selectedKey();
61362       if (!key)
61363         return;
61364       var val = t[key];
61365       if (val !== "no") {
61366         _oldType[key] = val;
61367       }
61368       if (field.type === "structureRadio") {
61369         if (val === "no" || key !== "bridge" && key !== "tunnel" || key === "tunnel" && val === "building_passage") {
61370           t.layer = void 0;
61371         }
61372         if (t.layer === void 0) {
61373           if (key === "bridge" && val !== "no") {
61374             t.layer = "1";
61375           }
61376           if (key === "tunnel" && val !== "no" && val !== "building_passage") {
61377             t.layer = "-1";
61378           }
61379         }
61380       }
61381       dispatch10.call("change", this, t, onInput);
61382     }
61383     function changeLayer(t, onInput) {
61384       if (t.layer === "0") {
61385         t.layer = void 0;
61386       }
61387       dispatch10.call("change", this, t, onInput);
61388     }
61389     function changeRadio() {
61390       var t = {};
61391       var activeKey;
61392       if (field.key) {
61393         t[field.key] = void 0;
61394       }
61395       radios.each(function(d) {
61396         var active = select_default2(this).property("checked");
61397         if (active)
61398           activeKey = d;
61399         if (field.key) {
61400           if (active)
61401             t[field.key] = d;
61402         } else {
61403           var val = _oldType[activeKey] || "yes";
61404           t[d] = active ? val : void 0;
61405         }
61406       });
61407       if (field.type === "structureRadio") {
61408         if (activeKey === "bridge") {
61409           t.layer = "1";
61410         } else if (activeKey === "tunnel" && t.tunnel !== "building_passage") {
61411           t.layer = "-1";
61412         } else {
61413           t.layer = void 0;
61414         }
61415       }
61416       dispatch10.call("change", this, t);
61417     }
61418     radio.tags = function(tags) {
61419       function isOptionChecked(d) {
61420         if (field.key) {
61421           return tags[field.key] === d;
61422         }
61423         return !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no");
61424       }
61425       function isMixed(d) {
61426         if (field.key) {
61427           return Array.isArray(tags[field.key]) && tags[field.key].includes(d);
61428         }
61429         return Array.isArray(tags[d]);
61430       }
61431       radios.property("checked", function(d) {
61432         return isOptionChecked(d) && (field.key || field.options.filter(isOptionChecked).length === 1);
61433       });
61434       labels.classed("active", function(d) {
61435         if (field.key) {
61436           return Array.isArray(tags[field.key]) && tags[field.key].includes(d) || tags[field.key] === d;
61437         }
61438         return Array.isArray(tags[d]) && tags[d].some((v) => typeof v === "string" && v.toLowerCase() !== "no") || !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no");
61439       }).classed("mixed", isMixed).attr("title", function(d) {
61440         return isMixed(d) ? _t("inspector.unshared_value_tooltip") : null;
61441       });
61442       var selection2 = radios.filter(function() {
61443         return this.checked;
61444       });
61445       if (selection2.empty()) {
61446         placeholder.text("");
61447         placeholder.call(_t.append("inspector.none"));
61448       } else {
61449         placeholder.text(selection2.attr("value"));
61450         _oldType[selection2.datum()] = tags[selection2.datum()];
61451       }
61452       if (field.type === "structureRadio") {
61453         if (!!tags.waterway && !_oldType.tunnel) {
61454           _oldType.tunnel = "culvert";
61455         }
61456         wrap2.call(structureExtras, tags);
61457       }
61458     };
61459     radio.focus = function() {
61460       radios.node().focus();
61461     };
61462     radio.entityIDs = function(val) {
61463       if (!arguments.length)
61464         return _entityIDs;
61465       _entityIDs = val;
61466       _oldType = {};
61467       return radio;
61468     };
61469     radio.isAllowed = function() {
61470       return _entityIDs.length === 1;
61471     };
61472     return utilRebind(radio, dispatch10, "on");
61473   }
61474
61475   // modules/ui/fields/restrictions.js
61476   function uiFieldRestrictions(field, context) {
61477     var dispatch10 = dispatch_default("change");
61478     var breathe = behaviorBreathe(context);
61479     corePreferences("turn-restriction-via-way", null);
61480     var storedViaWay = corePreferences("turn-restriction-via-way0");
61481     var storedDistance = corePreferences("turn-restriction-distance");
61482     var _maxViaWay = storedViaWay !== null ? +storedViaWay : 0;
61483     var _maxDistance = storedDistance ? +storedDistance : 30;
61484     var _initialized2 = false;
61485     var _parent = select_default2(null);
61486     var _container = select_default2(null);
61487     var _oldTurns;
61488     var _graph;
61489     var _vertexID;
61490     var _intersection;
61491     var _fromWayID;
61492     var _lastXPos;
61493     function restrictions(selection2) {
61494       _parent = selection2;
61495       if (_vertexID && (context.graph() !== _graph || !_intersection)) {
61496         _graph = context.graph();
61497         _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
61498       }
61499       var isOK = _intersection && _intersection.vertices.length && // has vertices
61500       _intersection.vertices.filter(function(vertex) {
61501         return vertex.id === _vertexID;
61502       }).length && _intersection.ways.length > 2 && // has more than 2 ways
61503       _intersection.ways.filter(function(way) {
61504         return way.__to;
61505       }).length > 1;
61506       select_default2(selection2.node().parentNode).classed("hide", !isOK);
61507       if (!isOK || !context.container().select(".inspector-wrap.inspector-hidden").empty() || !selection2.node().parentNode || !selection2.node().parentNode.parentNode) {
61508         selection2.call(restrictions.off);
61509         return;
61510       }
61511       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61512       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61513       var container = wrap2.selectAll(".restriction-container").data([0]);
61514       var containerEnter = container.enter().append("div").attr("class", "restriction-container");
61515       containerEnter.append("div").attr("class", "restriction-help");
61516       _container = containerEnter.merge(container).call(renderViewer);
61517       var controls = wrap2.selectAll(".restriction-controls").data([0]);
61518       controls.enter().append("div").attr("class", "restriction-controls-container").append("div").attr("class", "restriction-controls").merge(controls).call(renderControls);
61519     }
61520     function renderControls(selection2) {
61521       var distControl = selection2.selectAll(".restriction-distance").data([0]);
61522       distControl.exit().remove();
61523       var distControlEnter = distControl.enter().append("div").attr("class", "restriction-control restriction-distance");
61524       distControlEnter.append("span").attr("class", "restriction-control-label restriction-distance-label").call(_t.append("restriction.controls.distance", { suffix: ":" }));
61525       distControlEnter.append("input").attr("class", "restriction-distance-input").attr("type", "range").attr("min", "20").attr("max", "50").attr("step", "5");
61526       distControlEnter.append("span").attr("class", "restriction-distance-text");
61527       selection2.selectAll(".restriction-distance-input").property("value", _maxDistance).on("input", function() {
61528         var val = select_default2(this).property("value");
61529         _maxDistance = +val;
61530         _intersection = null;
61531         _container.selectAll(".layer-osm .layer-turns *").remove();
61532         corePreferences("turn-restriction-distance", _maxDistance);
61533         _parent.call(restrictions);
61534       });
61535       selection2.selectAll(".restriction-distance-text").call(displayMaxDistance(_maxDistance));
61536       var viaControl = selection2.selectAll(".restriction-via-way").data([0]);
61537       viaControl.exit().remove();
61538       var viaControlEnter = viaControl.enter().append("div").attr("class", "restriction-control restriction-via-way");
61539       viaControlEnter.append("span").attr("class", "restriction-control-label restriction-via-way-label").call(_t.append("restriction.controls.via", { suffix: ":" }));
61540       viaControlEnter.append("input").attr("class", "restriction-via-way-input").attr("type", "range").attr("min", "0").attr("max", "2").attr("step", "1");
61541       viaControlEnter.append("span").attr("class", "restriction-via-way-text");
61542       selection2.selectAll(".restriction-via-way-input").property("value", _maxViaWay).on("input", function() {
61543         var val = select_default2(this).property("value");
61544         _maxViaWay = +val;
61545         _container.selectAll(".layer-osm .layer-turns *").remove();
61546         corePreferences("turn-restriction-via-way0", _maxViaWay);
61547         _parent.call(restrictions);
61548       });
61549       selection2.selectAll(".restriction-via-way-text").call(displayMaxVia(_maxViaWay));
61550     }
61551     function renderViewer(selection2) {
61552       if (!_intersection)
61553         return;
61554       var vgraph = _intersection.graph;
61555       var filter2 = utilFunctor(true);
61556       var projection2 = geoRawMercator();
61557       var sdims = utilGetDimensions(context.container().select(".sidebar"));
61558       var d = [sdims[0] - 50, 370];
61559       var c = geoVecScale(d, 0.5);
61560       var z = 22;
61561       projection2.scale(geoZoomToScale(z));
61562       var extent = geoExtent();
61563       for (var i2 = 0; i2 < _intersection.vertices.length; i2++) {
61564         extent._extend(_intersection.vertices[i2].extent());
61565       }
61566       var padTop = 35;
61567       if (_intersection.vertices.length > 1) {
61568         var hPadding = Math.min(160, Math.max(110, d[0] * 0.4));
61569         var vPadding = 160;
61570         var tl = projection2([extent[0][0], extent[1][1]]);
61571         var br = projection2([extent[1][0], extent[0][1]]);
61572         var hFactor = (br[0] - tl[0]) / (d[0] - hPadding);
61573         var vFactor = (br[1] - tl[1]) / (d[1] - vPadding - padTop);
61574         var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
61575         var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
61576         z = z - Math.max(hZoomDiff, vZoomDiff);
61577         projection2.scale(geoZoomToScale(z));
61578       }
61579       var extentCenter = projection2(extent.center());
61580       extentCenter[1] = extentCenter[1] - padTop / 2;
61581       projection2.translate(geoVecSubtract(c, extentCenter)).clipExtent([[0, 0], d]);
61582       var drawLayers = svgLayers(projection2, context).only(["osm", "touch"]).dimensions(d);
61583       var drawVertices = svgVertices(projection2, context);
61584       var drawLines = svgLines(projection2, context);
61585       var drawTurns = svgTurns(projection2, context);
61586       var firstTime = selection2.selectAll(".surface").empty();
61587       selection2.call(drawLayers);
61588       var surface = selection2.selectAll(".surface").classed("tr", true);
61589       if (firstTime) {
61590         _initialized2 = true;
61591         surface.call(breathe);
61592       }
61593       if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
61594         _fromWayID = null;
61595         _oldTurns = null;
61596       }
61597       surface.call(utilSetDimensions, d).call(drawVertices, vgraph, _intersection.vertices, filter2, extent, z).call(drawLines, vgraph, _intersection.ways, filter2).call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
61598       surface.on("click.restrictions", click).on("mouseover.restrictions", mouseover);
61599       surface.selectAll(".selected").classed("selected", false);
61600       surface.selectAll(".related").classed("related", false);
61601       var way;
61602       if (_fromWayID) {
61603         way = vgraph.entity(_fromWayID);
61604         surface.selectAll("." + _fromWayID).classed("selected", true).classed("related", true);
61605       }
61606       document.addEventListener("resizeWindow", function() {
61607         utilSetDimensions(_container, null);
61608         redraw(1);
61609       }, false);
61610       updateHints(null);
61611       function click(d3_event) {
61612         surface.call(breathe.off).call(breathe);
61613         var datum2 = d3_event.target.__data__;
61614         var entity = datum2 && datum2.properties && datum2.properties.entity;
61615         if (entity) {
61616           datum2 = entity;
61617         }
61618         if (datum2 instanceof osmWay && (datum2.__from || datum2.__via)) {
61619           _fromWayID = datum2.id;
61620           _oldTurns = null;
61621           redraw();
61622         } else if (datum2 instanceof osmTurn) {
61623           var actions, extraActions, turns, i3;
61624           var restrictionType = osmInferRestriction(vgraph, datum2, projection2);
61625           if (datum2.restrictionID && !datum2.direct) {
61626             return;
61627           } else if (datum2.restrictionID && !datum2.only) {
61628             var seen = {};
61629             var datumOnly = JSON.parse(JSON.stringify(datum2));
61630             datumOnly.only = true;
61631             restrictionType = restrictionType.replace(/^no/, "only");
61632             turns = _intersection.turns(_fromWayID, 2);
61633             extraActions = [];
61634             _oldTurns = [];
61635             for (i3 = 0; i3 < turns.length; i3++) {
61636               var turn = turns[i3];
61637               if (seen[turn.restrictionID])
61638                 continue;
61639               if (turn.direct && turn.path[1] === datum2.path[1]) {
61640                 seen[turns[i3].restrictionID] = true;
61641                 turn.restrictionType = osmInferRestriction(vgraph, turn, projection2);
61642                 _oldTurns.push(turn);
61643                 extraActions.push(actionUnrestrictTurn(turn));
61644               }
61645             }
61646             actions = _intersection.actions.concat(extraActions, [
61647               actionRestrictTurn(datumOnly, restrictionType),
61648               _t("operations.restriction.annotation.create")
61649             ]);
61650           } else if (datum2.restrictionID) {
61651             turns = _oldTurns || [];
61652             extraActions = [];
61653             for (i3 = 0; i3 < turns.length; i3++) {
61654               if (turns[i3].key !== datum2.key) {
61655                 extraActions.push(actionRestrictTurn(turns[i3], turns[i3].restrictionType));
61656               }
61657             }
61658             _oldTurns = null;
61659             actions = _intersection.actions.concat(extraActions, [
61660               actionUnrestrictTurn(datum2),
61661               _t("operations.restriction.annotation.delete")
61662             ]);
61663           } else {
61664             actions = _intersection.actions.concat([
61665               actionRestrictTurn(datum2, restrictionType),
61666               _t("operations.restriction.annotation.create")
61667             ]);
61668           }
61669           context.perform.apply(context, actions);
61670           var s = surface.selectAll("." + datum2.key);
61671           datum2 = s.empty() ? null : s.datum();
61672           updateHints(datum2);
61673         } else {
61674           _fromWayID = null;
61675           _oldTurns = null;
61676           redraw();
61677         }
61678       }
61679       function mouseover(d3_event) {
61680         var datum2 = d3_event.target.__data__;
61681         updateHints(datum2);
61682       }
61683       _lastXPos = _lastXPos || sdims[0];
61684       function redraw(minChange) {
61685         var xPos = -1;
61686         if (minChange) {
61687           xPos = utilGetDimensions(context.container().select(".sidebar"))[0];
61688         }
61689         if (!minChange || minChange && Math.abs(xPos - _lastXPos) >= minChange) {
61690           if (context.hasEntity(_vertexID)) {
61691             _lastXPos = xPos;
61692             _container.call(renderViewer);
61693           }
61694         }
61695       }
61696       function highlightPathsFrom(wayID) {
61697         surface.selectAll(".related").classed("related", false).classed("allow", false).classed("restrict", false).classed("only", false);
61698         surface.selectAll("." + wayID).classed("related", true);
61699         if (wayID) {
61700           var turns = _intersection.turns(wayID, _maxViaWay);
61701           for (var i3 = 0; i3 < turns.length; i3++) {
61702             var turn = turns[i3];
61703             var ids = [turn.to.way];
61704             var klass = turn.no ? "restrict" : turn.only ? "only" : "allow";
61705             if (turn.only || turns.length === 1) {
61706               if (turn.via.ways) {
61707                 ids = ids.concat(turn.via.ways);
61708               }
61709             } else if (turn.to.way === wayID) {
61710               continue;
61711             }
61712             surface.selectAll(utilEntitySelector(ids)).classed("related", true).classed("allow", klass === "allow").classed("restrict", klass === "restrict").classed("only", klass === "only");
61713           }
61714         }
61715       }
61716       function updateHints(datum2) {
61717         var help = _container.selectAll(".restriction-help").html("");
61718         var placeholders = {};
61719         ["from", "via", "to"].forEach(function(k) {
61720           placeholders[k] = { html: '<span class="qualifier">' + _t("restriction.help." + k) + "</span>" };
61721         });
61722         var entity = datum2 && datum2.properties && datum2.properties.entity;
61723         if (entity) {
61724           datum2 = entity;
61725         }
61726         if (_fromWayID) {
61727           way = vgraph.entity(_fromWayID);
61728           surface.selectAll("." + _fromWayID).classed("selected", true).classed("related", true);
61729         }
61730         if (datum2 instanceof osmWay && datum2.__from) {
61731           way = datum2;
61732           highlightPathsFrom(_fromWayID ? null : way.id);
61733           surface.selectAll("." + way.id).classed("related", true);
61734           var clickSelect = !_fromWayID || _fromWayID !== way.id;
61735           help.append("div").html(_t.html("restriction.help." + (clickSelect ? "select_from_name" : "from_name"), {
61736             from: placeholders.from,
61737             fromName: displayName(way.id, vgraph)
61738           }));
61739         } else if (datum2 instanceof osmTurn) {
61740           var restrictionType = osmInferRestriction(vgraph, datum2, projection2);
61741           var turnType = restrictionType.replace(/^(only|no)\_/, "");
61742           var indirect = datum2.direct === false ? _t.html("restriction.help.indirect") : "";
61743           var klass, turnText, nextText;
61744           if (datum2.no) {
61745             klass = "restrict";
61746             turnText = _t.html("restriction.help.turn.no_" + turnType, { indirect: { html: indirect } });
61747             nextText = _t.html("restriction.help.turn.only_" + turnType, { indirect: "" });
61748           } else if (datum2.only) {
61749             klass = "only";
61750             turnText = _t.html("restriction.help.turn.only_" + turnType, { indirect: { html: indirect } });
61751             nextText = _t.html("restriction.help.turn.allowed_" + turnType, { indirect: "" });
61752           } else {
61753             klass = "allow";
61754             turnText = _t.html("restriction.help.turn.allowed_" + turnType, { indirect: { html: indirect } });
61755             nextText = _t.html("restriction.help.turn.no_" + turnType, { indirect: "" });
61756           }
61757           help.append("div").attr("class", "qualifier " + klass).html(turnText);
61758           help.append("div").html(_t.html("restriction.help.from_name_to_name", {
61759             from: placeholders.from,
61760             fromName: displayName(datum2.from.way, vgraph),
61761             to: placeholders.to,
61762             toName: displayName(datum2.to.way, vgraph)
61763           }));
61764           if (datum2.via.ways && datum2.via.ways.length) {
61765             var names = [];
61766             for (var i3 = 0; i3 < datum2.via.ways.length; i3++) {
61767               var prev = names[names.length - 1];
61768               var curr = displayName(datum2.via.ways[i3], vgraph);
61769               if (!prev || curr !== prev) {
61770                 names.push(curr);
61771               }
61772             }
61773             help.append("div").html(_t.html("restriction.help.via_names", {
61774               via: placeholders.via,
61775               viaNames: names.join(", ")
61776             }));
61777           }
61778           if (!indirect) {
61779             help.append("div").html(_t.html("restriction.help.toggle", { turn: { html: nextText.trim() } }));
61780           }
61781           highlightPathsFrom(null);
61782           var alongIDs = datum2.path.slice();
61783           surface.selectAll(utilEntitySelector(alongIDs)).classed("related", true).classed("allow", klass === "allow").classed("restrict", klass === "restrict").classed("only", klass === "only");
61784         } else {
61785           highlightPathsFrom(null);
61786           if (_fromWayID) {
61787             help.append("div").html(_t.html("restriction.help.from_name", {
61788               from: placeholders.from,
61789               fromName: displayName(_fromWayID, vgraph)
61790             }));
61791           } else {
61792             help.append("div").html(_t.html("restriction.help.select_from", {
61793               from: placeholders.from
61794             }));
61795           }
61796         }
61797       }
61798     }
61799     function displayMaxDistance(maxDist) {
61800       return (selection2) => {
61801         var isImperial = !_mainLocalizer.usesMetric();
61802         var opts;
61803         if (isImperial) {
61804           var distToFeet = {
61805             // imprecise conversion for prettier display
61806             20: 70,
61807             25: 85,
61808             30: 100,
61809             35: 115,
61810             40: 130,
61811             45: 145,
61812             50: 160
61813           }[maxDist];
61814           opts = { distance: _t("units.feet", { quantity: distToFeet }) };
61815         } else {
61816           opts = { distance: _t("units.meters", { quantity: maxDist }) };
61817         }
61818         return selection2.html("").call(_t.append("restriction.controls.distance_up_to", opts));
61819       };
61820     }
61821     function displayMaxVia(maxVia) {
61822       return (selection2) => {
61823         selection2 = selection2.html("");
61824         return maxVia === 0 ? selection2.call(_t.append("restriction.controls.via_node_only")) : maxVia === 1 ? selection2.call(_t.append("restriction.controls.via_up_to_one")) : selection2.call(_t.append("restriction.controls.via_up_to_two"));
61825       };
61826     }
61827     function displayName(entityID, graph) {
61828       var entity = graph.entity(entityID);
61829       var name = utilDisplayName(entity) || "";
61830       var matched = _mainPresetIndex.match(entity, graph);
61831       var type2 = matched && matched.name() || utilDisplayType(entity.id);
61832       return name || type2;
61833     }
61834     restrictions.entityIDs = function(val) {
61835       _intersection = null;
61836       _fromWayID = null;
61837       _oldTurns = null;
61838       _vertexID = val[0];
61839     };
61840     restrictions.tags = function() {
61841     };
61842     restrictions.focus = function() {
61843     };
61844     restrictions.off = function(selection2) {
61845       if (!_initialized2)
61846         return;
61847       selection2.selectAll(".surface").call(breathe.off).on("click.restrictions", null).on("mouseover.restrictions", null);
61848       select_default2(window).on("resize.restrictions", null);
61849     };
61850     return utilRebind(restrictions, dispatch10, "on");
61851   }
61852   uiFieldRestrictions.supportsMultiselection = false;
61853
61854   // modules/ui/fields/textarea.js
61855   function uiFieldTextarea(field, context) {
61856     var dispatch10 = dispatch_default("change");
61857     var input = select_default2(null);
61858     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue()).silent(field.usage === "changeset" && field.key === "comment");
61859     var _tags;
61860     function textarea(selection2) {
61861       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61862       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).style("position", "relative").merge(wrap2);
61863       input = wrap2.selectAll("textarea").data([0]);
61864       input = input.enter().append("textarea").attr("id", field.domId).call(utilNoAuto).on("input", change(true)).on("blur", change()).on("change", change()).merge(input);
61865       wrap2.call(_lengthIndicator);
61866       function change(onInput) {
61867         return function() {
61868           var val = utilGetSetValue(input);
61869           if (!onInput)
61870             val = context.cleanTagValue(val);
61871           if (!val && Array.isArray(_tags[field.key]))
61872             return;
61873           var t = {};
61874           t[field.key] = val || void 0;
61875           dispatch10.call("change", this, t, onInput);
61876         };
61877       }
61878     }
61879     textarea.tags = function(tags) {
61880       _tags = tags;
61881       var isMixed = Array.isArray(tags[field.key]);
61882       utilGetSetValue(input, !isMixed && tags[field.key] ? tags[field.key] : "").attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed);
61883       if (!isMixed) {
61884         _lengthIndicator.update(tags[field.key]);
61885       }
61886     };
61887     textarea.focus = function() {
61888       input.node().focus();
61889     };
61890     return utilRebind(textarea, dispatch10, "on");
61891   }
61892
61893   // modules/ui/fields/wikidata.js
61894   function uiFieldWikidata(field, context) {
61895     var wikidata = services.wikidata;
61896     var dispatch10 = dispatch_default("change");
61897     var _selection = select_default2(null);
61898     var _searchInput = select_default2(null);
61899     var _qid = null;
61900     var _wikidataEntity = null;
61901     var _wikiURL = "";
61902     var _entityIDs = [];
61903     var _wikipediaKey = field.keys && field.keys.find(function(key) {
61904       return key.includes("wikipedia");
61905     });
61906     var _hintKey = field.key === "wikidata" ? "name" : field.key.split(":")[0];
61907     var combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(true).minItems(1);
61908     function wiki(selection2) {
61909       _selection = selection2;
61910       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61911       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61912       var list = wrap2.selectAll("ul").data([0]);
61913       list = list.enter().append("ul").attr("class", "rows").merge(list);
61914       var searchRow = list.selectAll("li.wikidata-search").data([0]);
61915       var searchRowEnter = searchRow.enter().append("li").attr("class", "wikidata-search");
61916       searchRowEnter.append("input").attr("type", "text").attr("id", field.domId).style("flex", "1").call(utilNoAuto).on("focus", function() {
61917         var node = select_default2(this).node();
61918         node.setSelectionRange(0, node.value.length);
61919       }).on("blur", function() {
61920         setLabelForEntity();
61921       }).call(combobox.fetcher(fetchWikidataItems));
61922       combobox.on("accept", function(d) {
61923         if (d) {
61924           _qid = d.id;
61925           change();
61926         }
61927       }).on("cancel", function() {
61928         setLabelForEntity();
61929       });
61930       searchRowEnter.append("button").attr("class", "form-field-button wiki-link").attr("title", _t("icons.view_on", { domain: "wikidata.org" })).call(svgIcon("#iD-icon-out-link")).on("click", function(d3_event) {
61931         d3_event.preventDefault();
61932         if (_wikiURL)
61933           window.open(_wikiURL, "_blank");
61934       });
61935       searchRow = searchRow.merge(searchRowEnter);
61936       _searchInput = searchRow.select("input");
61937       var wikidataProperties = ["description", "identifier"];
61938       var items = list.selectAll("li.labeled-input").data(wikidataProperties);
61939       var enter = items.enter().append("li").attr("class", function(d) {
61940         return "labeled-input preset-wikidata-" + d;
61941       });
61942       enter.append("span").attr("class", "label").html(function(d) {
61943         return _t.html("wikidata." + d);
61944       });
61945       enter.append("input").attr("type", "text").call(utilNoAuto).classed("disabled", "true").attr("readonly", "true");
61946       enter.append("button").attr("class", "form-field-button").attr("title", _t("icons.copy")).call(svgIcon("#iD-operation-copy")).on("click", function(d3_event) {
61947         d3_event.preventDefault();
61948         select_default2(this.parentNode).select("input").node().select();
61949         document.execCommand("copy");
61950       });
61951     }
61952     function fetchWikidataItems(q, callback) {
61953       if (!q && _hintKey) {
61954         for (var i2 in _entityIDs) {
61955           var entity = context.hasEntity(_entityIDs[i2]);
61956           if (entity.tags[_hintKey]) {
61957             q = entity.tags[_hintKey];
61958             break;
61959           }
61960         }
61961       }
61962       wikidata.itemsForSearchQuery(q, function(err, data) {
61963         if (err)
61964           return;
61965         var result = data.map(function(item) {
61966           return {
61967             id: item.id,
61968             value: item.display.label.value + " (" + item.id + ")",
61969             display: (selection2) => selection2.append("span").attr("class", "localized-text").attr("lang", item.display.label.language).text(item.display.label.value),
61970             title: item.display.description && item.display.description.value,
61971             terms: item.aliases
61972           };
61973         });
61974         if (callback)
61975           callback(result);
61976       });
61977     }
61978     function change() {
61979       var syncTags = {};
61980       syncTags[field.key] = _qid;
61981       dispatch10.call("change", this, syncTags);
61982       var initGraph = context.graph();
61983       var initEntityIDs = _entityIDs;
61984       wikidata.entityByQID(_qid, function(err, entity) {
61985         if (err)
61986           return;
61987         if (context.graph() !== initGraph)
61988           return;
61989         if (!entity.sitelinks)
61990           return;
61991         var langs = wikidata.languagesToQuery();
61992         ["labels", "descriptions"].forEach(function(key) {
61993           if (!entity[key])
61994             return;
61995           var valueLangs = Object.keys(entity[key]);
61996           if (valueLangs.length === 0)
61997             return;
61998           var valueLang = valueLangs[0];
61999           if (langs.indexOf(valueLang) === -1) {
62000             langs.push(valueLang);
62001           }
62002         });
62003         var newWikipediaValue;
62004         if (_wikipediaKey) {
62005           var foundPreferred;
62006           for (var i2 in langs) {
62007             var lang = langs[i2];
62008             var siteID = lang.replace("-", "_") + "wiki";
62009             if (entity.sitelinks[siteID]) {
62010               foundPreferred = true;
62011               newWikipediaValue = lang + ":" + entity.sitelinks[siteID].title;
62012               break;
62013             }
62014           }
62015           if (!foundPreferred) {
62016             var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
62017               return site.endsWith("wiki");
62018             });
62019             if (wikiSiteKeys.length === 0) {
62020               newWikipediaValue = null;
62021             } else {
62022               var wikiLang = wikiSiteKeys[0].slice(0, -4).replace("_", "-");
62023               var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
62024               newWikipediaValue = wikiLang + ":" + wikiTitle;
62025             }
62026           }
62027         }
62028         if (newWikipediaValue) {
62029           newWikipediaValue = context.cleanTagValue(newWikipediaValue);
62030         }
62031         if (typeof newWikipediaValue === "undefined")
62032           return;
62033         var actions = initEntityIDs.map(function(entityID) {
62034           var entity2 = context.hasEntity(entityID);
62035           if (!entity2)
62036             return null;
62037           var currTags = Object.assign({}, entity2.tags);
62038           if (newWikipediaValue === null) {
62039             if (!currTags[_wikipediaKey])
62040               return null;
62041             delete currTags[_wikipediaKey];
62042           } else {
62043             currTags[_wikipediaKey] = newWikipediaValue;
62044           }
62045           return actionChangeTags(entityID, currTags);
62046         }).filter(Boolean);
62047         if (!actions.length)
62048           return;
62049         context.overwrite(
62050           function actionUpdateWikipediaTags(graph) {
62051             actions.forEach(function(action) {
62052               graph = action(graph);
62053             });
62054             return graph;
62055           },
62056           context.history().undoAnnotation()
62057         );
62058       });
62059     }
62060     function setLabelForEntity() {
62061       var label = "";
62062       if (_wikidataEntity) {
62063         label = entityPropertyForDisplay(_wikidataEntity, "labels");
62064         if (label.length === 0) {
62065           label = _wikidataEntity.id.toString();
62066         }
62067       }
62068       utilGetSetValue(_searchInput, label);
62069     }
62070     wiki.tags = function(tags) {
62071       var isMixed = Array.isArray(tags[field.key]);
62072       _searchInput.attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : "").classed("mixed", isMixed);
62073       _qid = typeof tags[field.key] === "string" && tags[field.key] || "";
62074       if (!/^Q[0-9]*$/.test(_qid)) {
62075         unrecognized();
62076         return;
62077       }
62078       _wikiURL = "https://wikidata.org/wiki/" + _qid;
62079       wikidata.entityByQID(_qid, function(err, entity) {
62080         if (err) {
62081           unrecognized();
62082           return;
62083         }
62084         _wikidataEntity = entity;
62085         setLabelForEntity();
62086         var description = entityPropertyForDisplay(entity, "descriptions");
62087         _selection.select("button.wiki-link").classed("disabled", false);
62088         _selection.select(".preset-wikidata-description").style("display", function() {
62089           return description.length > 0 ? "flex" : "none";
62090         }).select("input").attr("value", description);
62091         _selection.select(".preset-wikidata-identifier").style("display", function() {
62092           return entity.id ? "flex" : "none";
62093         }).select("input").attr("value", entity.id);
62094       });
62095       function unrecognized() {
62096         _wikidataEntity = null;
62097         setLabelForEntity();
62098         _selection.select(".preset-wikidata-description").style("display", "none");
62099         _selection.select(".preset-wikidata-identifier").style("display", "none");
62100         _selection.select("button.wiki-link").classed("disabled", true);
62101         if (_qid && _qid !== "") {
62102           _wikiURL = "https://wikidata.org/wiki/Special:Search?search=" + _qid;
62103         } else {
62104           _wikiURL = "";
62105         }
62106       }
62107     };
62108     function entityPropertyForDisplay(wikidataEntity, propKey) {
62109       if (!wikidataEntity[propKey])
62110         return "";
62111       var propObj = wikidataEntity[propKey];
62112       var langKeys = Object.keys(propObj);
62113       if (langKeys.length === 0)
62114         return "";
62115       var langs = wikidata.languagesToQuery();
62116       for (var i2 in langs) {
62117         var lang = langs[i2];
62118         var valueObj = propObj[lang];
62119         if (valueObj && valueObj.value && valueObj.value.length > 0)
62120           return valueObj.value;
62121       }
62122       return propObj[langKeys[0]].value;
62123     }
62124     wiki.entityIDs = function(val) {
62125       if (!arguments.length)
62126         return _entityIDs;
62127       _entityIDs = val;
62128       return wiki;
62129     };
62130     wiki.focus = function() {
62131       _searchInput.node().focus();
62132     };
62133     return utilRebind(wiki, dispatch10, "on");
62134   }
62135
62136   // modules/ui/fields/wikipedia.js
62137   function uiFieldWikipedia(field, context) {
62138     const dispatch10 = dispatch_default("change");
62139     const wikipedia = services.wikipedia;
62140     const wikidata = services.wikidata;
62141     let _langInput = select_default2(null);
62142     let _titleInput = select_default2(null);
62143     let _wikiURL = "";
62144     let _entityIDs;
62145     let _tags;
62146     let _dataWikipedia = [];
62147     _mainFileFetcher.get("wmf_sitematrix").then((d) => {
62148       _dataWikipedia = d;
62149       if (_tags)
62150         updateForTags(_tags);
62151     }).catch(() => {
62152     });
62153     const langCombo = uiCombobox(context, "wikipedia-lang").fetcher((value, callback) => {
62154       const v = value.toLowerCase();
62155       callback(
62156         _dataWikipedia.filter((d) => {
62157           return d[0].toLowerCase().indexOf(v) >= 0 || d[1].toLowerCase().indexOf(v) >= 0 || d[2].toLowerCase().indexOf(v) >= 0;
62158         }).map((d) => ({ value: d[1] }))
62159       );
62160     });
62161     const titleCombo = uiCombobox(context, "wikipedia-title").fetcher((value, callback) => {
62162       if (!value) {
62163         value = "";
62164         for (let i2 in _entityIDs) {
62165           let entity = context.hasEntity(_entityIDs[i2]);
62166           if (entity.tags.name) {
62167             value = entity.tags.name;
62168             break;
62169           }
62170         }
62171       }
62172       const searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
62173       searchfn(language()[2], value, (query, data) => {
62174         callback(data.map((d) => ({ value: d })));
62175       });
62176     });
62177     function wiki(selection2) {
62178       let wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
62179       wrap2 = wrap2.enter().append("div").attr("class", `form-field-input-wrap form-field-input-${field.type}`).merge(wrap2);
62180       let langContainer = wrap2.selectAll(".wiki-lang-container").data([0]);
62181       langContainer = langContainer.enter().append("div").attr("class", "wiki-lang-container").merge(langContainer);
62182       _langInput = langContainer.selectAll("input.wiki-lang").data([0]);
62183       _langInput = _langInput.enter().append("input").attr("type", "text").attr("class", "wiki-lang").attr("placeholder", _t("translate.localized_translation_language")).call(utilNoAuto).call(langCombo).merge(_langInput);
62184       _langInput.on("blur", changeLang).on("change", changeLang);
62185       let titleContainer = wrap2.selectAll(".wiki-title-container").data([0]);
62186       titleContainer = titleContainer.enter().append("div").attr("class", "wiki-title-container").merge(titleContainer);
62187       _titleInput = titleContainer.selectAll("input.wiki-title").data([0]);
62188       _titleInput = _titleInput.enter().append("input").attr("type", "text").attr("class", "wiki-title").attr("id", field.domId).call(utilNoAuto).call(titleCombo).merge(_titleInput);
62189       _titleInput.on("blur", function() {
62190         change(true);
62191       }).on("change", function() {
62192         change(false);
62193       });
62194       let link2 = titleContainer.selectAll(".wiki-link").data([0]);
62195       link2 = link2.enter().append("button").attr("class", "form-field-button wiki-link").attr("title", _t("icons.view_on", { domain: "wikipedia.org" })).call(svgIcon("#iD-icon-out-link")).merge(link2);
62196       link2.on("click", (d3_event) => {
62197         d3_event.preventDefault();
62198         if (_wikiURL)
62199           window.open(_wikiURL, "_blank");
62200       });
62201     }
62202     function defaultLanguageInfo(skipEnglishFallback) {
62203       const langCode = _mainLocalizer.languageCode().toLowerCase();
62204       for (let i2 in _dataWikipedia) {
62205         let d = _dataWikipedia[i2];
62206         if (d[2] === langCode)
62207           return d;
62208       }
62209       return skipEnglishFallback ? ["", "", ""] : ["English", "English", "en"];
62210     }
62211     function language(skipEnglishFallback) {
62212       const value = utilGetSetValue(_langInput).toLowerCase();
62213       for (let i2 in _dataWikipedia) {
62214         let d = _dataWikipedia[i2];
62215         if (d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2] === value)
62216           return d;
62217       }
62218       return defaultLanguageInfo(skipEnglishFallback);
62219     }
62220     function changeLang() {
62221       utilGetSetValue(_langInput, language()[1]);
62222       change(true);
62223     }
62224     function change(skipWikidata) {
62225       let value = utilGetSetValue(_titleInput);
62226       const m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
62227       const langInfo = m && _dataWikipedia.find((d) => m[1] === d[2]);
62228       let syncTags = {};
62229       if (langInfo) {
62230         const nativeLangName = langInfo[1];
62231         value = decodeURIComponent(m[2]).replace(/_/g, " ");
62232         if (m[3]) {
62233           let anchor;
62234           anchor = decodeURIComponent(m[3]);
62235           value += "#" + anchor.replace(/_/g, " ");
62236         }
62237         value = value.slice(0, 1).toUpperCase() + value.slice(1);
62238         utilGetSetValue(_langInput, nativeLangName);
62239         utilGetSetValue(_titleInput, value);
62240       }
62241       if (value) {
62242         syncTags.wikipedia = context.cleanTagValue(language()[2] + ":" + value);
62243       } else {
62244         syncTags.wikipedia = void 0;
62245       }
62246       dispatch10.call("change", this, syncTags);
62247       if (skipWikidata || !value || !language()[2])
62248         return;
62249       const initGraph = context.graph();
62250       const initEntityIDs = _entityIDs;
62251       wikidata.itemsByTitle(language()[2], value, (err, data) => {
62252         if (err || !data || !Object.keys(data).length)
62253           return;
62254         if (context.graph() !== initGraph)
62255           return;
62256         const qids = Object.keys(data);
62257         const value2 = qids && qids.find((id2) => id2.match(/^Q\d+$/));
62258         let actions = initEntityIDs.map((entityID) => {
62259           let entity = context.entity(entityID).tags;
62260           let currTags = Object.assign({}, entity);
62261           if (currTags.wikidata !== value2) {
62262             currTags.wikidata = value2;
62263             return actionChangeTags(entityID, currTags);
62264           }
62265           return null;
62266         }).filter(Boolean);
62267         if (!actions.length)
62268           return;
62269         context.overwrite(
62270           function actionUpdateWikidataTags(graph) {
62271             actions.forEach(function(action) {
62272               graph = action(graph);
62273             });
62274             return graph;
62275           },
62276           context.history().undoAnnotation()
62277         );
62278       });
62279     }
62280     wiki.tags = (tags) => {
62281       _tags = tags;
62282       updateForTags(tags);
62283     };
62284     function updateForTags(tags) {
62285       const value = typeof tags[field.key] === "string" ? tags[field.key] : "";
62286       const m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
62287       const tagLang = m && m[1];
62288       const tagArticleTitle = m && m[2];
62289       let anchor = m && m[3];
62290       const tagLangInfo = tagLang && _dataWikipedia.find((d) => tagLang === d[2]);
62291       if (tagLangInfo) {
62292         const nativeLangName = tagLangInfo[1];
62293         utilGetSetValue(_langInput, nativeLangName);
62294         utilGetSetValue(_titleInput, tagArticleTitle + (anchor ? "#" + anchor : ""));
62295         if (anchor) {
62296           try {
62297             anchor = encodeURIComponent(anchor.replace(/ /g, "_")).replace(/%/g, ".");
62298           } catch (e) {
62299             anchor = anchor.replace(/ /g, "_");
62300           }
62301         }
62302         _wikiURL = "https://" + tagLang + ".wikipedia.org/wiki/" + tagArticleTitle.replace(/ /g, "_") + (anchor ? "#" + anchor : "");
62303       } else {
62304         utilGetSetValue(_titleInput, value);
62305         if (value && value !== "") {
62306           utilGetSetValue(_langInput, "");
62307           const defaultLangInfo = defaultLanguageInfo();
62308           _wikiURL = `https://${defaultLangInfo[2]}.wikipedia.org/w/index.php?fulltext=1&search=${value}`;
62309         } else {
62310           const shownOrDefaultLangInfo = language(
62311             true
62312             /* skipEnglishFallback */
62313           );
62314           utilGetSetValue(_langInput, shownOrDefaultLangInfo[1]);
62315           _wikiURL = "";
62316         }
62317       }
62318     }
62319     wiki.entityIDs = (val) => {
62320       if (!arguments.length)
62321         return _entityIDs;
62322       _entityIDs = val;
62323       return wiki;
62324     };
62325     wiki.focus = () => {
62326       _titleInput.node().focus();
62327     };
62328     return utilRebind(wiki, dispatch10, "on");
62329   }
62330   uiFieldWikipedia.supportsMultiselection = false;
62331
62332   // modules/ui/fields/index.js
62333   var uiFields = {
62334     access: uiFieldAccess,
62335     address: uiFieldAddress,
62336     check: uiFieldCheck,
62337     colour: uiFieldText,
62338     combo: uiFieldCombo,
62339     cycleway: uiFieldDirectionalCombo,
62340     defaultCheck: uiFieldCheck,
62341     directionalCombo: uiFieldDirectionalCombo,
62342     email: uiFieldText,
62343     identifier: uiFieldText,
62344     lanes: uiFieldLanes,
62345     localized: uiFieldLocalized,
62346     roadheight: uiFieldRoadheight,
62347     roadspeed: uiFieldRoadspeed,
62348     manyCombo: uiFieldCombo,
62349     multiCombo: uiFieldCombo,
62350     networkCombo: uiFieldCombo,
62351     number: uiFieldText,
62352     onewayCheck: uiFieldCheck,
62353     radio: uiFieldRadio,
62354     restrictions: uiFieldRestrictions,
62355     semiCombo: uiFieldCombo,
62356     structureRadio: uiFieldRadio,
62357     tel: uiFieldText,
62358     text: uiFieldText,
62359     textarea: uiFieldTextarea,
62360     typeCombo: uiFieldCombo,
62361     url: uiFieldText,
62362     wikidata: uiFieldWikidata,
62363     wikipedia: uiFieldWikipedia
62364   };
62365
62366   // modules/ui/field.js
62367   function uiField(context, presetField2, entityIDs, options2) {
62368     options2 = Object.assign({
62369       show: true,
62370       wrap: true,
62371       remove: true,
62372       revert: true,
62373       info: true
62374     }, options2);
62375     var dispatch10 = dispatch_default("change", "revert");
62376     var field = Object.assign({}, presetField2);
62377     field.domId = utilUniqueDomId("form-field-" + field.safeid);
62378     var _show = options2.show;
62379     var _state = "";
62380     var _tags = {};
62381     var _entityExtent;
62382     if (entityIDs && entityIDs.length) {
62383       _entityExtent = entityIDs.reduce(function(extent, entityID) {
62384         var entity = context.graph().entity(entityID);
62385         return extent.extend(entity.extent(context.graph()));
62386       }, geoExtent());
62387     }
62388     var _locked = false;
62389     var _lockedTip = uiTooltip().title(() => _t.append("inspector.lock.suggestion", { label: field.title })).placement("bottom");
62390     field.keys = field.keys || [field.key];
62391     if (_show && !field.impl) {
62392       createField();
62393     }
62394     function createField() {
62395       field.impl = uiFields[field.type](field, context).on("change", function(t, onInput) {
62396         dispatch10.call("change", field, t, onInput);
62397       });
62398       if (entityIDs) {
62399         field.entityIDs = entityIDs;
62400         if (field.impl.entityIDs) {
62401           field.impl.entityIDs(entityIDs);
62402         }
62403       }
62404     }
62405     function isModified() {
62406       if (!entityIDs || !entityIDs.length)
62407         return false;
62408       return entityIDs.some(function(entityID) {
62409         var original = context.graph().base().entities[entityID];
62410         var latest = context.graph().entity(entityID);
62411         return field.keys.some(function(key) {
62412           return original ? latest.tags[key] !== original.tags[key] : latest.tags[key];
62413         });
62414       });
62415     }
62416     function tagsContainFieldKey() {
62417       return field.keys.some(function(key) {
62418         if (field.type === "multiCombo") {
62419           for (var tagKey in _tags) {
62420             if (tagKey.indexOf(key) === 0) {
62421               return true;
62422             }
62423           }
62424           return false;
62425         }
62426         return _tags[key] !== void 0;
62427       });
62428     }
62429     function revert(d3_event, d) {
62430       d3_event.stopPropagation();
62431       d3_event.preventDefault();
62432       if (!entityIDs || _locked)
62433         return;
62434       dispatch10.call("revert", d, d.keys);
62435     }
62436     function remove2(d3_event, d) {
62437       d3_event.stopPropagation();
62438       d3_event.preventDefault();
62439       if (_locked)
62440         return;
62441       var t = {};
62442       d.keys.forEach(function(key) {
62443         t[key] = void 0;
62444       });
62445       dispatch10.call("change", d, t);
62446     }
62447     field.render = function(selection2) {
62448       var container = selection2.selectAll(".form-field").data([field]);
62449       var enter = container.enter().append("div").attr("class", function(d) {
62450         return "form-field form-field-" + d.safeid;
62451       }).classed("nowrap", !options2.wrap);
62452       if (options2.wrap) {
62453         var labelEnter = enter.append("label").attr("class", "field-label").attr("for", function(d) {
62454           return d.domId;
62455         });
62456         var textEnter = labelEnter.append("span").attr("class", "label-text");
62457         textEnter.append("span").attr("class", "label-textvalue").each(function(d) {
62458           d.label()(select_default2(this));
62459         });
62460         textEnter.append("span").attr("class", "label-textannotation");
62461         if (options2.remove) {
62462           labelEnter.append("button").attr("class", "remove-icon").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete"));
62463         }
62464         if (options2.revert) {
62465           labelEnter.append("button").attr("class", "modified-icon").attr("title", _t("icons.undo")).call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo"));
62466         }
62467       }
62468       container = container.merge(enter);
62469       container.select(".field-label > .remove-icon").on("click", remove2);
62470       container.select(".field-label > .modified-icon").on("click", revert);
62471       container.each(function(d) {
62472         var selection3 = select_default2(this);
62473         if (!d.impl) {
62474           createField();
62475         }
62476         var reference, help;
62477         if (options2.wrap && field.type === "restrictions") {
62478           help = uiFieldHelp(context, "restrictions");
62479         }
62480         if (options2.wrap && options2.info) {
62481           var referenceKey = d.key || "";
62482           if (d.type === "multiCombo") {
62483             referenceKey = referenceKey.replace(/:$/, "");
62484           }
62485           reference = uiTagReference(d.reference || { key: referenceKey }, context);
62486           if (_state === "hover") {
62487             reference.showing(false);
62488           }
62489         }
62490         selection3.call(d.impl);
62491         if (help) {
62492           selection3.call(help.body).select(".field-label").call(help.button);
62493         }
62494         if (reference) {
62495           selection3.call(reference.body).select(".field-label").call(reference.button);
62496         }
62497         d.impl.tags(_tags);
62498       });
62499       container.classed("locked", _locked).classed("modified", isModified()).classed("present", tagsContainFieldKey());
62500       var annotation = container.selectAll(".field-label .label-textannotation");
62501       var icon2 = annotation.selectAll(".icon").data(_locked ? [0] : []);
62502       icon2.exit().remove();
62503       icon2.enter().append("svg").attr("class", "icon").append("use").attr("xlink:href", "#fas-lock");
62504       container.call(_locked ? _lockedTip : _lockedTip.destroy);
62505     };
62506     field.state = function(val) {
62507       if (!arguments.length)
62508         return _state;
62509       _state = val;
62510       return field;
62511     };
62512     field.tags = function(val) {
62513       if (!arguments.length)
62514         return _tags;
62515       _tags = val;
62516       if (tagsContainFieldKey() && !_show) {
62517         _show = true;
62518         if (!field.impl) {
62519           createField();
62520         }
62521       }
62522       return field;
62523     };
62524     field.locked = function(val) {
62525       if (!arguments.length)
62526         return _locked;
62527       _locked = val;
62528       return field;
62529     };
62530     field.show = function() {
62531       _show = true;
62532       if (!field.impl) {
62533         createField();
62534       }
62535       if (field.default && field.key && _tags[field.key] !== field.default) {
62536         var t = {};
62537         t[field.key] = field.default;
62538         dispatch10.call("change", this, t);
62539       }
62540     };
62541     field.isShown = function() {
62542       return _show;
62543     };
62544     field.isAllowed = function() {
62545       if (entityIDs && entityIDs.length > 1 && uiFields[field.type].supportsMultiselection === false)
62546         return false;
62547       if (field.geometry && !entityIDs.every(function(entityID) {
62548         return field.matchGeometry(context.graph().geometry(entityID));
62549       }))
62550         return false;
62551       if (entityIDs && _entityExtent && field.locationSetID) {
62552         var validHere = _sharedLocationManager.locationSetsAt(_entityExtent.center());
62553         if (!validHere[field.locationSetID])
62554           return false;
62555       }
62556       var prerequisiteTag = field.prerequisiteTag;
62557       if (entityIDs && !tagsContainFieldKey() && // ignore tagging prerequisites if a value is already present
62558       prerequisiteTag) {
62559         if (!entityIDs.every(function(entityID) {
62560           var entity = context.graph().entity(entityID);
62561           if (prerequisiteTag.key) {
62562             var value = entity.tags[prerequisiteTag.key];
62563             if (!value)
62564               return false;
62565             if (prerequisiteTag.valueNot) {
62566               return prerequisiteTag.valueNot !== value;
62567             }
62568             if (prerequisiteTag.value) {
62569               return prerequisiteTag.value === value;
62570             }
62571           } else if (prerequisiteTag.keyNot) {
62572             if (entity.tags[prerequisiteTag.keyNot])
62573               return false;
62574           }
62575           return true;
62576         }))
62577           return false;
62578       }
62579       return true;
62580     };
62581     field.focus = function() {
62582       if (field.impl) {
62583         field.impl.focus();
62584       }
62585     };
62586     return utilRebind(field, dispatch10, "on");
62587   }
62588
62589   // modules/ui/form_fields.js
62590   function uiFormFields(context) {
62591     var moreCombo = uiCombobox(context, "more-fields").minItems(1);
62592     var _fieldsArr = [];
62593     var _lastPlaceholder = "";
62594     var _state = "";
62595     var _klass = "";
62596     function formFields(selection2) {
62597       var allowedFields = _fieldsArr.filter(function(field) {
62598         return field.isAllowed();
62599       });
62600       var shown = allowedFields.filter(function(field) {
62601         return field.isShown();
62602       });
62603       var notShown = allowedFields.filter(function(field) {
62604         return !field.isShown();
62605       });
62606       var container = selection2.selectAll(".form-fields-container").data([0]);
62607       container = container.enter().append("div").attr("class", "form-fields-container " + (_klass || "")).merge(container);
62608       var fields = container.selectAll(".wrap-form-field").data(shown, function(d) {
62609         return d.id + (d.entityIDs ? d.entityIDs.join() : "");
62610       });
62611       fields.exit().remove();
62612       var enter = fields.enter().append("div").attr("class", function(d) {
62613         return "wrap-form-field wrap-form-field-" + d.safeid;
62614       });
62615       fields = fields.merge(enter);
62616       fields.order().each(function(d) {
62617         select_default2(this).call(d.render);
62618       });
62619       var titles = [];
62620       var moreFields = notShown.map(function(field) {
62621         var title = field.title();
62622         titles.push(title);
62623         var terms = field.terms();
62624         if (field.key)
62625           terms.push(field.key);
62626         if (field.keys)
62627           terms = terms.concat(field.keys);
62628         return {
62629           display: field.label(),
62630           value: title,
62631           title,
62632           field,
62633           terms
62634         };
62635       });
62636       var placeholder = titles.slice(0, 3).join(", ") + (titles.length > 3 ? "\u2026" : "");
62637       var more = selection2.selectAll(".more-fields").data(_state === "hover" || moreFields.length === 0 ? [] : [0]);
62638       more.exit().remove();
62639       var moreEnter = more.enter().append("div").attr("class", "more-fields").append("label");
62640       moreEnter.append("span").call(_t.append("inspector.add_fields"));
62641       more = moreEnter.merge(more);
62642       var input = more.selectAll(".value").data([0]);
62643       input.exit().remove();
62644       input = input.enter().append("input").attr("class", "value").attr("type", "text").attr("placeholder", placeholder).call(utilNoAuto).merge(input);
62645       input.call(utilGetSetValue, "").call(
62646         moreCombo.data(moreFields).on("accept", function(d) {
62647           if (!d)
62648             return;
62649           var field = d.field;
62650           field.show();
62651           selection2.call(formFields);
62652           field.focus();
62653         })
62654       );
62655       if (_lastPlaceholder !== placeholder) {
62656         input.attr("placeholder", placeholder);
62657         _lastPlaceholder = placeholder;
62658       }
62659     }
62660     formFields.fieldsArr = function(val) {
62661       if (!arguments.length)
62662         return _fieldsArr;
62663       _fieldsArr = val || [];
62664       return formFields;
62665     };
62666     formFields.state = function(val) {
62667       if (!arguments.length)
62668         return _state;
62669       _state = val;
62670       return formFields;
62671     };
62672     formFields.klass = function(val) {
62673       if (!arguments.length)
62674         return _klass;
62675       _klass = val;
62676       return formFields;
62677     };
62678     return formFields;
62679   }
62680
62681   // modules/ui/changeset_editor.js
62682   function uiChangesetEditor(context) {
62683     var dispatch10 = dispatch_default("change");
62684     var formFields = uiFormFields(context);
62685     var commentCombo = uiCombobox(context, "comment").caseSensitive(true);
62686     var _fieldsArr;
62687     var _tags;
62688     var _changesetID;
62689     function changesetEditor(selection2) {
62690       render(selection2);
62691     }
62692     function render(selection2) {
62693       var initial = false;
62694       if (!_fieldsArr) {
62695         initial = true;
62696         var presets = _mainPresetIndex;
62697         _fieldsArr = [
62698           uiField(context, presets.field("comment"), null, { show: true, revert: false }),
62699           uiField(context, presets.field("source"), null, { show: false, revert: false }),
62700           uiField(context, presets.field("hashtags"), null, { show: false, revert: false })
62701         ];
62702         _fieldsArr.forEach(function(field) {
62703           field.on("change", function(t, onInput) {
62704             dispatch10.call("change", field, void 0, t, onInput);
62705           });
62706         });
62707       }
62708       _fieldsArr.forEach(function(field) {
62709         field.tags(_tags);
62710       });
62711       selection2.call(formFields.fieldsArr(_fieldsArr));
62712       if (initial) {
62713         var commentField = selection2.select(".form-field-comment textarea");
62714         var commentNode = commentField.node();
62715         if (commentNode) {
62716           commentNode.focus();
62717           commentNode.select();
62718         }
62719         utilTriggerEvent(commentField, "blur");
62720         var osm = context.connection();
62721         if (osm) {
62722           osm.userChangesets(function(err, changesets) {
62723             if (err)
62724               return;
62725             var comments = changesets.map(function(changeset) {
62726               var comment = changeset.tags.comment;
62727               return comment ? { title: comment, value: comment } : null;
62728             }).filter(Boolean);
62729             commentField.call(
62730               commentCombo.data(utilArrayUniqBy(comments, "title"))
62731             );
62732           });
62733         }
62734       }
62735       const warnings = [];
62736       if (_tags.comment.match(/google/i)) {
62737         warnings.push({
62738           id: 'contains "google"',
62739           msg: _t.append("commit.google_warning"),
62740           link: _t("commit.google_warning_link")
62741         });
62742       }
62743       const maxChars = context.maxCharsForTagValue();
62744       const strLen = utilUnicodeCharsCount(utilCleanOsmString(_tags.comment, Number.POSITIVE_INFINITY));
62745       if (strLen > maxChars || false) {
62746         warnings.push({
62747           id: "message too long",
62748           msg: _t.append("commit.changeset_comment_length_warning", { maxChars })
62749         });
62750       }
62751       var commentWarning = selection2.select(".form-field-comment").selectAll(".comment-warning").data(warnings, (d) => d.id);
62752       commentWarning.exit().transition().duration(200).style("opacity", 0).remove();
62753       var commentEnter = commentWarning.enter().insert("div", ".comment-warning").attr("class", "comment-warning field-warning").style("opacity", 0);
62754       commentEnter.call(svgIcon("#iD-icon-alert", "inline")).append("span");
62755       commentEnter.transition().duration(200).style("opacity", 1);
62756       commentWarning.merge(commentEnter).selectAll("div > span").text("").each(function(d) {
62757         let selection3 = select_default2(this);
62758         if (d.link) {
62759           selection3 = selection3.append("a").attr("target", "_blank").attr("href", d.link);
62760         }
62761         selection3.call(d.msg);
62762       });
62763     }
62764     changesetEditor.tags = function(_) {
62765       if (!arguments.length)
62766         return _tags;
62767       _tags = _;
62768       return changesetEditor;
62769     };
62770     changesetEditor.changesetID = function(_) {
62771       if (!arguments.length)
62772         return _changesetID;
62773       if (_changesetID === _)
62774         return changesetEditor;
62775       _changesetID = _;
62776       _fieldsArr = null;
62777       return changesetEditor;
62778     };
62779     return utilRebind(changesetEditor, dispatch10, "on");
62780   }
62781
62782   // modules/ui/commit.js
62783   var import_fast_deep_equal9 = __toESM(require_fast_deep_equal());
62784
62785   // modules/util/jxon.js
62786   var JXON = new function() {
62787     var sValueProp = "keyValue", sAttributesProp = "keyAttributes", sAttrPref = "@", aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
62788     function parseText(sValue) {
62789       if (rIsNull.test(sValue)) {
62790         return null;
62791       }
62792       if (rIsBool.test(sValue)) {
62793         return sValue.toLowerCase() === "true";
62794       }
62795       if (isFinite(sValue)) {
62796         return parseFloat(sValue);
62797       }
62798       if (isFinite(Date.parse(sValue))) {
62799         return new Date(sValue);
62800       }
62801       return sValue;
62802     }
62803     function EmptyTree() {
62804     }
62805     EmptyTree.prototype.toString = function() {
62806       return "null";
62807     };
62808     EmptyTree.prototype.valueOf = function() {
62809       return null;
62810     };
62811     function objectify(vValue) {
62812       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
62813     }
62814     function createObjTree(oParentNode, nVerb, bFreeze, bNesteAttr) {
62815       var nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(), bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
62816       var sProp, vContent, nLength = 0, sCollectedTxt = "", vResult = bHighVerb ? {} : (
62817         /* put here the default value for empty nodes: */
62818         true
62819       );
62820       if (bChildren) {
62821         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
62822           oNode = oParentNode.childNodes.item(nItem);
62823           if (oNode.nodeType === 4) {
62824             sCollectedTxt += oNode.nodeValue;
62825           } else if (oNode.nodeType === 3) {
62826             sCollectedTxt += oNode.nodeValue.trim();
62827           } else if (oNode.nodeType === 1 && !oNode.prefix) {
62828             aCache.push(oNode);
62829           }
62830         }
62831       }
62832       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
62833       if (!bHighVerb && (bChildren || bAttributes)) {
62834         vResult = nVerb === 0 ? objectify(vBuiltVal) : {};
62835       }
62836       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
62837         sProp = aCache[nElId].nodeName.toLowerCase();
62838         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
62839         if (vResult.hasOwnProperty(sProp)) {
62840           if (vResult[sProp].constructor !== Array) {
62841             vResult[sProp] = [vResult[sProp]];
62842           }
62843           vResult[sProp].push(vContent);
62844         } else {
62845           vResult[sProp] = vContent;
62846           nLength++;
62847         }
62848       }
62849       if (bAttributes) {
62850         var nAttrLen = oParentNode.attributes.length, sAPrefix = bNesteAttr ? "" : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
62851         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
62852           oAttrib = oParentNode.attributes.item(nAttrib);
62853           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
62854         }
62855         if (bNesteAttr) {
62856           if (bFreeze) {
62857             Object.freeze(oAttrParent);
62858           }
62859           vResult[sAttributesProp] = oAttrParent;
62860           nLength -= nAttrLen - 1;
62861         }
62862       }
62863       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
62864         vResult[sValueProp] = vBuiltVal;
62865       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
62866         vResult = vBuiltVal;
62867       }
62868       if (bFreeze && (bHighVerb || nLength > 0)) {
62869         Object.freeze(vResult);
62870       }
62871       aCache.length = nLevelStart;
62872       return vResult;
62873     }
62874     function loadObjTree(oXMLDoc, oParentEl, oParentObj) {
62875       var vValue, oChild;
62876       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
62877         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString()));
62878       } else if (oParentObj.constructor === Date) {
62879         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
62880       }
62881       for (var sName in oParentObj) {
62882         vValue = oParentObj[sName];
62883         if (isFinite(sName) || vValue instanceof Function) {
62884           continue;
62885         }
62886         if (sName === sValueProp) {
62887           if (vValue !== null && vValue !== true) {
62888             oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue)));
62889           }
62890         } else if (sName === sAttributesProp) {
62891           for (var sAttrib in vValue) {
62892             oParentEl.setAttribute(sAttrib, vValue[sAttrib]);
62893           }
62894         } else if (sName.charAt(0) === sAttrPref) {
62895           oParentEl.setAttribute(sName.slice(1), vValue);
62896         } else if (vValue.constructor === Array) {
62897           for (var nItem = 0; nItem < vValue.length; nItem++) {
62898             oChild = oXMLDoc.createElement(sName);
62899             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
62900             oParentEl.appendChild(oChild);
62901           }
62902         } else {
62903           oChild = oXMLDoc.createElement(sName);
62904           if (vValue instanceof Object) {
62905             loadObjTree(oXMLDoc, oChild, vValue);
62906           } else if (vValue !== null && vValue !== true) {
62907             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
62908           }
62909           oParentEl.appendChild(oChild);
62910         }
62911       }
62912     }
62913     this.build = function(oXMLParent, nVerbosity, bFreeze, bNesteAttributes) {
62914       var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : (
62915         /* put here the default verbosity level: */
62916         1
62917       );
62918       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
62919     };
62920     this.unbuild = function(oObjTree) {
62921       var oNewDoc = document.implementation.createDocument("", "", null);
62922       loadObjTree(oNewDoc, oNewDoc, oObjTree);
62923       return oNewDoc;
62924     };
62925     this.stringify = function(oObjTree) {
62926       return new XMLSerializer().serializeToString(JXON.unbuild(oObjTree));
62927     };
62928   }();
62929
62930   // modules/ui/sections/changes.js
62931   function uiSectionChanges(context) {
62932     var _discardTags = {};
62933     _mainFileFetcher.get("discarded").then(function(d) {
62934       _discardTags = d;
62935     }).catch(function() {
62936     });
62937     var section = uiSection("changes-list", context).label(function() {
62938       var history = context.history();
62939       var summary = history.difference().summary();
62940       return _t.append("inspector.title_count", { title: _t("commit.changes"), count: summary.length });
62941     }).disclosureContent(renderDisclosureContent);
62942     function renderDisclosureContent(selection2) {
62943       var history = context.history();
62944       var summary = history.difference().summary();
62945       var container = selection2.selectAll(".commit-section").data([0]);
62946       var containerEnter = container.enter().append("div").attr("class", "commit-section");
62947       containerEnter.append("ul").attr("class", "changeset-list");
62948       container = containerEnter.merge(container);
62949       var items = container.select("ul").selectAll("li").data(summary);
62950       var itemsEnter = items.enter().append("li").attr("class", "change-item");
62951       var buttons = itemsEnter.append("button").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click);
62952       buttons.each(function(d) {
62953         select_default2(this).call(svgIcon("#iD-icon-" + d.entity.geometry(d.graph), "pre-text " + d.changeType));
62954       });
62955       buttons.append("span").attr("class", "change-type").html(function(d) {
62956         return _t.html("commit." + d.changeType) + " ";
62957       });
62958       buttons.append("strong").attr("class", "entity-type").text(function(d) {
62959         var matched = _mainPresetIndex.match(d.entity, d.graph);
62960         return matched && matched.name() || utilDisplayType(d.entity.id);
62961       });
62962       buttons.append("span").attr("class", "entity-name").text(function(d) {
62963         var name = utilDisplayName(d.entity) || "", string = "";
62964         if (name !== "") {
62965           string += ":";
62966         }
62967         return string += " " + name;
62968       });
62969       items = itemsEnter.merge(items);
62970       var changeset = new osmChangeset().update({ id: void 0 });
62971       var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
62972       delete changeset.id;
62973       var data = JXON.stringify(changeset.osmChangeJXON(changes));
62974       var blob = new Blob([data], { type: "text/xml;charset=utf-8;" });
62975       var fileName = "changes.osc";
62976       var linkEnter = container.selectAll(".download-changes").data([0]).enter().append("a").attr("class", "download-changes");
62977       linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName);
62978       linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("commit.download_changes"));
62979       function mouseover(d) {
62980         if (d.entity) {
62981           context.surface().selectAll(
62982             utilEntityOrMemberSelector([d.entity.id], context.graph())
62983           ).classed("hover", true);
62984         }
62985       }
62986       function mouseout() {
62987         context.surface().selectAll(".hover").classed("hover", false);
62988       }
62989       function click(d3_event, change) {
62990         if (change.changeType !== "deleted") {
62991           var entity = change.entity;
62992           context.map().zoomToEase(entity);
62993           context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true);
62994         }
62995       }
62996     }
62997     return section;
62998   }
62999
63000   // modules/ui/commit_warnings.js
63001   function uiCommitWarnings(context) {
63002     function commitWarnings(selection2) {
63003       var issuesBySeverity = context.validator().getIssuesBySeverity({ what: "edited", where: "all", includeDisabledRules: true });
63004       for (var severity in issuesBySeverity) {
63005         var issues = issuesBySeverity[severity];
63006         if (severity !== "error") {
63007           issues = issues.filter(function(issue) {
63008             return issue.type !== "help_request";
63009           });
63010         }
63011         var section = severity + "-section";
63012         var issueItem = severity + "-item";
63013         var container = selection2.selectAll("." + section).data(issues.length ? [0] : []);
63014         container.exit().remove();
63015         var containerEnter = container.enter().append("div").attr("class", "modal-section " + section + " fillL2");
63016         containerEnter.append("h3").call(severity === "warning" ? _t.append("commit.warnings") : _t.append("commit.errors"));
63017         containerEnter.append("ul").attr("class", "changeset-list");
63018         container = containerEnter.merge(container);
63019         var items = container.select("ul").selectAll("li").data(issues, function(d) {
63020           return d.key;
63021         });
63022         items.exit().remove();
63023         var itemsEnter = items.enter().append("li").attr("class", issueItem);
63024         var buttons = itemsEnter.append("button").on("mouseover", function(d3_event, d) {
63025           if (d.entityIds) {
63026             context.surface().selectAll(
63027               utilEntityOrMemberSelector(
63028                 d.entityIds,
63029                 context.graph()
63030               )
63031             ).classed("hover", true);
63032           }
63033         }).on("mouseout", function() {
63034           context.surface().selectAll(".hover").classed("hover", false);
63035         }).on("click", function(d3_event, d) {
63036           context.validator().focusIssue(d);
63037         });
63038         buttons.call(svgIcon("#iD-icon-alert", "pre-text"));
63039         buttons.append("strong").attr("class", "issue-message");
63040         buttons.filter(function(d) {
63041           return d.tooltip;
63042         }).call(
63043           uiTooltip().title(function(d) {
63044             return d.tooltip;
63045           }).placement("top")
63046         );
63047         items = itemsEnter.merge(items);
63048         items.selectAll(".issue-message").text("").each(function(d) {
63049           return d.message(context)(select_default2(this));
63050         });
63051       }
63052     }
63053     return commitWarnings;
63054   }
63055
63056   // modules/ui/commit.js
63057   var readOnlyTags = [
63058     /^changesets_count$/,
63059     /^created_by$/,
63060     /^ideditor:/,
63061     /^imagery_used$/,
63062     /^host$/,
63063     /^locale$/,
63064     /^warnings:/,
63065     /^resolved:/,
63066     /^closed:note$/,
63067     /^closed:keepright$/,
63068     /^closed:improveosm:/,
63069     /^closed:osmose:/
63070   ];
63071   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
63072   function uiCommit(context) {
63073     var dispatch10 = dispatch_default("cancel");
63074     var _userDetails2;
63075     var _selection;
63076     var changesetEditor = uiChangesetEditor(context).on("change", changeTags);
63077     var rawTagEditor = uiSectionRawTagEditor("changeset-tag-editor", context).on("change", changeTags).readOnlyTags(readOnlyTags);
63078     var commitChanges = uiSectionChanges(context);
63079     var commitWarnings = uiCommitWarnings(context);
63080     function commit(selection2) {
63081       _selection = selection2;
63082       if (!context.changeset)
63083         initChangeset();
63084       loadDerivedChangesetTags();
63085       selection2.call(render);
63086     }
63087     function initChangeset() {
63088       var commentDate = +corePreferences("commentDate") || 0;
63089       var currDate = Date.now();
63090       var cutoff = 2 * 86400 * 1e3;
63091       if (commentDate > currDate || currDate - commentDate > cutoff) {
63092         corePreferences("comment", null);
63093         corePreferences("hashtags", null);
63094         corePreferences("source", null);
63095       }
63096       if (context.defaultChangesetComment()) {
63097         corePreferences("comment", context.defaultChangesetComment());
63098         corePreferences("commentDate", Date.now());
63099       }
63100       if (context.defaultChangesetSource()) {
63101         corePreferences("source", context.defaultChangesetSource());
63102         corePreferences("commentDate", Date.now());
63103       }
63104       if (context.defaultChangesetHashtags()) {
63105         corePreferences("hashtags", context.defaultChangesetHashtags());
63106         corePreferences("commentDate", Date.now());
63107       }
63108       var detected = utilDetect();
63109       var tags = {
63110         comment: corePreferences("comment") || "",
63111         created_by: context.cleanTagValue("iD " + context.version),
63112         host: context.cleanTagValue(detected.host),
63113         locale: context.cleanTagValue(_mainLocalizer.localeCode())
63114       };
63115       findHashtags(tags, true);
63116       var hashtags = corePreferences("hashtags");
63117       if (hashtags) {
63118         tags.hashtags = hashtags;
63119       }
63120       var source = corePreferences("source");
63121       if (source) {
63122         tags.source = source;
63123       }
63124       var photoOverlaysUsed = context.history().photoOverlaysUsed();
63125       if (photoOverlaysUsed.length) {
63126         var sources = (tags.source || "").split(";");
63127         if (sources.indexOf("streetlevel imagery") === -1) {
63128           sources.push("streetlevel imagery");
63129         }
63130         photoOverlaysUsed.forEach(function(photoOverlay) {
63131           if (sources.indexOf(photoOverlay) === -1) {
63132             sources.push(photoOverlay);
63133           }
63134         });
63135         tags.source = context.cleanTagValue(sources.join(";"));
63136       }
63137       context.changeset = new osmChangeset({ tags });
63138     }
63139     function loadDerivedChangesetTags() {
63140       var osm = context.connection();
63141       if (!osm)
63142         return;
63143       var tags = Object.assign({}, context.changeset.tags);
63144       var imageryUsed = context.cleanTagValue(context.history().imageryUsed().join(";"));
63145       tags.imagery_used = imageryUsed || "None";
63146       var osmClosed = osm.getClosedIDs();
63147       var itemType;
63148       if (osmClosed.length) {
63149         tags["closed:note"] = context.cleanTagValue(osmClosed.join(";"));
63150       }
63151       if (services.keepRight) {
63152         var krClosed = services.keepRight.getClosedIDs();
63153         if (krClosed.length) {
63154           tags["closed:keepright"] = context.cleanTagValue(krClosed.join(";"));
63155         }
63156       }
63157       if (services.improveOSM) {
63158         var iOsmClosed = services.improveOSM.getClosedCounts();
63159         for (itemType in iOsmClosed) {
63160           tags["closed:improveosm:" + itemType] = context.cleanTagValue(iOsmClosed[itemType].toString());
63161         }
63162       }
63163       if (services.osmose) {
63164         var osmoseClosed = services.osmose.getClosedCounts();
63165         for (itemType in osmoseClosed) {
63166           tags["closed:osmose:" + itemType] = context.cleanTagValue(osmoseClosed[itemType].toString());
63167         }
63168       }
63169       for (var key in tags) {
63170         if (key.match(/(^warnings:)|(^resolved:)/)) {
63171           delete tags[key];
63172         }
63173       }
63174       function addIssueCounts(issues, prefix) {
63175         var issuesByType = utilArrayGroupBy(issues, "type");
63176         for (var issueType in issuesByType) {
63177           var issuesOfType = issuesByType[issueType];
63178           if (issuesOfType[0].subtype) {
63179             var issuesBySubtype = utilArrayGroupBy(issuesOfType, "subtype");
63180             for (var issueSubtype in issuesBySubtype) {
63181               var issuesOfSubtype = issuesBySubtype[issueSubtype];
63182               tags[prefix + ":" + issueType + ":" + issueSubtype] = context.cleanTagValue(issuesOfSubtype.length.toString());
63183             }
63184           } else {
63185             tags[prefix + ":" + issueType] = context.cleanTagValue(issuesOfType.length.toString());
63186           }
63187         }
63188       }
63189       var warnings = context.validator().getIssuesBySeverity({ what: "edited", where: "all", includeIgnored: true, includeDisabledRules: true }).warning.filter(function(issue) {
63190         return issue.type !== "help_request";
63191       });
63192       addIssueCounts(warnings, "warnings");
63193       var resolvedIssues = context.validator().getResolvedIssues();
63194       addIssueCounts(resolvedIssues, "resolved");
63195       context.changeset = context.changeset.update({ tags });
63196     }
63197     function render(selection2) {
63198       var osm = context.connection();
63199       if (!osm)
63200         return;
63201       var header = selection2.selectAll(".header").data([0]);
63202       var headerTitle = header.enter().append("div").attr("class", "header fillL");
63203       headerTitle.append("div").append("h2").call(_t.append("commit.title"));
63204       headerTitle.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
63205         dispatch10.call("cancel", this);
63206       }).call(svgIcon("#iD-icon-close"));
63207       var body = selection2.selectAll(".body").data([0]);
63208       body = body.enter().append("div").attr("class", "body").merge(body);
63209       var changesetSection = body.selectAll(".changeset-editor").data([0]);
63210       changesetSection = changesetSection.enter().append("div").attr("class", "modal-section changeset-editor").merge(changesetSection);
63211       changesetSection.call(
63212         changesetEditor.changesetID(context.changeset.id).tags(context.changeset.tags)
63213       );
63214       body.call(commitWarnings);
63215       var saveSection = body.selectAll(".save-section").data([0]);
63216       saveSection = saveSection.enter().append("div").attr("class", "modal-section save-section fillL").merge(saveSection);
63217       var prose = saveSection.selectAll(".commit-info").data([0]);
63218       if (prose.enter().size()) {
63219         _userDetails2 = null;
63220       }
63221       prose = prose.enter().append("p").attr("class", "commit-info").call(_t.append("commit.upload_explanation")).merge(prose);
63222       osm.userDetails(function(err, user) {
63223         if (err)
63224           return;
63225         if (_userDetails2 === user)
63226           return;
63227         _userDetails2 = user;
63228         var userLink = select_default2(document.createElement("div"));
63229         if (user.image_url) {
63230           userLink.append("img").attr("src", user.image_url).attr("class", "icon pre-text user-icon");
63231         }
63232         userLink.append("a").attr("class", "user-info").text(user.display_name).attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
63233         prose.html(_t.html("commit.upload_explanation_with_user", { user: { html: userLink.html() } }));
63234       });
63235       var requestReview = saveSection.selectAll(".request-review").data([0]);
63236       var requestReviewEnter = requestReview.enter().append("div").attr("class", "request-review");
63237       var requestReviewDomId = utilUniqueDomId("commit-input-request-review");
63238       var labelEnter = requestReviewEnter.append("label").attr("for", requestReviewDomId);
63239       if (!labelEnter.empty()) {
63240         labelEnter.call(uiTooltip().title(() => _t.append("commit.request_review_info")).placement("top"));
63241       }
63242       labelEnter.append("input").attr("type", "checkbox").attr("id", requestReviewDomId);
63243       labelEnter.append("span").call(_t.append("commit.request_review"));
63244       requestReview = requestReview.merge(requestReviewEnter);
63245       var requestReviewInput = requestReview.selectAll("input").property("checked", isReviewRequested(context.changeset.tags)).on("change", toggleRequestReview);
63246       var buttonSection = saveSection.selectAll(".buttons").data([0]);
63247       var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons fillL");
63248       buttonEnter.append("button").attr("class", "secondary-action button cancel-button").append("span").attr("class", "label").call(_t.append("commit.cancel"));
63249       var uploadButton = buttonEnter.append("button").attr("class", "action button save-button");
63250       uploadButton.append("span").attr("class", "label").call(_t.append("commit.save"));
63251       var uploadBlockerTooltipText = getUploadBlockerMessage();
63252       buttonSection = buttonSection.merge(buttonEnter);
63253       buttonSection.selectAll(".cancel-button").on("click.cancel", function() {
63254         dispatch10.call("cancel", this);
63255       });
63256       buttonSection.selectAll(".save-button").classed("disabled", uploadBlockerTooltipText !== null).on("click.save", function() {
63257         if (!select_default2(this).classed("disabled")) {
63258           this.blur();
63259           for (var key in context.changeset.tags) {
63260             if (!key)
63261               delete context.changeset.tags[key];
63262           }
63263           context.uploader().save(context.changeset);
63264         }
63265       });
63266       uiTooltip().destroyAny(buttonSection.selectAll(".save-button"));
63267       if (uploadBlockerTooltipText) {
63268         buttonSection.selectAll(".save-button").call(uiTooltip().title(() => uploadBlockerTooltipText).placement("top"));
63269       }
63270       var tagSection = body.selectAll(".tag-section.raw-tag-editor").data([0]);
63271       tagSection = tagSection.enter().append("div").attr("class", "modal-section tag-section raw-tag-editor").merge(tagSection);
63272       tagSection.call(
63273         rawTagEditor.tags(Object.assign({}, context.changeset.tags)).render
63274       );
63275       var changesSection = body.selectAll(".commit-changes-section").data([0]);
63276       changesSection = changesSection.enter().append("div").attr("class", "modal-section commit-changes-section").merge(changesSection);
63277       changesSection.call(commitChanges.render);
63278       function toggleRequestReview() {
63279         var rr = requestReviewInput.property("checked");
63280         updateChangeset({ review_requested: rr ? "yes" : void 0 });
63281         tagSection.call(
63282           rawTagEditor.tags(Object.assign({}, context.changeset.tags)).render
63283         );
63284       }
63285     }
63286     function getUploadBlockerMessage() {
63287       var errors = context.validator().getIssuesBySeverity({ what: "edited", where: "all" }).error;
63288       if (errors.length) {
63289         return _t.append("commit.outstanding_errors_message", { count: errors.length });
63290       } else {
63291         var hasChangesetComment = context.changeset && context.changeset.tags.comment && context.changeset.tags.comment.trim().length;
63292         if (!hasChangesetComment) {
63293           return _t.append("commit.comment_needed_message");
63294         }
63295       }
63296       return null;
63297     }
63298     function changeTags(_, changed, onInput) {
63299       if (changed.hasOwnProperty("comment")) {
63300         if (changed.comment === void 0) {
63301           changed.comment = "";
63302         }
63303         if (!onInput) {
63304           corePreferences("comment", changed.comment);
63305           corePreferences("commentDate", Date.now());
63306         }
63307       }
63308       if (changed.hasOwnProperty("source")) {
63309         if (changed.source === void 0) {
63310           corePreferences("source", null);
63311         } else if (!onInput) {
63312           corePreferences("source", changed.source);
63313           corePreferences("commentDate", Date.now());
63314         }
63315       }
63316       updateChangeset(changed, onInput);
63317       if (_selection) {
63318         _selection.call(render);
63319       }
63320     }
63321     function findHashtags(tags, commentOnly) {
63322       var detectedHashtags = commentHashtags();
63323       if (detectedHashtags.length) {
63324         corePreferences("hashtags", null);
63325       }
63326       if (!detectedHashtags.length || !commentOnly) {
63327         detectedHashtags = detectedHashtags.concat(hashtagHashtags());
63328       }
63329       var allLowerCase = /* @__PURE__ */ new Set();
63330       return detectedHashtags.filter(function(hashtag) {
63331         var lowerCase = hashtag.toLowerCase();
63332         if (!allLowerCase.has(lowerCase)) {
63333           allLowerCase.add(lowerCase);
63334           return true;
63335         }
63336         return false;
63337       });
63338       function commentHashtags() {
63339         var matches = (tags.comment || "").replace(/http\S*/g, "").match(hashtagRegex);
63340         return matches || [];
63341       }
63342       function hashtagHashtags() {
63343         var matches = (tags.hashtags || "").split(/[,;\s]+/).map(function(s) {
63344           if (s[0] !== "#") {
63345             s = "#" + s;
63346           }
63347           var matched = s.match(hashtagRegex);
63348           return matched && matched[0];
63349         }).filter(Boolean);
63350         return matches || [];
63351       }
63352     }
63353     function isReviewRequested(tags) {
63354       var rr = tags.review_requested;
63355       if (rr === void 0)
63356         return false;
63357       rr = rr.trim().toLowerCase();
63358       return !(rr === "" || rr === "no");
63359     }
63360     function updateChangeset(changed, onInput) {
63361       var tags = Object.assign({}, context.changeset.tags);
63362       Object.keys(changed).forEach(function(k) {
63363         var v = changed[k];
63364         k = context.cleanTagKey(k);
63365         if (readOnlyTags.indexOf(k) !== -1)
63366           return;
63367         if (v === void 0) {
63368           delete tags[k];
63369         } else if (onInput) {
63370           tags[k] = v;
63371         } else {
63372           tags[k] = context.cleanTagValue(v);
63373         }
63374       });
63375       if (!onInput) {
63376         var commentOnly = changed.hasOwnProperty("comment") && changed.comment !== "";
63377         var arr = findHashtags(tags, commentOnly);
63378         if (arr.length) {
63379           tags.hashtags = context.cleanTagValue(arr.join(";"));
63380           corePreferences("hashtags", tags.hashtags);
63381         } else {
63382           delete tags.hashtags;
63383           corePreferences("hashtags", null);
63384         }
63385       }
63386       if (_userDetails2 && _userDetails2.changesets_count !== void 0) {
63387         var changesetsCount = parseInt(_userDetails2.changesets_count, 10) + 1;
63388         tags.changesets_count = String(changesetsCount);
63389         if (changesetsCount <= 100) {
63390           var s;
63391           s = corePreferences("walkthrough_completed");
63392           if (s) {
63393             tags["ideditor:walkthrough_completed"] = s;
63394           }
63395           s = corePreferences("walkthrough_progress");
63396           if (s) {
63397             tags["ideditor:walkthrough_progress"] = s;
63398           }
63399           s = corePreferences("walkthrough_started");
63400           if (s) {
63401             tags["ideditor:walkthrough_started"] = s;
63402           }
63403         }
63404       } else {
63405         delete tags.changesets_count;
63406       }
63407       if (!(0, import_fast_deep_equal9.default)(context.changeset.tags, tags)) {
63408         context.changeset = context.changeset.update({ tags });
63409       }
63410     }
63411     commit.reset = function() {
63412       context.changeset = null;
63413     };
63414     return utilRebind(commit, dispatch10, "on");
63415   }
63416
63417   // modules/ui/confirm.js
63418   function uiConfirm(selection2) {
63419     var modalSelection = uiModal(selection2);
63420     modalSelection.select(".modal").classed("modal-alert", true);
63421     var section = modalSelection.select(".content");
63422     section.append("div").attr("class", "modal-section header");
63423     section.append("div").attr("class", "modal-section message-text");
63424     var buttons = section.append("div").attr("class", "modal-section buttons cf");
63425     modalSelection.okButton = function() {
63426       buttons.append("button").attr("class", "button ok-button action").on("click.confirm", function() {
63427         modalSelection.remove();
63428       }).call(_t.append("confirm.okay")).node().focus();
63429       return modalSelection;
63430     };
63431     return modalSelection;
63432   }
63433
63434   // modules/ui/conflicts.js
63435   function uiConflicts(context) {
63436     var dispatch10 = dispatch_default("cancel", "save");
63437     var keybinding = utilKeybinding("conflicts");
63438     var _origChanges;
63439     var _conflictList;
63440     var _shownConflictIndex;
63441     function keybindingOn() {
63442       select_default2(document).call(keybinding.on("\u238B", cancel, true));
63443     }
63444     function keybindingOff() {
63445       select_default2(document).call(keybinding.unbind);
63446     }
63447     function tryAgain() {
63448       keybindingOff();
63449       dispatch10.call("save");
63450     }
63451     function cancel() {
63452       keybindingOff();
63453       dispatch10.call("cancel");
63454     }
63455     function conflicts(selection2) {
63456       keybindingOn();
63457       var headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
63458       headerEnter.append("button").attr("class", "fr").attr("title", _t("icons.close")).on("click", cancel).call(svgIcon("#iD-icon-close"));
63459       headerEnter.append("h2").call(_t.append("save.conflict.header"));
63460       var bodyEnter = selection2.selectAll(".body").data([0]).enter().append("div").attr("class", "body fillL");
63461       var conflictsHelpEnter = bodyEnter.append("div").attr("class", "conflicts-help").call(_t.append("save.conflict.help"));
63462       var changeset = new osmChangeset();
63463       delete changeset.id;
63464       var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
63465       var blob = new Blob([data], { type: "text/xml;charset=utf-8;" });
63466       var fileName = "changes.osc";
63467       var linkEnter = conflictsHelpEnter.selectAll(".download-changes").append("a").attr("class", "download-changes");
63468       linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName);
63469       linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("save.conflict.download_changes"));
63470       bodyEnter.append("div").attr("class", "conflict-container fillL3").call(showConflict, 0);
63471       bodyEnter.append("div").attr("class", "conflicts-done").attr("opacity", 0).style("display", "none").call(_t.append("save.conflict.done"));
63472       var buttonsEnter = bodyEnter.append("div").attr("class", "buttons col12 joined conflicts-buttons");
63473       buttonsEnter.append("button").attr("disabled", _conflictList.length > 1).attr("class", "action conflicts-button col6").call(_t.append("save.title")).on("click.try_again", tryAgain);
63474       buttonsEnter.append("button").attr("class", "secondary-action conflicts-button col6").call(_t.append("confirm.cancel")).on("click.cancel", cancel);
63475     }
63476     function showConflict(selection2, index) {
63477       index = utilWrap(index, _conflictList.length);
63478       _shownConflictIndex = index;
63479       var parent = select_default2(selection2.node().parentNode);
63480       if (index === _conflictList.length - 1) {
63481         window.setTimeout(function() {
63482           parent.select(".conflicts-button").attr("disabled", null);
63483           parent.select(".conflicts-done").transition().attr("opacity", 1).style("display", "block");
63484         }, 250);
63485       }
63486       var conflict = selection2.selectAll(".conflict").data([_conflictList[index]]);
63487       conflict.exit().remove();
63488       var conflictEnter = conflict.enter().append("div").attr("class", "conflict");
63489       conflictEnter.append("h4").attr("class", "conflict-count").call(_t.append("save.conflict.count", { num: index + 1, total: _conflictList.length }));
63490       conflictEnter.append("a").attr("class", "conflict-description").attr("href", "#").text(function(d) {
63491         return d.name;
63492       }).on("click", function(d3_event, d) {
63493         d3_event.preventDefault();
63494         zoomToEntity(d.id);
63495       });
63496       var details = conflictEnter.append("div").attr("class", "conflict-detail-container");
63497       details.append("ul").attr("class", "conflict-detail-list").selectAll("li").data(function(d) {
63498         return d.details || [];
63499       }).enter().append("li").attr("class", "conflict-detail-item").html(function(d) {
63500         return d;
63501       });
63502       details.append("div").attr("class", "conflict-choices").call(addChoices);
63503       details.append("div").attr("class", "conflict-nav-buttons joined cf").selectAll("button").data(["previous", "next"]).enter().append("button").attr("class", "conflict-nav-button action col6").attr("disabled", function(d, i2) {
63504         return i2 === 0 && index === 0 || i2 === 1 && index === _conflictList.length - 1 || null;
63505       }).on("click", function(d3_event, d) {
63506         d3_event.preventDefault();
63507         var container = parent.selectAll(".conflict-container");
63508         var sign2 = d === "previous" ? -1 : 1;
63509         container.selectAll(".conflict").remove();
63510         container.call(showConflict, index + sign2);
63511       }).each(function(d) {
63512         _t.append("save.conflict." + d)(select_default2(this));
63513       });
63514     }
63515     function addChoices(selection2) {
63516       var choices = selection2.append("ul").attr("class", "layer-list").selectAll("li").data(function(d) {
63517         return d.choices || [];
63518       });
63519       var choicesEnter = choices.enter().append("li").attr("class", "layer");
63520       var labelEnter = choicesEnter.append("label");
63521       labelEnter.append("input").attr("type", "radio").attr("name", function(d) {
63522         return d.id;
63523       }).on("change", function(d3_event, d) {
63524         var ul = this.parentNode.parentNode.parentNode;
63525         ul.__data__.chosen = d.id;
63526         choose(d3_event, ul, d);
63527       });
63528       labelEnter.append("span").text(function(d) {
63529         return d.text;
63530       });
63531       choicesEnter.merge(choices).each(function(d) {
63532         var ul = this.parentNode;
63533         if (ul.__data__.chosen === d.id) {
63534           choose(null, ul, d);
63535         }
63536       });
63537     }
63538     function choose(d3_event, ul, datum2) {
63539       if (d3_event)
63540         d3_event.preventDefault();
63541       select_default2(ul).selectAll("li").classed("active", function(d) {
63542         return d === datum2;
63543       }).selectAll("input").property("checked", function(d) {
63544         return d === datum2;
63545       });
63546       var extent = geoExtent();
63547       var entity;
63548       entity = context.graph().hasEntity(datum2.id);
63549       if (entity)
63550         extent._extend(entity.extent(context.graph()));
63551       datum2.action();
63552       entity = context.graph().hasEntity(datum2.id);
63553       if (entity)
63554         extent._extend(entity.extent(context.graph()));
63555       zoomToEntity(datum2.id, extent);
63556     }
63557     function zoomToEntity(id2, extent) {
63558       context.surface().selectAll(".hover").classed("hover", false);
63559       var entity = context.graph().hasEntity(id2);
63560       if (entity) {
63561         if (extent) {
63562           context.map().trimmedExtent(extent);
63563         } else {
63564           context.map().zoomToEase(entity);
63565         }
63566         context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true);
63567       }
63568     }
63569     conflicts.conflictList = function(_) {
63570       if (!arguments.length)
63571         return _conflictList;
63572       _conflictList = _;
63573       return conflicts;
63574     };
63575     conflicts.origChanges = function(_) {
63576       if (!arguments.length)
63577         return _origChanges;
63578       _origChanges = _;
63579       return conflicts;
63580     };
63581     conflicts.shownEntityIds = function() {
63582       if (_conflictList && typeof _shownConflictIndex === "number") {
63583         return [_conflictList[_shownConflictIndex].id];
63584       }
63585       return [];
63586     };
63587     return utilRebind(conflicts, dispatch10, "on");
63588   }
63589
63590   // modules/ui/entity_editor.js
63591   var import_fast_deep_equal10 = __toESM(require_fast_deep_equal());
63592
63593   // modules/ui/sections/entity_issues.js
63594   function uiSectionEntityIssues(context) {
63595     var preference = corePreferences("entity-issues.reference.expanded");
63596     var _expanded = preference === null ? true : preference === "true";
63597     var _entityIDs = [];
63598     var _issues = [];
63599     var _activeIssueID;
63600     var section = uiSection("entity-issues", context).shouldDisplay(function() {
63601       return _issues.length > 0;
63602     }).label(function() {
63603       return _t.append("inspector.title_count", { title: _t("issues.list_title"), count: _issues.length });
63604     }).disclosureContent(renderDisclosureContent);
63605     context.validator().on("validated.entity_issues", function() {
63606       reloadIssues();
63607       section.reRender();
63608     }).on("focusedIssue.entity_issues", function(issue) {
63609       makeActiveIssue(issue.id);
63610     });
63611     function reloadIssues() {
63612       _issues = context.validator().getSharedEntityIssues(_entityIDs, { includeDisabledRules: true });
63613     }
63614     function makeActiveIssue(issueID) {
63615       _activeIssueID = issueID;
63616       section.selection().selectAll(".issue-container").classed("active", function(d) {
63617         return d.id === _activeIssueID;
63618       });
63619     }
63620     function renderDisclosureContent(selection2) {
63621       selection2.classed("grouped-items-area", true);
63622       _activeIssueID = _issues.length > 0 ? _issues[0].id : null;
63623       var containers = selection2.selectAll(".issue-container").data(_issues, function(d) {
63624         return d.key;
63625       });
63626       containers.exit().remove();
63627       var containersEnter = containers.enter().append("div").attr("class", "issue-container");
63628       var itemsEnter = containersEnter.append("div").attr("class", function(d) {
63629         return "issue severity-" + d.severity;
63630       }).on("mouseover.highlight", function(d3_event, d) {
63631         var ids = d.entityIds.filter(function(e) {
63632           return _entityIDs.indexOf(e) === -1;
63633         });
63634         utilHighlightEntities(ids, true, context);
63635       }).on("mouseout.highlight", function(d3_event, d) {
63636         var ids = d.entityIds.filter(function(e) {
63637           return _entityIDs.indexOf(e) === -1;
63638         });
63639         utilHighlightEntities(ids, false, context);
63640       });
63641       var labelsEnter = itemsEnter.append("div").attr("class", "issue-label");
63642       var textEnter = labelsEnter.append("button").attr("class", "issue-text").on("click", function(d3_event, d) {
63643         makeActiveIssue(d.id);
63644         var extent = d.extent(context.graph());
63645         if (extent) {
63646           var setZoom = Math.max(context.map().zoom(), 19);
63647           context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
63648         }
63649       });
63650       textEnter.each(function(d) {
63651         var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error");
63652         select_default2(this).call(svgIcon(iconName, "issue-icon"));
63653       });
63654       textEnter.append("span").attr("class", "issue-message");
63655       var infoButton = labelsEnter.append("button").attr("class", "issue-info-button").attr("title", _t("icons.information")).call(svgIcon("#iD-icon-inspect"));
63656       infoButton.on("click", function(d3_event) {
63657         d3_event.stopPropagation();
63658         d3_event.preventDefault();
63659         this.blur();
63660         var container = select_default2(this.parentNode.parentNode.parentNode);
63661         var info = container.selectAll(".issue-info");
63662         var isExpanded = info.classed("expanded");
63663         _expanded = !isExpanded;
63664         corePreferences("entity-issues.reference.expanded", _expanded);
63665         if (isExpanded) {
63666           info.transition().duration(200).style("max-height", "0px").style("opacity", "0").on("end", function() {
63667             info.classed("expanded", false);
63668           });
63669         } else {
63670           info.classed("expanded", true).transition().duration(200).style("max-height", "200px").style("opacity", "1").on("end", function() {
63671             info.style("max-height", null);
63672           });
63673         }
63674       });
63675       itemsEnter.append("ul").attr("class", "issue-fix-list");
63676       containersEnter.append("div").attr("class", "issue-info" + (_expanded ? " expanded" : "")).style("max-height", _expanded ? null : "0").style("opacity", _expanded ? "1" : "0").each(function(d) {
63677         if (typeof d.reference === "function") {
63678           select_default2(this).call(d.reference);
63679         } else {
63680           select_default2(this).call(_t.append("inspector.no_documentation_key"));
63681         }
63682       });
63683       containers = containers.merge(containersEnter).classed("active", function(d) {
63684         return d.id === _activeIssueID;
63685       });
63686       containers.selectAll(".issue-message").text("").each(function(d) {
63687         return d.message(context)(select_default2(this));
63688       });
63689       var fixLists = containers.selectAll(".issue-fix-list");
63690       var fixes = fixLists.selectAll(".issue-fix-item").data(function(d) {
63691         return d.fixes ? d.fixes(context) : [];
63692       }, function(fix) {
63693         return fix.id;
63694       });
63695       fixes.exit().remove();
63696       var fixesEnter = fixes.enter().append("li").attr("class", "issue-fix-item");
63697       var buttons = fixesEnter.append("button").on("click", function(d3_event, d) {
63698         if (select_default2(this).attr("disabled") || !d.onClick)
63699           return;
63700         if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1e3)
63701           return;
63702         d.issue.dateLastRanFix = new Date();
63703         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
63704         new Promise(function(resolve, reject) {
63705           d.onClick(context, resolve, reject);
63706           if (d.onClick.length <= 1) {
63707             resolve();
63708           }
63709         }).then(function() {
63710           context.validator().validate();
63711         });
63712       }).on("mouseover.highlight", function(d3_event, d) {
63713         utilHighlightEntities(d.entityIds, true, context);
63714       }).on("mouseout.highlight", function(d3_event, d) {
63715         utilHighlightEntities(d.entityIds, false, context);
63716       });
63717       buttons.each(function(d) {
63718         var iconName = d.icon || "iD-icon-wrench";
63719         if (iconName.startsWith("maki")) {
63720           iconName += "-15";
63721         }
63722         select_default2(this).call(svgIcon("#" + iconName, "fix-icon"));
63723       });
63724       buttons.append("span").attr("class", "fix-message").each(function(d) {
63725         return d.title(select_default2(this));
63726       });
63727       fixesEnter.merge(fixes).selectAll("button").classed("actionable", function(d) {
63728         return d.onClick;
63729       }).attr("disabled", function(d) {
63730         return d.onClick ? null : "true";
63731       }).attr("title", function(d) {
63732         if (d.disabledReason) {
63733           return d.disabledReason;
63734         }
63735         return null;
63736       });
63737     }
63738     section.entityIDs = function(val) {
63739       if (!arguments.length)
63740         return _entityIDs;
63741       if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
63742         _entityIDs = val;
63743         _activeIssueID = null;
63744         reloadIssues();
63745       }
63746       return section;
63747     };
63748     return section;
63749   }
63750
63751   // modules/ui/preset_icon.js
63752   function uiPresetIcon() {
63753     let _preset;
63754     let _geometry;
63755     function presetIcon(selection2) {
63756       selection2.each(render);
63757     }
63758     function getIcon(p, geom) {
63759       if (p.isFallback && p.isFallback())
63760         return geom === "vertex" ? "" : "iD-icon-" + p.id;
63761       if (p.icon)
63762         return p.icon;
63763       if (geom === "line")
63764         return "iD-other-line";
63765       if (geom === "vertex")
63766         return "temaki-vertex";
63767       return "maki-marker-stroked";
63768     }
63769     function renderPointBorder(container, drawPoint) {
63770       let pointBorder = container.selectAll(".preset-icon-point-border").data(drawPoint ? [0] : []);
63771       pointBorder.exit().remove();
63772       let pointBorderEnter = pointBorder.enter();
63773       const w = 40;
63774       const h = 40;
63775       pointBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-point-border").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`).append("path").attr("transform", "translate(11.5, 8)").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");
63776       pointBorder = pointBorderEnter.merge(pointBorder);
63777     }
63778     function renderCategoryBorder(container, category) {
63779       let categoryBorder = container.selectAll(".preset-icon-category-border").data(category ? [0] : []);
63780       categoryBorder.exit().remove();
63781       let categoryBorderEnter = categoryBorder.enter();
63782       const d = 60;
63783       let svgEnter = categoryBorderEnter.append("svg").attr("class", "preset-icon-fill preset-icon-category-border").attr("width", d).attr("height", d).attr("viewBox", `0 0 ${d} ${d}`);
63784       svgEnter.append("path").attr("class", "area").attr("d", "M9.5,7.5 L25.5,7.5 L28.5,12.5 L49.5,12.5 C51.709139,12.5 53.5,14.290861 53.5,16.5 L53.5,43.5 C53.5,45.709139 51.709139,47.5 49.5,47.5 L10.5,47.5 C8.290861,47.5 6.5,45.709139 6.5,43.5 L6.5,12.5 L9.5,7.5 Z");
63785       categoryBorder = categoryBorderEnter.merge(categoryBorder);
63786       if (category) {
63787         categoryBorder.selectAll("path").attr("class", `area ${category.id}`);
63788       }
63789     }
63790     function renderCircleFill(container, drawVertex) {
63791       let vertexFill = container.selectAll(".preset-icon-fill-vertex").data(drawVertex ? [0] : []);
63792       vertexFill.exit().remove();
63793       let vertexFillEnter = vertexFill.enter();
63794       const w = 60;
63795       const h = 60;
63796       const d = 40;
63797       vertexFillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-vertex").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`).append("circle").attr("cx", w / 2).attr("cy", h / 2).attr("r", d / 2);
63798       vertexFill = vertexFillEnter.merge(vertexFill);
63799     }
63800     function renderSquareFill(container, drawArea, tagClasses) {
63801       let fill = container.selectAll(".preset-icon-fill-area").data(drawArea ? [0] : []);
63802       fill.exit().remove();
63803       let fillEnter = fill.enter();
63804       const d = 60;
63805       const w = d;
63806       const h = d;
63807       const l = d * 2 / 3;
63808       const c1 = (w - l) / 2;
63809       const c2 = c1 + l;
63810       fillEnter = fillEnter.append("svg").attr("class", "preset-icon-fill preset-icon-fill-area").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
63811       ["fill", "stroke"].forEach((klass) => {
63812         fillEnter.append("path").attr("d", `M${c1} ${c1} L${c1} ${c2} L${c2} ${c2} L${c2} ${c1} Z`).attr("class", `area ${klass}`);
63813       });
63814       const rVertex = 2.5;
63815       [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach((point2) => {
63816         fillEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", rVertex);
63817       });
63818       const rMidpoint = 1.25;
63819       [[c1, w / 2], [c2, w / 2], [h / 2, c1], [h / 2, c2]].forEach((point2) => {
63820         fillEnter.append("circle").attr("class", "midpoint").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", rMidpoint);
63821       });
63822       fill = fillEnter.merge(fill);
63823       fill.selectAll("path.stroke").attr("class", `area stroke ${tagClasses}`);
63824       fill.selectAll("path.fill").attr("class", `area fill ${tagClasses}`);
63825     }
63826     function renderLine(container, drawLine, tagClasses) {
63827       let line = container.selectAll(".preset-icon-line").data(drawLine ? [0] : []);
63828       line.exit().remove();
63829       let lineEnter = line.enter();
63830       const d = 60;
63831       const w = d;
63832       const h = d;
63833       const y = Math.round(d * 0.72);
63834       const l = Math.round(d * 0.6);
63835       const r = 2.5;
63836       const x12 = (w - l) / 2;
63837       const x2 = x12 + l;
63838       lineEnter = lineEnter.append("svg").attr("class", "preset-icon-line").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
63839       ["casing", "stroke"].forEach((klass) => {
63840         lineEnter.append("path").attr("d", `M${x12} ${y} L${x2} ${y}`).attr("class", `line ${klass}`);
63841       });
63842       [[x12 - 1, y], [x2 + 1, y]].forEach((point2) => {
63843         lineEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", r);
63844       });
63845       line = lineEnter.merge(line);
63846       line.selectAll("path.stroke").attr("class", `line stroke ${tagClasses}`);
63847       line.selectAll("path.casing").attr("class", `line casing ${tagClasses}`);
63848     }
63849     function renderRoute(container, drawRoute, p) {
63850       let route = container.selectAll(".preset-icon-route").data(drawRoute ? [0] : []);
63851       route.exit().remove();
63852       let routeEnter = route.enter();
63853       const d = 60;
63854       const w = d;
63855       const h = d;
63856       const y12 = Math.round(d * 0.8);
63857       const y2 = Math.round(d * 0.68);
63858       const l = Math.round(d * 0.6);
63859       const r = 2;
63860       const x12 = (w - l) / 2;
63861       const x2 = x12 + l / 3;
63862       const x3 = x2 + l / 3;
63863       const x4 = x3 + l / 3;
63864       routeEnter = routeEnter.append("svg").attr("class", "preset-icon-route").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
63865       ["casing", "stroke"].forEach((klass) => {
63866         routeEnter.append("path").attr("d", `M${x12} ${y12} L${x2} ${y2}`).attr("class", `segment0 line ${klass}`);
63867         routeEnter.append("path").attr("d", `M${x2} ${y2} L${x3} ${y12}`).attr("class", `segment1 line ${klass}`);
63868         routeEnter.append("path").attr("d", `M${x3} ${y12} L${x4} ${y2}`).attr("class", `segment2 line ${klass}`);
63869       });
63870       [[x12, y12], [x2, y2], [x3, y12], [x4, y2]].forEach((point2) => {
63871         routeEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", r);
63872       });
63873       route = routeEnter.merge(route);
63874       if (drawRoute) {
63875         let routeType = p.tags.type === "waterway" ? "waterway" : p.tags.route;
63876         const segmentPresetIDs = routeSegments[routeType];
63877         for (let i2 in segmentPresetIDs) {
63878           const segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i2]);
63879           const segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, "");
63880           route.selectAll(`path.stroke.segment${i2}`).attr("class", `segment${i2} line stroke ${segmentTagClasses}`);
63881           route.selectAll(`path.casing.segment${i2}`).attr("class", `segment${i2} line casing ${segmentTagClasses}`);
63882         }
63883       }
63884     }
63885     function renderSvgIcon(container, picon, geom, isFramed, category, tagClasses) {
63886       const isMaki = picon && /^maki-/.test(picon);
63887       const isTemaki = picon && /^temaki-/.test(picon);
63888       const isFa = picon && /^fa[srb]-/.test(picon);
63889       const isiDIcon = picon && !(isMaki || isTemaki || isFa);
63890       let icon2 = container.selectAll(".preset-icon").data(picon ? [0] : []);
63891       icon2.exit().remove();
63892       icon2 = icon2.enter().append("div").attr("class", "preset-icon").call(svgIcon("")).merge(icon2);
63893       icon2.attr("class", "preset-icon " + (geom ? geom + "-geom" : "")).classed("category", category).classed("framed", isFramed).classed("preset-icon-iD", isiDIcon);
63894       icon2.selectAll("svg").attr("class", "icon " + picon + " " + (!isiDIcon && geom !== "line" ? "" : tagClasses));
63895       icon2.selectAll("use").attr("href", "#" + picon);
63896     }
63897     function renderImageIcon(container, imageURL) {
63898       let imageIcon = container.selectAll("img.image-icon").data(imageURL ? [0] : []);
63899       imageIcon.exit().remove();
63900       imageIcon = imageIcon.enter().append("img").attr("class", "image-icon").on("load", () => container.classed("showing-img", true)).on("error", () => container.classed("showing-img", false)).merge(imageIcon);
63901       imageIcon.attr("src", imageURL);
63902     }
63903     const routeSegments = {
63904       bicycle: ["highway/cycleway", "highway/cycleway", "highway/cycleway"],
63905       bus: ["highway/unclassified", "highway/secondary", "highway/primary"],
63906       trolleybus: ["highway/unclassified", "highway/secondary", "highway/primary"],
63907       detour: ["highway/tertiary", "highway/residential", "highway/unclassified"],
63908       ferry: ["route/ferry", "route/ferry", "route/ferry"],
63909       foot: ["highway/footway", "highway/footway", "highway/footway"],
63910       hiking: ["highway/path", "highway/path", "highway/path"],
63911       horse: ["highway/bridleway", "highway/bridleway", "highway/bridleway"],
63912       light_rail: ["railway/light_rail", "railway/light_rail", "railway/light_rail"],
63913       monorail: ["railway/monorail", "railway/monorail", "railway/monorail"],
63914       mtb: ["highway/path", "highway/track", "highway/bridleway"],
63915       pipeline: ["man_made/pipeline", "man_made/pipeline", "man_made/pipeline"],
63916       piste: ["piste/downhill", "piste/hike", "piste/nordic"],
63917       power: ["power/line", "power/line", "power/line"],
63918       road: ["highway/secondary", "highway/primary", "highway/trunk"],
63919       subway: ["railway/subway", "railway/subway", "railway/subway"],
63920       train: ["railway/rail", "railway/rail", "railway/rail"],
63921       tram: ["railway/tram", "railway/tram", "railway/tram"],
63922       waterway: ["waterway/stream", "waterway/stream", "waterway/stream"]
63923     };
63924     function render() {
63925       let p = _preset.apply(this, arguments);
63926       let geom = _geometry ? _geometry.apply(this, arguments) : null;
63927       if (geom === "relation" && p.tags && (p.tags.type === "route" && p.tags.route && routeSegments[p.tags.route] || p.tags.type === "waterway")) {
63928         geom = "route";
63929       }
63930       const showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true";
63931       const isFallback = p.isFallback && p.isFallback();
63932       const imageURL = showThirdPartyIcons === "true" && p.imageURL;
63933       const picon = getIcon(p, geom);
63934       const isCategory = !p.setTags;
63935       const drawPoint = false;
63936       const drawVertex = picon !== null && geom === "vertex";
63937       const drawLine = picon && geom === "line" && !isFallback && !isCategory;
63938       const drawArea = picon && geom === "area" && !isFallback && !isCategory;
63939       const drawRoute = picon && geom === "route";
63940       const isFramed = drawVertex || drawArea || drawLine || drawRoute || isCategory;
63941       let tags = !isCategory ? p.setTags({}, geom) : {};
63942       for (let k in tags) {
63943         if (tags[k] === "*") {
63944           tags[k] = "yes";
63945         }
63946       }
63947       let tagClasses = svgTagClasses().getClassesString(tags, "");
63948       let selection2 = select_default2(this);
63949       let container = selection2.selectAll(".preset-icon-container").data([0]);
63950       container = container.enter().append("div").attr("class", "preset-icon-container").merge(container);
63951       container.classed("showing-img", !!imageURL).classed("fallback", isFallback);
63952       renderCategoryBorder(container, isCategory && p);
63953       renderPointBorder(container, drawPoint);
63954       renderCircleFill(container, drawVertex);
63955       renderSquareFill(container, drawArea, tagClasses);
63956       renderLine(container, drawLine, tagClasses);
63957       renderRoute(container, drawRoute, p);
63958       renderSvgIcon(container, picon, geom, isFramed, isCategory, tagClasses);
63959       renderImageIcon(container, imageURL);
63960     }
63961     presetIcon.preset = function(val) {
63962       if (!arguments.length)
63963         return _preset;
63964       _preset = utilFunctor(val);
63965       return presetIcon;
63966     };
63967     presetIcon.geometry = function(val) {
63968       if (!arguments.length)
63969         return _geometry;
63970       _geometry = utilFunctor(val);
63971       return presetIcon;
63972     };
63973     return presetIcon;
63974   }
63975
63976   // modules/ui/sections/feature_type.js
63977   function uiSectionFeatureType(context) {
63978     var dispatch10 = dispatch_default("choose");
63979     var _entityIDs = [];
63980     var _presets = [];
63981     var _tagReference;
63982     var section = uiSection("feature-type", context).label(() => _t.append("inspector.feature_type")).disclosureContent(renderDisclosureContent);
63983     function renderDisclosureContent(selection2) {
63984       selection2.classed("preset-list-item", true);
63985       selection2.classed("mixed-types", _presets.length > 1);
63986       var presetButtonWrap = selection2.selectAll(".preset-list-button-wrap").data([0]).enter().append("div").attr("class", "preset-list-button-wrap");
63987       var presetButton = presetButtonWrap.append("button").attr("class", "preset-list-button preset-reset").call(
63988         uiTooltip().title(() => _t.append("inspector.back_tooltip")).placement("bottom")
63989       );
63990       presetButton.append("div").attr("class", "preset-icon-container");
63991       presetButton.append("div").attr("class", "label").append("div").attr("class", "label-inner");
63992       presetButtonWrap.append("div").attr("class", "accessory-buttons");
63993       var tagReferenceBodyWrap = selection2.selectAll(".tag-reference-body-wrap").data([0]);
63994       tagReferenceBodyWrap = tagReferenceBodyWrap.enter().append("div").attr("class", "tag-reference-body-wrap").merge(tagReferenceBodyWrap);
63995       if (_tagReference) {
63996         selection2.selectAll(".preset-list-button-wrap .accessory-buttons").style("display", _presets.length === 1 ? null : "none").call(_tagReference.button);
63997         tagReferenceBodyWrap.style("display", _presets.length === 1 ? null : "none").call(_tagReference.body);
63998       }
63999       selection2.selectAll(".preset-reset").on("click", function() {
64000         dispatch10.call("choose", this, _presets);
64001       }).on("pointerdown pointerup mousedown mouseup", function(d3_event) {
64002         d3_event.preventDefault();
64003         d3_event.stopPropagation();
64004       });
64005       var geometries = entityGeometries();
64006       selection2.select(".preset-list-item button").call(
64007         uiPresetIcon().geometry(_presets.length === 1 ? geometries.length === 1 && geometries[0] : null).preset(_presets.length === 1 ? _presets[0] : _mainPresetIndex.item("point"))
64008       );
64009       var names = _presets.length === 1 ? [
64010         _presets[0].nameLabel(),
64011         _presets[0].subtitleLabel()
64012       ].filter(Boolean) : [_t.append("inspector.multiple_types")];
64013       var label = selection2.select(".label-inner");
64014       var nameparts = label.selectAll(".namepart").data(names, (d) => d.stringId);
64015       nameparts.exit().remove();
64016       nameparts.enter().append("div").attr("class", "namepart").text("").each(function(d) {
64017         d(select_default2(this));
64018       });
64019     }
64020     section.entityIDs = function(val) {
64021       if (!arguments.length)
64022         return _entityIDs;
64023       _entityIDs = val;
64024       return section;
64025     };
64026     section.presets = function(val) {
64027       if (!arguments.length)
64028         return _presets;
64029       if (!utilArrayIdentical(val, _presets)) {
64030         _presets = val;
64031         if (_presets.length === 1) {
64032           _tagReference = uiTagReference(_presets[0].reference(), context).showing(false);
64033         }
64034       }
64035       return section;
64036     };
64037     function entityGeometries() {
64038       var counts = {};
64039       for (var i2 in _entityIDs) {
64040         var geometry = context.graph().geometry(_entityIDs[i2]);
64041         if (!counts[geometry])
64042           counts[geometry] = 0;
64043         counts[geometry] += 1;
64044       }
64045       return Object.keys(counts).sort(function(geom1, geom2) {
64046         return counts[geom2] - counts[geom1];
64047       });
64048     }
64049     return utilRebind(section, dispatch10, "on");
64050   }
64051
64052   // modules/ui/sections/preset_fields.js
64053   function uiSectionPresetFields(context) {
64054     var section = uiSection("preset-fields", context).label(() => _t.append("inspector.fields")).disclosureContent(renderDisclosureContent);
64055     var dispatch10 = dispatch_default("change", "revert");
64056     var formFields = uiFormFields(context);
64057     var _state;
64058     var _fieldsArr;
64059     var _presets = [];
64060     var _tags;
64061     var _entityIDs;
64062     function renderDisclosureContent(selection2) {
64063       if (!_fieldsArr) {
64064         var graph = context.graph();
64065         var geometries = Object.keys(_entityIDs.reduce(function(geoms, entityID) {
64066           geoms[graph.entity(entityID).geometry(graph)] = true;
64067           return geoms;
64068         }, {}));
64069         var presetsManager = _mainPresetIndex;
64070         var allFields = [];
64071         var allMoreFields = [];
64072         var sharedTotalFields;
64073         _presets.forEach(function(preset) {
64074           var fields = preset.fields();
64075           var moreFields = preset.moreFields();
64076           allFields = utilArrayUnion(allFields, fields);
64077           allMoreFields = utilArrayUnion(allMoreFields, moreFields);
64078           if (!sharedTotalFields) {
64079             sharedTotalFields = utilArrayUnion(fields, moreFields);
64080           } else {
64081             sharedTotalFields = sharedTotalFields.filter(function(field) {
64082               return fields.indexOf(field) !== -1 || moreFields.indexOf(field) !== -1;
64083             });
64084           }
64085         });
64086         var sharedFields = allFields.filter(function(field) {
64087           return sharedTotalFields.indexOf(field) !== -1;
64088         });
64089         var sharedMoreFields = allMoreFields.filter(function(field) {
64090           return sharedTotalFields.indexOf(field) !== -1;
64091         });
64092         _fieldsArr = [];
64093         sharedFields.forEach(function(field) {
64094           if (field.matchAllGeometry(geometries)) {
64095             _fieldsArr.push(
64096               uiField(context, field, _entityIDs)
64097             );
64098           }
64099         });
64100         var singularEntity = _entityIDs.length === 1 && graph.hasEntity(_entityIDs[0]);
64101         if (singularEntity && singularEntity.isHighwayIntersection(graph) && presetsManager.field("restrictions")) {
64102           _fieldsArr.push(
64103             uiField(context, presetsManager.field("restrictions"), _entityIDs)
64104           );
64105         }
64106         var additionalFields = utilArrayUnion(sharedMoreFields, presetsManager.universal());
64107         additionalFields.sort(function(field1, field2) {
64108           return field1.title().localeCompare(field2.title(), _mainLocalizer.localeCode());
64109         });
64110         additionalFields.forEach(function(field) {
64111           if (sharedFields.indexOf(field) === -1 && field.matchAllGeometry(geometries)) {
64112             _fieldsArr.push(
64113               uiField(context, field, _entityIDs, { show: false })
64114             );
64115           }
64116         });
64117         _fieldsArr.forEach(function(field) {
64118           field.on("change", function(t, onInput) {
64119             dispatch10.call("change", field, _entityIDs, t, onInput);
64120           }).on("revert", function(keys) {
64121             dispatch10.call("revert", field, keys);
64122           });
64123         });
64124       }
64125       _fieldsArr.forEach(function(field) {
64126         field.state(_state).tags(_tags);
64127       });
64128       selection2.call(
64129         formFields.fieldsArr(_fieldsArr).state(_state).klass("grouped-items-area")
64130       );
64131     }
64132     section.presets = function(val) {
64133       if (!arguments.length)
64134         return _presets;
64135       if (!_presets || !val || !utilArrayIdentical(_presets, val)) {
64136         _presets = val;
64137         _fieldsArr = null;
64138       }
64139       return section;
64140     };
64141     section.state = function(val) {
64142       if (!arguments.length)
64143         return _state;
64144       _state = val;
64145       return section;
64146     };
64147     section.tags = function(val) {
64148       if (!arguments.length)
64149         return _tags;
64150       _tags = val;
64151       return section;
64152     };
64153     section.entityIDs = function(val) {
64154       if (!arguments.length)
64155         return _entityIDs;
64156       if (!val || !_entityIDs || !utilArrayIdentical(_entityIDs, val)) {
64157         _entityIDs = val;
64158         _fieldsArr = null;
64159       }
64160       return section;
64161     };
64162     return utilRebind(section, dispatch10, "on");
64163   }
64164
64165   // modules/ui/sections/raw_member_editor.js
64166   function uiSectionRawMemberEditor(context) {
64167     var section = uiSection("raw-member-editor", context).shouldDisplay(function() {
64168       if (!_entityIDs || _entityIDs.length !== 1)
64169         return false;
64170       var entity = context.hasEntity(_entityIDs[0]);
64171       return entity && entity.type === "relation";
64172     }).label(function() {
64173       var entity = context.hasEntity(_entityIDs[0]);
64174       if (!entity)
64175         return "";
64176       var gt = entity.members.length > _maxMembers ? ">" : "";
64177       var count = gt + entity.members.slice(0, _maxMembers).length;
64178       return _t.append("inspector.title_count", { title: _t("inspector.members"), count });
64179     }).disclosureContent(renderDisclosureContent);
64180     var taginfo = services.taginfo;
64181     var _entityIDs;
64182     var _maxMembers = 1e3;
64183     function downloadMember(d3_event, d) {
64184       d3_event.preventDefault();
64185       select_default2(this.parentNode).classed("tag-reference-loading", true);
64186       context.loadEntity(d.id, function() {
64187         section.reRender();
64188       });
64189     }
64190     function zoomToMember(d3_event, d) {
64191       d3_event.preventDefault();
64192       var entity = context.entity(d.id);
64193       context.map().zoomToEase(entity);
64194       utilHighlightEntities([d.id], true, context);
64195     }
64196     function selectMember(d3_event, d) {
64197       d3_event.preventDefault();
64198       utilHighlightEntities([d.id], false, context);
64199       var entity = context.entity(d.id);
64200       var mapExtent = context.map().extent();
64201       if (!entity.intersects(mapExtent, context.graph())) {
64202         context.map().zoomToEase(entity);
64203       }
64204       context.enter(modeSelect(context, [d.id]));
64205     }
64206     function changeRole(d3_event, d) {
64207       var oldRole = d.role;
64208       var newRole = context.cleanRelationRole(select_default2(this).property("value"));
64209       if (oldRole !== newRole) {
64210         var member = { id: d.id, type: d.type, role: newRole };
64211         context.perform(
64212           actionChangeMember(d.relation.id, member, d.index),
64213           _t("operations.change_role.annotation", {
64214             n: 1
64215           })
64216         );
64217         context.validator().validate();
64218       }
64219     }
64220     function deleteMember(d3_event, d) {
64221       utilHighlightEntities([d.id], false, context);
64222       context.perform(
64223         actionDeleteMember(d.relation.id, d.index),
64224         _t("operations.delete_member.annotation", {
64225           n: 1
64226         })
64227       );
64228       if (!context.hasEntity(d.relation.id)) {
64229         context.enter(modeBrowse(context));
64230       } else {
64231         context.validator().validate();
64232       }
64233     }
64234     function renderDisclosureContent(selection2) {
64235       var entityID = _entityIDs[0];
64236       var memberships = [];
64237       var entity = context.entity(entityID);
64238       entity.members.slice(0, _maxMembers).forEach(function(member, index) {
64239         memberships.push({
64240           index,
64241           id: member.id,
64242           type: member.type,
64243           role: member.role,
64244           relation: entity,
64245           member: context.hasEntity(member.id),
64246           domId: utilUniqueDomId(entityID + "-member-" + index)
64247         });
64248       });
64249       var list = selection2.selectAll(".member-list").data([0]);
64250       list = list.enter().append("ul").attr("class", "member-list").merge(list);
64251       var items = list.selectAll("li").data(memberships, function(d) {
64252         return osmEntity.key(d.relation) + "," + d.index + "," + (d.member ? osmEntity.key(d.member) : "incomplete");
64253       });
64254       items.exit().each(unbind).remove();
64255       var itemsEnter = items.enter().append("li").attr("class", "member-row form-field").classed("member-incomplete", function(d) {
64256         return !d.member;
64257       });
64258       itemsEnter.each(function(d) {
64259         var item = select_default2(this);
64260         var label = item.append("label").attr("class", "field-label").attr("for", d.domId);
64261         if (d.member) {
64262           item.on("mouseover", function() {
64263             utilHighlightEntities([d.id], true, context);
64264           }).on("mouseout", function() {
64265             utilHighlightEntities([d.id], false, context);
64266           });
64267           var labelLink = label.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectMember);
64268           labelLink.append("span").attr("class", "member-entity-type").text(function(d2) {
64269             var matched = _mainPresetIndex.match(d2.member, context.graph());
64270             return matched && matched.name() || utilDisplayType(d2.member.id);
64271           });
64272           labelLink.append("span").attr("class", "member-entity-name").text(function(d2) {
64273             return utilDisplayName(d2.member);
64274           });
64275           label.append("button").attr("title", _t("icons.remove")).attr("class", "remove member-delete").call(svgIcon("#iD-operation-delete"));
64276           label.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToMember);
64277         } else {
64278           var labelText = label.append("span").attr("class", "label-text");
64279           labelText.append("span").attr("class", "member-entity-type").call(_t.append("inspector." + d.type, { id: d.id }));
64280           labelText.append("span").attr("class", "member-entity-name").call(_t.append("inspector.incomplete", { id: d.id }));
64281           label.append("button").attr("class", "member-download").attr("title", _t("icons.download")).call(svgIcon("#iD-icon-load")).on("click", downloadMember);
64282         }
64283       });
64284       var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
64285       wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) {
64286         return d.domId;
64287       }).property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto);
64288       if (taginfo) {
64289         wrapEnter.each(bindTypeahead);
64290       }
64291       items = items.merge(itemsEnter).order();
64292       items.select("input.member-role").property("value", function(d) {
64293         return d.role;
64294       }).on("blur", changeRole).on("change", changeRole);
64295       items.select("button.member-delete").on("click", deleteMember);
64296       var dragOrigin, targetIndex;
64297       items.call(
64298         drag_default().on("start", function(d3_event) {
64299           dragOrigin = {
64300             x: d3_event.x,
64301             y: d3_event.y
64302           };
64303           targetIndex = null;
64304         }).on("drag", function(d3_event) {
64305           var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y;
64306           if (!select_default2(this).classed("dragging") && // don't display drag until dragging beyond a distance threshold
64307           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5)
64308             return;
64309           var index = items.nodes().indexOf(this);
64310           select_default2(this).classed("dragging", true);
64311           targetIndex = null;
64312           selection2.selectAll("li.member-row").style("transform", function(d2, index2) {
64313             var node = select_default2(this).node();
64314             if (index === index2) {
64315               return "translate(" + x + "px, " + y + "px)";
64316             } else if (index2 > index && d3_event.y > node.offsetTop) {
64317               if (targetIndex === null || index2 > targetIndex) {
64318                 targetIndex = index2;
64319               }
64320               return "translateY(-100%)";
64321             } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
64322               if (targetIndex === null || index2 < targetIndex) {
64323                 targetIndex = index2;
64324               }
64325               return "translateY(100%)";
64326             }
64327             return null;
64328           });
64329         }).on("end", function(d3_event, d) {
64330           if (!select_default2(this).classed("dragging"))
64331             return;
64332           var index = items.nodes().indexOf(this);
64333           select_default2(this).classed("dragging", false);
64334           selection2.selectAll("li.member-row").style("transform", null);
64335           if (targetIndex !== null) {
64336             context.perform(
64337               actionMoveMember(d.relation.id, index, targetIndex),
64338               _t("operations.reorder_members.annotation")
64339             );
64340             context.validator().validate();
64341           }
64342         })
64343       );
64344       function bindTypeahead(d) {
64345         var row = select_default2(this);
64346         var role = row.selectAll("input.member-role");
64347         var origValue = role.property("value");
64348         function sort(value, data) {
64349           var sameletter = [];
64350           var other = [];
64351           for (var i2 = 0; i2 < data.length; i2++) {
64352             if (data[i2].value.substring(0, value.length) === value) {
64353               sameletter.push(data[i2]);
64354             } else {
64355               other.push(data[i2]);
64356             }
64357           }
64358           return sameletter.concat(other);
64359         }
64360         role.call(
64361           uiCombobox(context, "member-role").fetcher(function(role2, callback) {
64362             var geometry;
64363             if (d.member) {
64364               geometry = context.graph().geometry(d.member.id);
64365             } else if (d.type === "relation") {
64366               geometry = "relation";
64367             } else if (d.type === "way") {
64368               geometry = "line";
64369             } else {
64370               geometry = "point";
64371             }
64372             var rtype = entity.tags.type;
64373             taginfo.roles({
64374               debounce: true,
64375               rtype: rtype || "",
64376               geometry,
64377               query: role2
64378             }, function(err, data) {
64379               if (!err)
64380                 callback(sort(role2, data));
64381             });
64382           }).on("cancel", function() {
64383             role.property("value", origValue);
64384           })
64385         );
64386       }
64387       function unbind() {
64388         var row = select_default2(this);
64389         row.selectAll("input.member-role").call(uiCombobox.off, context);
64390       }
64391     }
64392     section.entityIDs = function(val) {
64393       if (!arguments.length)
64394         return _entityIDs;
64395       _entityIDs = val;
64396       return section;
64397     };
64398     return section;
64399   }
64400
64401   // modules/actions/delete_members.js
64402   function actionDeleteMembers(relationId, memberIndexes) {
64403     return function(graph) {
64404       memberIndexes.sort((a, b) => b - a);
64405       for (var i2 in memberIndexes) {
64406         graph = actionDeleteMember(relationId, memberIndexes[i2])(graph);
64407       }
64408       return graph;
64409     };
64410   }
64411
64412   // modules/ui/sections/raw_membership_editor.js
64413   function uiSectionRawMembershipEditor(context) {
64414     var section = uiSection("raw-membership-editor", context).shouldDisplay(function() {
64415       return _entityIDs && _entityIDs.length;
64416     }).label(function() {
64417       var parents = getSharedParentRelations();
64418       var gt = parents.length > _maxMemberships ? ">" : "";
64419       var count = gt + parents.slice(0, _maxMemberships).length;
64420       return _t.append("inspector.title_count", { title: _t("inspector.relations"), count });
64421     }).disclosureContent(renderDisclosureContent);
64422     var taginfo = services.taginfo;
64423     var nearbyCombo = uiCombobox(context, "parent-relation").minItems(1).fetcher(fetchNearbyRelations).itemsMouseEnter(function(d3_event, d) {
64424       if (d.relation)
64425         utilHighlightEntities([d.relation.id], true, context);
64426     }).itemsMouseLeave(function(d3_event, d) {
64427       if (d.relation)
64428         utilHighlightEntities([d.relation.id], false, context);
64429     });
64430     var _inChange = false;
64431     var _entityIDs = [];
64432     var _showBlank;
64433     var _maxMemberships = 1e3;
64434     function getSharedParentRelations() {
64435       var parents = [];
64436       for (var i2 = 0; i2 < _entityIDs.length; i2++) {
64437         var entity = context.graph().hasEntity(_entityIDs[i2]);
64438         if (!entity)
64439           continue;
64440         if (i2 === 0) {
64441           parents = context.graph().parentRelations(entity);
64442         } else {
64443           parents = utilArrayIntersection(parents, context.graph().parentRelations(entity));
64444         }
64445         if (!parents.length)
64446           break;
64447       }
64448       return parents;
64449     }
64450     function getMemberships() {
64451       var memberships = [];
64452       var relations = getSharedParentRelations().slice(0, _maxMemberships);
64453       var isMultiselect = _entityIDs.length > 1;
64454       var i2, relation, membership, index, member, indexedMember;
64455       for (i2 = 0; i2 < relations.length; i2++) {
64456         relation = relations[i2];
64457         membership = {
64458           relation,
64459           members: [],
64460           hash: osmEntity.key(relation)
64461         };
64462         for (index = 0; index < relation.members.length; index++) {
64463           member = relation.members[index];
64464           if (_entityIDs.indexOf(member.id) !== -1) {
64465             indexedMember = Object.assign({}, member, { index });
64466             membership.members.push(indexedMember);
64467             membership.hash += "," + index.toString();
64468             if (!isMultiselect) {
64469               memberships.push(membership);
64470               membership = {
64471                 relation,
64472                 members: [],
64473                 hash: osmEntity.key(relation)
64474               };
64475             }
64476           }
64477         }
64478         if (membership.members.length)
64479           memberships.push(membership);
64480       }
64481       memberships.forEach(function(membership2) {
64482         membership2.domId = utilUniqueDomId("membership-" + membership2.relation.id);
64483         var roles = [];
64484         membership2.members.forEach(function(member2) {
64485           if (roles.indexOf(member2.role) === -1)
64486             roles.push(member2.role);
64487         });
64488         membership2.role = roles.length === 1 ? roles[0] : roles;
64489       });
64490       return memberships;
64491     }
64492     function selectRelation(d3_event, d) {
64493       d3_event.preventDefault();
64494       utilHighlightEntities([d.relation.id], false, context);
64495       context.enter(modeSelect(context, [d.relation.id]));
64496     }
64497     function zoomToRelation(d3_event, d) {
64498       d3_event.preventDefault();
64499       var entity = context.entity(d.relation.id);
64500       context.map().zoomToEase(entity);
64501       utilHighlightEntities([d.relation.id], true, context);
64502     }
64503     function changeRole(d3_event, d) {
64504       if (d === 0)
64505         return;
64506       if (_inChange)
64507         return;
64508       var newRole = context.cleanRelationRole(select_default2(this).property("value"));
64509       if (!newRole.trim() && typeof d.role !== "string")
64510         return;
64511       var membersToUpdate = d.members.filter(function(member) {
64512         return member.role !== newRole;
64513       });
64514       if (membersToUpdate.length) {
64515         _inChange = true;
64516         context.perform(
64517           function actionChangeMemberRoles(graph) {
64518             membersToUpdate.forEach(function(member) {
64519               var newMember = Object.assign({}, member, { role: newRole });
64520               delete newMember.index;
64521               graph = actionChangeMember(d.relation.id, newMember, member.index)(graph);
64522             });
64523             return graph;
64524           },
64525           _t("operations.change_role.annotation", {
64526             n: membersToUpdate.length
64527           })
64528         );
64529         context.validator().validate();
64530       }
64531       _inChange = false;
64532     }
64533     function addMembership(d, role) {
64534       this.blur();
64535       _showBlank = false;
64536       function actionAddMembers(relationId, ids, role2) {
64537         return function(graph) {
64538           for (var i2 in ids) {
64539             var member = { id: ids[i2], type: graph.entity(ids[i2]).type, role: role2 };
64540             graph = actionAddMember(relationId, member)(graph);
64541           }
64542           return graph;
64543         };
64544       }
64545       if (d.relation) {
64546         context.perform(
64547           actionAddMembers(d.relation.id, _entityIDs, role),
64548           _t("operations.add_member.annotation", {
64549             n: _entityIDs.length
64550           })
64551         );
64552         context.validator().validate();
64553       } else {
64554         var relation = osmRelation();
64555         context.perform(
64556           actionAddEntity(relation),
64557           actionAddMembers(relation.id, _entityIDs, role),
64558           _t("operations.add.annotation.relation")
64559         );
64560         context.enter(modeSelect(context, [relation.id]).newFeature(true));
64561       }
64562     }
64563     function deleteMembership(d3_event, d) {
64564       this.blur();
64565       if (d === 0)
64566         return;
64567       utilHighlightEntities([d.relation.id], false, context);
64568       var indexes = d.members.map(function(member) {
64569         return member.index;
64570       });
64571       context.perform(
64572         actionDeleteMembers(d.relation.id, indexes),
64573         _t("operations.delete_member.annotation", {
64574           n: _entityIDs.length
64575         })
64576       );
64577       context.validator().validate();
64578     }
64579     function fetchNearbyRelations(q, callback) {
64580       var newRelation = {
64581         relation: null,
64582         value: _t("inspector.new_relation"),
64583         display: _t.append("inspector.new_relation")
64584       };
64585       var entityID = _entityIDs[0];
64586       var result = [];
64587       var graph = context.graph();
64588       function baseDisplayLabel(entity) {
64589         var matched = _mainPresetIndex.match(entity, graph);
64590         var presetName = matched && matched.name() || _t("inspector.relation");
64591         var entityName = utilDisplayName(entity) || "";
64592         return presetName + " " + entityName;
64593       }
64594       var explicitRelation = q && context.hasEntity(q.toLowerCase());
64595       if (explicitRelation && explicitRelation.type === "relation" && explicitRelation.id !== entityID) {
64596         result.push({
64597           relation: explicitRelation,
64598           value: baseDisplayLabel(explicitRelation) + " " + explicitRelation.id
64599         });
64600       } else {
64601         context.history().intersects(context.map().extent()).forEach(function(entity) {
64602           if (entity.type !== "relation" || entity.id === entityID)
64603             return;
64604           var value = baseDisplayLabel(entity);
64605           if (q && (value + " " + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1)
64606             return;
64607           result.push({ relation: entity, value });
64608         });
64609         result.sort(function(a, b) {
64610           return osmRelation.creationOrder(a.relation, b.relation);
64611         });
64612         var dupeGroups = Object.values(utilArrayGroupBy(result, "value")).filter(function(v) {
64613           return v.length > 1;
64614         });
64615         dupeGroups.forEach(function(group) {
64616           group.forEach(function(obj) {
64617             obj.value += " " + obj.relation.id;
64618           });
64619         });
64620       }
64621       result.forEach(function(obj) {
64622         obj.title = obj.value;
64623       });
64624       result.unshift(newRelation);
64625       callback(result);
64626     }
64627     function renderDisclosureContent(selection2) {
64628       var memberships = getMemberships();
64629       var list = selection2.selectAll(".member-list").data([0]);
64630       list = list.enter().append("ul").attr("class", "member-list").merge(list);
64631       var items = list.selectAll("li.member-row-normal").data(memberships, function(d) {
64632         return d.hash;
64633       });
64634       items.exit().each(unbind).remove();
64635       var itemsEnter = items.enter().append("li").attr("class", "member-row member-row-normal form-field");
64636       itemsEnter.on("mouseover", function(d3_event, d) {
64637         utilHighlightEntities([d.relation.id], true, context);
64638       }).on("mouseout", function(d3_event, d) {
64639         utilHighlightEntities([d.relation.id], false, context);
64640       });
64641       var labelEnter = itemsEnter.append("label").attr("class", "field-label").attr("for", function(d) {
64642         return d.domId;
64643       });
64644       var labelLink = labelEnter.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectRelation);
64645       labelLink.append("span").attr("class", "member-entity-type").text(function(d) {
64646         var matched = _mainPresetIndex.match(d.relation, context.graph());
64647         return matched && matched.name() || _t.html("inspector.relation");
64648       });
64649       labelLink.append("span").attr("class", "member-entity-name").text(function(d) {
64650         return utilDisplayName(d.relation);
64651       });
64652       labelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", deleteMembership);
64653       labelEnter.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToRelation);
64654       var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
64655       wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) {
64656         return d.domId;
64657       }).property("type", "text").property("value", function(d) {
64658         return typeof d.role === "string" ? d.role : "";
64659       }).attr("title", function(d) {
64660         return Array.isArray(d.role) ? d.role.filter(Boolean).join("\n") : d.role;
64661       }).attr("placeholder", function(d) {
64662         return Array.isArray(d.role) ? _t("inspector.multiple_roles") : _t("inspector.role");
64663       }).classed("mixed", function(d) {
64664         return Array.isArray(d.role);
64665       }).call(utilNoAuto).on("blur", changeRole).on("change", changeRole);
64666       if (taginfo) {
64667         wrapEnter.each(bindTypeahead);
64668       }
64669       var newMembership = list.selectAll(".member-row-new").data(_showBlank ? [0] : []);
64670       newMembership.exit().remove();
64671       var newMembershipEnter = newMembership.enter().append("li").attr("class", "member-row member-row-new form-field");
64672       var newLabelEnter = newMembershipEnter.append("label").attr("class", "field-label");
64673       newLabelEnter.append("input").attr("placeholder", _t("inspector.choose_relation")).attr("type", "text").attr("class", "member-entity-input").call(utilNoAuto);
64674       newLabelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", function() {
64675         list.selectAll(".member-row-new").remove();
64676       });
64677       var newWrapEnter = newMembershipEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
64678       newWrapEnter.append("input").attr("class", "member-role").property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto);
64679       newMembership = newMembership.merge(newMembershipEnter);
64680       newMembership.selectAll(".member-entity-input").on("blur", cancelEntity).call(
64681         nearbyCombo.on("accept", acceptEntity).on("cancel", cancelEntity)
64682       );
64683       var addRow = selection2.selectAll(".add-row").data([0]);
64684       var addRowEnter = addRow.enter().append("div").attr("class", "add-row");
64685       var addRelationButton = addRowEnter.append("button").attr("class", "add-relation").attr("aria-label", _t("inspector.add_to_relation"));
64686       addRelationButton.call(svgIcon("#iD-icon-plus", "light"));
64687       addRelationButton.call(uiTooltip().title(() => _t.append("inspector.add_to_relation")).placement(_mainLocalizer.textDirection() === "ltr" ? "right" : "left"));
64688       addRowEnter.append("div").attr("class", "space-value");
64689       addRowEnter.append("div").attr("class", "space-buttons");
64690       addRow = addRow.merge(addRowEnter);
64691       addRow.select(".add-relation").on("click", function() {
64692         _showBlank = true;
64693         section.reRender();
64694         list.selectAll(".member-entity-input").node().focus();
64695       });
64696       function acceptEntity(d) {
64697         if (!d) {
64698           cancelEntity();
64699           return;
64700         }
64701         if (d.relation)
64702           utilHighlightEntities([d.relation.id], false, context);
64703         var role = context.cleanRelationRole(list.selectAll(".member-row-new .member-role").property("value"));
64704         addMembership(d, role);
64705       }
64706       function cancelEntity() {
64707         var input = newMembership.selectAll(".member-entity-input");
64708         input.property("value", "");
64709         context.surface().selectAll(".highlighted").classed("highlighted", false);
64710       }
64711       function bindTypeahead(d) {
64712         var row = select_default2(this);
64713         var role = row.selectAll("input.member-role");
64714         var origValue = role.property("value");
64715         function sort(value, data) {
64716           var sameletter = [];
64717           var other = [];
64718           for (var i2 = 0; i2 < data.length; i2++) {
64719             if (data[i2].value.substring(0, value.length) === value) {
64720               sameletter.push(data[i2]);
64721             } else {
64722               other.push(data[i2]);
64723             }
64724           }
64725           return sameletter.concat(other);
64726         }
64727         role.call(
64728           uiCombobox(context, "member-role").fetcher(function(role2, callback) {
64729             var rtype = d.relation.tags.type;
64730             taginfo.roles({
64731               debounce: true,
64732               rtype: rtype || "",
64733               geometry: context.graph().geometry(_entityIDs[0]),
64734               query: role2
64735             }, function(err, data) {
64736               if (!err)
64737                 callback(sort(role2, data));
64738             });
64739           }).on("cancel", function() {
64740             role.property("value", origValue);
64741           })
64742         );
64743       }
64744       function unbind() {
64745         var row = select_default2(this);
64746         row.selectAll("input.member-role").call(uiCombobox.off, context);
64747       }
64748     }
64749     section.entityIDs = function(val) {
64750       if (!arguments.length)
64751         return _entityIDs;
64752       _entityIDs = val;
64753       _showBlank = false;
64754       return section;
64755     };
64756     return section;
64757   }
64758
64759   // modules/ui/sections/selection_list.js
64760   function uiSectionSelectionList(context) {
64761     var _selectedIDs = [];
64762     var section = uiSection("selected-features", context).shouldDisplay(function() {
64763       return _selectedIDs.length > 1;
64764     }).label(function() {
64765       return _t.append("inspector.title_count", { title: _t("inspector.features"), count: _selectedIDs.length });
64766     }).disclosureContent(renderDisclosureContent);
64767     context.history().on("change.selectionList", function(difference) {
64768       if (difference) {
64769         section.reRender();
64770       }
64771     });
64772     section.entityIDs = function(val) {
64773       if (!arguments.length)
64774         return _selectedIDs;
64775       _selectedIDs = val;
64776       return section;
64777     };
64778     function selectEntity(d3_event, entity) {
64779       context.enter(modeSelect(context, [entity.id]));
64780     }
64781     function deselectEntity(d3_event, entity) {
64782       var selectedIDs = _selectedIDs.slice();
64783       var index = selectedIDs.indexOf(entity.id);
64784       if (index > -1) {
64785         selectedIDs.splice(index, 1);
64786         context.enter(modeSelect(context, selectedIDs));
64787       }
64788     }
64789     function renderDisclosureContent(selection2) {
64790       var list = selection2.selectAll(".feature-list").data([0]);
64791       list = list.enter().append("ul").attr("class", "feature-list").merge(list);
64792       var entities = _selectedIDs.map(function(id2) {
64793         return context.hasEntity(id2);
64794       }).filter(Boolean);
64795       var items = list.selectAll(".feature-list-item").data(entities, osmEntity.key);
64796       items.exit().remove();
64797       var enter = items.enter().append("li").attr("class", "feature-list-item").each(function(d) {
64798         select_default2(this).on("mouseover", function() {
64799           utilHighlightEntities([d.id], true, context);
64800         }).on("mouseout", function() {
64801           utilHighlightEntities([d.id], false, context);
64802         });
64803       });
64804       var label = enter.append("button").attr("class", "label").on("click", selectEntity);
64805       label.append("span").attr("class", "entity-geom-icon").call(svgIcon("", "pre-text"));
64806       label.append("span").attr("class", "entity-type");
64807       label.append("span").attr("class", "entity-name");
64808       enter.append("button").attr("class", "close").attr("title", _t("icons.deselect")).on("click", deselectEntity).call(svgIcon("#iD-icon-close"));
64809       items = items.merge(enter);
64810       items.selectAll(".entity-geom-icon use").attr("href", function() {
64811         var entity = this.parentNode.parentNode.__data__;
64812         return "#iD-icon-" + entity.geometry(context.graph());
64813       });
64814       items.selectAll(".entity-type").text(function(entity) {
64815         return _mainPresetIndex.match(entity, context.graph()).name();
64816       });
64817       items.selectAll(".entity-name").text(function(d) {
64818         var entity = context.entity(d.id);
64819         return utilDisplayName(entity);
64820       });
64821     }
64822     return section;
64823   }
64824
64825   // modules/ui/entity_editor.js
64826   function uiEntityEditor(context) {
64827     var dispatch10 = dispatch_default("choose");
64828     var _state = "select";
64829     var _coalesceChanges = false;
64830     var _modified = false;
64831     var _base;
64832     var _entityIDs;
64833     var _activePresets = [];
64834     var _newFeature;
64835     var _sections;
64836     function entityEditor(selection2) {
64837       var combinedTags = utilCombinedTags(_entityIDs, context.graph());
64838       var header = selection2.selectAll(".header").data([0]);
64839       var headerEnter = header.enter().append("div").attr("class", "header fillL");
64840       var direction = _mainLocalizer.textDirection() === "rtl" ? "forward" : "backward";
64841       headerEnter.append("button").attr("class", "preset-reset preset-choose").attr("title", _t("inspector.back_tooltip")).call(svgIcon(`#iD-icon-${direction}`));
64842       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
64843         context.enter(modeBrowse(context));
64844       }).call(svgIcon(_modified ? "#iD-icon-apply" : "#iD-icon-close"));
64845       headerEnter.append("h2");
64846       header = header.merge(headerEnter);
64847       header.selectAll("h2").text("").call(_entityIDs.length === 1 ? _t.append("inspector.edit") : _t.append("inspector.edit_features"));
64848       header.selectAll(".preset-reset").on("click", function() {
64849         dispatch10.call("choose", this, _activePresets);
64850       });
64851       var body = selection2.selectAll(".inspector-body").data([0]);
64852       var bodyEnter = body.enter().append("div").attr("class", "entity-editor inspector-body sep-top");
64853       body = body.merge(bodyEnter);
64854       if (!_sections) {
64855         _sections = [
64856           uiSectionSelectionList(context),
64857           uiSectionFeatureType(context).on("choose", function(presets) {
64858             dispatch10.call("choose", this, presets);
64859           }),
64860           uiSectionEntityIssues(context),
64861           uiSectionPresetFields(context).on("change", changeTags).on("revert", revertTags),
64862           uiSectionRawTagEditor("raw-tag-editor", context).on("change", changeTags),
64863           uiSectionRawMemberEditor(context),
64864           uiSectionRawMembershipEditor(context)
64865         ];
64866       }
64867       _sections.forEach(function(section) {
64868         if (section.entityIDs) {
64869           section.entityIDs(_entityIDs);
64870         }
64871         if (section.presets) {
64872           section.presets(_activePresets);
64873         }
64874         if (section.tags) {
64875           section.tags(combinedTags);
64876         }
64877         if (section.state) {
64878           section.state(_state);
64879         }
64880         body.call(section.render);
64881       });
64882       context.history().on("change.entity-editor", historyChanged);
64883       function historyChanged(difference) {
64884         if (selection2.selectAll(".entity-editor").empty())
64885           return;
64886         if (_state === "hide")
64887           return;
64888         var significant = !difference || difference.didChange.properties || difference.didChange.addition || difference.didChange.deletion;
64889         if (!significant)
64890           return;
64891         _entityIDs = _entityIDs.filter(context.hasEntity);
64892         if (!_entityIDs.length)
64893           return;
64894         var priorActivePreset = _activePresets.length === 1 && _activePresets[0];
64895         loadActivePresets();
64896         var graph = context.graph();
64897         entityEditor.modified(_base !== graph);
64898         entityEditor(selection2);
64899         if (priorActivePreset && _activePresets.length === 1 && priorActivePreset !== _activePresets[0]) {
64900           context.container().selectAll(".entity-editor button.preset-reset .label").style("background-color", "#fff").transition().duration(750).style("background-color", null);
64901         }
64902       }
64903     }
64904     function changeTags(entityIDs, changed, onInput) {
64905       var actions = [];
64906       for (var i2 in entityIDs) {
64907         var entityID = entityIDs[i2];
64908         var entity = context.entity(entityID);
64909         var tags = Object.assign({}, entity.tags);
64910         if (typeof changed === "function") {
64911           tags = changed(tags);
64912         } else {
64913           for (var k in changed) {
64914             if (!k)
64915               continue;
64916             var v = changed[k];
64917             if (typeof v === "object") {
64918               tags[k] = tags[v.oldKey];
64919             } else if (v !== void 0 || tags.hasOwnProperty(k)) {
64920               tags[k] = v;
64921             }
64922           }
64923         }
64924         if (!onInput) {
64925           tags = utilCleanTags(tags);
64926         }
64927         if (!(0, import_fast_deep_equal10.default)(entity.tags, tags)) {
64928           actions.push(actionChangeTags(entityID, tags));
64929         }
64930       }
64931       if (actions.length) {
64932         var combinedAction = function(graph) {
64933           actions.forEach(function(action) {
64934             graph = action(graph);
64935           });
64936           return graph;
64937         };
64938         var annotation = _t("operations.change_tags.annotation");
64939         if (_coalesceChanges) {
64940           context.overwrite(combinedAction, annotation);
64941         } else {
64942           context.perform(combinedAction, annotation);
64943           _coalesceChanges = !!onInput;
64944         }
64945       }
64946       if (!onInput) {
64947         context.validator().validate();
64948       }
64949     }
64950     function revertTags(keys) {
64951       var actions = [];
64952       for (var i2 in _entityIDs) {
64953         var entityID = _entityIDs[i2];
64954         var original = context.graph().base().entities[entityID];
64955         var changed = {};
64956         for (var j2 in keys) {
64957           var key = keys[j2];
64958           changed[key] = original ? original.tags[key] : void 0;
64959         }
64960         var entity = context.entity(entityID);
64961         var tags = Object.assign({}, entity.tags);
64962         for (var k in changed) {
64963           if (!k)
64964             continue;
64965           var v = changed[k];
64966           if (v !== void 0 || tags.hasOwnProperty(k)) {
64967             tags[k] = v;
64968           }
64969         }
64970         tags = utilCleanTags(tags);
64971         if (!(0, import_fast_deep_equal10.default)(entity.tags, tags)) {
64972           actions.push(actionChangeTags(entityID, tags));
64973         }
64974       }
64975       if (actions.length) {
64976         var combinedAction = function(graph) {
64977           actions.forEach(function(action) {
64978             graph = action(graph);
64979           });
64980           return graph;
64981         };
64982         var annotation = _t("operations.change_tags.annotation");
64983         if (_coalesceChanges) {
64984           context.overwrite(combinedAction, annotation);
64985         } else {
64986           context.perform(combinedAction, annotation);
64987           _coalesceChanges = false;
64988         }
64989       }
64990       context.validator().validate();
64991     }
64992     entityEditor.modified = function(val) {
64993       if (!arguments.length)
64994         return _modified;
64995       _modified = val;
64996       return entityEditor;
64997     };
64998     entityEditor.state = function(val) {
64999       if (!arguments.length)
65000         return _state;
65001       _state = val;
65002       return entityEditor;
65003     };
65004     entityEditor.entityIDs = function(val) {
65005       if (!arguments.length)
65006         return _entityIDs;
65007       _base = context.graph();
65008       _coalesceChanges = false;
65009       if (val && _entityIDs && utilArrayIdentical(_entityIDs, val))
65010         return entityEditor;
65011       _entityIDs = val;
65012       loadActivePresets(true);
65013       return entityEditor.modified(false);
65014     };
65015     entityEditor.newFeature = function(val) {
65016       if (!arguments.length)
65017         return _newFeature;
65018       _newFeature = val;
65019       return entityEditor;
65020     };
65021     function loadActivePresets(isForNewSelection) {
65022       var graph = context.graph();
65023       var counts = {};
65024       for (var i2 in _entityIDs) {
65025         var entity = graph.hasEntity(_entityIDs[i2]);
65026         if (!entity)
65027           return;
65028         var match = _mainPresetIndex.match(entity, graph);
65029         if (!counts[match.id])
65030           counts[match.id] = 0;
65031         counts[match.id] += 1;
65032       }
65033       var matches = Object.keys(counts).sort(function(p1, p2) {
65034         return counts[p2] - counts[p1];
65035       }).map(function(pID) {
65036         return _mainPresetIndex.item(pID);
65037       });
65038       if (!isForNewSelection) {
65039         var weakPreset = _activePresets.length === 1 && !_activePresets[0].isFallback() && Object.keys(_activePresets[0].addTags || {}).length === 0;
65040         if (weakPreset && matches.length === 1 && matches[0].isFallback())
65041           return;
65042       }
65043       entityEditor.presets(matches);
65044     }
65045     entityEditor.presets = function(val) {
65046       if (!arguments.length)
65047         return _activePresets;
65048       if (!utilArrayIdentical(val, _activePresets)) {
65049         _activePresets = val;
65050       }
65051       return entityEditor;
65052     };
65053     return utilRebind(entityEditor, dispatch10, "on");
65054   }
65055
65056   // modules/ui/feature_list.js
65057   var sexagesimal = __toESM(require_sexagesimal());
65058   function uiFeatureList(context) {
65059     var _geocodeResults;
65060     function featureList(selection2) {
65061       var header = selection2.append("div").attr("class", "header fillL");
65062       header.append("h2").call(_t.append("inspector.feature_list"));
65063       var searchWrap = selection2.append("div").attr("class", "search-header");
65064       searchWrap.call(svgIcon("#iD-icon-search", "pre-text"));
65065       var search = searchWrap.append("input").attr("placeholder", _t("inspector.search")).attr("type", "search").call(utilNoAuto).on("keypress", keypress).on("keydown", keydown).on("input", inputevent);
65066       var listWrap = selection2.append("div").attr("class", "inspector-body");
65067       var list = listWrap.append("div").attr("class", "feature-list");
65068       context.on("exit.feature-list", clearSearch);
65069       context.map().on("drawn.feature-list", mapDrawn);
65070       context.keybinding().on(uiCmd("\u2318F"), focusSearch);
65071       function focusSearch(d3_event) {
65072         var mode = context.mode() && context.mode().id;
65073         if (mode !== "browse")
65074           return;
65075         d3_event.preventDefault();
65076         search.node().focus();
65077       }
65078       function keydown(d3_event) {
65079         if (d3_event.keyCode === 27) {
65080           search.node().blur();
65081         }
65082       }
65083       function keypress(d3_event) {
65084         var q = search.property("value"), items = list.selectAll(".feature-list-item");
65085         if (d3_event.keyCode === 13 && // ↩ Return
65086         q.length && items.size()) {
65087           click(d3_event, items.datum());
65088         }
65089       }
65090       function inputevent() {
65091         _geocodeResults = void 0;
65092         drawList();
65093       }
65094       function clearSearch() {
65095         search.property("value", "");
65096         drawList();
65097       }
65098       function mapDrawn(e) {
65099         if (e.full) {
65100           drawList();
65101         }
65102       }
65103       function features() {
65104         var result = [];
65105         var graph = context.graph();
65106         var visibleCenter = context.map().extent().center();
65107         var q = search.property("value").toLowerCase();
65108         if (!q)
65109           return result;
65110         var locationMatch = sexagesimal.pair(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
65111         if (locationMatch) {
65112           var loc = [Number(locationMatch[0]), Number(locationMatch[1])];
65113           result.push({
65114             id: -1,
65115             geometry: "point",
65116             type: _t("inspector.location"),
65117             name: dmsCoordinatePair([loc[1], loc[0]]),
65118             location: loc
65119           });
65120         }
65121         var idMatch = !locationMatch && q.match(/(?:^|\W)(node|way|relation|[nwr])\W?0*([1-9]\d*)(?:\W|$)/i);
65122         if (idMatch) {
65123           var elemType = idMatch[1].charAt(0);
65124           var elemId = idMatch[2];
65125           result.push({
65126             id: elemType + elemId,
65127             geometry: elemType === "n" ? "point" : elemType === "w" ? "line" : "relation",
65128             type: elemType === "n" ? _t("inspector.node") : elemType === "w" ? _t("inspector.way") : _t("inspector.relation"),
65129             name: elemId
65130           });
65131         }
65132         var allEntities = graph.entities;
65133         var localResults = [];
65134         for (var id2 in allEntities) {
65135           var entity = allEntities[id2];
65136           if (!entity)
65137             continue;
65138           var name = utilDisplayName(entity) || "";
65139           if (name.toLowerCase().indexOf(q) < 0)
65140             continue;
65141           var matched = _mainPresetIndex.match(entity, graph);
65142           var type2 = matched && matched.name() || utilDisplayType(entity.id);
65143           var extent = entity.extent(graph);
65144           var distance = extent ? geoSphericalDistance(visibleCenter, extent.center()) : 0;
65145           localResults.push({
65146             id: entity.id,
65147             entity,
65148             geometry: entity.geometry(graph),
65149             type: type2,
65150             name,
65151             distance
65152           });
65153           if (localResults.length > 100)
65154             break;
65155         }
65156         localResults = localResults.sort(function byDistance(a, b) {
65157           return a.distance - b.distance;
65158         });
65159         result = result.concat(localResults);
65160         (_geocodeResults || []).forEach(function(d) {
65161           if (d.osm_type && d.osm_id) {
65162             var id3 = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
65163             var tags = {};
65164             tags[d.class] = d.type;
65165             var attrs = { id: id3, type: d.osm_type, tags };
65166             if (d.osm_type === "way") {
65167               attrs.nodes = ["a", "a"];
65168             }
65169             var tempEntity = osmEntity(attrs);
65170             var tempGraph = coreGraph([tempEntity]);
65171             var matched2 = _mainPresetIndex.match(tempEntity, tempGraph);
65172             var type3 = matched2 && matched2.name() || utilDisplayType(id3);
65173             result.push({
65174               id: tempEntity.id,
65175               geometry: tempEntity.geometry(tempGraph),
65176               type: type3,
65177               name: d.display_name,
65178               extent: new geoExtent(
65179                 [Number(d.boundingbox[3]), Number(d.boundingbox[0])],
65180                 [Number(d.boundingbox[2]), Number(d.boundingbox[1])]
65181               )
65182             });
65183           }
65184         });
65185         if (q.match(/^[0-9]+$/)) {
65186           result.push({
65187             id: "n" + q,
65188             geometry: "point",
65189             type: _t("inspector.node"),
65190             name: q
65191           });
65192           result.push({
65193             id: "w" + q,
65194             geometry: "line",
65195             type: _t("inspector.way"),
65196             name: q
65197           });
65198           result.push({
65199             id: "r" + q,
65200             geometry: "relation",
65201             type: _t("inspector.relation"),
65202             name: q
65203           });
65204         }
65205         return result;
65206       }
65207       function drawList() {
65208         var value = search.property("value");
65209         var results = features();
65210         list.classed("filtered", value.length);
65211         var resultsIndicator = list.selectAll(".no-results-item").data([0]).enter().append("button").property("disabled", true).attr("class", "no-results-item").call(svgIcon("#iD-icon-alert", "pre-text"));
65212         resultsIndicator.append("span").attr("class", "entity-name");
65213         list.selectAll(".no-results-item .entity-name").html("").call(_t.append("geocoder.no_results_worldwide"));
65214         if (services.geocoder) {
65215           list.selectAll(".geocode-item").data([0]).enter().append("button").attr("class", "geocode-item secondary-action").on("click", geocoderSearch).append("div").attr("class", "label").append("span").attr("class", "entity-name").call(_t.append("geocoder.search"));
65216         }
65217         list.selectAll(".no-results-item").style("display", value.length && !results.length ? "block" : "none");
65218         list.selectAll(".geocode-item").style("display", value && _geocodeResults === void 0 ? "block" : "none");
65219         list.selectAll(".feature-list-item").data([-1]).remove();
65220         var items = list.selectAll(".feature-list-item").data(results, function(d) {
65221           return d.id;
65222         });
65223         var enter = items.enter().insert("button", ".geocode-item").attr("class", "feature-list-item").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click);
65224         var label = enter.append("div").attr("class", "label");
65225         label.each(function(d) {
65226           select_default2(this).call(svgIcon("#iD-icon-" + d.geometry, "pre-text"));
65227         });
65228         label.append("span").attr("class", "entity-type").text(function(d) {
65229           return d.type;
65230         });
65231         label.append("span").attr("class", "entity-name").text(function(d) {
65232           return d.name;
65233         });
65234         enter.style("opacity", 0).transition().style("opacity", 1);
65235         items.order();
65236         items.exit().remove();
65237       }
65238       function mouseover(d3_event, d) {
65239         if (d.id === -1)
65240           return;
65241         utilHighlightEntities([d.id], true, context);
65242       }
65243       function mouseout(d3_event, d) {
65244         if (d.id === -1)
65245           return;
65246         utilHighlightEntities([d.id], false, context);
65247       }
65248       function click(d3_event, d) {
65249         d3_event.preventDefault();
65250         if (d.location) {
65251           context.map().centerZoomEase([d.location[1], d.location[0]], 19);
65252         } else if (d.entity) {
65253           utilHighlightEntities([d.id], false, context);
65254           context.enter(modeSelect(context, [d.entity.id]));
65255           context.map().zoomToEase(d.entity);
65256         } else {
65257           context.zoomToEntity(d.id);
65258         }
65259       }
65260       function geocoderSearch() {
65261         services.geocoder.search(search.property("value"), function(err, resp) {
65262           _geocodeResults = resp || [];
65263           drawList();
65264         });
65265       }
65266     }
65267     return featureList;
65268   }
65269
65270   // modules/ui/improveOSM_comments.js
65271   function uiImproveOsmComments() {
65272     let _qaItem;
65273     function issueComments(selection2) {
65274       let comments = selection2.selectAll(".comments-container").data([0]);
65275       comments = comments.enter().append("div").attr("class", "comments-container").merge(comments);
65276       services.improveOSM.getComments(_qaItem).then((d) => {
65277         if (!d.comments)
65278           return;
65279         const commentEnter = comments.selectAll(".comment").data(d.comments).enter().append("div").attr("class", "comment");
65280         commentEnter.append("div").attr("class", "comment-avatar").call(svgIcon("#iD-icon-avatar", "comment-avatar-icon"));
65281         const mainEnter = commentEnter.append("div").attr("class", "comment-main");
65282         const metadataEnter = mainEnter.append("div").attr("class", "comment-metadata");
65283         metadataEnter.append("div").attr("class", "comment-author").each(function(d2) {
65284           const osm = services.osm;
65285           let selection3 = select_default2(this);
65286           if (osm && d2.username) {
65287             selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d2.username)).attr("target", "_blank");
65288           }
65289           selection3.text((d4) => d4.username);
65290         });
65291         metadataEnter.append("div").attr("class", "comment-date").html((d2) => _t.html("note.status.commented", { when: localeDateString2(d2.timestamp) }));
65292         mainEnter.append("div").attr("class", "comment-text").append("p").text((d2) => d2.text);
65293       }).catch((err) => {
65294         console.log(err);
65295       });
65296     }
65297     function localeDateString2(s) {
65298       if (!s)
65299         return null;
65300       const options2 = { day: "numeric", month: "short", year: "numeric" };
65301       const d = new Date(s * 1e3);
65302       if (isNaN(d.getTime()))
65303         return null;
65304       return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
65305     }
65306     issueComments.issue = function(val) {
65307       if (!arguments.length)
65308         return _qaItem;
65309       _qaItem = val;
65310       return issueComments;
65311     };
65312     return issueComments;
65313   }
65314
65315   // modules/ui/improveOSM_details.js
65316   function uiImproveOsmDetails(context) {
65317     let _qaItem;
65318     function issueDetail(d) {
65319       if (d.desc)
65320         return d.desc;
65321       const issueKey = d.issueKey;
65322       d.replacements = d.replacements || {};
65323       d.replacements.default = { html: _t.html("inspector.unknown") };
65324       return _t.html(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements);
65325     }
65326     function improveOsmDetails(selection2) {
65327       const details = selection2.selectAll(".error-details").data(
65328         _qaItem ? [_qaItem] : [],
65329         (d) => `${d.id}-${d.status || 0}`
65330       );
65331       details.exit().remove();
65332       const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
65333       const descriptionEnter = detailsEnter.append("div").attr("class", "qa-details-subsection");
65334       descriptionEnter.append("h4").call(_t.append("QA.keepRight.detail_description"));
65335       descriptionEnter.append("div").attr("class", "qa-details-description-text").html(issueDetail);
65336       let relatedEntities = [];
65337       descriptionEnter.selectAll(".error_entity_link, .error_object_link").attr("href", "#").each(function() {
65338         const link2 = select_default2(this);
65339         const isObjectLink = link2.classed("error_object_link");
65340         const entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
65341         const entity = context.hasEntity(entityID);
65342         relatedEntities.push(entityID);
65343         link2.on("mouseenter", () => {
65344           utilHighlightEntities([entityID], true, context);
65345         }).on("mouseleave", () => {
65346           utilHighlightEntities([entityID], false, context);
65347         }).on("click", (d3_event) => {
65348           d3_event.preventDefault();
65349           utilHighlightEntities([entityID], false, context);
65350           const osmlayer = context.layers().layer("osm");
65351           if (!osmlayer.enabled()) {
65352             osmlayer.enabled(true);
65353           }
65354           context.map().centerZoom(_qaItem.loc, 20);
65355           if (entity) {
65356             context.enter(modeSelect(context, [entityID]));
65357           } else {
65358             context.loadEntity(entityID, (err, result) => {
65359               if (err)
65360                 return;
65361               const entity2 = result.data.find((e) => e.id === entityID);
65362               if (entity2)
65363                 context.enter(modeSelect(context, [entityID]));
65364             });
65365           }
65366         });
65367         if (entity) {
65368           let name = utilDisplayName(entity);
65369           if (!name && !isObjectLink) {
65370             const preset = _mainPresetIndex.match(entity, context.graph());
65371             name = preset && !preset.isFallback() && preset.name();
65372           }
65373           if (name) {
65374             this.innerText = name;
65375           }
65376         }
65377       });
65378       context.features().forceVisible(relatedEntities);
65379       context.map().pan([0, 0]);
65380     }
65381     improveOsmDetails.issue = function(val) {
65382       if (!arguments.length)
65383         return _qaItem;
65384       _qaItem = val;
65385       return improveOsmDetails;
65386     };
65387     return improveOsmDetails;
65388   }
65389
65390   // modules/ui/improveOSM_header.js
65391   function uiImproveOsmHeader() {
65392     let _qaItem;
65393     function issueTitle(d) {
65394       const issueKey = d.issueKey;
65395       d.replacements = d.replacements || {};
65396       d.replacements.default = { html: _t.html("inspector.unknown") };
65397       return _t.html(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements);
65398     }
65399     function improveOsmHeader(selection2) {
65400       const header = selection2.selectAll(".qa-header").data(
65401         _qaItem ? [_qaItem] : [],
65402         (d) => `${d.id}-${d.status || 0}`
65403       );
65404       header.exit().remove();
65405       const headerEnter = header.enter().append("div").attr("class", "qa-header");
65406       const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
65407       svgEnter.append("polygon").attr("fill", "currentColor").attr("class", "qaItem-fill").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");
65408       svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
65409       headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle);
65410     }
65411     improveOsmHeader.issue = function(val) {
65412       if (!arguments.length)
65413         return _qaItem;
65414       _qaItem = val;
65415       return improveOsmHeader;
65416     };
65417     return improveOsmHeader;
65418   }
65419
65420   // modules/ui/improveOSM_editor.js
65421   function uiImproveOsmEditor(context) {
65422     const dispatch10 = dispatch_default("change");
65423     const qaDetails = uiImproveOsmDetails(context);
65424     const qaComments = uiImproveOsmComments(context);
65425     const qaHeader = uiImproveOsmHeader(context);
65426     let _qaItem;
65427     function improveOsmEditor(selection2) {
65428       const headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
65429       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
65430       headerEnter.append("h2").call(_t.append("QA.improveOSM.title"));
65431       let body = selection2.selectAll(".body").data([0]);
65432       body = body.enter().append("div").attr("class", "body").merge(body);
65433       const editor = body.selectAll(".qa-editor").data([0]);
65434       editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(qaComments.issue(_qaItem)).call(improveOsmSaveSection);
65435     }
65436     function improveOsmSaveSection(selection2) {
65437       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
65438       const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
65439       let saveSection = selection2.selectAll(".qa-save").data(
65440         isShown ? [_qaItem] : [],
65441         (d) => `${d.id}-${d.status || 0}`
65442       );
65443       saveSection.exit().remove();
65444       const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
65445       saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("note.newComment"));
65446       saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d) => d.newComment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput);
65447       saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
65448       function changeInput() {
65449         const input = select_default2(this);
65450         let val = input.property("value").trim();
65451         if (val === "") {
65452           val = void 0;
65453         }
65454         _qaItem = _qaItem.update({ newComment: val });
65455         const qaService = services.improveOSM;
65456         if (qaService) {
65457           qaService.replaceItem(_qaItem);
65458         }
65459         saveSection.call(qaSaveButtons);
65460       }
65461     }
65462     function qaSaveButtons(selection2) {
65463       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
65464       let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
65465       buttonSection.exit().remove();
65466       const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
65467       buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment"));
65468       buttonEnter.append("button").attr("class", "button close-button action");
65469       buttonEnter.append("button").attr("class", "button ignore-button action");
65470       buttonSection = buttonSection.merge(buttonEnter);
65471       buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) {
65472         this.blur();
65473         const qaService = services.improveOSM;
65474         if (qaService) {
65475           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
65476         }
65477       });
65478       buttonSection.select(".close-button").html((d) => {
65479         const andComment = d.newComment ? "_comment" : "";
65480         return _t.html(`QA.keepRight.close${andComment}`);
65481       }).on("click.close", function(d3_event, d) {
65482         this.blur();
65483         const qaService = services.improveOSM;
65484         if (qaService) {
65485           d.newStatus = "SOLVED";
65486           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
65487         }
65488       });
65489       buttonSection.select(".ignore-button").html((d) => {
65490         const andComment = d.newComment ? "_comment" : "";
65491         return _t.html(`QA.keepRight.ignore${andComment}`);
65492       }).on("click.ignore", function(d3_event, d) {
65493         this.blur();
65494         const qaService = services.improveOSM;
65495         if (qaService) {
65496           d.newStatus = "INVALID";
65497           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
65498         }
65499       });
65500     }
65501     improveOsmEditor.error = function(val) {
65502       if (!arguments.length)
65503         return _qaItem;
65504       _qaItem = val;
65505       return improveOsmEditor;
65506     };
65507     return utilRebind(improveOsmEditor, dispatch10, "on");
65508   }
65509
65510   // modules/ui/preset_list.js
65511   function uiPresetList(context) {
65512     var dispatch10 = dispatch_default("cancel", "choose");
65513     var _entityIDs;
65514     var _currLoc;
65515     var _currentPresets;
65516     var _autofocus = false;
65517     function presetList(selection2) {
65518       if (!_entityIDs)
65519         return;
65520       var presets = _mainPresetIndex.matchAllGeometry(entityGeometries());
65521       selection2.html("");
65522       var messagewrap = selection2.append("div").attr("class", "header fillL");
65523       var message = messagewrap.append("h2").call(_t.append("inspector.choose"));
65524       var direction = _mainLocalizer.textDirection() === "rtl" ? "backward" : "forward";
65525       messagewrap.append("button").attr("class", "preset-choose").attr("title", _entityIDs.length === 1 ? _t("inspector.edit") : _t("inspector.edit_features")).on("click", function() {
65526         dispatch10.call("cancel", this);
65527       }).call(svgIcon(`#iD-icon-${direction}`));
65528       function initialKeydown(d3_event) {
65529         if (search.property("value").length === 0 && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) {
65530           d3_event.preventDefault();
65531           d3_event.stopPropagation();
65532           operationDelete(context, _entityIDs)();
65533         } else if (search.property("value").length === 0 && (d3_event.ctrlKey || d3_event.metaKey) && d3_event.keyCode === utilKeybinding.keyCodes.z) {
65534           d3_event.preventDefault();
65535           d3_event.stopPropagation();
65536           context.undo();
65537         } else if (!d3_event.ctrlKey && !d3_event.metaKey) {
65538           select_default2(this).on("keydown", keydown);
65539           keydown.call(this, d3_event);
65540         }
65541       }
65542       function keydown(d3_event) {
65543         if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"] && // if insertion point is at the end of the string
65544         search.node().selectionStart === search.property("value").length) {
65545           d3_event.preventDefault();
65546           d3_event.stopPropagation();
65547           var buttons = list.selectAll(".preset-list-button");
65548           if (!buttons.empty())
65549             buttons.nodes()[0].focus();
65550         }
65551       }
65552       function keypress(d3_event) {
65553         var value = search.property("value");
65554         if (d3_event.keyCode === 13 && // ↩ Return
65555         value.length) {
65556           list.selectAll(".preset-list-item:first-child").each(function(d) {
65557             d.choose.call(this);
65558           });
65559         }
65560       }
65561       function inputevent() {
65562         var value = search.property("value");
65563         list.classed("filtered", value.length);
65564         var results, messageText;
65565         if (value.length) {
65566           results = presets.search(value, entityGeometries()[0], _currLoc);
65567           messageText = _t.html("inspector.results", {
65568             n: results.collection.length,
65569             search: value
65570           });
65571         } else {
65572           var entityPresets2 = _entityIDs.map((entityID) => _mainPresetIndex.match(context.graph().entity(entityID), context.graph()));
65573           results = _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc, entityPresets2);
65574           messageText = _t.html("inspector.choose");
65575         }
65576         list.call(drawList, results);
65577         message.html(messageText);
65578       }
65579       var searchWrap = selection2.append("div").attr("class", "search-header");
65580       searchWrap.call(svgIcon("#iD-icon-search", "pre-text"));
65581       var search = searchWrap.append("input").attr("class", "preset-search-input").attr("placeholder", _t("inspector.search")).attr("type", "search").call(utilNoAuto).on("keydown", initialKeydown).on("keypress", keypress).on("input", debounce_default(inputevent));
65582       if (_autofocus) {
65583         search.node().focus();
65584         setTimeout(function() {
65585           search.node().focus();
65586         }, 0);
65587       }
65588       var listWrap = selection2.append("div").attr("class", "inspector-body");
65589       var entityPresets = _entityIDs.map((entityID) => _mainPresetIndex.match(context.graph().entity(entityID), context.graph()));
65590       var list = listWrap.append("div").attr("class", "preset-list").call(drawList, _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc, entityPresets));
65591       context.features().on("change.preset-list", updateForFeatureHiddenState);
65592     }
65593     function drawList(list, presets) {
65594       presets = presets.matchAllGeometry(entityGeometries());
65595       var collection = presets.collection.reduce(function(collection2, preset) {
65596         if (!preset)
65597           return collection2;
65598         if (preset.members) {
65599           if (preset.members.collection.filter(function(preset2) {
65600             return preset2.addable();
65601           }).length > 1) {
65602             collection2.push(CategoryItem(preset));
65603           }
65604         } else if (preset.addable()) {
65605           collection2.push(PresetItem(preset));
65606         }
65607         return collection2;
65608       }, []);
65609       var items = list.selectAll(".preset-list-item").data(collection, function(d) {
65610         return d.preset.id;
65611       });
65612       items.order();
65613       items.exit().remove();
65614       items.enter().append("div").attr("class", function(item) {
65615         return "preset-list-item preset-" + item.preset.id.replace("/", "-");
65616       }).classed("current", function(item) {
65617         return _currentPresets.indexOf(item.preset) !== -1;
65618       }).each(function(item) {
65619         select_default2(this).call(item);
65620       }).style("opacity", 0).transition().style("opacity", 1);
65621       updateForFeatureHiddenState();
65622     }
65623     function itemKeydown(d3_event) {
65624       var item = select_default2(this.closest(".preset-list-item"));
65625       var parentItem = select_default2(item.node().parentNode.closest(".preset-list-item"));
65626       if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"]) {
65627         d3_event.preventDefault();
65628         d3_event.stopPropagation();
65629         var nextItem = select_default2(item.node().nextElementSibling);
65630         if (nextItem.empty()) {
65631           if (!parentItem.empty()) {
65632             nextItem = select_default2(parentItem.node().nextElementSibling);
65633           }
65634         } else if (select_default2(this).classed("expanded")) {
65635           nextItem = item.select(".subgrid .preset-list-item:first-child");
65636         }
65637         if (!nextItem.empty()) {
65638           nextItem.select(".preset-list-button").node().focus();
65639         }
65640       } else if (d3_event.keyCode === utilKeybinding.keyCodes["\u2191"]) {
65641         d3_event.preventDefault();
65642         d3_event.stopPropagation();
65643         var previousItem = select_default2(item.node().previousElementSibling);
65644         if (previousItem.empty()) {
65645           if (!parentItem.empty()) {
65646             previousItem = parentItem;
65647           }
65648         } else if (previousItem.select(".preset-list-button").classed("expanded")) {
65649           previousItem = previousItem.select(".subgrid .preset-list-item:last-child");
65650         }
65651         if (!previousItem.empty()) {
65652           previousItem.select(".preset-list-button").node().focus();
65653         } else {
65654           var search = select_default2(this.closest(".preset-list-pane")).select(".preset-search-input");
65655           search.node().focus();
65656         }
65657       } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2192" : "\u2190"]) {
65658         d3_event.preventDefault();
65659         d3_event.stopPropagation();
65660         if (!parentItem.empty()) {
65661           parentItem.select(".preset-list-button").node().focus();
65662         }
65663       } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2190" : "\u2192"]) {
65664         d3_event.preventDefault();
65665         d3_event.stopPropagation();
65666         item.datum().choose.call(select_default2(this).node());
65667       }
65668     }
65669     function CategoryItem(preset) {
65670       var box, sublist, shown = false;
65671       function item(selection2) {
65672         var wrap2 = selection2.append("div").attr("class", "preset-list-button-wrap category");
65673         function click() {
65674           var isExpanded = select_default2(this).classed("expanded");
65675           var iconName = isExpanded ? _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward" : "#iD-icon-down";
65676           select_default2(this).classed("expanded", !isExpanded).attr("title", !isExpanded ? _t("icons.collapse") : _t("icons.expand"));
65677           select_default2(this).selectAll("div.label-inner svg.icon use").attr("href", iconName);
65678           item.choose();
65679         }
65680         var geometries = entityGeometries();
65681         var button = wrap2.append("button").attr("class", "preset-list-button").attr("title", _t("icons.expand")).classed("expanded", false).call(uiPresetIcon().geometry(geometries.length === 1 && geometries[0]).preset(preset)).on("click", click).on("keydown", function(d3_event) {
65682           if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2190" : "\u2192"]) {
65683             d3_event.preventDefault();
65684             d3_event.stopPropagation();
65685             if (!select_default2(this).classed("expanded")) {
65686               click.call(this, d3_event);
65687             }
65688           } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2192" : "\u2190"]) {
65689             d3_event.preventDefault();
65690             d3_event.stopPropagation();
65691             if (select_default2(this).classed("expanded")) {
65692               click.call(this, d3_event);
65693             }
65694           } else {
65695             itemKeydown.call(this, d3_event);
65696           }
65697         });
65698         var label = button.append("div").attr("class", "label").append("div").attr("class", "label-inner");
65699         label.append("div").attr("class", "namepart").call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward", "inline")).append("span").call(preset.nameLabel()).append("span").text("\u2026");
65700         box = selection2.append("div").attr("class", "subgrid").style("max-height", "0px").style("opacity", 0);
65701         box.append("div").attr("class", "arrow");
65702         sublist = box.append("div").attr("class", "preset-list fillL3");
65703       }
65704       item.choose = function() {
65705         if (!box || !sublist)
65706           return;
65707         if (shown) {
65708           shown = false;
65709           box.transition().duration(200).style("opacity", "0").style("max-height", "0px").style("padding-bottom", "0px");
65710         } else {
65711           shown = true;
65712           var members = preset.members.matchAllGeometry(entityGeometries());
65713           sublist.call(drawList, members);
65714           box.transition().duration(200).style("opacity", "1").style("max-height", 200 + members.collection.length * 190 + "px").style("padding-bottom", "10px");
65715         }
65716       };
65717       item.preset = preset;
65718       return item;
65719     }
65720     function PresetItem(preset) {
65721       function item(selection2) {
65722         var wrap2 = selection2.append("div").attr("class", "preset-list-button-wrap");
65723         var geometries = entityGeometries();
65724         var button = wrap2.append("button").attr("class", "preset-list-button").call(uiPresetIcon().geometry(geometries.length === 1 && geometries[0]).preset(preset)).on("click", item.choose).on("keydown", itemKeydown);
65725         var label = button.append("div").attr("class", "label").append("div").attr("class", "label-inner");
65726         var nameparts = [
65727           preset.nameLabel(),
65728           preset.subtitleLabel()
65729         ].filter(Boolean);
65730         label.selectAll(".namepart").data(nameparts, (d) => d.stringId).enter().append("div").attr("class", "namepart").text("").each(function(d) {
65731           d(select_default2(this));
65732         });
65733         wrap2.call(item.reference.button);
65734         selection2.call(item.reference.body);
65735       }
65736       item.choose = function() {
65737         if (select_default2(this).classed("disabled"))
65738           return;
65739         if (!context.inIntro()) {
65740           _mainPresetIndex.setMostRecent(preset, entityGeometries()[0]);
65741         }
65742         context.perform(
65743           function(graph) {
65744             for (var i2 in _entityIDs) {
65745               var entityID = _entityIDs[i2];
65746               var oldPreset = _mainPresetIndex.match(graph.entity(entityID), graph);
65747               graph = actionChangePreset(entityID, oldPreset, preset)(graph);
65748             }
65749             return graph;
65750           },
65751           _t("operations.change_tags.annotation")
65752         );
65753         context.validator().validate();
65754         dispatch10.call("choose", this, preset);
65755       };
65756       item.help = function(d3_event) {
65757         d3_event.stopPropagation();
65758         item.reference.toggle();
65759       };
65760       item.preset = preset;
65761       item.reference = uiTagReference(preset.reference(), context);
65762       return item;
65763     }
65764     function updateForFeatureHiddenState() {
65765       if (!_entityIDs.every(context.hasEntity))
65766         return;
65767       var geometries = entityGeometries();
65768       var button = context.container().selectAll(".preset-list .preset-list-button");
65769       button.call(uiTooltip().destroyAny);
65770       button.each(function(item, index) {
65771         var hiddenPresetFeaturesId;
65772         for (var i2 in geometries) {
65773           hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i2]);
65774           if (hiddenPresetFeaturesId)
65775             break;
65776         }
65777         var isHiddenPreset = !context.inIntro() && !!hiddenPresetFeaturesId && (_currentPresets.length !== 1 || item.preset !== _currentPresets[0]);
65778         select_default2(this).classed("disabled", isHiddenPreset);
65779         if (isHiddenPreset) {
65780           var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
65781           select_default2(this).call(
65782             uiTooltip().title(() => _t.append("inspector.hidden_preset." + (isAutoHidden ? "zoom" : "manual"), {
65783               features: _t("feature." + hiddenPresetFeaturesId + ".description")
65784             })).placement(index < 2 ? "bottom" : "top")
65785           );
65786         }
65787       });
65788     }
65789     presetList.autofocus = function(val) {
65790       if (!arguments.length)
65791         return _autofocus;
65792       _autofocus = val;
65793       return presetList;
65794     };
65795     presetList.entityIDs = function(val) {
65796       if (!arguments.length)
65797         return _entityIDs;
65798       _entityIDs = val;
65799       _currLoc = null;
65800       if (_entityIDs && _entityIDs.length) {
65801         const extent = _entityIDs.reduce(function(extent2, entityID) {
65802           var entity = context.graph().entity(entityID);
65803           return extent2.extend(entity.extent(context.graph()));
65804         }, geoExtent());
65805         _currLoc = extent.center();
65806         var presets = _entityIDs.map(function(entityID) {
65807           return _mainPresetIndex.match(context.entity(entityID), context.graph());
65808         });
65809         presetList.presets(presets);
65810       }
65811       return presetList;
65812     };
65813     presetList.presets = function(val) {
65814       if (!arguments.length)
65815         return _currentPresets;
65816       _currentPresets = val;
65817       return presetList;
65818     };
65819     function entityGeometries() {
65820       var counts = {};
65821       for (var i2 in _entityIDs) {
65822         var entityID = _entityIDs[i2];
65823         var entity = context.entity(entityID);
65824         var geometry = entity.geometry(context.graph());
65825         if (geometry === "vertex" && entity.isOnAddressLine(context.graph())) {
65826           geometry = "point";
65827         }
65828         if (!counts[geometry])
65829           counts[geometry] = 0;
65830         counts[geometry] += 1;
65831       }
65832       return Object.keys(counts).sort(function(geom1, geom2) {
65833         return counts[geom2] - counts[geom1];
65834       });
65835     }
65836     return utilRebind(presetList, dispatch10, "on");
65837   }
65838
65839   // modules/ui/view_on_osm.js
65840   function uiViewOnOSM(context) {
65841     var _what;
65842     function viewOnOSM(selection2) {
65843       var url;
65844       if (_what instanceof osmEntity) {
65845         url = context.connection().entityURL(_what);
65846       } else if (_what instanceof osmNote) {
65847         url = context.connection().noteURL(_what);
65848       }
65849       var data = !_what || _what.isNew() ? [] : [_what];
65850       var link2 = selection2.selectAll(".view-on-osm").data(data, function(d) {
65851         return d.id;
65852       });
65853       link2.exit().remove();
65854       var linkEnter = link2.enter().append("a").attr("class", "view-on-osm").attr("target", "_blank").attr("href", url).call(svgIcon("#iD-icon-out-link", "inline"));
65855       linkEnter.append("span").call(_t.append("inspector.view_on_osm"));
65856     }
65857     viewOnOSM.what = function(_) {
65858       if (!arguments.length)
65859         return _what;
65860       _what = _;
65861       return viewOnOSM;
65862     };
65863     return viewOnOSM;
65864   }
65865
65866   // modules/ui/inspector.js
65867   function uiInspector(context) {
65868     var presetList = uiPresetList(context);
65869     var entityEditor = uiEntityEditor(context);
65870     var wrap2 = select_default2(null), presetPane = select_default2(null), editorPane = select_default2(null);
65871     var _state = "select";
65872     var _entityIDs;
65873     var _newFeature = false;
65874     function inspector(selection2) {
65875       presetList.entityIDs(_entityIDs).autofocus(_newFeature).on("choose", inspector.setPreset).on("cancel", function() {
65876         inspector.setPreset();
65877       });
65878       entityEditor.state(_state).entityIDs(_entityIDs).on("choose", inspector.showList);
65879       wrap2 = selection2.selectAll(".panewrap").data([0]);
65880       var enter = wrap2.enter().append("div").attr("class", "panewrap");
65881       enter.append("div").attr("class", "preset-list-pane pane");
65882       enter.append("div").attr("class", "entity-editor-pane pane");
65883       wrap2 = wrap2.merge(enter);
65884       presetPane = wrap2.selectAll(".preset-list-pane");
65885       editorPane = wrap2.selectAll(".entity-editor-pane");
65886       function shouldDefaultToPresetList() {
65887         if (_state !== "select")
65888           return false;
65889         if (_entityIDs.length !== 1)
65890           return false;
65891         var entityID = _entityIDs[0];
65892         var entity = context.hasEntity(entityID);
65893         if (!entity)
65894           return false;
65895         if (entity.hasNonGeometryTags())
65896           return false;
65897         if (_newFeature)
65898           return true;
65899         if (entity.geometry(context.graph()) !== "vertex")
65900           return false;
65901         if (context.graph().parentRelations(entity).length)
65902           return false;
65903         if (context.validator().getEntityIssues(entityID).length)
65904           return false;
65905         if (entity.isHighwayIntersection(context.graph()))
65906           return false;
65907         return true;
65908       }
65909       if (shouldDefaultToPresetList()) {
65910         wrap2.style("right", "-100%");
65911         editorPane.classed("hide", true);
65912         presetPane.classed("hide", false).call(presetList);
65913       } else {
65914         wrap2.style("right", "0%");
65915         presetPane.classed("hide", true);
65916         editorPane.classed("hide", false).call(entityEditor);
65917       }
65918       var footer = selection2.selectAll(".footer").data([0]);
65919       footer = footer.enter().append("div").attr("class", "footer").merge(footer);
65920       footer.call(
65921         uiViewOnOSM(context).what(context.hasEntity(_entityIDs.length === 1 && _entityIDs[0]))
65922       );
65923     }
65924     inspector.showList = function(presets) {
65925       presetPane.classed("hide", false);
65926       wrap2.transition().styleTween("right", function() {
65927         return value_default("0%", "-100%");
65928       }).on("end", function() {
65929         editorPane.classed("hide", true);
65930       });
65931       if (presets) {
65932         presetList.presets(presets);
65933       }
65934       presetPane.call(presetList.autofocus(true));
65935     };
65936     inspector.setPreset = function(preset) {
65937       if (preset && preset.id === "type/multipolygon") {
65938         presetPane.call(presetList.autofocus(true));
65939       } else {
65940         editorPane.classed("hide", false);
65941         wrap2.transition().styleTween("right", function() {
65942           return value_default("-100%", "0%");
65943         }).on("end", function() {
65944           presetPane.classed("hide", true);
65945         });
65946         if (preset) {
65947           entityEditor.presets([preset]);
65948         }
65949         editorPane.call(entityEditor);
65950       }
65951     };
65952     inspector.state = function(val) {
65953       if (!arguments.length)
65954         return _state;
65955       _state = val;
65956       entityEditor.state(_state);
65957       context.container().selectAll(".field-help-body").remove();
65958       return inspector;
65959     };
65960     inspector.entityIDs = function(val) {
65961       if (!arguments.length)
65962         return _entityIDs;
65963       _entityIDs = val;
65964       return inspector;
65965     };
65966     inspector.newFeature = function(val) {
65967       if (!arguments.length)
65968         return _newFeature;
65969       _newFeature = val;
65970       return inspector;
65971     };
65972     return inspector;
65973   }
65974
65975   // modules/ui/keepRight_details.js
65976   function uiKeepRightDetails(context) {
65977     let _qaItem;
65978     function issueDetail(d) {
65979       const { itemType, parentIssueType } = d;
65980       const unknown = { html: _t.html("inspector.unknown") };
65981       let replacements = d.replacements || {};
65982       replacements.default = unknown;
65983       if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) {
65984         return _t.html(`QA.keepRight.errorTypes.${itemType}.description`, replacements);
65985       } else {
65986         return _t.html(`QA.keepRight.errorTypes.${parentIssueType}.description`, replacements);
65987       }
65988     }
65989     function keepRightDetails(selection2) {
65990       const details = selection2.selectAll(".error-details").data(
65991         _qaItem ? [_qaItem] : [],
65992         (d) => `${d.id}-${d.status || 0}`
65993       );
65994       details.exit().remove();
65995       const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
65996       const descriptionEnter = detailsEnter.append("div").attr("class", "qa-details-subsection");
65997       descriptionEnter.append("h4").call(_t.append("QA.keepRight.detail_description"));
65998       descriptionEnter.append("div").attr("class", "qa-details-description-text").html(issueDetail);
65999       let relatedEntities = [];
66000       descriptionEnter.selectAll(".error_entity_link, .error_object_link").attr("href", "#").each(function() {
66001         const link2 = select_default2(this);
66002         const isObjectLink = link2.classed("error_object_link");
66003         const entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
66004         const entity = context.hasEntity(entityID);
66005         relatedEntities.push(entityID);
66006         link2.on("mouseenter", () => {
66007           utilHighlightEntities([entityID], true, context);
66008         }).on("mouseleave", () => {
66009           utilHighlightEntities([entityID], false, context);
66010         }).on("click", (d3_event) => {
66011           d3_event.preventDefault();
66012           utilHighlightEntities([entityID], false, context);
66013           const osmlayer = context.layers().layer("osm");
66014           if (!osmlayer.enabled()) {
66015             osmlayer.enabled(true);
66016           }
66017           context.map().centerZoomEase(_qaItem.loc, 20);
66018           if (entity) {
66019             context.enter(modeSelect(context, [entityID]));
66020           } else {
66021             context.loadEntity(entityID, (err, result) => {
66022               if (err)
66023                 return;
66024               const entity2 = result.data.find((e) => e.id === entityID);
66025               if (entity2)
66026                 context.enter(modeSelect(context, [entityID]));
66027             });
66028           }
66029         });
66030         if (entity) {
66031           let name = utilDisplayName(entity);
66032           if (!name && !isObjectLink) {
66033             const preset = _mainPresetIndex.match(entity, context.graph());
66034             name = preset && !preset.isFallback() && preset.name();
66035           }
66036           if (name) {
66037             this.innerText = name;
66038           }
66039         }
66040       });
66041       context.features().forceVisible(relatedEntities);
66042       context.map().pan([0, 0]);
66043     }
66044     keepRightDetails.issue = function(val) {
66045       if (!arguments.length)
66046         return _qaItem;
66047       _qaItem = val;
66048       return keepRightDetails;
66049     };
66050     return keepRightDetails;
66051   }
66052
66053   // modules/ui/keepRight_header.js
66054   function uiKeepRightHeader() {
66055     let _qaItem;
66056     function issueTitle(d) {
66057       const { itemType, parentIssueType } = d;
66058       const unknown = _t.html("inspector.unknown");
66059       let replacements = d.replacements || {};
66060       replacements.default = { html: unknown };
66061       if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) {
66062         return _t.html(`QA.keepRight.errorTypes.${itemType}.title`, replacements);
66063       } else {
66064         return _t.html(`QA.keepRight.errorTypes.${parentIssueType}.title`, replacements);
66065       }
66066     }
66067     function keepRightHeader(selection2) {
66068       const header = selection2.selectAll(".qa-header").data(
66069         _qaItem ? [_qaItem] : [],
66070         (d) => `${d.id}-${d.status || 0}`
66071       );
66072       header.exit().remove();
66073       const headerEnter = header.enter().append("div").attr("class", "qa-header");
66074       const iconEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0);
66075       iconEnter.append("div").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`).call(svgIcon("#iD-icon-bolt", "qaItem-fill"));
66076       headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle);
66077     }
66078     keepRightHeader.issue = function(val) {
66079       if (!arguments.length)
66080         return _qaItem;
66081       _qaItem = val;
66082       return keepRightHeader;
66083     };
66084     return keepRightHeader;
66085   }
66086
66087   // modules/ui/view_on_keepRight.js
66088   function uiViewOnKeepRight() {
66089     let _qaItem;
66090     function viewOnKeepRight(selection2) {
66091       let url;
66092       if (services.keepRight && _qaItem instanceof QAItem) {
66093         url = services.keepRight.issueURL(_qaItem);
66094       }
66095       const link2 = selection2.selectAll(".view-on-keepRight").data(url ? [url] : []);
66096       link2.exit().remove();
66097       const linkEnter = link2.enter().append("a").attr("class", "view-on-keepRight").attr("target", "_blank").attr("rel", "noopener").attr("href", (d) => d).call(svgIcon("#iD-icon-out-link", "inline"));
66098       linkEnter.append("span").call(_t.append("inspector.view_on_keepRight"));
66099     }
66100     viewOnKeepRight.what = function(val) {
66101       if (!arguments.length)
66102         return _qaItem;
66103       _qaItem = val;
66104       return viewOnKeepRight;
66105     };
66106     return viewOnKeepRight;
66107   }
66108
66109   // modules/ui/keepRight_editor.js
66110   function uiKeepRightEditor(context) {
66111     const dispatch10 = dispatch_default("change");
66112     const qaDetails = uiKeepRightDetails(context);
66113     const qaHeader = uiKeepRightHeader(context);
66114     let _qaItem;
66115     function keepRightEditor(selection2) {
66116       const headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
66117       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
66118       headerEnter.append("h2").call(_t.append("QA.keepRight.title"));
66119       let body = selection2.selectAll(".body").data([0]);
66120       body = body.enter().append("div").attr("class", "body").merge(body);
66121       const editor = body.selectAll(".qa-editor").data([0]);
66122       editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(keepRightSaveSection);
66123       const footer = selection2.selectAll(".footer").data([0]);
66124       footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnKeepRight(context).what(_qaItem));
66125     }
66126     function keepRightSaveSection(selection2) {
66127       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
66128       const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
66129       let saveSection = selection2.selectAll(".qa-save").data(
66130         isShown ? [_qaItem] : [],
66131         (d) => `${d.id}-${d.status || 0}`
66132       );
66133       saveSection.exit().remove();
66134       const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
66135       saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("QA.keepRight.comment"));
66136       saveSectionEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("QA.keepRight.comment_placeholder")).attr("maxlength", 1e3).property("value", (d) => d.newComment || d.comment).call(utilNoAuto).on("input", changeInput).on("blur", changeInput);
66137       saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
66138       function changeInput() {
66139         const input = select_default2(this);
66140         let val = input.property("value").trim();
66141         if (val === _qaItem.comment) {
66142           val = void 0;
66143         }
66144         _qaItem = _qaItem.update({ newComment: val });
66145         const qaService = services.keepRight;
66146         if (qaService) {
66147           qaService.replaceItem(_qaItem);
66148         }
66149         saveSection.call(qaSaveButtons);
66150       }
66151     }
66152     function qaSaveButtons(selection2) {
66153       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
66154       let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
66155       buttonSection.exit().remove();
66156       const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
66157       buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment"));
66158       buttonEnter.append("button").attr("class", "button close-button action");
66159       buttonEnter.append("button").attr("class", "button ignore-button action");
66160       buttonSection = buttonSection.merge(buttonEnter);
66161       buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) {
66162         this.blur();
66163         const qaService = services.keepRight;
66164         if (qaService) {
66165           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66166         }
66167       });
66168       buttonSection.select(".close-button").html((d) => {
66169         const andComment = d.newComment ? "_comment" : "";
66170         return _t.html(`QA.keepRight.close${andComment}`);
66171       }).on("click.close", function(d3_event, d) {
66172         this.blur();
66173         const qaService = services.keepRight;
66174         if (qaService) {
66175           d.newStatus = "ignore_t";
66176           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66177         }
66178       });
66179       buttonSection.select(".ignore-button").html((d) => {
66180         const andComment = d.newComment ? "_comment" : "";
66181         return _t.html(`QA.keepRight.ignore${andComment}`);
66182       }).on("click.ignore", function(d3_event, d) {
66183         this.blur();
66184         const qaService = services.keepRight;
66185         if (qaService) {
66186           d.newStatus = "ignore";
66187           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66188         }
66189       });
66190     }
66191     keepRightEditor.error = function(val) {
66192       if (!arguments.length)
66193         return _qaItem;
66194       _qaItem = val;
66195       return keepRightEditor;
66196     };
66197     return utilRebind(keepRightEditor, dispatch10, "on");
66198   }
66199
66200   // modules/ui/lasso.js
66201   function uiLasso(context) {
66202     var group, polygon2;
66203     lasso.coordinates = [];
66204     function lasso(selection2) {
66205       context.container().classed("lasso", true);
66206       group = selection2.append("g").attr("class", "lasso hide");
66207       polygon2 = group.append("path").attr("class", "lasso-path");
66208       group.call(uiToggle(true));
66209     }
66210     function draw() {
66211       if (polygon2) {
66212         polygon2.data([lasso.coordinates]).attr("d", function(d) {
66213           return "M" + d.join(" L") + " Z";
66214         });
66215       }
66216     }
66217     lasso.extent = function() {
66218       return lasso.coordinates.reduce(function(extent, point2) {
66219         return extent.extend(geoExtent(point2));
66220       }, geoExtent());
66221     };
66222     lasso.p = function(_) {
66223       if (!arguments.length)
66224         return lasso;
66225       lasso.coordinates.push(_);
66226       draw();
66227       return lasso;
66228     };
66229     lasso.close = function() {
66230       if (group) {
66231         group.call(uiToggle(false, function() {
66232           select_default2(this).remove();
66233         }));
66234       }
66235       context.container().classed("lasso", false);
66236     };
66237     return lasso;
66238   }
66239
66240   // modules/ui/note_comments.js
66241   function uiNoteComments() {
66242     var _note;
66243     function noteComments(selection2) {
66244       if (_note.isNew())
66245         return;
66246       var comments = selection2.selectAll(".comments-container").data([0]);
66247       comments = comments.enter().append("div").attr("class", "comments-container").merge(comments);
66248       var commentEnter = comments.selectAll(".comment").data(_note.comments).enter().append("div").attr("class", "comment");
66249       commentEnter.append("div").attr("class", function(d) {
66250         return "comment-avatar user-" + d.uid;
66251       }).call(svgIcon("#iD-icon-avatar", "comment-avatar-icon"));
66252       var mainEnter = commentEnter.append("div").attr("class", "comment-main");
66253       var metadataEnter = mainEnter.append("div").attr("class", "comment-metadata");
66254       metadataEnter.append("div").attr("class", "comment-author").each(function(d) {
66255         var selection3 = select_default2(this);
66256         var osm = services.osm;
66257         if (osm && d.user) {
66258           selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d.user)).attr("target", "_blank");
66259         }
66260         if (d.user) {
66261           selection3.text(d.user);
66262         } else {
66263           selection3.call(_t.append("note.anonymous"));
66264         }
66265       });
66266       metadataEnter.append("div").attr("class", "comment-date").html(function(d) {
66267         return _t.html("note.status." + d.action, { when: localeDateString2(d.date) });
66268       });
66269       mainEnter.append("div").attr("class", "comment-text").html(function(d) {
66270         return d.html;
66271       }).selectAll("a").attr("rel", "noopener nofollow").attr("target", "_blank");
66272       comments.call(replaceAvatars);
66273     }
66274     function replaceAvatars(selection2) {
66275       var showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true";
66276       var osm = services.osm;
66277       if (showThirdPartyIcons !== "true" || !osm)
66278         return;
66279       var uids = {};
66280       _note.comments.forEach(function(d) {
66281         if (d.uid)
66282           uids[d.uid] = true;
66283       });
66284       Object.keys(uids).forEach(function(uid) {
66285         osm.loadUser(uid, function(err, user) {
66286           if (!user || !user.image_url)
66287             return;
66288           selection2.selectAll(".comment-avatar.user-" + uid).html("").append("img").attr("class", "icon comment-avatar-icon").attr("src", user.image_url).attr("alt", user.display_name);
66289         });
66290       });
66291     }
66292     function localeDateString2(s) {
66293       if (!s)
66294         return null;
66295       var options2 = { day: "numeric", month: "short", year: "numeric" };
66296       s = s.replace(/-/g, "/");
66297       var d = new Date(s);
66298       if (isNaN(d.getTime()))
66299         return null;
66300       return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
66301     }
66302     noteComments.note = function(val) {
66303       if (!arguments.length)
66304         return _note;
66305       _note = val;
66306       return noteComments;
66307     };
66308     return noteComments;
66309   }
66310
66311   // modules/ui/note_header.js
66312   function uiNoteHeader() {
66313     var _note;
66314     function noteHeader(selection2) {
66315       var header = selection2.selectAll(".note-header").data(
66316         _note ? [_note] : [],
66317         function(d) {
66318           return d.status + d.id;
66319         }
66320       );
66321       header.exit().remove();
66322       var headerEnter = header.enter().append("div").attr("class", "note-header");
66323       var iconEnter = headerEnter.append("div").attr("class", function(d) {
66324         return "note-header-icon " + d.status;
66325       }).classed("new", function(d) {
66326         return d.id < 0;
66327       });
66328       iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-note", "note-fill"));
66329       iconEnter.each(function(d) {
66330         var statusIcon;
66331         if (d.id < 0) {
66332           statusIcon = "#iD-icon-plus";
66333         } else if (d.status === "open") {
66334           statusIcon = "#iD-icon-close";
66335         } else {
66336           statusIcon = "#iD-icon-apply";
66337         }
66338         iconEnter.append("div").attr("class", "note-icon-annotation").attr("title", _t("icons.close")).call(svgIcon(statusIcon, "icon-annotation"));
66339       });
66340       headerEnter.append("div").attr("class", "note-header-label").html(function(d) {
66341         if (_note.isNew()) {
66342           return _t.html("note.new");
66343         }
66344         return _t.html("note.note") + " " + d.id + " " + (d.status === "closed" ? _t.html("note.closed") : "");
66345       });
66346     }
66347     noteHeader.note = function(val) {
66348       if (!arguments.length)
66349         return _note;
66350       _note = val;
66351       return noteHeader;
66352     };
66353     return noteHeader;
66354   }
66355
66356   // modules/ui/note_report.js
66357   function uiNoteReport() {
66358     var _note;
66359     function noteReport(selection2) {
66360       var url;
66361       if (services.osm && _note instanceof osmNote && !_note.isNew()) {
66362         url = services.osm.noteReportURL(_note);
66363       }
66364       var link2 = selection2.selectAll(".note-report").data(url ? [url] : []);
66365       link2.exit().remove();
66366       var linkEnter = link2.enter().append("a").attr("class", "note-report").attr("target", "_blank").attr("href", function(d) {
66367         return d;
66368       }).call(svgIcon("#iD-icon-out-link", "inline"));
66369       linkEnter.append("span").call(_t.append("note.report"));
66370     }
66371     noteReport.note = function(val) {
66372       if (!arguments.length)
66373         return _note;
66374       _note = val;
66375       return noteReport;
66376     };
66377     return noteReport;
66378   }
66379
66380   // modules/ui/note_editor.js
66381   function uiNoteEditor(context) {
66382     var dispatch10 = dispatch_default("change");
66383     var noteComments = uiNoteComments(context);
66384     var noteHeader = uiNoteHeader();
66385     var _note;
66386     var _newNote;
66387     function noteEditor(selection2) {
66388       var header = selection2.selectAll(".header").data([0]);
66389       var headerEnter = header.enter().append("div").attr("class", "header fillL");
66390       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
66391         context.enter(modeBrowse(context));
66392       }).call(svgIcon("#iD-icon-close"));
66393       headerEnter.append("h2").call(_t.append("note.title"));
66394       var body = selection2.selectAll(".body").data([0]);
66395       body = body.enter().append("div").attr("class", "body").merge(body);
66396       var editor = body.selectAll(".note-editor").data([0]);
66397       editor.enter().append("div").attr("class", "modal-section note-editor").merge(editor).call(noteHeader.note(_note)).call(noteComments.note(_note)).call(noteSaveSection);
66398       var footer = selection2.selectAll(".footer").data([0]);
66399       footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnOSM(context).what(_note)).call(uiNoteReport(context).note(_note));
66400       var osm = services.osm;
66401       if (osm) {
66402         osm.on("change.note-save", function() {
66403           selection2.call(noteEditor);
66404         });
66405       }
66406     }
66407     function noteSaveSection(selection2) {
66408       var isSelected = _note && _note.id === context.selectedNoteID();
66409       var noteSave = selection2.selectAll(".note-save").data(isSelected ? [_note] : [], function(d) {
66410         return d.status + d.id;
66411       });
66412       noteSave.exit().remove();
66413       var noteSaveEnter = noteSave.enter().append("div").attr("class", "note-save save-section cf");
66414       noteSaveEnter.append("h4").attr("class", ".note-save-header").html(function() {
66415         return _note.isNew() ? _t.html("note.newDescription") : _t.html("note.newComment");
66416       });
66417       var commentTextarea = noteSaveEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("note.inputPlaceholder")).attr("maxlength", 1e3).property("value", function(d) {
66418         return d.newComment;
66419       }).call(utilNoAuto).on("keydown.note-input", keydown).on("input.note-input", changeInput).on("blur.note-input", changeInput);
66420       if (!commentTextarea.empty() && _newNote) {
66421         commentTextarea.node().focus();
66422       }
66423       noteSave = noteSaveEnter.merge(noteSave).call(userDetails).call(noteSaveButtons);
66424       function keydown(d3_event) {
66425         if (!(d3_event.keyCode === 13 && // ↩ Return
66426         d3_event.metaKey))
66427           return;
66428         var osm = services.osm;
66429         if (!osm)
66430           return;
66431         var hasAuth = osm.authenticated();
66432         if (!hasAuth)
66433           return;
66434         if (!_note.newComment)
66435           return;
66436         d3_event.preventDefault();
66437         select_default2(this).on("keydown.note-input", null);
66438         window.setTimeout(function() {
66439           if (_note.isNew()) {
66440             noteSave.selectAll(".save-button").node().focus();
66441             clickSave(_note);
66442           } else {
66443             noteSave.selectAll(".comment-button").node().focus();
66444             clickComment(_note);
66445           }
66446         }, 10);
66447       }
66448       function changeInput() {
66449         var input = select_default2(this);
66450         var val = input.property("value").trim() || void 0;
66451         _note = _note.update({ newComment: val });
66452         var osm = services.osm;
66453         if (osm) {
66454           osm.replaceNote(_note);
66455         }
66456         noteSave.call(noteSaveButtons);
66457       }
66458     }
66459     function userDetails(selection2) {
66460       var detailSection = selection2.selectAll(".detail-section").data([0]);
66461       detailSection = detailSection.enter().append("div").attr("class", "detail-section").merge(detailSection);
66462       var osm = services.osm;
66463       if (!osm)
66464         return;
66465       var hasAuth = osm.authenticated();
66466       var authWarning = detailSection.selectAll(".auth-warning").data(hasAuth ? [] : [0]);
66467       authWarning.exit().transition().duration(200).style("opacity", 0).remove();
66468       var authEnter = authWarning.enter().insert("div", ".tag-reference-body").attr("class", "field-warning auth-warning").style("opacity", 0);
66469       authEnter.call(svgIcon("#iD-icon-alert", "inline"));
66470       authEnter.append("span").call(_t.append("note.login"));
66471       authEnter.append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("login")).on("click.note-login", function(d3_event) {
66472         d3_event.preventDefault();
66473         osm.authenticate();
66474       });
66475       authEnter.transition().duration(200).style("opacity", 1);
66476       var prose = detailSection.selectAll(".note-save-prose").data(hasAuth ? [0] : []);
66477       prose.exit().remove();
66478       prose = prose.enter().append("p").attr("class", "note-save-prose").call(_t.append("note.upload_explanation")).merge(prose);
66479       osm.userDetails(function(err, user) {
66480         if (err)
66481           return;
66482         var userLink = select_default2(document.createElement("div"));
66483         if (user.image_url) {
66484           userLink.append("img").attr("src", user.image_url).attr("class", "icon pre-text user-icon");
66485         }
66486         userLink.append("a").attr("class", "user-info").text(user.display_name).attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
66487         prose.html(_t.html("note.upload_explanation_with_user", { user: { html: userLink.html() } }));
66488       });
66489     }
66490     function noteSaveButtons(selection2) {
66491       var osm = services.osm;
66492       var hasAuth = osm && osm.authenticated();
66493       var isSelected = _note && _note.id === context.selectedNoteID();
66494       var buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_note] : [], function(d) {
66495         return d.status + d.id;
66496       });
66497       buttonSection.exit().remove();
66498       var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
66499       if (_note.isNew()) {
66500         buttonEnter.append("button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
66501         buttonEnter.append("button").attr("class", "button save-button action").call(_t.append("note.save"));
66502       } else {
66503         buttonEnter.append("button").attr("class", "button status-button action");
66504         buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("note.comment"));
66505       }
66506       buttonSection = buttonSection.merge(buttonEnter);
66507       buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
66508       buttonSection.select(".save-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
66509       buttonSection.select(".status-button").attr("disabled", hasAuth ? null : true).html(function(d) {
66510         var action = d.status === "open" ? "close" : "open";
66511         var andComment = d.newComment ? "_comment" : "";
66512         return _t.html("note." + action + andComment);
66513       }).on("click.status", clickStatus);
66514       buttonSection.select(".comment-button").attr("disabled", isSaveDisabled).on("click.comment", clickComment);
66515       function isSaveDisabled(d) {
66516         return hasAuth && d.status === "open" && d.newComment ? null : true;
66517       }
66518     }
66519     function clickCancel(d3_event, d) {
66520       this.blur();
66521       var osm = services.osm;
66522       if (osm) {
66523         osm.removeNote(d);
66524       }
66525       context.enter(modeBrowse(context));
66526       dispatch10.call("change");
66527     }
66528     function clickSave(d3_event, d) {
66529       this.blur();
66530       var osm = services.osm;
66531       if (osm) {
66532         osm.postNoteCreate(d, function(err, note) {
66533           dispatch10.call("change", note);
66534         });
66535       }
66536     }
66537     function clickStatus(d3_event, d) {
66538       this.blur();
66539       var osm = services.osm;
66540       if (osm) {
66541         var setStatus = d.status === "open" ? "closed" : "open";
66542         osm.postNoteUpdate(d, setStatus, function(err, note) {
66543           dispatch10.call("change", note);
66544         });
66545       }
66546     }
66547     function clickComment(d3_event, d) {
66548       this.blur();
66549       var osm = services.osm;
66550       if (osm) {
66551         osm.postNoteUpdate(d, d.status, function(err, note) {
66552           dispatch10.call("change", note);
66553         });
66554       }
66555     }
66556     noteEditor.note = function(val) {
66557       if (!arguments.length)
66558         return _note;
66559       _note = val;
66560       return noteEditor;
66561     };
66562     noteEditor.newNote = function(val) {
66563       if (!arguments.length)
66564         return _newNote;
66565       _newNote = val;
66566       return noteEditor;
66567     };
66568     return utilRebind(noteEditor, dispatch10, "on");
66569   }
66570
66571   // modules/ui/source_switch.js
66572   function uiSourceSwitch(context) {
66573     var keys;
66574     function click(d3_event) {
66575       d3_event.preventDefault();
66576       var osm = context.connection();
66577       if (!osm)
66578         return;
66579       if (context.inIntro())
66580         return;
66581       if (context.history().hasChanges() && !window.confirm(_t("source_switch.lose_changes")))
66582         return;
66583       var isLive = select_default2(this).classed("live");
66584       isLive = !isLive;
66585       context.enter(modeBrowse(context));
66586       context.history().clearSaved();
66587       context.flush();
66588       select_default2(this).html(isLive ? _t.html("source_switch.live") : _t.html("source_switch.dev")).classed("live", isLive).classed("chip", isLive);
66589       osm.switch(isLive ? keys[0] : keys[1]);
66590     }
66591     var sourceSwitch = function(selection2) {
66592       selection2.append("a").attr("href", "#").call(_t.append("source_switch.live")).attr("class", "live chip").on("click", click);
66593     };
66594     sourceSwitch.keys = function(_) {
66595       if (!arguments.length)
66596         return keys;
66597       keys = _;
66598       return sourceSwitch;
66599     };
66600     return sourceSwitch;
66601   }
66602
66603   // modules/ui/spinner.js
66604   function uiSpinner(context) {
66605     var osm = context.connection();
66606     return function(selection2) {
66607       var img = selection2.append("img").attr("src", context.imagePath("loader-black.gif")).style("opacity", 0);
66608       if (osm) {
66609         osm.on("loading.spinner", function() {
66610           img.transition().style("opacity", 1);
66611         }).on("loaded.spinner", function() {
66612           img.transition().style("opacity", 0);
66613         });
66614       }
66615     };
66616   }
66617
66618   // modules/ui/sections/privacy.js
66619   function uiSectionPrivacy(context) {
66620     let section = uiSection("preferences-third-party", context).label(() => _t.append("preferences.privacy.title")).disclosureContent(renderDisclosureContent);
66621     function renderDisclosureContent(selection2) {
66622       selection2.selectAll(".privacy-options-list").data([0]).enter().append("ul").attr("class", "layer-list privacy-options-list");
66623       let thirdPartyIconsEnter = selection2.select(".privacy-options-list").selectAll(".privacy-third-party-icons-item").data([corePreferences("preferences.privacy.thirdpartyicons") || "true"]).enter().append("li").attr("class", "privacy-third-party-icons-item").append("label").call(
66624         uiTooltip().title(() => _t.append("preferences.privacy.third_party_icons.tooltip")).placement("bottom")
66625       );
66626       thirdPartyIconsEnter.append("input").attr("type", "checkbox").on("change", (d3_event, d) => {
66627         d3_event.preventDefault();
66628         corePreferences("preferences.privacy.thirdpartyicons", d === "true" ? "false" : "true");
66629       });
66630       thirdPartyIconsEnter.append("span").call(_t.append("preferences.privacy.third_party_icons.description"));
66631       selection2.selectAll(".privacy-third-party-icons-item").classed("active", (d) => d === "true").select("input").property("checked", (d) => d === "true");
66632       selection2.selectAll(".privacy-link").data([0]).enter().append("div").attr("class", "privacy-link").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/openstreetmap/iD/blob/release/PRIVACY.md").append("span").call(_t.append("preferences.privacy.privacy_link"));
66633     }
66634     corePreferences.onChange("preferences.privacy.thirdpartyicons", section.reRender);
66635     return section;
66636   }
66637
66638   // modules/ui/splash.js
66639   function uiSplash(context) {
66640     return (selection2) => {
66641       if (context.history().hasRestorableChanges())
66642         return;
66643       let updateMessage = "";
66644       const sawPrivacyVersion = corePreferences("sawPrivacyVersion");
66645       let showSplash = !corePreferences("sawSplash");
66646       if (sawPrivacyVersion !== context.privacyVersion) {
66647         updateMessage = _t("splash.privacy_update");
66648         showSplash = true;
66649       }
66650       if (!showSplash)
66651         return;
66652       corePreferences("sawSplash", true);
66653       corePreferences("sawPrivacyVersion", context.privacyVersion);
66654       _mainFileFetcher.get("intro_graph");
66655       let modalSelection = uiModal(selection2);
66656       modalSelection.select(".modal").attr("class", "modal-splash modal");
66657       let introModal = modalSelection.select(".content").append("div").attr("class", "fillL");
66658       introModal.append("div").attr("class", "modal-section").append("h3").call(_t.append("splash.welcome"));
66659       let modalSection = introModal.append("div").attr("class", "modal-section");
66660       modalSection.append("p").html(_t.html("splash.text", {
66661         version: context.version,
66662         website: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/develop/CHANGELOG.md#whats-new">' + _t.html("splash.changelog") + "</a>" },
66663         github: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/issues">github.com</a>' }
66664       }));
66665       modalSection.append("p").html(_t.html("splash.privacy", {
66666         updateMessage,
66667         privacyLink: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/release/PRIVACY.md">' + _t("splash.privacy_policy") + "</a>" }
66668       }));
66669       uiSectionPrivacy(context).label(() => _t.append("splash.privacy_settings")).render(modalSection);
66670       let buttonWrap = introModal.append("div").attr("class", "modal-actions");
66671       let walkthrough = buttonWrap.append("button").attr("class", "walkthrough").on("click", () => {
66672         context.container().call(uiIntro(context));
66673         modalSelection.close();
66674       });
66675       walkthrough.append("svg").attr("class", "logo logo-walkthrough").append("use").attr("xlink:href", "#iD-logo-walkthrough");
66676       walkthrough.append("div").call(_t.append("splash.walkthrough"));
66677       let startEditing = buttonWrap.append("button").attr("class", "start-editing").on("click", modalSelection.close);
66678       startEditing.append("svg").attr("class", "logo logo-features").append("use").attr("xlink:href", "#iD-logo-features");
66679       startEditing.append("div").call(_t.append("splash.start"));
66680       modalSelection.select("button.close").attr("class", "hide");
66681     };
66682   }
66683
66684   // modules/ui/status.js
66685   function uiStatus(context) {
66686     var osm = context.connection();
66687     return function(selection2) {
66688       if (!osm)
66689         return;
66690       function update(err, apiStatus) {
66691         selection2.html("");
66692         if (err) {
66693           if (apiStatus === "connectionSwitched") {
66694             return;
66695           } else if (apiStatus === "rateLimited") {
66696             selection2.call(_t.append("osm_api_status.message.rateLimit")).append("a").attr("href", "#").attr("class", "api-status-login").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("login")).on("click.login", function(d3_event) {
66697               d3_event.preventDefault();
66698               osm.authenticate();
66699             });
66700           } else {
66701             var throttledRetry = throttle_default(function() {
66702               context.loadTiles(context.projection);
66703               osm.reloadApiStatus();
66704             }, 2e3);
66705             selection2.call(_t.append("osm_api_status.message.error", { suffix: " " })).append("a").attr("href", "#").call(_t.append("osm_api_status.retry")).on("click.retry", function(d3_event) {
66706               d3_event.preventDefault();
66707               throttledRetry();
66708             });
66709           }
66710         } else if (apiStatus === "readonly") {
66711           selection2.call(_t.append("osm_api_status.message.readonly"));
66712         } else if (apiStatus === "offline") {
66713           selection2.call(_t.append("osm_api_status.message.offline"));
66714         }
66715         selection2.attr("class", "api-status " + (err ? "error" : apiStatus));
66716       }
66717       osm.on("apiStatusChange.uiStatus", update);
66718       context.history().on("storage_error", () => {
66719         selection2.selectAll("span.local-storage-full").remove();
66720         selection2.append("span").attr("class", "local-storage-full").call(_t.append("osm_api_status.message.local_storage_full"));
66721         selection2.classed("error", true);
66722       });
66723       window.setInterval(function() {
66724         osm.reloadApiStatus();
66725       }, 9e4);
66726       osm.reloadApiStatus();
66727     };
66728   }
66729
66730   // node_modules/osm-community-index/lib/simplify.js
66731   var import_diacritics3 = __toESM(require_diacritics(), 1);
66732   function simplify2(str2) {
66733     if (typeof str2 !== "string")
66734       return "";
66735     return import_diacritics3.default.remove(
66736       str2.replace(/&/g, "and").replace(/İ/ig, "i").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\u200b-\u200f\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\ufeff\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g, "").toLowerCase()
66737     );
66738   }
66739
66740   // node_modules/osm-community-index/lib/resolve_strings.js
66741   function resolveStrings(item, defaults2, localizerFn) {
66742     let itemStrings = Object.assign({}, item.strings);
66743     let defaultStrings = Object.assign({}, defaults2[item.type]);
66744     const anyToken = new RegExp(/(\{\w+\})/, "gi");
66745     if (localizerFn) {
66746       if (itemStrings.community) {
66747         const communityID = simplify2(itemStrings.community);
66748         itemStrings.community = localizerFn(`_communities.${communityID}`);
66749       }
66750       ["name", "description", "extendedDescription"].forEach((prop) => {
66751         if (defaultStrings[prop])
66752           defaultStrings[prop] = localizerFn(`_defaults.${item.type}.${prop}`);
66753         if (itemStrings[prop])
66754           itemStrings[prop] = localizerFn(`${item.id}.${prop}`);
66755       });
66756     }
66757     let replacements = {
66758       account: item.account,
66759       community: itemStrings.community,
66760       signupUrl: itemStrings.signupUrl,
66761       url: itemStrings.url
66762     };
66763     if (!replacements.signupUrl) {
66764       replacements.signupUrl = resolve(itemStrings.signupUrl || defaultStrings.signupUrl);
66765     }
66766     if (!replacements.url) {
66767       replacements.url = resolve(itemStrings.url || defaultStrings.url);
66768     }
66769     let resolved = {
66770       name: resolve(itemStrings.name || defaultStrings.name),
66771       url: resolve(itemStrings.url || defaultStrings.url),
66772       signupUrl: resolve(itemStrings.signupUrl || defaultStrings.signupUrl),
66773       description: resolve(itemStrings.description || defaultStrings.description),
66774       extendedDescription: resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription)
66775     };
66776     resolved.nameHTML = linkify(resolved.url, resolved.name);
66777     resolved.urlHTML = linkify(resolved.url);
66778     resolved.signupUrlHTML = linkify(resolved.signupUrl);
66779     resolved.descriptionHTML = resolve(itemStrings.description || defaultStrings.description, true);
66780     resolved.extendedDescriptionHTML = resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription, true);
66781     return resolved;
66782     function resolve(s, addLinks) {
66783       if (!s)
66784         return void 0;
66785       let result = s;
66786       for (let key in replacements) {
66787         const token = `{${key}}`;
66788         const regex = new RegExp(token, "g");
66789         if (regex.test(result)) {
66790           let replacement = replacements[key];
66791           if (!replacement) {
66792             throw new Error(`Cannot resolve token: ${token}`);
66793           } else {
66794             if (addLinks && (key === "signupUrl" || key === "url")) {
66795               replacement = linkify(replacement);
66796             }
66797             result = result.replace(regex, replacement);
66798           }
66799         }
66800       }
66801       const leftovers = result.match(anyToken);
66802       if (leftovers) {
66803         throw new Error(`Cannot resolve tokens: ${leftovers}`);
66804       }
66805       if (addLinks && item.type === "reddit") {
66806         result = result.replace(/(\/r\/\w+\/*)/i, (match) => linkify(resolved.url, match));
66807       }
66808       return result;
66809     }
66810     function linkify(url, text2) {
66811       if (!url)
66812         return void 0;
66813       text2 = text2 || url;
66814       return `<a target="_blank" href="${url}">${text2}</a>`;
66815     }
66816   }
66817
66818   // modules/ui/success.js
66819   var _oci = null;
66820   function uiSuccess(context) {
66821     const MAXEVENTS = 2;
66822     const dispatch10 = dispatch_default("cancel");
66823     let _changeset2;
66824     let _location;
66825     ensureOSMCommunityIndex();
66826     function ensureOSMCommunityIndex() {
66827       const data = _mainFileFetcher;
66828       return Promise.all([
66829         data.get("oci_features"),
66830         data.get("oci_resources"),
66831         data.get("oci_defaults")
66832       ]).then((vals) => {
66833         if (_oci)
66834           return _oci;
66835         if (vals[0] && Array.isArray(vals[0].features)) {
66836           _sharedLocationManager.mergeCustomGeoJSON(vals[0]);
66837         }
66838         let ociResources = Object.values(vals[1].resources);
66839         if (ociResources.length) {
66840           return _sharedLocationManager.mergeLocationSets(ociResources).then(() => {
66841             _oci = {
66842               resources: ociResources,
66843               defaults: vals[2].defaults
66844             };
66845             return _oci;
66846           });
66847         } else {
66848           _oci = {
66849             resources: [],
66850             // no resources?
66851             defaults: vals[2].defaults
66852           };
66853           return _oci;
66854         }
66855       });
66856     }
66857     function parseEventDate(when) {
66858       if (!when)
66859         return;
66860       let raw = when.trim();
66861       if (!raw)
66862         return;
66863       if (!/Z$/.test(raw)) {
66864         raw += "Z";
66865       }
66866       const parsed = new Date(raw);
66867       return new Date(parsed.toUTCString().slice(0, 25));
66868     }
66869     function success(selection2) {
66870       let header = selection2.append("div").attr("class", "header fillL");
66871       header.append("h2").call(_t.append("success.just_edited"));
66872       header.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => dispatch10.call("cancel")).call(svgIcon("#iD-icon-close"));
66873       let body = selection2.append("div").attr("class", "body save-success fillL");
66874       let summary = body.append("div").attr("class", "save-summary");
66875       summary.append("h3").call(_t.append("success.thank_you" + (_location ? "_location" : ""), { where: _location }));
66876       summary.append("p").call(_t.append("success.help_html")).append("a").attr("class", "link-out").attr("target", "_blank").attr("href", _t("success.help_link_url")).call(svgIcon("#iD-icon-out-link", "inline")).append("span").call(_t.append("success.help_link_text"));
66877       let osm = context.connection();
66878       if (!osm)
66879         return;
66880       let changesetURL = osm.changesetURL(_changeset2.id);
66881       let table = summary.append("table").attr("class", "summary-table");
66882       let row = table.append("tr").attr("class", "summary-row");
66883       row.append("td").attr("class", "cell-icon summary-icon").append("a").attr("target", "_blank").attr("href", changesetURL).append("svg").attr("class", "logo-small").append("use").attr("xlink:href", "#iD-logo-osm");
66884       let summaryDetail = row.append("td").attr("class", "cell-detail summary-detail");
66885       summaryDetail.append("a").attr("class", "cell-detail summary-view-on-osm").attr("target", "_blank").attr("href", changesetURL).call(_t.append("success.view_on_osm"));
66886       summaryDetail.append("div").html(_t.html("success.changeset_id", {
66887         changeset_id: { html: `<a href="${changesetURL}" target="_blank">${_changeset2.id}</a>` }
66888       }));
66889       ensureOSMCommunityIndex().then((oci) => {
66890         const loc = context.map().center();
66891         const validHere = _sharedLocationManager.locationSetsAt(loc);
66892         let communities = [];
66893         oci.resources.forEach((resource) => {
66894           let area = validHere[resource.locationSetID];
66895           if (!area)
66896             return;
66897           const localizer = (stringID) => _t.html(`community.${stringID}`);
66898           resource.resolved = resolveStrings(resource, oci.defaults, localizer);
66899           communities.push({
66900             area,
66901             order: resource.order || 0,
66902             resource
66903           });
66904         });
66905         communities.sort((a, b) => a.area - b.area || b.order - a.order);
66906         body.call(showCommunityLinks, communities.map((c) => c.resource));
66907       });
66908     }
66909     function showCommunityLinks(selection2, resources) {
66910       let communityLinks = selection2.append("div").attr("class", "save-communityLinks");
66911       communityLinks.append("h3").call(_t.append("success.like_osm"));
66912       let table = communityLinks.append("table").attr("class", "community-table");
66913       let row = table.selectAll(".community-row").data(resources);
66914       let rowEnter = row.enter().append("tr").attr("class", "community-row");
66915       rowEnter.append("td").attr("class", "cell-icon community-icon").append("a").attr("target", "_blank").attr("href", (d) => d.resolved.url).append("svg").attr("class", "logo-small").append("use").attr("xlink:href", (d) => `#community-${d.type}`);
66916       let communityDetail = rowEnter.append("td").attr("class", "cell-detail community-detail");
66917       communityDetail.each(showCommunityDetails);
66918       communityLinks.append("div").attr("class", "community-missing").call(_t.append("success.missing")).append("a").attr("class", "link-out").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/osmlab/osm-community-index/issues").append("span").call(_t.append("success.tell_us"));
66919     }
66920     function showCommunityDetails(d) {
66921       let selection2 = select_default2(this);
66922       let communityID = d.id;
66923       selection2.append("div").attr("class", "community-name").html(d.resolved.nameHTML);
66924       selection2.append("div").attr("class", "community-description").html(d.resolved.descriptionHTML);
66925       if (d.resolved.extendedDescriptionHTML || d.languageCodes && d.languageCodes.length) {
66926         selection2.append("div").call(
66927           uiDisclosure(context, `community-more-${d.id}`, false).expanded(false).updatePreference(false).label(() => _t.append("success.more")).content(showMore)
66928         );
66929       }
66930       let nextEvents = (d.events || []).map((event) => {
66931         event.date = parseEventDate(event.when);
66932         return event;
66933       }).filter((event) => {
66934         const t = event.date.getTime();
66935         const now3 = new Date().setHours(0, 0, 0, 0);
66936         return !isNaN(t) && t >= now3;
66937       }).sort((a, b) => {
66938         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
66939       }).slice(0, MAXEVENTS);
66940       if (nextEvents.length) {
66941         selection2.append("div").call(
66942           uiDisclosure(context, `community-events-${d.id}`, false).expanded(false).updatePreference(false).label(_t.html("success.events")).content(showNextEvents)
66943         ).select(".hide-toggle").append("span").attr("class", "badge-text").text(nextEvents.length);
66944       }
66945       function showMore(selection3) {
66946         let more = selection3.selectAll(".community-more").data([0]);
66947         let moreEnter = more.enter().append("div").attr("class", "community-more");
66948         if (d.resolved.extendedDescriptionHTML) {
66949           moreEnter.append("div").attr("class", "community-extended-description").html(d.resolved.extendedDescriptionHTML);
66950         }
66951         if (d.languageCodes && d.languageCodes.length) {
66952           const languageList = d.languageCodes.map((code) => _mainLocalizer.languageName(code)).join(", ");
66953           moreEnter.append("div").attr("class", "community-languages").call(_t.append("success.languages", { languages: languageList }));
66954         }
66955       }
66956       function showNextEvents(selection3) {
66957         let events = selection3.append("div").attr("class", "community-events");
66958         let item = events.selectAll(".community-event").data(nextEvents);
66959         let itemEnter = item.enter().append("div").attr("class", "community-event");
66960         itemEnter.append("div").attr("class", "community-event-name").append("a").attr("target", "_blank").attr("href", (d2) => d2.url).text((d2) => {
66961           let name = d2.name;
66962           if (d2.i18n && d2.id) {
66963             name = _t(`community.${communityID}.events.${d2.id}.name`, { default: name });
66964           }
66965           return name;
66966         });
66967         itemEnter.append("div").attr("class", "community-event-when").text((d2) => {
66968           let options2 = { weekday: "short", day: "numeric", month: "short", year: "numeric" };
66969           if (d2.date.getHours() || d2.date.getMinutes()) {
66970             options2.hour = "numeric";
66971             options2.minute = "numeric";
66972           }
66973           return d2.date.toLocaleString(_mainLocalizer.localeCode(), options2);
66974         });
66975         itemEnter.append("div").attr("class", "community-event-where").text((d2) => {
66976           let where = d2.where;
66977           if (d2.i18n && d2.id) {
66978             where = _t(`community.${communityID}.events.${d2.id}.where`, { default: where });
66979           }
66980           return where;
66981         });
66982         itemEnter.append("div").attr("class", "community-event-description").text((d2) => {
66983           let description = d2.description;
66984           if (d2.i18n && d2.id) {
66985             description = _t(`community.${communityID}.events.${d2.id}.description`, { default: description });
66986           }
66987           return description;
66988         });
66989       }
66990     }
66991     success.changeset = function(val) {
66992       if (!arguments.length)
66993         return _changeset2;
66994       _changeset2 = val;
66995       return success;
66996     };
66997     success.location = function(val) {
66998       if (!arguments.length)
66999         return _location;
67000       _location = val;
67001       return success;
67002     };
67003     return utilRebind(success, dispatch10, "on");
67004   }
67005
67006   // modules/ui/version.js
67007   var sawVersion = null;
67008   var isNewVersion = false;
67009   var isNewUser = false;
67010   function uiVersion(context) {
67011     var currVersion = context.version;
67012     var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
67013     if (sawVersion === null && matchedVersion !== null) {
67014       if (corePreferences("sawVersion")) {
67015         isNewUser = false;
67016         isNewVersion = corePreferences("sawVersion") !== currVersion && currVersion.indexOf("-") === -1;
67017       } else {
67018         isNewUser = true;
67019         isNewVersion = true;
67020       }
67021       corePreferences("sawVersion", currVersion);
67022       sawVersion = currVersion;
67023     }
67024     return function(selection2) {
67025       selection2.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD").text(currVersion);
67026       if (isNewVersion && !isNewUser) {
67027         selection2.append("a").attr("class", "badge").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD/blob/release/CHANGELOG.md#whats-new").call(svgIcon("#maki-gift")).call(
67028           uiTooltip().title(() => _t.append("version.whats_new", { version: currVersion })).placement("top").scrollContainer(context.container().select(".main-footer-wrap"))
67029         );
67030       }
67031     };
67032   }
67033
67034   // modules/ui/zoom.js
67035   function uiZoom(context) {
67036     var zooms = [{
67037       id: "zoom-in",
67038       icon: "iD-icon-plus",
67039       title: _t.append("zoom.in"),
67040       action: zoomIn,
67041       disabled: function() {
67042         return !context.map().canZoomIn();
67043       },
67044       disabledTitle: _t.append("zoom.disabled.in"),
67045       key: "+"
67046     }, {
67047       id: "zoom-out",
67048       icon: "iD-icon-minus",
67049       title: _t.append("zoom.out"),
67050       action: zoomOut,
67051       disabled: function() {
67052         return !context.map().canZoomOut();
67053       },
67054       disabledTitle: _t.append("zoom.disabled.out"),
67055       key: "-"
67056     }];
67057     function zoomIn(d3_event) {
67058       if (d3_event.shiftKey)
67059         return;
67060       d3_event.preventDefault();
67061       context.map().zoomIn();
67062     }
67063     function zoomOut(d3_event) {
67064       if (d3_event.shiftKey)
67065         return;
67066       d3_event.preventDefault();
67067       context.map().zoomOut();
67068     }
67069     function zoomInFurther(d3_event) {
67070       if (d3_event.shiftKey)
67071         return;
67072       d3_event.preventDefault();
67073       context.map().zoomInFurther();
67074     }
67075     function zoomOutFurther(d3_event) {
67076       if (d3_event.shiftKey)
67077         return;
67078       d3_event.preventDefault();
67079       context.map().zoomOutFurther();
67080     }
67081     return function(selection2) {
67082       var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function(d) {
67083         if (d.disabled()) {
67084           return d.disabledTitle;
67085         }
67086         return d.title;
67087       }).keys(function(d) {
67088         return [d.key];
67089       });
67090       var lastPointerUpType;
67091       var buttons = selection2.selectAll("button").data(zooms).enter().append("button").attr("class", function(d) {
67092         return d.id;
67093       }).on("pointerup.editor", function(d3_event) {
67094         lastPointerUpType = d3_event.pointerType;
67095       }).on("click.editor", function(d3_event, d) {
67096         if (!d.disabled()) {
67097           d.action(d3_event);
67098         } else if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
67099           context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass("disabled").label(d.disabledTitle)();
67100         }
67101         lastPointerUpType = null;
67102       }).call(tooltipBehavior);
67103       buttons.each(function(d) {
67104         select_default2(this).call(svgIcon("#" + d.icon, "light"));
67105       });
67106       utilKeybinding.plusKeys.forEach(function(key) {
67107         context.keybinding().on([key], zoomIn);
67108         context.keybinding().on([uiCmd("\u2325" + key)], zoomInFurther);
67109       });
67110       utilKeybinding.minusKeys.forEach(function(key) {
67111         context.keybinding().on([key], zoomOut);
67112         context.keybinding().on([uiCmd("\u2325" + key)], zoomOutFurther);
67113       });
67114       function updateButtonStates() {
67115         buttons.classed("disabled", function(d) {
67116           return d.disabled();
67117         }).each(function() {
67118           var selection3 = select_default2(this);
67119           if (!selection3.select(".tooltip.in").empty()) {
67120             selection3.call(tooltipBehavior.updateContent);
67121           }
67122         });
67123       }
67124       updateButtonStates();
67125       context.map().on("move.uiZoom", updateButtonStates);
67126     };
67127   }
67128
67129   // modules/ui/sections/raw_tag_editor.js
67130   function uiSectionRawTagEditor(id2, context) {
67131     var section = uiSection(id2, context).classes("raw-tag-editor").label(function() {
67132       var count = Object.keys(_tags).filter(function(d) {
67133         return d;
67134       }).length;
67135       return _t.append("inspector.title_count", { title: _t("inspector.tags"), count });
67136     }).expandedByDefault(false).disclosureContent(renderDisclosureContent);
67137     var taginfo = services.taginfo;
67138     var dispatch10 = dispatch_default("change");
67139     var availableViews = [
67140       { id: "list", icon: "#fas-th-list" },
67141       { id: "text", icon: "#fas-i-cursor" }
67142     ];
67143     var _tagView = corePreferences("raw-tag-editor-view") || "list";
67144     var _readOnlyTags = [];
67145     var _orderedKeys = [];
67146     var _showBlank = false;
67147     var _pendingChange = null;
67148     var _state;
67149     var _presets;
67150     var _tags;
67151     var _entityIDs;
67152     var _didInteract = false;
67153     function interacted() {
67154       _didInteract = true;
67155     }
67156     function renderDisclosureContent(wrap2) {
67157       _orderedKeys = _orderedKeys.filter(function(key) {
67158         return _tags[key] !== void 0;
67159       });
67160       var all = Object.keys(_tags).sort();
67161       var missingKeys = utilArrayDifference(all, _orderedKeys);
67162       for (var i2 in missingKeys) {
67163         _orderedKeys.push(missingKeys[i2]);
67164       }
67165       var rowData = _orderedKeys.map(function(key, i3) {
67166         return { index: i3, key, value: _tags[key] };
67167       });
67168       if (!rowData.length || _showBlank) {
67169         _showBlank = false;
67170         rowData.push({ index: rowData.length, key: "", value: "" });
67171       }
67172       var options2 = wrap2.selectAll(".raw-tag-options").data([0]);
67173       options2.exit().remove();
67174       var optionsEnter = options2.enter().insert("div", ":first-child").attr("class", "raw-tag-options").attr("role", "tablist");
67175       var optionEnter = optionsEnter.selectAll(".raw-tag-option").data(availableViews, function(d) {
67176         return d.id;
67177       }).enter();
67178       optionEnter.append("button").attr("class", function(d) {
67179         return "raw-tag-option raw-tag-option-" + d.id + (_tagView === d.id ? " selected" : "");
67180       }).attr("aria-selected", function(d) {
67181         return _tagView === d.id;
67182       }).attr("role", "tab").attr("title", function(d) {
67183         return _t("icons." + d.id);
67184       }).on("click", function(d3_event, d) {
67185         _tagView = d.id;
67186         corePreferences("raw-tag-editor-view", d.id);
67187         wrap2.selectAll(".raw-tag-option").classed("selected", function(datum2) {
67188           return datum2 === d;
67189         }).attr("aria-selected", function(datum2) {
67190           return datum2 === d;
67191         });
67192         wrap2.selectAll(".tag-text").classed("hide", d.id !== "text").each(setTextareaHeight);
67193         wrap2.selectAll(".tag-list, .add-row").classed("hide", d.id !== "list");
67194       }).each(function(d) {
67195         select_default2(this).call(svgIcon(d.icon));
67196       });
67197       var textData = rowsToText(rowData);
67198       var textarea = wrap2.selectAll(".tag-text").data([0]);
67199       textarea = textarea.enter().append("textarea").attr("class", "tag-text" + (_tagView !== "text" ? " hide" : "")).call(utilNoAuto).attr("placeholder", _t("inspector.key_value")).attr("spellcheck", "false").merge(textarea);
67200       textarea.call(utilGetSetValue, textData).each(setTextareaHeight).on("input", setTextareaHeight).on("focus", interacted).on("blur", textChanged).on("change", textChanged);
67201       var list = wrap2.selectAll(".tag-list").data([0]);
67202       list = list.enter().append("ul").attr("class", "tag-list" + (_tagView !== "list" ? " hide" : "")).merge(list);
67203       var addRowEnter = wrap2.selectAll(".add-row").data([0]).enter().append("div").attr("class", "add-row" + (_tagView !== "list" ? " hide" : ""));
67204       addRowEnter.append("button").attr("class", "add-tag").attr("aria-label", _t("inspector.add_to_tag")).call(svgIcon("#iD-icon-plus", "light")).call(uiTooltip().title(() => _t.append("inspector.add_to_tag")).placement(_mainLocalizer.textDirection() === "ltr" ? "right" : "left")).on("click", addTag);
67205       addRowEnter.append("div").attr("class", "space-value");
67206       addRowEnter.append("div").attr("class", "space-buttons");
67207       var items = list.selectAll(".tag-row").data(rowData, function(d) {
67208         return d.key;
67209       });
67210       items.exit().each(unbind).remove();
67211       var itemsEnter = items.enter().append("li").attr("class", "tag-row").classed("readonly", isReadOnly);
67212       var innerWrap = itemsEnter.append("div").attr("class", "inner-wrap");
67213       innerWrap.append("div").attr("class", "key-wrap").append("input").property("type", "text").attr("class", "key").call(utilNoAuto).on("focus", interacted).on("blur", keyChange).on("change", keyChange);
67214       innerWrap.append("div").attr("class", "value-wrap").append("input").property("type", "text").attr("class", "value").call(utilNoAuto).on("focus", interacted).on("blur", valueChange).on("change", valueChange).on("keydown.push-more", pushMore);
67215       innerWrap.append("button").attr("class", "form-field-button remove").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete"));
67216       items = items.merge(itemsEnter).sort(function(a, b) {
67217         return a.index - b.index;
67218       });
67219       items.each(function(d) {
67220         var row = select_default2(this);
67221         var key = row.select("input.key");
67222         var value = row.select("input.value");
67223         if (_entityIDs && taginfo && _state !== "hover") {
67224           bindTypeahead(key, value);
67225         }
67226         var referenceOptions = { key: d.key };
67227         if (typeof d.value === "string") {
67228           referenceOptions.value = d.value;
67229         }
67230         var reference = uiTagReference(referenceOptions, context);
67231         if (_state === "hover") {
67232           reference.showing(false);
67233         }
67234         row.select(".inner-wrap").call(reference.button);
67235         row.call(reference.body);
67236         row.select("button.remove");
67237       });
67238       items.selectAll("input.key").attr("title", function(d) {
67239         return d.key;
67240       }).call(utilGetSetValue, function(d) {
67241         return d.key;
67242       }).attr("readonly", function(d) {
67243         return isReadOnly(d) || null;
67244       });
67245       items.selectAll("input.value").attr("title", function(d) {
67246         return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : d.value;
67247       }).classed("mixed", function(d) {
67248         return Array.isArray(d.value);
67249       }).attr("placeholder", function(d) {
67250         return typeof d.value === "string" ? null : _t("inspector.multiple_values");
67251       }).call(utilGetSetValue, function(d) {
67252         return typeof d.value === "string" ? d.value : "";
67253       }).attr("readonly", function(d) {
67254         return isReadOnly(d) || null;
67255       });
67256       items.selectAll("button.remove").on(("PointerEvent" in window ? "pointer" : "mouse") + "down", removeTag);
67257     }
67258     function isReadOnly(d) {
67259       for (var i2 = 0; i2 < _readOnlyTags.length; i2++) {
67260         if (d.key.match(_readOnlyTags[i2]) !== null) {
67261           return true;
67262         }
67263       }
67264       return false;
67265     }
67266     function setTextareaHeight() {
67267       if (_tagView !== "text")
67268         return;
67269       var selection2 = select_default2(this);
67270       var matches = selection2.node().value.match(/\n/g);
67271       var lineCount = 2 + Number(matches && matches.length);
67272       var lineHeight = 20;
67273       selection2.style("height", lineCount * lineHeight + "px");
67274     }
67275     function stringify3(s) {
67276       return JSON.stringify(s).slice(1, -1);
67277     }
67278     function unstringify(s) {
67279       var leading = "";
67280       var trailing = "";
67281       if (s.length < 1 || s.charAt(0) !== '"') {
67282         leading = '"';
67283       }
67284       if (s.length < 2 || s.charAt(s.length - 1) !== '"' || s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === "\\") {
67285         trailing = '"';
67286       }
67287       return JSON.parse(leading + s + trailing);
67288     }
67289     function rowsToText(rows) {
67290       var str2 = rows.filter(function(row) {
67291         return row.key && row.key.trim() !== "";
67292       }).map(function(row) {
67293         var rawVal = row.value;
67294         if (typeof rawVal !== "string")
67295           rawVal = "*";
67296         var val = rawVal ? stringify3(rawVal) : "";
67297         return stringify3(row.key) + "=" + val;
67298       }).join("\n");
67299       if (_state !== "hover" && str2.length) {
67300         return str2 + "\n";
67301       }
67302       return str2;
67303     }
67304     function textChanged() {
67305       var newText = this.value.trim();
67306       var newTags = {};
67307       newText.split("\n").forEach(function(row) {
67308         var m = row.match(/^\s*([^=]+)=(.*)$/);
67309         if (m !== null) {
67310           var k = context.cleanTagKey(unstringify(m[1].trim()));
67311           var v = context.cleanTagValue(unstringify(m[2].trim()));
67312           newTags[k] = v;
67313         }
67314       });
67315       var tagDiff = utilTagDiff(_tags, newTags);
67316       if (!tagDiff.length)
67317         return;
67318       _pendingChange = _pendingChange || {};
67319       tagDiff.forEach(function(change) {
67320         if (isReadOnly({ key: change.key }))
67321           return;
67322         if (change.newVal === "*" && typeof change.oldVal !== "string")
67323           return;
67324         if (change.type === "-") {
67325           _pendingChange[change.key] = void 0;
67326         } else if (change.type === "+") {
67327           _pendingChange[change.key] = change.newVal || "";
67328         }
67329       });
67330       if (Object.keys(_pendingChange).length === 0) {
67331         _pendingChange = null;
67332         return;
67333       }
67334       scheduleChange();
67335     }
67336     function pushMore(d3_event) {
67337       if (d3_event.keyCode === 9 && !d3_event.shiftKey && section.selection().selectAll(".tag-list li:last-child input.value").node() === this && utilGetSetValue(select_default2(this))) {
67338         addTag();
67339       }
67340     }
67341     function bindTypeahead(key, value) {
67342       if (isReadOnly(key.datum()))
67343         return;
67344       if (Array.isArray(value.datum().value)) {
67345         value.call(uiCombobox(context, "tag-value").minItems(1).fetcher(function(value2, callback) {
67346           var keyString = utilGetSetValue(key);
67347           if (!_tags[keyString])
67348             return;
67349           var data = _tags[keyString].filter(Boolean).map(function(tagValue) {
67350             return {
67351               value: tagValue,
67352               title: tagValue
67353             };
67354           });
67355           callback(data);
67356         }));
67357         return;
67358       }
67359       var geometry = context.graph().geometry(_entityIDs[0]);
67360       key.call(uiCombobox(context, "tag-key").fetcher(function(value2, callback) {
67361         taginfo.keys({
67362           debounce: true,
67363           geometry,
67364           query: value2
67365         }, function(err, data) {
67366           if (!err) {
67367             var filtered = data.filter(function(d) {
67368               return _tags[d.value] === void 0;
67369             });
67370             callback(sort(value2, filtered));
67371           }
67372         });
67373       }));
67374       value.call(uiCombobox(context, "tag-value").fetcher(function(value2, callback) {
67375         taginfo.values({
67376           debounce: true,
67377           key: utilGetSetValue(key),
67378           geometry,
67379           query: value2
67380         }, function(err, data) {
67381           if (!err)
67382             callback(sort(value2, data));
67383         });
67384       }));
67385       function sort(value2, data) {
67386         var sameletter = [];
67387         var other = [];
67388         for (var i2 = 0; i2 < data.length; i2++) {
67389           if (data[i2].value.substring(0, value2.length) === value2) {
67390             sameletter.push(data[i2]);
67391           } else {
67392             other.push(data[i2]);
67393           }
67394         }
67395         return sameletter.concat(other);
67396       }
67397     }
67398     function unbind() {
67399       var row = select_default2(this);
67400       row.selectAll("input.key").call(uiCombobox.off, context);
67401       row.selectAll("input.value").call(uiCombobox.off, context);
67402     }
67403     function keyChange(d3_event, d) {
67404       if (select_default2(this).attr("readonly"))
67405         return;
67406       var kOld = d.key;
67407       if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === void 0)
67408         return;
67409       var kNew = context.cleanTagKey(this.value.trim());
67410       if (isReadOnly({ key: kNew })) {
67411         this.value = kOld;
67412         return;
67413       }
67414       if (kNew && kNew !== kOld && _tags[kNew] !== void 0) {
67415         this.value = kOld;
67416         section.selection().selectAll(".tag-list input.value").each(function(d2) {
67417           if (d2.key === kNew) {
67418             var input = select_default2(this).node();
67419             input.focus();
67420             input.select();
67421           }
67422         });
67423         return;
67424       }
67425       _pendingChange = _pendingChange || {};
67426       if (kOld) {
67427         if (kOld === kNew)
67428           return;
67429         _pendingChange[kNew] = _pendingChange[kOld] || { oldKey: kOld };
67430         _pendingChange[kOld] = void 0;
67431       } else {
67432         let row = this.parentNode.parentNode;
67433         let inputVal = select_default2(row).selectAll("input.value");
67434         let vNew = context.cleanTagValue(utilGetSetValue(inputVal));
67435         _pendingChange[kNew] = vNew;
67436         utilGetSetValue(inputVal, vNew);
67437       }
67438       var existingKeyIndex = _orderedKeys.indexOf(kOld);
67439       if (existingKeyIndex !== -1)
67440         _orderedKeys[existingKeyIndex] = kNew;
67441       d.key = kNew;
67442       this.value = kNew;
67443       scheduleChange();
67444     }
67445     function valueChange(d3_event, d) {
67446       if (isReadOnly(d))
67447         return;
67448       if (typeof d.value !== "string" && !this.value)
67449         return;
67450       if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === void 0)
67451         return;
67452       _pendingChange = _pendingChange || {};
67453       _pendingChange[d.key] = context.cleanTagValue(this.value);
67454       scheduleChange();
67455     }
67456     function removeTag(d3_event, d) {
67457       if (isReadOnly(d))
67458         return;
67459       if (d.key === "") {
67460         _showBlank = false;
67461         section.reRender();
67462       } else {
67463         _orderedKeys = _orderedKeys.filter(function(key) {
67464           return key !== d.key;
67465         });
67466         _pendingChange = _pendingChange || {};
67467         _pendingChange[d.key] = void 0;
67468         scheduleChange();
67469       }
67470     }
67471     function addTag() {
67472       window.setTimeout(function() {
67473         _showBlank = true;
67474         section.reRender();
67475         section.selection().selectAll(".tag-list li:last-child input.key").node().focus();
67476       }, 20);
67477     }
67478     function scheduleChange() {
67479       var entityIDs = _entityIDs;
67480       window.setTimeout(function() {
67481         if (!_pendingChange)
67482           return;
67483         dispatch10.call("change", this, entityIDs, _pendingChange);
67484         _pendingChange = null;
67485       }, 10);
67486     }
67487     section.state = function(val) {
67488       if (!arguments.length)
67489         return _state;
67490       if (_state !== val) {
67491         _orderedKeys = [];
67492         _state = val;
67493       }
67494       return section;
67495     };
67496     section.presets = function(val) {
67497       if (!arguments.length)
67498         return _presets;
67499       _presets = val;
67500       if (_presets && _presets.length && _presets[0].isFallback()) {
67501         section.disclosureExpanded(true);
67502       } else if (!_didInteract) {
67503         section.disclosureExpanded(null);
67504       }
67505       return section;
67506     };
67507     section.tags = function(val) {
67508       if (!arguments.length)
67509         return _tags;
67510       _tags = val;
67511       return section;
67512     };
67513     section.entityIDs = function(val) {
67514       if (!arguments.length)
67515         return _entityIDs;
67516       if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
67517         _entityIDs = val;
67518         _orderedKeys = [];
67519       }
67520       return section;
67521     };
67522     section.readOnlyTags = function(val) {
67523       if (!arguments.length)
67524         return _readOnlyTags;
67525       _readOnlyTags = val;
67526       return section;
67527     };
67528     return utilRebind(section, dispatch10, "on");
67529   }
67530
67531   // modules/ui/data_editor.js
67532   function uiDataEditor(context) {
67533     var dataHeader = uiDataHeader();
67534     var rawTagEditor = uiSectionRawTagEditor("custom-data-tag-editor", context).expandedByDefault(true).readOnlyTags([/./]);
67535     var _datum;
67536     function dataEditor(selection2) {
67537       var header = selection2.selectAll(".header").data([0]);
67538       var headerEnter = header.enter().append("div").attr("class", "header fillL");
67539       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
67540         context.enter(modeBrowse(context));
67541       }).call(svgIcon("#iD-icon-close"));
67542       headerEnter.append("h2").call(_t.append("map_data.title"));
67543       var body = selection2.selectAll(".body").data([0]);
67544       body = body.enter().append("div").attr("class", "body").merge(body);
67545       var editor = body.selectAll(".data-editor").data([0]);
67546       editor.enter().append("div").attr("class", "modal-section data-editor").merge(editor).call(dataHeader.datum(_datum));
67547       var rte = body.selectAll(".raw-tag-editor").data([0]);
67548       rte.enter().append("div").attr("class", "raw-tag-editor data-editor").merge(rte).call(
67549         rawTagEditor.tags(_datum && _datum.properties || {}).state("hover").render
67550       ).selectAll("textarea.tag-text").attr("readonly", true).classed("readonly", true);
67551     }
67552     dataEditor.datum = function(val) {
67553       if (!arguments.length)
67554         return _datum;
67555       _datum = val;
67556       return this;
67557     };
67558     return dataEditor;
67559   }
67560
67561   // modules/ui/osmose_details.js
67562   function uiOsmoseDetails(context) {
67563     let _qaItem;
67564     function issueString(d, type2) {
67565       if (!d)
67566         return "";
67567       const s = services.osmose.getStrings(d.itemType);
67568       return type2 in s ? s[type2] : "";
67569     }
67570     function osmoseDetails(selection2) {
67571       const details = selection2.selectAll(".error-details").data(
67572         _qaItem ? [_qaItem] : [],
67573         (d) => `${d.id}-${d.status || 0}`
67574       );
67575       details.exit().remove();
67576       const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
67577       if (issueString(_qaItem, "detail")) {
67578         const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
67579         div.append("h4").call(_t.append("QA.keepRight.detail_description"));
67580         div.append("p").attr("class", "qa-details-description-text").html((d) => issueString(d, "detail")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
67581       }
67582       const detailsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection");
67583       const elemsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection");
67584       if (issueString(_qaItem, "fix")) {
67585         const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
67586         div.append("h4").call(_t.append("QA.osmose.fix_title"));
67587         div.append("p").html((d) => issueString(d, "fix")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
67588       }
67589       if (issueString(_qaItem, "trap")) {
67590         const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
67591         div.append("h4").call(_t.append("QA.osmose.trap_title"));
67592         div.append("p").html((d) => issueString(d, "trap")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
67593       }
67594       const thisItem = _qaItem;
67595       services.osmose.loadIssueDetail(_qaItem).then((d) => {
67596         if (!d.elems || d.elems.length === 0)
67597           return;
67598         if (context.selectedErrorID() !== thisItem.id && context.container().selectAll(`.qaItem.osmose.hover.itemId-${thisItem.id}`).empty())
67599           return;
67600         if (d.detail) {
67601           detailsDiv.append("h4").call(_t.append("QA.osmose.detail_title"));
67602           detailsDiv.append("p").html((d2) => d2.detail).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
67603         }
67604         elemsDiv.append("h4").call(_t.append("QA.osmose.elems_title"));
67605         elemsDiv.append("ul").selectAll("li").data(d.elems).enter().append("li").append("a").attr("href", "#").attr("class", "error_entity_link").text((d2) => d2).each(function() {
67606           const link2 = select_default2(this);
67607           const entityID = this.textContent;
67608           const entity = context.hasEntity(entityID);
67609           link2.on("mouseenter", () => {
67610             utilHighlightEntities([entityID], true, context);
67611           }).on("mouseleave", () => {
67612             utilHighlightEntities([entityID], false, context);
67613           }).on("click", (d3_event) => {
67614             d3_event.preventDefault();
67615             utilHighlightEntities([entityID], false, context);
67616             const osmlayer = context.layers().layer("osm");
67617             if (!osmlayer.enabled()) {
67618               osmlayer.enabled(true);
67619             }
67620             context.map().centerZoom(d.loc, 20);
67621             if (entity) {
67622               context.enter(modeSelect(context, [entityID]));
67623             } else {
67624               context.loadEntity(entityID, (err, result) => {
67625                 if (err)
67626                   return;
67627                 const entity2 = result.data.find((e) => e.id === entityID);
67628                 if (entity2)
67629                   context.enter(modeSelect(context, [entityID]));
67630               });
67631             }
67632           });
67633           if (entity) {
67634             let name = utilDisplayName(entity);
67635             if (!name) {
67636               const preset = _mainPresetIndex.match(entity, context.graph());
67637               name = preset && !preset.isFallback() && preset.name();
67638             }
67639             if (name) {
67640               this.innerText = name;
67641             }
67642           }
67643         });
67644         context.features().forceVisible(d.elems);
67645         context.map().pan([0, 0]);
67646       }).catch((err) => {
67647         console.log(err);
67648       });
67649     }
67650     osmoseDetails.issue = function(val) {
67651       if (!arguments.length)
67652         return _qaItem;
67653       _qaItem = val;
67654       return osmoseDetails;
67655     };
67656     return osmoseDetails;
67657   }
67658
67659   // modules/ui/osmose_header.js
67660   function uiOsmoseHeader() {
67661     let _qaItem;
67662     function issueTitle(d) {
67663       const unknown = _t("inspector.unknown");
67664       if (!d)
67665         return unknown;
67666       const s = services.osmose.getStrings(d.itemType);
67667       return "title" in s ? s.title : unknown;
67668     }
67669     function osmoseHeader(selection2) {
67670       const header = selection2.selectAll(".qa-header").data(
67671         _qaItem ? [_qaItem] : [],
67672         (d) => `${d.id}-${d.status || 0}`
67673       );
67674       header.exit().remove();
67675       const headerEnter = header.enter().append("div").attr("class", "qa-header");
67676       const svgEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0).append("svg").attr("width", "20px").attr("height", "30px").attr("viewbox", "0 0 20 30").attr("class", (d) => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
67677       svgEnter.append("polygon").attr("fill", (d) => services.osmose.getColor(d.item)).attr("class", "qaItem-fill").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");
67678       svgEnter.append("use").attr("class", "icon-annotation").attr("width", "12px").attr("height", "12px").attr("transform", "translate(4, 5.5)").attr("xlink:href", (d) => d.icon ? "#" + d.icon : "");
67679       headerEnter.append("div").attr("class", "qa-header-label").text(issueTitle);
67680     }
67681     osmoseHeader.issue = function(val) {
67682       if (!arguments.length)
67683         return _qaItem;
67684       _qaItem = val;
67685       return osmoseHeader;
67686     };
67687     return osmoseHeader;
67688   }
67689
67690   // modules/ui/view_on_osmose.js
67691   function uiViewOnOsmose() {
67692     let _qaItem;
67693     function viewOnOsmose(selection2) {
67694       let url;
67695       if (services.osmose && _qaItem instanceof QAItem) {
67696         url = services.osmose.itemURL(_qaItem);
67697       }
67698       const link2 = selection2.selectAll(".view-on-osmose").data(url ? [url] : []);
67699       link2.exit().remove();
67700       const linkEnter = link2.enter().append("a").attr("class", "view-on-osmose").attr("target", "_blank").attr("rel", "noopener").attr("href", (d) => d).call(svgIcon("#iD-icon-out-link", "inline"));
67701       linkEnter.append("span").call(_t.append("inspector.view_on_osmose"));
67702     }
67703     viewOnOsmose.what = function(val) {
67704       if (!arguments.length)
67705         return _qaItem;
67706       _qaItem = val;
67707       return viewOnOsmose;
67708     };
67709     return viewOnOsmose;
67710   }
67711
67712   // modules/ui/osmose_editor.js
67713   function uiOsmoseEditor(context) {
67714     const dispatch10 = dispatch_default("change");
67715     const qaDetails = uiOsmoseDetails(context);
67716     const qaHeader = uiOsmoseHeader(context);
67717     let _qaItem;
67718     function osmoseEditor(selection2) {
67719       const header = selection2.selectAll(".header").data([0]);
67720       const headerEnter = header.enter().append("div").attr("class", "header fillL");
67721       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
67722       headerEnter.append("h2").call(_t.append("QA.osmose.title"));
67723       let body = selection2.selectAll(".body").data([0]);
67724       body = body.enter().append("div").attr("class", "body").merge(body);
67725       let editor = body.selectAll(".qa-editor").data([0]);
67726       editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(osmoseSaveSection);
67727       const footer = selection2.selectAll(".footer").data([0]);
67728       footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnOsmose(context).what(_qaItem));
67729     }
67730     function osmoseSaveSection(selection2) {
67731       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
67732       const isShown = _qaItem && isSelected;
67733       let saveSection = selection2.selectAll(".qa-save").data(
67734         isShown ? [_qaItem] : [],
67735         (d) => `${d.id}-${d.status || 0}`
67736       );
67737       saveSection.exit().remove();
67738       const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
67739       saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
67740     }
67741     function qaSaveButtons(selection2) {
67742       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
67743       let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
67744       buttonSection.exit().remove();
67745       const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
67746       buttonEnter.append("button").attr("class", "button close-button action");
67747       buttonEnter.append("button").attr("class", "button ignore-button action");
67748       buttonSection = buttonSection.merge(buttonEnter);
67749       buttonSection.select(".close-button").call(_t.append("QA.keepRight.close")).on("click.close", function(d3_event, d) {
67750         this.blur();
67751         const qaService = services.osmose;
67752         if (qaService) {
67753           d.newStatus = "done";
67754           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
67755         }
67756       });
67757       buttonSection.select(".ignore-button").call(_t.append("QA.keepRight.ignore")).on("click.ignore", function(d3_event, d) {
67758         this.blur();
67759         const qaService = services.osmose;
67760         if (qaService) {
67761           d.newStatus = "false";
67762           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
67763         }
67764       });
67765     }
67766     osmoseEditor.error = function(val) {
67767       if (!arguments.length)
67768         return _qaItem;
67769       _qaItem = val;
67770       return osmoseEditor;
67771     };
67772     return utilRebind(osmoseEditor, dispatch10, "on");
67773   }
67774
67775   // modules/ui/sidebar.js
67776   function uiSidebar(context) {
67777     var inspector = uiInspector(context);
67778     var dataEditor = uiDataEditor(context);
67779     var noteEditor = uiNoteEditor(context);
67780     var improveOsmEditor = uiImproveOsmEditor(context);
67781     var keepRightEditor = uiKeepRightEditor(context);
67782     var osmoseEditor = uiOsmoseEditor(context);
67783     var _current;
67784     var _wasData = false;
67785     var _wasNote = false;
67786     var _wasQaItem = false;
67787     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
67788     function sidebar(selection2) {
67789       var container = context.container();
67790       var minWidth = 240;
67791       var sidebarWidth;
67792       var containerWidth;
67793       var dragOffset;
67794       selection2.style("min-width", minWidth + "px").style("max-width", "400px").style("width", "33.3333%");
67795       var resizer = selection2.append("div").attr("class", "sidebar-resizer").on(_pointerPrefix + "down.sidebar-resizer", pointerdown);
67796       var downPointerId, lastClientX, containerLocGetter;
67797       function pointerdown(d3_event) {
67798         if (downPointerId)
67799           return;
67800         if ("button" in d3_event && d3_event.button !== 0)
67801           return;
67802         downPointerId = d3_event.pointerId || "mouse";
67803         lastClientX = d3_event.clientX;
67804         containerLocGetter = utilFastMouse(container.node());
67805         dragOffset = utilFastMouse(resizer.node())(d3_event)[0] - 1;
67806         sidebarWidth = selection2.node().getBoundingClientRect().width;
67807         containerWidth = container.node().getBoundingClientRect().width;
67808         var widthPct = sidebarWidth / containerWidth * 100;
67809         selection2.style("width", widthPct + "%").style("max-width", "85%");
67810         resizer.classed("dragging", true);
67811         select_default2(window).on("touchmove.sidebar-resizer", function(d3_event2) {
67812           d3_event2.preventDefault();
67813         }, { passive: false }).on(_pointerPrefix + "move.sidebar-resizer", pointermove).on(_pointerPrefix + "up.sidebar-resizer pointercancel.sidebar-resizer", pointerup);
67814       }
67815       function pointermove(d3_event) {
67816         if (downPointerId !== (d3_event.pointerId || "mouse"))
67817           return;
67818         d3_event.preventDefault();
67819         var dx = d3_event.clientX - lastClientX;
67820         lastClientX = d3_event.clientX;
67821         var isRTL = _mainLocalizer.textDirection() === "rtl";
67822         var scaleX = isRTL ? 0 : 1;
67823         var xMarginProperty = isRTL ? "margin-right" : "margin-left";
67824         var x = containerLocGetter(d3_event)[0] - dragOffset;
67825         sidebarWidth = isRTL ? containerWidth - x : x;
67826         var isCollapsed = selection2.classed("collapsed");
67827         var shouldCollapse = sidebarWidth < minWidth;
67828         selection2.classed("collapsed", shouldCollapse);
67829         if (shouldCollapse) {
67830           if (!isCollapsed) {
67831             selection2.style(xMarginProperty, "-400px").style("width", "400px");
67832             context.ui().onResize([(sidebarWidth - dx) * scaleX, 0]);
67833           }
67834         } else {
67835           var widthPct = sidebarWidth / containerWidth * 100;
67836           selection2.style(xMarginProperty, null).style("width", widthPct + "%");
67837           if (isCollapsed) {
67838             context.ui().onResize([-sidebarWidth * scaleX, 0]);
67839           } else {
67840             context.ui().onResize([-dx * scaleX, 0]);
67841           }
67842         }
67843       }
67844       function pointerup(d3_event) {
67845         if (downPointerId !== (d3_event.pointerId || "mouse"))
67846           return;
67847         downPointerId = null;
67848         resizer.classed("dragging", false);
67849         select_default2(window).on("touchmove.sidebar-resizer", null).on(_pointerPrefix + "move.sidebar-resizer", null).on(_pointerPrefix + "up.sidebar-resizer pointercancel.sidebar-resizer", null);
67850       }
67851       var featureListWrap = selection2.append("div").attr("class", "feature-list-pane").call(uiFeatureList(context));
67852       var inspectorWrap = selection2.append("div").attr("class", "inspector-hidden inspector-wrap");
67853       var hoverModeSelect = function(targets) {
67854         context.container().selectAll(".feature-list-item button").classed("hover", false);
67855         if (context.selectedIDs().length > 1 && targets && targets.length) {
67856           var elements = context.container().selectAll(".feature-list-item button").filter(function(node) {
67857             return targets.indexOf(node) !== -1;
67858           });
67859           if (!elements.empty()) {
67860             elements.classed("hover", true);
67861           }
67862         }
67863       };
67864       sidebar.hoverModeSelect = throttle_default(hoverModeSelect, 200);
67865       function hover(targets) {
67866         var datum2 = targets && targets.length && targets[0];
67867         if (datum2 && datum2.__featurehash__) {
67868           _wasData = true;
67869           sidebar.show(dataEditor.datum(datum2));
67870           selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
67871         } else if (datum2 instanceof osmNote) {
67872           if (context.mode().id === "drag-note")
67873             return;
67874           _wasNote = true;
67875           var osm = services.osm;
67876           if (osm) {
67877             datum2 = osm.getNote(datum2.id);
67878           }
67879           sidebar.show(noteEditor.note(datum2));
67880           selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
67881         } else if (datum2 instanceof QAItem) {
67882           _wasQaItem = true;
67883           var errService = services[datum2.service];
67884           if (errService) {
67885             datum2 = errService.getError(datum2.id);
67886           }
67887           var errEditor;
67888           if (datum2.service === "keepRight") {
67889             errEditor = keepRightEditor;
67890           } else if (datum2.service === "osmose") {
67891             errEditor = osmoseEditor;
67892           } else {
67893             errEditor = improveOsmEditor;
67894           }
67895           context.container().selectAll(".qaItem." + datum2.service).classed("hover", function(d) {
67896             return d.id === datum2.id;
67897           });
67898           sidebar.show(errEditor.error(datum2));
67899           selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
67900         } else if (!_current && datum2 instanceof osmEntity) {
67901           featureListWrap.classed("inspector-hidden", true);
67902           inspectorWrap.classed("inspector-hidden", false).classed("inspector-hover", true);
67903           if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), [datum2.id]) || inspector.state() !== "hover") {
67904             inspector.state("hover").entityIDs([datum2.id]).newFeature(false);
67905             inspectorWrap.call(inspector);
67906           }
67907         } else if (!_current) {
67908           featureListWrap.classed("inspector-hidden", false);
67909           inspectorWrap.classed("inspector-hidden", true);
67910           inspector.state("hide");
67911         } else if (_wasData || _wasNote || _wasQaItem) {
67912           _wasNote = false;
67913           _wasData = false;
67914           _wasQaItem = false;
67915           context.container().selectAll(".note").classed("hover", false);
67916           context.container().selectAll(".qaItem").classed("hover", false);
67917           sidebar.hide();
67918         }
67919       }
67920       sidebar.hover = throttle_default(hover, 200);
67921       sidebar.intersects = function(extent) {
67922         var rect = selection2.node().getBoundingClientRect();
67923         return extent.intersects([
67924           context.projection.invert([0, rect.height]),
67925           context.projection.invert([rect.width, 0])
67926         ]);
67927       };
67928       sidebar.select = function(ids, newFeature) {
67929         sidebar.hide();
67930         if (ids && ids.length) {
67931           var entity = ids.length === 1 && context.entity(ids[0]);
67932           if (entity && newFeature && selection2.classed("collapsed")) {
67933             var extent = entity.extent(context.graph());
67934             sidebar.expand(sidebar.intersects(extent));
67935           }
67936           featureListWrap.classed("inspector-hidden", true);
67937           inspectorWrap.classed("inspector-hidden", false).classed("inspector-hover", false);
67938           inspector.state("select").entityIDs(ids).newFeature(newFeature);
67939           inspectorWrap.call(inspector);
67940         } else {
67941           inspector.state("hide");
67942         }
67943       };
67944       sidebar.showPresetList = function() {
67945         inspector.showList();
67946       };
67947       sidebar.show = function(component, element) {
67948         featureListWrap.classed("inspector-hidden", true);
67949         inspectorWrap.classed("inspector-hidden", true);
67950         if (_current)
67951           _current.remove();
67952         _current = selection2.append("div").attr("class", "sidebar-component").call(component, element);
67953       };
67954       sidebar.hide = function() {
67955         featureListWrap.classed("inspector-hidden", false);
67956         inspectorWrap.classed("inspector-hidden", true);
67957         if (_current)
67958           _current.remove();
67959         _current = null;
67960       };
67961       sidebar.expand = function(moveMap) {
67962         if (selection2.classed("collapsed")) {
67963           sidebar.toggle(moveMap);
67964         }
67965       };
67966       sidebar.collapse = function(moveMap) {
67967         if (!selection2.classed("collapsed")) {
67968           sidebar.toggle(moveMap);
67969         }
67970       };
67971       sidebar.toggle = function(moveMap) {
67972         if (context.inIntro())
67973           return;
67974         var isCollapsed = selection2.classed("collapsed");
67975         var isCollapsing = !isCollapsed;
67976         var isRTL = _mainLocalizer.textDirection() === "rtl";
67977         var scaleX = isRTL ? 0 : 1;
67978         var xMarginProperty = isRTL ? "margin-right" : "margin-left";
67979         sidebarWidth = selection2.node().getBoundingClientRect().width;
67980         selection2.style("width", sidebarWidth + "px");
67981         var startMargin, endMargin, lastMargin;
67982         if (isCollapsing) {
67983           startMargin = lastMargin = 0;
67984           endMargin = -sidebarWidth;
67985         } else {
67986           startMargin = lastMargin = -sidebarWidth;
67987           endMargin = 0;
67988         }
67989         if (!isCollapsing) {
67990           selection2.classed("collapsed", isCollapsing);
67991         }
67992         selection2.transition().style(xMarginProperty, endMargin + "px").tween("panner", function() {
67993           var i2 = number_default(startMargin, endMargin);
67994           return function(t) {
67995             var dx = lastMargin - Math.round(i2(t));
67996             lastMargin = lastMargin - dx;
67997             context.ui().onResize(moveMap ? void 0 : [dx * scaleX, 0]);
67998           };
67999         }).on("end", function() {
68000           if (isCollapsing) {
68001             selection2.classed("collapsed", isCollapsing);
68002           }
68003           if (!isCollapsing) {
68004             var containerWidth2 = container.node().getBoundingClientRect().width;
68005             var widthPct = sidebarWidth / containerWidth2 * 100;
68006             selection2.style(xMarginProperty, null).style("width", widthPct + "%");
68007           }
68008         });
68009       };
68010       resizer.on("dblclick", function(d3_event) {
68011         d3_event.preventDefault();
68012         if (d3_event.sourceEvent) {
68013           d3_event.sourceEvent.preventDefault();
68014         }
68015         sidebar.toggle();
68016       });
68017       context.map().on("crossEditableZoom.sidebar", function(within) {
68018         if (!within && !selection2.select(".inspector-hover").empty()) {
68019           hover([]);
68020         }
68021       });
68022     }
68023     sidebar.showPresetList = function() {
68024     };
68025     sidebar.hover = function() {
68026     };
68027     sidebar.hover.cancel = function() {
68028     };
68029     sidebar.intersects = function() {
68030     };
68031     sidebar.select = function() {
68032     };
68033     sidebar.show = function() {
68034     };
68035     sidebar.hide = function() {
68036     };
68037     sidebar.expand = function() {
68038     };
68039     sidebar.collapse = function() {
68040     };
68041     sidebar.toggle = function() {
68042     };
68043     return sidebar;
68044   }
68045
68046   // modules/modes/draw_area.js
68047   function modeDrawArea(context, wayID, startGraph, button) {
68048     var mode = {
68049       button,
68050       id: "draw-area"
68051     };
68052     var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on("rejectedSelfIntersection.modeDrawArea", function() {
68053       context.ui().flash.iconName("#iD-icon-no").label(_t.append("self_intersection.error.areas"))();
68054     });
68055     mode.wayID = wayID;
68056     mode.enter = function() {
68057       context.install(behavior);
68058     };
68059     mode.exit = function() {
68060       context.uninstall(behavior);
68061     };
68062     mode.selectedIDs = function() {
68063       return [wayID];
68064     };
68065     mode.activeID = function() {
68066       return behavior && behavior.activeID() || [];
68067     };
68068     return mode;
68069   }
68070
68071   // modules/modes/add_area.js
68072   function modeAddArea(context, mode) {
68073     mode.id = "add-area";
68074     var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode);
68075     var defaultTags = { area: "yes" };
68076     if (mode.preset)
68077       defaultTags = mode.preset.setTags(defaultTags, "area");
68078     function actionClose(wayId) {
68079       return function(graph) {
68080         return graph.replace(graph.entity(wayId).close());
68081       };
68082     }
68083     function start2(loc) {
68084       var startGraph = context.graph();
68085       var node = osmNode({ loc });
68086       var way = osmWay({ tags: defaultTags });
68087       context.perform(
68088         actionAddEntity(node),
68089         actionAddEntity(way),
68090         actionAddVertex(way.id, node.id),
68091         actionClose(way.id)
68092       );
68093       context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
68094     }
68095     function startFromWay(loc, edge) {
68096       var startGraph = context.graph();
68097       var node = osmNode({ loc });
68098       var way = osmWay({ tags: defaultTags });
68099       context.perform(
68100         actionAddEntity(node),
68101         actionAddEntity(way),
68102         actionAddVertex(way.id, node.id),
68103         actionClose(way.id),
68104         actionAddMidpoint({ loc, edge }, node)
68105       );
68106       context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
68107     }
68108     function startFromNode(node) {
68109       var startGraph = context.graph();
68110       var way = osmWay({ tags: defaultTags });
68111       context.perform(
68112         actionAddEntity(way),
68113         actionAddVertex(way.id, node.id),
68114         actionClose(way.id)
68115       );
68116       context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
68117     }
68118     mode.enter = function() {
68119       context.install(behavior);
68120     };
68121     mode.exit = function() {
68122       context.uninstall(behavior);
68123     };
68124     return mode;
68125   }
68126
68127   // modules/modes/add_line.js
68128   function modeAddLine(context, mode) {
68129     mode.id = "add-line";
68130     var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode);
68131     var defaultTags = {};
68132     if (mode.preset)
68133       defaultTags = mode.preset.setTags(defaultTags, "line");
68134     function start2(loc) {
68135       var startGraph = context.graph();
68136       var node = osmNode({ loc });
68137       var way = osmWay({ tags: defaultTags });
68138       context.perform(
68139         actionAddEntity(node),
68140         actionAddEntity(way),
68141         actionAddVertex(way.id, node.id)
68142       );
68143       context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
68144     }
68145     function startFromWay(loc, edge) {
68146       var startGraph = context.graph();
68147       var node = osmNode({ loc });
68148       var way = osmWay({ tags: defaultTags });
68149       context.perform(
68150         actionAddEntity(node),
68151         actionAddEntity(way),
68152         actionAddVertex(way.id, node.id),
68153         actionAddMidpoint({ loc, edge }, node)
68154       );
68155       context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
68156     }
68157     function startFromNode(node) {
68158       var startGraph = context.graph();
68159       var way = osmWay({ tags: defaultTags });
68160       context.perform(
68161         actionAddEntity(way),
68162         actionAddVertex(way.id, node.id)
68163       );
68164       context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
68165     }
68166     mode.enter = function() {
68167       context.install(behavior);
68168     };
68169     mode.exit = function() {
68170       context.uninstall(behavior);
68171     };
68172     return mode;
68173   }
68174
68175   // modules/modes/add_point.js
68176   function modeAddPoint(context, mode) {
68177     mode.id = "add-point";
68178     var behavior = behaviorDraw(context).on("click", add).on("clickWay", addWay).on("clickNode", addNode).on("cancel", cancel).on("finish", cancel);
68179     var defaultTags = {};
68180     if (mode.preset)
68181       defaultTags = mode.preset.setTags(defaultTags, "point");
68182     function add(loc) {
68183       var node = osmNode({ loc, tags: defaultTags });
68184       context.perform(
68185         actionAddEntity(node),
68186         _t("operations.add.annotation.point")
68187       );
68188       enterSelectMode(node);
68189     }
68190     function addWay(loc, edge) {
68191       var node = osmNode({ tags: defaultTags });
68192       context.perform(
68193         actionAddMidpoint({ loc, edge }, node),
68194         _t("operations.add.annotation.vertex")
68195       );
68196       enterSelectMode(node);
68197     }
68198     function enterSelectMode(node) {
68199       context.enter(
68200         modeSelect(context, [node.id]).newFeature(true)
68201       );
68202     }
68203     function addNode(node) {
68204       if (Object.keys(defaultTags).length === 0) {
68205         enterSelectMode(node);
68206         return;
68207       }
68208       var tags = Object.assign({}, node.tags);
68209       for (var key in defaultTags) {
68210         tags[key] = defaultTags[key];
68211       }
68212       context.perform(
68213         actionChangeTags(node.id, tags),
68214         _t("operations.add.annotation.point")
68215       );
68216       enterSelectMode(node);
68217     }
68218     function cancel() {
68219       context.enter(modeBrowse(context));
68220     }
68221     mode.enter = function() {
68222       context.install(behavior);
68223     };
68224     mode.exit = function() {
68225       context.uninstall(behavior);
68226     };
68227     return mode;
68228   }
68229
68230   // modules/modes/select_note.js
68231   function modeSelectNote(context, selectedNoteID) {
68232     var mode = {
68233       id: "select-note",
68234       button: "browse"
68235     };
68236     var _keybinding = utilKeybinding("select-note");
68237     var _noteEditor = uiNoteEditor(context).on("change", function() {
68238       context.map().pan([0, 0]);
68239       var note = checkSelectedID();
68240       if (!note)
68241         return;
68242       context.ui().sidebar.show(_noteEditor.note(note));
68243     });
68244     var _behaviors = [
68245       behaviorBreathe(context),
68246       behaviorHover(context),
68247       behaviorSelect(context),
68248       behaviorLasso(context),
68249       modeDragNode(context).behavior,
68250       modeDragNote(context).behavior
68251     ];
68252     var _newFeature = false;
68253     function checkSelectedID() {
68254       if (!services.osm)
68255         return;
68256       var note = services.osm.getNote(selectedNoteID);
68257       if (!note) {
68258         context.enter(modeBrowse(context));
68259       }
68260       return note;
68261     }
68262     function selectNote(d3_event, drawn) {
68263       if (!checkSelectedID())
68264         return;
68265       var selection2 = context.surface().selectAll(".layer-notes .note-" + selectedNoteID);
68266       if (selection2.empty()) {
68267         var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
68268         if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
68269           context.enter(modeBrowse(context));
68270         }
68271       } else {
68272         selection2.classed("selected", true);
68273         context.selectedNoteID(selectedNoteID);
68274       }
68275     }
68276     function esc() {
68277       if (context.container().select(".combobox").size())
68278         return;
68279       context.enter(modeBrowse(context));
68280     }
68281     mode.zoomToSelected = function() {
68282       if (!services.osm)
68283         return;
68284       var note = services.osm.getNote(selectedNoteID);
68285       if (note) {
68286         context.map().centerZoomEase(note.loc, 20);
68287       }
68288     };
68289     mode.newFeature = function(val) {
68290       if (!arguments.length)
68291         return _newFeature;
68292       _newFeature = val;
68293       return mode;
68294     };
68295     mode.enter = function() {
68296       var note = checkSelectedID();
68297       if (!note)
68298         return;
68299       _behaviors.forEach(context.install);
68300       _keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
68301       select_default2(document).call(_keybinding);
68302       selectNote();
68303       var sidebar = context.ui().sidebar;
68304       sidebar.show(_noteEditor.note(note).newNote(_newFeature));
68305       sidebar.expand(sidebar.intersects(note.extent()));
68306       context.map().on("drawn.select", selectNote);
68307     };
68308     mode.exit = function() {
68309       _behaviors.forEach(context.uninstall);
68310       select_default2(document).call(_keybinding.unbind);
68311       context.surface().selectAll(".layer-notes .selected").classed("selected hover", false);
68312       context.map().on("drawn.select", null);
68313       context.ui().sidebar.hide();
68314       context.selectedNoteID(null);
68315     };
68316     return mode;
68317   }
68318
68319   // modules/modes/add_note.js
68320   function modeAddNote(context) {
68321     var mode = {
68322       id: "add-note",
68323       button: "note",
68324       description: _t.append("modes.add_note.description"),
68325       key: _t("modes.add_note.key")
68326     };
68327     var behavior = behaviorDraw(context).on("click", add).on("cancel", cancel).on("finish", cancel);
68328     function add(loc) {
68329       var osm = services.osm;
68330       if (!osm)
68331         return;
68332       var note = osmNote({ loc, status: "open", comments: [] });
68333       osm.replaceNote(note);
68334       context.map().pan([0, 0]);
68335       context.selectedNoteID(note.id).enter(modeSelectNote(context, note.id).newFeature(true));
68336     }
68337     function cancel() {
68338       context.enter(modeBrowse(context));
68339     }
68340     mode.enter = function() {
68341       context.install(behavior);
68342     };
68343     mode.exit = function() {
68344       context.uninstall(behavior);
68345     };
68346     return mode;
68347   }
68348
68349   // modules/modes/save.js
68350   function modeSave(context) {
68351     var mode = { id: "save" };
68352     var keybinding = utilKeybinding("modeSave");
68353     var commit = uiCommit(context).on("cancel", cancel);
68354     var _conflictsUi;
68355     var _location;
68356     var _success;
68357     var uploader = context.uploader().on("saveStarted.modeSave", function() {
68358       keybindingOff();
68359     }).on("willAttemptUpload.modeSave", prepareForSuccess).on("progressChanged.modeSave", showProgress).on("resultNoChanges.modeSave", function() {
68360       cancel();
68361     }).on("resultErrors.modeSave", showErrors).on("resultConflicts.modeSave", showConflicts).on("resultSuccess.modeSave", showSuccess);
68362     function cancel() {
68363       context.enter(modeBrowse(context));
68364     }
68365     function showProgress(num, total) {
68366       var modal = context.container().select(".loading-modal .modal-section");
68367       var progress = modal.selectAll(".progress").data([0]);
68368       progress.enter().append("div").attr("class", "progress").merge(progress).text(_t("save.conflict_progress", { num, total }));
68369     }
68370     function showConflicts(changeset, conflicts, origChanges) {
68371       var selection2 = context.container().select(".sidebar").append("div").attr("class", "sidebar-component");
68372       context.container().selectAll(".main-content").classed("active", true).classed("inactive", false);
68373       _conflictsUi = uiConflicts(context).conflictList(conflicts).origChanges(origChanges).on("cancel", function() {
68374         context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
68375         selection2.remove();
68376         keybindingOn();
68377         uploader.cancelConflictResolution();
68378       }).on("save", function() {
68379         context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
68380         selection2.remove();
68381         uploader.processResolvedConflicts(changeset);
68382       });
68383       selection2.call(_conflictsUi);
68384     }
68385     function showErrors(errors) {
68386       keybindingOn();
68387       var selection2 = uiConfirm(context.container());
68388       selection2.select(".modal-section.header").append("h3").text(_t("save.error"));
68389       addErrors(selection2, errors);
68390       selection2.okButton();
68391     }
68392     function addErrors(selection2, data) {
68393       var message = selection2.select(".modal-section.message-text");
68394       var items = message.selectAll(".error-container").data(data);
68395       var enter = items.enter().append("div").attr("class", "error-container");
68396       enter.append("a").attr("class", "error-description").attr("href", "#").classed("hide-toggle", true).text(function(d) {
68397         return d.msg || _t("save.unknown_error_details");
68398       }).on("click", function(d3_event) {
68399         d3_event.preventDefault();
68400         var error = select_default2(this);
68401         var detail = select_default2(this.nextElementSibling);
68402         var exp2 = error.classed("expanded");
68403         detail.style("display", exp2 ? "none" : "block");
68404         error.classed("expanded", !exp2);
68405       });
68406       var details = enter.append("div").attr("class", "error-detail-container").style("display", "none");
68407       details.append("ul").attr("class", "error-detail-list").selectAll("li").data(function(d) {
68408         return d.details || [];
68409       }).enter().append("li").attr("class", "error-detail-item").text(function(d) {
68410         return d;
68411       });
68412       items.exit().remove();
68413     }
68414     function showSuccess(changeset) {
68415       commit.reset();
68416       var ui = _success.changeset(changeset).location(_location).on("cancel", function() {
68417         context.ui().sidebar.hide();
68418       });
68419       context.enter(modeBrowse(context).sidebar(ui));
68420     }
68421     function keybindingOn() {
68422       select_default2(document).call(keybinding.on("\u238B", cancel, true));
68423     }
68424     function keybindingOff() {
68425       select_default2(document).call(keybinding.unbind);
68426     }
68427     function prepareForSuccess() {
68428       _success = uiSuccess(context);
68429       _location = null;
68430       if (!services.geocoder)
68431         return;
68432       services.geocoder.reverse(context.map().center(), function(err, result) {
68433         if (err || !result || !result.address)
68434           return;
68435         var addr = result.address;
68436         var place = addr && (addr.town || addr.city || addr.county) || "";
68437         var region = addr && (addr.state || addr.country) || "";
68438         var separator = place && region ? _t("success.thank_you_where.separator") : "";
68439         _location = _t(
68440           "success.thank_you_where.format",
68441           { place, separator, region }
68442         );
68443       });
68444     }
68445     mode.selectedIDs = function() {
68446       return _conflictsUi ? _conflictsUi.shownEntityIds() : [];
68447     };
68448     mode.enter = function() {
68449       context.ui().sidebar.expand();
68450       function done() {
68451         context.ui().sidebar.show(commit);
68452       }
68453       keybindingOn();
68454       context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
68455       var osm = context.connection();
68456       if (!osm) {
68457         cancel();
68458         return;
68459       }
68460       if (osm.authenticated()) {
68461         done();
68462       } else {
68463         osm.authenticate(function(err) {
68464           if (err) {
68465             cancel();
68466           } else {
68467             done();
68468           }
68469         });
68470       }
68471     };
68472     mode.exit = function() {
68473       keybindingOff();
68474       context.container().selectAll(".main-content").classed("active", true).classed("inactive", false);
68475       context.ui().sidebar.hide();
68476     };
68477     return mode;
68478   }
68479
68480   // modules/modes/select_error.js
68481   function modeSelectError(context, selectedErrorID, selectedErrorService) {
68482     var mode = {
68483       id: "select-error",
68484       button: "browse"
68485     };
68486     var keybinding = utilKeybinding("select-error");
68487     var errorService = services[selectedErrorService];
68488     var errorEditor;
68489     switch (selectedErrorService) {
68490       case "improveOSM":
68491         errorEditor = uiImproveOsmEditor(context).on("change", function() {
68492           context.map().pan([0, 0]);
68493           var error = checkSelectedID();
68494           if (!error)
68495             return;
68496           context.ui().sidebar.show(errorEditor.error(error));
68497         });
68498         break;
68499       case "keepRight":
68500         errorEditor = uiKeepRightEditor(context).on("change", function() {
68501           context.map().pan([0, 0]);
68502           var error = checkSelectedID();
68503           if (!error)
68504             return;
68505           context.ui().sidebar.show(errorEditor.error(error));
68506         });
68507         break;
68508       case "osmose":
68509         errorEditor = uiOsmoseEditor(context).on("change", function() {
68510           context.map().pan([0, 0]);
68511           var error = checkSelectedID();
68512           if (!error)
68513             return;
68514           context.ui().sidebar.show(errorEditor.error(error));
68515         });
68516         break;
68517     }
68518     var behaviors = [
68519       behaviorBreathe(context),
68520       behaviorHover(context),
68521       behaviorSelect(context),
68522       behaviorLasso(context),
68523       modeDragNode(context).behavior,
68524       modeDragNote(context).behavior
68525     ];
68526     function checkSelectedID() {
68527       if (!errorService)
68528         return;
68529       var error = errorService.getError(selectedErrorID);
68530       if (!error) {
68531         context.enter(modeBrowse(context));
68532       }
68533       return error;
68534     }
68535     mode.zoomToSelected = function() {
68536       if (!errorService)
68537         return;
68538       var error = errorService.getError(selectedErrorID);
68539       if (error) {
68540         context.map().centerZoomEase(error.loc, 20);
68541       }
68542     };
68543     mode.enter = function() {
68544       var error = checkSelectedID();
68545       if (!error)
68546         return;
68547       behaviors.forEach(context.install);
68548       keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
68549       select_default2(document).call(keybinding);
68550       selectError();
68551       var sidebar = context.ui().sidebar;
68552       sidebar.show(errorEditor.error(error));
68553       context.map().on("drawn.select-error", selectError);
68554       function selectError(d3_event, drawn) {
68555         if (!checkSelectedID())
68556           return;
68557         var selection2 = context.surface().selectAll(".itemId-" + selectedErrorID + "." + selectedErrorService);
68558         if (selection2.empty()) {
68559           var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
68560           if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
68561             context.enter(modeBrowse(context));
68562           }
68563         } else {
68564           selection2.classed("selected", true);
68565           context.selectedErrorID(selectedErrorID);
68566         }
68567       }
68568       function esc() {
68569         if (context.container().select(".combobox").size())
68570           return;
68571         context.enter(modeBrowse(context));
68572       }
68573     };
68574     mode.exit = function() {
68575       behaviors.forEach(context.uninstall);
68576       select_default2(document).call(keybinding.unbind);
68577       context.surface().selectAll(".qaItem.selected").classed("selected hover", false);
68578       context.map().on("drawn.select-error", null);
68579       context.ui().sidebar.hide();
68580       context.selectedErrorID(null);
68581       context.features().forceVisible([]);
68582     };
68583     return mode;
68584   }
68585
68586   // modules/ui/tools/modes.js
68587   function uiToolDrawModes(context) {
68588     var tool = {
68589       id: "old_modes",
68590       label: _t.append("toolbar.add_feature")
68591     };
68592     var modes = [
68593       modeAddPoint(context, {
68594         title: _t.append("modes.add_point.title"),
68595         button: "point",
68596         description: _t.append("modes.add_point.description"),
68597         preset: _mainPresetIndex.item("point"),
68598         key: "1"
68599       }),
68600       modeAddLine(context, {
68601         title: _t.append("modes.add_line.title"),
68602         button: "line",
68603         description: _t.append("modes.add_line.description"),
68604         preset: _mainPresetIndex.item("line"),
68605         key: "2"
68606       }),
68607       modeAddArea(context, {
68608         title: _t.append("modes.add_area.title"),
68609         button: "area",
68610         description: _t.append("modes.add_area.description"),
68611         preset: _mainPresetIndex.item("area"),
68612         key: "3"
68613       })
68614     ];
68615     function enabled(_mode) {
68616       return osmEditable();
68617     }
68618     function osmEditable() {
68619       return context.editable();
68620     }
68621     modes.forEach(function(mode) {
68622       context.keybinding().on(mode.key, function() {
68623         if (!enabled(mode))
68624           return;
68625         if (mode.id === context.mode().id) {
68626           context.enter(modeBrowse(context));
68627         } else {
68628           context.enter(mode);
68629         }
68630       });
68631     });
68632     tool.render = function(selection2) {
68633       var wrap2 = selection2.append("div").attr("class", "joined").style("display", "flex");
68634       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
68635       context.map().on("move.modes", debouncedUpdate).on("drawn.modes", debouncedUpdate);
68636       context.on("enter.modes", update);
68637       update();
68638       function update() {
68639         var buttons = wrap2.selectAll("button.add-button").data(modes, function(d) {
68640           return d.id;
68641         });
68642         buttons.exit().remove();
68643         var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
68644           return d.id + " add-button bar-button";
68645         }).on("click.mode-buttons", function(d3_event, d) {
68646           if (!enabled(d))
68647             return;
68648           var currMode = context.mode().id;
68649           if (/^draw/.test(currMode))
68650             return;
68651           if (d.id === currMode) {
68652             context.enter(modeBrowse(context));
68653           } else {
68654             context.enter(d);
68655           }
68656         }).call(
68657           uiTooltip().placement("bottom").title(function(d) {
68658             return d.description;
68659           }).keys(function(d) {
68660             return [d.key];
68661           }).scrollContainer(context.container().select(".top-toolbar"))
68662         );
68663         buttonsEnter.each(function(d) {
68664           select_default2(this).call(svgIcon("#iD-icon-" + d.button));
68665         });
68666         buttonsEnter.append("span").attr("class", "label").text("").each(function(mode) {
68667           mode.title(select_default2(this));
68668         });
68669         if (buttons.enter().size() || buttons.exit().size()) {
68670           context.ui().checkOverflow(".top-toolbar", true);
68671         }
68672         buttons = buttons.merge(buttonsEnter).attr("aria-disabled", function(d) {
68673           return !enabled(d);
68674         }).classed("disabled", function(d) {
68675           return !enabled(d);
68676         }).attr("aria-pressed", function(d) {
68677           return context.mode() && context.mode().button === d.button;
68678         }).classed("active", function(d) {
68679           return context.mode() && context.mode().button === d.button;
68680         });
68681       }
68682     };
68683     return tool;
68684   }
68685
68686   // modules/ui/tools/notes.js
68687   function uiToolNotes(context) {
68688     var tool = {
68689       id: "notes",
68690       label: _t.append("modes.add_note.label")
68691     };
68692     var mode = modeAddNote(context);
68693     function enabled() {
68694       return notesEnabled() && notesEditable();
68695     }
68696     function notesEnabled() {
68697       var noteLayer = context.layers().layer("notes");
68698       return noteLayer && noteLayer.enabled();
68699     }
68700     function notesEditable() {
68701       var mode2 = context.mode();
68702       return context.map().notesEditable() && mode2 && mode2.id !== "save";
68703     }
68704     context.keybinding().on(mode.key, function() {
68705       if (!enabled())
68706         return;
68707       if (mode.id === context.mode().id) {
68708         context.enter(modeBrowse(context));
68709       } else {
68710         context.enter(mode);
68711       }
68712     });
68713     tool.render = function(selection2) {
68714       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
68715       context.map().on("move.notes", debouncedUpdate).on("drawn.notes", debouncedUpdate);
68716       context.on("enter.notes", update);
68717       update();
68718       function update() {
68719         var showNotes = notesEnabled();
68720         var data = showNotes ? [mode] : [];
68721         var buttons = selection2.selectAll("button.add-button").data(data, function(d) {
68722           return d.id;
68723         });
68724         buttons.exit().remove();
68725         var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
68726           return d.id + " add-button bar-button";
68727         }).on("click.notes", function(d3_event, d) {
68728           if (!enabled())
68729             return;
68730           var currMode = context.mode().id;
68731           if (/^draw/.test(currMode))
68732             return;
68733           if (d.id === currMode) {
68734             context.enter(modeBrowse(context));
68735           } else {
68736             context.enter(d);
68737           }
68738         }).call(
68739           uiTooltip().placement("bottom").title(function(d) {
68740             return d.description;
68741           }).keys(function(d) {
68742             return [d.key];
68743           }).scrollContainer(context.container().select(".top-toolbar"))
68744         );
68745         buttonsEnter.each(function(d) {
68746           select_default2(this).call(svgIcon(d.icon || "#iD-icon-" + d.button));
68747         });
68748         if (buttons.enter().size() || buttons.exit().size()) {
68749           context.ui().checkOverflow(".top-toolbar", true);
68750         }
68751         buttons = buttons.merge(buttonsEnter).classed("disabled", function() {
68752           return !enabled();
68753         }).attr("aria-disabled", function() {
68754           return !enabled();
68755         }).classed("active", function(d) {
68756           return context.mode() && context.mode().button === d.button;
68757         }).attr("aria-pressed", function(d) {
68758           return context.mode() && context.mode().button === d.button;
68759         });
68760       }
68761     };
68762     tool.uninstall = function() {
68763       context.on("enter.editor.notes", null).on("exit.editor.notes", null).on("enter.notes", null);
68764       context.map().on("move.notes", null).on("drawn.notes", null);
68765     };
68766     return tool;
68767   }
68768
68769   // modules/ui/tools/save.js
68770   function uiToolSave(context) {
68771     var tool = {
68772       id: "save",
68773       label: _t.append("save.title")
68774     };
68775     var button = null;
68776     var tooltipBehavior = null;
68777     var history = context.history();
68778     var key = uiCmd("\u2318S");
68779     var _numChanges = 0;
68780     function isSaving() {
68781       var mode = context.mode();
68782       return mode && mode.id === "save";
68783     }
68784     function isDisabled() {
68785       return _numChanges === 0 || isSaving();
68786     }
68787     function save(d3_event) {
68788       d3_event.preventDefault();
68789       if (!context.inIntro() && !isSaving() && history.hasChanges()) {
68790         context.enter(modeSave(context));
68791       }
68792     }
68793     function bgColor(numChanges) {
68794       var step;
68795       if (numChanges === 0) {
68796         return null;
68797       } else if (numChanges <= 50) {
68798         step = numChanges / 50;
68799         return rgb_default("#fff", "#ff8")(step);
68800       } else {
68801         step = Math.min((numChanges - 50) / 50, 1);
68802         return rgb_default("#ff8", "#f88")(step);
68803       }
68804     }
68805     function updateCount() {
68806       var val = history.difference().summary().length;
68807       if (val === _numChanges)
68808         return;
68809       _numChanges = val;
68810       if (tooltipBehavior) {
68811         tooltipBehavior.title(() => _t.append(_numChanges > 0 ? "save.help" : "save.no_changes")).keys([key]);
68812       }
68813       if (button) {
68814         button.classed("disabled", isDisabled()).style("background", bgColor(_numChanges));
68815         button.select("span.count").text(_numChanges);
68816       }
68817     }
68818     tool.render = function(selection2) {
68819       tooltipBehavior = uiTooltip().placement("bottom").title(() => _t.append("save.no_changes")).keys([key]).scrollContainer(context.container().select(".top-toolbar"));
68820       var lastPointerUpType;
68821       button = selection2.append("button").attr("class", "save disabled bar-button").on("pointerup", function(d3_event) {
68822         lastPointerUpType = d3_event.pointerType;
68823       }).on("click", function(d3_event) {
68824         save(d3_event);
68825         if (_numChanges === 0 && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) {
68826           context.ui().flash.duration(2e3).iconName("#iD-icon-save").iconClass("disabled").label(_t.append("save.no_changes"))();
68827         }
68828         lastPointerUpType = null;
68829       }).call(tooltipBehavior);
68830       button.call(svgIcon("#iD-icon-save"));
68831       button.append("span").attr("class", "count").attr("aria-hidden", "true").text("0");
68832       updateCount();
68833       context.keybinding().on(key, save, true);
68834       context.history().on("change.save", updateCount);
68835       context.on("enter.save", function() {
68836         if (button) {
68837           button.classed("disabled", isDisabled());
68838           if (isSaving()) {
68839             button.call(tooltipBehavior.hide);
68840           }
68841         }
68842       });
68843     };
68844     tool.uninstall = function() {
68845       context.keybinding().off(key, true);
68846       context.history().on("change.save", null);
68847       context.on("enter.save", null);
68848       button = null;
68849       tooltipBehavior = null;
68850     };
68851     return tool;
68852   }
68853
68854   // modules/ui/tools/sidebar_toggle.js
68855   function uiToolSidebarToggle(context) {
68856     var tool = {
68857       id: "sidebar_toggle",
68858       label: _t.append("toolbar.inspect")
68859     };
68860     tool.render = function(selection2) {
68861       selection2.append("button").attr("class", "bar-button").attr("aria-label", _t("sidebar.tooltip")).on("click", function() {
68862         context.ui().sidebar.toggle();
68863       }).call(
68864         uiTooltip().placement("bottom").title(() => _t.append("sidebar.tooltip")).keys([_t("sidebar.key")]).scrollContainer(context.container().select(".top-toolbar"))
68865       ).call(svgIcon("#iD-icon-sidebar-" + (_mainLocalizer.textDirection() === "rtl" ? "right" : "left")));
68866     };
68867     return tool;
68868   }
68869
68870   // modules/ui/tools/undo_redo.js
68871   function uiToolUndoRedo(context) {
68872     var tool = {
68873       id: "undo_redo",
68874       label: _t.append("toolbar.undo_redo")
68875     };
68876     var commands = [{
68877       id: "undo",
68878       cmd: uiCmd("\u2318Z"),
68879       action: function() {
68880         context.undo();
68881       },
68882       annotation: function() {
68883         return context.history().undoAnnotation();
68884       },
68885       icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")
68886     }, {
68887       id: "redo",
68888       cmd: uiCmd("\u2318\u21E7Z"),
68889       action: function() {
68890         context.redo();
68891       },
68892       annotation: function() {
68893         return context.history().redoAnnotation();
68894       },
68895       icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "undo" : "redo")
68896     }];
68897     function editable() {
68898       return context.mode() && context.mode().id !== "save" && context.map().editableDataEnabled(
68899         true
68900         /* ignore min zoom */
68901       );
68902     }
68903     tool.render = function(selection2) {
68904       var tooltipBehavior = uiTooltip().placement("bottom").title(function(d) {
68905         return d.annotation() ? _t.append(d.id + ".tooltip", { action: d.annotation() }) : _t.append(d.id + ".nothing");
68906       }).keys(function(d) {
68907         return [d.cmd];
68908       }).scrollContainer(context.container().select(".top-toolbar"));
68909       var lastPointerUpType;
68910       var buttons = selection2.selectAll("button").data(commands).enter().append("button").attr("class", function(d) {
68911         return "disabled " + d.id + "-button bar-button";
68912       }).on("pointerup", function(d3_event) {
68913         lastPointerUpType = d3_event.pointerType;
68914       }).on("click", function(d3_event, d) {
68915         d3_event.preventDefault();
68916         var annotation = d.annotation();
68917         if (editable() && annotation) {
68918           d.action();
68919         }
68920         if (editable() && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) {
68921           var label = annotation ? _t.append(d.id + ".tooltip", { action: annotation }) : _t.append(d.id + ".nothing");
68922           context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass(annotation ? "" : "disabled").label(label)();
68923         }
68924         lastPointerUpType = null;
68925       }).call(tooltipBehavior);
68926       buttons.each(function(d) {
68927         select_default2(this).call(svgIcon("#" + d.icon));
68928       });
68929       context.keybinding().on(commands[0].cmd, function(d3_event) {
68930         d3_event.preventDefault();
68931         if (editable())
68932           commands[0].action();
68933       }).on(commands[1].cmd, function(d3_event) {
68934         d3_event.preventDefault();
68935         if (editable())
68936           commands[1].action();
68937       });
68938       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
68939       context.map().on("move.undo_redo", debouncedUpdate).on("drawn.undo_redo", debouncedUpdate);
68940       context.history().on("change.undo_redo", function(difference) {
68941         if (difference)
68942           update();
68943       });
68944       context.on("enter.undo_redo", update);
68945       function update() {
68946         buttons.classed("disabled", function(d) {
68947           return !editable() || !d.annotation();
68948         }).each(function() {
68949           var selection3 = select_default2(this);
68950           if (!selection3.select(".tooltip.in").empty()) {
68951             selection3.call(tooltipBehavior.updateContent);
68952           }
68953         });
68954       }
68955     };
68956     tool.uninstall = function() {
68957       context.keybinding().off(commands[0].cmd).off(commands[1].cmd);
68958       context.map().on("move.undo_redo", null).on("drawn.undo_redo", null);
68959       context.history().on("change.undo_redo", null);
68960       context.on("enter.undo_redo", null);
68961     };
68962     return tool;
68963   }
68964
68965   // modules/ui/top_toolbar.js
68966   function uiTopToolbar(context) {
68967     var sidebarToggle = uiToolSidebarToggle(context), modes = uiToolDrawModes(context), notes = uiToolNotes(context), undoRedo = uiToolUndoRedo(context), save = uiToolSave(context);
68968     function notesEnabled() {
68969       var noteLayer = context.layers().layer("notes");
68970       return noteLayer && noteLayer.enabled();
68971     }
68972     function topToolbar(bar) {
68973       bar.on("wheel.topToolbar", function(d3_event) {
68974         if (!d3_event.deltaX) {
68975           bar.node().scrollLeft += d3_event.deltaY;
68976         }
68977       });
68978       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
68979       context.layers().on("change.topToolbar", debouncedUpdate);
68980       update();
68981       function update() {
68982         var tools = [
68983           sidebarToggle,
68984           "spacer",
68985           modes
68986         ];
68987         tools.push("spacer");
68988         if (notesEnabled()) {
68989           tools = tools.concat([notes, "spacer"]);
68990         }
68991         tools = tools.concat([undoRedo, save]);
68992         var toolbarItems = bar.selectAll(".toolbar-item").data(tools, function(d) {
68993           return d.id || d;
68994         });
68995         toolbarItems.exit().each(function(d) {
68996           if (d.uninstall) {
68997             d.uninstall();
68998           }
68999         }).remove();
69000         var itemsEnter = toolbarItems.enter().append("div").attr("class", function(d) {
69001           var classes = "toolbar-item " + (d.id || d).replace("_", "-");
69002           if (d.klass)
69003             classes += " " + d.klass;
69004           return classes;
69005         });
69006         var actionableItems = itemsEnter.filter(function(d) {
69007           return d !== "spacer";
69008         });
69009         actionableItems.append("div").attr("class", "item-content").each(function(d) {
69010           select_default2(this).call(d.render, bar);
69011         });
69012         actionableItems.append("div").attr("class", "item-label").each(function(d) {
69013           d.label(select_default2(this));
69014         });
69015       }
69016     }
69017     return topToolbar;
69018   }
69019
69020   // modules/ui/zoom_to_selection.js
69021   function uiZoomToSelection(context) {
69022     function isDisabled() {
69023       var mode = context.mode();
69024       return !mode || !mode.zoomToSelected;
69025     }
69026     var _lastPointerUpType;
69027     function pointerup(d3_event) {
69028       _lastPointerUpType = d3_event.pointerType;
69029     }
69030     function click(d3_event) {
69031       d3_event.preventDefault();
69032       if (isDisabled()) {
69033         if (_lastPointerUpType === "touch" || _lastPointerUpType === "pen") {
69034           context.ui().flash.duration(2e3).iconName("#iD-icon-framed-dot").iconClass("disabled").label(_t.append("inspector.zoom_to.no_selection"))();
69035         }
69036       } else {
69037         var mode = context.mode();
69038         if (mode && mode.zoomToSelected) {
69039           mode.zoomToSelected();
69040         }
69041       }
69042       _lastPointerUpType = null;
69043     }
69044     return function(selection2) {
69045       var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function() {
69046         if (isDisabled()) {
69047           return _t.append("inspector.zoom_to.no_selection");
69048         }
69049         return _t.append("inspector.zoom_to.title");
69050       }).keys([_t("inspector.zoom_to.key")]);
69051       var button = selection2.append("button").on("pointerup", pointerup).on("click", click).call(svgIcon("#iD-icon-framed-dot", "light")).call(tooltipBehavior);
69052       function setEnabledState() {
69053         button.classed("disabled", isDisabled());
69054         if (!button.select(".tooltip.in").empty()) {
69055           button.call(tooltipBehavior.updateContent);
69056         }
69057       }
69058       context.on("enter.uiZoomToSelection", setEnabledState);
69059       setEnabledState();
69060     };
69061   }
69062
69063   // modules/ui/pane.js
69064   function uiPane(id2, context) {
69065     var _key;
69066     var _label = "";
69067     var _description = "";
69068     var _iconName = "";
69069     var _sections;
69070     var _paneSelection = select_default2(null);
69071     var _paneTooltip;
69072     var pane = {
69073       id: id2
69074     };
69075     pane.label = function(val) {
69076       if (!arguments.length)
69077         return _label;
69078       _label = val;
69079       return pane;
69080     };
69081     pane.key = function(val) {
69082       if (!arguments.length)
69083         return _key;
69084       _key = val;
69085       return pane;
69086     };
69087     pane.description = function(val) {
69088       if (!arguments.length)
69089         return _description;
69090       _description = val;
69091       return pane;
69092     };
69093     pane.iconName = function(val) {
69094       if (!arguments.length)
69095         return _iconName;
69096       _iconName = val;
69097       return pane;
69098     };
69099     pane.sections = function(val) {
69100       if (!arguments.length)
69101         return _sections;
69102       _sections = val;
69103       return pane;
69104     };
69105     pane.selection = function() {
69106       return _paneSelection;
69107     };
69108     function hidePane() {
69109       context.ui().togglePanes();
69110     }
69111     pane.togglePane = function(d3_event) {
69112       if (d3_event)
69113         d3_event.preventDefault();
69114       _paneTooltip.hide();
69115       context.ui().togglePanes(!_paneSelection.classed("shown") ? _paneSelection : void 0);
69116     };
69117     pane.renderToggleButton = function(selection2) {
69118       if (!_paneTooltip) {
69119         _paneTooltip = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(() => _description).keys([_key]);
69120       }
69121       selection2.append("button").on("click", pane.togglePane).call(svgIcon("#" + _iconName, "light")).call(_paneTooltip);
69122     };
69123     pane.renderContent = function(selection2) {
69124       if (_sections) {
69125         _sections.forEach(function(section) {
69126           selection2.call(section.render);
69127         });
69128       }
69129     };
69130     pane.renderPane = function(selection2) {
69131       _paneSelection = selection2.append("div").attr("class", "fillL map-pane hide " + id2 + "-pane").attr("pane", id2);
69132       var heading = _paneSelection.append("div").attr("class", "pane-heading");
69133       heading.append("h2").text("").call(_label);
69134       heading.append("button").attr("title", _t("icons.close")).on("click", hidePane).call(svgIcon("#iD-icon-close"));
69135       _paneSelection.append("div").attr("class", "pane-content").call(pane.renderContent);
69136       if (_key) {
69137         context.keybinding().on(_key, pane.togglePane);
69138       }
69139     };
69140     return pane;
69141   }
69142
69143   // modules/ui/sections/background_display_options.js
69144   function uiSectionBackgroundDisplayOptions(context) {
69145     var section = uiSection("background-display-options", context).label(() => _t.append("background.display_options")).disclosureContent(renderDisclosureContent);
69146     var _storedOpacity = corePreferences("background-opacity");
69147     var _minVal = 0;
69148     var _maxVal = 3;
69149     var _sliders = ["brightness", "contrast", "saturation", "sharpness"];
69150     var _options = {
69151       brightness: _storedOpacity !== null ? +_storedOpacity : 1,
69152       contrast: 1,
69153       saturation: 1,
69154       sharpness: 1
69155     };
69156     function clamp3(x, min3, max3) {
69157       return Math.max(min3, Math.min(x, max3));
69158     }
69159     function updateValue(d, val) {
69160       val = clamp3(val, _minVal, _maxVal);
69161       _options[d] = val;
69162       context.background()[d](val);
69163       if (d === "brightness") {
69164         corePreferences("background-opacity", val);
69165       }
69166       section.reRender();
69167     }
69168     function renderDisclosureContent(selection2) {
69169       var container = selection2.selectAll(".display-options-container").data([0]);
69170       var containerEnter = container.enter().append("div").attr("class", "display-options-container controls-list");
69171       var slidersEnter = containerEnter.selectAll(".display-control").data(_sliders).enter().append("label").attr("class", function(d) {
69172         return "display-control display-control-" + d;
69173       });
69174       slidersEnter.html(function(d) {
69175         return _t.html("background." + d);
69176       }).append("span").attr("class", function(d) {
69177         return "display-option-value display-option-value-" + d;
69178       });
69179       var sildersControlEnter = slidersEnter.append("div").attr("class", "control-wrap");
69180       sildersControlEnter.append("input").attr("class", function(d) {
69181         return "display-option-input display-option-input-" + d;
69182       }).attr("type", "range").attr("min", _minVal).attr("max", _maxVal).attr("step", "0.05").on("input", function(d3_event, d) {
69183         var val = select_default2(this).property("value");
69184         if (!val && d3_event && d3_event.target) {
69185           val = d3_event.target.value;
69186         }
69187         updateValue(d, val);
69188       });
69189       sildersControlEnter.append("button").attr("title", function(d) {
69190         return `${_t("background.reset")} ${_t("background." + d)}`;
69191       }).attr("class", function(d) {
69192         return "display-option-reset display-option-reset-" + d;
69193       }).on("click", function(d3_event, d) {
69194         if (d3_event.button !== 0)
69195           return;
69196         updateValue(d, 1);
69197       }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")));
69198       containerEnter.append("a").attr("class", "display-option-resetlink").attr("role", "button").attr("href", "#").call(_t.append("background.reset_all")).on("click", function(d3_event) {
69199         d3_event.preventDefault();
69200         for (var i2 = 0; i2 < _sliders.length; i2++) {
69201           updateValue(_sliders[i2], 1);
69202         }
69203       });
69204       container = containerEnter.merge(container);
69205       container.selectAll(".display-option-input").property("value", function(d) {
69206         return _options[d];
69207       });
69208       container.selectAll(".display-option-value").text(function(d) {
69209         return Math.floor(_options[d] * 100) + "%";
69210       });
69211       container.selectAll(".display-option-reset").classed("disabled", function(d) {
69212         return _options[d] === 1;
69213       });
69214       if (containerEnter.size() && _options.brightness !== 1) {
69215         context.background().brightness(_options.brightness);
69216       }
69217     }
69218     return section;
69219   }
69220
69221   // modules/ui/settings/custom_background.js
69222   function uiSettingsCustomBackground() {
69223     var dispatch10 = dispatch_default("change");
69224     function render(selection2) {
69225       var _origSettings = {
69226         template: corePreferences("background-custom-template")
69227       };
69228       var _currSettings = {
69229         template: corePreferences("background-custom-template")
69230       };
69231       var example = "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png";
69232       var modal = uiConfirm(selection2).okButton();
69233       modal.classed("settings-modal settings-custom-background", true);
69234       modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_background.header"));
69235       var textSection = modal.select(".modal-section.message-text");
69236       var instructions = `${_t.html("settings.custom_background.instructions.info")}
69237
69238 #### ${_t.html("settings.custom_background.instructions.wms.tokens_label")}
69239 * ${_t.html("settings.custom_background.instructions.wms.tokens.proj")}
69240 * ${_t.html("settings.custom_background.instructions.wms.tokens.wkid")}
69241 * ${_t.html("settings.custom_background.instructions.wms.tokens.dimensions")}
69242 * ${_t.html("settings.custom_background.instructions.wms.tokens.bbox")}
69243
69244 #### ${_t.html("settings.custom_background.instructions.tms.tokens_label")}
69245 * ${_t.html("settings.custom_background.instructions.tms.tokens.xyz")}
69246 * ${_t.html("settings.custom_background.instructions.tms.tokens.flipped_y")}
69247 * ${_t.html("settings.custom_background.instructions.tms.tokens.switch")}
69248 * ${_t.html("settings.custom_background.instructions.tms.tokens.quadtile")}
69249 * ${_t.html("settings.custom_background.instructions.tms.tokens.scale_factor")}
69250
69251 #### ${_t.html("settings.custom_background.instructions.example")}
69252 \`${example}\``;
69253       textSection.append("div").attr("class", "instructions-template").html(marked(instructions));
69254       textSection.append("textarea").attr("class", "field-template").attr("placeholder", _t("settings.custom_background.template.placeholder")).call(utilNoAuto).property("value", _currSettings.template);
69255       var buttonSection = modal.select(".modal-section.buttons");
69256       buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
69257       buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
69258       buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
69259       function isSaveDisabled() {
69260         return null;
69261       }
69262       function clickCancel() {
69263         textSection.select(".field-template").property("value", _origSettings.template);
69264         corePreferences("background-custom-template", _origSettings.template);
69265         this.blur();
69266         modal.close();
69267       }
69268       function clickSave() {
69269         _currSettings.template = textSection.select(".field-template").property("value");
69270         corePreferences("background-custom-template", _currSettings.template);
69271         this.blur();
69272         modal.close();
69273         dispatch10.call("change", this, _currSettings);
69274       }
69275     }
69276     return utilRebind(render, dispatch10, "on");
69277   }
69278
69279   // modules/ui/sections/background_list.js
69280   function uiSectionBackgroundList(context) {
69281     var _backgroundList = select_default2(null);
69282     var _customSource = context.background().findSource("custom");
69283     var _settingsCustomBackground = uiSettingsCustomBackground(context).on("change", customChanged);
69284     var section = uiSection("background-list", context).label(() => _t.append("background.backgrounds")).disclosureContent(renderDisclosureContent);
69285     function previousBackgroundID() {
69286       return corePreferences("background-last-used-toggle");
69287     }
69288     function renderDisclosureContent(selection2) {
69289       var container = selection2.selectAll(".layer-background-list").data([0]);
69290       _backgroundList = container.enter().append("ul").attr("class", "layer-list layer-background-list").attr("dir", "auto").merge(container);
69291       var bgExtrasListEnter = selection2.selectAll(".bg-extras-list").data([0]).enter().append("ul").attr("class", "layer-list bg-extras-list");
69292       var minimapLabelEnter = bgExtrasListEnter.append("li").attr("class", "minimap-toggle-item").append("label").call(
69293         uiTooltip().title(() => _t.append("background.minimap.tooltip")).keys([_t("background.minimap.key")]).placement("top")
69294       );
69295       minimapLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
69296         d3_event.preventDefault();
69297         uiMapInMap.toggle();
69298       });
69299       minimapLabelEnter.append("span").call(_t.append("background.minimap.description"));
69300       var panelLabelEnter = bgExtrasListEnter.append("li").attr("class", "background-panel-toggle-item").append("label").call(
69301         uiTooltip().title(() => _t.append("background.panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.background.key"))]).placement("top")
69302       );
69303       panelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
69304         d3_event.preventDefault();
69305         context.ui().info.toggle("background");
69306       });
69307       panelLabelEnter.append("span").call(_t.append("background.panel.description"));
69308       var locPanelLabelEnter = bgExtrasListEnter.append("li").attr("class", "location-panel-toggle-item").append("label").call(
69309         uiTooltip().title(() => _t.append("background.location_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.location.key"))]).placement("top")
69310       );
69311       locPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
69312         d3_event.preventDefault();
69313         context.ui().info.toggle("location");
69314       });
69315       locPanelLabelEnter.append("span").call(_t.append("background.location_panel.description"));
69316       selection2.selectAll(".imagery-faq").data([0]).enter().append("div").attr("class", "imagery-faq").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/openstreetmap/iD/blob/develop/FAQ.md#how-can-i-report-an-issue-with-background-imagery").append("span").call(_t.append("background.imagery_problem_faq"));
69317       _backgroundList.call(drawListItems, "radio", function(d3_event, d) {
69318         chooseBackground(d);
69319       }, function(d) {
69320         return !d.isHidden() && !d.overlay;
69321       });
69322     }
69323     function setTooltips(selection2) {
69324       selection2.each(function(d, i2, nodes) {
69325         var item = select_default2(this).select("label");
69326         var span = item.select("span");
69327         var placement = i2 < nodes.length / 2 ? "bottom" : "top";
69328         var hasDescription = d.hasDescription();
69329         var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth");
69330         item.call(uiTooltip().destroyAny);
69331         if (d.id === previousBackgroundID()) {
69332           item.call(
69333             uiTooltip().placement(placement).title(() => _t.append("background.switch")).keys([uiCmd("\u2318" + _t("background.key"))])
69334           );
69335         } else if (hasDescription || isOverflowing) {
69336           item.call(
69337             uiTooltip().placement(placement).title(() => hasDescription ? d.description() : d.label())
69338           );
69339         }
69340       });
69341     }
69342     function drawListItems(layerList, type2, change, filter2) {
69343       var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2).sort(function(a, b) {
69344         return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
69345       });
69346       var layerLinks = layerList.selectAll("li").data(sources, function(d, i2) {
69347         return d.id + "---" + i2;
69348       });
69349       layerLinks.exit().remove();
69350       var enter = layerLinks.enter().append("li").classed("layer-custom", function(d) {
69351         return d.id === "custom";
69352       }).classed("best", function(d) {
69353         return d.best();
69354       });
69355       var label = enter.append("label");
69356       label.append("input").attr("type", type2).attr("name", "background-layer").attr("value", function(d) {
69357         return d.id;
69358       }).on("change", change);
69359       label.append("span").each(function(d) {
69360         d.label()(select_default2(this));
69361       });
69362       enter.filter(function(d) {
69363         return d.id === "custom";
69364       }).append("button").attr("class", "layer-browse").call(
69365         uiTooltip().title(() => _t.append("settings.custom_background.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
69366       ).on("click", function(d3_event) {
69367         d3_event.preventDefault();
69368         editCustom();
69369       }).call(svgIcon("#iD-icon-more"));
69370       enter.filter(function(d) {
69371         return d.best();
69372       }).append("div").attr("class", "best").call(
69373         uiTooltip().title(() => _t.append("background.best_imagery")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
69374       ).append("span").text("\u2605");
69375       layerList.call(updateLayerSelections);
69376     }
69377     function updateLayerSelections(selection2) {
69378       function active(d) {
69379         return context.background().showsLayer(d);
69380       }
69381       selection2.selectAll("li").classed("active", active).classed("switch", function(d) {
69382         return d.id === previousBackgroundID();
69383       }).call(setTooltips).selectAll("input").property("checked", active);
69384     }
69385     function chooseBackground(d) {
69386       if (d.id === "custom" && !d.template()) {
69387         return editCustom();
69388       }
69389       var previousBackground = context.background().baseLayerSource();
69390       corePreferences("background-last-used-toggle", previousBackground.id);
69391       corePreferences("background-last-used", d.id);
69392       context.background().baseLayerSource(d);
69393     }
69394     function customChanged(d) {
69395       if (d && d.template) {
69396         _customSource.template(d.template);
69397         chooseBackground(_customSource);
69398       } else {
69399         _customSource.template("");
69400         chooseBackground(context.background().findSource("none"));
69401       }
69402     }
69403     function editCustom() {
69404       context.container().call(_settingsCustomBackground);
69405     }
69406     context.background().on("change.background_list", function() {
69407       _backgroundList.call(updateLayerSelections);
69408     });
69409     context.map().on(
69410       "move.background_list",
69411       debounce_default(function() {
69412         window.requestIdleCallback(section.reRender);
69413       }, 1e3)
69414     );
69415     return section;
69416   }
69417
69418   // modules/ui/sections/background_offset.js
69419   function uiSectionBackgroundOffset(context) {
69420     var section = uiSection("background-offset", context).label(() => _t.append("background.fix_misalignment")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
69421     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
69422     var _directions = [
69423       ["top", [0, -0.5]],
69424       ["left", [-0.5, 0]],
69425       ["right", [0.5, 0]],
69426       ["bottom", [0, 0.5]]
69427     ];
69428     function updateValue() {
69429       var meters = geoOffsetToMeters(context.background().offset());
69430       var x = +meters[0].toFixed(2);
69431       var y = +meters[1].toFixed(2);
69432       context.container().selectAll(".nudge-inner-rect").select("input").classed("error", false).property("value", x + ", " + y);
69433       context.container().selectAll(".nudge-reset").classed("disabled", function() {
69434         return x === 0 && y === 0;
69435       });
69436     }
69437     function resetOffset() {
69438       context.background().offset([0, 0]);
69439       updateValue();
69440     }
69441     function nudge(d) {
69442       context.background().nudge(d, context.map().zoom());
69443       updateValue();
69444     }
69445     function inputOffset() {
69446       var input = select_default2(this);
69447       var d = input.node().value;
69448       if (d === "")
69449         return resetOffset();
69450       d = d.replace(/;/g, ",").split(",").map(function(n2) {
69451         return !isNaN(n2) && n2;
69452       });
69453       if (d.length !== 2 || !d[0] || !d[1]) {
69454         input.classed("error", true);
69455         return;
69456       }
69457       context.background().offset(geoMetersToOffset(d));
69458       updateValue();
69459     }
69460     function dragOffset(d3_event) {
69461       if (d3_event.button !== 0)
69462         return;
69463       var origin = [d3_event.clientX, d3_event.clientY];
69464       var pointerId = d3_event.pointerId || "mouse";
69465       context.container().append("div").attr("class", "nudge-surface");
69466       select_default2(window).on(_pointerPrefix + "move.drag-bg-offset", pointermove).on(_pointerPrefix + "up.drag-bg-offset", pointerup);
69467       if (_pointerPrefix === "pointer") {
69468         select_default2(window).on("pointercancel.drag-bg-offset", pointerup);
69469       }
69470       function pointermove(d3_event2) {
69471         if (pointerId !== (d3_event2.pointerId || "mouse"))
69472           return;
69473         var latest = [d3_event2.clientX, d3_event2.clientY];
69474         var d = [
69475           -(origin[0] - latest[0]) / 4,
69476           -(origin[1] - latest[1]) / 4
69477         ];
69478         origin = latest;
69479         nudge(d);
69480       }
69481       function pointerup(d3_event2) {
69482         if (pointerId !== (d3_event2.pointerId || "mouse"))
69483           return;
69484         if (d3_event2.button !== 0)
69485           return;
69486         context.container().selectAll(".nudge-surface").remove();
69487         select_default2(window).on(".drag-bg-offset", null);
69488       }
69489     }
69490     function renderDisclosureContent(selection2) {
69491       var container = selection2.selectAll(".nudge-container").data([0]);
69492       var containerEnter = container.enter().append("div").attr("class", "nudge-container");
69493       containerEnter.append("div").attr("class", "nudge-instructions").call(_t.append("background.offset"));
69494       var nudgeWrapEnter = containerEnter.append("div").attr("class", "nudge-controls-wrap");
69495       var nudgeEnter = nudgeWrapEnter.append("div").attr("class", "nudge-outer-rect").on(_pointerPrefix + "down", dragOffset);
69496       nudgeEnter.append("div").attr("class", "nudge-inner-rect").append("input").attr("type", "text").attr("aria-label", _t("background.offset_label")).on("change", inputOffset);
69497       nudgeWrapEnter.append("div").selectAll("button").data(_directions).enter().append("button").attr("title", function(d) {
69498         return _t(`background.nudge.${d[0]}`);
69499       }).attr("class", function(d) {
69500         return d[0] + " nudge";
69501       }).on("click", function(d3_event, d) {
69502         nudge(d[1]);
69503       });
69504       nudgeWrapEnter.append("button").attr("title", _t("background.reset")).attr("class", "nudge-reset disabled").on("click", function(d3_event) {
69505         d3_event.preventDefault();
69506         resetOffset();
69507       }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")));
69508       updateValue();
69509     }
69510     context.background().on("change.backgroundOffset-update", updateValue);
69511     return section;
69512   }
69513
69514   // modules/ui/sections/overlay_list.js
69515   function uiSectionOverlayList(context) {
69516     var section = uiSection("overlay-list", context).label(() => _t.append("background.overlays")).disclosureContent(renderDisclosureContent);
69517     var _overlayList = select_default2(null);
69518     function setTooltips(selection2) {
69519       selection2.each(function(d, i2, nodes) {
69520         var item = select_default2(this).select("label");
69521         var span = item.select("span");
69522         var placement = i2 < nodes.length / 2 ? "bottom" : "top";
69523         var description = d.description();
69524         var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth");
69525         item.call(uiTooltip().destroyAny);
69526         if (description || isOverflowing) {
69527           item.call(
69528             uiTooltip().placement(placement).title(() => description || d.name())
69529           );
69530         }
69531       });
69532     }
69533     function updateLayerSelections(selection2) {
69534       function active(d) {
69535         return context.background().showsLayer(d);
69536       }
69537       selection2.selectAll("li").classed("active", active).call(setTooltips).selectAll("input").property("checked", active);
69538     }
69539     function chooseOverlay(d3_event, d) {
69540       d3_event.preventDefault();
69541       context.background().toggleOverlayLayer(d);
69542       _overlayList.call(updateLayerSelections);
69543       document.activeElement.blur();
69544     }
69545     function drawListItems(layerList, type2, change, filter2) {
69546       var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2);
69547       var layerLinks = layerList.selectAll("li").data(sources, function(d) {
69548         return d.name();
69549       });
69550       layerLinks.exit().remove();
69551       var enter = layerLinks.enter().append("li");
69552       var label = enter.append("label");
69553       label.append("input").attr("type", type2).attr("name", "layers").on("change", change);
69554       label.append("span").each(function(d) {
69555         d.label()(select_default2(this));
69556       });
69557       layerList.selectAll("li").sort(sortSources);
69558       layerList.call(updateLayerSelections);
69559       function sortSources(a, b) {
69560         return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
69561       }
69562     }
69563     function renderDisclosureContent(selection2) {
69564       var container = selection2.selectAll(".layer-overlay-list").data([0]);
69565       _overlayList = container.enter().append("ul").attr("class", "layer-list layer-overlay-list").attr("dir", "auto").merge(container);
69566       _overlayList.call(drawListItems, "checkbox", chooseOverlay, function(d) {
69567         return !d.isHidden() && d.overlay;
69568       });
69569     }
69570     context.map().on(
69571       "move.overlay_list",
69572       debounce_default(function() {
69573         window.requestIdleCallback(section.reRender);
69574       }, 1e3)
69575     );
69576     return section;
69577   }
69578
69579   // modules/ui/panes/background.js
69580   function uiPaneBackground(context) {
69581     var backgroundPane = uiPane("background", context).key(_t("background.key")).label(_t.append("background.title")).description(_t.append("background.description")).iconName("iD-icon-layers").sections([
69582       uiSectionBackgroundList(context),
69583       uiSectionOverlayList(context),
69584       uiSectionBackgroundDisplayOptions(context),
69585       uiSectionBackgroundOffset(context)
69586     ]);
69587     return backgroundPane;
69588   }
69589
69590   // modules/ui/panes/help.js
69591   function uiPaneHelp(context) {
69592     var docKeys = [
69593       ["help", [
69594         "welcome",
69595         "open_data_h",
69596         "open_data",
69597         "before_start_h",
69598         "before_start",
69599         "open_source_h",
69600         "open_source",
69601         "open_source_help"
69602       ]],
69603       ["overview", [
69604         "navigation_h",
69605         "navigation_drag",
69606         "navigation_zoom",
69607         "features_h",
69608         "features",
69609         "nodes_ways"
69610       ]],
69611       ["editing", [
69612         "select_h",
69613         "select_left_click",
69614         "select_right_click",
69615         "select_space",
69616         "multiselect_h",
69617         "multiselect",
69618         "multiselect_shift_click",
69619         "multiselect_lasso",
69620         "undo_redo_h",
69621         "undo_redo",
69622         "save_h",
69623         "save",
69624         "save_validation",
69625         "upload_h",
69626         "upload",
69627         "backups_h",
69628         "backups",
69629         "keyboard_h",
69630         "keyboard"
69631       ]],
69632       ["feature_editor", [
69633         "intro",
69634         "definitions",
69635         "type_h",
69636         "type",
69637         "type_picker",
69638         "fields_h",
69639         "fields_all_fields",
69640         "fields_example",
69641         "fields_add_field",
69642         "tags_h",
69643         "tags_all_tags",
69644         "tags_resources"
69645       ]],
69646       ["points", [
69647         "intro",
69648         "add_point_h",
69649         "add_point",
69650         "add_point_finish",
69651         "move_point_h",
69652         "move_point",
69653         "delete_point_h",
69654         "delete_point",
69655         "delete_point_command"
69656       ]],
69657       ["lines", [
69658         "intro",
69659         "add_line_h",
69660         "add_line",
69661         "add_line_draw",
69662         "add_line_continue",
69663         "add_line_finish",
69664         "modify_line_h",
69665         "modify_line_dragnode",
69666         "modify_line_addnode",
69667         "connect_line_h",
69668         "connect_line",
69669         "connect_line_display",
69670         "connect_line_drag",
69671         "connect_line_tag",
69672         "disconnect_line_h",
69673         "disconnect_line_command",
69674         "move_line_h",
69675         "move_line_command",
69676         "move_line_connected",
69677         "delete_line_h",
69678         "delete_line",
69679         "delete_line_command"
69680       ]],
69681       ["areas", [
69682         "intro",
69683         "point_or_area_h",
69684         "point_or_area",
69685         "add_area_h",
69686         "add_area_command",
69687         "add_area_draw",
69688         "add_area_continue",
69689         "add_area_finish",
69690         "square_area_h",
69691         "square_area_command",
69692         "modify_area_h",
69693         "modify_area_dragnode",
69694         "modify_area_addnode",
69695         "delete_area_h",
69696         "delete_area",
69697         "delete_area_command"
69698       ]],
69699       ["relations", [
69700         "intro",
69701         "edit_relation_h",
69702         "edit_relation",
69703         "edit_relation_add",
69704         "edit_relation_delete",
69705         "maintain_relation_h",
69706         "maintain_relation",
69707         "relation_types_h",
69708         "multipolygon_h",
69709         "multipolygon",
69710         "multipolygon_create",
69711         "multipolygon_merge",
69712         "turn_restriction_h",
69713         "turn_restriction",
69714         "turn_restriction_field",
69715         "turn_restriction_editing",
69716         "route_h",
69717         "route",
69718         "route_add",
69719         "boundary_h",
69720         "boundary",
69721         "boundary_add"
69722       ]],
69723       ["operations", [
69724         "intro",
69725         "intro_2",
69726         "straighten",
69727         "orthogonalize",
69728         "circularize",
69729         "move",
69730         "rotate",
69731         "reflect",
69732         "continue",
69733         "reverse",
69734         "disconnect",
69735         "split",
69736         "extract",
69737         "merge",
69738         "delete",
69739         "downgrade",
69740         "copy_paste"
69741       ]],
69742       ["notes", [
69743         "intro",
69744         "add_note_h",
69745         "add_note",
69746         "place_note",
69747         "move_note",
69748         "update_note_h",
69749         "update_note",
69750         "save_note_h",
69751         "save_note"
69752       ]],
69753       ["imagery", [
69754         "intro",
69755         "sources_h",
69756         "choosing",
69757         "sources",
69758         "offsets_h",
69759         "offset",
69760         "offset_change"
69761       ]],
69762       ["streetlevel", [
69763         "intro",
69764         "using_h",
69765         "using",
69766         "photos",
69767         "viewer"
69768       ]],
69769       ["gps", [
69770         "intro",
69771         "survey",
69772         "using_h",
69773         "using",
69774         "tracing",
69775         "upload"
69776       ]],
69777       ["qa", [
69778         "intro",
69779         "tools_h",
69780         "tools",
69781         "issues_h",
69782         "issues"
69783       ]]
69784     ];
69785     var headings = {
69786       "help.help.open_data_h": 3,
69787       "help.help.before_start_h": 3,
69788       "help.help.open_source_h": 3,
69789       "help.overview.navigation_h": 3,
69790       "help.overview.features_h": 3,
69791       "help.editing.select_h": 3,
69792       "help.editing.multiselect_h": 3,
69793       "help.editing.undo_redo_h": 3,
69794       "help.editing.save_h": 3,
69795       "help.editing.upload_h": 3,
69796       "help.editing.backups_h": 3,
69797       "help.editing.keyboard_h": 3,
69798       "help.feature_editor.type_h": 3,
69799       "help.feature_editor.fields_h": 3,
69800       "help.feature_editor.tags_h": 3,
69801       "help.points.add_point_h": 3,
69802       "help.points.move_point_h": 3,
69803       "help.points.delete_point_h": 3,
69804       "help.lines.add_line_h": 3,
69805       "help.lines.modify_line_h": 3,
69806       "help.lines.connect_line_h": 3,
69807       "help.lines.disconnect_line_h": 3,
69808       "help.lines.move_line_h": 3,
69809       "help.lines.delete_line_h": 3,
69810       "help.areas.point_or_area_h": 3,
69811       "help.areas.add_area_h": 3,
69812       "help.areas.square_area_h": 3,
69813       "help.areas.modify_area_h": 3,
69814       "help.areas.delete_area_h": 3,
69815       "help.relations.edit_relation_h": 3,
69816       "help.relations.maintain_relation_h": 3,
69817       "help.relations.relation_types_h": 2,
69818       "help.relations.multipolygon_h": 3,
69819       "help.relations.turn_restriction_h": 3,
69820       "help.relations.route_h": 3,
69821       "help.relations.boundary_h": 3,
69822       "help.notes.add_note_h": 3,
69823       "help.notes.update_note_h": 3,
69824       "help.notes.save_note_h": 3,
69825       "help.imagery.sources_h": 3,
69826       "help.imagery.offsets_h": 3,
69827       "help.streetlevel.using_h": 3,
69828       "help.gps.using_h": 3,
69829       "help.qa.tools_h": 3,
69830       "help.qa.issues_h": 3
69831     };
69832     var docs = docKeys.map(function(key) {
69833       var helpkey = "help." + key[0];
69834       var helpPaneReplacements = { version: context.version };
69835       var text2 = key[1].reduce(function(all, part) {
69836         var subkey = helpkey + "." + part;
69837         var depth = headings[subkey];
69838         var hhh = depth ? Array(depth + 1).join("#") + " " : "";
69839         return all + hhh + helpHtml(subkey, helpPaneReplacements) + "\n\n";
69840       }, "");
69841       return {
69842         title: _t.html(helpkey + ".title"),
69843         content: marked(text2.trim()).replace(/<code>/g, "<kbd>").replace(/<\/code>/g, "</kbd>")
69844       };
69845     });
69846     var helpPane = uiPane("help", context).key(_t("help.key")).label(_t.append("help.title")).description(_t.append("help.title")).iconName("iD-icon-help");
69847     helpPane.renderContent = function(content) {
69848       function clickHelp(d, i2) {
69849         var rtl = _mainLocalizer.textDirection() === "rtl";
69850         content.property("scrollTop", 0);
69851         helpPane.selection().select(".pane-heading h2").html(d.title);
69852         body.html(d.content);
69853         body.selectAll("a").attr("target", "_blank");
69854         menuItems.classed("selected", function(m) {
69855           return m.title === d.title;
69856         });
69857         nav.html("");
69858         if (rtl) {
69859           nav.call(drawNext).call(drawPrevious);
69860         } else {
69861           nav.call(drawPrevious).call(drawNext);
69862         }
69863         function drawNext(selection2) {
69864           if (i2 < docs.length - 1) {
69865             var nextLink = selection2.append("a").attr("href", "#").attr("class", "next").on("click", function(d3_event) {
69866               d3_event.preventDefault();
69867               clickHelp(docs[i2 + 1], i2 + 1);
69868             });
69869             nextLink.append("span").html(docs[i2 + 1].title).call(svgIcon(rtl ? "#iD-icon-backward" : "#iD-icon-forward", "inline"));
69870           }
69871         }
69872         function drawPrevious(selection2) {
69873           if (i2 > 0) {
69874             var prevLink = selection2.append("a").attr("href", "#").attr("class", "previous").on("click", function(d3_event) {
69875               d3_event.preventDefault();
69876               clickHelp(docs[i2 - 1], i2 - 1);
69877             });
69878             prevLink.call(svgIcon(rtl ? "#iD-icon-forward" : "#iD-icon-backward", "inline")).append("span").html(docs[i2 - 1].title);
69879           }
69880         }
69881       }
69882       function clickWalkthrough(d3_event) {
69883         d3_event.preventDefault();
69884         if (context.inIntro())
69885           return;
69886         context.container().call(uiIntro(context));
69887         context.ui().togglePanes();
69888       }
69889       function clickShortcuts(d3_event) {
69890         d3_event.preventDefault();
69891         context.container().call(context.ui().shortcuts, true);
69892       }
69893       var toc = content.append("ul").attr("class", "toc");
69894       var menuItems = toc.selectAll("li").data(docs).enter().append("li").append("a").attr("role", "button").attr("href", "#").html(function(d) {
69895         return d.title;
69896       }).on("click", function(d3_event, d) {
69897         d3_event.preventDefault();
69898         clickHelp(d, docs.indexOf(d));
69899       });
69900       var shortcuts = toc.append("li").attr("class", "shortcuts").call(
69901         uiTooltip().title(() => _t.append("shortcuts.tooltip")).keys(["?"]).placement("top")
69902       ).append("a").attr("href", "#").on("click", clickShortcuts);
69903       shortcuts.append("div").call(_t.append("shortcuts.title"));
69904       var walkthrough = toc.append("li").attr("class", "walkthrough").append("a").attr("href", "#").on("click", clickWalkthrough);
69905       walkthrough.append("svg").attr("class", "logo logo-walkthrough").append("use").attr("xlink:href", "#iD-logo-walkthrough");
69906       walkthrough.append("div").call(_t.append("splash.walkthrough"));
69907       var helpContent = content.append("div").attr("class", "left-content");
69908       var body = helpContent.append("div").attr("class", "body");
69909       var nav = helpContent.append("div").attr("class", "nav");
69910       clickHelp(docs[0], 0);
69911     };
69912     return helpPane;
69913   }
69914
69915   // modules/ui/sections/validation_issues.js
69916   function uiSectionValidationIssues(id2, severity, context) {
69917     var _issues = [];
69918     var section = uiSection(id2, context).label(function() {
69919       if (!_issues)
69920         return "";
69921       var issueCountText = _issues.length > 1e3 ? "1000+" : String(_issues.length);
69922       return _t.append("inspector.title_count", { title: _t("issues." + severity + "s.list_title"), count: issueCountText });
69923     }).disclosureContent(renderDisclosureContent).shouldDisplay(function() {
69924       return _issues && _issues.length;
69925     });
69926     function getOptions() {
69927       return {
69928         what: corePreferences("validate-what") || "edited",
69929         where: corePreferences("validate-where") || "all"
69930       };
69931     }
69932     function reloadIssues() {
69933       _issues = context.validator().getIssuesBySeverity(getOptions())[severity];
69934     }
69935     function renderDisclosureContent(selection2) {
69936       var center = context.map().center();
69937       var graph = context.graph();
69938       var issues = _issues.map(function withDistance(issue) {
69939         var extent = issue.extent(graph);
69940         var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
69941         return Object.assign(issue, { dist });
69942       }).sort(function byDistance(a, b) {
69943         return a.dist - b.dist;
69944       });
69945       issues = issues.slice(0, 1e3);
69946       selection2.call(drawIssuesList, issues);
69947     }
69948     function drawIssuesList(selection2, issues) {
69949       var list = selection2.selectAll(".issues-list").data([0]);
69950       list = list.enter().append("ul").attr("class", "layer-list issues-list " + severity + "s-list").merge(list);
69951       var items = list.selectAll("li").data(issues, function(d) {
69952         return d.key;
69953       });
69954       items.exit().remove();
69955       var itemsEnter = items.enter().append("li").attr("class", function(d) {
69956         return "issue severity-" + d.severity;
69957       });
69958       var labelsEnter = itemsEnter.append("button").attr("class", "issue-label").on("click", function(d3_event, d) {
69959         context.validator().focusIssue(d);
69960       }).on("mouseover", function(d3_event, d) {
69961         utilHighlightEntities(d.entityIds, true, context);
69962       }).on("mouseout", function(d3_event, d) {
69963         utilHighlightEntities(d.entityIds, false, context);
69964       });
69965       var textEnter = labelsEnter.append("span").attr("class", "issue-text");
69966       textEnter.append("span").attr("class", "issue-icon").each(function(d) {
69967         var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error");
69968         select_default2(this).call(svgIcon(iconName));
69969       });
69970       textEnter.append("span").attr("class", "issue-message");
69971       items = items.merge(itemsEnter).order();
69972       items.selectAll(".issue-message").text("").each(function(d) {
69973         return d.message(context)(select_default2(this));
69974       });
69975     }
69976     context.validator().on("validated.uiSectionValidationIssues" + id2, function() {
69977       window.requestIdleCallback(function() {
69978         reloadIssues();
69979         section.reRender();
69980       });
69981     });
69982     context.map().on(
69983       "move.uiSectionValidationIssues" + id2,
69984       debounce_default(function() {
69985         window.requestIdleCallback(function() {
69986           if (getOptions().where === "visible") {
69987             reloadIssues();
69988           }
69989           section.reRender();
69990         });
69991       }, 1e3)
69992     );
69993     return section;
69994   }
69995
69996   // modules/ui/sections/validation_options.js
69997   function uiSectionValidationOptions(context) {
69998     var section = uiSection("issues-options", context).content(renderContent);
69999     function renderContent(selection2) {
70000       var container = selection2.selectAll(".issues-options-container").data([0]);
70001       container = container.enter().append("div").attr("class", "issues-options-container").merge(container);
70002       var data = [
70003         { key: "what", values: ["edited", "all"] },
70004         { key: "where", values: ["visible", "all"] }
70005       ];
70006       var options2 = container.selectAll(".issues-option").data(data, function(d) {
70007         return d.key;
70008       });
70009       var optionsEnter = options2.enter().append("div").attr("class", function(d) {
70010         return "issues-option issues-option-" + d.key;
70011       });
70012       optionsEnter.append("div").attr("class", "issues-option-title").html(function(d) {
70013         return _t.html("issues.options." + d.key + ".title");
70014       });
70015       var valuesEnter = optionsEnter.selectAll("label").data(function(d) {
70016         return d.values.map(function(val) {
70017           return { value: val, key: d.key };
70018         });
70019       }).enter().append("label");
70020       valuesEnter.append("input").attr("type", "radio").attr("name", function(d) {
70021         return "issues-option-" + d.key;
70022       }).attr("value", function(d) {
70023         return d.value;
70024       }).property("checked", function(d) {
70025         return getOptions()[d.key] === d.value;
70026       }).on("change", function(d3_event, d) {
70027         updateOptionValue(d3_event, d.key, d.value);
70028       });
70029       valuesEnter.append("span").html(function(d) {
70030         return _t.html("issues.options." + d.key + "." + d.value);
70031       });
70032     }
70033     function getOptions() {
70034       return {
70035         what: corePreferences("validate-what") || "edited",
70036         // 'all', 'edited'
70037         where: corePreferences("validate-where") || "all"
70038         // 'all', 'visible'
70039       };
70040     }
70041     function updateOptionValue(d3_event, d, val) {
70042       if (!val && d3_event && d3_event.target) {
70043         val = d3_event.target.value;
70044       }
70045       corePreferences("validate-" + d, val);
70046       context.validator().validate();
70047     }
70048     return section;
70049   }
70050
70051   // modules/ui/sections/validation_rules.js
70052   function uiSectionValidationRules(context) {
70053     var MINSQUARE = 0;
70054     var MAXSQUARE = 20;
70055     var DEFAULTSQUARE = 5;
70056     var section = uiSection("issues-rules", context).disclosureContent(renderDisclosureContent).label(() => _t.append("issues.rules.title"));
70057     var _ruleKeys = context.validator().getRuleKeys().filter(function(key) {
70058       return key !== "maprules";
70059     }).sort(function(key1, key2) {
70060       return _t("issues." + key1 + ".title") < _t("issues." + key2 + ".title") ? -1 : 1;
70061     });
70062     function renderDisclosureContent(selection2) {
70063       var container = selection2.selectAll(".issues-rulelist-container").data([0]);
70064       var containerEnter = container.enter().append("div").attr("class", "issues-rulelist-container");
70065       containerEnter.append("ul").attr("class", "layer-list issue-rules-list");
70066       var ruleLinks = containerEnter.append("div").attr("class", "issue-rules-links section-footer");
70067       ruleLinks.append("a").attr("class", "issue-rules-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) {
70068         d3_event.preventDefault();
70069         context.validator().disableRules(_ruleKeys);
70070       });
70071       ruleLinks.append("a").attr("class", "issue-rules-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) {
70072         d3_event.preventDefault();
70073         context.validator().disableRules([]);
70074       });
70075       container = container.merge(containerEnter);
70076       container.selectAll(".issue-rules-list").call(drawListItems, _ruleKeys, "checkbox", "rule", toggleRule, isRuleEnabled);
70077     }
70078     function drawListItems(selection2, data, type2, name, change, active) {
70079       var items = selection2.selectAll("li").data(data);
70080       items.exit().remove();
70081       var enter = items.enter().append("li");
70082       if (name === "rule") {
70083         enter.call(
70084           uiTooltip().title(function(d) {
70085             return _t.append("issues." + d + ".tip");
70086           }).placement("top")
70087         );
70088       }
70089       var label = enter.append("label");
70090       label.append("input").attr("type", type2).attr("name", name).on("change", change);
70091       label.append("span").html(function(d) {
70092         var params = {};
70093         if (d === "unsquare_way") {
70094           params.val = { html: '<span class="square-degrees"></span>' };
70095         }
70096         return _t.html("issues." + d + ".title", params);
70097       });
70098       items = items.merge(enter);
70099       items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false);
70100       var degStr = corePreferences("validate-square-degrees");
70101       if (degStr === null) {
70102         degStr = DEFAULTSQUARE.toString();
70103       }
70104       var span = items.selectAll(".square-degrees");
70105       var input = span.selectAll(".square-degrees-input").data([0]);
70106       input.enter().append("input").attr("type", "number").attr("min", MINSQUARE.toString()).attr("max", MAXSQUARE.toString()).attr("step", "0.5").attr("class", "square-degrees-input").call(utilNoAuto).on("click", function(d3_event) {
70107         d3_event.preventDefault();
70108         d3_event.stopPropagation();
70109         this.select();
70110       }).on("keyup", function(d3_event) {
70111         if (d3_event.keyCode === 13) {
70112           this.blur();
70113           this.select();
70114         }
70115       }).on("blur", changeSquare).merge(input).property("value", degStr);
70116     }
70117     function changeSquare() {
70118       var input = select_default2(this);
70119       var degStr = utilGetSetValue(input).trim();
70120       var degNum = Number(degStr);
70121       if (!isFinite(degNum)) {
70122         degNum = DEFAULTSQUARE;
70123       } else if (degNum > MAXSQUARE) {
70124         degNum = MAXSQUARE;
70125       } else if (degNum < MINSQUARE) {
70126         degNum = MINSQUARE;
70127       }
70128       degNum = Math.round(degNum * 10) / 10;
70129       degStr = degNum.toString();
70130       input.property("value", degStr);
70131       corePreferences("validate-square-degrees", degStr);
70132       context.validator().revalidateUnsquare();
70133     }
70134     function isRuleEnabled(d) {
70135       return context.validator().isRuleEnabled(d);
70136     }
70137     function toggleRule(d3_event, d) {
70138       context.validator().toggleRule(d);
70139     }
70140     context.validator().on("validated.uiSectionValidationRules", function() {
70141       window.requestIdleCallback(section.reRender);
70142     });
70143     return section;
70144   }
70145
70146   // modules/ui/sections/validation_status.js
70147   function uiSectionValidationStatus(context) {
70148     var section = uiSection("issues-status", context).content(renderContent).shouldDisplay(function() {
70149       var issues = context.validator().getIssues(getOptions());
70150       return issues.length === 0;
70151     });
70152     function getOptions() {
70153       return {
70154         what: corePreferences("validate-what") || "edited",
70155         where: corePreferences("validate-where") || "all"
70156       };
70157     }
70158     function renderContent(selection2) {
70159       var box = selection2.selectAll(".box").data([0]);
70160       var boxEnter = box.enter().append("div").attr("class", "box");
70161       boxEnter.append("div").call(svgIcon("#iD-icon-apply", "pre-text"));
70162       var noIssuesMessage = boxEnter.append("span");
70163       noIssuesMessage.append("strong").attr("class", "message");
70164       noIssuesMessage.append("br");
70165       noIssuesMessage.append("span").attr("class", "details");
70166       renderIgnoredIssuesReset(selection2);
70167       setNoIssuesText(selection2);
70168     }
70169     function renderIgnoredIssuesReset(selection2) {
70170       var ignoredIssues = context.validator().getIssues({ what: "all", where: "all", includeDisabledRules: true, includeIgnored: "only" });
70171       var resetIgnored = selection2.selectAll(".reset-ignored").data(ignoredIssues.length ? [0] : []);
70172       resetIgnored.exit().remove();
70173       var resetIgnoredEnter = resetIgnored.enter().append("div").attr("class", "reset-ignored section-footer");
70174       resetIgnoredEnter.append("a").attr("href", "#");
70175       resetIgnored = resetIgnored.merge(resetIgnoredEnter);
70176       resetIgnored.select("a").html(_t.html("inspector.title_count", { title: { html: _t.html("issues.reset_ignored") }, count: ignoredIssues.length }));
70177       resetIgnored.on("click", function(d3_event) {
70178         d3_event.preventDefault();
70179         context.validator().resetIgnoredIssues();
70180       });
70181     }
70182     function setNoIssuesText(selection2) {
70183       var opts = getOptions();
70184       function checkForHiddenIssues(cases) {
70185         for (var type2 in cases) {
70186           var hiddenOpts = cases[type2];
70187           var hiddenIssues = context.validator().getIssues(hiddenOpts);
70188           if (hiddenIssues.length) {
70189             selection2.select(".box .details").html("").call(_t.append(
70190               "issues.no_issues.hidden_issues." + type2,
70191               { count: hiddenIssues.length.toString() }
70192             ));
70193             return;
70194           }
70195         }
70196         selection2.select(".box .details").html("").call(_t.append("issues.no_issues.hidden_issues.none"));
70197       }
70198       var messageType;
70199       if (opts.what === "edited" && opts.where === "visible") {
70200         messageType = "edits_in_view";
70201         checkForHiddenIssues({
70202           elsewhere: { what: "edited", where: "all" },
70203           everything_else: { what: "all", where: "visible" },
70204           disabled_rules: { what: "edited", where: "visible", includeDisabledRules: "only" },
70205           everything_else_elsewhere: { what: "all", where: "all" },
70206           disabled_rules_elsewhere: { what: "edited", where: "all", includeDisabledRules: "only" },
70207           ignored_issues: { what: "edited", where: "visible", includeIgnored: "only" },
70208           ignored_issues_elsewhere: { what: "edited", where: "all", includeIgnored: "only" }
70209         });
70210       } else if (opts.what === "edited" && opts.where === "all") {
70211         messageType = "edits";
70212         checkForHiddenIssues({
70213           everything_else: { what: "all", where: "all" },
70214           disabled_rules: { what: "edited", where: "all", includeDisabledRules: "only" },
70215           ignored_issues: { what: "edited", where: "all", includeIgnored: "only" }
70216         });
70217       } else if (opts.what === "all" && opts.where === "visible") {
70218         messageType = "everything_in_view";
70219         checkForHiddenIssues({
70220           elsewhere: { what: "all", where: "all" },
70221           disabled_rules: { what: "all", where: "visible", includeDisabledRules: "only" },
70222           disabled_rules_elsewhere: { what: "all", where: "all", includeDisabledRules: "only" },
70223           ignored_issues: { what: "all", where: "visible", includeIgnored: "only" },
70224           ignored_issues_elsewhere: { what: "all", where: "all", includeIgnored: "only" }
70225         });
70226       } else if (opts.what === "all" && opts.where === "all") {
70227         messageType = "everything";
70228         checkForHiddenIssues({
70229           disabled_rules: { what: "all", where: "all", includeDisabledRules: "only" },
70230           ignored_issues: { what: "all", where: "all", includeIgnored: "only" }
70231         });
70232       }
70233       if (opts.what === "edited" && context.history().difference().summary().length === 0) {
70234         messageType = "no_edits";
70235       }
70236       selection2.select(".box .message").html("").call(_t.append("issues.no_issues.message." + messageType));
70237     }
70238     context.validator().on("validated.uiSectionValidationStatus", function() {
70239       window.requestIdleCallback(section.reRender);
70240     });
70241     context.map().on(
70242       "move.uiSectionValidationStatus",
70243       debounce_default(function() {
70244         window.requestIdleCallback(section.reRender);
70245       }, 1e3)
70246     );
70247     return section;
70248   }
70249
70250   // modules/ui/panes/issues.js
70251   function uiPaneIssues(context) {
70252     var issuesPane = uiPane("issues", context).key(_t("issues.key")).label(_t.append("issues.title")).description(_t.append("issues.title")).iconName("iD-icon-alert").sections([
70253       uiSectionValidationOptions(context),
70254       uiSectionValidationStatus(context),
70255       uiSectionValidationIssues("issues-errors", "error", context),
70256       uiSectionValidationIssues("issues-warnings", "warning", context),
70257       uiSectionValidationRules(context)
70258     ]);
70259     return issuesPane;
70260   }
70261
70262   // modules/ui/settings/custom_data.js
70263   function uiSettingsCustomData(context) {
70264     var dispatch10 = dispatch_default("change");
70265     function render(selection2) {
70266       var dataLayer = context.layers().layer("data");
70267       var _origSettings = {
70268         fileList: dataLayer && dataLayer.fileList() || null,
70269         url: corePreferences("settings-custom-data-url")
70270       };
70271       var _currSettings = {
70272         fileList: dataLayer && dataLayer.fileList() || null,
70273         url: corePreferences("settings-custom-data-url")
70274       };
70275       var modal = uiConfirm(selection2).okButton();
70276       modal.classed("settings-modal settings-custom-data", true);
70277       modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_data.header"));
70278       var textSection = modal.select(".modal-section.message-text");
70279       textSection.append("pre").attr("class", "instructions-file").call(_t.append("settings.custom_data.file.instructions"));
70280       textSection.append("input").attr("class", "field-file").attr("type", "file").attr("accept", ".gpx,.kml,.geojson,.json,application/gpx+xml,application/vnd.google-earth.kml+xml,application/geo+json,application/json").property("files", _currSettings.fileList).on("change", function(d3_event) {
70281         var files = d3_event.target.files;
70282         if (files && files.length) {
70283           _currSettings.url = "";
70284           textSection.select(".field-url").property("value", "");
70285           _currSettings.fileList = files;
70286         } else {
70287           _currSettings.fileList = null;
70288         }
70289       });
70290       textSection.append("h4").call(_t.append("settings.custom_data.or"));
70291       textSection.append("pre").attr("class", "instructions-url").call(_t.append("settings.custom_data.url.instructions"));
70292       textSection.append("textarea").attr("class", "field-url").attr("placeholder", _t("settings.custom_data.url.placeholder")).call(utilNoAuto).property("value", _currSettings.url);
70293       var buttonSection = modal.select(".modal-section.buttons");
70294       buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
70295       buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
70296       buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
70297       function isSaveDisabled() {
70298         return null;
70299       }
70300       function clickCancel() {
70301         textSection.select(".field-url").property("value", _origSettings.url);
70302         corePreferences("settings-custom-data-url", _origSettings.url);
70303         this.blur();
70304         modal.close();
70305       }
70306       function clickSave() {
70307         _currSettings.url = textSection.select(".field-url").property("value").trim();
70308         if (_currSettings.url) {
70309           _currSettings.fileList = null;
70310         }
70311         if (_currSettings.fileList) {
70312           _currSettings.url = "";
70313         }
70314         corePreferences("settings-custom-data-url", _currSettings.url);
70315         this.blur();
70316         modal.close();
70317         dispatch10.call("change", this, _currSettings);
70318       }
70319     }
70320     return utilRebind(render, dispatch10, "on");
70321   }
70322
70323   // modules/ui/sections/data_layers.js
70324   function uiSectionDataLayers(context) {
70325     var settingsCustomData = uiSettingsCustomData(context).on("change", customChanged);
70326     var layers = context.layers();
70327     var section = uiSection("data-layers", context).label(() => _t.append("map_data.data_layers")).disclosureContent(renderDisclosureContent);
70328     function renderDisclosureContent(selection2) {
70329       var container = selection2.selectAll(".data-layer-container").data([0]);
70330       container.enter().append("div").attr("class", "data-layer-container").merge(container).call(drawOsmItems).call(drawQAItems).call(drawCustomDataItems).call(drawVectorItems).call(drawPanelItems);
70331     }
70332     function showsLayer(which) {
70333       var layer = layers.layer(which);
70334       if (layer) {
70335         return layer.enabled();
70336       }
70337       return false;
70338     }
70339     function setLayer(which, enabled) {
70340       var mode = context.mode();
70341       if (mode && /^draw/.test(mode.id))
70342         return;
70343       var layer = layers.layer(which);
70344       if (layer) {
70345         layer.enabled(enabled);
70346         if (!enabled && (which === "osm" || which === "notes")) {
70347           context.enter(modeBrowse(context));
70348         }
70349       }
70350     }
70351     function toggleLayer(which) {
70352       setLayer(which, !showsLayer(which));
70353     }
70354     function drawOsmItems(selection2) {
70355       var osmKeys = ["osm", "notes"];
70356       var osmLayers = layers.all().filter(function(obj) {
70357         return osmKeys.indexOf(obj.id) !== -1;
70358       });
70359       var ul = selection2.selectAll(".layer-list-osm").data([0]);
70360       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-osm").merge(ul);
70361       var li = ul.selectAll(".list-item").data(osmLayers);
70362       li.exit().remove();
70363       var liEnter = li.enter().append("li").attr("class", function(d) {
70364         return "list-item list-item-" + d.id;
70365       });
70366       var labelEnter = liEnter.append("label").each(function(d) {
70367         if (d.id === "osm") {
70368           select_default2(this).call(
70369             uiTooltip().title(() => _t.append("map_data.layers." + d.id + ".tooltip")).keys([uiCmd("\u2325" + _t("area_fill.wireframe.key"))]).placement("bottom")
70370           );
70371         } else {
70372           select_default2(this).call(
70373             uiTooltip().title(() => _t.append("map_data.layers." + d.id + ".tooltip")).placement("bottom")
70374           );
70375         }
70376       });
70377       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
70378         toggleLayer(d.id);
70379       });
70380       labelEnter.append("span").html(function(d) {
70381         return _t.html("map_data.layers." + d.id + ".title");
70382       });
70383       li.merge(liEnter).classed("active", function(d) {
70384         return d.layer.enabled();
70385       }).selectAll("input").property("checked", function(d) {
70386         return d.layer.enabled();
70387       });
70388     }
70389     function drawQAItems(selection2) {
70390       var qaKeys = ["keepRight", "improveOSM", "osmose"];
70391       var qaLayers = layers.all().filter(function(obj) {
70392         return qaKeys.indexOf(obj.id) !== -1;
70393       });
70394       var ul = selection2.selectAll(".layer-list-qa").data([0]);
70395       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-qa").merge(ul);
70396       var li = ul.selectAll(".list-item").data(qaLayers);
70397       li.exit().remove();
70398       var liEnter = li.enter().append("li").attr("class", function(d) {
70399         return "list-item list-item-" + d.id;
70400       });
70401       var labelEnter = liEnter.append("label").each(function(d) {
70402         select_default2(this).call(
70403           uiTooltip().title(() => _t.append("map_data.layers." + d.id + ".tooltip")).placement("bottom")
70404         );
70405       });
70406       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
70407         toggleLayer(d.id);
70408       });
70409       labelEnter.append("span").each(function(d) {
70410         _t.append("map_data.layers." + d.id + ".title")(select_default2(this));
70411       });
70412       li.merge(liEnter).classed("active", function(d) {
70413         return d.layer.enabled();
70414       }).selectAll("input").property("checked", function(d) {
70415         return d.layer.enabled();
70416       });
70417     }
70418     function drawVectorItems(selection2) {
70419       var dataLayer = layers.layer("data");
70420       var vtData = [
70421         {
70422           name: "Detroit Neighborhoods/Parks",
70423           src: "neighborhoods-parks",
70424           tooltip: "Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.",
70425           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"
70426         },
70427         {
70428           name: "Detroit Composite POIs",
70429           src: "composite-poi",
70430           tooltip: "Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.",
70431           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"
70432         },
70433         {
70434           name: "Detroit All-The-Places POIs",
70435           src: "alltheplaces-poi",
70436           tooltip: "Public domain business location data created by web scrapers.",
70437           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"
70438         }
70439       ];
70440       var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
70441       var showVectorItems = context.map().zoom() > 9 && detroit.contains(context.map().center());
70442       var container = selection2.selectAll(".vectortile-container").data(showVectorItems ? [0] : []);
70443       container.exit().remove();
70444       var containerEnter = container.enter().append("div").attr("class", "vectortile-container");
70445       containerEnter.append("h4").attr("class", "vectortile-header").text("Detroit Vector Tiles (Beta)");
70446       containerEnter.append("ul").attr("class", "layer-list layer-list-vectortile");
70447       containerEnter.append("div").attr("class", "vectortile-footer").append("a").attr("target", "_blank").call(svgIcon("#iD-icon-out-link", "inline")).attr("href", "https://github.com/osmus/detroit-mapping-challenge").append("span").text("About these layers");
70448       container = container.merge(containerEnter);
70449       var ul = container.selectAll(".layer-list-vectortile");
70450       var li = ul.selectAll(".list-item").data(vtData);
70451       li.exit().remove();
70452       var liEnter = li.enter().append("li").attr("class", function(d) {
70453         return "list-item list-item-" + d.src;
70454       });
70455       var labelEnter = liEnter.append("label").each(function(d) {
70456         select_default2(this).call(
70457           uiTooltip().title(d.tooltip).placement("top")
70458         );
70459       });
70460       labelEnter.append("input").attr("type", "radio").attr("name", "vectortile").on("change", selectVTLayer);
70461       labelEnter.append("span").text(function(d) {
70462         return d.name;
70463       });
70464       li.merge(liEnter).classed("active", isVTLayerSelected).selectAll("input").property("checked", isVTLayerSelected);
70465       function isVTLayerSelected(d) {
70466         return dataLayer && dataLayer.template() === d.template;
70467       }
70468       function selectVTLayer(d3_event, d) {
70469         corePreferences("settings-custom-data-url", d.template);
70470         if (dataLayer) {
70471           dataLayer.template(d.template, d.src);
70472           dataLayer.enabled(true);
70473         }
70474       }
70475     }
70476     function drawCustomDataItems(selection2) {
70477       var dataLayer = layers.layer("data");
70478       var hasData = dataLayer && dataLayer.hasData();
70479       var showsData = hasData && dataLayer.enabled();
70480       var ul = selection2.selectAll(".layer-list-data").data(dataLayer ? [0] : []);
70481       ul.exit().remove();
70482       var ulEnter = ul.enter().append("ul").attr("class", "layer-list layer-list-data");
70483       var liEnter = ulEnter.append("li").attr("class", "list-item-data");
70484       var labelEnter = liEnter.append("label").call(
70485         uiTooltip().title(() => _t.append("map_data.layers.custom.tooltip")).placement("top")
70486       );
70487       labelEnter.append("input").attr("type", "checkbox").on("change", function() {
70488         toggleLayer("data");
70489       });
70490       labelEnter.append("span").call(_t.append("map_data.layers.custom.title"));
70491       liEnter.append("button").attr("class", "open-data-options").call(
70492         uiTooltip().title(() => _t.append("settings.custom_data.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
70493       ).on("click", function(d3_event) {
70494         d3_event.preventDefault();
70495         editCustom();
70496       }).call(svgIcon("#iD-icon-more"));
70497       liEnter.append("button").attr("class", "zoom-to-data").call(
70498         uiTooltip().title(() => _t.append("map_data.layers.custom.zoom")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
70499       ).on("click", function(d3_event) {
70500         if (select_default2(this).classed("disabled"))
70501           return;
70502         d3_event.preventDefault();
70503         d3_event.stopPropagation();
70504         dataLayer.fitZoom();
70505       }).call(svgIcon("#iD-icon-framed-dot", "monochrome"));
70506       ul = ul.merge(ulEnter);
70507       ul.selectAll(".list-item-data").classed("active", showsData).selectAll("label").classed("deemphasize", !hasData).selectAll("input").property("disabled", !hasData).property("checked", showsData);
70508       ul.selectAll("button.zoom-to-data").classed("disabled", !hasData);
70509     }
70510     function editCustom() {
70511       context.container().call(settingsCustomData);
70512     }
70513     function customChanged(d) {
70514       var dataLayer = layers.layer("data");
70515       if (d && d.url) {
70516         dataLayer.url(d.url);
70517       } else if (d && d.fileList) {
70518         dataLayer.fileList(d.fileList);
70519       }
70520     }
70521     function drawPanelItems(selection2) {
70522       var panelsListEnter = selection2.selectAll(".md-extras-list").data([0]).enter().append("ul").attr("class", "layer-list md-extras-list");
70523       var historyPanelLabelEnter = panelsListEnter.append("li").attr("class", "history-panel-toggle-item").append("label").call(
70524         uiTooltip().title(() => _t.append("map_data.history_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.history.key"))]).placement("top")
70525       );
70526       historyPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
70527         d3_event.preventDefault();
70528         context.ui().info.toggle("history");
70529       });
70530       historyPanelLabelEnter.append("span").call(_t.append("map_data.history_panel.title"));
70531       var measurementPanelLabelEnter = panelsListEnter.append("li").attr("class", "measurement-panel-toggle-item").append("label").call(
70532         uiTooltip().title(() => _t.append("map_data.measurement_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.measurement.key"))]).placement("top")
70533       );
70534       measurementPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
70535         d3_event.preventDefault();
70536         context.ui().info.toggle("measurement");
70537       });
70538       measurementPanelLabelEnter.append("span").call(_t.append("map_data.measurement_panel.title"));
70539     }
70540     context.layers().on("change.uiSectionDataLayers", section.reRender);
70541     context.map().on(
70542       "move.uiSectionDataLayers",
70543       debounce_default(function() {
70544         window.requestIdleCallback(section.reRender);
70545       }, 1e3)
70546     );
70547     return section;
70548   }
70549
70550   // modules/ui/sections/map_features.js
70551   function uiSectionMapFeatures(context) {
70552     var _features = context.features().keys();
70553     var section = uiSection("map-features", context).label(() => _t.append("map_data.map_features")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
70554     function renderDisclosureContent(selection2) {
70555       var container = selection2.selectAll(".layer-feature-list-container").data([0]);
70556       var containerEnter = container.enter().append("div").attr("class", "layer-feature-list-container");
70557       containerEnter.append("ul").attr("class", "layer-list layer-feature-list");
70558       var footer = containerEnter.append("div").attr("class", "feature-list-links section-footer");
70559       footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) {
70560         d3_event.preventDefault();
70561         context.features().disableAll();
70562       });
70563       footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) {
70564         d3_event.preventDefault();
70565         context.features().enableAll();
70566       });
70567       container = container.merge(containerEnter);
70568       container.selectAll(".layer-feature-list").call(drawListItems, _features, "checkbox", "feature", clickFeature, showsFeature);
70569     }
70570     function drawListItems(selection2, data, type2, name, change, active) {
70571       var items = selection2.selectAll("li").data(data);
70572       items.exit().remove();
70573       var enter = items.enter().append("li").call(
70574         uiTooltip().title(function(d) {
70575           var tip = _t.append(name + "." + d + ".tooltip");
70576           if (autoHiddenFeature(d)) {
70577             var msg = showsLayer("osm") ? _t.append("map_data.autohidden") : _t.append("map_data.osmhidden");
70578             return (selection3) => {
70579               selection3.call(tip);
70580               selection3.append("div").call(msg);
70581             };
70582           }
70583           return tip;
70584         }).placement("top")
70585       );
70586       var label = enter.append("label");
70587       label.append("input").attr("type", type2).attr("name", name).on("change", change);
70588       label.append("span").html(function(d) {
70589         return _t.html(name + "." + d + ".description");
70590       });
70591       items = items.merge(enter);
70592       items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", autoHiddenFeature);
70593     }
70594     function autoHiddenFeature(d) {
70595       return context.features().autoHidden(d);
70596     }
70597     function showsFeature(d) {
70598       return context.features().enabled(d);
70599     }
70600     function clickFeature(d3_event, d) {
70601       context.features().toggle(d);
70602     }
70603     function showsLayer(id2) {
70604       var layer = context.layers().layer(id2);
70605       return layer && layer.enabled();
70606     }
70607     context.features().on("change.map_features", section.reRender);
70608     return section;
70609   }
70610
70611   // modules/ui/sections/map_style_options.js
70612   function uiSectionMapStyleOptions(context) {
70613     var section = uiSection("fill-area", context).label(() => _t.append("map_data.style_options")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
70614     function renderDisclosureContent(selection2) {
70615       var container = selection2.selectAll(".layer-fill-list").data([0]);
70616       container.enter().append("ul").attr("class", "layer-list layer-fill-list").merge(container).call(drawListItems, context.map().areaFillOptions, "radio", "area_fill", setFill, isActiveFill);
70617       var container2 = selection2.selectAll(".layer-visual-diff-list").data([0]);
70618       container2.enter().append("ul").attr("class", "layer-list layer-visual-diff-list").merge(container2).call(drawListItems, ["highlight_edits"], "checkbox", "visual_diff", toggleHighlightEdited, function() {
70619         return context.surface().classed("highlight-edited");
70620       });
70621     }
70622     function drawListItems(selection2, data, type2, name, change, active) {
70623       var items = selection2.selectAll("li").data(data);
70624       items.exit().remove();
70625       var enter = items.enter().append("li").call(
70626         uiTooltip().title(function(d) {
70627           return _t.append(name + "." + d + ".tooltip");
70628         }).keys(function(d) {
70629           var key = d === "wireframe" ? _t("area_fill.wireframe.key") : null;
70630           if (d === "highlight_edits")
70631             key = _t("map_data.highlight_edits.key");
70632           return key ? [key] : null;
70633         }).placement("top")
70634       );
70635       var label = enter.append("label");
70636       label.append("input").attr("type", type2).attr("name", name).on("change", change);
70637       label.append("span").html(function(d) {
70638         return _t.html(name + "." + d + ".description");
70639       });
70640       items = items.merge(enter);
70641       items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false);
70642     }
70643     function isActiveFill(d) {
70644       return context.map().activeAreaFill() === d;
70645     }
70646     function toggleHighlightEdited(d3_event) {
70647       d3_event.preventDefault();
70648       context.map().toggleHighlightEdited();
70649     }
70650     function setFill(d3_event, d) {
70651       context.map().activeAreaFill(d);
70652     }
70653     context.map().on("changeHighlighting.ui_style, changeAreaFill.ui_style", section.reRender);
70654     return section;
70655   }
70656
70657   // modules/ui/sections/photo_overlays.js
70658   function uiSectionPhotoOverlays(context) {
70659     var layers = context.layers();
70660     var section = uiSection("photo-overlays", context).label(() => _t.append("photo_overlays.title")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
70661     function renderDisclosureContent(selection2) {
70662       var container = selection2.selectAll(".photo-overlay-container").data([0]);
70663       container.enter().append("div").attr("class", "photo-overlay-container").merge(container).call(drawPhotoItems).call(drawPhotoTypeItems).call(drawDateFilter).call(drawUsernameFilter);
70664     }
70665     function drawPhotoItems(selection2) {
70666       var photoKeys = context.photos().overlayLayerIDs();
70667       var photoLayers = layers.all().filter(function(obj) {
70668         return photoKeys.indexOf(obj.id) !== -1;
70669       });
70670       var data = photoLayers.filter(function(obj) {
70671         return obj.layer.supported();
70672       });
70673       function layerSupported(d) {
70674         return d.layer && d.layer.supported();
70675       }
70676       function layerEnabled(d) {
70677         return layerSupported(d) && d.layer.enabled();
70678       }
70679       var ul = selection2.selectAll(".layer-list-photos").data([0]);
70680       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photos").merge(ul);
70681       var li = ul.selectAll(".list-item-photos").data(data);
70682       li.exit().remove();
70683       var liEnter = li.enter().append("li").attr("class", function(d) {
70684         var classes = "list-item-photos list-item-" + d.id;
70685         if (d.id === "mapillary-signs" || d.id === "mapillary-map-features") {
70686           classes += " indented";
70687         }
70688         return classes;
70689       });
70690       var labelEnter = liEnter.append("label").each(function(d) {
70691         var titleID;
70692         if (d.id === "mapillary-signs")
70693           titleID = "mapillary.signs.tooltip";
70694         else if (d.id === "mapillary")
70695           titleID = "mapillary_images.tooltip";
70696         else if (d.id === "kartaview")
70697           titleID = "kartaview_images.tooltip";
70698         else
70699           titleID = d.id.replace(/-/g, "_") + ".tooltip";
70700         select_default2(this).call(
70701           uiTooltip().title(() => _t.append(titleID)).placement("top")
70702         );
70703       });
70704       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
70705         toggleLayer(d.id);
70706       });
70707       labelEnter.append("span").html(function(d) {
70708         var id2 = d.id;
70709         if (id2 === "mapillary-signs")
70710           id2 = "photo_overlays.traffic_signs";
70711         return _t.html(id2.replace(/-/g, "_") + ".title");
70712       });
70713       li.merge(liEnter).classed("active", layerEnabled).selectAll("input").property("checked", layerEnabled);
70714     }
70715     function drawPhotoTypeItems(selection2) {
70716       var data = context.photos().allPhotoTypes();
70717       function typeEnabled(d) {
70718         return context.photos().showsPhotoType(d);
70719       }
70720       var ul = selection2.selectAll(".layer-list-photo-types").data([0]);
70721       ul.exit().remove();
70722       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photo-types").merge(ul);
70723       var li = ul.selectAll(".list-item-photo-types").data(context.photos().shouldFilterByPhotoType() ? data : []);
70724       li.exit().remove();
70725       var liEnter = li.enter().append("li").attr("class", function(d) {
70726         return "list-item-photo-types list-item-" + d;
70727       });
70728       var labelEnter = liEnter.append("label").each(function(d) {
70729         select_default2(this).call(
70730           uiTooltip().title(() => _t.append("photo_overlays.photo_type." + d + ".tooltip")).placement("top")
70731         );
70732       });
70733       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
70734         context.photos().togglePhotoType(d);
70735       });
70736       labelEnter.append("span").html(function(d) {
70737         return _t.html("photo_overlays.photo_type." + d + ".title");
70738       });
70739       li.merge(liEnter).classed("active", typeEnabled).selectAll("input").property("checked", typeEnabled);
70740     }
70741     function drawDateFilter(selection2) {
70742       var data = context.photos().dateFilters();
70743       function filterEnabled(d) {
70744         return context.photos().dateFilterValue(d);
70745       }
70746       var ul = selection2.selectAll(".layer-list-date-filter").data([0]);
70747       ul.exit().remove();
70748       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-date-filter").merge(ul);
70749       var li = ul.selectAll(".list-item-date-filter").data(context.photos().shouldFilterByDate() ? data : []);
70750       li.exit().remove();
70751       var liEnter = li.enter().append("li").attr("class", "list-item-date-filter");
70752       var labelEnter = liEnter.append("label").each(function(d) {
70753         select_default2(this).call(
70754           uiTooltip().title(() => _t.append("photo_overlays.date_filter." + d + ".tooltip")).placement("top")
70755         );
70756       });
70757       labelEnter.append("span").each(function(d) {
70758         _t.append("photo_overlays.date_filter." + d + ".title")(select_default2(this));
70759       });
70760       labelEnter.append("input").attr("type", "date").attr("class", "list-item-input").attr("placeholder", _t("units.year_month_day")).call(utilNoAuto).each(function(d) {
70761         utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d) || "");
70762       }).on("change", function(d3_event, d) {
70763         var value = utilGetSetValue(select_default2(this)).trim();
70764         context.photos().setDateFilter(d, value, true);
70765         li.selectAll("input").each(function(d2) {
70766           utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d2) || "");
70767         });
70768       });
70769       li = li.merge(liEnter).classed("active", filterEnabled);
70770     }
70771     function drawUsernameFilter(selection2) {
70772       function filterEnabled() {
70773         return context.photos().usernames();
70774       }
70775       var ul = selection2.selectAll(".layer-list-username-filter").data([0]);
70776       ul.exit().remove();
70777       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-username-filter").merge(ul);
70778       var li = ul.selectAll(".list-item-username-filter").data(context.photos().shouldFilterByUsername() ? ["username-filter"] : []);
70779       li.exit().remove();
70780       var liEnter = li.enter().append("li").attr("class", "list-item-username-filter");
70781       var labelEnter = liEnter.append("label").each(function() {
70782         select_default2(this).call(
70783           uiTooltip().title(() => _t.append("photo_overlays.username_filter.tooltip")).placement("top")
70784         );
70785       });
70786       labelEnter.append("span").call(_t.append("photo_overlays.username_filter.title"));
70787       labelEnter.append("input").attr("type", "text").attr("class", "list-item-input").call(utilNoAuto).property("value", usernameValue).on("change", function() {
70788         var value = select_default2(this).property("value");
70789         context.photos().setUsernameFilter(value, true);
70790         select_default2(this).property("value", usernameValue);
70791       });
70792       li.merge(liEnter).classed("active", filterEnabled);
70793       function usernameValue() {
70794         var usernames = context.photos().usernames();
70795         if (usernames)
70796           return usernames.join("; ");
70797         return usernames;
70798       }
70799     }
70800     function toggleLayer(which) {
70801       setLayer(which, !showsLayer(which));
70802     }
70803     function showsLayer(which) {
70804       var layer = layers.layer(which);
70805       if (layer) {
70806         return layer.enabled();
70807       }
70808       return false;
70809     }
70810     function setLayer(which, enabled) {
70811       var layer = layers.layer(which);
70812       if (layer) {
70813         layer.enabled(enabled);
70814       }
70815     }
70816     context.layers().on("change.uiSectionPhotoOverlays", section.reRender);
70817     context.photos().on("change.uiSectionPhotoOverlays", section.reRender);
70818     return section;
70819   }
70820
70821   // modules/ui/panes/map_data.js
70822   function uiPaneMapData(context) {
70823     var mapDataPane = uiPane("map-data", context).key(_t("map_data.key")).label(_t.append("map_data.title")).description(_t.append("map_data.description")).iconName("iD-icon-data").sections([
70824       uiSectionDataLayers(context),
70825       uiSectionPhotoOverlays(context),
70826       uiSectionMapStyleOptions(context),
70827       uiSectionMapFeatures(context)
70828     ]);
70829     return mapDataPane;
70830   }
70831
70832   // modules/ui/panes/preferences.js
70833   function uiPanePreferences(context) {
70834     let preferencesPane = uiPane("preferences", context).key(_t("preferences.key")).label(_t.append("preferences.title")).description(_t.append("preferences.description")).iconName("fas-user-cog").sections([
70835       uiSectionPrivacy(context)
70836     ]);
70837     return preferencesPane;
70838   }
70839
70840   // modules/ui/init.js
70841   function uiInit(context) {
70842     var _initCounter = 0;
70843     var _needWidth = {};
70844     var _lastPointerType;
70845     function render(container) {
70846       container.on("click.ui", function(d3_event) {
70847         if (d3_event.button !== 0)
70848           return;
70849         if (!d3_event.composedPath)
70850           return;
70851         var isOkayTarget = d3_event.composedPath().some(function(node) {
70852           return node.nodeType === 1 && // clicking <input> focuses it and/or changes a value
70853           (node.nodeName === "INPUT" || // clicking <label> affects its <input> by default
70854           node.nodeName === "LABEL" || // clicking <a> opens a hyperlink by default
70855           node.nodeName === "A");
70856         });
70857         if (isOkayTarget)
70858           return;
70859         d3_event.preventDefault();
70860       });
70861       var detected = utilDetect();
70862       if ("GestureEvent" in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping,
70863       // but we only need to do this on desktop Safari anyway. – #7694
70864       !detected.isMobileWebKit) {
70865         container.on("gesturestart.ui gesturechange.ui gestureend.ui", function(d3_event) {
70866           d3_event.preventDefault();
70867         });
70868       }
70869       if ("PointerEvent" in window) {
70870         select_default2(window).on("pointerdown.ui pointerup.ui", function(d3_event) {
70871           var pointerType = d3_event.pointerType || "mouse";
70872           if (_lastPointerType !== pointerType) {
70873             _lastPointerType = pointerType;
70874             container.attr("pointer", pointerType);
70875           }
70876         }, true);
70877       } else {
70878         _lastPointerType = "mouse";
70879         container.attr("pointer", "mouse");
70880       }
70881       container.attr("lang", _mainLocalizer.localeCode()).attr("dir", _mainLocalizer.textDirection());
70882       container.call(uiFullScreen(context));
70883       var map2 = context.map();
70884       map2.redrawEnable(false);
70885       map2.on("hitMinZoom.ui", function() {
70886         ui.flash.iconName("#iD-icon-no").label(_t.append("cannot_zoom"))();
70887       });
70888       container.append("svg").attr("id", "ideditor-defs").call(ui.svgDefs);
70889       container.append("div").attr("class", "sidebar").call(ui.sidebar);
70890       var content = container.append("div").attr("class", "main-content active");
70891       content.append("div").attr("class", "top-toolbar-wrap").append("div").attr("class", "top-toolbar fillD").call(uiTopToolbar(context));
70892       content.append("div").attr("class", "main-map").attr("dir", "ltr").call(map2);
70893       var overMap = content.append("div").attr("class", "over-map");
70894       overMap.append("div").attr("class", "select-trap").text("t");
70895       overMap.call(uiMapInMap(context)).call(uiNotice(context));
70896       overMap.append("div").attr("class", "spinner").call(uiSpinner(context));
70897       var controlsWrap = overMap.append("div").attr("class", "map-controls-wrap");
70898       var controls = controlsWrap.append("div").attr("class", "map-controls");
70899       controls.append("div").attr("class", "map-control zoombuttons").call(uiZoom(context));
70900       controls.append("div").attr("class", "map-control zoom-to-selection-control").call(uiZoomToSelection(context));
70901       controls.append("div").attr("class", "map-control geolocate-control").call(uiGeolocate(context));
70902       controlsWrap.on("wheel.mapControls", function(d3_event) {
70903         if (!d3_event.deltaX) {
70904           controlsWrap.node().scrollTop += d3_event.deltaY;
70905         }
70906       });
70907       var panes = overMap.append("div").attr("class", "map-panes");
70908       var uiPanes = [
70909         uiPaneBackground(context),
70910         uiPaneMapData(context),
70911         uiPaneIssues(context),
70912         uiPanePreferences(context),
70913         uiPaneHelp(context)
70914       ];
70915       uiPanes.forEach(function(pane) {
70916         controls.append("div").attr("class", "map-control map-pane-control " + pane.id + "-control").call(pane.renderToggleButton);
70917         panes.call(pane.renderPane);
70918       });
70919       ui.info = uiInfo(context);
70920       overMap.call(ui.info);
70921       overMap.append("div").attr("class", "photoviewer").classed("al", true).classed("hide", true).call(ui.photoviewer);
70922       overMap.append("div").attr("class", "attribution-wrap").attr("dir", "ltr").call(uiAttribution(context));
70923       var about = content.append("div").attr("class", "map-footer");
70924       about.append("div").attr("class", "api-status").call(uiStatus(context));
70925       var footer = about.append("div").attr("class", "map-footer-bar fillD");
70926       footer.append("div").attr("class", "flash-wrap footer-hide");
70927       var footerWrap = footer.append("div").attr("class", "main-footer-wrap footer-show");
70928       footerWrap.append("div").attr("class", "scale-block").call(uiScale(context));
70929       var aboutList = footerWrap.append("div").attr("class", "info-block").append("ul").attr("class", "map-footer-list");
70930       aboutList.append("li").attr("class", "user-list").call(uiContributors(context));
70931       var apiConnections = context.connection().apiConnections();
70932       if (apiConnections && apiConnections.length > 1) {
70933         aboutList.append("li").attr("class", "source-switch").call(
70934           uiSourceSwitch(context).keys(apiConnections)
70935         );
70936       }
70937       aboutList.append("li").attr("class", "issues-info").call(uiIssuesInfo(context));
70938       aboutList.append("li").attr("class", "feature-warning").call(uiFeatureInfo(context));
70939       var issueLinks = aboutList.append("li");
70940       issueLinks.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD/issues").attr("aria-label", _t("report_a_bug")).call(svgIcon("#iD-icon-bug", "light")).call(uiTooltip().title(() => _t.append("report_a_bug")).placement("top"));
70941       issueLinks.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md#translating").attr("aria-label", _t("help_translate")).call(svgIcon("#iD-icon-translate", "light")).call(uiTooltip().title(() => _t.append("help_translate")).placement("top"));
70942       aboutList.append("li").attr("class", "version").call(uiVersion(context));
70943       if (!context.embed()) {
70944         aboutList.call(uiAccount(context));
70945       }
70946       ui.onResize();
70947       map2.redrawEnable(true);
70948       ui.hash = behaviorHash(context);
70949       ui.hash();
70950       if (!ui.hash.hadLocation) {
70951         map2.centerZoom([0, 0], 2);
70952       }
70953       window.onbeforeunload = function() {
70954         return context.save();
70955       };
70956       window.onunload = function() {
70957         context.history().unlock();
70958       };
70959       select_default2(window).on("resize.editor", function() {
70960         ui.onResize();
70961       });
70962       var panPixels = 80;
70963       context.keybinding().on("\u232B", function(d3_event) {
70964         d3_event.preventDefault();
70965       }).on([_t("sidebar.key"), "`", "\xB2", "@"], ui.sidebar.toggle).on("\u2190", pan([panPixels, 0])).on("\u2191", pan([0, panPixels])).on("\u2192", pan([-panPixels, 0])).on("\u2193", pan([0, -panPixels])).on(uiCmd("\u2325\u2190"), pan([map2.dimensions()[0], 0])).on(uiCmd("\u2325\u2191"), pan([0, map2.dimensions()[1]])).on(uiCmd("\u2325\u2192"), pan([-map2.dimensions()[0], 0])).on(uiCmd("\u2325\u2193"), pan([0, -map2.dimensions()[1]])).on(uiCmd("\u2318" + _t("background.key")), function quickSwitch(d3_event) {
70966         if (d3_event) {
70967           d3_event.stopImmediatePropagation();
70968           d3_event.preventDefault();
70969         }
70970         var previousBackground = context.background().findSource(corePreferences("background-last-used-toggle"));
70971         if (previousBackground) {
70972           var currentBackground = context.background().baseLayerSource();
70973           corePreferences("background-last-used-toggle", currentBackground.id);
70974           corePreferences("background-last-used", previousBackground.id);
70975           context.background().baseLayerSource(previousBackground);
70976         }
70977       }).on(_t("area_fill.wireframe.key"), function toggleWireframe(d3_event) {
70978         d3_event.preventDefault();
70979         d3_event.stopPropagation();
70980         context.map().toggleWireframe();
70981       }).on(uiCmd("\u2325" + _t("area_fill.wireframe.key")), function toggleOsmData(d3_event) {
70982         d3_event.preventDefault();
70983         d3_event.stopPropagation();
70984         var mode = context.mode();
70985         if (mode && /^draw/.test(mode.id))
70986           return;
70987         var layer = context.layers().layer("osm");
70988         if (layer) {
70989           layer.enabled(!layer.enabled());
70990           if (!layer.enabled()) {
70991             context.enter(modeBrowse(context));
70992           }
70993         }
70994       }).on(_t("map_data.highlight_edits.key"), function toggleHighlightEdited(d3_event) {
70995         d3_event.preventDefault();
70996         context.map().toggleHighlightEdited();
70997       });
70998       context.on("enter.editor", function(entered) {
70999         container.classed("mode-" + entered.id, true);
71000       }).on("exit.editor", function(exited) {
71001         container.classed("mode-" + exited.id, false);
71002       });
71003       context.enter(modeBrowse(context));
71004       if (!_initCounter++) {
71005         if (!ui.hash.startWalkthrough) {
71006           context.container().call(uiSplash(context)).call(uiRestore(context));
71007         }
71008         context.container().call(ui.shortcuts);
71009       }
71010       var osm = context.connection();
71011       var auth = uiLoading(context).message(_t.html("loading_auth")).blocking(true);
71012       if (osm && auth) {
71013         osm.on("authLoading.ui", function() {
71014           context.container().call(auth);
71015         }).on("authDone.ui", function() {
71016           auth.close();
71017         });
71018       }
71019       _initCounter++;
71020       if (ui.hash.startWalkthrough) {
71021         ui.hash.startWalkthrough = false;
71022         context.container().call(uiIntro(context));
71023       }
71024       function pan(d) {
71025         return function(d3_event) {
71026           if (d3_event.shiftKey)
71027             return;
71028           if (context.container().select(".combobox").size())
71029             return;
71030           d3_event.preventDefault();
71031           context.map().pan(d, 100);
71032         };
71033       }
71034     }
71035     let ui = {};
71036     let _loadPromise;
71037     ui.ensureLoaded = () => {
71038       if (_loadPromise)
71039         return _loadPromise;
71040       return _loadPromise = Promise.all([
71041         // must have strings and presets before loading the UI
71042         _mainLocalizer.ensureLoaded(),
71043         _mainPresetIndex.ensureLoaded()
71044       ]).then(() => {
71045         if (!context.container().empty())
71046           render(context.container());
71047       }).catch((err) => console.error(err));
71048     };
71049     ui.restart = function() {
71050       context.keybinding().clear();
71051       _loadPromise = null;
71052       context.container().selectAll("*").remove();
71053       ui.ensureLoaded();
71054     };
71055     ui.lastPointerType = function() {
71056       return _lastPointerType;
71057     };
71058     ui.svgDefs = svgDefs(context);
71059     ui.flash = uiFlash(context);
71060     ui.sidebar = uiSidebar(context);
71061     ui.photoviewer = uiPhotoviewer(context);
71062     ui.shortcuts = uiShortcuts(context);
71063     ui.onResize = function(withPan) {
71064       var map2 = context.map();
71065       var mapDimensions = utilGetDimensions(context.container().select(".main-content"), true);
71066       utilGetDimensions(context.container().select(".sidebar"), true);
71067       if (withPan !== void 0) {
71068         map2.redrawEnable(false);
71069         map2.pan(withPan);
71070         map2.redrawEnable(true);
71071       }
71072       map2.dimensions(mapDimensions);
71073       ui.photoviewer.onMapResize();
71074       ui.checkOverflow(".top-toolbar");
71075       ui.checkOverflow(".map-footer-bar");
71076       var resizeWindowEvent = document.createEvent("Event");
71077       resizeWindowEvent.initEvent("resizeWindow", true, true);
71078       document.dispatchEvent(resizeWindowEvent);
71079     };
71080     ui.checkOverflow = function(selector, reset) {
71081       if (reset) {
71082         delete _needWidth[selector];
71083       }
71084       var selection2 = context.container().select(selector);
71085       if (selection2.empty())
71086         return;
71087       var scrollWidth = selection2.property("scrollWidth");
71088       var clientWidth = selection2.property("clientWidth");
71089       var needed = _needWidth[selector] || scrollWidth;
71090       if (scrollWidth > clientWidth) {
71091         selection2.classed("narrow", true);
71092         if (!_needWidth[selector]) {
71093           _needWidth[selector] = scrollWidth;
71094         }
71095       } else if (scrollWidth >= needed) {
71096         selection2.classed("narrow", false);
71097       }
71098     };
71099     ui.togglePanes = function(showPane) {
71100       var hidePanes = context.container().selectAll(".map-pane.shown");
71101       var side = _mainLocalizer.textDirection() === "ltr" ? "right" : "left";
71102       hidePanes.classed("shown", false).classed("hide", true);
71103       context.container().selectAll(".map-pane-control button").classed("active", false);
71104       if (showPane) {
71105         hidePanes.classed("shown", false).classed("hide", true).style(side, "-500px");
71106         context.container().selectAll("." + showPane.attr("pane") + "-control button").classed("active", true);
71107         showPane.classed("shown", true).classed("hide", false);
71108         if (hidePanes.empty()) {
71109           showPane.style(side, "-500px").transition().duration(200).style(side, "0px");
71110         } else {
71111           showPane.style(side, "0px");
71112         }
71113       } else {
71114         hidePanes.classed("shown", true).classed("hide", false).style(side, "0px").transition().duration(200).style(side, "-500px").on("end", function() {
71115           select_default2(this).classed("shown", false).classed("hide", true);
71116         });
71117       }
71118     };
71119     var _editMenu = uiEditMenu(context);
71120     ui.editMenu = function() {
71121       return _editMenu;
71122     };
71123     ui.showEditMenu = function(anchorPoint, triggerType, operations) {
71124       ui.closeEditMenu();
71125       if (!operations && context.mode().operations)
71126         operations = context.mode().operations();
71127       if (!operations || !operations.length)
71128         return;
71129       if (!context.map().editableDataEnabled())
71130         return;
71131       var surfaceNode = context.surface().node();
71132       if (surfaceNode.focus) {
71133         surfaceNode.focus();
71134       }
71135       operations.forEach(function(operation) {
71136         if (operation.point)
71137           operation.point(anchorPoint);
71138       });
71139       _editMenu.anchorLoc(anchorPoint).triggerType(triggerType).operations(operations);
71140       context.map().supersurface.call(_editMenu);
71141     };
71142     ui.closeEditMenu = function() {
71143       context.map().supersurface.select(".edit-menu").remove();
71144     };
71145     var _saveLoading = select_default2(null);
71146     context.uploader().on("saveStarted.ui", function() {
71147       _saveLoading = uiLoading(context).message(_t.html("save.uploading")).blocking(true);
71148       context.container().call(_saveLoading);
71149     }).on("saveEnded.ui", function() {
71150       _saveLoading.close();
71151       _saveLoading = select_default2(null);
71152     });
71153     return ui;
71154   }
71155
71156   // modules/core/context.js
71157   function coreContext() {
71158     const dispatch10 = dispatch_default("enter", "exit", "change");
71159     let context = utilRebind({}, dispatch10, "on");
71160     let _deferred2 = /* @__PURE__ */ new Set();
71161     context.version = package_default.version;
71162     context.privacyVersion = "20201202";
71163     context.initialHashParams = window.location.hash ? utilStringQs(window.location.hash) : {};
71164     context.changeset = null;
71165     let _defaultChangesetComment = context.initialHashParams.comment;
71166     let _defaultChangesetSource = context.initialHashParams.source;
71167     let _defaultChangesetHashtags = context.initialHashParams.hashtags;
71168     context.defaultChangesetComment = function(val) {
71169       if (!arguments.length)
71170         return _defaultChangesetComment;
71171       _defaultChangesetComment = val;
71172       return context;
71173     };
71174     context.defaultChangesetSource = function(val) {
71175       if (!arguments.length)
71176         return _defaultChangesetSource;
71177       _defaultChangesetSource = val;
71178       return context;
71179     };
71180     context.defaultChangesetHashtags = function(val) {
71181       if (!arguments.length)
71182         return _defaultChangesetHashtags;
71183       _defaultChangesetHashtags = val;
71184       return context;
71185     };
71186     let _setsDocumentTitle = true;
71187     context.setsDocumentTitle = function(val) {
71188       if (!arguments.length)
71189         return _setsDocumentTitle;
71190       _setsDocumentTitle = val;
71191       return context;
71192     };
71193     let _documentTitleBase = document.title;
71194     context.documentTitleBase = function(val) {
71195       if (!arguments.length)
71196         return _documentTitleBase;
71197       _documentTitleBase = val;
71198       return context;
71199     };
71200     let _ui;
71201     context.ui = () => _ui;
71202     context.lastPointerType = () => _ui.lastPointerType();
71203     let _keybinding = utilKeybinding("context");
71204     context.keybinding = () => _keybinding;
71205     select_default2(document).call(_keybinding);
71206     let _connection = services.osm;
71207     let _history;
71208     let _validator;
71209     let _uploader;
71210     context.connection = () => _connection;
71211     context.history = () => _history;
71212     context.validator = () => _validator;
71213     context.uploader = () => _uploader;
71214     context.preauth = (options2) => {
71215       if (_connection) {
71216         _connection.switch(options2);
71217       }
71218       return context;
71219     };
71220     context.locale = function(locale2) {
71221       if (!arguments.length)
71222         return _mainLocalizer.localeCode();
71223       _mainLocalizer.preferredLocaleCodes(locale2);
71224       return context;
71225     };
71226     function afterLoad(cid, callback) {
71227       return (err, result) => {
71228         if (err) {
71229           if (err.status === 400 || err.status === 401 || err.status === 403) {
71230             if (_connection) {
71231               _connection.logout();
71232             }
71233           }
71234           if (typeof callback === "function") {
71235             callback(err);
71236           }
71237           return;
71238         } else if (_connection && _connection.getConnectionId() !== cid) {
71239           if (typeof callback === "function") {
71240             callback({ message: "Connection Switched", status: -1 });
71241           }
71242           return;
71243         } else {
71244           _history.merge(result.data, result.extent);
71245           if (typeof callback === "function") {
71246             callback(err, result);
71247           }
71248           return;
71249         }
71250       };
71251     }
71252     context.loadTiles = (projection2, callback) => {
71253       const handle = window.requestIdleCallback(() => {
71254         _deferred2.delete(handle);
71255         if (_connection && context.editableDataEnabled()) {
71256           const cid = _connection.getConnectionId();
71257           _connection.loadTiles(projection2, afterLoad(cid, callback));
71258         }
71259       });
71260       _deferred2.add(handle);
71261     };
71262     context.loadTileAtLoc = (loc, callback) => {
71263       const handle = window.requestIdleCallback(() => {
71264         _deferred2.delete(handle);
71265         if (_connection && context.editableDataEnabled()) {
71266           const cid = _connection.getConnectionId();
71267           _connection.loadTileAtLoc(loc, afterLoad(cid, callback));
71268         }
71269       });
71270       _deferred2.add(handle);
71271     };
71272     context.loadEntity = (entityID, callback) => {
71273       if (_connection) {
71274         const cid = _connection.getConnectionId();
71275         _connection.loadEntity(entityID, afterLoad(cid, callback));
71276         _connection.loadEntityRelations(entityID, afterLoad(cid, callback));
71277       }
71278     };
71279     context.zoomToEntity = (entityID, zoomTo) => {
71280       context.loadEntity(entityID, (err, result) => {
71281         if (err)
71282           return;
71283         if (zoomTo !== false) {
71284           const entity = result.data.find((e) => e.id === entityID);
71285           if (entity) {
71286             _map.zoomTo(entity);
71287           }
71288         }
71289       });
71290       _map.on("drawn.zoomToEntity", () => {
71291         if (!context.hasEntity(entityID))
71292           return;
71293         _map.on("drawn.zoomToEntity", null);
71294         context.on("enter.zoomToEntity", null);
71295         context.enter(modeSelect(context, [entityID]));
71296       });
71297       context.on("enter.zoomToEntity", () => {
71298         if (_mode.id !== "browse") {
71299           _map.on("drawn.zoomToEntity", null);
71300           context.on("enter.zoomToEntity", null);
71301         }
71302       });
71303     };
71304     let _minEditableZoom = 16;
71305     context.minEditableZoom = function(val) {
71306       if (!arguments.length)
71307         return _minEditableZoom;
71308       _minEditableZoom = val;
71309       if (_connection) {
71310         _connection.tileZoom(val);
71311       }
71312       return context;
71313     };
71314     context.maxCharsForTagKey = () => 255;
71315     context.maxCharsForTagValue = () => 255;
71316     context.maxCharsForRelationRole = () => 255;
71317     context.cleanTagKey = (val) => utilCleanOsmString(val, context.maxCharsForTagKey());
71318     context.cleanTagValue = (val) => utilCleanOsmString(val, context.maxCharsForTagValue());
71319     context.cleanRelationRole = (val) => utilCleanOsmString(val, context.maxCharsForRelationRole());
71320     let _inIntro = false;
71321     context.inIntro = function(val) {
71322       if (!arguments.length)
71323         return _inIntro;
71324       _inIntro = val;
71325       return context;
71326     };
71327     context.save = () => {
71328       if (_inIntro || context.container().select(".modal").size())
71329         return;
71330       let canSave;
71331       if (_mode && _mode.id === "save") {
71332         canSave = false;
71333         if (services.osm && services.osm.isChangesetInflight()) {
71334           _history.clearSaved();
71335           return;
71336         }
71337       } else {
71338         canSave = context.selectedIDs().every((id2) => {
71339           const entity = context.hasEntity(id2);
71340           return entity && !entity.isDegenerate();
71341         });
71342       }
71343       if (canSave) {
71344         _history.save();
71345       }
71346       if (_history.hasChanges()) {
71347         return _t("save.unsaved_changes");
71348       }
71349     };
71350     context.debouncedSave = debounce_default(context.save, 350);
71351     function withDebouncedSave(fn) {
71352       return function() {
71353         const result = fn.apply(_history, arguments);
71354         context.debouncedSave();
71355         return result;
71356       };
71357     }
71358     context.hasEntity = (id2) => _history.graph().hasEntity(id2);
71359     context.entity = (id2) => _history.graph().entity(id2);
71360     let _mode;
71361     context.mode = () => _mode;
71362     context.enter = (newMode) => {
71363       if (_mode) {
71364         _mode.exit();
71365         dispatch10.call("exit", this, _mode);
71366       }
71367       _mode = newMode;
71368       _mode.enter();
71369       dispatch10.call("enter", this, _mode);
71370     };
71371     context.selectedIDs = () => _mode && _mode.selectedIDs && _mode.selectedIDs() || [];
71372     context.activeID = () => _mode && _mode.activeID && _mode.activeID();
71373     let _selectedNoteID;
71374     context.selectedNoteID = function(noteID) {
71375       if (!arguments.length)
71376         return _selectedNoteID;
71377       _selectedNoteID = noteID;
71378       return context;
71379     };
71380     let _selectedErrorID;
71381     context.selectedErrorID = function(errorID) {
71382       if (!arguments.length)
71383         return _selectedErrorID;
71384       _selectedErrorID = errorID;
71385       return context;
71386     };
71387     context.install = (behavior) => context.surface().call(behavior);
71388     context.uninstall = (behavior) => context.surface().call(behavior.off);
71389     let _copyGraph;
71390     context.copyGraph = () => _copyGraph;
71391     let _copyIDs = [];
71392     context.copyIDs = function(val) {
71393       if (!arguments.length)
71394         return _copyIDs;
71395       _copyIDs = val;
71396       _copyGraph = _history.graph();
71397       return context;
71398     };
71399     let _copyLonLat;
71400     context.copyLonLat = function(val) {
71401       if (!arguments.length)
71402         return _copyLonLat;
71403       _copyLonLat = val;
71404       return context;
71405     };
71406     let _background;
71407     context.background = () => _background;
71408     let _features;
71409     context.features = () => _features;
71410     context.hasHiddenConnections = (id2) => {
71411       const graph = _history.graph();
71412       const entity = graph.entity(id2);
71413       return _features.hasHiddenConnections(entity, graph);
71414     };
71415     let _photos;
71416     context.photos = () => _photos;
71417     let _map;
71418     context.map = () => _map;
71419     context.layers = () => _map.layers();
71420     context.surface = () => _map.surface;
71421     context.editableDataEnabled = () => _map.editableDataEnabled();
71422     context.surfaceRect = () => _map.surface.node().getBoundingClientRect();
71423     context.editable = () => {
71424       const mode = context.mode();
71425       if (!mode || mode.id === "save")
71426         return false;
71427       return _map.editableDataEnabled();
71428     };
71429     let _debugFlags = {
71430       tile: false,
71431       // tile boundaries
71432       collision: false,
71433       // label collision bounding boxes
71434       imagery: false,
71435       // imagery bounding polygons
71436       target: false,
71437       // touch targets
71438       downloaded: false
71439       // downloaded data from osm
71440     };
71441     context.debugFlags = () => _debugFlags;
71442     context.getDebug = (flag) => flag && _debugFlags[flag];
71443     context.setDebug = function(flag, val) {
71444       if (arguments.length === 1)
71445         val = true;
71446       _debugFlags[flag] = val;
71447       dispatch10.call("change");
71448       return context;
71449     };
71450     let _container = select_default2(null);
71451     context.container = function(val) {
71452       if (!arguments.length)
71453         return _container;
71454       _container = val;
71455       _container.classed("ideditor", true);
71456       return context;
71457     };
71458     context.containerNode = function(val) {
71459       if (!arguments.length)
71460         return context.container().node();
71461       context.container(select_default2(val));
71462       return context;
71463     };
71464     let _embed;
71465     context.embed = function(val) {
71466       if (!arguments.length)
71467         return _embed;
71468       _embed = val;
71469       return context;
71470     };
71471     let _assetPath = "";
71472     context.assetPath = function(val) {
71473       if (!arguments.length)
71474         return _assetPath;
71475       _assetPath = val;
71476       _mainFileFetcher.assetPath(val);
71477       return context;
71478     };
71479     let _assetMap = {};
71480     context.assetMap = function(val) {
71481       if (!arguments.length)
71482         return _assetMap;
71483       _assetMap = val;
71484       _mainFileFetcher.assetMap(val);
71485       return context;
71486     };
71487     context.asset = (val) => {
71488       if (/^http(s)?:\/\//i.test(val))
71489         return val;
71490       const filename = _assetPath + val;
71491       return _assetMap[filename] || filename;
71492     };
71493     context.imagePath = (val) => context.asset(`img/${val}`);
71494     context.reset = context.flush = () => {
71495       context.debouncedSave.cancel();
71496       Array.from(_deferred2).forEach((handle) => {
71497         window.cancelIdleCallback(handle);
71498         _deferred2.delete(handle);
71499       });
71500       Object.values(services).forEach((service) => {
71501         if (service && typeof service.reset === "function") {
71502           service.reset(context);
71503         }
71504       });
71505       context.changeset = null;
71506       _validator.reset();
71507       _features.reset();
71508       _history.reset();
71509       _uploader.reset();
71510       context.container().select(".inspector-wrap *").remove();
71511       return context;
71512     };
71513     context.projection = geoRawMercator();
71514     context.curtainProjection = geoRawMercator();
71515     context.init = () => {
71516       instantiateInternal();
71517       initializeDependents();
71518       return context;
71519       function instantiateInternal() {
71520         _history = coreHistory(context);
71521         context.graph = _history.graph;
71522         context.pauseChangeDispatch = _history.pauseChangeDispatch;
71523         context.resumeChangeDispatch = _history.resumeChangeDispatch;
71524         context.perform = withDebouncedSave(_history.perform);
71525         context.replace = withDebouncedSave(_history.replace);
71526         context.pop = withDebouncedSave(_history.pop);
71527         context.overwrite = withDebouncedSave(_history.overwrite);
71528         context.undo = withDebouncedSave(_history.undo);
71529         context.redo = withDebouncedSave(_history.redo);
71530         _validator = coreValidator(context);
71531         _uploader = coreUploader(context);
71532         _background = rendererBackground(context);
71533         _features = rendererFeatures(context);
71534         _map = rendererMap(context);
71535         _photos = rendererPhotos(context);
71536         _ui = uiInit(context);
71537       }
71538       function initializeDependents() {
71539         if (context.initialHashParams.presets) {
71540           _mainPresetIndex.addablePresetIDs(new Set(context.initialHashParams.presets.split(",")));
71541         }
71542         if (context.initialHashParams.locale) {
71543           _mainLocalizer.preferredLocaleCodes(context.initialHashParams.locale);
71544         }
71545         _mainLocalizer.ensureLoaded();
71546         _mainPresetIndex.ensureLoaded();
71547         _background.ensureLoaded();
71548         Object.values(services).forEach((service) => {
71549           if (service && typeof service.init === "function") {
71550             service.init();
71551           }
71552         });
71553         _map.init();
71554         _validator.init();
71555         _features.init();
71556         if (services.maprules && context.initialHashParams.maprules) {
71557           json_default(context.initialHashParams.maprules).then((mapcss) => {
71558             services.maprules.init();
71559             mapcss.forEach((mapcssSelector) => services.maprules.addRule(mapcssSelector));
71560           }).catch(() => {
71561           });
71562         }
71563         if (!context.container().empty()) {
71564           _ui.ensureLoaded().then(() => {
71565             _background.init();
71566             _photos.init();
71567           });
71568         }
71569       }
71570     };
71571     return context;
71572   }
71573
71574   // modules/services/nsi.js
71575   var _nsiStatus = "loading";
71576   var _nsi = {};
71577   var buildingPreset = {
71578     "building/commercial": true,
71579     "building/government": true,
71580     "building/hotel": true,
71581     "building/retail": true,
71582     "building/office": true,
71583     "building/supermarket": true,
71584     "building/yes": true
71585   };
71586   var notNames = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i;
71587   var notBranches = /(coop|express|wireless|factory|outlet)/i;
71588   function setNsiSources() {
71589     const nsiVersion = package_default.dependencies["name-suggestion-index"] || package_default.devDependencies["name-suggestion-index"];
71590     const v = (0, import_vparse2.default)(nsiVersion);
71591     const vMinor = `${v.major}.${v.minor}`;
71592     const cdn = nsiCdnUrl.replace("{version}", vMinor);
71593     const sources = {
71594       "nsi_data": cdn + "dist/nsi.min.json",
71595       "nsi_dissolved": cdn + "dist/dissolved.min.json",
71596       "nsi_features": cdn + "dist/featureCollection.min.json",
71597       "nsi_generics": cdn + "dist/genericWords.min.json",
71598       "nsi_presets": cdn + "dist/presets/nsi-id-presets.min.json",
71599       "nsi_replacements": cdn + "dist/replacements.min.json",
71600       "nsi_trees": cdn + "dist/trees.min.json"
71601     };
71602     let fileMap = _mainFileFetcher.fileMap();
71603     for (const k in sources) {
71604       if (!fileMap[k])
71605         fileMap[k] = sources[k];
71606     }
71607   }
71608   function loadNsiPresets() {
71609     return Promise.all([
71610       _mainFileFetcher.get("nsi_presets"),
71611       _mainFileFetcher.get("nsi_features")
71612     ]).then((vals) => {
71613       Object.values(vals[0].presets).forEach((preset) => preset.suggestion = true);
71614       _mainPresetIndex.merge({
71615         presets: vals[0].presets,
71616         featureCollection: vals[1]
71617       });
71618     });
71619   }
71620   function loadNsiData() {
71621     return Promise.all([
71622       _mainFileFetcher.get("nsi_data"),
71623       _mainFileFetcher.get("nsi_dissolved"),
71624       _mainFileFetcher.get("nsi_replacements"),
71625       _mainFileFetcher.get("nsi_trees")
71626     ]).then((vals) => {
71627       _nsi = {
71628         data: vals[0].nsi,
71629         // the raw name-suggestion-index data
71630         dissolved: vals[1].dissolved,
71631         // list of dissolved items
71632         replacements: vals[2].replacements,
71633         // trivial old->new qid replacements
71634         trees: vals[3].trees,
71635         // metadata about trees, main tags
71636         kvt: /* @__PURE__ */ new Map(),
71637         // Map (k -> Map (v -> t) )
71638         qids: /* @__PURE__ */ new Map(),
71639         // Map (wd/wp tag values -> qids)
71640         ids: /* @__PURE__ */ new Map()
71641         // Map (id -> NSI item)
71642       };
71643       const matcher = _nsi.matcher = new Matcher();
71644       matcher.buildMatchIndex(_nsi.data);
71645       matcher.itemLocation = /* @__PURE__ */ new Map();
71646       matcher.locationSets = /* @__PURE__ */ new Map();
71647       Object.keys(_nsi.data).forEach((tkv) => {
71648         const items = _nsi.data[tkv].items;
71649         if (!Array.isArray(items) || !items.length)
71650           return;
71651         items.forEach((item) => {
71652           if (matcher.itemLocation.has(item.id))
71653             return;
71654           const locationSetID = _sharedLocationManager.locationSetID(item.locationSet);
71655           matcher.itemLocation.set(item.id, locationSetID);
71656           if (matcher.locationSets.has(locationSetID))
71657             return;
71658           const fakeFeature = { id: locationSetID, properties: { id: locationSetID, area: 1 } };
71659           matcher.locationSets.set(locationSetID, fakeFeature);
71660         });
71661       });
71662       matcher.locationIndex = (bbox2) => {
71663         const validHere = _sharedLocationManager.locationSetsAt([bbox2[0], bbox2[1]]);
71664         const results = [];
71665         for (const [locationSetID, area] of Object.entries(validHere)) {
71666           const fakeFeature = matcher.locationSets.get(locationSetID);
71667           if (fakeFeature) {
71668             fakeFeature.properties.area = area;
71669             results.push(fakeFeature);
71670           }
71671         }
71672         return results;
71673       };
71674       Object.keys(_nsi.data).forEach((tkv) => {
71675         const category = _nsi.data[tkv];
71676         const parts = tkv.split("/", 3);
71677         const t = parts[0];
71678         const k = parts[1];
71679         const v = parts[2];
71680         let vmap = _nsi.kvt.get(k);
71681         if (!vmap) {
71682           vmap = /* @__PURE__ */ new Map();
71683           _nsi.kvt.set(k, vmap);
71684         }
71685         vmap.set(v, t);
71686         const tree = _nsi.trees[t];
71687         const mainTag = tree.mainTag;
71688         const items = category.items || [];
71689         items.forEach((item) => {
71690           item.tkv = tkv;
71691           item.mainTag = mainTag;
71692           _nsi.ids.set(item.id, item);
71693           const wd = item.tags[mainTag];
71694           const wp = item.tags[mainTag.replace("wikidata", "wikipedia")];
71695           if (wd)
71696             _nsi.qids.set(wd, wd);
71697           if (wp && wd)
71698             _nsi.qids.set(wp, wd);
71699         });
71700       });
71701     });
71702   }
71703   function gatherKVs(tags) {
71704     let primary = /* @__PURE__ */ new Set();
71705     let alternate = /* @__PURE__ */ new Set();
71706     Object.keys(tags).forEach((osmkey) => {
71707       const osmvalue = tags[osmkey];
71708       if (!osmvalue)
71709         return;
71710       if (osmkey === "route_master")
71711         osmkey = "route";
71712       const vmap = _nsi.kvt.get(osmkey);
71713       if (!vmap)
71714         return;
71715       if (vmap.get(osmvalue)) {
71716         primary.add(`${osmkey}/${osmvalue}`);
71717       } else if (osmvalue === "yes") {
71718         alternate.add(`${osmkey}/${osmvalue}`);
71719       }
71720     });
71721     const preset = _mainPresetIndex.matchTags(tags, "area");
71722     if (buildingPreset[preset.id]) {
71723       alternate.add("building/yes");
71724     }
71725     return { primary, alternate };
71726   }
71727   function identifyTree(tags) {
71728     let unknown;
71729     let t;
71730     Object.keys(tags).forEach((osmkey) => {
71731       if (t)
71732         return;
71733       const osmvalue = tags[osmkey];
71734       if (!osmvalue)
71735         return;
71736       if (osmkey === "route_master")
71737         osmkey = "route";
71738       const vmap = _nsi.kvt.get(osmkey);
71739       if (!vmap)
71740         return;
71741       if (osmvalue === "yes") {
71742         unknown = "unknown";
71743       } else {
71744         t = vmap.get(osmvalue);
71745       }
71746     });
71747     return t || unknown || null;
71748   }
71749   function gatherNames(tags) {
71750     const empty2 = { primary: /* @__PURE__ */ new Set(), alternate: /* @__PURE__ */ new Set() };
71751     let primary = /* @__PURE__ */ new Set();
71752     let alternate = /* @__PURE__ */ new Set();
71753     let foundSemi = false;
71754     let testNameFragments = false;
71755     let patterns2;
71756     let t = identifyTree(tags);
71757     if (!t)
71758       return empty2;
71759     if (t === "transit") {
71760       patterns2 = {
71761         primary: /^network$/i,
71762         alternate: /^(operator|operator:\w+|network:\w+|\w+_name|\w+_name:\w+)$/i
71763       };
71764     } else if (t === "flags") {
71765       patterns2 = {
71766         primary: /^(flag:name|flag:name:\w+)$/i,
71767         alternate: /^(flag|flag:\w+|subject|subject:\w+)$/i
71768         // note: no `country`, we special-case it below
71769       };
71770     } else if (t === "brands") {
71771       testNameFragments = true;
71772       patterns2 = {
71773         primary: /^(name|name:\w+)$/i,
71774         alternate: /^(brand|brand:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
71775       };
71776     } else if (t === "operators") {
71777       testNameFragments = true;
71778       patterns2 = {
71779         primary: /^(name|name:\w+|operator|operator:\w+)$/i,
71780         alternate: /^(brand|brand:\w+|\w+_name|\w+_name:\w+)/i
71781       };
71782     } else {
71783       testNameFragments = true;
71784       patterns2 = {
71785         primary: /^(name|name:\w+)$/i,
71786         alternate: /^(brand|brand:\w+|network|network:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
71787       };
71788     }
71789     if (tags.name && testNameFragments) {
71790       const nameParts = tags.name.split(/[\s\-\/,.]/);
71791       for (let split = nameParts.length; split > 0; split--) {
71792         const name = nameParts.slice(0, split).join(" ");
71793         primary.add(name);
71794       }
71795     }
71796     Object.keys(tags).forEach((osmkey) => {
71797       const osmvalue = tags[osmkey];
71798       if (!osmvalue)
71799         return;
71800       if (isNamelike(osmkey, "primary")) {
71801         if (/;/.test(osmvalue)) {
71802           foundSemi = true;
71803         } else {
71804           primary.add(osmvalue);
71805           alternate.delete(osmvalue);
71806         }
71807       } else if (!primary.has(osmvalue) && isNamelike(osmkey, "alternate")) {
71808         if (/;/.test(osmvalue)) {
71809           foundSemi = true;
71810         } else {
71811           alternate.add(osmvalue);
71812         }
71813       }
71814     });
71815     if (tags.man_made === "flagpole" && !primary.size && !alternate.size && !!tags.country) {
71816       const osmvalue = tags.country;
71817       if (/;/.test(osmvalue)) {
71818         foundSemi = true;
71819       } else {
71820         alternate.add(osmvalue);
71821       }
71822     }
71823     if (foundSemi) {
71824       return empty2;
71825     } else {
71826       return { primary, alternate };
71827     }
71828     function isNamelike(osmkey, which) {
71829       if (osmkey === "old_name")
71830         return false;
71831       return patterns2[which].test(osmkey) && !notNames.test(osmkey);
71832     }
71833   }
71834   function gatherTuples(tryKVs, tryNames) {
71835     let tuples = [];
71836     ["primary", "alternate"].forEach((whichName) => {
71837       const arr = Array.from(tryNames[whichName]).sort((a, b) => b.length - a.length);
71838       arr.forEach((n2) => {
71839         ["primary", "alternate"].forEach((whichKV) => {
71840           tryKVs[whichKV].forEach((kv) => {
71841             const parts = kv.split("/", 2);
71842             const k = parts[0];
71843             const v = parts[1];
71844             tuples.push({ k, v, n: n2 });
71845           });
71846         });
71847       });
71848     });
71849     return tuples;
71850   }
71851   function _upgradeTags(tags, loc) {
71852     let newTags = Object.assign({}, tags);
71853     let changed = false;
71854     Object.keys(newTags).forEach((osmkey) => {
71855       const matchTag = osmkey.match(/^(\w+:)?wikidata$/);
71856       if (matchTag) {
71857         const prefix = matchTag[1] || "";
71858         const wd = newTags[osmkey];
71859         const replace = _nsi.replacements[wd];
71860         if (replace && replace.wikidata !== void 0) {
71861           changed = true;
71862           if (replace.wikidata) {
71863             newTags[osmkey] = replace.wikidata;
71864           } else {
71865             delete newTags[osmkey];
71866           }
71867         }
71868         if (replace && replace.wikipedia !== void 0) {
71869           changed = true;
71870           const wpkey = `${prefix}wikipedia`;
71871           if (replace.wikipedia) {
71872             newTags[wpkey] = replace.wikipedia;
71873           } else {
71874             delete newTags[wpkey];
71875           }
71876         }
71877       }
71878     });
71879     const isRouteMaster = tags.type === "route_master";
71880     const tryKVs = gatherKVs(tags);
71881     if (!tryKVs.primary.size && !tryKVs.alternate.size) {
71882       return changed ? { newTags, matched: null } : null;
71883     }
71884     const tryNames = gatherNames(tags);
71885     const foundQID = _nsi.qids.get(tags.wikidata) || _nsi.qids.get(tags.wikipedia);
71886     if (foundQID)
71887       tryNames.primary.add(foundQID);
71888     if (!tryNames.primary.size && !tryNames.alternate.size) {
71889       return changed ? { newTags, matched: null } : null;
71890     }
71891     const tuples = gatherTuples(tryKVs, tryNames);
71892     for (let i2 = 0; i2 < tuples.length; i2++) {
71893       const tuple = tuples[i2];
71894       const hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n, loc);
71895       if (!hits || !hits.length)
71896         continue;
71897       if (hits[0].match !== "primary" && hits[0].match !== "alternate")
71898         break;
71899       let itemID, item;
71900       for (let j2 = 0; j2 < hits.length; j2++) {
71901         const hit = hits[j2];
71902         itemID = hit.itemID;
71903         if (_nsi.dissolved[itemID])
71904           continue;
71905         item = _nsi.ids.get(itemID);
71906         if (!item)
71907           continue;
71908         const mainTag = item.mainTag;
71909         const itemQID = item.tags[mainTag];
71910         const notQID = newTags[`not:${mainTag}`];
71911         if (
71912           // Exceptions, skip this hit
71913           !itemQID || itemQID === notQID || // No `*:wikidata` or matched a `not:*:wikidata`
71914           newTags.office && !item.tags.office
71915         ) {
71916           item = null;
71917           continue;
71918         } else {
71919           break;
71920         }
71921       }
71922       if (!item)
71923         continue;
71924       item = JSON.parse(JSON.stringify(item));
71925       const tkv = item.tkv;
71926       const parts = tkv.split("/", 3);
71927       const k = parts[1];
71928       const v = parts[2];
71929       const category = _nsi.data[tkv];
71930       const properties = category.properties || {};
71931       let preserveTags = item.preserveTags || properties.preserveTags || [];
71932       ["building", "emergency", "internet_access", "takeaway"].forEach((osmkey) => {
71933         if (k !== osmkey)
71934           preserveTags.push(`^${osmkey}$`);
71935       });
71936       const regexes = preserveTags.map((s) => new RegExp(s, "i"));
71937       let keepTags = {};
71938       Object.keys(newTags).forEach((osmkey) => {
71939         if (regexes.some((regex) => regex.test(osmkey))) {
71940           keepTags[osmkey] = newTags[osmkey];
71941         }
71942       });
71943       _nsi.kvt.forEach((vmap, k2) => {
71944         if (newTags[k2] === "yes")
71945           delete newTags[k2];
71946       });
71947       if (foundQID) {
71948         delete newTags.wikipedia;
71949         delete newTags.wikidata;
71950       }
71951       Object.assign(newTags, item.tags, keepTags);
71952       if (isRouteMaster) {
71953         newTags.route_master = newTags.route;
71954         delete newTags.route;
71955       }
71956       const origName = tags.name;
71957       const newName = newTags.name;
71958       if (newName && origName && newName !== origName && !newTags.branch) {
71959         const newNames = gatherNames(newTags);
71960         const newSet = /* @__PURE__ */ new Set([...newNames.primary, ...newNames.alternate]);
71961         const isMoved = newSet.has(origName);
71962         if (!isMoved) {
71963           const nameParts = origName.split(/[\s\-\/,.]/);
71964           for (let split = nameParts.length; split > 0; split--) {
71965             const name = nameParts.slice(0, split).join(" ");
71966             const branch = nameParts.slice(split).join(" ");
71967             const nameHits = _nsi.matcher.match(k, v, name, loc);
71968             if (!nameHits || !nameHits.length)
71969               continue;
71970             if (nameHits.some((hit) => hit.itemID === itemID)) {
71971               if (branch) {
71972                 if (notBranches.test(branch)) {
71973                   newTags.name = origName;
71974                 } else {
71975                   const branchHits = _nsi.matcher.match(k, v, branch, loc);
71976                   if (branchHits && branchHits.length) {
71977                     if (branchHits[0].match === "primary" || branchHits[0].match === "alternate") {
71978                       return null;
71979                     }
71980                   } else {
71981                     newTags.branch = branch;
71982                   }
71983                 }
71984               }
71985               break;
71986             }
71987           }
71988         }
71989       }
71990       return { newTags, matched: item };
71991     }
71992     return changed ? { newTags, matched: null } : null;
71993   }
71994   function _isGenericName(tags) {
71995     const n2 = tags.name;
71996     if (!n2)
71997       return false;
71998     const tryNames = { primary: /* @__PURE__ */ new Set([n2]), alternate: /* @__PURE__ */ new Set() };
71999     const tryKVs = gatherKVs(tags);
72000     if (!tryKVs.primary.size && !tryKVs.alternate.size)
72001       return false;
72002     const tuples = gatherTuples(tryKVs, tryNames);
72003     for (let i2 = 0; i2 < tuples.length; i2++) {
72004       const tuple = tuples[i2];
72005       const hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n);
72006       if (hits && hits.length && hits[0].match === "excludeGeneric")
72007         return true;
72008     }
72009     return false;
72010   }
72011   var nsi_default = {
72012     // `init()`
72013     // On init, start preparing the name-suggestion-index
72014     //
72015     init: () => {
72016       setNsiSources();
72017       _mainPresetIndex.ensureLoaded().then(() => loadNsiPresets()).then(() => loadNsiData()).then(() => _nsiStatus = "ok").catch(() => _nsiStatus = "failed");
72018     },
72019     // `reset()`
72020     // Reset is called when user saves data to OSM (does nothing here)
72021     //
72022     reset: () => {
72023     },
72024     // `status()`
72025     // To let other code know how it's going...
72026     //
72027     // Returns
72028     //   `String`: 'loading', 'ok', 'failed'
72029     //
72030     status: () => _nsiStatus,
72031     // `isGenericName()`
72032     // Is the `name` tag generic?
72033     //
72034     // Arguments
72035     //   `tags`: `Object` containing the feature's OSM tags
72036     // Returns
72037     //   `true` if it is generic, `false` if not
72038     //
72039     isGenericName: (tags) => _isGenericName(tags),
72040     // `upgradeTags()`
72041     // Suggest tag upgrades.
72042     // This function will not modify the input tags, it makes a copy.
72043     //
72044     // Arguments
72045     //   `tags`: `Object` containing the feature's OSM tags
72046     //   `loc`: Location where this feature exists, as a [lon, lat]
72047     // Returns
72048     //   `Object` containing the result, or `null` if no changes needed:
72049     //   {
72050     //     'newTags': `Object` - The tags the the feature should have
72051     //     'matched': `Object` - The matched item
72052     //   }
72053     //
72054     upgradeTags: (tags, loc) => _upgradeTags(tags, loc),
72055     // `cache()`
72056     // Direct access to the NSI cache, useful for testing or breaking things
72057     //
72058     // Returns
72059     //   `Object`: the internal NSI cache
72060     //
72061     cache: () => _nsi
72062   };
72063
72064   // modules/services/kartaview.js
72065   var import_rbush8 = __toESM(require_rbush_min());
72066   var apibase2 = "https://kartaview.org";
72067   var maxResults = 1e3;
72068   var tileZoom = 14;
72069   var tiler4 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
72070   var dispatch6 = dispatch_default("loadedImages");
72071   var imgZoom = zoom_default2().extent([[0, 0], [320, 240]]).translateExtent([[0, 0], [320, 240]]).scaleExtent([1, 15]);
72072   var _oscCache;
72073   var _oscSelectedImage;
72074   var _loadViewerPromise2;
72075   function abortRequest4(controller) {
72076     controller.abort();
72077   }
72078   function maxPageAtZoom(z) {
72079     if (z < 15)
72080       return 2;
72081     if (z === 15)
72082       return 5;
72083     if (z === 16)
72084       return 10;
72085     if (z === 17)
72086       return 20;
72087     if (z === 18)
72088       return 40;
72089     if (z > 18)
72090       return 80;
72091   }
72092   function loadTiles2(which, url, projection2) {
72093     var currZoom = Math.floor(geoScaleToZoom(projection2.scale()));
72094     var tiles = tiler4.getTiles(projection2);
72095     var cache = _oscCache[which];
72096     Object.keys(cache.inflight).forEach(function(k) {
72097       var wanted = tiles.find(function(tile) {
72098         return k.indexOf(tile.id + ",") === 0;
72099       });
72100       if (!wanted) {
72101         abortRequest4(cache.inflight[k]);
72102         delete cache.inflight[k];
72103       }
72104     });
72105     tiles.forEach(function(tile) {
72106       loadNextTilePage(which, currZoom, url, tile);
72107     });
72108   }
72109   function loadNextTilePage(which, currZoom, url, tile) {
72110     var cache = _oscCache[which];
72111     var bbox2 = tile.extent.bbox();
72112     var maxPages = maxPageAtZoom(currZoom);
72113     var nextPage = cache.nextPage[tile.id] || 1;
72114     var params = utilQsString({
72115       ipp: maxResults,
72116       page: nextPage,
72117       // client_id: clientId,
72118       bbTopLeft: [bbox2.maxY, bbox2.minX].join(","),
72119       bbBottomRight: [bbox2.minY, bbox2.maxX].join(",")
72120     }, true);
72121     if (nextPage > maxPages)
72122       return;
72123     var id2 = tile.id + "," + String(nextPage);
72124     if (cache.loaded[id2] || cache.inflight[id2])
72125       return;
72126     var controller = new AbortController();
72127     cache.inflight[id2] = controller;
72128     var options2 = {
72129       method: "POST",
72130       signal: controller.signal,
72131       body: params,
72132       headers: { "Content-Type": "application/x-www-form-urlencoded" }
72133     };
72134     json_default(url, options2).then(function(data) {
72135       cache.loaded[id2] = true;
72136       delete cache.inflight[id2];
72137       if (!data || !data.currentPageItems || !data.currentPageItems.length) {
72138         throw new Error("No Data");
72139       }
72140       var features = data.currentPageItems.map(function(item) {
72141         var loc = [+item.lng, +item.lat];
72142         var d;
72143         if (which === "images") {
72144           d = {
72145             loc,
72146             key: item.id,
72147             ca: +item.heading,
72148             captured_at: item.shot_date || item.date_added,
72149             captured_by: item.username,
72150             imagePath: item.lth_name,
72151             sequence_id: item.sequence_id,
72152             sequence_index: +item.sequence_index
72153           };
72154           var seq = _oscCache.sequences[d.sequence_id];
72155           if (!seq) {
72156             seq = { rotation: 0, images: [] };
72157             _oscCache.sequences[d.sequence_id] = seq;
72158           }
72159           seq.images[d.sequence_index] = d;
72160           _oscCache.images.forImageKey[d.key] = d;
72161         }
72162         return {
72163           minX: loc[0],
72164           minY: loc[1],
72165           maxX: loc[0],
72166           maxY: loc[1],
72167           data: d
72168         };
72169       });
72170       cache.rtree.load(features);
72171       if (data.currentPageItems.length === maxResults) {
72172         cache.nextPage[tile.id] = nextPage + 1;
72173         loadNextTilePage(which, currZoom, url, tile);
72174       } else {
72175         cache.nextPage[tile.id] = Infinity;
72176       }
72177       if (which === "images") {
72178         dispatch6.call("loadedImages");
72179       }
72180     }).catch(function() {
72181       cache.loaded[id2] = true;
72182       delete cache.inflight[id2];
72183     });
72184   }
72185   function partitionViewport2(projection2) {
72186     var z = geoScaleToZoom(projection2.scale());
72187     var z2 = Math.ceil(z * 2) / 2 + 2.5;
72188     var tiler8 = utilTiler().zoomExtent([z2, z2]);
72189     return tiler8.getTiles(projection2).map(function(tile) {
72190       return tile.extent;
72191     });
72192   }
72193   function searchLimited2(limit, projection2, rtree) {
72194     limit = limit || 5;
72195     return partitionViewport2(projection2).reduce(function(result, extent) {
72196       var found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) {
72197         return d.data;
72198       });
72199       return found.length ? result.concat(found) : result;
72200     }, []);
72201   }
72202   var kartaview_default = {
72203     init: function() {
72204       if (!_oscCache) {
72205         this.reset();
72206       }
72207       this.event = utilRebind(this, dispatch6, "on");
72208     },
72209     reset: function() {
72210       if (_oscCache) {
72211         Object.values(_oscCache.images.inflight).forEach(abortRequest4);
72212       }
72213       _oscCache = {
72214         images: { inflight: {}, loaded: {}, nextPage: {}, rtree: new import_rbush8.default(), forImageKey: {} },
72215         sequences: {}
72216       };
72217       _oscSelectedImage = null;
72218     },
72219     images: function(projection2) {
72220       var limit = 5;
72221       return searchLimited2(limit, projection2, _oscCache.images.rtree);
72222     },
72223     sequences: function(projection2) {
72224       var viewport = projection2.clipExtent();
72225       var min3 = [viewport[0][0], viewport[1][1]];
72226       var max3 = [viewport[1][0], viewport[0][1]];
72227       var bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
72228       var sequenceKeys = {};
72229       _oscCache.images.rtree.search(bbox2).forEach(function(d) {
72230         sequenceKeys[d.data.sequence_id] = true;
72231       });
72232       var lineStrings = [];
72233       Object.keys(sequenceKeys).forEach(function(sequenceKey) {
72234         var seq = _oscCache.sequences[sequenceKey];
72235         var images = seq && seq.images;
72236         if (images) {
72237           lineStrings.push({
72238             type: "LineString",
72239             coordinates: images.map(function(d) {
72240               return d.loc;
72241             }).filter(Boolean),
72242             properties: {
72243               captured_at: images[0] ? images[0].captured_at : null,
72244               captured_by: images[0] ? images[0].captured_by : null,
72245               key: sequenceKey
72246             }
72247           });
72248         }
72249       });
72250       return lineStrings;
72251     },
72252     cachedImage: function(imageKey) {
72253       return _oscCache.images.forImageKey[imageKey];
72254     },
72255     loadImages: function(projection2) {
72256       var url = apibase2 + "/1.0/list/nearby-photos/";
72257       loadTiles2("images", url, projection2);
72258     },
72259     ensureViewerLoaded: function(context) {
72260       if (_loadViewerPromise2)
72261         return _loadViewerPromise2;
72262       var wrap2 = context.container().select(".photoviewer").selectAll(".kartaview-wrapper").data([0]);
72263       var that = this;
72264       var wrapEnter = wrap2.enter().append("div").attr("class", "photo-wrapper kartaview-wrapper").classed("hide", true).call(imgZoom.on("zoom", zoomPan)).on("dblclick.zoom", null);
72265       wrapEnter.append("div").attr("class", "photo-attribution fillD");
72266       var controlsEnter = wrapEnter.append("div").attr("class", "photo-controls-wrap").append("div").attr("class", "photo-controls");
72267       controlsEnter.append("button").on("click.back", step(-1)).text("\u25C4");
72268       controlsEnter.append("button").on("click.rotate-ccw", rotate(-90)).text("\u293F");
72269       controlsEnter.append("button").on("click.rotate-cw", rotate(90)).text("\u293E");
72270       controlsEnter.append("button").on("click.forward", step(1)).text("\u25BA");
72271       wrapEnter.append("div").attr("class", "kartaview-image-wrap");
72272       context.ui().photoviewer.on("resize.kartaview", function(dimensions) {
72273         imgZoom = zoom_default2().extent([[0, 0], dimensions]).translateExtent([[0, 0], dimensions]).scaleExtent([1, 15]).on("zoom", zoomPan);
72274       });
72275       function zoomPan(d3_event) {
72276         var t = d3_event.transform;
72277         context.container().select(".photoviewer .kartaview-image-wrap").call(utilSetTransform, t.x, t.y, t.k);
72278       }
72279       function rotate(deg) {
72280         return function() {
72281           if (!_oscSelectedImage)
72282             return;
72283           var sequenceKey = _oscSelectedImage.sequence_id;
72284           var sequence = _oscCache.sequences[sequenceKey];
72285           if (!sequence)
72286             return;
72287           var r = sequence.rotation || 0;
72288           r += deg;
72289           if (r > 180)
72290             r -= 360;
72291           if (r < -180)
72292             r += 360;
72293           sequence.rotation = r;
72294           var wrap3 = context.container().select(".photoviewer .kartaview-wrapper");
72295           wrap3.transition().duration(100).call(imgZoom.transform, identity2);
72296           wrap3.selectAll(".kartaview-image").transition().duration(100).style("transform", "rotate(" + r + "deg)");
72297         };
72298       }
72299       function step(stepBy) {
72300         return function() {
72301           if (!_oscSelectedImage)
72302             return;
72303           var sequenceKey = _oscSelectedImage.sequence_id;
72304           var sequence = _oscCache.sequences[sequenceKey];
72305           if (!sequence)
72306             return;
72307           var nextIndex = _oscSelectedImage.sequence_index + stepBy;
72308           var nextImage = sequence.images[nextIndex];
72309           if (!nextImage)
72310             return;
72311           context.map().centerEase(nextImage.loc);
72312           that.selectImage(context, nextImage.key);
72313         };
72314       }
72315       _loadViewerPromise2 = Promise.resolve();
72316       return _loadViewerPromise2;
72317     },
72318     showViewer: function(context) {
72319       var viewer = context.container().select(".photoviewer").classed("hide", false);
72320       var isHidden = viewer.selectAll(".photo-wrapper.kartaview-wrapper.hide").size();
72321       if (isHidden) {
72322         viewer.selectAll(".photo-wrapper:not(.kartaview-wrapper)").classed("hide", true);
72323         viewer.selectAll(".photo-wrapper.kartaview-wrapper").classed("hide", false);
72324       }
72325       return this;
72326     },
72327     hideViewer: function(context) {
72328       _oscSelectedImage = null;
72329       this.updateUrlImage(null);
72330       var viewer = context.container().select(".photoviewer");
72331       if (!viewer.empty())
72332         viewer.datum(null);
72333       viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
72334       context.container().selectAll(".viewfield-group, .sequence, .icon-sign").classed("currentView", false);
72335       return this.setStyles(context, null, true);
72336     },
72337     selectImage: function(context, imageKey) {
72338       var d = this.cachedImage(imageKey);
72339       _oscSelectedImage = d;
72340       this.updateUrlImage(imageKey);
72341       var viewer = context.container().select(".photoviewer");
72342       if (!viewer.empty())
72343         viewer.datum(d);
72344       this.setStyles(context, null, true);
72345       context.container().selectAll(".icon-sign").classed("currentView", false);
72346       if (!d)
72347         return this;
72348       var wrap2 = context.container().select(".photoviewer .kartaview-wrapper");
72349       var imageWrap = wrap2.selectAll(".kartaview-image-wrap");
72350       var attribution = wrap2.selectAll(".photo-attribution").text("");
72351       wrap2.transition().duration(100).call(imgZoom.transform, identity2);
72352       imageWrap.selectAll(".kartaview-image").remove();
72353       if (d) {
72354         var sequence = _oscCache.sequences[d.sequence_id];
72355         var r = sequence && sequence.rotation || 0;
72356         imageWrap.append("img").attr("class", "kartaview-image").attr("src", apibase2 + "/" + d.imagePath).style("transform", "rotate(" + r + "deg)");
72357         if (d.captured_by) {
72358           attribution.append("a").attr("class", "captured_by").attr("target", "_blank").attr("href", "https://kartaview.org/user/" + encodeURIComponent(d.captured_by)).text("@" + d.captured_by);
72359           attribution.append("span").text("|");
72360         }
72361         if (d.captured_at) {
72362           attribution.append("span").attr("class", "captured_at").text(localeDateString2(d.captured_at));
72363           attribution.append("span").text("|");
72364         }
72365         attribution.append("a").attr("class", "image-link").attr("target", "_blank").attr("href", "https://kartaview.org/details/" + d.sequence_id + "/" + d.sequence_index).text("kartaview.org");
72366       }
72367       return this;
72368       function localeDateString2(s) {
72369         if (!s)
72370           return null;
72371         var options2 = { day: "numeric", month: "short", year: "numeric" };
72372         var d2 = new Date(s);
72373         if (isNaN(d2.getTime()))
72374           return null;
72375         return d2.toLocaleDateString(_mainLocalizer.localeCode(), options2);
72376       }
72377     },
72378     getSelectedImage: function() {
72379       return _oscSelectedImage;
72380     },
72381     getSequenceKeyForImage: function(d) {
72382       return d && d.sequence_id;
72383     },
72384     // Updates the currently highlighted sequence and selected bubble.
72385     // Reset is only necessary when interacting with the viewport because
72386     // this implicitly changes the currently selected bubble/sequence
72387     setStyles: function(context, hovered, reset) {
72388       if (reset) {
72389         context.container().selectAll(".viewfield-group").classed("highlighted", false).classed("hovered", false).classed("currentView", false);
72390         context.container().selectAll(".sequence").classed("highlighted", false).classed("currentView", false);
72391       }
72392       var hoveredImageKey = hovered && hovered.key;
72393       var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
72394       var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
72395       var hoveredImageKeys = hoveredSequence && hoveredSequence.images.map(function(d) {
72396         return d.key;
72397       }) || [];
72398       var viewer = context.container().select(".photoviewer");
72399       var selected = viewer.empty() ? void 0 : viewer.datum();
72400       var selectedImageKey = selected && selected.key;
72401       var selectedSequenceKey = this.getSequenceKeyForImage(selected);
72402       var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
72403       var selectedImageKeys = selectedSequence && selectedSequence.images.map(function(d) {
72404         return d.key;
72405       }) || [];
72406       var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
72407       context.container().selectAll(".layer-kartaview .viewfield-group").classed("highlighted", function(d) {
72408         return highlightedImageKeys.indexOf(d.key) !== -1;
72409       }).classed("hovered", function(d) {
72410         return d.key === hoveredImageKey;
72411       }).classed("currentView", function(d) {
72412         return d.key === selectedImageKey;
72413       });
72414       context.container().selectAll(".layer-kartaview .sequence").classed("highlighted", function(d) {
72415         return d.properties.key === hoveredSequenceKey;
72416       }).classed("currentView", function(d) {
72417         return d.properties.key === selectedSequenceKey;
72418       });
72419       context.container().selectAll(".layer-kartaview .viewfield-group .viewfield").attr("d", viewfieldPath);
72420       function viewfieldPath() {
72421         var d = this.parentNode.__data__;
72422         if (d.pano && d.key !== selectedImageKey) {
72423           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
72424         } else {
72425           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
72426         }
72427       }
72428       return this;
72429     },
72430     updateUrlImage: function(imageKey) {
72431       if (!window.mocha) {
72432         var hash = utilStringQs(window.location.hash);
72433         if (imageKey) {
72434           hash.photo = "kartaview/" + imageKey;
72435         } else {
72436           delete hash.photo;
72437         }
72438         window.location.replace("#" + utilQsString(hash, true));
72439       }
72440     },
72441     cache: function() {
72442       return _oscCache;
72443     }
72444   };
72445
72446   // node_modules/osm-auth/src/osm-auth.mjs
72447   var import_store = __toESM(require_store_legacy(), 1);
72448   function osmAuth(o) {
72449     var oauth2 = {};
72450     oauth2.authenticated = function() {
72451       return !!token("oauth2_access_token");
72452     };
72453     oauth2.logout = function() {
72454       token("oauth2_access_token", "");
72455       token("oauth_token", "");
72456       token("oauth_token_secret", "");
72457       token("oauth_request_token_secret", "");
72458       return oauth2;
72459     };
72460     oauth2.authenticate = function(callback) {
72461       if (oauth2.authenticated()) {
72462         callback(null, oauth2);
72463         return;
72464       }
72465       oauth2.logout();
72466       var url = o.url + "/oauth2/authorize?" + utilQsString2({
72467         client_id: o.client_id,
72468         redirect_uri: o.redirect_uri,
72469         response_type: "code",
72470         scope: o.scope
72471       });
72472       if (!o.singlepage) {
72473         var w = 600;
72474         var h = 550;
72475         var settings = [
72476           ["width", w],
72477           ["height", h],
72478           ["left", screen.width / 2 - w / 2],
72479           ["top", screen.height / 2 - h / 2]
72480         ].map(function(x) {
72481           return x.join("=");
72482         }).join(",");
72483         var popup = window.open("about:blank", "oauth_window", settings);
72484         oauth2.popupWindow = popup;
72485         popup.location = url;
72486         if (!popup) {
72487           var error = new Error("Popup was blocked");
72488           error.status = "popup-blocked";
72489           throw error;
72490         }
72491       }
72492       window.authComplete = function(url2) {
72493         var params = utilStringQs2(url2.split("?")[1]);
72494         getAccessToken(params.code);
72495         delete window.authComplete;
72496       };
72497       function getAccessToken(auth_code) {
72498         var url2 = o.url + "/oauth2/token?" + utilQsString2({
72499           client_id: o.client_id,
72500           grant_type: "authorization_code",
72501           code: auth_code,
72502           redirect_uri: o.redirect_uri,
72503           client_secret: o.client_secret
72504         });
72505         oauth2.rawxhr("POST", url2, null, null, null, accessTokenDone);
72506         o.loading();
72507       }
72508       function accessTokenDone(err, xhr) {
72509         o.done();
72510         if (err) {
72511           callback(err);
72512           return;
72513         }
72514         var access_token = JSON.parse(xhr.response);
72515         token("oauth2_access_token", access_token.access_token);
72516         callback(null, oauth2);
72517       }
72518     };
72519     oauth2.bringPopupWindowToFront = function() {
72520       var broughtPopupToFront = false;
72521       try {
72522         if (oauth2.popupWindow && !oauth2.popupWindow.closed) {
72523           oauth2.popupWindow.focus();
72524           broughtPopupToFront = true;
72525         }
72526       } catch (err) {
72527       }
72528       return broughtPopupToFront;
72529     };
72530     oauth2.bootstrapToken = function(auth_code, callback) {
72531       function getAccessToken(auth_code2) {
72532         var url = o.url + "/oauth2/token?" + utilQsString2({
72533           client_id: o.client_id,
72534           grant_type: "authorization_code",
72535           code: auth_code2,
72536           redirect_uri: o.redirect_uri,
72537           client_secret: o.client_secret
72538         });
72539         oauth2.rawxhr("POST", url, null, null, null, accessTokenDone);
72540         o.loading();
72541       }
72542       function accessTokenDone(err, xhr) {
72543         o.done();
72544         if (err) {
72545           callback(err);
72546           return;
72547         }
72548         var access_token = JSON.parse(xhr.response);
72549         token("oauth2_access_token", access_token.access_token);
72550         callback(null, oauth2);
72551       }
72552       getAccessToken(auth_code);
72553     };
72554     oauth2.xhr = function(options2, callback) {
72555       if (oauth2.authenticated()) {
72556         return run();
72557       } else {
72558         if (o.auto) {
72559           oauth2.authenticate(run);
72560           return;
72561         } else {
72562           callback("not authenticated", null);
72563           return;
72564         }
72565       }
72566       function run() {
72567         var url = options2.prefix !== false ? o.url + options2.path : options2.path;
72568         return oauth2.rawxhr(
72569           options2.method,
72570           url,
72571           token("oauth2_access_token"),
72572           options2.content,
72573           options2.headers,
72574           done
72575         );
72576       }
72577       function done(err, xhr) {
72578         if (err) {
72579           callback(err);
72580         } else if (xhr.responseXML) {
72581           callback(err, xhr.responseXML);
72582         } else {
72583           callback(err, xhr.response);
72584         }
72585       }
72586     };
72587     oauth2.rawxhr = function(method, url, access_token, data, headers, callback) {
72588       headers = headers || { "Content-Type": "application/x-www-form-urlencoded" };
72589       if (access_token) {
72590         headers.Authorization = "Bearer " + access_token;
72591       }
72592       var xhr = new XMLHttpRequest();
72593       xhr.onreadystatechange = function() {
72594         if (4 === xhr.readyState && 0 !== xhr.status) {
72595           if (/^20\d$/.test(xhr.status)) {
72596             callback(null, xhr);
72597           } else {
72598             callback(xhr, null);
72599           }
72600         }
72601       };
72602       xhr.onerror = function(e) {
72603         callback(e, null);
72604       };
72605       xhr.open(method, url, true);
72606       for (var h in headers)
72607         xhr.setRequestHeader(h, headers[h]);
72608       xhr.send(data);
72609       return xhr;
72610     };
72611     oauth2.preauth = function(val) {
72612       if (val && val.access_token) {
72613         token("oauth2_access_token", val.access_token);
72614       }
72615       return oauth2;
72616     };
72617     oauth2.options = function(val) {
72618       if (!arguments.length)
72619         return o;
72620       o = val;
72621       o.url = o.url || "https://www.openstreetmap.org";
72622       o.auto = o.auto || false;
72623       o.singlepage = o.singlepage || false;
72624       o.loading = o.loading || function() {
72625       };
72626       o.done = o.done || function() {
72627       };
72628       return oauth2.preauth(o);
72629     };
72630     var token;
72631     if (import_store.default.enabled) {
72632       token = function(x, y) {
72633         if (arguments.length === 1)
72634           return import_store.default.get(o.url + x);
72635         else if (arguments.length === 2)
72636           return import_store.default.set(o.url + x, y);
72637       };
72638     } else {
72639       var storage = {};
72640       token = function(x, y) {
72641         if (arguments.length === 1)
72642           return storage[o.url + x];
72643         else if (arguments.length === 2)
72644           return storage[o.url + x] = y;
72645       };
72646     }
72647     oauth2.options(o);
72648     return oauth2;
72649   }
72650   function utilQsString2(obj) {
72651     return Object.keys(obj).sort().map(function(key) {
72652       return encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]);
72653     }).join("&");
72654   }
72655   function utilStringQs2(str2) {
72656     var i2 = 0;
72657     while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#"))
72658       i2++;
72659     str2 = str2.slice(i2);
72660     return str2.split("&").reduce(function(obj, pair2) {
72661       var parts = pair2.split("=");
72662       if (parts.length === 2) {
72663         obj[parts[0]] = decodeURIComponent(parts[1]);
72664       }
72665       return obj;
72666     }, {});
72667   }
72668
72669   // modules/services/osm.js
72670   var import_rbush9 = __toESM(require_rbush_min());
72671   var tiler5 = utilTiler();
72672   var dispatch7 = dispatch_default("apiStatusChange", "authLoading", "authDone", "change", "loading", "loaded", "loadedNotes");
72673   var urlroot = osmApiConnections[0].url;
72674   var redirectPath = window.location.origin + window.location.pathname;
72675   var oauth = osmAuth({
72676     url: urlroot,
72677     client_id: osmApiConnections[0].client_id,
72678     client_secret: osmApiConnections[0].client_secret,
72679     scope: "read_prefs write_prefs write_api read_gpx write_notes",
72680     redirect_uri: redirectPath + "land.html",
72681     loading: authLoading,
72682     done: authDone
72683   });
72684   var _apiConnections = osmApiConnections;
72685   var _imageryBlocklists = [/.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/];
72686   var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new import_rbush9.default() };
72687   var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new import_rbush9.default() };
72688   var _userCache = { toLoad: {}, user: {} };
72689   var _cachedApiStatus;
72690   var _changeset = {};
72691   var _deferred = /* @__PURE__ */ new Set();
72692   var _connectionID = 1;
72693   var _tileZoom4 = 16;
72694   var _noteZoom = 12;
72695   var _rateLimitError;
72696   var _userChangesets;
72697   var _userDetails;
72698   var _off;
72699   var _maxWayNodes = 2e3;
72700   function authLoading() {
72701     dispatch7.call("authLoading");
72702   }
72703   function authDone() {
72704     dispatch7.call("authDone");
72705   }
72706   function abortRequest5(controllerOrXHR) {
72707     if (controllerOrXHR) {
72708       controllerOrXHR.abort();
72709     }
72710   }
72711   function hasInflightRequests(cache) {
72712     return Object.keys(cache.inflight).length;
72713   }
72714   function abortUnwantedRequests4(cache, visibleTiles) {
72715     Object.keys(cache.inflight).forEach(function(k) {
72716       if (cache.toLoad[k])
72717         return;
72718       if (visibleTiles.find(function(tile) {
72719         return k === tile.id;
72720       }))
72721         return;
72722       abortRequest5(cache.inflight[k]);
72723       delete cache.inflight[k];
72724     });
72725   }
72726   function getLoc(attrs) {
72727     var lon = attrs.lon && attrs.lon.value;
72728     var lat = attrs.lat && attrs.lat.value;
72729     return [Number(lon), Number(lat)];
72730   }
72731   function getNodes(obj) {
72732     var elems = obj.getElementsByTagName("nd");
72733     var nodes = new Array(elems.length);
72734     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
72735       nodes[i2] = "n" + elems[i2].attributes.ref.value;
72736     }
72737     return nodes;
72738   }
72739   function getNodesJSON(obj) {
72740     var elems = obj.nodes;
72741     var nodes = new Array(elems.length);
72742     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
72743       nodes[i2] = "n" + elems[i2];
72744     }
72745     return nodes;
72746   }
72747   function getTags(obj) {
72748     var elems = obj.getElementsByTagName("tag");
72749     var tags = {};
72750     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
72751       var attrs = elems[i2].attributes;
72752       tags[attrs.k.value] = attrs.v.value;
72753     }
72754     return tags;
72755   }
72756   function getMembers(obj) {
72757     var elems = obj.getElementsByTagName("member");
72758     var members = new Array(elems.length);
72759     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
72760       var attrs = elems[i2].attributes;
72761       members[i2] = {
72762         id: attrs.type.value[0] + attrs.ref.value,
72763         type: attrs.type.value,
72764         role: attrs.role.value
72765       };
72766     }
72767     return members;
72768   }
72769   function getMembersJSON(obj) {
72770     var elems = obj.members;
72771     var members = new Array(elems.length);
72772     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
72773       var attrs = elems[i2];
72774       members[i2] = {
72775         id: attrs.type[0] + attrs.ref,
72776         type: attrs.type,
72777         role: attrs.role
72778       };
72779     }
72780     return members;
72781   }
72782   function getVisible(attrs) {
72783     return !attrs.visible || attrs.visible.value !== "false";
72784   }
72785   function parseComments(comments) {
72786     var parsedComments = [];
72787     for (var i2 = 0; i2 < comments.length; i2++) {
72788       var comment = comments[i2];
72789       if (comment.nodeName === "comment") {
72790         var childNodes = comment.childNodes;
72791         var parsedComment = {};
72792         for (var j2 = 0; j2 < childNodes.length; j2++) {
72793           var node = childNodes[j2];
72794           var nodeName = node.nodeName;
72795           if (nodeName === "#text")
72796             continue;
72797           parsedComment[nodeName] = node.textContent;
72798           if (nodeName === "uid") {
72799             var uid = node.textContent;
72800             if (uid && !_userCache.user[uid]) {
72801               _userCache.toLoad[uid] = true;
72802             }
72803           }
72804         }
72805         if (parsedComment) {
72806           parsedComments.push(parsedComment);
72807         }
72808       }
72809     }
72810     return parsedComments;
72811   }
72812   function encodeNoteRtree(note) {
72813     return {
72814       minX: note.loc[0],
72815       minY: note.loc[1],
72816       maxX: note.loc[0],
72817       maxY: note.loc[1],
72818       data: note
72819     };
72820   }
72821   var jsonparsers = {
72822     node: function nodeData(obj, uid) {
72823       return new osmNode({
72824         id: uid,
72825         visible: typeof obj.visible === "boolean" ? obj.visible : true,
72826         version: obj.version && obj.version.toString(),
72827         changeset: obj.changeset && obj.changeset.toString(),
72828         timestamp: obj.timestamp,
72829         user: obj.user,
72830         uid: obj.uid && obj.uid.toString(),
72831         loc: [Number(obj.lon), Number(obj.lat)],
72832         tags: obj.tags
72833       });
72834     },
72835     way: function wayData(obj, uid) {
72836       return new osmWay({
72837         id: uid,
72838         visible: typeof obj.visible === "boolean" ? obj.visible : true,
72839         version: obj.version && obj.version.toString(),
72840         changeset: obj.changeset && obj.changeset.toString(),
72841         timestamp: obj.timestamp,
72842         user: obj.user,
72843         uid: obj.uid && obj.uid.toString(),
72844         tags: obj.tags,
72845         nodes: getNodesJSON(obj)
72846       });
72847     },
72848     relation: function relationData(obj, uid) {
72849       return new osmRelation({
72850         id: uid,
72851         visible: typeof obj.visible === "boolean" ? obj.visible : true,
72852         version: obj.version && obj.version.toString(),
72853         changeset: obj.changeset && obj.changeset.toString(),
72854         timestamp: obj.timestamp,
72855         user: obj.user,
72856         uid: obj.uid && obj.uid.toString(),
72857         tags: obj.tags,
72858         members: getMembersJSON(obj)
72859       });
72860     },
72861     user: function parseUser(obj, uid) {
72862       return {
72863         id: uid,
72864         display_name: obj.display_name,
72865         account_created: obj.account_created,
72866         image_url: obj.img && obj.img.href,
72867         changesets_count: obj.changesets && obj.changesets.count && obj.changesets.count.toString() || "0",
72868         active_blocks: obj.blocks && obj.blocks.received && obj.blocks.received.active && obj.blocks.received.active.toString() || "0"
72869       };
72870     }
72871   };
72872   function parseJSON(payload, callback, options2) {
72873     options2 = Object.assign({ skipSeen: true }, options2);
72874     if (!payload) {
72875       return callback({ message: "No JSON", status: -1 });
72876     }
72877     var json = payload;
72878     if (typeof json !== "object")
72879       json = JSON.parse(payload);
72880     if (!json.elements)
72881       return callback({ message: "No JSON", status: -1 });
72882     var children2 = json.elements;
72883     var handle = window.requestIdleCallback(function() {
72884       _deferred.delete(handle);
72885       var results = [];
72886       var result;
72887       for (var i2 = 0; i2 < children2.length; i2++) {
72888         result = parseChild(children2[i2]);
72889         if (result)
72890           results.push(result);
72891       }
72892       callback(null, results);
72893     });
72894     _deferred.add(handle);
72895     function parseChild(child) {
72896       var parser3 = jsonparsers[child.type];
72897       if (!parser3)
72898         return null;
72899       var uid;
72900       uid = osmEntity.id.fromOSM(child.type, child.id);
72901       if (options2.skipSeen) {
72902         if (_tileCache.seen[uid])
72903           return null;
72904         _tileCache.seen[uid] = true;
72905       }
72906       return parser3(child, uid);
72907     }
72908   }
72909   function parseUserJSON(payload, callback, options2) {
72910     options2 = Object.assign({ skipSeen: true }, options2);
72911     if (!payload) {
72912       return callback({ message: "No JSON", status: -1 });
72913     }
72914     var json = payload;
72915     if (typeof json !== "object")
72916       json = JSON.parse(payload);
72917     if (!json.users && !json.user)
72918       return callback({ message: "No JSON", status: -1 });
72919     var objs = json.users || [json];
72920     var handle = window.requestIdleCallback(function() {
72921       _deferred.delete(handle);
72922       var results = [];
72923       var result;
72924       for (var i2 = 0; i2 < objs.length; i2++) {
72925         result = parseObj(objs[i2]);
72926         if (result)
72927           results.push(result);
72928       }
72929       callback(null, results);
72930     });
72931     _deferred.add(handle);
72932     function parseObj(obj) {
72933       var uid = obj.user.id && obj.user.id.toString();
72934       if (options2.skipSeen && _userCache.user[uid]) {
72935         delete _userCache.toLoad[uid];
72936         return null;
72937       }
72938       var user = jsonparsers.user(obj.user, uid);
72939       _userCache.user[uid] = user;
72940       delete _userCache.toLoad[uid];
72941       return user;
72942     }
72943   }
72944   var parsers = {
72945     node: function nodeData2(obj, uid) {
72946       var attrs = obj.attributes;
72947       return new osmNode({
72948         id: uid,
72949         visible: getVisible(attrs),
72950         version: attrs.version.value,
72951         changeset: attrs.changeset && attrs.changeset.value,
72952         timestamp: attrs.timestamp && attrs.timestamp.value,
72953         user: attrs.user && attrs.user.value,
72954         uid: attrs.uid && attrs.uid.value,
72955         loc: getLoc(attrs),
72956         tags: getTags(obj)
72957       });
72958     },
72959     way: function wayData2(obj, uid) {
72960       var attrs = obj.attributes;
72961       return new osmWay({
72962         id: uid,
72963         visible: getVisible(attrs),
72964         version: attrs.version.value,
72965         changeset: attrs.changeset && attrs.changeset.value,
72966         timestamp: attrs.timestamp && attrs.timestamp.value,
72967         user: attrs.user && attrs.user.value,
72968         uid: attrs.uid && attrs.uid.value,
72969         tags: getTags(obj),
72970         nodes: getNodes(obj)
72971       });
72972     },
72973     relation: function relationData2(obj, uid) {
72974       var attrs = obj.attributes;
72975       return new osmRelation({
72976         id: uid,
72977         visible: getVisible(attrs),
72978         version: attrs.version.value,
72979         changeset: attrs.changeset && attrs.changeset.value,
72980         timestamp: attrs.timestamp && attrs.timestamp.value,
72981         user: attrs.user && attrs.user.value,
72982         uid: attrs.uid && attrs.uid.value,
72983         tags: getTags(obj),
72984         members: getMembers(obj)
72985       });
72986     },
72987     note: function parseNote(obj, uid) {
72988       var attrs = obj.attributes;
72989       var childNodes = obj.childNodes;
72990       var props = {};
72991       props.id = uid;
72992       props.loc = getLoc(attrs);
72993       var coincident = false;
72994       var epsilon3 = 1e-5;
72995       do {
72996         if (coincident) {
72997           props.loc = geoVecAdd(props.loc, [epsilon3, epsilon3]);
72998         }
72999         var bbox2 = geoExtent(props.loc).bbox();
73000         coincident = _noteCache.rtree.search(bbox2).length;
73001       } while (coincident);
73002       for (var i2 = 0; i2 < childNodes.length; i2++) {
73003         var node = childNodes[i2];
73004         var nodeName = node.nodeName;
73005         if (nodeName === "#text")
73006           continue;
73007         if (nodeName === "comments") {
73008           props[nodeName] = parseComments(node.childNodes);
73009         } else {
73010           props[nodeName] = node.textContent;
73011         }
73012       }
73013       var note = new osmNote(props);
73014       var item = encodeNoteRtree(note);
73015       _noteCache.note[note.id] = note;
73016       _noteCache.rtree.insert(item);
73017       return note;
73018     },
73019     user: function parseUser2(obj, uid) {
73020       var attrs = obj.attributes;
73021       var user = {
73022         id: uid,
73023         display_name: attrs.display_name && attrs.display_name.value,
73024         account_created: attrs.account_created && attrs.account_created.value,
73025         changesets_count: "0",
73026         active_blocks: "0"
73027       };
73028       var img = obj.getElementsByTagName("img");
73029       if (img && img[0] && img[0].getAttribute("href")) {
73030         user.image_url = img[0].getAttribute("href");
73031       }
73032       var changesets = obj.getElementsByTagName("changesets");
73033       if (changesets && changesets[0] && changesets[0].getAttribute("count")) {
73034         user.changesets_count = changesets[0].getAttribute("count");
73035       }
73036       var blocks = obj.getElementsByTagName("blocks");
73037       if (blocks && blocks[0]) {
73038         var received = blocks[0].getElementsByTagName("received");
73039         if (received && received[0] && received[0].getAttribute("active")) {
73040           user.active_blocks = received[0].getAttribute("active");
73041         }
73042       }
73043       _userCache.user[uid] = user;
73044       delete _userCache.toLoad[uid];
73045       return user;
73046     }
73047   };
73048   function parseXML(xml, callback, options2) {
73049     options2 = Object.assign({ skipSeen: true }, options2);
73050     if (!xml || !xml.childNodes) {
73051       return callback({ message: "No XML", status: -1 });
73052     }
73053     var root3 = xml.childNodes[0];
73054     var children2 = root3.childNodes;
73055     var handle = window.requestIdleCallback(function() {
73056       _deferred.delete(handle);
73057       var results = [];
73058       var result;
73059       for (var i2 = 0; i2 < children2.length; i2++) {
73060         result = parseChild(children2[i2]);
73061         if (result)
73062           results.push(result);
73063       }
73064       callback(null, results);
73065     });
73066     _deferred.add(handle);
73067     function parseChild(child) {
73068       var parser3 = parsers[child.nodeName];
73069       if (!parser3)
73070         return null;
73071       var uid;
73072       if (child.nodeName === "user") {
73073         uid = child.attributes.id.value;
73074         if (options2.skipSeen && _userCache.user[uid]) {
73075           delete _userCache.toLoad[uid];
73076           return null;
73077         }
73078       } else if (child.nodeName === "note") {
73079         uid = child.getElementsByTagName("id")[0].textContent;
73080       } else {
73081         uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
73082         if (options2.skipSeen) {
73083           if (_tileCache.seen[uid])
73084             return null;
73085           _tileCache.seen[uid] = true;
73086         }
73087       }
73088       return parser3(child, uid);
73089     }
73090   }
73091   function updateRtree4(item, replace) {
73092     _noteCache.rtree.remove(item, function isEql(a, b) {
73093       return a.data.id === b.data.id;
73094     });
73095     if (replace) {
73096       _noteCache.rtree.insert(item);
73097     }
73098   }
73099   function wrapcb(thisArg, callback, cid) {
73100     return function(err, result) {
73101       if (err) {
73102         if (err.status === 400 || err.status === 401 || err.status === 403) {
73103           thisArg.logout();
73104         }
73105         return callback.call(thisArg, err);
73106       } else if (thisArg.getConnectionId() !== cid) {
73107         return callback.call(thisArg, { message: "Connection Switched", status: -1 });
73108       } else {
73109         return callback.call(thisArg, err, result);
73110       }
73111     };
73112   }
73113   var osm_default = {
73114     init: function() {
73115       utilRebind(this, dispatch7, "on");
73116     },
73117     reset: function() {
73118       Array.from(_deferred).forEach(function(handle) {
73119         window.cancelIdleCallback(handle);
73120         _deferred.delete(handle);
73121       });
73122       _connectionID++;
73123       _userChangesets = void 0;
73124       _userDetails = void 0;
73125       _rateLimitError = void 0;
73126       Object.values(_tileCache.inflight).forEach(abortRequest5);
73127       Object.values(_noteCache.inflight).forEach(abortRequest5);
73128       Object.values(_noteCache.inflightPost).forEach(abortRequest5);
73129       if (_changeset.inflight)
73130         abortRequest5(_changeset.inflight);
73131       _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new import_rbush9.default() };
73132       _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new import_rbush9.default() };
73133       _userCache = { toLoad: {}, user: {} };
73134       _cachedApiStatus = void 0;
73135       _changeset = {};
73136       return this;
73137     },
73138     getConnectionId: function() {
73139       return _connectionID;
73140     },
73141     getUrlRoot: function() {
73142       return urlroot;
73143     },
73144     changesetURL: function(changesetID) {
73145       return urlroot + "/changeset/" + changesetID;
73146     },
73147     changesetsURL: function(center, zoom) {
73148       var precision2 = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
73149       return urlroot + "/history#map=" + Math.floor(zoom) + "/" + center[1].toFixed(precision2) + "/" + center[0].toFixed(precision2);
73150     },
73151     entityURL: function(entity) {
73152       return urlroot + "/" + entity.type + "/" + entity.osmId();
73153     },
73154     historyURL: function(entity) {
73155       return urlroot + "/" + entity.type + "/" + entity.osmId() + "/history";
73156     },
73157     userURL: function(username) {
73158       return urlroot + "/user/" + encodeURIComponent(username);
73159     },
73160     noteURL: function(note) {
73161       return urlroot + "/note/" + note.id;
73162     },
73163     noteReportURL: function(note) {
73164       return urlroot + "/reports/new?reportable_type=Note&reportable_id=" + note.id;
73165     },
73166     // Generic method to load data from the OSM API
73167     // Can handle either auth or unauth calls.
73168     loadFromAPI: function(path, callback, options2) {
73169       options2 = Object.assign({ skipSeen: true }, options2);
73170       var that = this;
73171       var cid = _connectionID;
73172       function done(err, payload) {
73173         if (that.getConnectionId() !== cid) {
73174           if (callback)
73175             callback({ message: "Connection Switched", status: -1 });
73176           return;
73177         }
73178         var isAuthenticated = that.authenticated();
73179         if (isAuthenticated && err && err.status && (err.status === 400 || err.status === 401 || err.status === 403)) {
73180           that.logout();
73181           that.loadFromAPI(path, callback, options2);
73182         } else {
73183           if (!isAuthenticated && !_rateLimitError && err && err.status && (err.status === 509 || err.status === 429)) {
73184             _rateLimitError = err;
73185             dispatch7.call("change");
73186             that.reloadApiStatus();
73187           } else if (err && _cachedApiStatus === "online" || !err && _cachedApiStatus !== "online") {
73188             that.reloadApiStatus();
73189           }
73190           if (callback) {
73191             if (err) {
73192               return callback(err);
73193             } else {
73194               if (path.indexOf(".json") !== -1) {
73195                 return parseJSON(payload, callback, options2);
73196               } else {
73197                 return parseXML(payload, callback, options2);
73198               }
73199             }
73200           }
73201         }
73202       }
73203       if (this.authenticated()) {
73204         return oauth.xhr({ method: "GET", path }, done);
73205       } else {
73206         var url = urlroot + path;
73207         var controller = new AbortController();
73208         var fn;
73209         if (path.indexOf(".json") !== -1) {
73210           fn = json_default;
73211         } else {
73212           fn = xml_default;
73213         }
73214         fn(url, { signal: controller.signal }).then(function(data) {
73215           done(null, data);
73216         }).catch(function(err) {
73217           if (err.name === "AbortError")
73218             return;
73219           var match = err.message.match(/^\d{3}/);
73220           if (match) {
73221             done({ status: +match[0], statusText: err.message });
73222           } else {
73223             done(err.message);
73224           }
73225         });
73226         return controller;
73227       }
73228     },
73229     // Load a single entity by id (ways and relations use the `/full` call to include
73230     // nodes and members). Parent relations are not included, see `loadEntityRelations`.
73231     // GET /api/0.6/node/#id
73232     // GET /api/0.6/[way|relation]/#id/full
73233     loadEntity: function(id2, callback) {
73234       var type2 = osmEntity.id.type(id2);
73235       var osmID = osmEntity.id.toOSM(id2);
73236       var options2 = { skipSeen: false };
73237       this.loadFromAPI(
73238         "/api/0.6/" + type2 + "/" + osmID + (type2 !== "node" ? "/full" : "") + ".json",
73239         function(err, entities) {
73240           if (callback)
73241             callback(err, { data: entities });
73242         },
73243         options2
73244       );
73245     },
73246     // Load a single entity with a specific version
73247     // GET /api/0.6/[node|way|relation]/#id/#version
73248     loadEntityVersion: function(id2, version, callback) {
73249       var type2 = osmEntity.id.type(id2);
73250       var osmID = osmEntity.id.toOSM(id2);
73251       var options2 = { skipSeen: false };
73252       this.loadFromAPI(
73253         "/api/0.6/" + type2 + "/" + osmID + "/" + version + ".json",
73254         function(err, entities) {
73255           if (callback)
73256             callback(err, { data: entities });
73257         },
73258         options2
73259       );
73260     },
73261     // Load the relations of a single entity with the given.
73262     // GET /api/0.6/[node|way|relation]/#id/relations
73263     loadEntityRelations: function(id2, callback) {
73264       var type2 = osmEntity.id.type(id2);
73265       var osmID = osmEntity.id.toOSM(id2);
73266       var options2 = { skipSeen: false };
73267       this.loadFromAPI(
73268         "/api/0.6/" + type2 + "/" + osmID + "/relations.json",
73269         function(err, entities) {
73270           if (callback)
73271             callback(err, { data: entities });
73272         },
73273         options2
73274       );
73275     },
73276     // Load multiple entities in chunks
73277     // (note: callback may be called multiple times)
73278     // Unlike `loadEntity`, child nodes and members are not fetched
73279     // GET /api/0.6/[nodes|ways|relations]?#parameters
73280     loadMultiple: function(ids, callback) {
73281       var that = this;
73282       var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
73283       Object.keys(groups).forEach(function(k) {
73284         var type2 = k + "s";
73285         var osmIDs = groups[k].map(function(id2) {
73286           return osmEntity.id.toOSM(id2);
73287         });
73288         var options2 = { skipSeen: false };
73289         utilArrayChunk(osmIDs, 150).forEach(function(arr) {
73290           that.loadFromAPI(
73291             "/api/0.6/" + type2 + ".json?" + type2 + "=" + arr.join(),
73292             function(err, entities) {
73293               if (callback)
73294                 callback(err, { data: entities });
73295             },
73296             options2
73297           );
73298         });
73299       });
73300     },
73301     // Create, upload, and close a changeset
73302     // PUT /api/0.6/changeset/create
73303     // POST /api/0.6/changeset/#id/upload
73304     // PUT /api/0.6/changeset/#id/close
73305     putChangeset: function(changeset, changes, callback) {
73306       var cid = _connectionID;
73307       if (_changeset.inflight) {
73308         return callback({ message: "Changeset already inflight", status: -2 }, changeset);
73309       } else if (_changeset.open) {
73310         return createdChangeset.call(this, null, _changeset.open);
73311       } else {
73312         var options2 = {
73313           method: "PUT",
73314           path: "/api/0.6/changeset/create",
73315           headers: { "Content-Type": "text/xml" },
73316           content: JXON.stringify(changeset.asJXON())
73317         };
73318         _changeset.inflight = oauth.xhr(
73319           options2,
73320           wrapcb(this, createdChangeset, cid)
73321         );
73322       }
73323       function createdChangeset(err, changesetID) {
73324         _changeset.inflight = null;
73325         if (err) {
73326           return callback(err, changeset);
73327         }
73328         _changeset.open = changesetID;
73329         changeset = changeset.update({ id: changesetID });
73330         var options3 = {
73331           method: "POST",
73332           path: "/api/0.6/changeset/" + changesetID + "/upload",
73333           headers: { "Content-Type": "text/xml" },
73334           content: JXON.stringify(changeset.osmChangeJXON(changes))
73335         };
73336         _changeset.inflight = oauth.xhr(
73337           options3,
73338           wrapcb(this, uploadedChangeset, cid)
73339         );
73340       }
73341       function uploadedChangeset(err) {
73342         _changeset.inflight = null;
73343         if (err)
73344           return callback(err, changeset);
73345         window.setTimeout(function() {
73346           callback(null, changeset);
73347         }, 2500);
73348         _changeset.open = null;
73349         if (this.getConnectionId() === cid) {
73350           oauth.xhr({
73351             method: "PUT",
73352             path: "/api/0.6/changeset/" + changeset.id + "/close",
73353             headers: { "Content-Type": "text/xml" }
73354           }, function() {
73355             return true;
73356           });
73357         }
73358       }
73359     },
73360     // Load multiple users in chunks
73361     // (note: callback may be called multiple times)
73362     // GET /api/0.6/users?users=#id1,#id2,...,#idn
73363     loadUsers: function(uids, callback) {
73364       var toLoad = [];
73365       var cached = [];
73366       utilArrayUniq(uids).forEach(function(uid) {
73367         if (_userCache.user[uid]) {
73368           delete _userCache.toLoad[uid];
73369           cached.push(_userCache.user[uid]);
73370         } else {
73371           toLoad.push(uid);
73372         }
73373       });
73374       if (cached.length || !this.authenticated()) {
73375         callback(void 0, cached);
73376         if (!this.authenticated())
73377           return;
73378       }
73379       utilArrayChunk(toLoad, 150).forEach(function(arr) {
73380         oauth.xhr(
73381           { method: "GET", path: "/api/0.6/users.json?users=" + arr.join() },
73382           wrapcb(this, done, _connectionID)
73383         );
73384       }.bind(this));
73385       function done(err, payload) {
73386         if (err)
73387           return callback(err);
73388         var options2 = { skipSeen: true };
73389         return parseUserJSON(payload, function(err2, results) {
73390           if (err2)
73391             return callback(err2);
73392           return callback(void 0, results);
73393         }, options2);
73394       }
73395     },
73396     // Load a given user by id
73397     // GET /api/0.6/user/#id
73398     loadUser: function(uid, callback) {
73399       if (_userCache.user[uid] || !this.authenticated()) {
73400         delete _userCache.toLoad[uid];
73401         return callback(void 0, _userCache.user[uid]);
73402       }
73403       oauth.xhr(
73404         { method: "GET", path: "/api/0.6/user/" + uid + ".json" },
73405         wrapcb(this, done, _connectionID)
73406       );
73407       function done(err, payload) {
73408         if (err)
73409           return callback(err);
73410         var options2 = { skipSeen: true };
73411         return parseUserJSON(payload, function(err2, results) {
73412           if (err2)
73413             return callback(err2);
73414           return callback(void 0, results[0]);
73415         }, options2);
73416       }
73417     },
73418     // Load the details of the logged-in user
73419     // GET /api/0.6/user/details
73420     userDetails: function(callback) {
73421       if (_userDetails) {
73422         return callback(void 0, _userDetails);
73423       }
73424       oauth.xhr(
73425         { method: "GET", path: "/api/0.6/user/details.json" },
73426         wrapcb(this, done, _connectionID)
73427       );
73428       function done(err, payload) {
73429         if (err)
73430           return callback(err);
73431         var options2 = { skipSeen: false };
73432         return parseUserJSON(payload, function(err2, results) {
73433           if (err2)
73434             return callback(err2);
73435           _userDetails = results[0];
73436           return callback(void 0, _userDetails);
73437         }, options2);
73438       }
73439     },
73440     // Load previous changesets for the logged in user
73441     // GET /api/0.6/changesets?user=#id
73442     userChangesets: function(callback) {
73443       if (_userChangesets) {
73444         return callback(void 0, _userChangesets);
73445       }
73446       this.userDetails(
73447         wrapcb(this, gotDetails, _connectionID)
73448       );
73449       function gotDetails(err, user) {
73450         if (err) {
73451           return callback(err);
73452         }
73453         oauth.xhr(
73454           { method: "GET", path: "/api/0.6/changesets?user=" + user.id },
73455           wrapcb(this, done, _connectionID)
73456         );
73457       }
73458       function done(err, xml) {
73459         if (err) {
73460           return callback(err);
73461         }
73462         _userChangesets = Array.prototype.map.call(
73463           xml.getElementsByTagName("changeset"),
73464           function(changeset) {
73465             return { tags: getTags(changeset) };
73466           }
73467         ).filter(function(changeset) {
73468           var comment = changeset.tags.comment;
73469           return comment && comment !== "";
73470         });
73471         return callback(void 0, _userChangesets);
73472       }
73473     },
73474     // Fetch the status of the OSM API
73475     // GET /api/capabilities
73476     status: function(callback) {
73477       var url = urlroot + "/api/capabilities";
73478       var errback = wrapcb(this, done, _connectionID);
73479       xml_default(url).then(function(data) {
73480         errback(null, data);
73481       }).catch(function(err) {
73482         errback(err.message);
73483       });
73484       function done(err, xml) {
73485         if (err) {
73486           return callback(err, null);
73487         }
73488         var elements = xml.getElementsByTagName("blacklist");
73489         var regexes = [];
73490         for (var i2 = 0; i2 < elements.length; i2++) {
73491           var regexString = elements[i2].getAttribute("regex");
73492           if (regexString) {
73493             try {
73494               var regex = new RegExp(regexString);
73495               regexes.push(regex);
73496             } catch (e) {
73497             }
73498           }
73499         }
73500         if (regexes.length) {
73501           _imageryBlocklists = regexes;
73502         }
73503         if (_rateLimitError) {
73504           return callback(_rateLimitError, "rateLimited");
73505         } else {
73506           var waynodes = xml.getElementsByTagName("waynodes");
73507           var maxWayNodes = waynodes.length && parseInt(waynodes[0].getAttribute("maximum"), 10);
73508           if (maxWayNodes && isFinite(maxWayNodes))
73509             _maxWayNodes = maxWayNodes;
73510           var apiStatus = xml.getElementsByTagName("status");
73511           var val = apiStatus[0].getAttribute("api");
73512           return callback(void 0, val);
73513         }
73514       }
73515     },
73516     // Calls `status` and dispatches an `apiStatusChange` event if the returned
73517     // status differs from the cached status.
73518     reloadApiStatus: function() {
73519       if (!this.throttledReloadApiStatus) {
73520         var that = this;
73521         this.throttledReloadApiStatus = throttle_default(function() {
73522           that.status(function(err, status) {
73523             if (status !== _cachedApiStatus) {
73524               _cachedApiStatus = status;
73525               dispatch7.call("apiStatusChange", that, err, status);
73526             }
73527           });
73528         }, 500);
73529       }
73530       this.throttledReloadApiStatus();
73531     },
73532     // Returns the maximum number of nodes a single way can have
73533     maxWayNodes: function() {
73534       return _maxWayNodes;
73535     },
73536     // Load data (entities) from the API in tiles
73537     // GET /api/0.6/map?bbox=
73538     loadTiles: function(projection2, callback) {
73539       if (_off)
73540         return;
73541       var tiles = tiler5.zoomExtent([_tileZoom4, _tileZoom4]).getTiles(projection2);
73542       var hadRequests = hasInflightRequests(_tileCache);
73543       abortUnwantedRequests4(_tileCache, tiles);
73544       if (hadRequests && !hasInflightRequests(_tileCache)) {
73545         dispatch7.call("loaded");
73546       }
73547       tiles.forEach(function(tile) {
73548         this.loadTile(tile, callback);
73549       }, this);
73550     },
73551     // Load a single data tile
73552     // GET /api/0.6/map?bbox=
73553     loadTile: function(tile, callback) {
73554       if (_off)
73555         return;
73556       if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id])
73557         return;
73558       if (!hasInflightRequests(_tileCache)) {
73559         dispatch7.call("loading");
73560       }
73561       var path = "/api/0.6/map.json?bbox=";
73562       var options2 = { skipSeen: true };
73563       _tileCache.inflight[tile.id] = this.loadFromAPI(
73564         path + tile.extent.toParam(),
73565         tileCallback,
73566         options2
73567       );
73568       function tileCallback(err, parsed) {
73569         delete _tileCache.inflight[tile.id];
73570         if (!err) {
73571           delete _tileCache.toLoad[tile.id];
73572           _tileCache.loaded[tile.id] = true;
73573           var bbox2 = tile.extent.bbox();
73574           bbox2.id = tile.id;
73575           _tileCache.rtree.insert(bbox2);
73576         }
73577         if (callback) {
73578           callback(err, Object.assign({ data: parsed }, tile));
73579         }
73580         if (!hasInflightRequests(_tileCache)) {
73581           dispatch7.call("loaded");
73582         }
73583       }
73584     },
73585     isDataLoaded: function(loc) {
73586       var bbox2 = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
73587       return _tileCache.rtree.collides(bbox2);
73588     },
73589     // load the tile that covers the given `loc`
73590     loadTileAtLoc: function(loc, callback) {
73591       if (Object.keys(_tileCache.toLoad).length > 50)
73592         return;
73593       var k = geoZoomToScale(_tileZoom4 + 1);
73594       var offset = geoRawMercator().scale(k)(loc);
73595       var projection2 = geoRawMercator().transform({ k, x: -offset[0], y: -offset[1] });
73596       var tiles = tiler5.zoomExtent([_tileZoom4, _tileZoom4]).getTiles(projection2);
73597       tiles.forEach(function(tile) {
73598         if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id])
73599           return;
73600         _tileCache.toLoad[tile.id] = true;
73601         this.loadTile(tile, callback);
73602       }, this);
73603     },
73604     // Load notes from the API in tiles
73605     // GET /api/0.6/notes?bbox=
73606     loadNotes: function(projection2, noteOptions) {
73607       noteOptions = Object.assign({ limit: 1e4, closed: 7 }, noteOptions);
73608       if (_off)
73609         return;
73610       var that = this;
73611       var path = "/api/0.6/notes?limit=" + noteOptions.limit + "&closed=" + noteOptions.closed + "&bbox=";
73612       var throttleLoadUsers = throttle_default(function() {
73613         var uids = Object.keys(_userCache.toLoad);
73614         if (!uids.length)
73615           return;
73616         that.loadUsers(uids, function() {
73617         });
73618       }, 750);
73619       var tiles = tiler5.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection2);
73620       abortUnwantedRequests4(_noteCache, tiles);
73621       tiles.forEach(function(tile) {
73622         if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id])
73623           return;
73624         var options2 = { skipSeen: false };
73625         _noteCache.inflight[tile.id] = that.loadFromAPI(
73626           path + tile.extent.toParam(),
73627           function(err) {
73628             delete _noteCache.inflight[tile.id];
73629             if (!err) {
73630               _noteCache.loaded[tile.id] = true;
73631             }
73632             throttleLoadUsers();
73633             dispatch7.call("loadedNotes");
73634           },
73635           options2
73636         );
73637       });
73638     },
73639     // Create a note
73640     // POST /api/0.6/notes?params
73641     postNoteCreate: function(note, callback) {
73642       if (!this.authenticated()) {
73643         return callback({ message: "Not Authenticated", status: -3 }, note);
73644       }
73645       if (_noteCache.inflightPost[note.id]) {
73646         return callback({ message: "Note update already inflight", status: -2 }, note);
73647       }
73648       if (!note.loc[0] || !note.loc[1] || !note.newComment)
73649         return;
73650       var comment = note.newComment;
73651       if (note.newCategory && note.newCategory !== "None") {
73652         comment += " #" + note.newCategory;
73653       }
73654       var path = "/api/0.6/notes?" + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
73655       _noteCache.inflightPost[note.id] = oauth.xhr(
73656         { method: "POST", path },
73657         wrapcb(this, done, _connectionID)
73658       );
73659       function done(err, xml) {
73660         delete _noteCache.inflightPost[note.id];
73661         if (err) {
73662           return callback(err);
73663         }
73664         this.removeNote(note);
73665         var options2 = { skipSeen: false };
73666         return parseXML(xml, function(err2, results) {
73667           if (err2) {
73668             return callback(err2);
73669           } else {
73670             return callback(void 0, results[0]);
73671           }
73672         }, options2);
73673       }
73674     },
73675     // Update a note
73676     // POST /api/0.6/notes/#id/comment?text=comment
73677     // POST /api/0.6/notes/#id/close?text=comment
73678     // POST /api/0.6/notes/#id/reopen?text=comment
73679     postNoteUpdate: function(note, newStatus, callback) {
73680       if (!this.authenticated()) {
73681         return callback({ message: "Not Authenticated", status: -3 }, note);
73682       }
73683       if (_noteCache.inflightPost[note.id]) {
73684         return callback({ message: "Note update already inflight", status: -2 }, note);
73685       }
73686       var action;
73687       if (note.status !== "closed" && newStatus === "closed") {
73688         action = "close";
73689       } else if (note.status !== "open" && newStatus === "open") {
73690         action = "reopen";
73691       } else {
73692         action = "comment";
73693         if (!note.newComment)
73694           return;
73695       }
73696       var path = "/api/0.6/notes/" + note.id + "/" + action;
73697       if (note.newComment) {
73698         path += "?" + utilQsString({ text: note.newComment });
73699       }
73700       _noteCache.inflightPost[note.id] = oauth.xhr(
73701         { method: "POST", path },
73702         wrapcb(this, done, _connectionID)
73703       );
73704       function done(err, xml) {
73705         delete _noteCache.inflightPost[note.id];
73706         if (err) {
73707           return callback(err);
73708         }
73709         this.removeNote(note);
73710         if (action === "close") {
73711           _noteCache.closed[note.id] = true;
73712         } else if (action === "reopen") {
73713           delete _noteCache.closed[note.id];
73714         }
73715         var options2 = { skipSeen: false };
73716         return parseXML(xml, function(err2, results) {
73717           if (err2) {
73718             return callback(err2);
73719           } else {
73720             return callback(void 0, results[0]);
73721           }
73722         }, options2);
73723       }
73724     },
73725     /* connection options for source switcher (optional) */
73726     apiConnections: function(val) {
73727       if (!arguments.length)
73728         return _apiConnections;
73729       _apiConnections = val;
73730       return this;
73731     },
73732     switch: function(newOptions) {
73733       urlroot = newOptions.url;
73734       var oldOptions = utilObjectOmit(oauth.options(), "access_token");
73735       oauth.options(Object.assign(oldOptions, newOptions));
73736       this.reset();
73737       this.userChangesets(function() {
73738       });
73739       dispatch7.call("change");
73740       return this;
73741     },
73742     toggle: function(val) {
73743       _off = !val;
73744       return this;
73745     },
73746     isChangesetInflight: function() {
73747       return !!_changeset.inflight;
73748     },
73749     // get/set cached data
73750     // This is used to save/restore the state when entering/exiting the walkthrough
73751     // Also used for testing purposes.
73752     caches: function(obj) {
73753       function cloneCache(source) {
73754         var target = {};
73755         Object.keys(source).forEach(function(k) {
73756           if (k === "rtree") {
73757             target.rtree = new import_rbush9.default().fromJSON(source.rtree.toJSON());
73758           } else if (k === "note") {
73759             target.note = {};
73760             Object.keys(source.note).forEach(function(id2) {
73761               target.note[id2] = osmNote(source.note[id2]);
73762             });
73763           } else {
73764             target[k] = JSON.parse(JSON.stringify(source[k]));
73765           }
73766         });
73767         return target;
73768       }
73769       if (!arguments.length) {
73770         return {
73771           tile: cloneCache(_tileCache),
73772           note: cloneCache(_noteCache),
73773           user: cloneCache(_userCache)
73774         };
73775       }
73776       if (obj === "get") {
73777         return {
73778           tile: _tileCache,
73779           note: _noteCache,
73780           user: _userCache
73781         };
73782       }
73783       if (obj.tile) {
73784         _tileCache = obj.tile;
73785         _tileCache.inflight = {};
73786       }
73787       if (obj.note) {
73788         _noteCache = obj.note;
73789         _noteCache.inflight = {};
73790         _noteCache.inflightPost = {};
73791       }
73792       if (obj.user) {
73793         _userCache = obj.user;
73794       }
73795       return this;
73796     },
73797     logout: function() {
73798       _userChangesets = void 0;
73799       _userDetails = void 0;
73800       oauth.logout();
73801       dispatch7.call("change");
73802       return this;
73803     },
73804     authenticated: function() {
73805       return oauth.authenticated();
73806     },
73807     authenticate: function(callback) {
73808       var that = this;
73809       var cid = _connectionID;
73810       _userChangesets = void 0;
73811       _userDetails = void 0;
73812       function done(err, res) {
73813         if (err) {
73814           if (callback)
73815             callback(err);
73816           return;
73817         }
73818         if (that.getConnectionId() !== cid) {
73819           if (callback)
73820             callback({ message: "Connection Switched", status: -1 });
73821           return;
73822         }
73823         _rateLimitError = void 0;
73824         dispatch7.call("change");
73825         if (callback)
73826           callback(err, res);
73827         that.userChangesets(function() {
73828         });
73829       }
73830       oauth.authenticate(done);
73831     },
73832     imageryBlocklists: function() {
73833       return _imageryBlocklists;
73834     },
73835     tileZoom: function(val) {
73836       if (!arguments.length)
73837         return _tileZoom4;
73838       _tileZoom4 = val;
73839       return this;
73840     },
73841     // get all cached notes covering the viewport
73842     notes: function(projection2) {
73843       var viewport = projection2.clipExtent();
73844       var min3 = [viewport[0][0], viewport[1][1]];
73845       var max3 = [viewport[1][0], viewport[0][1]];
73846       var bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
73847       return _noteCache.rtree.search(bbox2).map(function(d) {
73848         return d.data;
73849       });
73850     },
73851     // get a single note from the cache
73852     getNote: function(id2) {
73853       return _noteCache.note[id2];
73854     },
73855     // remove a single note from the cache
73856     removeNote: function(note) {
73857       if (!(note instanceof osmNote) || !note.id)
73858         return;
73859       delete _noteCache.note[note.id];
73860       updateRtree4(encodeNoteRtree(note), false);
73861     },
73862     // replace a single note in the cache
73863     replaceNote: function(note) {
73864       if (!(note instanceof osmNote) || !note.id)
73865         return;
73866       _noteCache.note[note.id] = note;
73867       updateRtree4(encodeNoteRtree(note), true);
73868       return note;
73869     },
73870     // Get an array of note IDs closed during this session.
73871     // Used to populate `closed:note` changeset tag
73872     getClosedIDs: function() {
73873       return Object.keys(_noteCache.closed).sort();
73874     }
73875   };
73876
73877   // modules/services/osm_wikibase.js
73878   var apibase3 = "https://wiki.openstreetmap.org/w/api.php";
73879   var _inflight2 = {};
73880   var _wikibaseCache = {};
73881   var _localeIDs = { en: false };
73882   var debouncedRequest = debounce_default(request, 500, { leading: false });
73883   function request(url, callback) {
73884     if (_inflight2[url])
73885       return;
73886     var controller = new AbortController();
73887     _inflight2[url] = controller;
73888     json_default(url, { signal: controller.signal }).then(function(result) {
73889       delete _inflight2[url];
73890       if (callback)
73891         callback(null, result);
73892     }).catch(function(err) {
73893       delete _inflight2[url];
73894       if (err.name === "AbortError")
73895         return;
73896       if (callback)
73897         callback(err.message);
73898     });
73899   }
73900   var osm_wikibase_default = {
73901     init: function() {
73902       _inflight2 = {};
73903       _wikibaseCache = {};
73904       _localeIDs = {};
73905     },
73906     reset: function() {
73907       Object.values(_inflight2).forEach(function(controller) {
73908         controller.abort();
73909       });
73910       _inflight2 = {};
73911     },
73912     /**
73913      * Get the best value for the property, or undefined if not found
73914      * @param entity object from wikibase
73915      * @param property string e.g. 'P4' for image
73916      * @param langCode string e.g. 'fr' for French
73917      */
73918     claimToValue: function(entity, property, langCode) {
73919       if (!entity.claims[property])
73920         return void 0;
73921       var locale2 = _localeIDs[langCode];
73922       var preferredPick, localePick;
73923       entity.claims[property].forEach(function(stmt) {
73924         if (!preferredPick && stmt.rank === "preferred") {
73925           preferredPick = stmt;
73926         }
73927         if (locale2 && stmt.qualifiers && stmt.qualifiers.P26 && stmt.qualifiers.P26[0].datavalue.value.id === locale2) {
73928           localePick = stmt;
73929         }
73930       });
73931       var result = localePick || preferredPick;
73932       if (result) {
73933         var datavalue = result.mainsnak.datavalue;
73934         return datavalue.type === "wikibase-entityid" ? datavalue.value.id : datavalue.value;
73935       } else {
73936         return void 0;
73937       }
73938     },
73939     /**
73940      * Convert monolingual property into a key-value object (language -> value)
73941      * @param entity object from wikibase
73942      * @param property string e.g. 'P31' for monolingual wiki page title
73943      */
73944     monolingualClaimToValueObj: function(entity, property) {
73945       if (!entity || !entity.claims[property])
73946         return void 0;
73947       return entity.claims[property].reduce(function(acc, obj) {
73948         var value = obj.mainsnak.datavalue.value;
73949         acc[value.language] = value.text;
73950         return acc;
73951       }, {});
73952     },
73953     toSitelink: function(key, value) {
73954       var result = value ? "Tag:" + key + "=" + value : "Key:" + key;
73955       return result.replace(/_/g, " ").trim();
73956     },
73957     //
73958     // Pass params object of the form:
73959     // {
73960     //   key: 'string',
73961     //   value: 'string',
73962     //   langCode: 'string'
73963     // }
73964     //
73965     getEntity: function(params, callback) {
73966       var doRequest = params.debounce ? debouncedRequest : request;
73967       var that = this;
73968       var titles = [];
73969       var result = {};
73970       var rtypeSitelink = params.key === "type" && params.value ? ("Relation:" + params.value).replace(/_/g, " ").trim() : false;
73971       var keySitelink = params.key ? this.toSitelink(params.key) : false;
73972       var tagSitelink = params.key && params.value ? this.toSitelink(params.key, params.value) : false;
73973       var localeSitelink;
73974       if (params.langCodes) {
73975         params.langCodes.forEach(function(langCode) {
73976           if (_localeIDs[langCode] === void 0) {
73977             localeSitelink = ("Locale:" + langCode).replace(/_/g, " ").trim();
73978             titles.push(localeSitelink);
73979           }
73980         });
73981       }
73982       if (rtypeSitelink) {
73983         if (_wikibaseCache[rtypeSitelink]) {
73984           result.rtype = _wikibaseCache[rtypeSitelink];
73985         } else {
73986           titles.push(rtypeSitelink);
73987         }
73988       }
73989       if (keySitelink) {
73990         if (_wikibaseCache[keySitelink]) {
73991           result.key = _wikibaseCache[keySitelink];
73992         } else {
73993           titles.push(keySitelink);
73994         }
73995       }
73996       if (tagSitelink) {
73997         if (_wikibaseCache[tagSitelink]) {
73998           result.tag = _wikibaseCache[tagSitelink];
73999         } else {
74000           titles.push(tagSitelink);
74001         }
74002       }
74003       if (!titles.length) {
74004         return callback(null, result);
74005       }
74006       var obj = {
74007         action: "wbgetentities",
74008         sites: "wiki",
74009         titles: titles.join("|"),
74010         languages: params.langCodes.join("|"),
74011         languagefallback: 1,
74012         origin: "*",
74013         format: "json"
74014         // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
74015         // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
74016         // formatversion: 2,
74017       };
74018       var url = apibase3 + "?" + utilQsString(obj);
74019       doRequest(url, function(err, d) {
74020         if (err) {
74021           callback(err);
74022         } else if (!d.success || d.error) {
74023           callback(d.error.messages.map(function(v) {
74024             return v.html["*"];
74025           }).join("<br>"));
74026         } else {
74027           var localeID = false;
74028           Object.values(d.entities).forEach(function(res) {
74029             if (res.missing !== "") {
74030               var title = res.sitelinks.wiki.title;
74031               if (title === rtypeSitelink) {
74032                 _wikibaseCache[rtypeSitelink] = res;
74033                 result.rtype = res;
74034               } else if (title === keySitelink) {
74035                 _wikibaseCache[keySitelink] = res;
74036                 result.key = res;
74037               } else if (title === tagSitelink) {
74038                 _wikibaseCache[tagSitelink] = res;
74039                 result.tag = res;
74040               } else if (title === localeSitelink) {
74041                 localeID = res.id;
74042               } else {
74043                 console.log("Unexpected title " + title);
74044               }
74045             }
74046           });
74047           if (localeSitelink) {
74048             that.addLocale(params.langCodes[0], localeID);
74049           }
74050           callback(null, result);
74051         }
74052       });
74053     },
74054     //
74055     // Pass params object of the form:
74056     // {
74057     //   key: 'string',     // required
74058     //   value: 'string'    // optional
74059     // }
74060     //
74061     // Get an result object used to display tag documentation
74062     // {
74063     //   title:        'string',
74064     //   description:  'string',
74065     //   editURL:      'string',
74066     //   imageURL:     'string',
74067     //   wiki:         { title: 'string', text: 'string', url: 'string' }
74068     // }
74069     //
74070     getDocs: function(params, callback) {
74071       var that = this;
74072       var langCodes = _mainLocalizer.localeCodes().map(function(code) {
74073         return code.toLowerCase();
74074       });
74075       params.langCodes = langCodes;
74076       this.getEntity(params, function(err, data) {
74077         if (err) {
74078           callback(err);
74079           return;
74080         }
74081         var entity = data.rtype || data.tag || data.key;
74082         if (!entity) {
74083           callback("No entity");
74084           return;
74085         }
74086         var i2;
74087         var description;
74088         for (i2 in langCodes) {
74089           let code2 = langCodes[i2];
74090           if (entity.descriptions[code2] && entity.descriptions[code2].language === code2) {
74091             description = entity.descriptions[code2];
74092             break;
74093           }
74094         }
74095         if (!description && Object.values(entity.descriptions).length)
74096           description = Object.values(entity.descriptions)[0];
74097         var result = {
74098           title: entity.title,
74099           description: description ? description.value : "",
74100           descriptionLocaleCode: description ? description.language : "",
74101           editURL: "https://wiki.openstreetmap.org/wiki/" + entity.title
74102         };
74103         if (entity.claims) {
74104           var imageroot;
74105           var image = that.claimToValue(entity, "P4", langCodes[0]);
74106           if (image) {
74107             imageroot = "https://commons.wikimedia.org/w/index.php";
74108           } else {
74109             image = that.claimToValue(entity, "P28", langCodes[0]);
74110             if (image) {
74111               imageroot = "https://wiki.openstreetmap.org/w/index.php";
74112             }
74113           }
74114           if (imageroot && image) {
74115             result.imageURL = imageroot + "?" + utilQsString({
74116               title: "Special:Redirect/file/" + image,
74117               width: 400
74118             });
74119           }
74120         }
74121         var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, "P31");
74122         var tagWiki = that.monolingualClaimToValueObj(data.tag, "P31");
74123         var keyWiki = that.monolingualClaimToValueObj(data.key, "P31");
74124         var wikis = [rtypeWiki, tagWiki, keyWiki];
74125         for (i2 in wikis) {
74126           var wiki = wikis[i2];
74127           for (var j2 in langCodes) {
74128             var code = langCodes[j2];
74129             var referenceId = langCodes[0].split("-")[0] !== "en" && code.split("-")[0] === "en" ? "inspector.wiki_en_reference" : "inspector.wiki_reference";
74130             var info = getWikiInfo(wiki, code, referenceId);
74131             if (info) {
74132               result.wiki = info;
74133               break;
74134             }
74135           }
74136           if (result.wiki)
74137             break;
74138         }
74139         callback(null, result);
74140         function getWikiInfo(wiki2, langCode, tKey) {
74141           if (wiki2 && wiki2[langCode]) {
74142             return {
74143               title: wiki2[langCode],
74144               text: tKey,
74145               url: "https://wiki.openstreetmap.org/wiki/" + wiki2[langCode]
74146             };
74147           }
74148         }
74149       });
74150     },
74151     addLocale: function(langCode, qid) {
74152       _localeIDs[langCode] = qid;
74153     },
74154     apibase: function(val) {
74155       if (!arguments.length)
74156         return apibase3;
74157       apibase3 = val;
74158       return this;
74159     }
74160   };
74161
74162   // modules/services/streetside.js
74163   var import_rbush10 = __toESM(require_rbush_min());
74164
74165   // modules/util/jsonp_request.js
74166   var jsonpCache = {};
74167   window.jsonpCache = jsonpCache;
74168   function jsonpRequest(url, callback) {
74169     var request3 = {
74170       abort: function() {
74171       }
74172     };
74173     if (window.JSONP_FIX) {
74174       if (window.JSONP_DELAY === 0) {
74175         callback(window.JSONP_FIX);
74176       } else {
74177         var t = window.setTimeout(function() {
74178           callback(window.JSONP_FIX);
74179         }, window.JSONP_DELAY || 0);
74180         request3.abort = function() {
74181           window.clearTimeout(t);
74182         };
74183       }
74184       return request3;
74185     }
74186     function rand() {
74187       var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
74188       var c = "";
74189       var i2 = -1;
74190       while (++i2 < 15)
74191         c += chars.charAt(Math.floor(Math.random() * 52));
74192       return c;
74193     }
74194     function create2(url2) {
74195       var e = url2.match(/callback=(\w+)/);
74196       var c = e ? e[1] : rand();
74197       jsonpCache[c] = function(data) {
74198         if (jsonpCache[c]) {
74199           callback(data);
74200         }
74201         finalize();
74202       };
74203       function finalize() {
74204         delete jsonpCache[c];
74205         script.remove();
74206       }
74207       request3.abort = finalize;
74208       return "jsonpCache." + c;
74209     }
74210     var cb = create2(url);
74211     var script = select_default2("head").append("script").attr("type", "text/javascript").attr("src", url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
74212     return request3;
74213   }
74214
74215   // modules/services/streetside.js
74216   var bubbleApi = "https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?";
74217   var streetsideImagesApi = "https://t.ssl.ak.tiles.virtualearth.net/tiles/";
74218   var bubbleAppKey = "AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm";
74219   var pannellumViewerCSS = "pannellum-streetside/pannellum.css";
74220   var pannellumViewerJS = "pannellum-streetside/pannellum.js";
74221   var maxResults2 = 2e3;
74222   var tileZoom2 = 16.5;
74223   var tiler6 = utilTiler().zoomExtent([tileZoom2, tileZoom2]).skipNullIsland(true);
74224   var dispatch8 = dispatch_default("loadedImages", "viewerChanged");
74225   var minHfov = 10;
74226   var maxHfov = 90;
74227   var defaultHfov = 45;
74228   var _hires = false;
74229   var _resolution = 512;
74230   var _currScene = 0;
74231   var _ssCache;
74232   var _pannellumViewer;
74233   var _sceneOptions = {
74234     showFullscreenCtrl: false,
74235     autoLoad: true,
74236     compass: true,
74237     yaw: 0,
74238     minHfov,
74239     maxHfov,
74240     hfov: defaultHfov,
74241     type: "cubemap",
74242     cubeMap: []
74243   };
74244   var _loadViewerPromise3;
74245   function abortRequest6(i2) {
74246     i2.abort();
74247   }
74248   function localeTimestamp(s) {
74249     if (!s)
74250       return null;
74251     const options2 = { day: "numeric", month: "short", year: "numeric" };
74252     const d = new Date(s);
74253     if (isNaN(d.getTime()))
74254       return null;
74255     return d.toLocaleString(_mainLocalizer.localeCode(), options2);
74256   }
74257   function loadTiles3(which, url, projection2, margin) {
74258     const tiles = tiler6.margin(margin).getTiles(projection2);
74259     const cache = _ssCache[which];
74260     Object.keys(cache.inflight).forEach((k) => {
74261       const wanted = tiles.find((tile) => k.indexOf(tile.id + ",") === 0);
74262       if (!wanted) {
74263         abortRequest6(cache.inflight[k]);
74264         delete cache.inflight[k];
74265       }
74266     });
74267     tiles.forEach((tile) => loadNextTilePage2(which, url, tile));
74268   }
74269   function loadNextTilePage2(which, url, tile) {
74270     const cache = _ssCache[which];
74271     const nextPage = cache.nextPage[tile.id] || 0;
74272     const id2 = tile.id + "," + String(nextPage);
74273     if (cache.loaded[id2] || cache.inflight[id2])
74274       return;
74275     cache.inflight[id2] = getBubbles(url, tile, (bubbles) => {
74276       cache.loaded[id2] = true;
74277       delete cache.inflight[id2];
74278       if (!bubbles)
74279         return;
74280       bubbles.shift();
74281       const features = bubbles.map((bubble) => {
74282         if (cache.points[bubble.id])
74283           return null;
74284         const loc = [bubble.lo, bubble.la];
74285         const d = {
74286           loc,
74287           key: bubble.id,
74288           ca: bubble.he,
74289           captured_at: bubble.cd,
74290           captured_by: "microsoft",
74291           // nbn: bubble.nbn,
74292           // pbn: bubble.pbn,
74293           // ad: bubble.ad,
74294           // rn: bubble.rn,
74295           pr: bubble.pr,
74296           // previous
74297           ne: bubble.ne,
74298           // next
74299           pano: true,
74300           sequenceKey: null
74301         };
74302         cache.points[bubble.id] = d;
74303         if (bubble.pr === void 0) {
74304           cache.leaders.push(bubble.id);
74305         }
74306         return {
74307           minX: loc[0],
74308           minY: loc[1],
74309           maxX: loc[0],
74310           maxY: loc[1],
74311           data: d
74312         };
74313       }).filter(Boolean);
74314       cache.rtree.load(features);
74315       connectSequences();
74316       if (which === "bubbles") {
74317         dispatch8.call("loadedImages");
74318       }
74319     });
74320   }
74321   function connectSequences() {
74322     let cache = _ssCache.bubbles;
74323     let keepLeaders = [];
74324     for (let i2 = 0; i2 < cache.leaders.length; i2++) {
74325       let bubble = cache.points[cache.leaders[i2]];
74326       let seen = {};
74327       let sequence = { key: bubble.key, bubbles: [] };
74328       let complete = false;
74329       do {
74330         sequence.bubbles.push(bubble);
74331         seen[bubble.key] = true;
74332         if (bubble.ne === void 0) {
74333           complete = true;
74334         } else {
74335           bubble = cache.points[bubble.ne];
74336         }
74337       } while (bubble && !seen[bubble.key] && !complete);
74338       if (complete) {
74339         _ssCache.sequences[sequence.key] = sequence;
74340         for (let j2 = 0; j2 < sequence.bubbles.length; j2++) {
74341           sequence.bubbles[j2].sequenceKey = sequence.key;
74342         }
74343         sequence.geojson = {
74344           type: "LineString",
74345           properties: {
74346             captured_at: sequence.bubbles[0] ? sequence.bubbles[0].captured_at : null,
74347             captured_by: sequence.bubbles[0] ? sequence.bubbles[0].captured_by : null,
74348             key: sequence.key
74349           },
74350           coordinates: sequence.bubbles.map((d) => d.loc)
74351         };
74352       } else {
74353         keepLeaders.push(cache.leaders[i2]);
74354       }
74355     }
74356     cache.leaders = keepLeaders;
74357   }
74358   function getBubbles(url, tile, callback) {
74359     let rect = tile.extent.rectangle();
74360     let urlForRequest = url + utilQsString({
74361       n: rect[3],
74362       s: rect[1],
74363       e: rect[2],
74364       w: rect[0],
74365       c: maxResults2,
74366       appkey: bubbleAppKey,
74367       jsCallback: "{callback}"
74368     });
74369     return jsonpRequest(urlForRequest, (data) => {
74370       if (!data || data.error) {
74371         callback(null);
74372       } else {
74373         callback(data);
74374       }
74375     });
74376   }
74377   function partitionViewport3(projection2) {
74378     let z = geoScaleToZoom(projection2.scale());
74379     let z2 = Math.ceil(z * 2) / 2 + 2.5;
74380     let tiler8 = utilTiler().zoomExtent([z2, z2]);
74381     return tiler8.getTiles(projection2).map((tile) => tile.extent);
74382   }
74383   function searchLimited3(limit, projection2, rtree) {
74384     limit = limit || 5;
74385     return partitionViewport3(projection2).reduce((result, extent) => {
74386       let found = rtree.search(extent.bbox()).slice(0, limit).map((d) => d.data);
74387       return found.length ? result.concat(found) : result;
74388     }, []);
74389   }
74390   function loadImage(imgInfo) {
74391     return new Promise((resolve) => {
74392       let img = new Image();
74393       img.onload = () => {
74394         let canvas = document.getElementById("ideditor-canvas" + imgInfo.face);
74395         let ctx = canvas.getContext("2d");
74396         ctx.drawImage(img, imgInfo.x, imgInfo.y);
74397         resolve({ imgInfo, status: "ok" });
74398       };
74399       img.onerror = () => {
74400         resolve({ data: imgInfo, status: "error" });
74401       };
74402       img.setAttribute("crossorigin", "");
74403       img.src = imgInfo.url;
74404     });
74405   }
74406   function loadCanvas(imageGroup) {
74407     return Promise.all(imageGroup.map(loadImage)).then((data) => {
74408       let canvas = document.getElementById("ideditor-canvas" + data[0].imgInfo.face);
74409       const which = { "01": 0, "02": 1, "03": 2, "10": 3, "11": 4, "12": 5 };
74410       let face = data[0].imgInfo.face;
74411       _sceneOptions.cubeMap[which[face]] = canvas.toDataURL("image/jpeg", 1);
74412       return { status: "loadCanvas for face " + data[0].imgInfo.face + "ok" };
74413     });
74414   }
74415   function loadFaces(faceGroup) {
74416     return Promise.all(faceGroup.map(loadCanvas)).then(() => {
74417       return { status: "loadFaces done" };
74418     });
74419   }
74420   function setupCanvas(selection2, reset) {
74421     if (reset) {
74422       selection2.selectAll("#ideditor-stitcher-canvases").remove();
74423     }
74424     selection2.selectAll("#ideditor-stitcher-canvases").data([0]).enter().append("div").attr("id", "ideditor-stitcher-canvases").attr("display", "none").selectAll("canvas").data(["canvas01", "canvas02", "canvas03", "canvas10", "canvas11", "canvas12"]).enter().append("canvas").attr("id", (d) => "ideditor-" + d).attr("width", _resolution).attr("height", _resolution);
74425   }
74426   function qkToXY(qk) {
74427     let x = 0;
74428     let y = 0;
74429     let scale = 256;
74430     for (let i2 = qk.length; i2 > 0; i2--) {
74431       const key = qk[i2 - 1];
74432       x += +(key === "1" || key === "3") * scale;
74433       y += +(key === "2" || key === "3") * scale;
74434       scale *= 2;
74435     }
74436     return [x, y];
74437   }
74438   function getQuadKeys() {
74439     let dim = _resolution / 256;
74440     let quadKeys;
74441     if (dim === 16) {
74442       quadKeys = [
74443         "0000",
74444         "0001",
74445         "0010",
74446         "0011",
74447         "0100",
74448         "0101",
74449         "0110",
74450         "0111",
74451         "1000",
74452         "1001",
74453         "1010",
74454         "1011",
74455         "1100",
74456         "1101",
74457         "1110",
74458         "1111",
74459         "0002",
74460         "0003",
74461         "0012",
74462         "0013",
74463         "0102",
74464         "0103",
74465         "0112",
74466         "0113",
74467         "1002",
74468         "1003",
74469         "1012",
74470         "1013",
74471         "1102",
74472         "1103",
74473         "1112",
74474         "1113",
74475         "0020",
74476         "0021",
74477         "0030",
74478         "0031",
74479         "0120",
74480         "0121",
74481         "0130",
74482         "0131",
74483         "1020",
74484         "1021",
74485         "1030",
74486         "1031",
74487         "1120",
74488         "1121",
74489         "1130",
74490         "1131",
74491         "0022",
74492         "0023",
74493         "0032",
74494         "0033",
74495         "0122",
74496         "0123",
74497         "0132",
74498         "0133",
74499         "1022",
74500         "1023",
74501         "1032",
74502         "1033",
74503         "1122",
74504         "1123",
74505         "1132",
74506         "1133",
74507         "0200",
74508         "0201",
74509         "0210",
74510         "0211",
74511         "0300",
74512         "0301",
74513         "0310",
74514         "0311",
74515         "1200",
74516         "1201",
74517         "1210",
74518         "1211",
74519         "1300",
74520         "1301",
74521         "1310",
74522         "1311",
74523         "0202",
74524         "0203",
74525         "0212",
74526         "0213",
74527         "0302",
74528         "0303",
74529         "0312",
74530         "0313",
74531         "1202",
74532         "1203",
74533         "1212",
74534         "1213",
74535         "1302",
74536         "1303",
74537         "1312",
74538         "1313",
74539         "0220",
74540         "0221",
74541         "0230",
74542         "0231",
74543         "0320",
74544         "0321",
74545         "0330",
74546         "0331",
74547         "1220",
74548         "1221",
74549         "1230",
74550         "1231",
74551         "1320",
74552         "1321",
74553         "1330",
74554         "1331",
74555         "0222",
74556         "0223",
74557         "0232",
74558         "0233",
74559         "0322",
74560         "0323",
74561         "0332",
74562         "0333",
74563         "1222",
74564         "1223",
74565         "1232",
74566         "1233",
74567         "1322",
74568         "1323",
74569         "1332",
74570         "1333",
74571         "2000",
74572         "2001",
74573         "2010",
74574         "2011",
74575         "2100",
74576         "2101",
74577         "2110",
74578         "2111",
74579         "3000",
74580         "3001",
74581         "3010",
74582         "3011",
74583         "3100",
74584         "3101",
74585         "3110",
74586         "3111",
74587         "2002",
74588         "2003",
74589         "2012",
74590         "2013",
74591         "2102",
74592         "2103",
74593         "2112",
74594         "2113",
74595         "3002",
74596         "3003",
74597         "3012",
74598         "3013",
74599         "3102",
74600         "3103",
74601         "3112",
74602         "3113",
74603         "2020",
74604         "2021",
74605         "2030",
74606         "2031",
74607         "2120",
74608         "2121",
74609         "2130",
74610         "2131",
74611         "3020",
74612         "3021",
74613         "3030",
74614         "3031",
74615         "3120",
74616         "3121",
74617         "3130",
74618         "3131",
74619         "2022",
74620         "2023",
74621         "2032",
74622         "2033",
74623         "2122",
74624         "2123",
74625         "2132",
74626         "2133",
74627         "3022",
74628         "3023",
74629         "3032",
74630         "3033",
74631         "3122",
74632         "3123",
74633         "3132",
74634         "3133",
74635         "2200",
74636         "2201",
74637         "2210",
74638         "2211",
74639         "2300",
74640         "2301",
74641         "2310",
74642         "2311",
74643         "3200",
74644         "3201",
74645         "3210",
74646         "3211",
74647         "3300",
74648         "3301",
74649         "3310",
74650         "3311",
74651         "2202",
74652         "2203",
74653         "2212",
74654         "2213",
74655         "2302",
74656         "2303",
74657         "2312",
74658         "2313",
74659         "3202",
74660         "3203",
74661         "3212",
74662         "3213",
74663         "3302",
74664         "3303",
74665         "3312",
74666         "3313",
74667         "2220",
74668         "2221",
74669         "2230",
74670         "2231",
74671         "2320",
74672         "2321",
74673         "2330",
74674         "2331",
74675         "3220",
74676         "3221",
74677         "3230",
74678         "3231",
74679         "3320",
74680         "3321",
74681         "3330",
74682         "3331",
74683         "2222",
74684         "2223",
74685         "2232",
74686         "2233",
74687         "2322",
74688         "2323",
74689         "2332",
74690         "2333",
74691         "3222",
74692         "3223",
74693         "3232",
74694         "3233",
74695         "3322",
74696         "3323",
74697         "3332",
74698         "3333"
74699       ];
74700     } else if (dim === 8) {
74701       quadKeys = [
74702         "000",
74703         "001",
74704         "010",
74705         "011",
74706         "100",
74707         "101",
74708         "110",
74709         "111",
74710         "002",
74711         "003",
74712         "012",
74713         "013",
74714         "102",
74715         "103",
74716         "112",
74717         "113",
74718         "020",
74719         "021",
74720         "030",
74721         "031",
74722         "120",
74723         "121",
74724         "130",
74725         "131",
74726         "022",
74727         "023",
74728         "032",
74729         "033",
74730         "122",
74731         "123",
74732         "132",
74733         "133",
74734         "200",
74735         "201",
74736         "210",
74737         "211",
74738         "300",
74739         "301",
74740         "310",
74741         "311",
74742         "202",
74743         "203",
74744         "212",
74745         "213",
74746         "302",
74747         "303",
74748         "312",
74749         "313",
74750         "220",
74751         "221",
74752         "230",
74753         "231",
74754         "320",
74755         "321",
74756         "330",
74757         "331",
74758         "222",
74759         "223",
74760         "232",
74761         "233",
74762         "322",
74763         "323",
74764         "332",
74765         "333"
74766       ];
74767     } else if (dim === 4) {
74768       quadKeys = [
74769         "00",
74770         "01",
74771         "10",
74772         "11",
74773         "02",
74774         "03",
74775         "12",
74776         "13",
74777         "20",
74778         "21",
74779         "30",
74780         "31",
74781         "22",
74782         "23",
74783         "32",
74784         "33"
74785       ];
74786     } else {
74787       quadKeys = [
74788         "0",
74789         "1",
74790         "2",
74791         "3"
74792       ];
74793     }
74794     return quadKeys;
74795   }
74796   var streetside_default = {
74797     /**
74798      * init() initialize streetside.
74799      */
74800     init: function() {
74801       if (!_ssCache) {
74802         this.reset();
74803       }
74804       this.event = utilRebind(this, dispatch8, "on");
74805     },
74806     /**
74807      * reset() reset the cache.
74808      */
74809     reset: function() {
74810       if (_ssCache) {
74811         Object.values(_ssCache.bubbles.inflight).forEach(abortRequest6);
74812       }
74813       _ssCache = {
74814         bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: new import_rbush10.default(), points: {}, leaders: [] },
74815         sequences: {}
74816       };
74817     },
74818     /**
74819      * bubbles()
74820      */
74821     bubbles: function(projection2) {
74822       const limit = 5;
74823       return searchLimited3(limit, projection2, _ssCache.bubbles.rtree);
74824     },
74825     cachedImage: function(imageKey) {
74826       return _ssCache.bubbles.points[imageKey];
74827     },
74828     sequences: function(projection2) {
74829       const viewport = projection2.clipExtent();
74830       const min3 = [viewport[0][0], viewport[1][1]];
74831       const max3 = [viewport[1][0], viewport[0][1]];
74832       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
74833       let seen = {};
74834       let results = [];
74835       _ssCache.bubbles.rtree.search(bbox2).forEach((d) => {
74836         const key = d.data.sequenceKey;
74837         if (key && !seen[key]) {
74838           seen[key] = true;
74839           results.push(_ssCache.sequences[key].geojson);
74840         }
74841       });
74842       return results;
74843     },
74844     /**
74845      * loadBubbles()
74846      */
74847     loadBubbles: function(projection2, margin) {
74848       if (margin === void 0)
74849         margin = 2;
74850       loadTiles3("bubbles", bubbleApi, projection2, margin);
74851     },
74852     viewer: function() {
74853       return _pannellumViewer;
74854     },
74855     initViewer: function() {
74856       if (!window.pannellum)
74857         return;
74858       if (_pannellumViewer)
74859         return;
74860       _currScene += 1;
74861       const sceneID = _currScene.toString();
74862       const options2 = {
74863         "default": { firstScene: sceneID },
74864         scenes: {}
74865       };
74866       options2.scenes[sceneID] = _sceneOptions;
74867       _pannellumViewer = window.pannellum.viewer("ideditor-viewer-streetside", options2);
74868     },
74869     ensureViewerLoaded: function(context) {
74870       if (_loadViewerPromise3)
74871         return _loadViewerPromise3;
74872       let wrap2 = context.container().select(".photoviewer").selectAll(".ms-wrapper").data([0]);
74873       let wrapEnter = wrap2.enter().append("div").attr("class", "photo-wrapper ms-wrapper").classed("hide", true);
74874       let that = this;
74875       let pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
74876       wrapEnter.append("div").attr("id", "ideditor-viewer-streetside").on(pointerPrefix + "down.streetside", () => {
74877         select_default2(window).on(pointerPrefix + "move.streetside", () => {
74878           dispatch8.call("viewerChanged");
74879         }, true);
74880       }).on(pointerPrefix + "up.streetside pointercancel.streetside", () => {
74881         select_default2(window).on(pointerPrefix + "move.streetside", null);
74882         let t = timer((elapsed) => {
74883           dispatch8.call("viewerChanged");
74884           if (elapsed > 2e3) {
74885             t.stop();
74886           }
74887         });
74888       }).append("div").attr("class", "photo-attribution fillD");
74889       let controlsEnter = wrapEnter.append("div").attr("class", "photo-controls-wrap").append("div").attr("class", "photo-controls");
74890       controlsEnter.append("button").on("click.back", step(-1)).text("\u25C4");
74891       controlsEnter.append("button").on("click.forward", step(1)).text("\u25BA");
74892       wrap2 = wrap2.merge(wrapEnter).call(setupCanvas, true);
74893       context.ui().photoviewer.on("resize.streetside", () => {
74894         if (_pannellumViewer) {
74895           _pannellumViewer.resize();
74896         }
74897       });
74898       _loadViewerPromise3 = new Promise((resolve, reject) => {
74899         let loadedCount = 0;
74900         function loaded() {
74901           loadedCount += 1;
74902           if (loadedCount === 2)
74903             resolve();
74904         }
74905         const head = select_default2("head");
74906         head.selectAll("#ideditor-streetside-viewercss").data([0]).enter().append("link").attr("id", "ideditor-streetside-viewercss").attr("rel", "stylesheet").attr("crossorigin", "anonymous").attr("href", context.asset(pannellumViewerCSS)).on("load.serviceStreetside", loaded).on("error.serviceStreetside", function() {
74907           reject();
74908         });
74909         head.selectAll("#ideditor-streetside-viewerjs").data([0]).enter().append("script").attr("id", "ideditor-streetside-viewerjs").attr("crossorigin", "anonymous").attr("src", context.asset(pannellumViewerJS)).on("load.serviceStreetside", loaded).on("error.serviceStreetside", function() {
74910           reject();
74911         });
74912       }).catch(function() {
74913         _loadViewerPromise3 = null;
74914       });
74915       return _loadViewerPromise3;
74916       function step(stepBy) {
74917         return () => {
74918           let viewer = context.container().select(".photoviewer");
74919           let selected = viewer.empty() ? void 0 : viewer.datum();
74920           if (!selected)
74921             return;
74922           let nextID = stepBy === 1 ? selected.ne : selected.pr;
74923           let yaw = _pannellumViewer.getYaw();
74924           let ca = selected.ca + yaw;
74925           let origin = selected.loc;
74926           const meters = 35;
74927           let p1 = [
74928             origin[0] + geoMetersToLon(meters / 5, origin[1]),
74929             origin[1]
74930           ];
74931           let p2 = [
74932             origin[0] + geoMetersToLon(meters / 2, origin[1]),
74933             origin[1] + geoMetersToLat(meters)
74934           ];
74935           let p3 = [
74936             origin[0] - geoMetersToLon(meters / 2, origin[1]),
74937             origin[1] + geoMetersToLat(meters)
74938           ];
74939           let p4 = [
74940             origin[0] - geoMetersToLon(meters / 5, origin[1]),
74941             origin[1]
74942           ];
74943           let poly = [p1, p2, p3, p4, p1];
74944           let angle2 = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
74945           poly = geoRotate(poly, -angle2, origin);
74946           let extent = poly.reduce((extent2, point2) => {
74947             return extent2.extend(geoExtent(point2));
74948           }, geoExtent());
74949           let minDist = Infinity;
74950           _ssCache.bubbles.rtree.search(extent.bbox()).forEach((d) => {
74951             if (d.data.key === selected.key)
74952               return;
74953             if (!geoPointInPolygon(d.data.loc, poly))
74954               return;
74955             let dist = geoVecLength(d.data.loc, selected.loc);
74956             let theta = selected.ca - d.data.ca;
74957             let minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
74958             if (minTheta > 20) {
74959               dist += 5;
74960             }
74961             if (dist < minDist) {
74962               nextID = d.data.key;
74963               minDist = dist;
74964             }
74965           });
74966           let nextBubble = nextID && that.cachedImage(nextID);
74967           if (!nextBubble)
74968             return;
74969           context.map().centerEase(nextBubble.loc);
74970           that.selectImage(context, nextBubble.key).yaw(yaw).showViewer(context);
74971         };
74972       }
74973     },
74974     yaw: function(yaw) {
74975       if (typeof yaw !== "number")
74976         return yaw;
74977       _sceneOptions.yaw = yaw;
74978       return this;
74979     },
74980     /**
74981      * showViewer()
74982      */
74983     showViewer: function(context) {
74984       let wrap2 = context.container().select(".photoviewer").classed("hide", false);
74985       let isHidden = wrap2.selectAll(".photo-wrapper.ms-wrapper.hide").size();
74986       if (isHidden) {
74987         wrap2.selectAll(".photo-wrapper:not(.ms-wrapper)").classed("hide", true);
74988         wrap2.selectAll(".photo-wrapper.ms-wrapper").classed("hide", false);
74989       }
74990       return this;
74991     },
74992     /**
74993      * hideViewer()
74994      */
74995     hideViewer: function(context) {
74996       let viewer = context.container().select(".photoviewer");
74997       if (!viewer.empty())
74998         viewer.datum(null);
74999       viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
75000       context.container().selectAll(".viewfield-group, .sequence, .icon-sign").classed("currentView", false);
75001       this.updateUrlImage(null);
75002       return this.setStyles(context, null, true);
75003     },
75004     /**
75005      * selectImage().
75006      */
75007     selectImage: function(context, key) {
75008       let that = this;
75009       let d = this.cachedImage(key);
75010       let viewer = context.container().select(".photoviewer");
75011       if (!viewer.empty())
75012         viewer.datum(d);
75013       this.setStyles(context, null, true);
75014       let wrap2 = context.container().select(".photoviewer .ms-wrapper");
75015       let attribution = wrap2.selectAll(".photo-attribution").html("");
75016       wrap2.selectAll(".pnlm-load-box").style("display", "block");
75017       if (!d)
75018         return this;
75019       this.updateUrlImage(key);
75020       _sceneOptions.northOffset = d.ca;
75021       let line1 = attribution.append("div").attr("class", "attribution-row");
75022       const hiresDomId = utilUniqueDomId("streetside-hires");
75023       let label = line1.append("label").attr("for", hiresDomId).attr("class", "streetside-hires");
75024       label.append("input").attr("type", "checkbox").attr("id", hiresDomId).property("checked", _hires).on("click", (d3_event) => {
75025         d3_event.stopPropagation();
75026         _hires = !_hires;
75027         _resolution = _hires ? 1024 : 512;
75028         wrap2.call(setupCanvas, true);
75029         let viewstate = {
75030           yaw: _pannellumViewer.getYaw(),
75031           pitch: _pannellumViewer.getPitch(),
75032           hfov: _pannellumViewer.getHfov()
75033         };
75034         _sceneOptions = Object.assign(_sceneOptions, viewstate);
75035         that.selectImage(context, d.key).showViewer(context);
75036       });
75037       label.append("span").call(_t.append("streetside.hires"));
75038       let captureInfo = line1.append("div").attr("class", "attribution-capture-info");
75039       if (d.captured_by) {
75040         const yyyy = new Date().getFullYear();
75041         captureInfo.append("a").attr("class", "captured_by").attr("target", "_blank").attr("href", "https://www.microsoft.com/en-us/maps/streetside").text("\xA9" + yyyy + " Microsoft");
75042         captureInfo.append("span").text("|");
75043       }
75044       if (d.captured_at) {
75045         captureInfo.append("span").attr("class", "captured_at").text(localeTimestamp(d.captured_at));
75046       }
75047       let line2 = attribution.append("div").attr("class", "attribution-row");
75048       line2.append("a").attr("class", "image-view-link").attr("target", "_blank").attr("href", "https://www.bing.com/maps?cp=" + d.loc[1] + "~" + d.loc[0] + "&lvl=17&dir=" + d.ca + "&style=x&v=2&sV=1").call(_t.append("streetside.view_on_bing"));
75049       line2.append("a").attr("class", "image-report-link").attr("target", "_blank").attr("href", "https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=" + encodeURIComponent(d.key) + "&focus=photo&lat=" + d.loc[1] + "&lng=" + d.loc[0] + "&z=17").call(_t.append("streetside.report"));
75050       let bubbleIdQuadKey = d.key.toString(4);
75051       const paddingNeeded = 16 - bubbleIdQuadKey.length;
75052       for (let i2 = 0; i2 < paddingNeeded; i2++) {
75053         bubbleIdQuadKey = "0" + bubbleIdQuadKey;
75054       }
75055       const imgUrlPrefix = streetsideImagesApi + "hs" + bubbleIdQuadKey;
75056       const imgUrlSuffix = ".jpg?g=6338&n=z";
75057       const faceKeys = ["01", "02", "03", "10", "11", "12"];
75058       let quadKeys = getQuadKeys();
75059       let faces = faceKeys.map((faceKey) => {
75060         return quadKeys.map((quadKey) => {
75061           const xy = qkToXY(quadKey);
75062           return {
75063             face: faceKey,
75064             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
75065             x: xy[0],
75066             y: xy[1]
75067           };
75068         });
75069       });
75070       loadFaces(faces).then(function() {
75071         if (!_pannellumViewer) {
75072           that.initViewer();
75073         } else {
75074           _currScene += 1;
75075           let sceneID = _currScene.toString();
75076           _pannellumViewer.addScene(sceneID, _sceneOptions).loadScene(sceneID);
75077           if (_currScene > 2) {
75078             sceneID = (_currScene - 1).toString();
75079             _pannellumViewer.removeScene(sceneID);
75080           }
75081         }
75082       });
75083       return this;
75084     },
75085     getSequenceKeyForBubble: function(d) {
75086       return d && d.sequenceKey;
75087     },
75088     // Updates the currently highlighted sequence and selected bubble.
75089     // Reset is only necessary when interacting with the viewport because
75090     // this implicitly changes the currently selected bubble/sequence
75091     setStyles: function(context, hovered, reset) {
75092       if (reset) {
75093         context.container().selectAll(".viewfield-group").classed("highlighted", false).classed("hovered", false).classed("currentView", false);
75094         context.container().selectAll(".sequence").classed("highlighted", false).classed("currentView", false);
75095       }
75096       let hoveredBubbleKey = hovered && hovered.key;
75097       let hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
75098       let hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
75099       let hoveredBubbleKeys = hoveredSequence && hoveredSequence.bubbles.map((d) => d.key) || [];
75100       let viewer = context.container().select(".photoviewer");
75101       let selected = viewer.empty() ? void 0 : viewer.datum();
75102       let selectedBubbleKey = selected && selected.key;
75103       let selectedSequenceKey = this.getSequenceKeyForBubble(selected);
75104       let selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
75105       let selectedBubbleKeys = selectedSequence && selectedSequence.bubbles.map((d) => d.key) || [];
75106       let highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
75107       context.container().selectAll(".layer-streetside-images .viewfield-group").classed("highlighted", (d) => highlightedBubbleKeys.indexOf(d.key) !== -1).classed("hovered", (d) => d.key === hoveredBubbleKey).classed("currentView", (d) => d.key === selectedBubbleKey);
75108       context.container().selectAll(".layer-streetside-images .sequence").classed("highlighted", (d) => d.properties.key === hoveredSequenceKey).classed("currentView", (d) => d.properties.key === selectedSequenceKey);
75109       context.container().selectAll(".layer-streetside-images .viewfield-group .viewfield").attr("d", viewfieldPath);
75110       function viewfieldPath() {
75111         let d = this.parentNode.__data__;
75112         if (d.pano && d.key !== selectedBubbleKey) {
75113           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
75114         } else {
75115           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
75116         }
75117       }
75118       return this;
75119     },
75120     updateUrlImage: function(imageKey) {
75121       if (!window.mocha) {
75122         var hash = utilStringQs(window.location.hash);
75123         if (imageKey) {
75124           hash.photo = "streetside/" + imageKey;
75125         } else {
75126           delete hash.photo;
75127         }
75128         window.location.replace("#" + utilQsString(hash, true));
75129       }
75130     },
75131     /**
75132      * cache().
75133      */
75134     cache: function() {
75135       return _ssCache;
75136     }
75137   };
75138
75139   // modules/services/taginfo.js
75140   var apibase4 = taginfoApiUrl;
75141   var _inflight3 = {};
75142   var _popularKeys = {};
75143   var _taginfoCache = {};
75144   var tag_sorts = {
75145     point: "count_nodes",
75146     vertex: "count_nodes",
75147     area: "count_ways",
75148     line: "count_ways"
75149   };
75150   var tag_sort_members = {
75151     point: "count_node_members",
75152     vertex: "count_node_members",
75153     area: "count_way_members",
75154     line: "count_way_members",
75155     relation: "count_relation_members"
75156   };
75157   var tag_filters = {
75158     point: "nodes",
75159     vertex: "nodes",
75160     area: "ways",
75161     line: "ways"
75162   };
75163   var tag_members_fractions = {
75164     point: "count_node_members_fraction",
75165     vertex: "count_node_members_fraction",
75166     area: "count_way_members_fraction",
75167     line: "count_way_members_fraction",
75168     relation: "count_relation_members_fraction"
75169   };
75170   function sets(params, n2, o) {
75171     if (params.geometry && o[params.geometry]) {
75172       params[n2] = o[params.geometry];
75173     }
75174     return params;
75175   }
75176   function setFilter(params) {
75177     return sets(params, "filter", tag_filters);
75178   }
75179   function setSort(params) {
75180     return sets(params, "sortname", tag_sorts);
75181   }
75182   function setSortMembers(params) {
75183     return sets(params, "sortname", tag_sort_members);
75184   }
75185   function clean(params) {
75186     return utilObjectOmit(params, ["geometry", "debounce"]);
75187   }
75188   function filterKeys(type2) {
75189     var count_type = type2 ? "count_" + type2 : "count_all";
75190     return function(d) {
75191       return Number(d[count_type]) > 2500 || d.in_wiki;
75192     };
75193   }
75194   function filterMultikeys(prefix) {
75195     return function(d) {
75196       var re2 = new RegExp("^" + prefix + "(.*)$", "i");
75197       var matches = d.key.match(re2) || [];
75198       return matches.length === 2 && matches[1].indexOf(":") === -1;
75199     };
75200   }
75201   function filterValues(allowUpperCase) {
75202     return function(d) {
75203       if (d.value.match(/[;,]/) !== null)
75204         return false;
75205       if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null)
75206         return false;
75207       return d.count > 100 || d.in_wiki;
75208     };
75209   }
75210   function filterRoles(geometry) {
75211     return function(d) {
75212       if (d.role === "")
75213         return false;
75214       if (d.role.match(/[A-Z*;,]/) !== null)
75215         return false;
75216       return Number(d[tag_members_fractions[geometry]]) > 0;
75217     };
75218   }
75219   function valKey(d) {
75220     return {
75221       value: d.key,
75222       title: d.key
75223     };
75224   }
75225   function valKeyDescription(d) {
75226     var obj = {
75227       value: d.value,
75228       title: d.description || d.value
75229     };
75230     return obj;
75231   }
75232   function roleKey(d) {
75233     return {
75234       value: d.role,
75235       title: d.role
75236     };
75237   }
75238   function sortKeys(a, b) {
75239     return a.key.indexOf(":") === -1 && b.key.indexOf(":") !== -1 ? -1 : a.key.indexOf(":") !== -1 && b.key.indexOf(":") === -1 ? 1 : 0;
75240   }
75241   var debouncedRequest2 = debounce_default(request2, 300, { leading: false });
75242   function request2(url, params, exactMatch, callback, loaded) {
75243     if (_inflight3[url])
75244       return;
75245     if (checkCache(url, params, exactMatch, callback))
75246       return;
75247     var controller = new AbortController();
75248     _inflight3[url] = controller;
75249     json_default(url, { signal: controller.signal }).then(function(result) {
75250       delete _inflight3[url];
75251       if (loaded)
75252         loaded(null, result);
75253     }).catch(function(err) {
75254       delete _inflight3[url];
75255       if (err.name === "AbortError")
75256         return;
75257       if (loaded)
75258         loaded(err.message);
75259     });
75260   }
75261   function checkCache(url, params, exactMatch, callback) {
75262     var rp = params.rp || 25;
75263     var testQuery = params.query || "";
75264     var testUrl = url;
75265     do {
75266       var hit = _taginfoCache[testUrl];
75267       if (hit && (url === testUrl || hit.length < rp)) {
75268         callback(null, hit);
75269         return true;
75270       }
75271       if (exactMatch || !testQuery.length)
75272         return false;
75273       testQuery = testQuery.slice(0, -1);
75274       testUrl = url.replace(/&query=(.*?)&/, "&query=" + testQuery + "&");
75275     } while (testQuery.length >= 0);
75276     return false;
75277   }
75278   var taginfo_default = {
75279     init: function() {
75280       _inflight3 = {};
75281       _taginfoCache = {};
75282       _popularKeys = {
75283         // manually exclude some keys – #5377, #7485
75284         postal_code: true,
75285         full_name: true,
75286         loc_name: true,
75287         reg_name: true,
75288         short_name: true,
75289         sorting_name: true,
75290         artist_name: true,
75291         nat_name: true,
75292         long_name: true,
75293         via: true,
75294         "bridge:name": true
75295       };
75296       var params = {
75297         rp: 100,
75298         sortname: "values_all",
75299         sortorder: "desc",
75300         page: 1,
75301         debounce: false,
75302         lang: _mainLocalizer.languageCode()
75303       };
75304       this.keys(params, function(err, data) {
75305         if (err)
75306           return;
75307         data.forEach(function(d) {
75308           if (d.value === "opening_hours")
75309             return;
75310           _popularKeys[d.value] = true;
75311         });
75312       });
75313     },
75314     reset: function() {
75315       Object.values(_inflight3).forEach(function(controller) {
75316         controller.abort();
75317       });
75318       _inflight3 = {};
75319     },
75320     keys: function(params, callback) {
75321       var doRequest = params.debounce ? debouncedRequest2 : request2;
75322       params = clean(setSort(params));
75323       params = Object.assign({
75324         rp: 10,
75325         sortname: "count_all",
75326         sortorder: "desc",
75327         page: 1,
75328         lang: _mainLocalizer.languageCode()
75329       }, params);
75330       var url = apibase4 + "keys/all?" + utilQsString(params);
75331       doRequest(url, params, false, callback, function(err, d) {
75332         if (err) {
75333           callback(err);
75334         } else {
75335           var f2 = filterKeys(params.filter);
75336           var result = d.data.filter(f2).sort(sortKeys).map(valKey);
75337           _taginfoCache[url] = result;
75338           callback(null, result);
75339         }
75340       });
75341     },
75342     multikeys: function(params, callback) {
75343       var doRequest = params.debounce ? debouncedRequest2 : request2;
75344       params = clean(setSort(params));
75345       params = Object.assign({
75346         rp: 25,
75347         sortname: "count_all",
75348         sortorder: "desc",
75349         page: 1,
75350         lang: _mainLocalizer.languageCode()
75351       }, params);
75352       var prefix = params.query;
75353       var url = apibase4 + "keys/all?" + utilQsString(params);
75354       doRequest(url, params, true, callback, function(err, d) {
75355         if (err) {
75356           callback(err);
75357         } else {
75358           var f2 = filterMultikeys(prefix);
75359           var result = d.data.filter(f2).map(valKey);
75360           _taginfoCache[url] = result;
75361           callback(null, result);
75362         }
75363       });
75364     },
75365     values: function(params, callback) {
75366       var key = params.key;
75367       if (key && _popularKeys[key]) {
75368         callback(null, []);
75369         return;
75370       }
75371       var doRequest = params.debounce ? debouncedRequest2 : request2;
75372       params = clean(setSort(setFilter(params)));
75373       params = Object.assign({
75374         rp: 25,
75375         sortname: "count_all",
75376         sortorder: "desc",
75377         page: 1,
75378         lang: _mainLocalizer.languageCode()
75379       }, params);
75380       var url = apibase4 + "key/values?" + utilQsString(params);
75381       doRequest(url, params, false, callback, function(err, d) {
75382         if (err) {
75383           callback(err);
75384         } else {
75385           var re2 = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale/;
75386           var allowUpperCase = re2.test(params.key);
75387           var f2 = filterValues(allowUpperCase);
75388           var result = d.data.filter(f2).map(valKeyDescription);
75389           _taginfoCache[url] = result;
75390           callback(null, result);
75391         }
75392       });
75393     },
75394     roles: function(params, callback) {
75395       var doRequest = params.debounce ? debouncedRequest2 : request2;
75396       var geometry = params.geometry;
75397       params = clean(setSortMembers(params));
75398       params = Object.assign({
75399         rp: 25,
75400         sortname: "count_all_members",
75401         sortorder: "desc",
75402         page: 1,
75403         lang: _mainLocalizer.languageCode()
75404       }, params);
75405       var url = apibase4 + "relation/roles?" + utilQsString(params);
75406       doRequest(url, params, true, callback, function(err, d) {
75407         if (err) {
75408           callback(err);
75409         } else {
75410           var f2 = filterRoles(geometry);
75411           var result = d.data.filter(f2).map(roleKey);
75412           _taginfoCache[url] = result;
75413           callback(null, result);
75414         }
75415       });
75416     },
75417     docs: function(params, callback) {
75418       var doRequest = params.debounce ? debouncedRequest2 : request2;
75419       params = clean(setSort(params));
75420       var path = "key/wiki_pages?";
75421       if (params.value) {
75422         path = "tag/wiki_pages?";
75423       } else if (params.rtype) {
75424         path = "relation/wiki_pages?";
75425       }
75426       var url = apibase4 + path + utilQsString(params);
75427       doRequest(url, params, true, callback, function(err, d) {
75428         if (err) {
75429           callback(err);
75430         } else {
75431           _taginfoCache[url] = d.data;
75432           callback(null, d.data);
75433         }
75434       });
75435     },
75436     apibase: function(_) {
75437       if (!arguments.length)
75438         return apibase4;
75439       apibase4 = _;
75440       return this;
75441     }
75442   };
75443
75444   // modules/services/vector_tile.js
75445   var import_fast_deep_equal11 = __toESM(require_fast_deep_equal());
75446   var import_fast_json_stable_stringify2 = __toESM(require_fast_json_stable_stringify());
75447   var import_polygon_clipping2 = __toESM(require_polygon_clipping_umd());
75448   var import_pbf2 = __toESM(require_pbf());
75449   var import_vector_tile2 = __toESM(require_vector_tile());
75450   var tiler7 = utilTiler().tileSize(512).margin(1);
75451   var dispatch9 = dispatch_default("loadedData");
75452   var _vtCache;
75453   function abortRequest7(controller) {
75454     controller.abort();
75455   }
75456   function vtToGeoJSON(data, tile, mergeCache) {
75457     var vectorTile = new import_vector_tile2.default.VectorTile(new import_pbf2.default(data));
75458     var layers = Object.keys(vectorTile.layers);
75459     if (!Array.isArray(layers)) {
75460       layers = [layers];
75461     }
75462     var features = [];
75463     layers.forEach(function(layerID) {
75464       var layer = vectorTile.layers[layerID];
75465       if (layer) {
75466         for (var i2 = 0; i2 < layer.length; i2++) {
75467           var feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
75468           var geometry = feature3.geometry;
75469           if (geometry.type === "Polygon") {
75470             geometry.type = "MultiPolygon";
75471             geometry.coordinates = [geometry.coordinates];
75472           }
75473           var isClipped = false;
75474           if (geometry.type === "MultiPolygon") {
75475             var featureClip = bboxClip(feature3, tile.extent.rectangle());
75476             if (!(0, import_fast_deep_equal11.default)(feature3.geometry, featureClip.geometry)) {
75477               isClipped = true;
75478             }
75479             if (!feature3.geometry.coordinates.length)
75480               continue;
75481             if (!feature3.geometry.coordinates[0].length)
75482               continue;
75483           }
75484           var featurehash = utilHashcode((0, import_fast_json_stable_stringify2.default)(feature3));
75485           var propertyhash = utilHashcode((0, import_fast_json_stable_stringify2.default)(feature3.properties || {}));
75486           feature3.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, "_");
75487           feature3.__featurehash__ = featurehash;
75488           feature3.__propertyhash__ = propertyhash;
75489           features.push(feature3);
75490           if (isClipped && geometry.type === "MultiPolygon") {
75491             var merged = mergeCache[propertyhash];
75492             if (merged && merged.length) {
75493               var other = merged[0];
75494               var coords = import_polygon_clipping2.default.union(
75495                 feature3.geometry.coordinates,
75496                 other.geometry.coordinates
75497               );
75498               if (!coords || !coords.length) {
75499                 continue;
75500               }
75501               merged.push(feature3);
75502               for (var j2 = 0; j2 < merged.length; j2++) {
75503                 merged[j2].geometry.coordinates = coords;
75504                 merged[j2].__featurehash__ = featurehash;
75505               }
75506             } else {
75507               mergeCache[propertyhash] = [feature3];
75508             }
75509           }
75510         }
75511       }
75512     });
75513     return features;
75514   }
75515   function loadTile2(source, tile) {
75516     if (source.loaded[tile.id] || source.inflight[tile.id])
75517       return;
75518     var url = source.template.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1).replace(/\{z(oom)?\}/, tile.xyz[2]).replace(/\{switch:([^}]+)\}/, function(s, r) {
75519       var subdomains = r.split(",");
75520       return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
75521     });
75522     var controller = new AbortController();
75523     source.inflight[tile.id] = controller;
75524     fetch(url, { signal: controller.signal }).then(function(response) {
75525       if (!response.ok) {
75526         throw new Error(response.status + " " + response.statusText);
75527       }
75528       source.loaded[tile.id] = [];
75529       delete source.inflight[tile.id];
75530       return response.arrayBuffer();
75531     }).then(function(data) {
75532       if (!data) {
75533         throw new Error("No Data");
75534       }
75535       var z = tile.xyz[2];
75536       if (!source.canMerge[z]) {
75537         source.canMerge[z] = {};
75538       }
75539       source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
75540       dispatch9.call("loadedData");
75541     }).catch(function() {
75542       source.loaded[tile.id] = [];
75543       delete source.inflight[tile.id];
75544     });
75545   }
75546   var vector_tile_default = {
75547     init: function() {
75548       if (!_vtCache) {
75549         this.reset();
75550       }
75551       this.event = utilRebind(this, dispatch9, "on");
75552     },
75553     reset: function() {
75554       for (var sourceID in _vtCache) {
75555         var source = _vtCache[sourceID];
75556         if (source && source.inflight) {
75557           Object.values(source.inflight).forEach(abortRequest7);
75558         }
75559       }
75560       _vtCache = {};
75561     },
75562     addSource: function(sourceID, template) {
75563       _vtCache[sourceID] = { template, inflight: {}, loaded: {}, canMerge: {} };
75564       return _vtCache[sourceID];
75565     },
75566     data: function(sourceID, projection2) {
75567       var source = _vtCache[sourceID];
75568       if (!source)
75569         return [];
75570       var tiles = tiler7.getTiles(projection2);
75571       var seen = {};
75572       var results = [];
75573       for (var i2 = 0; i2 < tiles.length; i2++) {
75574         var features = source.loaded[tiles[i2].id];
75575         if (!features || !features.length)
75576           continue;
75577         for (var j2 = 0; j2 < features.length; j2++) {
75578           var feature3 = features[j2];
75579           var hash = feature3.__featurehash__;
75580           if (seen[hash])
75581             continue;
75582           seen[hash] = true;
75583           results.push(Object.assign({}, feature3));
75584         }
75585       }
75586       return results;
75587     },
75588     loadTiles: function(sourceID, template, projection2) {
75589       var source = _vtCache[sourceID];
75590       if (!source) {
75591         source = this.addSource(sourceID, template);
75592       }
75593       var tiles = tiler7.getTiles(projection2);
75594       Object.keys(source.inflight).forEach(function(k) {
75595         var wanted = tiles.find(function(tile) {
75596           return k === tile.id;
75597         });
75598         if (!wanted) {
75599           abortRequest7(source.inflight[k]);
75600           delete source.inflight[k];
75601         }
75602       });
75603       tiles.forEach(function(tile) {
75604         loadTile2(source, tile);
75605       });
75606     },
75607     cache: function() {
75608       return _vtCache;
75609     }
75610   };
75611
75612   // modules/services/wikidata.js
75613   var apibase5 = "https://www.wikidata.org/w/api.php?";
75614   var _wikidataCache = {};
75615   var wikidata_default = {
75616     init: function() {
75617     },
75618     reset: function() {
75619       _wikidataCache = {};
75620     },
75621     // Search for Wikidata items matching the query
75622     itemsForSearchQuery: function(query, callback) {
75623       if (!query) {
75624         if (callback)
75625           callback("No query", {});
75626         return;
75627       }
75628       var lang = this.languagesToQuery()[0];
75629       var url = apibase5 + utilQsString({
75630         action: "wbsearchentities",
75631         format: "json",
75632         formatversion: 2,
75633         search: query,
75634         type: "item",
75635         // the language to search
75636         language: lang,
75637         // the language for the label and description in the result
75638         uselang: lang,
75639         limit: 10,
75640         origin: "*"
75641       });
75642       json_default(url).then(function(result) {
75643         if (result && result.error) {
75644           throw new Error(result.error);
75645         }
75646         if (callback)
75647           callback(null, result.search || {});
75648       }).catch(function(err) {
75649         if (callback)
75650           callback(err.message, {});
75651       });
75652     },
75653     // Given a Wikipedia language and article title,
75654     // return an array of corresponding Wikidata entities.
75655     itemsByTitle: function(lang, title, callback) {
75656       if (!title) {
75657         if (callback)
75658           callback("No title", {});
75659         return;
75660       }
75661       lang = lang || "en";
75662       var url = apibase5 + utilQsString({
75663         action: "wbgetentities",
75664         format: "json",
75665         formatversion: 2,
75666         sites: lang.replace(/-/g, "_") + "wiki",
75667         titles: title,
75668         languages: "en",
75669         // shrink response by filtering to one language
75670         origin: "*"
75671       });
75672       json_default(url).then(function(result) {
75673         if (result && result.error) {
75674           throw new Error(result.error);
75675         }
75676         if (callback)
75677           callback(null, result.entities || {});
75678       }).catch(function(err) {
75679         if (callback)
75680           callback(err.message, {});
75681       });
75682     },
75683     languagesToQuery: function() {
75684       return _mainLocalizer.localeCodes().map(function(code) {
75685         return code.toLowerCase();
75686       }).filter(function(code) {
75687         return code !== "en-us";
75688       });
75689     },
75690     entityByQID: function(qid, callback) {
75691       if (!qid) {
75692         callback("No qid", {});
75693         return;
75694       }
75695       if (_wikidataCache[qid]) {
75696         if (callback)
75697           callback(null, _wikidataCache[qid]);
75698         return;
75699       }
75700       var langs = this.languagesToQuery();
75701       var url = apibase5 + utilQsString({
75702         action: "wbgetentities",
75703         format: "json",
75704         formatversion: 2,
75705         ids: qid,
75706         props: "labels|descriptions|claims|sitelinks",
75707         sitefilter: langs.map(function(d) {
75708           return d + "wiki";
75709         }).join("|"),
75710         languages: langs.join("|"),
75711         languagefallback: 1,
75712         origin: "*"
75713       });
75714       json_default(url).then(function(result) {
75715         if (result && result.error) {
75716           throw new Error(result.error);
75717         }
75718         if (callback)
75719           callback(null, result.entities[qid] || {});
75720       }).catch(function(err) {
75721         if (callback)
75722           callback(err.message, {});
75723       });
75724     },
75725     // Pass `params` object of the form:
75726     // {
75727     //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
75728     // }
75729     //
75730     // Get an result object used to display tag documentation
75731     // {
75732     //   title:        'string',
75733     //   description:  'string',
75734     //   editURL:      'string',
75735     //   imageURL:     'string',
75736     //   wiki:         { title: 'string', text: 'string', url: 'string' }
75737     // }
75738     //
75739     getDocs: function(params, callback) {
75740       var langs = this.languagesToQuery();
75741       this.entityByQID(params.qid, function(err, entity) {
75742         if (err || !entity) {
75743           callback(err || "No entity");
75744           return;
75745         }
75746         var i2;
75747         var description;
75748         for (i2 in langs) {
75749           let code = langs[i2];
75750           if (entity.descriptions[code] && entity.descriptions[code].language === code) {
75751             description = entity.descriptions[code];
75752             break;
75753           }
75754         }
75755         if (!description && Object.values(entity.descriptions).length)
75756           description = Object.values(entity.descriptions)[0];
75757         var result = {
75758           title: entity.id,
75759           description: description ? description.value : "",
75760           descriptionLocaleCode: description ? description.language : "",
75761           editURL: "https://www.wikidata.org/wiki/" + entity.id
75762         };
75763         if (entity.claims) {
75764           var imageroot = "https://commons.wikimedia.org/w/index.php";
75765           var props = ["P154", "P18"];
75766           var prop, image;
75767           for (i2 = 0; i2 < props.length; i2++) {
75768             prop = entity.claims[props[i2]];
75769             if (prop && Object.keys(prop).length > 0) {
75770               image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
75771               if (image) {
75772                 result.imageURL = imageroot + "?" + utilQsString({
75773                   title: "Special:Redirect/file/" + image,
75774                   width: 400
75775                 });
75776                 break;
75777               }
75778             }
75779           }
75780         }
75781         if (entity.sitelinks) {
75782           var englishLocale = _mainLocalizer.languageCode().toLowerCase() === "en";
75783           for (i2 = 0; i2 < langs.length; i2++) {
75784             var w = langs[i2] + "wiki";
75785             if (entity.sitelinks[w]) {
75786               var title = entity.sitelinks[w].title;
75787               var tKey = "inspector.wiki_reference";
75788               if (!englishLocale && langs[i2] === "en") {
75789                 tKey = "inspector.wiki_en_reference";
75790               }
75791               result.wiki = {
75792                 title,
75793                 text: tKey,
75794                 url: "https://" + langs[i2] + ".wikipedia.org/wiki/" + title.replace(/ /g, "_")
75795               };
75796               break;
75797             }
75798           }
75799         }
75800         callback(null, result);
75801       });
75802     }
75803   };
75804
75805   // modules/services/wikipedia.js
75806   var endpoint = "https://en.wikipedia.org/w/api.php?";
75807   var wikipedia_default = {
75808     init: function() {
75809     },
75810     reset: function() {
75811     },
75812     search: function(lang, query, callback) {
75813       if (!query) {
75814         if (callback)
75815           callback("No Query", []);
75816         return;
75817       }
75818       lang = lang || "en";
75819       var url = endpoint.replace("en", lang) + utilQsString({
75820         action: "query",
75821         list: "search",
75822         srlimit: "10",
75823         srinfo: "suggestion",
75824         format: "json",
75825         origin: "*",
75826         srsearch: query
75827       });
75828       json_default(url).then(function(result) {
75829         if (result && result.error) {
75830           throw new Error(result.error);
75831         } else if (!result || !result.query || !result.query.search) {
75832           throw new Error("No Results");
75833         }
75834         if (callback) {
75835           var titles = result.query.search.map(function(d) {
75836             return d.title;
75837           });
75838           callback(null, titles);
75839         }
75840       }).catch(function(err) {
75841         if (callback)
75842           callback(err, []);
75843       });
75844     },
75845     suggestions: function(lang, query, callback) {
75846       if (!query) {
75847         if (callback)
75848           callback("", []);
75849         return;
75850       }
75851       lang = lang || "en";
75852       var url = endpoint.replace("en", lang) + utilQsString({
75853         action: "opensearch",
75854         namespace: 0,
75855         suggest: "",
75856         format: "json",
75857         origin: "*",
75858         search: query
75859       });
75860       json_default(url).then(function(result) {
75861         if (result && result.error) {
75862           throw new Error(result.error);
75863         } else if (!result || result.length < 2) {
75864           throw new Error("No Results");
75865         }
75866         if (callback)
75867           callback(null, result[1] || []);
75868       }).catch(function(err) {
75869         if (callback)
75870           callback(err.message, []);
75871       });
75872     },
75873     translations: function(lang, title, callback) {
75874       if (!title) {
75875         if (callback)
75876           callback("No Title");
75877         return;
75878       }
75879       var url = endpoint.replace("en", lang) + utilQsString({
75880         action: "query",
75881         prop: "langlinks",
75882         format: "json",
75883         origin: "*",
75884         lllimit: 500,
75885         titles: title
75886       });
75887       json_default(url).then(function(result) {
75888         if (result && result.error) {
75889           throw new Error(result.error);
75890         } else if (!result || !result.query || !result.query.pages) {
75891           throw new Error("No Results");
75892         }
75893         if (callback) {
75894           var list = result.query.pages[Object.keys(result.query.pages)[0]];
75895           var translations = {};
75896           if (list && list.langlinks) {
75897             list.langlinks.forEach(function(d) {
75898               translations[d.lang] = d["*"];
75899             });
75900           }
75901           callback(null, translations);
75902         }
75903       }).catch(function(err) {
75904         if (callback)
75905           callback(err.message);
75906       });
75907     }
75908   };
75909
75910   // modules/services/index.js
75911   var services = {
75912     geocoder: nominatim_default,
75913     keepRight: keepRight_default,
75914     improveOSM: improveOSM_default,
75915     osmose: osmose_default,
75916     mapillary: mapillary_default,
75917     nsi: nsi_default,
75918     kartaview: kartaview_default,
75919     osm: osm_default,
75920     osmWikibase: osm_wikibase_default,
75921     maprules: maprules_default,
75922     streetside: streetside_default,
75923     taginfo: taginfo_default,
75924     vectorTile: vector_tile_default,
75925     wikidata: wikidata_default,
75926     wikipedia: wikipedia_default
75927   };
75928
75929   // modules/modes/drag_note.js
75930   function modeDragNote(context) {
75931     var mode = {
75932       id: "drag-note",
75933       button: "browse"
75934     };
75935     var edit2 = behaviorEdit(context);
75936     var _nudgeInterval;
75937     var _lastLoc;
75938     var _note;
75939     function startNudge(d3_event, nudge) {
75940       if (_nudgeInterval)
75941         window.clearInterval(_nudgeInterval);
75942       _nudgeInterval = window.setInterval(function() {
75943         context.map().pan(nudge);
75944         doMove(d3_event, nudge);
75945       }, 50);
75946     }
75947     function stopNudge() {
75948       if (_nudgeInterval) {
75949         window.clearInterval(_nudgeInterval);
75950         _nudgeInterval = null;
75951       }
75952     }
75953     function origin(note) {
75954       return context.projection(note.loc);
75955     }
75956     function start2(d3_event, note) {
75957       _note = note;
75958       var osm = services.osm;
75959       if (osm) {
75960         _note = osm.getNote(_note.id);
75961       }
75962       context.surface().selectAll(".note-" + _note.id).classed("active", true);
75963       context.perform(actionNoop());
75964       context.enter(mode);
75965       context.selectedNoteID(_note.id);
75966     }
75967     function move(d3_event, entity, point2) {
75968       d3_event.stopPropagation();
75969       _lastLoc = context.projection.invert(point2);
75970       doMove(d3_event);
75971       var nudge = geoViewportEdge(point2, context.map().dimensions());
75972       if (nudge) {
75973         startNudge(d3_event, nudge);
75974       } else {
75975         stopNudge();
75976       }
75977     }
75978     function doMove(d3_event, nudge) {
75979       nudge = nudge || [0, 0];
75980       var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
75981       var currMouse = geoVecSubtract(currPoint, nudge);
75982       var loc = context.projection.invert(currMouse);
75983       _note = _note.move(loc);
75984       var osm = services.osm;
75985       if (osm) {
75986         osm.replaceNote(_note);
75987       }
75988       context.replace(actionNoop());
75989     }
75990     function end() {
75991       context.replace(actionNoop());
75992       context.selectedNoteID(_note.id).enter(modeSelectNote(context, _note.id));
75993     }
75994     var drag = behaviorDrag().selector(".layer-touch.markers .target.note.new").surface(context.container().select(".main-map").node()).origin(origin).on("start", start2).on("move", move).on("end", end);
75995     mode.enter = function() {
75996       context.install(edit2);
75997     };
75998     mode.exit = function() {
75999       context.ui().sidebar.hover.cancel();
76000       context.uninstall(edit2);
76001       context.surface().selectAll(".active").classed("active", false);
76002       stopNudge();
76003     };
76004     mode.behavior = drag;
76005     return mode;
76006   }
76007
76008   // modules/modes/select_data.js
76009   function modeSelectData(context, selectedDatum) {
76010     var mode = {
76011       id: "select-data",
76012       button: "browse"
76013     };
76014     var keybinding = utilKeybinding("select-data");
76015     var dataEditor = uiDataEditor(context);
76016     var behaviors = [
76017       behaviorBreathe(context),
76018       behaviorHover(context),
76019       behaviorSelect(context),
76020       behaviorLasso(context),
76021       modeDragNode(context).behavior,
76022       modeDragNote(context).behavior
76023     ];
76024     function selectData(d3_event, drawn) {
76025       var selection2 = context.surface().selectAll(".layer-mapdata .data" + selectedDatum.__featurehash__);
76026       if (selection2.empty()) {
76027         var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
76028         if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
76029           context.enter(modeBrowse(context));
76030         }
76031       } else {
76032         selection2.classed("selected", true);
76033       }
76034     }
76035     function esc() {
76036       if (context.container().select(".combobox").size())
76037         return;
76038       context.enter(modeBrowse(context));
76039     }
76040     mode.zoomToSelected = function() {
76041       var extent = geoExtent(bounds_default(selectedDatum));
76042       context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
76043     };
76044     mode.enter = function() {
76045       behaviors.forEach(context.install);
76046       keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
76047       select_default2(document).call(keybinding);
76048       selectData();
76049       var sidebar = context.ui().sidebar;
76050       sidebar.show(dataEditor.datum(selectedDatum));
76051       var extent = geoExtent(bounds_default(selectedDatum));
76052       sidebar.expand(sidebar.intersects(extent));
76053       context.map().on("drawn.select-data", selectData);
76054     };
76055     mode.exit = function() {
76056       behaviors.forEach(context.uninstall);
76057       select_default2(document).call(keybinding.unbind);
76058       context.surface().selectAll(".layer-mapdata .selected").classed("selected hover", false);
76059       context.map().on("drawn.select-data", null);
76060       context.ui().sidebar.hide();
76061     };
76062     return mode;
76063   }
76064
76065   // modules/behavior/select.js
76066   function behaviorSelect(context) {
76067     var _tolerancePx = 4;
76068     var _lastMouseEvent = null;
76069     var _showMenu = false;
76070     var _downPointers = {};
76071     var _longPressTimeout = null;
76072     var _lastInteractionType = null;
76073     var _multiselectionPointerId = null;
76074     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
76075     function keydown(d3_event) {
76076       if (d3_event.keyCode === 32) {
76077         var activeNode = document.activeElement;
76078         if (activeNode && (/* @__PURE__ */ new Set(["INPUT", "TEXTAREA"])).has(activeNode.nodeName))
76079           return;
76080       }
76081       if (d3_event.keyCode === 93 || // context menu key
76082       d3_event.keyCode === 32) {
76083         d3_event.preventDefault();
76084       }
76085       if (d3_event.repeat)
76086         return;
76087       cancelLongPress();
76088       if (d3_event.shiftKey) {
76089         context.surface().classed("behavior-multiselect", true);
76090       }
76091       if (d3_event.keyCode === 32) {
76092         if (!_downPointers.spacebar && _lastMouseEvent) {
76093           cancelLongPress();
76094           _longPressTimeout = window.setTimeout(didLongPress, 500, "spacebar", "spacebar");
76095           _downPointers.spacebar = {
76096             firstEvent: _lastMouseEvent,
76097             lastEvent: _lastMouseEvent
76098           };
76099         }
76100       }
76101     }
76102     function keyup(d3_event) {
76103       cancelLongPress();
76104       if (!d3_event.shiftKey) {
76105         context.surface().classed("behavior-multiselect", false);
76106       }
76107       if (d3_event.keyCode === 93) {
76108         d3_event.preventDefault();
76109         _lastInteractionType = "menukey";
76110         contextmenu(d3_event);
76111       } else if (d3_event.keyCode === 32) {
76112         var pointer = _downPointers.spacebar;
76113         if (pointer) {
76114           delete _downPointers.spacebar;
76115           if (pointer.done)
76116             return;
76117           d3_event.preventDefault();
76118           _lastInteractionType = "spacebar";
76119           click(pointer.firstEvent, pointer.lastEvent, "spacebar");
76120         }
76121       }
76122     }
76123     function pointerdown(d3_event) {
76124       var id2 = (d3_event.pointerId || "mouse").toString();
76125       cancelLongPress();
76126       if (d3_event.buttons && d3_event.buttons !== 1)
76127         return;
76128       context.ui().closeEditMenu();
76129       if (d3_event.pointerType !== "mouse") {
76130         _longPressTimeout = window.setTimeout(didLongPress, 500, id2, "longdown-" + (d3_event.pointerType || "mouse"));
76131       }
76132       _downPointers[id2] = {
76133         firstEvent: d3_event,
76134         lastEvent: d3_event
76135       };
76136     }
76137     function didLongPress(id2, interactionType) {
76138       var pointer = _downPointers[id2];
76139       if (!pointer)
76140         return;
76141       for (var i2 in _downPointers) {
76142         _downPointers[i2].done = true;
76143       }
76144       _longPressTimeout = null;
76145       _lastInteractionType = interactionType;
76146       _showMenu = true;
76147       click(pointer.firstEvent, pointer.lastEvent, id2);
76148     }
76149     function pointermove(d3_event) {
76150       var id2 = (d3_event.pointerId || "mouse").toString();
76151       if (_downPointers[id2]) {
76152         _downPointers[id2].lastEvent = d3_event;
76153       }
76154       if (!d3_event.pointerType || d3_event.pointerType === "mouse") {
76155         _lastMouseEvent = d3_event;
76156         if (_downPointers.spacebar) {
76157           _downPointers.spacebar.lastEvent = d3_event;
76158         }
76159       }
76160     }
76161     function pointerup(d3_event) {
76162       var id2 = (d3_event.pointerId || "mouse").toString();
76163       var pointer = _downPointers[id2];
76164       if (!pointer)
76165         return;
76166       delete _downPointers[id2];
76167       if (_multiselectionPointerId === id2) {
76168         _multiselectionPointerId = null;
76169       }
76170       if (pointer.done)
76171         return;
76172       click(pointer.firstEvent, d3_event, id2);
76173     }
76174     function pointercancel(d3_event) {
76175       var id2 = (d3_event.pointerId || "mouse").toString();
76176       if (!_downPointers[id2])
76177         return;
76178       delete _downPointers[id2];
76179       if (_multiselectionPointerId === id2) {
76180         _multiselectionPointerId = null;
76181       }
76182     }
76183     function contextmenu(d3_event) {
76184       d3_event.preventDefault();
76185       if (!+d3_event.clientX && !+d3_event.clientY) {
76186         if (_lastMouseEvent) {
76187           d3_event = _lastMouseEvent;
76188         } else {
76189           return;
76190         }
76191       } else {
76192         _lastMouseEvent = d3_event;
76193         _lastInteractionType = "rightclick";
76194       }
76195       _showMenu = true;
76196       click(d3_event, d3_event);
76197     }
76198     function click(firstEvent, lastEvent, pointerId) {
76199       cancelLongPress();
76200       var mapNode = context.container().select(".main-map").node();
76201       var pointGetter = utilFastMouse(mapNode);
76202       var p1 = pointGetter(firstEvent);
76203       var p2 = pointGetter(lastEvent);
76204       var dist = geoVecLength(p1, p2);
76205       if (dist > _tolerancePx || !mapContains(lastEvent)) {
76206         resetProperties();
76207         return;
76208       }
76209       var targetDatum = lastEvent.target.__data__;
76210       var multiselectEntityId;
76211       if (!_multiselectionPointerId) {
76212         var selectPointerInfo = pointerDownOnSelection(pointerId);
76213         if (selectPointerInfo) {
76214           _multiselectionPointerId = selectPointerInfo.pointerId;
76215           multiselectEntityId = !selectPointerInfo.selected && selectPointerInfo.entityId;
76216           _downPointers[selectPointerInfo.pointerId].done = true;
76217         }
76218       }
76219       var isMultiselect = context.mode().id === "select" && // and shift key is down
76220       (lastEvent && lastEvent.shiftKey || // or we're lasso-selecting
76221       context.surface().select(".lasso").node() || // or a pointer is down over a selected feature
76222       _multiselectionPointerId && !multiselectEntityId);
76223       processClick(targetDatum, isMultiselect, p2, multiselectEntityId);
76224       function mapContains(event) {
76225         var rect = mapNode.getBoundingClientRect();
76226         return event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
76227       }
76228       function pointerDownOnSelection(skipPointerId) {
76229         var mode = context.mode();
76230         var selectedIDs = mode.id === "select" ? mode.selectedIDs() : [];
76231         for (var pointerId2 in _downPointers) {
76232           if (pointerId2 === "spacebar" || pointerId2 === skipPointerId)
76233             continue;
76234           var pointerInfo = _downPointers[pointerId2];
76235           var p12 = pointGetter(pointerInfo.firstEvent);
76236           var p22 = pointGetter(pointerInfo.lastEvent);
76237           if (geoVecLength(p12, p22) > _tolerancePx)
76238             continue;
76239           var datum2 = pointerInfo.firstEvent.target.__data__;
76240           var entity = datum2 && datum2.properties && datum2.properties.entity || datum2;
76241           if (context.graph().hasEntity(entity.id)) {
76242             return {
76243               pointerId: pointerId2,
76244               entityId: entity.id,
76245               selected: selectedIDs.indexOf(entity.id) !== -1
76246             };
76247           }
76248         }
76249         return null;
76250       }
76251     }
76252     function processClick(datum2, isMultiselect, point2, alsoSelectId) {
76253       var mode = context.mode();
76254       var showMenu = _showMenu;
76255       var interactionType = _lastInteractionType;
76256       var entity = datum2 && datum2.properties && datum2.properties.entity;
76257       if (entity)
76258         datum2 = entity;
76259       if (datum2 && datum2.type === "midpoint") {
76260         datum2 = datum2.parents[0];
76261       }
76262       var newMode;
76263       if (datum2 instanceof osmEntity) {
76264         var selectedIDs = context.selectedIDs();
76265         context.selectedNoteID(null);
76266         context.selectedErrorID(null);
76267         if (!isMultiselect) {
76268           if (!showMenu || selectedIDs.length <= 1 || selectedIDs.indexOf(datum2.id) === -1) {
76269             if (alsoSelectId === datum2.id)
76270               alsoSelectId = null;
76271             selectedIDs = (alsoSelectId ? [alsoSelectId] : []).concat([datum2.id]);
76272             newMode = mode.id === "select" ? mode.selectedIDs(selectedIDs) : modeSelect(context, selectedIDs).selectBehavior(behavior);
76273             context.enter(newMode);
76274           }
76275         } else {
76276           if (selectedIDs.indexOf(datum2.id) !== -1) {
76277             if (!showMenu) {
76278               selectedIDs = selectedIDs.filter(function(id2) {
76279                 return id2 !== datum2.id;
76280               });
76281               newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context).selectBehavior(behavior);
76282               context.enter(newMode);
76283             }
76284           } else {
76285             selectedIDs = selectedIDs.concat([datum2.id]);
76286             newMode = mode.selectedIDs(selectedIDs);
76287             context.enter(newMode);
76288           }
76289         }
76290       } else if (datum2 && datum2.__featurehash__ && !isMultiselect) {
76291         context.selectedNoteID(null).enter(modeSelectData(context, datum2));
76292       } else if (datum2 instanceof osmNote && !isMultiselect) {
76293         context.selectedNoteID(datum2.id).enter(modeSelectNote(context, datum2.id));
76294       } else if (datum2 instanceof QAItem && !isMultiselect) {
76295         context.selectedErrorID(datum2.id).enter(modeSelectError(context, datum2.id, datum2.service));
76296       } else {
76297         context.selectedNoteID(null);
76298         context.selectedErrorID(null);
76299         if (!isMultiselect && mode.id !== "browse") {
76300           context.enter(modeBrowse(context));
76301         }
76302       }
76303       context.ui().closeEditMenu();
76304       if (showMenu)
76305         context.ui().showEditMenu(point2, interactionType);
76306       resetProperties();
76307     }
76308     function cancelLongPress() {
76309       if (_longPressTimeout)
76310         window.clearTimeout(_longPressTimeout);
76311       _longPressTimeout = null;
76312     }
76313     function resetProperties() {
76314       cancelLongPress();
76315       _showMenu = false;
76316       _lastInteractionType = null;
76317     }
76318     function behavior(selection2) {
76319       resetProperties();
76320       _lastMouseEvent = context.map().lastPointerEvent();
76321       select_default2(window).on("keydown.select", keydown).on("keyup.select", keyup).on(_pointerPrefix + "move.select", pointermove, true).on(_pointerPrefix + "up.select", pointerup, true).on("pointercancel.select", pointercancel, true).on("contextmenu.select-window", function(d3_event) {
76322         var e = d3_event;
76323         if (+e.clientX === 0 && +e.clientY === 0) {
76324           d3_event.preventDefault();
76325         }
76326       });
76327       selection2.on(_pointerPrefix + "down.select", pointerdown).on("contextmenu.select", contextmenu);
76328     }
76329     behavior.off = function(selection2) {
76330       cancelLongPress();
76331       select_default2(window).on("keydown.select", null).on("keyup.select", null).on("contextmenu.select-window", null).on(_pointerPrefix + "move.select", null, true).on(_pointerPrefix + "up.select", null, true).on("pointercancel.select", null, true);
76332       selection2.on(_pointerPrefix + "down.select", null).on("contextmenu.select", null);
76333       context.surface().classed("behavior-multiselect", false);
76334     };
76335     return behavior;
76336   }
76337
76338   // modules/operations/index.js
76339   var operations_exports = {};
76340   __export(operations_exports, {
76341     operationCircularize: () => operationCircularize,
76342     operationContinue: () => operationContinue,
76343     operationCopy: () => operationCopy,
76344     operationDelete: () => operationDelete,
76345     operationDisconnect: () => operationDisconnect,
76346     operationDowngrade: () => operationDowngrade,
76347     operationExtract: () => operationExtract,
76348     operationMerge: () => operationMerge,
76349     operationMove: () => operationMove,
76350     operationOrthogonalize: () => operationOrthogonalize,
76351     operationPaste: () => operationPaste,
76352     operationReflectLong: () => operationReflectLong,
76353     operationReflectShort: () => operationReflectShort,
76354     operationReverse: () => operationReverse,
76355     operationRotate: () => operationRotate,
76356     operationSplit: () => operationSplit,
76357     operationStraighten: () => operationStraighten
76358   });
76359
76360   // modules/operations/continue.js
76361   function operationContinue(context, selectedIDs) {
76362     var _entities = selectedIDs.map(function(id2) {
76363       return context.graph().entity(id2);
76364     });
76365     var _geometries = Object.assign(
76366       { line: [], vertex: [] },
76367       utilArrayGroupBy(_entities, function(entity) {
76368         return entity.geometry(context.graph());
76369       })
76370     );
76371     var _vertex = _geometries.vertex.length && _geometries.vertex[0];
76372     function candidateWays() {
76373       return _vertex ? context.graph().parentWays(_vertex).filter(function(parent) {
76374         return parent.geometry(context.graph()) === "line" && !parent.isClosed() && parent.affix(_vertex.id) && (_geometries.line.length === 0 || _geometries.line[0] === parent);
76375       }) : [];
76376     }
76377     var _candidates = candidateWays();
76378     var operation = function() {
76379       var candidate = _candidates[0];
76380       context.enter(
76381         modeDrawLine(context, candidate.id, context.graph(), "line", candidate.affix(_vertex.id), true)
76382       );
76383     };
76384     operation.relatedEntityIds = function() {
76385       return _candidates.length ? [_candidates[0].id] : [];
76386     };
76387     operation.available = function() {
76388       return _geometries.vertex.length === 1 && _geometries.line.length <= 1 && !context.features().hasHiddenConnections(_vertex, context.graph());
76389     };
76390     operation.disabled = function() {
76391       if (_candidates.length === 0) {
76392         return "not_eligible";
76393       } else if (_candidates.length > 1) {
76394         return "multiple";
76395       }
76396       return false;
76397     };
76398     operation.tooltip = function() {
76399       var disable = operation.disabled();
76400       return disable ? _t.append("operations.continue." + disable) : _t.append("operations.continue.description");
76401     };
76402     operation.annotation = function() {
76403       return _t("operations.continue.annotation.line");
76404     };
76405     operation.id = "continue";
76406     operation.keys = [_t("operations.continue.key")];
76407     operation.title = _t.append("operations.continue.title");
76408     operation.behavior = behaviorOperation(context).which(operation);
76409     return operation;
76410   }
76411
76412   // modules/operations/copy.js
76413   function operationCopy(context, selectedIDs) {
76414     function getFilteredIdsToCopy() {
76415       return selectedIDs.filter(function(selectedID) {
76416         var entity = context.graph().hasEntity(selectedID);
76417         return entity.hasInterestingTags() || entity.geometry(context.graph()) !== "vertex";
76418       });
76419     }
76420     var operation = function() {
76421       var graph = context.graph();
76422       var selected = groupEntities(getFilteredIdsToCopy(), graph);
76423       var canCopy = [];
76424       var skip = {};
76425       var entity;
76426       var i2;
76427       for (i2 = 0; i2 < selected.relation.length; i2++) {
76428         entity = selected.relation[i2];
76429         if (!skip[entity.id] && entity.isComplete(graph)) {
76430           canCopy.push(entity.id);
76431           skip = getDescendants(entity.id, graph, skip);
76432         }
76433       }
76434       for (i2 = 0; i2 < selected.way.length; i2++) {
76435         entity = selected.way[i2];
76436         if (!skip[entity.id]) {
76437           canCopy.push(entity.id);
76438           skip = getDescendants(entity.id, graph, skip);
76439         }
76440       }
76441       for (i2 = 0; i2 < selected.node.length; i2++) {
76442         entity = selected.node[i2];
76443         if (!skip[entity.id]) {
76444           canCopy.push(entity.id);
76445         }
76446       }
76447       context.copyIDs(canCopy);
76448       if (_point && (canCopy.length !== 1 || graph.entity(canCopy[0]).type !== "node")) {
76449         context.copyLonLat(context.projection.invert(_point));
76450       } else {
76451         context.copyLonLat(null);
76452       }
76453     };
76454     function groupEntities(ids, graph) {
76455       var entities = ids.map(function(id2) {
76456         return graph.entity(id2);
76457       });
76458       return Object.assign(
76459         { relation: [], way: [], node: [] },
76460         utilArrayGroupBy(entities, "type")
76461       );
76462     }
76463     function getDescendants(id2, graph, descendants) {
76464       var entity = graph.entity(id2);
76465       var children2;
76466       descendants = descendants || {};
76467       if (entity.type === "relation") {
76468         children2 = entity.members.map(function(m) {
76469           return m.id;
76470         });
76471       } else if (entity.type === "way") {
76472         children2 = entity.nodes;
76473       } else {
76474         children2 = [];
76475       }
76476       for (var i2 = 0; i2 < children2.length; i2++) {
76477         if (!descendants[children2[i2]]) {
76478           descendants[children2[i2]] = true;
76479           descendants = getDescendants(children2[i2], graph, descendants);
76480         }
76481       }
76482       return descendants;
76483     }
76484     operation.available = function() {
76485       return getFilteredIdsToCopy().length > 0;
76486     };
76487     operation.disabled = function() {
76488       var extent = utilTotalExtent(getFilteredIdsToCopy(), context.graph());
76489       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
76490         return "too_large";
76491       }
76492       return false;
76493     };
76494     operation.availableForKeypress = function() {
76495       var selection2 = window.getSelection && window.getSelection();
76496       return !selection2 || !selection2.toString();
76497     };
76498     operation.tooltip = function() {
76499       var disable = operation.disabled();
76500       return disable ? _t.append("operations.copy." + disable, { n: selectedIDs.length }) : _t.append("operations.copy.description", { n: selectedIDs.length });
76501     };
76502     operation.annotation = function() {
76503       return _t("operations.copy.annotation", { n: selectedIDs.length });
76504     };
76505     var _point;
76506     operation.point = function(val) {
76507       _point = val;
76508       return operation;
76509     };
76510     operation.id = "copy";
76511     operation.keys = [uiCmd("\u2318C")];
76512     operation.title = _t.append("operations.copy.title");
76513     operation.behavior = behaviorOperation(context).which(operation);
76514     return operation;
76515   }
76516
76517   // modules/operations/disconnect.js
76518   function operationDisconnect(context, selectedIDs) {
76519     var _vertexIDs = [];
76520     var _wayIDs = [];
76521     var _otherIDs = [];
76522     var _actions = [];
76523     selectedIDs.forEach(function(id2) {
76524       var entity = context.entity(id2);
76525       if (entity.type === "way") {
76526         _wayIDs.push(id2);
76527       } else if (entity.geometry(context.graph()) === "vertex") {
76528         _vertexIDs.push(id2);
76529       } else {
76530         _otherIDs.push(id2);
76531       }
76532     });
76533     var _coords, _descriptionID = "", _annotationID = "features";
76534     var _disconnectingVertexIds = [];
76535     var _disconnectingWayIds = [];
76536     if (_vertexIDs.length > 0) {
76537       _disconnectingVertexIds = _vertexIDs;
76538       _vertexIDs.forEach(function(vertexID) {
76539         var action = actionDisconnect(vertexID);
76540         if (_wayIDs.length > 0) {
76541           var waysIDsForVertex = _wayIDs.filter(function(wayID) {
76542             var way = context.entity(wayID);
76543             return way.nodes.indexOf(vertexID) !== -1;
76544           });
76545           action.limitWays(waysIDsForVertex);
76546         }
76547         _actions.push(action);
76548         _disconnectingWayIds = _disconnectingWayIds.concat(context.graph().parentWays(context.graph().entity(vertexID)).map((d) => d.id));
76549       });
76550       _disconnectingWayIds = utilArrayUniq(_disconnectingWayIds).filter(function(id2) {
76551         return _wayIDs.indexOf(id2) === -1;
76552       });
76553       _descriptionID += _actions.length === 1 ? "single_point." : "multiple_points.";
76554       if (_wayIDs.length === 1) {
76555         _descriptionID += "single_way." + context.graph().geometry(_wayIDs[0]);
76556       } else {
76557         _descriptionID += _wayIDs.length === 0 ? "no_ways" : "multiple_ways";
76558       }
76559     } else if (_wayIDs.length > 0) {
76560       var ways = _wayIDs.map(function(id2) {
76561         return context.entity(id2);
76562       });
76563       var nodes = utilGetAllNodes(_wayIDs, context.graph());
76564       _coords = nodes.map(function(n2) {
76565         return n2.loc;
76566       });
76567       var sharedActions = [];
76568       var sharedNodes = [];
76569       var unsharedActions = [];
76570       var unsharedNodes = [];
76571       nodes.forEach(function(node) {
76572         var action = actionDisconnect(node.id).limitWays(_wayIDs);
76573         if (action.disabled(context.graph()) !== "not_connected") {
76574           var count = 0;
76575           for (var i2 in ways) {
76576             var way = ways[i2];
76577             if (way.nodes.indexOf(node.id) !== -1) {
76578               count += 1;
76579             }
76580             if (count > 1)
76581               break;
76582           }
76583           if (count > 1) {
76584             sharedActions.push(action);
76585             sharedNodes.push(node);
76586           } else {
76587             unsharedActions.push(action);
76588             unsharedNodes.push(node);
76589           }
76590         }
76591       });
76592       _descriptionID += "no_points.";
76593       _descriptionID += _wayIDs.length === 1 ? "single_way." : "multiple_ways.";
76594       if (sharedActions.length) {
76595         _actions = sharedActions;
76596         _disconnectingVertexIds = sharedNodes.map((node) => node.id);
76597         _descriptionID += "conjoined";
76598         _annotationID = "from_each_other";
76599       } else {
76600         _actions = unsharedActions;
76601         _disconnectingVertexIds = unsharedNodes.map((node) => node.id);
76602         if (_wayIDs.length === 1) {
76603           _descriptionID += context.graph().geometry(_wayIDs[0]);
76604         } else {
76605           _descriptionID += "separate";
76606         }
76607       }
76608     }
76609     var _extent = utilTotalExtent(_disconnectingVertexIds, context.graph());
76610     var operation = function() {
76611       context.perform(function(graph) {
76612         return _actions.reduce(function(graph2, action) {
76613           return action(graph2);
76614         }, graph);
76615       }, operation.annotation());
76616       context.validator().validate();
76617     };
76618     operation.relatedEntityIds = function() {
76619       if (_vertexIDs.length) {
76620         return _disconnectingWayIds;
76621       }
76622       return _disconnectingVertexIds;
76623     };
76624     operation.available = function() {
76625       if (_actions.length === 0)
76626         return false;
76627       if (_otherIDs.length !== 0)
76628         return false;
76629       if (_vertexIDs.length !== 0 && _wayIDs.length !== 0 && !_wayIDs.every(function(wayID) {
76630         return _vertexIDs.some(function(vertexID) {
76631           var way = context.entity(wayID);
76632           return way.nodes.indexOf(vertexID) !== -1;
76633         });
76634       }))
76635         return false;
76636       return true;
76637     };
76638     operation.disabled = function() {
76639       var reason;
76640       for (var actionIndex in _actions) {
76641         reason = _actions[actionIndex].disabled(context.graph());
76642         if (reason)
76643           return reason;
76644       }
76645       if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
76646         return "too_large." + ((_vertexIDs.length ? _vertexIDs : _wayIDs).length === 1 ? "single" : "multiple");
76647       } else if (_coords && someMissing()) {
76648         return "not_downloaded";
76649       } else if (selectedIDs.some(context.hasHiddenConnections)) {
76650         return "connected_to_hidden";
76651       }
76652       return false;
76653       function someMissing() {
76654         if (context.inIntro())
76655           return false;
76656         var osm = context.connection();
76657         if (osm) {
76658           var missing = _coords.filter(function(loc) {
76659             return !osm.isDataLoaded(loc);
76660           });
76661           if (missing.length) {
76662             missing.forEach(function(loc) {
76663               context.loadTileAtLoc(loc);
76664             });
76665             return true;
76666           }
76667         }
76668         return false;
76669       }
76670     };
76671     operation.tooltip = function() {
76672       var disable = operation.disabled();
76673       return disable ? _t.append("operations.disconnect." + disable) : _t.append("operations.disconnect.description." + _descriptionID);
76674     };
76675     operation.annotation = function() {
76676       return _t("operations.disconnect.annotation." + _annotationID);
76677     };
76678     operation.id = "disconnect";
76679     operation.keys = [_t("operations.disconnect.key")];
76680     operation.title = _t.append("operations.disconnect.title");
76681     operation.behavior = behaviorOperation(context).which(operation);
76682     return operation;
76683   }
76684
76685   // modules/operations/downgrade.js
76686   function operationDowngrade(context, selectedIDs) {
76687     var _affectedFeatureCount = 0;
76688     var _downgradeType = downgradeTypeForEntityIDs(selectedIDs);
76689     var _multi = _affectedFeatureCount === 1 ? "single" : "multiple";
76690     function downgradeTypeForEntityIDs(entityIds) {
76691       var downgradeType;
76692       _affectedFeatureCount = 0;
76693       for (var i2 in entityIds) {
76694         var entityID = entityIds[i2];
76695         var type2 = downgradeTypeForEntityID(entityID);
76696         if (type2) {
76697           _affectedFeatureCount += 1;
76698           if (downgradeType && type2 !== downgradeType) {
76699             if (downgradeType !== "generic" && type2 !== "generic") {
76700               downgradeType = "building_address";
76701             } else {
76702               downgradeType = "generic";
76703             }
76704           } else {
76705             downgradeType = type2;
76706           }
76707         }
76708       }
76709       return downgradeType;
76710     }
76711     function downgradeTypeForEntityID(entityID) {
76712       var graph = context.graph();
76713       var entity = graph.entity(entityID);
76714       var preset = _mainPresetIndex.match(entity, graph);
76715       if (!preset || preset.isFallback())
76716         return null;
76717       if (entity.type === "node" && preset.id !== "address" && Object.keys(entity.tags).some(function(key) {
76718         return key.match(/^addr:.{1,}/);
76719       })) {
76720         return "address";
76721       }
76722       var geometry = entity.geometry(graph);
76723       if (geometry === "area" && entity.tags.building && !preset.tags.building) {
76724         return "building";
76725       }
76726       if (geometry === "vertex" && Object.keys(entity.tags).length) {
76727         return "generic";
76728       }
76729       return null;
76730     }
76731     var buildingKeysToKeep = ["architect", "building", "height", "layer", "source", "type", "wheelchair"];
76732     var addressKeysToKeep = ["source"];
76733     var operation = function() {
76734       context.perform(function(graph) {
76735         for (var i2 in selectedIDs) {
76736           var entityID = selectedIDs[i2];
76737           var type2 = downgradeTypeForEntityID(entityID);
76738           if (!type2)
76739             continue;
76740           var tags = Object.assign({}, graph.entity(entityID).tags);
76741           for (var key in tags) {
76742             if (type2 === "address" && addressKeysToKeep.indexOf(key) !== -1)
76743               continue;
76744             if (type2 === "building") {
76745               if (buildingKeysToKeep.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/))
76746                 continue;
76747             }
76748             if (type2 !== "generic") {
76749               if (key.match(/^addr:.{1,}/) || key.match(/^source:.{1,}/))
76750                 continue;
76751             }
76752             delete tags[key];
76753           }
76754           graph = actionChangeTags(entityID, tags)(graph);
76755         }
76756         return graph;
76757       }, operation.annotation());
76758       context.validator().validate();
76759       context.enter(modeSelect(context, selectedIDs));
76760     };
76761     operation.available = function() {
76762       return _downgradeType;
76763     };
76764     operation.disabled = function() {
76765       if (selectedIDs.some(hasWikidataTag)) {
76766         return "has_wikidata_tag";
76767       }
76768       return false;
76769       function hasWikidataTag(id2) {
76770         var entity = context.entity(id2);
76771         return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
76772       }
76773     };
76774     operation.tooltip = function() {
76775       var disable = operation.disabled();
76776       return disable ? _t.append("operations.downgrade." + disable + "." + _multi) : _t.append("operations.downgrade.description." + _downgradeType);
76777     };
76778     operation.annotation = function() {
76779       var suffix;
76780       if (_downgradeType === "building_address") {
76781         suffix = "generic";
76782       } else {
76783         suffix = _downgradeType;
76784       }
76785       return _t("operations.downgrade.annotation." + suffix, { n: _affectedFeatureCount });
76786     };
76787     operation.id = "downgrade";
76788     operation.keys = [uiCmd("\u232B")];
76789     operation.title = _t.append("operations.downgrade.title");
76790     operation.behavior = behaviorOperation(context).which(operation);
76791     return operation;
76792   }
76793
76794   // modules/operations/extract.js
76795   function operationExtract(context, selectedIDs) {
76796     var _amount = selectedIDs.length === 1 ? "single" : "multiple";
76797     var _geometries = utilArrayUniq(selectedIDs.map(function(entityID) {
76798       return context.graph().hasEntity(entityID) && context.graph().geometry(entityID);
76799     }).filter(Boolean));
76800     var _geometryID = _geometries.length === 1 ? _geometries[0] : "feature";
76801     var _extent;
76802     var _actions = selectedIDs.map(function(entityID) {
76803       var graph = context.graph();
76804       var entity = graph.hasEntity(entityID);
76805       if (!entity || !entity.hasInterestingTags())
76806         return null;
76807       if (entity.type === "node" && graph.parentWays(entity).length === 0)
76808         return null;
76809       if (entity.type !== "node") {
76810         var preset = _mainPresetIndex.match(entity, graph);
76811         if (preset.geometry.indexOf("point") === -1)
76812           return null;
76813       }
76814       _extent = _extent ? _extent.extend(entity.extent(graph)) : entity.extent(graph);
76815       return actionExtract(entityID, context.projection);
76816     }).filter(Boolean);
76817     var operation = function() {
76818       var combinedAction = function(graph) {
76819         _actions.forEach(function(action) {
76820           graph = action(graph);
76821         });
76822         return graph;
76823       };
76824       context.perform(combinedAction, operation.annotation());
76825       var extractedNodeIDs = _actions.map(function(action) {
76826         return action.getExtractedNodeID();
76827       });
76828       context.enter(modeSelect(context, extractedNodeIDs));
76829     };
76830     operation.available = function() {
76831       return _actions.length && selectedIDs.length === _actions.length;
76832     };
76833     operation.disabled = function() {
76834       if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
76835         return "too_large";
76836       } else if (selectedIDs.some(function(entityID) {
76837         return context.graph().geometry(entityID) === "vertex" && context.hasHiddenConnections(entityID);
76838       })) {
76839         return "connected_to_hidden";
76840       }
76841       return false;
76842     };
76843     operation.tooltip = function() {
76844       var disableReason = operation.disabled();
76845       if (disableReason) {
76846         return _t.append("operations.extract." + disableReason + "." + _amount);
76847       } else {
76848         return _t.append("operations.extract.description." + _geometryID + "." + _amount);
76849       }
76850     };
76851     operation.annotation = function() {
76852       return _t("operations.extract.annotation", { n: selectedIDs.length });
76853     };
76854     operation.id = "extract";
76855     operation.keys = [_t("operations.extract.key")];
76856     operation.title = _t.append("operations.extract.title");
76857     operation.behavior = behaviorOperation(context).which(operation);
76858     return operation;
76859   }
76860
76861   // modules/operations/merge.js
76862   function operationMerge(context, selectedIDs) {
76863     var _action = getAction();
76864     function getAction() {
76865       var join = actionJoin(selectedIDs);
76866       if (!join.disabled(context.graph()))
76867         return join;
76868       var merge3 = actionMerge(selectedIDs);
76869       if (!merge3.disabled(context.graph()))
76870         return merge3;
76871       var mergePolygon = actionMergePolygon(selectedIDs);
76872       if (!mergePolygon.disabled(context.graph()))
76873         return mergePolygon;
76874       var mergeNodes = actionMergeNodes(selectedIDs);
76875       if (!mergeNodes.disabled(context.graph()))
76876         return mergeNodes;
76877       if (join.disabled(context.graph()) !== "not_eligible")
76878         return join;
76879       if (merge3.disabled(context.graph()) !== "not_eligible")
76880         return merge3;
76881       if (mergePolygon.disabled(context.graph()) !== "not_eligible")
76882         return mergePolygon;
76883       return mergeNodes;
76884     }
76885     var operation = function() {
76886       if (operation.disabled())
76887         return;
76888       context.perform(_action, operation.annotation());
76889       context.validator().validate();
76890       var resultIDs = selectedIDs.filter(context.hasEntity);
76891       if (resultIDs.length > 1) {
76892         var interestingIDs = resultIDs.filter(function(id2) {
76893           return context.entity(id2).hasInterestingTags();
76894         });
76895         if (interestingIDs.length)
76896           resultIDs = interestingIDs;
76897       }
76898       context.enter(modeSelect(context, resultIDs));
76899     };
76900     operation.available = function() {
76901       return selectedIDs.length >= 2;
76902     };
76903     operation.disabled = function() {
76904       var actionDisabled = _action.disabled(context.graph());
76905       if (actionDisabled)
76906         return actionDisabled;
76907       var osm = context.connection();
76908       if (osm && _action.resultingWayNodesLength && _action.resultingWayNodesLength(context.graph()) > osm.maxWayNodes()) {
76909         return "too_many_vertices";
76910       }
76911       return false;
76912     };
76913     operation.tooltip = function() {
76914       var disabled = operation.disabled();
76915       if (disabled) {
76916         if (disabled === "conflicting_relations") {
76917           return _t.append("operations.merge.conflicting_relations");
76918         }
76919         if (disabled === "restriction" || disabled === "connectivity") {
76920           return _t.append(
76921             "operations.merge.damage_relation",
76922             { relation: _mainPresetIndex.item("type/" + disabled).name() }
76923           );
76924         }
76925         return _t.append("operations.merge." + disabled);
76926       }
76927       return _t.append("operations.merge.description");
76928     };
76929     operation.annotation = function() {
76930       return _t("operations.merge.annotation", { n: selectedIDs.length });
76931     };
76932     operation.id = "merge";
76933     operation.keys = [_t("operations.merge.key")];
76934     operation.title = _t.append("operations.merge.title");
76935     operation.behavior = behaviorOperation(context).which(operation);
76936     return operation;
76937   }
76938
76939   // modules/operations/paste.js
76940   function operationPaste(context) {
76941     var _pastePoint;
76942     var operation = function() {
76943       if (!_pastePoint)
76944         return;
76945       var oldIDs = context.copyIDs();
76946       if (!oldIDs.length)
76947         return;
76948       var projection2 = context.projection;
76949       var extent = geoExtent();
76950       var oldGraph = context.copyGraph();
76951       var newIDs = [];
76952       var action = actionCopyEntities(oldIDs, oldGraph);
76953       context.perform(action);
76954       var copies = action.copies();
76955       var originals = /* @__PURE__ */ new Set();
76956       Object.values(copies).forEach(function(entity) {
76957         originals.add(entity.id);
76958       });
76959       for (var id2 in copies) {
76960         var oldEntity = oldGraph.entity(id2);
76961         var newEntity = copies[id2];
76962         extent._extend(oldEntity.extent(oldGraph));
76963         var parents = context.graph().parentWays(newEntity);
76964         var parentCopied = parents.some(function(parent) {
76965           return originals.has(parent.id);
76966         });
76967         if (!parentCopied) {
76968           newIDs.push(newEntity.id);
76969         }
76970       }
76971       var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center());
76972       var delta = geoVecSubtract(_pastePoint, copyPoint);
76973       context.replace(actionMove(newIDs, delta, projection2), operation.annotation());
76974       context.enter(modeSelect(context, newIDs));
76975     };
76976     operation.point = function(val) {
76977       _pastePoint = val;
76978       return operation;
76979     };
76980     operation.available = function() {
76981       return context.mode().id === "browse";
76982     };
76983     operation.disabled = function() {
76984       return !context.copyIDs().length;
76985     };
76986     operation.tooltip = function() {
76987       var oldGraph = context.copyGraph();
76988       var ids = context.copyIDs();
76989       if (!ids.length) {
76990         return _t.append("operations.paste.nothing_copied");
76991       }
76992       return _t.append("operations.paste.description", { feature: utilDisplayLabel(oldGraph.entity(ids[0]), oldGraph), n: ids.length });
76993     };
76994     operation.annotation = function() {
76995       var ids = context.copyIDs();
76996       return _t("operations.paste.annotation", { n: ids.length });
76997     };
76998     operation.id = "paste";
76999     operation.keys = [uiCmd("\u2318V")];
77000     operation.title = _t.append("operations.paste.title");
77001     return operation;
77002   }
77003
77004   // modules/operations/reverse.js
77005   function operationReverse(context, selectedIDs) {
77006     var operation = function() {
77007       context.perform(function combinedReverseAction(graph) {
77008         actions().forEach(function(action) {
77009           graph = action(graph);
77010         });
77011         return graph;
77012       }, operation.annotation());
77013       context.validator().validate();
77014     };
77015     function actions(situation) {
77016       return selectedIDs.map(function(entityID) {
77017         var entity = context.hasEntity(entityID);
77018         if (!entity)
77019           return null;
77020         if (situation === "toolbar") {
77021           if (entity.type === "way" && (!entity.isOneWay() && !entity.isSided()))
77022             return null;
77023         }
77024         var geometry = entity.geometry(context.graph());
77025         if (entity.type !== "node" && geometry !== "line")
77026           return null;
77027         var action = actionReverse(entityID);
77028         if (action.disabled(context.graph()))
77029           return null;
77030         return action;
77031       }).filter(Boolean);
77032     }
77033     function reverseTypeID() {
77034       var acts = actions();
77035       var nodeActionCount = acts.filter(function(act) {
77036         var entity = context.hasEntity(act.entityID());
77037         return entity && entity.type === "node";
77038       }).length;
77039       if (nodeActionCount === 0)
77040         return "line";
77041       if (nodeActionCount === acts.length)
77042         return "point";
77043       return "feature";
77044     }
77045     operation.available = function(situation) {
77046       return actions(situation).length > 0;
77047     };
77048     operation.disabled = function() {
77049       return false;
77050     };
77051     operation.tooltip = function() {
77052       return _t.append("operations.reverse.description." + reverseTypeID());
77053     };
77054     operation.annotation = function() {
77055       var acts = actions();
77056       return _t("operations.reverse.annotation." + reverseTypeID(), { n: acts.length });
77057     };
77058     operation.id = "reverse";
77059     operation.keys = [_t("operations.reverse.key")];
77060     operation.title = _t.append("operations.reverse.title");
77061     operation.behavior = behaviorOperation(context).which(operation);
77062     return operation;
77063   }
77064
77065   // modules/operations/split.js
77066   function operationSplit(context, selectedIDs) {
77067     var _vertexIds = selectedIDs.filter(function(id2) {
77068       return context.graph().geometry(id2) === "vertex";
77069     });
77070     var _selectedWayIds = selectedIDs.filter(function(id2) {
77071       var entity = context.graph().hasEntity(id2);
77072       return entity && entity.type === "way";
77073     });
77074     var _isAvailable = _vertexIds.length > 0 && _vertexIds.length + _selectedWayIds.length === selectedIDs.length;
77075     var _action = actionSplit(_vertexIds);
77076     var _ways = [];
77077     var _geometry = "feature";
77078     var _waysAmount = "single";
77079     var _nodesAmount = _vertexIds.length === 1 ? "single" : "multiple";
77080     if (_isAvailable) {
77081       if (_selectedWayIds.length)
77082         _action.limitWays(_selectedWayIds);
77083       _ways = _action.ways(context.graph());
77084       var geometries = {};
77085       _ways.forEach(function(way) {
77086         geometries[way.geometry(context.graph())] = true;
77087       });
77088       if (Object.keys(geometries).length === 1) {
77089         _geometry = Object.keys(geometries)[0];
77090       }
77091       _waysAmount = _ways.length === 1 ? "single" : "multiple";
77092     }
77093     var operation = function() {
77094       var difference = context.perform(_action, operation.annotation());
77095       var idsToSelect = _vertexIds.concat(difference.extantIDs().filter(function(id2) {
77096         return context.entity(id2).type === "way";
77097       }));
77098       context.enter(modeSelect(context, idsToSelect));
77099     };
77100     operation.relatedEntityIds = function() {
77101       return _selectedWayIds.length ? [] : _ways.map((way) => way.id);
77102     };
77103     operation.available = function() {
77104       return _isAvailable;
77105     };
77106     operation.disabled = function() {
77107       var reason = _action.disabled(context.graph());
77108       if (reason) {
77109         return reason;
77110       } else if (selectedIDs.some(context.hasHiddenConnections)) {
77111         return "connected_to_hidden";
77112       }
77113       return false;
77114     };
77115     operation.tooltip = function() {
77116       var disable = operation.disabled();
77117       return disable ? _t.append("operations.split." + disable) : _t.append("operations.split.description." + _geometry + "." + _waysAmount + "." + _nodesAmount + "_node");
77118     };
77119     operation.annotation = function() {
77120       return _t("operations.split.annotation." + _geometry, { n: _ways.length });
77121     };
77122     operation.icon = function() {
77123       if (_waysAmount === "multiple") {
77124         return "#iD-operation-split-multiple";
77125       } else {
77126         return "#iD-operation-split";
77127       }
77128     };
77129     operation.id = "split";
77130     operation.keys = [_t("operations.split.key")];
77131     operation.title = _t.append("operations.split.title");
77132     operation.behavior = behaviorOperation(context).which(operation);
77133     return operation;
77134   }
77135
77136   // modules/operations/straighten.js
77137   function operationStraighten(context, selectedIDs) {
77138     var _wayIDs = selectedIDs.filter(function(id2) {
77139       return id2.charAt(0) === "w";
77140     });
77141     var _nodeIDs = selectedIDs.filter(function(id2) {
77142       return id2.charAt(0) === "n";
77143     });
77144     var _amount = (_wayIDs.length ? _wayIDs : _nodeIDs).length === 1 ? "single" : "multiple";
77145     var _nodes = utilGetAllNodes(selectedIDs, context.graph());
77146     var _coords = _nodes.map(function(n2) {
77147       return n2.loc;
77148     });
77149     var _extent = utilTotalExtent(selectedIDs, context.graph());
77150     var _action = chooseAction();
77151     var _geometry;
77152     function chooseAction() {
77153       if (_wayIDs.length === 0 && _nodeIDs.length > 2) {
77154         _geometry = "point";
77155         return actionStraightenNodes(_nodeIDs, context.projection);
77156       } else if (_wayIDs.length > 0 && (_nodeIDs.length === 0 || _nodeIDs.length === 2)) {
77157         var startNodeIDs = [];
77158         var endNodeIDs = [];
77159         for (var i2 = 0; i2 < selectedIDs.length; i2++) {
77160           var entity = context.entity(selectedIDs[i2]);
77161           if (entity.type === "node") {
77162             continue;
77163           } else if (entity.type !== "way" || entity.isClosed()) {
77164             return null;
77165           }
77166           startNodeIDs.push(entity.first());
77167           endNodeIDs.push(entity.last());
77168         }
77169         startNodeIDs = startNodeIDs.filter(function(n2) {
77170           return startNodeIDs.indexOf(n2) === startNodeIDs.lastIndexOf(n2);
77171         });
77172         endNodeIDs = endNodeIDs.filter(function(n2) {
77173           return endNodeIDs.indexOf(n2) === endNodeIDs.lastIndexOf(n2);
77174         });
77175         if (utilArrayDifference(startNodeIDs, endNodeIDs).length + utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2)
77176           return null;
77177         var wayNodeIDs = utilGetAllNodes(_wayIDs, context.graph()).map(function(node) {
77178           return node.id;
77179         });
77180         if (wayNodeIDs.length <= 2)
77181           return null;
77182         if (_nodeIDs.length === 2 && (wayNodeIDs.indexOf(_nodeIDs[0]) === -1 || wayNodeIDs.indexOf(_nodeIDs[1]) === -1))
77183           return null;
77184         if (_nodeIDs.length) {
77185           _extent = utilTotalExtent(_nodeIDs, context.graph());
77186         }
77187         _geometry = "line";
77188         return actionStraightenWay(selectedIDs, context.projection);
77189       }
77190       return null;
77191     }
77192     function operation() {
77193       if (!_action)
77194         return;
77195       context.perform(_action, operation.annotation());
77196       window.setTimeout(function() {
77197         context.validator().validate();
77198       }, 300);
77199     }
77200     operation.available = function() {
77201       return Boolean(_action);
77202     };
77203     operation.disabled = function() {
77204       var reason = _action.disabled(context.graph());
77205       if (reason) {
77206         return reason;
77207       } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
77208         return "too_large";
77209       } else if (someMissing()) {
77210         return "not_downloaded";
77211       } else if (selectedIDs.some(context.hasHiddenConnections)) {
77212         return "connected_to_hidden";
77213       }
77214       return false;
77215       function someMissing() {
77216         if (context.inIntro())
77217           return false;
77218         var osm = context.connection();
77219         if (osm) {
77220           var missing = _coords.filter(function(loc) {
77221             return !osm.isDataLoaded(loc);
77222           });
77223           if (missing.length) {
77224             missing.forEach(function(loc) {
77225               context.loadTileAtLoc(loc);
77226             });
77227             return true;
77228           }
77229         }
77230         return false;
77231       }
77232     };
77233     operation.tooltip = function() {
77234       var disable = operation.disabled();
77235       return disable ? _t.append("operations.straighten." + disable + "." + _amount) : _t.append("operations.straighten.description." + _geometry + (_wayIDs.length === 1 ? "" : "s"));
77236     };
77237     operation.annotation = function() {
77238       return _t("operations.straighten.annotation." + _geometry, { n: _wayIDs.length ? _wayIDs.length : _nodeIDs.length });
77239     };
77240     operation.id = "straighten";
77241     operation.keys = [_t("operations.straighten.key")];
77242     operation.title = _t.append("operations.straighten.title");
77243     operation.behavior = behaviorOperation(context).which(operation);
77244     return operation;
77245   }
77246
77247   // modules/modes/select.js
77248   function modeSelect(context, selectedIDs) {
77249     var mode = {
77250       id: "select",
77251       button: "browse"
77252     };
77253     var keybinding = utilKeybinding("select");
77254     var _breatheBehavior = behaviorBreathe(context);
77255     var _modeDragNode = modeDragNode(context);
77256     var _selectBehavior;
77257     var _behaviors = [];
77258     var _operations = [];
77259     var _newFeature = false;
77260     var _follow = false;
77261     var _focusedParentWayId;
77262     var _focusedVertexIds;
77263     function singular() {
77264       if (selectedIDs && selectedIDs.length === 1) {
77265         return context.hasEntity(selectedIDs[0]);
77266       }
77267     }
77268     function selectedEntities() {
77269       return selectedIDs.map(function(id2) {
77270         return context.hasEntity(id2);
77271       }).filter(Boolean);
77272     }
77273     function checkSelectedIDs() {
77274       var ids = [];
77275       if (Array.isArray(selectedIDs)) {
77276         ids = selectedIDs.filter(function(id2) {
77277           return context.hasEntity(id2);
77278         });
77279       }
77280       if (!ids.length) {
77281         context.enter(modeBrowse(context));
77282         return false;
77283       } else if (selectedIDs.length > 1 && ids.length === 1 || selectedIDs.length === 1 && ids.length > 1) {
77284         context.enter(modeSelect(context, ids));
77285         return false;
77286       }
77287       selectedIDs = ids;
77288       return true;
77289     }
77290     function parentWaysIdsOfSelection(onlyCommonParents) {
77291       var graph = context.graph();
77292       var parents = [];
77293       for (var i2 = 0; i2 < selectedIDs.length; i2++) {
77294         var entity = context.hasEntity(selectedIDs[i2]);
77295         if (!entity || entity.geometry(graph) !== "vertex") {
77296           return [];
77297         }
77298         var currParents = graph.parentWays(entity).map(function(w) {
77299           return w.id;
77300         });
77301         if (!parents.length) {
77302           parents = currParents;
77303           continue;
77304         }
77305         parents = (onlyCommonParents ? utilArrayIntersection : utilArrayUnion)(parents, currParents);
77306         if (!parents.length) {
77307           return [];
77308         }
77309       }
77310       return parents;
77311     }
77312     function childNodeIdsOfSelection(onlyCommon) {
77313       var graph = context.graph();
77314       var childs = [];
77315       for (var i2 = 0; i2 < selectedIDs.length; i2++) {
77316         var entity = context.hasEntity(selectedIDs[i2]);
77317         if (!entity || !["area", "line"].includes(entity.geometry(graph))) {
77318           return [];
77319         }
77320         var currChilds = graph.childNodes(entity).map(function(node) {
77321           return node.id;
77322         });
77323         if (!childs.length) {
77324           childs = currChilds;
77325           continue;
77326         }
77327         childs = (onlyCommon ? utilArrayIntersection : utilArrayUnion)(childs, currChilds);
77328         if (!childs.length) {
77329           return [];
77330         }
77331       }
77332       return childs;
77333     }
77334     function checkFocusedParent() {
77335       if (_focusedParentWayId) {
77336         var parents = parentWaysIdsOfSelection(true);
77337         if (parents.indexOf(_focusedParentWayId) === -1)
77338           _focusedParentWayId = null;
77339       }
77340     }
77341     function parentWayIdForVertexNavigation() {
77342       var parentIds = parentWaysIdsOfSelection(true);
77343       if (_focusedParentWayId && parentIds.indexOf(_focusedParentWayId) !== -1) {
77344         return _focusedParentWayId;
77345       }
77346       return parentIds.length ? parentIds[0] : null;
77347     }
77348     mode.selectedIDs = function(val) {
77349       if (!arguments.length)
77350         return selectedIDs;
77351       selectedIDs = val;
77352       return mode;
77353     };
77354     mode.zoomToSelected = function() {
77355       context.map().zoomToEase(selectedEntities());
77356     };
77357     mode.newFeature = function(val) {
77358       if (!arguments.length)
77359         return _newFeature;
77360       _newFeature = val;
77361       return mode;
77362     };
77363     mode.selectBehavior = function(val) {
77364       if (!arguments.length)
77365         return _selectBehavior;
77366       _selectBehavior = val;
77367       return mode;
77368     };
77369     mode.follow = function(val) {
77370       if (!arguments.length)
77371         return _follow;
77372       _follow = val;
77373       return mode;
77374     };
77375     function loadOperations() {
77376       _operations.forEach(function(operation) {
77377         if (operation.behavior) {
77378           context.uninstall(operation.behavior);
77379         }
77380       });
77381       _operations = Object.values(operations_exports).map(function(o) {
77382         return o(context, selectedIDs);
77383       }).filter(function(o) {
77384         return o.id !== "delete" && o.id !== "downgrade" && o.id !== "copy";
77385       }).concat([
77386         // group copy/downgrade/delete operation together at the end of the list
77387         operationCopy(context, selectedIDs),
77388         operationDowngrade(context, selectedIDs),
77389         operationDelete(context, selectedIDs)
77390       ]).filter(function(operation) {
77391         return operation.available();
77392       });
77393       _operations.forEach(function(operation) {
77394         if (operation.behavior) {
77395           context.install(operation.behavior);
77396         }
77397       });
77398       context.ui().closeEditMenu();
77399     }
77400     mode.operations = function() {
77401       return _operations;
77402     };
77403     mode.enter = function() {
77404       if (!checkSelectedIDs())
77405         return;
77406       context.features().forceVisible(selectedIDs);
77407       _modeDragNode.restoreSelectedIDs(selectedIDs);
77408       loadOperations();
77409       if (!_behaviors.length) {
77410         if (!_selectBehavior)
77411           _selectBehavior = behaviorSelect(context);
77412         _behaviors = [
77413           behaviorPaste(context),
77414           _breatheBehavior,
77415           behaviorHover(context).on("hover", context.ui().sidebar.hoverModeSelect),
77416           _selectBehavior,
77417           behaviorLasso(context),
77418           _modeDragNode.behavior,
77419           modeDragNote(context).behavior
77420         ];
77421       }
77422       _behaviors.forEach(context.install);
77423       keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on(["[", "pgup"], previousVertex).on(["]", "pgdown"], nextVertex).on(["{", uiCmd("\u2318["), "home"], firstVertex).on(["}", uiCmd("\u2318]"), "end"], lastVertex).on(uiCmd("\u21E7\u2190"), nudgeSelection([-10, 0])).on(uiCmd("\u21E7\u2191"), nudgeSelection([0, -10])).on(uiCmd("\u21E7\u2192"), nudgeSelection([10, 0])).on(uiCmd("\u21E7\u2193"), nudgeSelection([0, 10])).on(uiCmd("\u21E7\u2325\u2190"), nudgeSelection([-100, 0])).on(uiCmd("\u21E7\u2325\u2191"), nudgeSelection([0, -100])).on(uiCmd("\u21E7\u2325\u2192"), nudgeSelection([100, 0])).on(uiCmd("\u21E7\u2325\u2193"), nudgeSelection([0, 100])).on(utilKeybinding.plusKeys.map((key) => uiCmd("\u21E7" + key)), scaleSelection(1.05)).on(utilKeybinding.plusKeys.map((key) => uiCmd("\u21E7\u2325" + key)), scaleSelection(Math.pow(1.05, 5))).on(utilKeybinding.minusKeys.map((key) => uiCmd("\u21E7" + key)), scaleSelection(1 / 1.05)).on(utilKeybinding.minusKeys.map((key) => uiCmd("\u21E7\u2325" + key)), scaleSelection(1 / Math.pow(1.05, 5))).on(["\\", "pause"], focusNextParent).on(uiCmd("\u2318\u2191"), selectParent).on(uiCmd("\u2318\u2193"), selectChild).on("\u238B", esc, true);
77424       select_default2(document).call(keybinding);
77425       context.ui().sidebar.select(selectedIDs, _newFeature);
77426       context.history().on("change.select", function() {
77427         loadOperations();
77428         selectElements();
77429       }).on("undone.select", checkSelectedIDs).on("redone.select", checkSelectedIDs);
77430       context.map().on("drawn.select", selectElements).on("crossEditableZoom.select", function() {
77431         selectElements();
77432         _breatheBehavior.restartIfNeeded(context.surface());
77433       });
77434       context.map().doubleUpHandler().on("doubleUp.modeSelect", didDoubleUp);
77435       selectElements();
77436       if (_follow) {
77437         var extent = geoExtent();
77438         var graph = context.graph();
77439         selectedIDs.forEach(function(id2) {
77440           var entity = context.entity(id2);
77441           extent._extend(entity.extent(graph));
77442         });
77443         var loc = extent.center();
77444         context.map().centerEase(loc);
77445         _follow = false;
77446       }
77447       function nudgeSelection(delta) {
77448         return function() {
77449           if (!context.map().withinEditableZoom())
77450             return;
77451           var moveOp = operationMove(context, selectedIDs);
77452           if (moveOp.disabled()) {
77453             context.ui().flash.duration(4e3).iconName("#iD-operation-" + moveOp.id).iconClass("operation disabled").label(moveOp.tooltip())();
77454           } else {
77455             context.perform(actionMove(selectedIDs, delta, context.projection), moveOp.annotation());
77456             context.validator().validate();
77457           }
77458         };
77459       }
77460       function scaleSelection(factor) {
77461         return function() {
77462           if (!context.map().withinEditableZoom())
77463             return;
77464           let nodes = utilGetAllNodes(selectedIDs, context.graph());
77465           let isUp = factor > 1;
77466           if (nodes.length <= 1)
77467             return;
77468           let extent2 = utilTotalExtent(selectedIDs, context.graph());
77469           function scalingDisabled() {
77470             if (tooSmall()) {
77471               return "too_small";
77472             } else if (extent2.percentContainedIn(context.map().extent()) < 0.8) {
77473               return "too_large";
77474             } else if (someMissing() || selectedIDs.some(incompleteRelation)) {
77475               return "not_downloaded";
77476             } else if (selectedIDs.some(context.hasHiddenConnections)) {
77477               return "connected_to_hidden";
77478             }
77479             return false;
77480             function tooSmall() {
77481               if (isUp)
77482                 return false;
77483               let dLon = Math.abs(extent2[1][0] - extent2[0][0]);
77484               let dLat = Math.abs(extent2[1][1] - extent2[0][1]);
77485               return dLon < geoMetersToLon(1, extent2[1][1]) && dLat < geoMetersToLat(1);
77486             }
77487             function someMissing() {
77488               if (context.inIntro())
77489                 return false;
77490               let osm = context.connection();
77491               if (osm) {
77492                 let missing = nodes.filter(function(n2) {
77493                   return !osm.isDataLoaded(n2.loc);
77494                 });
77495                 if (missing.length) {
77496                   missing.forEach(function(loc2) {
77497                     context.loadTileAtLoc(loc2);
77498                   });
77499                   return true;
77500                 }
77501               }
77502               return false;
77503             }
77504             function incompleteRelation(id2) {
77505               let entity = context.entity(id2);
77506               return entity.type === "relation" && !entity.isComplete(context.graph());
77507             }
77508           }
77509           const disabled = scalingDisabled();
77510           if (disabled) {
77511             let multi = selectedIDs.length === 1 ? "single" : "multiple";
77512             context.ui().flash.duration(4e3).iconName("#iD-icon-no").iconClass("operation disabled").label(_t.append("operations.scale." + disabled + "." + multi))();
77513           } else {
77514             const pivot = context.projection(extent2.center());
77515             const annotation = _t("operations.scale.annotation." + (isUp ? "up" : "down") + ".feature", { n: selectedIDs.length });
77516             context.perform(actionScale(selectedIDs, pivot, factor, context.projection), annotation);
77517             context.validator().validate();
77518           }
77519         };
77520       }
77521       function didDoubleUp(d3_event, loc2) {
77522         if (!context.map().withinEditableZoom())
77523           return;
77524         var target = select_default2(d3_event.target);
77525         var datum2 = target.datum();
77526         var entity = datum2 && datum2.properties && datum2.properties.entity;
77527         if (!entity)
77528           return;
77529         if (entity instanceof osmWay && target.classed("target")) {
77530           var choice = geoChooseEdge(context.graph().childNodes(entity), loc2, context.projection);
77531           var prev = entity.nodes[choice.index - 1];
77532           var next = entity.nodes[choice.index];
77533           context.perform(
77534             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
77535             _t("operations.add.annotation.vertex")
77536           );
77537           context.validator().validate();
77538         } else if (entity.type === "midpoint") {
77539           context.perform(
77540             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
77541             _t("operations.add.annotation.vertex")
77542           );
77543           context.validator().validate();
77544         }
77545       }
77546       function selectElements() {
77547         if (!checkSelectedIDs())
77548           return;
77549         var surface = context.surface();
77550         surface.selectAll(".selected-member").classed("selected-member", false);
77551         surface.selectAll(".selected").classed("selected", false);
77552         surface.selectAll(".related").classed("related", false);
77553         checkFocusedParent();
77554         if (_focusedParentWayId) {
77555           surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed("related", true);
77556         }
77557         if (context.map().withinEditableZoom()) {
77558           surface.selectAll(utilDeepMemberSelector(
77559             selectedIDs,
77560             context.graph(),
77561             true
77562             /* skipMultipolgonMembers */
77563           )).classed("selected-member", true);
77564           surface.selectAll(utilEntityOrDeepMemberSelector(selectedIDs, context.graph())).classed("selected", true);
77565         }
77566       }
77567       function esc() {
77568         if (context.container().select(".combobox").size())
77569           return;
77570         context.enter(modeBrowse(context));
77571       }
77572       function firstVertex(d3_event) {
77573         d3_event.preventDefault();
77574         var entity = singular();
77575         var parentId = parentWayIdForVertexNavigation();
77576         var way;
77577         if (entity && entity.type === "way") {
77578           way = entity;
77579         } else if (parentId) {
77580           way = context.entity(parentId);
77581         }
77582         _focusedParentWayId = way && way.id;
77583         if (way) {
77584           context.enter(
77585             mode.selectedIDs([way.first()]).follow(true)
77586           );
77587         }
77588       }
77589       function lastVertex(d3_event) {
77590         d3_event.preventDefault();
77591         var entity = singular();
77592         var parentId = parentWayIdForVertexNavigation();
77593         var way;
77594         if (entity && entity.type === "way") {
77595           way = entity;
77596         } else if (parentId) {
77597           way = context.entity(parentId);
77598         }
77599         _focusedParentWayId = way && way.id;
77600         if (way) {
77601           context.enter(
77602             mode.selectedIDs([way.last()]).follow(true)
77603           );
77604         }
77605       }
77606       function previousVertex(d3_event) {
77607         d3_event.preventDefault();
77608         var parentId = parentWayIdForVertexNavigation();
77609         _focusedParentWayId = parentId;
77610         if (!parentId)
77611           return;
77612         var way = context.entity(parentId);
77613         var length = way.nodes.length;
77614         var curr = way.nodes.indexOf(selectedIDs[0]);
77615         var index = -1;
77616         if (curr > 0) {
77617           index = curr - 1;
77618         } else if (way.isClosed()) {
77619           index = length - 2;
77620         }
77621         if (index !== -1) {
77622           context.enter(
77623             mode.selectedIDs([way.nodes[index]]).follow(true)
77624           );
77625         }
77626       }
77627       function nextVertex(d3_event) {
77628         d3_event.preventDefault();
77629         var parentId = parentWayIdForVertexNavigation();
77630         _focusedParentWayId = parentId;
77631         if (!parentId)
77632           return;
77633         var way = context.entity(parentId);
77634         var length = way.nodes.length;
77635         var curr = way.nodes.indexOf(selectedIDs[0]);
77636         var index = -1;
77637         if (curr < length - 1) {
77638           index = curr + 1;
77639         } else if (way.isClosed()) {
77640           index = 0;
77641         }
77642         if (index !== -1) {
77643           context.enter(
77644             mode.selectedIDs([way.nodes[index]]).follow(true)
77645           );
77646         }
77647       }
77648       function focusNextParent(d3_event) {
77649         d3_event.preventDefault();
77650         var parents = parentWaysIdsOfSelection(true);
77651         if (!parents || parents.length < 2)
77652           return;
77653         var index = parents.indexOf(_focusedParentWayId);
77654         if (index < 0 || index > parents.length - 2) {
77655           _focusedParentWayId = parents[0];
77656         } else {
77657           _focusedParentWayId = parents[index + 1];
77658         }
77659         var surface = context.surface();
77660         surface.selectAll(".related").classed("related", false);
77661         if (_focusedParentWayId) {
77662           surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed("related", true);
77663         }
77664       }
77665       function selectParent(d3_event) {
77666         d3_event.preventDefault();
77667         var currentSelectedIds = mode.selectedIDs();
77668         var parentIds = _focusedParentWayId ? [_focusedParentWayId] : parentWaysIdsOfSelection(false);
77669         if (!parentIds.length)
77670           return;
77671         context.enter(
77672           mode.selectedIDs(parentIds)
77673         );
77674         _focusedVertexIds = currentSelectedIds;
77675       }
77676       function selectChild(d3_event) {
77677         d3_event.preventDefault();
77678         var currentSelectedIds = mode.selectedIDs();
77679         var childIds = _focusedVertexIds ? _focusedVertexIds.filter((id2) => context.hasEntity(id2)) : childNodeIdsOfSelection(true);
77680         if (!childIds || !childIds.length)
77681           return;
77682         if (currentSelectedIds.length === 1)
77683           _focusedParentWayId = currentSelectedIds[0];
77684         context.enter(
77685           mode.selectedIDs(childIds)
77686         );
77687       }
77688     };
77689     mode.exit = function() {
77690       _newFeature = false;
77691       _focusedVertexIds = null;
77692       _operations.forEach(function(operation) {
77693         if (operation.behavior) {
77694           context.uninstall(operation.behavior);
77695         }
77696       });
77697       _operations = [];
77698       _behaviors.forEach(context.uninstall);
77699       select_default2(document).call(keybinding.unbind);
77700       context.ui().closeEditMenu();
77701       context.history().on("change.select", null).on("undone.select", null).on("redone.select", null);
77702       var surface = context.surface();
77703       surface.selectAll(".selected-member").classed("selected-member", false);
77704       surface.selectAll(".selected").classed("selected", false);
77705       surface.selectAll(".highlighted").classed("highlighted", false);
77706       surface.selectAll(".related").classed("related", false);
77707       context.map().on("drawn.select", null);
77708       context.ui().sidebar.hide();
77709       context.features().forceVisible([]);
77710       var entity = singular();
77711       if (_newFeature && entity && entity.type === "relation" && // no tags
77712       Object.keys(entity.tags).length === 0 && // no parent relations
77713       context.graph().parentRelations(entity).length === 0 && // no members or one member with no role
77714       (entity.members.length === 0 || entity.members.length === 1 && !entity.members[0].role)) {
77715         var deleteAction = actionDeleteRelation(
77716           entity.id,
77717           true
77718           /* don't delete untagged members */
77719         );
77720         context.perform(deleteAction, _t("operations.delete.annotation.relation"));
77721         context.validator().validate();
77722       }
77723     };
77724     return mode;
77725   }
77726
77727   // modules/behavior/lasso.js
77728   function behaviorLasso(context) {
77729     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
77730     var behavior = function(selection2) {
77731       var lasso;
77732       function pointerdown(d3_event) {
77733         var button = 0;
77734         if (d3_event.button === button && d3_event.shiftKey === true) {
77735           lasso = null;
77736           select_default2(window).on(_pointerPrefix + "move.lasso", pointermove).on(_pointerPrefix + "up.lasso", pointerup);
77737           d3_event.stopPropagation();
77738         }
77739       }
77740       function pointermove() {
77741         if (!lasso) {
77742           lasso = uiLasso(context);
77743           context.surface().call(lasso);
77744         }
77745         lasso.p(context.map().mouse());
77746       }
77747       function normalize2(a, b) {
77748         return [
77749           [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
77750           [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
77751         ];
77752       }
77753       function lassoed() {
77754         if (!lasso)
77755           return [];
77756         var graph = context.graph();
77757         var limitToNodes;
77758         if (context.map().editableDataEnabled(
77759           true
77760           /* skipZoomCheck */
77761         ) && context.map().isInWideSelection()) {
77762           limitToNodes = new Set(utilGetAllNodes(context.selectedIDs(), graph));
77763         } else if (!context.map().editableDataEnabled()) {
77764           return [];
77765         }
77766         var bounds = lasso.extent().map(context.projection.invert);
77767         var extent = geoExtent(normalize2(bounds[0], bounds[1]));
77768         var intersects = context.history().intersects(extent).filter(function(entity) {
77769           return entity.type === "node" && (!limitToNodes || limitToNodes.has(entity)) && geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) && !context.features().isHidden(entity, graph, entity.geometry(graph));
77770         });
77771         intersects.sort(function(node1, node2) {
77772           var parents1 = graph.parentWays(node1);
77773           var parents2 = graph.parentWays(node2);
77774           if (parents1.length && parents2.length) {
77775             var sharedParents = utilArrayIntersection(parents1, parents2);
77776             if (sharedParents.length) {
77777               var sharedParentNodes = sharedParents[0].nodes;
77778               return sharedParentNodes.indexOf(node1.id) - sharedParentNodes.indexOf(node2.id);
77779             } else {
77780               return Number(parents1[0].id.slice(1)) - Number(parents2[0].id.slice(1));
77781             }
77782           } else if (parents1.length || parents2.length) {
77783             return parents1.length - parents2.length;
77784           }
77785           return node1.loc[0] - node2.loc[0];
77786         });
77787         return intersects.map(function(entity) {
77788           return entity.id;
77789         });
77790       }
77791       function pointerup() {
77792         select_default2(window).on(_pointerPrefix + "move.lasso", null).on(_pointerPrefix + "up.lasso", null);
77793         if (!lasso)
77794           return;
77795         var ids = lassoed();
77796         lasso.close();
77797         if (ids.length) {
77798           context.enter(modeSelect(context, ids));
77799         }
77800       }
77801       selection2.on(_pointerPrefix + "down.lasso", pointerdown);
77802     };
77803     behavior.off = function(selection2) {
77804       selection2.on(_pointerPrefix + "down.lasso", null);
77805     };
77806     return behavior;
77807   }
77808
77809   // modules/modes/browse.js
77810   function modeBrowse(context) {
77811     var mode = {
77812       button: "browse",
77813       id: "browse",
77814       title: _t.append("modes.browse.title"),
77815       description: _t.append("modes.browse.description")
77816     };
77817     var sidebar;
77818     var _selectBehavior;
77819     var _behaviors = [];
77820     mode.selectBehavior = function(val) {
77821       if (!arguments.length)
77822         return _selectBehavior;
77823       _selectBehavior = val;
77824       return mode;
77825     };
77826     mode.enter = function() {
77827       if (!_behaviors.length) {
77828         if (!_selectBehavior)
77829           _selectBehavior = behaviorSelect(context);
77830         _behaviors = [
77831           behaviorPaste(context),
77832           behaviorHover(context).on("hover", context.ui().sidebar.hover),
77833           _selectBehavior,
77834           behaviorLasso(context),
77835           modeDragNode(context).behavior,
77836           modeDragNote(context).behavior
77837         ];
77838       }
77839       _behaviors.forEach(context.install);
77840       if (document.activeElement && document.activeElement.blur) {
77841         document.activeElement.blur();
77842       }
77843       if (sidebar) {
77844         context.ui().sidebar.show(sidebar);
77845       } else {
77846         context.ui().sidebar.select(null);
77847       }
77848     };
77849     mode.exit = function() {
77850       context.ui().sidebar.hover.cancel();
77851       _behaviors.forEach(context.uninstall);
77852       if (sidebar) {
77853         context.ui().sidebar.hide();
77854       }
77855     };
77856     mode.sidebar = function(_) {
77857       if (!arguments.length)
77858         return sidebar;
77859       sidebar = _;
77860       return mode;
77861     };
77862     mode.operations = function() {
77863       return [operationPaste(context)];
77864     };
77865     return mode;
77866   }
77867
77868   // modules/behavior/add_way.js
77869   function behaviorAddWay(context) {
77870     var dispatch10 = dispatch_default("start", "startFromWay", "startFromNode");
77871     var draw = behaviorDraw(context);
77872     function behavior(surface) {
77873       draw.on("click", function() {
77874         dispatch10.apply("start", this, arguments);
77875       }).on("clickWay", function() {
77876         dispatch10.apply("startFromWay", this, arguments);
77877       }).on("clickNode", function() {
77878         dispatch10.apply("startFromNode", this, arguments);
77879       }).on("cancel", behavior.cancel).on("finish", behavior.cancel);
77880       context.map().dblclickZoomEnable(false);
77881       surface.call(draw);
77882     }
77883     behavior.off = function(surface) {
77884       surface.call(draw.off);
77885     };
77886     behavior.cancel = function() {
77887       window.setTimeout(function() {
77888         context.map().dblclickZoomEnable(true);
77889       }, 1e3);
77890       context.enter(modeBrowse(context));
77891     };
77892     return utilRebind(behavior, dispatch10, "on");
77893   }
77894
77895   // modules/behavior/hash.js
77896   function behaviorHash(context) {
77897     var _cachedHash = null;
77898     var _latitudeLimit = 90 - 1e-8;
77899     function computedHashParameters() {
77900       var map2 = context.map();
77901       var center = map2.center();
77902       var zoom = map2.zoom();
77903       var precision2 = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
77904       var oldParams = utilObjectOmit(
77905         utilStringQs(window.location.hash),
77906         ["comment", "source", "hashtags", "walkthrough"]
77907       );
77908       var newParams = {};
77909       delete oldParams.id;
77910       var selected = context.selectedIDs().filter(function(id2) {
77911         return context.hasEntity(id2);
77912       });
77913       if (selected.length) {
77914         newParams.id = selected.join(",");
77915       }
77916       newParams.map = zoom.toFixed(2) + "/" + center[1].toFixed(precision2) + "/" + center[0].toFixed(precision2);
77917       return Object.assign(oldParams, newParams);
77918     }
77919     function computedHash() {
77920       return "#" + utilQsString(computedHashParameters(), true);
77921     }
77922     function computedTitle(includeChangeCount) {
77923       var baseTitle = context.documentTitleBase() || "iD";
77924       var contextual;
77925       var changeCount;
77926       var titleID;
77927       var selected = context.selectedIDs().filter(function(id2) {
77928         return context.hasEntity(id2);
77929       });
77930       if (selected.length) {
77931         var firstLabel = utilDisplayLabel(context.entity(selected[0]), context.graph());
77932         if (selected.length > 1) {
77933           contextual = _t("title.labeled_and_more", {
77934             labeled: firstLabel,
77935             count: selected.length - 1
77936           });
77937         } else {
77938           contextual = firstLabel;
77939         }
77940         titleID = "context";
77941       }
77942       if (includeChangeCount) {
77943         changeCount = context.history().difference().summary().length;
77944         if (changeCount > 0) {
77945           titleID = contextual ? "changes_context" : "changes";
77946         }
77947       }
77948       if (titleID) {
77949         return _t("title.format." + titleID, {
77950           changes: changeCount,
77951           base: baseTitle,
77952           context: contextual
77953         });
77954       }
77955       return baseTitle;
77956     }
77957     function updateTitle(includeChangeCount) {
77958       if (!context.setsDocumentTitle())
77959         return;
77960       var newTitle = computedTitle(includeChangeCount);
77961       if (document.title !== newTitle) {
77962         document.title = newTitle;
77963       }
77964     }
77965     function updateHashIfNeeded() {
77966       if (context.inIntro())
77967         return;
77968       var latestHash = computedHash();
77969       if (_cachedHash !== latestHash) {
77970         _cachedHash = latestHash;
77971         window.history.replaceState(null, computedTitle(
77972           false
77973           /* includeChangeCount */
77974         ), latestHash);
77975         updateTitle(
77976           true
77977           /* includeChangeCount */
77978         );
77979         const q = utilStringQs(latestHash);
77980         if (q.map) {
77981           corePreferences("map-location", q.map);
77982         }
77983       }
77984     }
77985     var _throttledUpdate = throttle_default(updateHashIfNeeded, 500);
77986     var _throttledUpdateTitle = throttle_default(function() {
77987       updateTitle(
77988         true
77989         /* includeChangeCount */
77990       );
77991     }, 500);
77992     function hashchange() {
77993       if (window.location.hash === _cachedHash)
77994         return;
77995       _cachedHash = window.location.hash;
77996       var q = utilStringQs(_cachedHash);
77997       var mapArgs = (q.map || "").split("/").map(Number);
77998       if (mapArgs.length < 3 || mapArgs.some(isNaN)) {
77999         updateHashIfNeeded();
78000       } else {
78001         if (_cachedHash === computedHash())
78002           return;
78003         var mode = context.mode();
78004         context.map().centerZoom([mapArgs[2], Math.min(_latitudeLimit, Math.max(-_latitudeLimit, mapArgs[1]))], mapArgs[0]);
78005         if (q.id && mode) {
78006           var ids = q.id.split(",").filter(function(id2) {
78007             return context.hasEntity(id2);
78008           });
78009           if (ids.length && (mode.id === "browse" || mode.id === "select" && !utilArrayIdentical(mode.selectedIDs(), ids))) {
78010             context.enter(modeSelect(context, ids));
78011             return;
78012           }
78013         }
78014         var center = context.map().center();
78015         var dist = geoSphericalDistance(center, [mapArgs[2], mapArgs[1]]);
78016         var maxdist = 500;
78017         if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
78018           context.enter(modeBrowse(context));
78019           return;
78020         }
78021       }
78022     }
78023     function behavior() {
78024       context.map().on("move.behaviorHash", _throttledUpdate);
78025       context.history().on("change.behaviorHash", _throttledUpdateTitle);
78026       context.on("enter.behaviorHash", _throttledUpdate);
78027       select_default2(window).on("hashchange.behaviorHash", hashchange);
78028       var q = utilStringQs(window.location.hash);
78029       if (q.id) {
78030         context.zoomToEntity(q.id.split(",")[0], !q.map);
78031       }
78032       if (q.walkthrough === "true") {
78033         behavior.startWalkthrough = true;
78034       }
78035       if (q.map) {
78036         behavior.hadLocation = true;
78037       } else if (!q.id && corePreferences("map-location")) {
78038         const mapArgs = corePreferences("map-location").split("/").map(Number);
78039         context.map().centerZoom([mapArgs[2], Math.min(_latitudeLimit, Math.max(-_latitudeLimit, mapArgs[1]))], mapArgs[0]);
78040         updateHashIfNeeded();
78041         behavior.hadLocation = true;
78042       }
78043       hashchange();
78044       updateTitle(false);
78045     }
78046     behavior.off = function() {
78047       _throttledUpdate.cancel();
78048       _throttledUpdateTitle.cancel();
78049       context.map().on("move.behaviorHash", null);
78050       context.on("enter.behaviorHash", null);
78051       select_default2(window).on("hashchange.behaviorHash", null);
78052       window.location.hash = "";
78053     };
78054     return behavior;
78055   }
78056
78057   // node_modules/d3-brush/src/brush.js
78058   var { abs: abs2, max: max2, min: min2 } = Math;
78059   function number1(e) {
78060     return [+e[0], +e[1]];
78061   }
78062   function number22(e) {
78063     return [number1(e[0]), number1(e[1])];
78064   }
78065   var X = {
78066     name: "x",
78067     handles: ["w", "e"].map(type),
78068     input: function(x, e) {
78069       return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]];
78070     },
78071     output: function(xy) {
78072       return xy && [xy[0][0], xy[1][0]];
78073     }
78074   };
78075   var Y = {
78076     name: "y",
78077     handles: ["n", "s"].map(type),
78078     input: function(y, e) {
78079       return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]];
78080     },
78081     output: function(xy) {
78082       return xy && [xy[0][1], xy[1][1]];
78083     }
78084   };
78085   var XY = {
78086     name: "xy",
78087     handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),
78088     input: function(xy) {
78089       return xy == null ? null : number22(xy);
78090     },
78091     output: function(xy) {
78092       return xy;
78093     }
78094   };
78095   function type(t) {
78096     return { type: t };
78097   }
78098
78099   // modules/index.js
78100   var debug = false;
78101   var d3 = {
78102     dispatch: dispatch_default,
78103     geoMercator: mercator_default,
78104     geoProjection: projection,
78105     polygonArea: area_default3,
78106     polygonCentroid: centroid_default2,
78107     select: select_default2,
78108     selectAll: selectAll_default2,
78109     timerFlush
78110   };
78111
78112   // modules/id.js
78113   window.requestIdleCallback = window.requestIdleCallback || function(cb) {
78114     var start2 = Date.now();
78115     return window.requestAnimationFrame(function() {
78116       cb({
78117         didTimeout: false,
78118         timeRemaining: function() {
78119           return Math.max(0, 50 - (Date.now() - start2));
78120         }
78121       });
78122     });
78123   };
78124   window.cancelIdleCallback = window.cancelIdleCallback || function(id2) {
78125     window.cancelAnimationFrame(id2);
78126   };
78127   window.iD = modules_exports;
78128 })();
78129 //# sourceMappingURL=iD.js.map