]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
ea04f7592d3c400609b2feab4afa283846ffe5c2
[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           if (!feature3.geometry)
3603             continue;
3604           var coords = feature3.geometry.coordinates;
3605           if (feature3.geometry.type === "Polygon") {
3606             bboxes.push(treeItem(coords, feature3.properties));
3607           } else if (feature3.geometry.type === "MultiPolygon") {
3608             for (var j2 = 0; j2 < coords.length; j2++) {
3609               bboxes.push(treeItem(coords[j2], feature3.properties));
3610             }
3611           }
3612         }
3613         var tree = rbush().load(bboxes);
3614         function query(p, multi) {
3615           var output = [], result = tree.search({
3616             minX: p[0],
3617             minY: p[1],
3618             maxX: p[0],
3619             maxY: p[1]
3620           });
3621           for (var i3 = 0; i3 < result.length; i3++) {
3622             if (insidePolygon(result[i3].coords, p)) {
3623               if (multi)
3624                 output.push(result[i3].props);
3625               else
3626                 return result[i3].props;
3627             }
3628           }
3629           return multi && output.length ? output : null;
3630         }
3631         query.tree = tree;
3632         query.bbox = function queryBBox(bbox2) {
3633           var output = [];
3634           var result = tree.search({
3635             minX: bbox2[0],
3636             minY: bbox2[1],
3637             maxX: bbox2[2],
3638             maxY: bbox2[3]
3639           });
3640           for (var i3 = 0; i3 < result.length; i3++) {
3641             if (polygonIntersectsBBox(result[i3].coords, bbox2)) {
3642               output.push(result[i3].props);
3643             }
3644           }
3645           return output;
3646         };
3647         return query;
3648       }
3649       function polygonIntersectsBBox(polygon2, bbox2) {
3650         var bboxCenter = [
3651           (bbox2[0] + bbox2[2]) / 2,
3652           (bbox2[1] + bbox2[3]) / 2
3653         ];
3654         if (insidePolygon(polygon2, bboxCenter))
3655           return true;
3656         for (var i2 = 0; i2 < polygon2.length; i2++) {
3657           if (lineclip2(polygon2[i2], bbox2).length > 0)
3658             return true;
3659         }
3660         return false;
3661       }
3662       function insidePolygon(rings, p) {
3663         var inside = false;
3664         for (var i2 = 0, len = rings.length; i2 < len; i2++) {
3665           var ring = rings[i2];
3666           for (var j2 = 0, len2 = ring.length, k = len2 - 1; j2 < len2; k = j2++) {
3667             if (rayIntersect(p, ring[j2], ring[k]))
3668               inside = !inside;
3669           }
3670         }
3671         return inside;
3672       }
3673       function rayIntersect(p, p1, p2) {
3674         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];
3675       }
3676       function treeItem(coords, props) {
3677         var item = {
3678           minX: Infinity,
3679           minY: Infinity,
3680           maxX: -Infinity,
3681           maxY: -Infinity,
3682           coords,
3683           props
3684         };
3685         for (var i2 = 0; i2 < coords[0].length; i2++) {
3686           var p = coords[0][i2];
3687           item.minX = Math.min(item.minX, p[0]);
3688           item.minY = Math.min(item.minY, p[1]);
3689           item.maxX = Math.max(item.maxX, p[0]);
3690           item.maxY = Math.max(item.maxY, p[1]);
3691         }
3692         return item;
3693       }
3694     }
3695   });
3696
3697   // node_modules/wgs84/index.js
3698   var require_wgs84 = __commonJS({
3699     "node_modules/wgs84/index.js"(exports2, module2) {
3700       module2.exports.RADIUS = 6378137;
3701       module2.exports.FLATTENING = 1 / 298.257223563;
3702       module2.exports.POLAR_RADIUS = 63567523142e-4;
3703     }
3704   });
3705
3706   // node_modules/@mapbox/geojson-area/index.js
3707   var require_geojson_area = __commonJS({
3708     "node_modules/@mapbox/geojson-area/index.js"(exports2, module2) {
3709       var wgs84 = require_wgs84();
3710       module2.exports.geometry = geometry;
3711       module2.exports.ring = ringArea;
3712       function geometry(_) {
3713         var area = 0, i2;
3714         switch (_.type) {
3715           case "Polygon":
3716             return polygonArea(_.coordinates);
3717           case "MultiPolygon":
3718             for (i2 = 0; i2 < _.coordinates.length; i2++) {
3719               area += polygonArea(_.coordinates[i2]);
3720             }
3721             return area;
3722           case "Point":
3723           case "MultiPoint":
3724           case "LineString":
3725           case "MultiLineString":
3726             return 0;
3727           case "GeometryCollection":
3728             for (i2 = 0; i2 < _.geometries.length; i2++) {
3729               area += geometry(_.geometries[i2]);
3730             }
3731             return area;
3732         }
3733       }
3734       function polygonArea(coords) {
3735         var area = 0;
3736         if (coords && coords.length > 0) {
3737           area += Math.abs(ringArea(coords[0]));
3738           for (var i2 = 1; i2 < coords.length; i2++) {
3739             area -= Math.abs(ringArea(coords[i2]));
3740           }
3741         }
3742         return area;
3743       }
3744       function ringArea(coords) {
3745         var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i2, area = 0, coordsLength = coords.length;
3746         if (coordsLength > 2) {
3747           for (i2 = 0; i2 < coordsLength; i2++) {
3748             if (i2 === coordsLength - 2) {
3749               lowerIndex = coordsLength - 2;
3750               middleIndex = coordsLength - 1;
3751               upperIndex = 0;
3752             } else if (i2 === coordsLength - 1) {
3753               lowerIndex = coordsLength - 1;
3754               middleIndex = 0;
3755               upperIndex = 1;
3756             } else {
3757               lowerIndex = i2;
3758               middleIndex = i2 + 1;
3759               upperIndex = i2 + 2;
3760             }
3761             p1 = coords[lowerIndex];
3762             p2 = coords[middleIndex];
3763             p3 = coords[upperIndex];
3764             area += (rad(p3[0]) - rad(p1[0])) * Math.sin(rad(p2[1]));
3765           }
3766           area = area * wgs84.RADIUS * wgs84.RADIUS / 2;
3767         }
3768         return area;
3769       }
3770       function rad(_) {
3771         return _ * Math.PI / 180;
3772       }
3773     }
3774   });
3775
3776   // node_modules/circle-to-polygon/input-validation/validateCenter.js
3777   var require_validateCenter = __commonJS({
3778     "node_modules/circle-to-polygon/input-validation/validateCenter.js"(exports2) {
3779       exports2.validateCenter = function validateCenter(center) {
3780         var validCenterLengths = [2, 3];
3781         if (!Array.isArray(center) || !validCenterLengths.includes(center.length)) {
3782           throw new Error("ERROR! Center has to be an array of length two or three");
3783         }
3784         var [lng, lat] = center;
3785         if (typeof lng !== "number" || typeof lat !== "number") {
3786           throw new Error(
3787             `ERROR! Longitude and Latitude has to be numbers but where ${typeof lng} and ${typeof lat}`
3788           );
3789         }
3790         if (lng > 180 || lng < -180) {
3791           throw new Error(`ERROR! Longitude has to be between -180 and 180 but was ${lng}`);
3792         }
3793         if (lat > 90 || lat < -90) {
3794           throw new Error(`ERROR! Latitude has to be between -90 and 90 but was ${lat}`);
3795         }
3796       };
3797     }
3798   });
3799
3800   // node_modules/circle-to-polygon/input-validation/validateRadius.js
3801   var require_validateRadius = __commonJS({
3802     "node_modules/circle-to-polygon/input-validation/validateRadius.js"(exports2) {
3803       exports2.validateRadius = function validateRadius(radius) {
3804         if (typeof radius !== "number") {
3805           throw new Error(`ERROR! Radius has to be a positive number but was: ${typeof radius}`);
3806         }
3807         if (radius <= 0) {
3808           throw new Error(`ERROR! Radius has to be a positive number but was: ${radius}`);
3809         }
3810       };
3811     }
3812   });
3813
3814   // node_modules/circle-to-polygon/input-validation/validateNumberOfEdges.js
3815   var require_validateNumberOfEdges = __commonJS({
3816     "node_modules/circle-to-polygon/input-validation/validateNumberOfEdges.js"(exports2) {
3817       exports2.validateNumberOfEdges = function validateNumberOfEdges(numberOfEdges) {
3818         if (typeof numberOfEdges !== "number") {
3819           const ARGUMENT_TYPE = Array.isArray(numberOfEdges) ? "array" : typeof numberOfEdges;
3820           throw new Error(`ERROR! Number of edges has to be a number but was: ${ARGUMENT_TYPE}`);
3821         }
3822         if (numberOfEdges < 3) {
3823           throw new Error(`ERROR! Number of edges has to be at least 3 but was: ${numberOfEdges}`);
3824         }
3825       };
3826     }
3827   });
3828
3829   // node_modules/circle-to-polygon/input-validation/validateEarthRadius.js
3830   var require_validateEarthRadius = __commonJS({
3831     "node_modules/circle-to-polygon/input-validation/validateEarthRadius.js"(exports2) {
3832       exports2.validateEarthRadius = function validateEarthRadius(earthRadius2) {
3833         if (typeof earthRadius2 !== "number") {
3834           const ARGUMENT_TYPE = Array.isArray(earthRadius2) ? "array" : typeof earthRadius2;
3835           throw new Error(`ERROR! Earth radius has to be a number but was: ${ARGUMENT_TYPE}`);
3836         }
3837         if (earthRadius2 <= 0) {
3838           throw new Error(`ERROR! Earth radius has to be a positive number but was: ${earthRadius2}`);
3839         }
3840       };
3841     }
3842   });
3843
3844   // node_modules/circle-to-polygon/input-validation/validateBearing.js
3845   var require_validateBearing = __commonJS({
3846     "node_modules/circle-to-polygon/input-validation/validateBearing.js"(exports2) {
3847       exports2.validateBearing = function validateBearing(bearing) {
3848         if (typeof bearing !== "number") {
3849           const ARGUMENT_TYPE = Array.isArray(bearing) ? "array" : typeof bearing;
3850           throw new Error(`ERROR! Bearing has to be a number but was: ${ARGUMENT_TYPE}`);
3851         }
3852       };
3853     }
3854   });
3855
3856   // node_modules/circle-to-polygon/input-validation/index.js
3857   var require_input_validation = __commonJS({
3858     "node_modules/circle-to-polygon/input-validation/index.js"(exports2) {
3859       var validateCenter = require_validateCenter().validateCenter;
3860       var validateRadius = require_validateRadius().validateRadius;
3861       var validateNumberOfEdges = require_validateNumberOfEdges().validateNumberOfEdges;
3862       var validateEarthRadius = require_validateEarthRadius().validateEarthRadius;
3863       var validateBearing = require_validateBearing().validateBearing;
3864       function validateInput({ center, radius, numberOfEdges, earthRadius: earthRadius2, bearing }) {
3865         validateCenter(center);
3866         validateRadius(radius);
3867         validateNumberOfEdges(numberOfEdges);
3868         validateEarthRadius(earthRadius2);
3869         validateBearing(bearing);
3870       }
3871       exports2.validateCenter = validateCenter;
3872       exports2.validateRadius = validateRadius;
3873       exports2.validateNumberOfEdges = validateNumberOfEdges;
3874       exports2.validateEarthRadius = validateEarthRadius;
3875       exports2.validateBearing = validateBearing;
3876       exports2.validateInput = validateInput;
3877     }
3878   });
3879
3880   // node_modules/circle-to-polygon/index.js
3881   var require_circle_to_polygon = __commonJS({
3882     "node_modules/circle-to-polygon/index.js"(exports2, module2) {
3883       "use strict";
3884       var { validateInput } = require_input_validation();
3885       var defaultEarthRadius = 6378137;
3886       function toRadians(angleInDegrees) {
3887         return angleInDegrees * Math.PI / 180;
3888       }
3889       function toDegrees(angleInRadians) {
3890         return angleInRadians * 180 / Math.PI;
3891       }
3892       function offset(c1, distance, earthRadius2, bearing) {
3893         var lat1 = toRadians(c1[1]);
3894         var lon1 = toRadians(c1[0]);
3895         var dByR = distance / earthRadius2;
3896         var lat = Math.asin(
3897           Math.sin(lat1) * Math.cos(dByR) + Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing)
3898         );
3899         var lon = lon1 + Math.atan2(
3900           Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1),
3901           Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat)
3902         );
3903         return [toDegrees(lon), toDegrees(lat)];
3904       }
3905       module2.exports = function circleToPolygon2(center, radius, options2) {
3906         var n2 = getNumberOfEdges(options2);
3907         var earthRadius2 = getEarthRadius(options2);
3908         var bearing = getBearing(options2);
3909         var direction = getDirection(options2);
3910         validateInput({ center, radius, numberOfEdges: n2, earthRadius: earthRadius2, bearing });
3911         var start2 = toRadians(bearing);
3912         var coordinates = [];
3913         for (var i2 = 0; i2 < n2; ++i2) {
3914           coordinates.push(
3915             offset(
3916               center,
3917               radius,
3918               earthRadius2,
3919               start2 + direction * 2 * Math.PI * -i2 / n2
3920             )
3921           );
3922         }
3923         coordinates.push(coordinates[0]);
3924         return {
3925           type: "Polygon",
3926           coordinates: [coordinates]
3927         };
3928       };
3929       function getNumberOfEdges(options2) {
3930         if (isUndefinedOrNull(options2)) {
3931           return 32;
3932         } else if (isObjectNotArray(options2)) {
3933           var numberOfEdges = options2.numberOfEdges;
3934           return numberOfEdges === void 0 ? 32 : numberOfEdges;
3935         }
3936         return options2;
3937       }
3938       function getEarthRadius(options2) {
3939         if (isUndefinedOrNull(options2)) {
3940           return defaultEarthRadius;
3941         } else if (isObjectNotArray(options2)) {
3942           var earthRadius2 = options2.earthRadius;
3943           return earthRadius2 === void 0 ? defaultEarthRadius : earthRadius2;
3944         }
3945         return defaultEarthRadius;
3946       }
3947       function getDirection(options2) {
3948         if (isObjectNotArray(options2) && options2.rightHandRule) {
3949           return -1;
3950         }
3951         return 1;
3952       }
3953       function getBearing(options2) {
3954         if (isUndefinedOrNull(options2)) {
3955           return 0;
3956         } else if (isObjectNotArray(options2)) {
3957           var bearing = options2.bearing;
3958           return bearing === void 0 ? 0 : bearing;
3959         }
3960         return 0;
3961       }
3962       function isObjectNotArray(argument) {
3963         return argument !== null && typeof argument === "object" && !Array.isArray(argument);
3964       }
3965       function isUndefinedOrNull(argument) {
3966         return argument === null || argument === void 0;
3967       }
3968     }
3969   });
3970
3971   // node_modules/polygon-clipping/dist/polygon-clipping.umd.js
3972   var require_polygon_clipping_umd = __commonJS({
3973     "node_modules/polygon-clipping/dist/polygon-clipping.umd.js"(exports2, module2) {
3974       (function(global3, factory) {
3975         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());
3976       })(exports2, function() {
3977         "use strict";
3978         function _classCallCheck(instance, Constructor) {
3979           if (!(instance instanceof Constructor)) {
3980             throw new TypeError("Cannot call a class as a function");
3981           }
3982         }
3983         function _defineProperties(target, props) {
3984           for (var i2 = 0; i2 < props.length; i2++) {
3985             var descriptor = props[i2];
3986             descriptor.enumerable = descriptor.enumerable || false;
3987             descriptor.configurable = true;
3988             if ("value" in descriptor)
3989               descriptor.writable = true;
3990             Object.defineProperty(target, descriptor.key, descriptor);
3991           }
3992         }
3993         function _createClass(Constructor, protoProps, staticProps) {
3994           if (protoProps)
3995             _defineProperties(Constructor.prototype, protoProps);
3996           if (staticProps)
3997             _defineProperties(Constructor, staticProps);
3998           return Constructor;
3999         }
4000         var Node = (
4001           /** @class */
4002           function() {
4003             function Node2(key, data) {
4004               this.next = null;
4005               this.key = key;
4006               this.data = data;
4007               this.left = null;
4008               this.right = null;
4009             }
4010             return Node2;
4011           }()
4012         );
4013         function DEFAULT_COMPARE(a, b) {
4014           return a > b ? 1 : a < b ? -1 : 0;
4015         }
4016         function splay(i2, t, comparator) {
4017           var N = new Node(null, null);
4018           var l = N;
4019           var r = N;
4020           while (true) {
4021             var cmp2 = comparator(i2, t.key);
4022             if (cmp2 < 0) {
4023               if (t.left === null)
4024                 break;
4025               if (comparator(i2, t.left.key) < 0) {
4026                 var y = t.left;
4027                 t.left = y.right;
4028                 y.right = t;
4029                 t = y;
4030                 if (t.left === null)
4031                   break;
4032               }
4033               r.left = t;
4034               r = t;
4035               t = t.left;
4036             } else if (cmp2 > 0) {
4037               if (t.right === null)
4038                 break;
4039               if (comparator(i2, t.right.key) > 0) {
4040                 var y = t.right;
4041                 t.right = y.left;
4042                 y.left = t;
4043                 t = y;
4044                 if (t.right === null)
4045                   break;
4046               }
4047               l.right = t;
4048               l = t;
4049               t = t.right;
4050             } else
4051               break;
4052           }
4053           l.right = t.left;
4054           r.left = t.right;
4055           t.left = N.right;
4056           t.right = N.left;
4057           return t;
4058         }
4059         function insert(i2, data, t, comparator) {
4060           var node = new Node(i2, data);
4061           if (t === null) {
4062             node.left = node.right = null;
4063             return node;
4064           }
4065           t = splay(i2, t, comparator);
4066           var cmp2 = comparator(i2, t.key);
4067           if (cmp2 < 0) {
4068             node.left = t.left;
4069             node.right = t;
4070             t.left = null;
4071           } else if (cmp2 >= 0) {
4072             node.right = t.right;
4073             node.left = t;
4074             t.right = null;
4075           }
4076           return node;
4077         }
4078         function split(key, v, comparator) {
4079           var left = null;
4080           var right = null;
4081           if (v) {
4082             v = splay(key, v, comparator);
4083             var cmp2 = comparator(v.key, key);
4084             if (cmp2 === 0) {
4085               left = v.left;
4086               right = v.right;
4087             } else if (cmp2 < 0) {
4088               right = v.right;
4089               v.right = null;
4090               left = v;
4091             } else {
4092               left = v.left;
4093               v.left = null;
4094               right = v;
4095             }
4096           }
4097           return {
4098             left,
4099             right
4100           };
4101         }
4102         function merge2(left, right, comparator) {
4103           if (right === null)
4104             return left;
4105           if (left === null)
4106             return right;
4107           right = splay(left.key, right, comparator);
4108           right.left = left;
4109           return right;
4110         }
4111         function printRow(root3, prefix, isTail, out, printNode) {
4112           if (root3) {
4113             out("" + prefix + (isTail ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ") + printNode(root3) + "\n");
4114             var indent2 = prefix + (isTail ? "    " : "\u2502   ");
4115             if (root3.left)
4116               printRow(root3.left, indent2, false, out, printNode);
4117             if (root3.right)
4118               printRow(root3.right, indent2, true, out, printNode);
4119           }
4120         }
4121         var Tree = (
4122           /** @class */
4123           function() {
4124             function Tree2(comparator) {
4125               if (comparator === void 0) {
4126                 comparator = DEFAULT_COMPARE;
4127               }
4128               this._root = null;
4129               this._size = 0;
4130               this._comparator = comparator;
4131             }
4132             Tree2.prototype.insert = function(key, data) {
4133               this._size++;
4134               return this._root = insert(key, data, this._root, this._comparator);
4135             };
4136             Tree2.prototype.add = function(key, data) {
4137               var node = new Node(key, data);
4138               if (this._root === null) {
4139                 node.left = node.right = null;
4140                 this._size++;
4141                 this._root = node;
4142               }
4143               var comparator = this._comparator;
4144               var t = splay(key, this._root, comparator);
4145               var cmp2 = comparator(key, t.key);
4146               if (cmp2 === 0)
4147                 this._root = t;
4148               else {
4149                 if (cmp2 < 0) {
4150                   node.left = t.left;
4151                   node.right = t;
4152                   t.left = null;
4153                 } else if (cmp2 > 0) {
4154                   node.right = t.right;
4155                   node.left = t;
4156                   t.right = null;
4157                 }
4158                 this._size++;
4159                 this._root = node;
4160               }
4161               return this._root;
4162             };
4163             Tree2.prototype.remove = function(key) {
4164               this._root = this._remove(key, this._root, this._comparator);
4165             };
4166             Tree2.prototype._remove = function(i2, t, comparator) {
4167               var x;
4168               if (t === null)
4169                 return null;
4170               t = splay(i2, t, comparator);
4171               var cmp2 = comparator(i2, t.key);
4172               if (cmp2 === 0) {
4173                 if (t.left === null) {
4174                   x = t.right;
4175                 } else {
4176                   x = splay(i2, t.left, comparator);
4177                   x.right = t.right;
4178                 }
4179                 this._size--;
4180                 return x;
4181               }
4182               return t;
4183             };
4184             Tree2.prototype.pop = function() {
4185               var node = this._root;
4186               if (node) {
4187                 while (node.left) {
4188                   node = node.left;
4189                 }
4190                 this._root = splay(node.key, this._root, this._comparator);
4191                 this._root = this._remove(node.key, this._root, this._comparator);
4192                 return {
4193                   key: node.key,
4194                   data: node.data
4195                 };
4196               }
4197               return null;
4198             };
4199             Tree2.prototype.findStatic = function(key) {
4200               var current = this._root;
4201               var compare = this._comparator;
4202               while (current) {
4203                 var cmp2 = compare(key, current.key);
4204                 if (cmp2 === 0)
4205                   return current;
4206                 else if (cmp2 < 0)
4207                   current = current.left;
4208                 else
4209                   current = current.right;
4210               }
4211               return null;
4212             };
4213             Tree2.prototype.find = function(key) {
4214               if (this._root) {
4215                 this._root = splay(key, this._root, this._comparator);
4216                 if (this._comparator(key, this._root.key) !== 0)
4217                   return null;
4218               }
4219               return this._root;
4220             };
4221             Tree2.prototype.contains = function(key) {
4222               var current = this._root;
4223               var compare = this._comparator;
4224               while (current) {
4225                 var cmp2 = compare(key, current.key);
4226                 if (cmp2 === 0)
4227                   return true;
4228                 else if (cmp2 < 0)
4229                   current = current.left;
4230                 else
4231                   current = current.right;
4232               }
4233               return false;
4234             };
4235             Tree2.prototype.forEach = function(visitor, ctx) {
4236               var current = this._root;
4237               var Q = [];
4238               var done = false;
4239               while (!done) {
4240                 if (current !== null) {
4241                   Q.push(current);
4242                   current = current.left;
4243                 } else {
4244                   if (Q.length !== 0) {
4245                     current = Q.pop();
4246                     visitor.call(ctx, current);
4247                     current = current.right;
4248                   } else
4249                     done = true;
4250                 }
4251               }
4252               return this;
4253             };
4254             Tree2.prototype.range = function(low, high, fn, ctx) {
4255               var Q = [];
4256               var compare = this._comparator;
4257               var node = this._root;
4258               var cmp2;
4259               while (Q.length !== 0 || node) {
4260                 if (node) {
4261                   Q.push(node);
4262                   node = node.left;
4263                 } else {
4264                   node = Q.pop();
4265                   cmp2 = compare(node.key, high);
4266                   if (cmp2 > 0) {
4267                     break;
4268                   } else if (compare(node.key, low) >= 0) {
4269                     if (fn.call(ctx, node))
4270                       return this;
4271                   }
4272                   node = node.right;
4273                 }
4274               }
4275               return this;
4276             };
4277             Tree2.prototype.keys = function() {
4278               var keys2 = [];
4279               this.forEach(function(_a) {
4280                 var key = _a.key;
4281                 return keys2.push(key);
4282               });
4283               return keys2;
4284             };
4285             Tree2.prototype.values = function() {
4286               var values = [];
4287               this.forEach(function(_a) {
4288                 var data = _a.data;
4289                 return values.push(data);
4290               });
4291               return values;
4292             };
4293             Tree2.prototype.min = function() {
4294               if (this._root)
4295                 return this.minNode(this._root).key;
4296               return null;
4297             };
4298             Tree2.prototype.max = function() {
4299               if (this._root)
4300                 return this.maxNode(this._root).key;
4301               return null;
4302             };
4303             Tree2.prototype.minNode = function(t) {
4304               if (t === void 0) {
4305                 t = this._root;
4306               }
4307               if (t)
4308                 while (t.left) {
4309                   t = t.left;
4310                 }
4311               return t;
4312             };
4313             Tree2.prototype.maxNode = function(t) {
4314               if (t === void 0) {
4315                 t = this._root;
4316               }
4317               if (t)
4318                 while (t.right) {
4319                   t = t.right;
4320                 }
4321               return t;
4322             };
4323             Tree2.prototype.at = function(index2) {
4324               var current = this._root;
4325               var done = false;
4326               var i2 = 0;
4327               var Q = [];
4328               while (!done) {
4329                 if (current) {
4330                   Q.push(current);
4331                   current = current.left;
4332                 } else {
4333                   if (Q.length > 0) {
4334                     current = Q.pop();
4335                     if (i2 === index2)
4336                       return current;
4337                     i2++;
4338                     current = current.right;
4339                   } else
4340                     done = true;
4341                 }
4342               }
4343               return null;
4344             };
4345             Tree2.prototype.next = function(d) {
4346               var root3 = this._root;
4347               var successor = null;
4348               if (d.right) {
4349                 successor = d.right;
4350                 while (successor.left) {
4351                   successor = successor.left;
4352                 }
4353                 return successor;
4354               }
4355               var comparator = this._comparator;
4356               while (root3) {
4357                 var cmp2 = comparator(d.key, root3.key);
4358                 if (cmp2 === 0)
4359                   break;
4360                 else if (cmp2 < 0) {
4361                   successor = root3;
4362                   root3 = root3.left;
4363                 } else
4364                   root3 = root3.right;
4365               }
4366               return successor;
4367             };
4368             Tree2.prototype.prev = function(d) {
4369               var root3 = this._root;
4370               var predecessor = null;
4371               if (d.left !== null) {
4372                 predecessor = d.left;
4373                 while (predecessor.right) {
4374                   predecessor = predecessor.right;
4375                 }
4376                 return predecessor;
4377               }
4378               var comparator = this._comparator;
4379               while (root3) {
4380                 var cmp2 = comparator(d.key, root3.key);
4381                 if (cmp2 === 0)
4382                   break;
4383                 else if (cmp2 < 0)
4384                   root3 = root3.left;
4385                 else {
4386                   predecessor = root3;
4387                   root3 = root3.right;
4388                 }
4389               }
4390               return predecessor;
4391             };
4392             Tree2.prototype.clear = function() {
4393               this._root = null;
4394               this._size = 0;
4395               return this;
4396             };
4397             Tree2.prototype.toList = function() {
4398               return toList(this._root);
4399             };
4400             Tree2.prototype.load = function(keys2, values, presort) {
4401               if (values === void 0) {
4402                 values = [];
4403               }
4404               if (presort === void 0) {
4405                 presort = false;
4406               }
4407               var size = keys2.length;
4408               var comparator = this._comparator;
4409               if (presort)
4410                 sort(keys2, values, 0, size - 1, comparator);
4411               if (this._root === null) {
4412                 this._root = loadRecursive(keys2, values, 0, size);
4413                 this._size = size;
4414               } else {
4415                 var mergedList = mergeLists(this.toList(), createList(keys2, values), comparator);
4416                 size = this._size + size;
4417                 this._root = sortedListToBST({
4418                   head: mergedList
4419                 }, 0, size);
4420               }
4421               return this;
4422             };
4423             Tree2.prototype.isEmpty = function() {
4424               return this._root === null;
4425             };
4426             Object.defineProperty(Tree2.prototype, "size", {
4427               get: function get4() {
4428                 return this._size;
4429               },
4430               enumerable: true,
4431               configurable: true
4432             });
4433             Object.defineProperty(Tree2.prototype, "root", {
4434               get: function get4() {
4435                 return this._root;
4436               },
4437               enumerable: true,
4438               configurable: true
4439             });
4440             Tree2.prototype.toString = function(printNode) {
4441               if (printNode === void 0) {
4442                 printNode = function printNode2(n2) {
4443                   return String(n2.key);
4444                 };
4445               }
4446               var out = [];
4447               printRow(this._root, "", true, function(v) {
4448                 return out.push(v);
4449               }, printNode);
4450               return out.join("");
4451             };
4452             Tree2.prototype.update = function(key, newKey, newData) {
4453               var comparator = this._comparator;
4454               var _a = split(key, this._root, comparator), left = _a.left, right = _a.right;
4455               if (comparator(key, newKey) < 0) {
4456                 right = insert(newKey, newData, right, comparator);
4457               } else {
4458                 left = insert(newKey, newData, left, comparator);
4459               }
4460               this._root = merge2(left, right, comparator);
4461             };
4462             Tree2.prototype.split = function(key) {
4463               return split(key, this._root, this._comparator);
4464             };
4465             return Tree2;
4466           }()
4467         );
4468         function loadRecursive(keys2, values, start2, end) {
4469           var size = end - start2;
4470           if (size > 0) {
4471             var middle = start2 + Math.floor(size / 2);
4472             var key = keys2[middle];
4473             var data = values[middle];
4474             var node = new Node(key, data);
4475             node.left = loadRecursive(keys2, values, start2, middle);
4476             node.right = loadRecursive(keys2, values, middle + 1, end);
4477             return node;
4478           }
4479           return null;
4480         }
4481         function createList(keys2, values) {
4482           var head = new Node(null, null);
4483           var p = head;
4484           for (var i2 = 0; i2 < keys2.length; i2++) {
4485             p = p.next = new Node(keys2[i2], values[i2]);
4486           }
4487           p.next = null;
4488           return head.next;
4489         }
4490         function toList(root3) {
4491           var current = root3;
4492           var Q = [];
4493           var done = false;
4494           var head = new Node(null, null);
4495           var p = head;
4496           while (!done) {
4497             if (current) {
4498               Q.push(current);
4499               current = current.left;
4500             } else {
4501               if (Q.length > 0) {
4502                 current = p = p.next = Q.pop();
4503                 current = current.right;
4504               } else
4505                 done = true;
4506             }
4507           }
4508           p.next = null;
4509           return head.next;
4510         }
4511         function sortedListToBST(list, start2, end) {
4512           var size = end - start2;
4513           if (size > 0) {
4514             var middle = start2 + Math.floor(size / 2);
4515             var left = sortedListToBST(list, start2, middle);
4516             var root3 = list.head;
4517             root3.left = left;
4518             list.head = list.head.next;
4519             root3.right = sortedListToBST(list, middle + 1, end);
4520             return root3;
4521           }
4522           return null;
4523         }
4524         function mergeLists(l1, l2, compare) {
4525           var head = new Node(null, null);
4526           var p = head;
4527           var p1 = l1;
4528           var p2 = l2;
4529           while (p1 !== null && p2 !== null) {
4530             if (compare(p1.key, p2.key) < 0) {
4531               p.next = p1;
4532               p1 = p1.next;
4533             } else {
4534               p.next = p2;
4535               p2 = p2.next;
4536             }
4537             p = p.next;
4538           }
4539           if (p1 !== null) {
4540             p.next = p1;
4541           } else if (p2 !== null) {
4542             p.next = p2;
4543           }
4544           return head.next;
4545         }
4546         function sort(keys2, values, left, right, compare) {
4547           if (left >= right)
4548             return;
4549           var pivot = keys2[left + right >> 1];
4550           var i2 = left - 1;
4551           var j2 = right + 1;
4552           while (true) {
4553             do {
4554               i2++;
4555             } while (compare(keys2[i2], pivot) < 0);
4556             do {
4557               j2--;
4558             } while (compare(keys2[j2], pivot) > 0);
4559             if (i2 >= j2)
4560               break;
4561             var tmp = keys2[i2];
4562             keys2[i2] = keys2[j2];
4563             keys2[j2] = tmp;
4564             tmp = values[i2];
4565             values[i2] = values[j2];
4566             values[j2] = tmp;
4567           }
4568           sort(keys2, values, left, j2, compare);
4569           sort(keys2, values, j2 + 1, right, compare);
4570         }
4571         var isInBbox = function isInBbox2(bbox2, point2) {
4572           return bbox2.ll.x <= point2.x && point2.x <= bbox2.ur.x && bbox2.ll.y <= point2.y && point2.y <= bbox2.ur.y;
4573         };
4574         var getBboxOverlap = function getBboxOverlap2(b1, b2) {
4575           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)
4576             return null;
4577           var lowerX = b1.ll.x < b2.ll.x ? b2.ll.x : b1.ll.x;
4578           var upperX = b1.ur.x < b2.ur.x ? b1.ur.x : b2.ur.x;
4579           var lowerY = b1.ll.y < b2.ll.y ? b2.ll.y : b1.ll.y;
4580           var upperY = b1.ur.y < b2.ur.y ? b1.ur.y : b2.ur.y;
4581           return {
4582             ll: {
4583               x: lowerX,
4584               y: lowerY
4585             },
4586             ur: {
4587               x: upperX,
4588               y: upperY
4589             }
4590           };
4591         };
4592         var epsilon3 = Number.EPSILON;
4593         if (epsilon3 === void 0)
4594           epsilon3 = Math.pow(2, -52);
4595         var EPSILON_SQ = epsilon3 * epsilon3;
4596         var cmp = function cmp2(a, b) {
4597           if (-epsilon3 < a && a < epsilon3) {
4598             if (-epsilon3 < b && b < epsilon3) {
4599               return 0;
4600             }
4601           }
4602           var ab = a - b;
4603           if (ab * ab < EPSILON_SQ * a * b) {
4604             return 0;
4605           }
4606           return a < b ? -1 : 1;
4607         };
4608         var PtRounder = /* @__PURE__ */ function() {
4609           function PtRounder2() {
4610             _classCallCheck(this, PtRounder2);
4611             this.reset();
4612           }
4613           _createClass(PtRounder2, [{
4614             key: "reset",
4615             value: function reset() {
4616               this.xRounder = new CoordRounder();
4617               this.yRounder = new CoordRounder();
4618             }
4619           }, {
4620             key: "round",
4621             value: function round(x, y) {
4622               return {
4623                 x: this.xRounder.round(x),
4624                 y: this.yRounder.round(y)
4625               };
4626             }
4627           }]);
4628           return PtRounder2;
4629         }();
4630         var CoordRounder = /* @__PURE__ */ function() {
4631           function CoordRounder2() {
4632             _classCallCheck(this, CoordRounder2);
4633             this.tree = new Tree();
4634             this.round(0);
4635           }
4636           _createClass(CoordRounder2, [{
4637             key: "round",
4638             value: function round(coord2) {
4639               var node = this.tree.add(coord2);
4640               var prevNode = this.tree.prev(node);
4641               if (prevNode !== null && cmp(node.key, prevNode.key) === 0) {
4642                 this.tree.remove(coord2);
4643                 return prevNode.key;
4644               }
4645               var nextNode = this.tree.next(node);
4646               if (nextNode !== null && cmp(node.key, nextNode.key) === 0) {
4647                 this.tree.remove(coord2);
4648                 return nextNode.key;
4649               }
4650               return coord2;
4651             }
4652           }]);
4653           return CoordRounder2;
4654         }();
4655         var rounder = new PtRounder();
4656         var crossProduct = function crossProduct2(a, b) {
4657           return a.x * b.y - a.y * b.x;
4658         };
4659         var dotProduct = function dotProduct2(a, b) {
4660           return a.x * b.x + a.y * b.y;
4661         };
4662         var compareVectorAngles = function compareVectorAngles2(basePt, endPt1, endPt2) {
4663           var v1 = {
4664             x: endPt1.x - basePt.x,
4665             y: endPt1.y - basePt.y
4666           };
4667           var v2 = {
4668             x: endPt2.x - basePt.x,
4669             y: endPt2.y - basePt.y
4670           };
4671           var kross = crossProduct(v1, v2);
4672           return cmp(kross, 0);
4673         };
4674         var length = function length2(v) {
4675           return Math.sqrt(dotProduct(v, v));
4676         };
4677         var sineOfAngle = function sineOfAngle2(pShared, pBase, pAngle) {
4678           var vBase = {
4679             x: pBase.x - pShared.x,
4680             y: pBase.y - pShared.y
4681           };
4682           var vAngle = {
4683             x: pAngle.x - pShared.x,
4684             y: pAngle.y - pShared.y
4685           };
4686           return crossProduct(vAngle, vBase) / length(vAngle) / length(vBase);
4687         };
4688         var cosineOfAngle = function cosineOfAngle2(pShared, pBase, pAngle) {
4689           var vBase = {
4690             x: pBase.x - pShared.x,
4691             y: pBase.y - pShared.y
4692           };
4693           var vAngle = {
4694             x: pAngle.x - pShared.x,
4695             y: pAngle.y - pShared.y
4696           };
4697           return dotProduct(vAngle, vBase) / length(vAngle) / length(vBase);
4698         };
4699         var horizontalIntersection = function horizontalIntersection2(pt, v, y) {
4700           if (v.y === 0)
4701             return null;
4702           return {
4703             x: pt.x + v.x / v.y * (y - pt.y),
4704             y
4705           };
4706         };
4707         var verticalIntersection = function verticalIntersection2(pt, v, x) {
4708           if (v.x === 0)
4709             return null;
4710           return {
4711             x,
4712             y: pt.y + v.y / v.x * (x - pt.x)
4713           };
4714         };
4715         var intersection = function intersection2(pt1, v1, pt2, v2) {
4716           if (v1.x === 0)
4717             return verticalIntersection(pt2, v2, pt1.x);
4718           if (v2.x === 0)
4719             return verticalIntersection(pt1, v1, pt2.x);
4720           if (v1.y === 0)
4721             return horizontalIntersection(pt2, v2, pt1.y);
4722           if (v2.y === 0)
4723             return horizontalIntersection(pt1, v1, pt2.y);
4724           var kross = crossProduct(v1, v2);
4725           if (kross == 0)
4726             return null;
4727           var ve = {
4728             x: pt2.x - pt1.x,
4729             y: pt2.y - pt1.y
4730           };
4731           var d1 = crossProduct(ve, v1) / kross;
4732           var d2 = crossProduct(ve, v2) / kross;
4733           var x12 = pt1.x + d2 * v1.x, x2 = pt2.x + d1 * v2.x;
4734           var y12 = pt1.y + d2 * v1.y, y2 = pt2.y + d1 * v2.y;
4735           var x = (x12 + x2) / 2;
4736           var y = (y12 + y2) / 2;
4737           return {
4738             x,
4739             y
4740           };
4741         };
4742         var SweepEvent = /* @__PURE__ */ function() {
4743           _createClass(SweepEvent2, null, [{
4744             key: "compare",
4745             // for ordering sweep events in the sweep event queue
4746             value: function compare(a, b) {
4747               var ptCmp = SweepEvent2.comparePoints(a.point, b.point);
4748               if (ptCmp !== 0)
4749                 return ptCmp;
4750               if (a.point !== b.point)
4751                 a.link(b);
4752               if (a.isLeft !== b.isLeft)
4753                 return a.isLeft ? 1 : -1;
4754               return Segment.compare(a.segment, b.segment);
4755             }
4756             // for ordering points in sweep line order
4757           }, {
4758             key: "comparePoints",
4759             value: function comparePoints(aPt, bPt) {
4760               if (aPt.x < bPt.x)
4761                 return -1;
4762               if (aPt.x > bPt.x)
4763                 return 1;
4764               if (aPt.y < bPt.y)
4765                 return -1;
4766               if (aPt.y > bPt.y)
4767                 return 1;
4768               return 0;
4769             }
4770             // Warning: 'point' input will be modified and re-used (for performance)
4771           }]);
4772           function SweepEvent2(point2, isLeft) {
4773             _classCallCheck(this, SweepEvent2);
4774             if (point2.events === void 0)
4775               point2.events = [this];
4776             else
4777               point2.events.push(this);
4778             this.point = point2;
4779             this.isLeft = isLeft;
4780           }
4781           _createClass(SweepEvent2, [{
4782             key: "link",
4783             value: function link2(other) {
4784               if (other.point === this.point) {
4785                 throw new Error("Tried to link already linked events");
4786               }
4787               var otherEvents = other.point.events;
4788               for (var i2 = 0, iMax = otherEvents.length; i2 < iMax; i2++) {
4789                 var evt = otherEvents[i2];
4790                 this.point.events.push(evt);
4791                 evt.point = this.point;
4792               }
4793               this.checkForConsuming();
4794             }
4795             /* Do a pass over our linked events and check to see if any pair
4796              * of segments match, and should be consumed. */
4797           }, {
4798             key: "checkForConsuming",
4799             value: function checkForConsuming() {
4800               var numEvents = this.point.events.length;
4801               for (var i2 = 0; i2 < numEvents; i2++) {
4802                 var evt1 = this.point.events[i2];
4803                 if (evt1.segment.consumedBy !== void 0)
4804                   continue;
4805                 for (var j2 = i2 + 1; j2 < numEvents; j2++) {
4806                   var evt2 = this.point.events[j2];
4807                   if (evt2.consumedBy !== void 0)
4808                     continue;
4809                   if (evt1.otherSE.point.events !== evt2.otherSE.point.events)
4810                     continue;
4811                   evt1.segment.consume(evt2.segment);
4812                 }
4813               }
4814             }
4815           }, {
4816             key: "getAvailableLinkedEvents",
4817             value: function getAvailableLinkedEvents() {
4818               var events = [];
4819               for (var i2 = 0, iMax = this.point.events.length; i2 < iMax; i2++) {
4820                 var evt = this.point.events[i2];
4821                 if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {
4822                   events.push(evt);
4823                 }
4824               }
4825               return events;
4826             }
4827             /**
4828              * Returns a comparator function for sorting linked events that will
4829              * favor the event that will give us the smallest left-side angle.
4830              * All ring construction starts as low as possible heading to the right,
4831              * so by always turning left as sharp as possible we'll get polygons
4832              * without uncessary loops & holes.
4833              *
4834              * The comparator function has a compute cache such that it avoids
4835              * re-computing already-computed values.
4836              */
4837           }, {
4838             key: "getLeftmostComparator",
4839             value: function getLeftmostComparator(baseEvent) {
4840               var _this = this;
4841               var cache = /* @__PURE__ */ new Map();
4842               var fillCache = function fillCache2(linkedEvent) {
4843                 var nextEvent = linkedEvent.otherSE;
4844                 cache.set(linkedEvent, {
4845                   sine: sineOfAngle(_this.point, baseEvent.point, nextEvent.point),
4846                   cosine: cosineOfAngle(_this.point, baseEvent.point, nextEvent.point)
4847                 });
4848               };
4849               return function(a, b) {
4850                 if (!cache.has(a))
4851                   fillCache(a);
4852                 if (!cache.has(b))
4853                   fillCache(b);
4854                 var _cache$get = cache.get(a), asine = _cache$get.sine, acosine = _cache$get.cosine;
4855                 var _cache$get2 = cache.get(b), bsine = _cache$get2.sine, bcosine = _cache$get2.cosine;
4856                 if (asine >= 0 && bsine >= 0) {
4857                   if (acosine < bcosine)
4858                     return 1;
4859                   if (acosine > bcosine)
4860                     return -1;
4861                   return 0;
4862                 }
4863                 if (asine < 0 && bsine < 0) {
4864                   if (acosine < bcosine)
4865                     return -1;
4866                   if (acosine > bcosine)
4867                     return 1;
4868                   return 0;
4869                 }
4870                 if (bsine < asine)
4871                   return -1;
4872                 if (bsine > asine)
4873                   return 1;
4874                 return 0;
4875               };
4876             }
4877           }]);
4878           return SweepEvent2;
4879         }();
4880         var segmentId = 0;
4881         var Segment = /* @__PURE__ */ function() {
4882           _createClass(Segment2, null, [{
4883             key: "compare",
4884             /* This compare() function is for ordering segments in the sweep
4885              * line tree, and does so according to the following criteria:
4886              *
4887              * Consider the vertical line that lies an infinestimal step to the
4888              * right of the right-more of the two left endpoints of the input
4889              * segments. Imagine slowly moving a point up from negative infinity
4890              * in the increasing y direction. Which of the two segments will that
4891              * point intersect first? That segment comes 'before' the other one.
4892              *
4893              * If neither segment would be intersected by such a line, (if one
4894              * or more of the segments are vertical) then the line to be considered
4895              * is directly on the right-more of the two left inputs.
4896              */
4897             value: function compare(a, b) {
4898               var alx = a.leftSE.point.x;
4899               var blx = b.leftSE.point.x;
4900               var arx = a.rightSE.point.x;
4901               var brx = b.rightSE.point.x;
4902               if (brx < alx)
4903                 return 1;
4904               if (arx < blx)
4905                 return -1;
4906               var aly = a.leftSE.point.y;
4907               var bly = b.leftSE.point.y;
4908               var ary = a.rightSE.point.y;
4909               var bry = b.rightSE.point.y;
4910               if (alx < blx) {
4911                 if (bly < aly && bly < ary)
4912                   return 1;
4913                 if (bly > aly && bly > ary)
4914                   return -1;
4915                 var aCmpBLeft = a.comparePoint(b.leftSE.point);
4916                 if (aCmpBLeft < 0)
4917                   return 1;
4918                 if (aCmpBLeft > 0)
4919                   return -1;
4920                 var bCmpARight = b.comparePoint(a.rightSE.point);
4921                 if (bCmpARight !== 0)
4922                   return bCmpARight;
4923                 return -1;
4924               }
4925               if (alx > blx) {
4926                 if (aly < bly && aly < bry)
4927                   return -1;
4928                 if (aly > bly && aly > bry)
4929                   return 1;
4930                 var bCmpALeft = b.comparePoint(a.leftSE.point);
4931                 if (bCmpALeft !== 0)
4932                   return bCmpALeft;
4933                 var aCmpBRight = a.comparePoint(b.rightSE.point);
4934                 if (aCmpBRight < 0)
4935                   return 1;
4936                 if (aCmpBRight > 0)
4937                   return -1;
4938                 return 1;
4939               }
4940               if (aly < bly)
4941                 return -1;
4942               if (aly > bly)
4943                 return 1;
4944               if (arx < brx) {
4945                 var _bCmpARight = b.comparePoint(a.rightSE.point);
4946                 if (_bCmpARight !== 0)
4947                   return _bCmpARight;
4948               }
4949               if (arx > brx) {
4950                 var _aCmpBRight = a.comparePoint(b.rightSE.point);
4951                 if (_aCmpBRight < 0)
4952                   return 1;
4953                 if (_aCmpBRight > 0)
4954                   return -1;
4955               }
4956               if (arx !== brx) {
4957                 var ay = ary - aly;
4958                 var ax = arx - alx;
4959                 var by = bry - bly;
4960                 var bx = brx - blx;
4961                 if (ay > ax && by < bx)
4962                   return 1;
4963                 if (ay < ax && by > bx)
4964                   return -1;
4965               }
4966               if (arx > brx)
4967                 return 1;
4968               if (arx < brx)
4969                 return -1;
4970               if (ary < bry)
4971                 return -1;
4972               if (ary > bry)
4973                 return 1;
4974               if (a.id < b.id)
4975                 return -1;
4976               if (a.id > b.id)
4977                 return 1;
4978               return 0;
4979             }
4980             /* Warning: a reference to ringWindings input will be stored,
4981              *  and possibly will be later modified */
4982           }]);
4983           function Segment2(leftSE, rightSE, rings, windings) {
4984             _classCallCheck(this, Segment2);
4985             this.id = ++segmentId;
4986             this.leftSE = leftSE;
4987             leftSE.segment = this;
4988             leftSE.otherSE = rightSE;
4989             this.rightSE = rightSE;
4990             rightSE.segment = this;
4991             rightSE.otherSE = leftSE;
4992             this.rings = rings;
4993             this.windings = windings;
4994           }
4995           _createClass(Segment2, [{
4996             key: "replaceRightSE",
4997             /* When a segment is split, the rightSE is replaced with a new sweep event */
4998             value: function replaceRightSE(newRightSE) {
4999               this.rightSE = newRightSE;
5000               this.rightSE.segment = this;
5001               this.rightSE.otherSE = this.leftSE;
5002               this.leftSE.otherSE = this.rightSE;
5003             }
5004           }, {
5005             key: "bbox",
5006             value: function bbox2() {
5007               var y12 = this.leftSE.point.y;
5008               var y2 = this.rightSE.point.y;
5009               return {
5010                 ll: {
5011                   x: this.leftSE.point.x,
5012                   y: y12 < y2 ? y12 : y2
5013                 },
5014                 ur: {
5015                   x: this.rightSE.point.x,
5016                   y: y12 > y2 ? y12 : y2
5017                 }
5018               };
5019             }
5020             /* A vector from the left point to the right */
5021           }, {
5022             key: "vector",
5023             value: function vector() {
5024               return {
5025                 x: this.rightSE.point.x - this.leftSE.point.x,
5026                 y: this.rightSE.point.y - this.leftSE.point.y
5027               };
5028             }
5029           }, {
5030             key: "isAnEndpoint",
5031             value: function isAnEndpoint(pt) {
5032               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;
5033             }
5034             /* Compare this segment with a point.
5035              *
5036              * A point P is considered to be colinear to a segment if there
5037              * exists a distance D such that if we travel along the segment
5038              * from one * endpoint towards the other a distance D, we find
5039              * ourselves at point P.
5040              *
5041              * Return value indicates:
5042              *
5043              *   1: point lies above the segment (to the left of vertical)
5044              *   0: point is colinear to segment
5045              *  -1: point lies below the segment (to the right of vertical)
5046              */
5047           }, {
5048             key: "comparePoint",
5049             value: function comparePoint(point2) {
5050               if (this.isAnEndpoint(point2))
5051                 return 0;
5052               var lPt = this.leftSE.point;
5053               var rPt = this.rightSE.point;
5054               var v = this.vector();
5055               if (lPt.x === rPt.x) {
5056                 if (point2.x === lPt.x)
5057                   return 0;
5058                 return point2.x < lPt.x ? 1 : -1;
5059               }
5060               var yDist = (point2.y - lPt.y) / v.y;
5061               var xFromYDist = lPt.x + yDist * v.x;
5062               if (point2.x === xFromYDist)
5063                 return 0;
5064               var xDist = (point2.x - lPt.x) / v.x;
5065               var yFromXDist = lPt.y + xDist * v.y;
5066               if (point2.y === yFromXDist)
5067                 return 0;
5068               return point2.y < yFromXDist ? -1 : 1;
5069             }
5070             /**
5071              * Given another segment, returns the first non-trivial intersection
5072              * between the two segments (in terms of sweep line ordering), if it exists.
5073              *
5074              * A 'non-trivial' intersection is one that will cause one or both of the
5075              * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:
5076              *
5077              *   * endpoint of segA with endpoint of segB --> trivial
5078              *   * endpoint of segA with point along segB --> non-trivial
5079              *   * endpoint of segB with point along segA --> non-trivial
5080              *   * point along segA with point along segB --> non-trivial
5081              *
5082              * If no non-trivial intersection exists, return null
5083              * Else, return null.
5084              */
5085           }, {
5086             key: "getIntersection",
5087             value: function getIntersection(other) {
5088               var tBbox = this.bbox();
5089               var oBbox = other.bbox();
5090               var bboxOverlap = getBboxOverlap(tBbox, oBbox);
5091               if (bboxOverlap === null)
5092                 return null;
5093               var tlp = this.leftSE.point;
5094               var trp = this.rightSE.point;
5095               var olp = other.leftSE.point;
5096               var orp = other.rightSE.point;
5097               var touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0;
5098               var touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0;
5099               var touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0;
5100               var touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0;
5101               if (touchesThisLSE && touchesOtherLSE) {
5102                 if (touchesThisRSE && !touchesOtherRSE)
5103                   return trp;
5104                 if (!touchesThisRSE && touchesOtherRSE)
5105                   return orp;
5106                 return null;
5107               }
5108               if (touchesThisLSE) {
5109                 if (touchesOtherRSE) {
5110                   if (tlp.x === orp.x && tlp.y === orp.y)
5111                     return null;
5112                 }
5113                 return tlp;
5114               }
5115               if (touchesOtherLSE) {
5116                 if (touchesThisRSE) {
5117                   if (trp.x === olp.x && trp.y === olp.y)
5118                     return null;
5119                 }
5120                 return olp;
5121               }
5122               if (touchesThisRSE && touchesOtherRSE)
5123                 return null;
5124               if (touchesThisRSE)
5125                 return trp;
5126               if (touchesOtherRSE)
5127                 return orp;
5128               var pt = intersection(tlp, this.vector(), olp, other.vector());
5129               if (pt === null)
5130                 return null;
5131               if (!isInBbox(bboxOverlap, pt))
5132                 return null;
5133               return rounder.round(pt.x, pt.y);
5134             }
5135             /**
5136              * Split the given segment into multiple segments on the given points.
5137              *  * Each existing segment will retain its leftSE and a new rightSE will be
5138              *    generated for it.
5139              *  * A new segment will be generated which will adopt the original segment's
5140              *    rightSE, and a new leftSE will be generated for it.
5141              *  * If there are more than two points given to split on, new segments
5142              *    in the middle will be generated with new leftSE and rightSE's.
5143              *  * An array of the newly generated SweepEvents will be returned.
5144              *
5145              * Warning: input array of points is modified
5146              */
5147           }, {
5148             key: "split",
5149             value: function split2(point2) {
5150               var newEvents = [];
5151               var alreadyLinked = point2.events !== void 0;
5152               var newLeftSE = new SweepEvent(point2, true);
5153               var newRightSE = new SweepEvent(point2, false);
5154               var oldRightSE = this.rightSE;
5155               this.replaceRightSE(newRightSE);
5156               newEvents.push(newRightSE);
5157               newEvents.push(newLeftSE);
5158               var newSeg = new Segment2(newLeftSE, oldRightSE, this.rings.slice(), this.windings.slice());
5159               if (SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0) {
5160                 newSeg.swapEvents();
5161               }
5162               if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {
5163                 this.swapEvents();
5164               }
5165               if (alreadyLinked) {
5166                 newLeftSE.checkForConsuming();
5167                 newRightSE.checkForConsuming();
5168               }
5169               return newEvents;
5170             }
5171             /* Swap which event is left and right */
5172           }, {
5173             key: "swapEvents",
5174             value: function swapEvents() {
5175               var tmpEvt = this.rightSE;
5176               this.rightSE = this.leftSE;
5177               this.leftSE = tmpEvt;
5178               this.leftSE.isLeft = true;
5179               this.rightSE.isLeft = false;
5180               for (var i2 = 0, iMax = this.windings.length; i2 < iMax; i2++) {
5181                 this.windings[i2] *= -1;
5182               }
5183             }
5184             /* Consume another segment. We take their rings under our wing
5185              * and mark them as consumed. Use for perfectly overlapping segments */
5186           }, {
5187             key: "consume",
5188             value: function consume(other) {
5189               var consumer = this;
5190               var consumee = other;
5191               while (consumer.consumedBy) {
5192                 consumer = consumer.consumedBy;
5193               }
5194               while (consumee.consumedBy) {
5195                 consumee = consumee.consumedBy;
5196               }
5197               var cmp2 = Segment2.compare(consumer, consumee);
5198               if (cmp2 === 0)
5199                 return;
5200               if (cmp2 > 0) {
5201                 var tmp = consumer;
5202                 consumer = consumee;
5203                 consumee = tmp;
5204               }
5205               if (consumer.prev === consumee) {
5206                 var _tmp = consumer;
5207                 consumer = consumee;
5208                 consumee = _tmp;
5209               }
5210               for (var i2 = 0, iMax = consumee.rings.length; i2 < iMax; i2++) {
5211                 var ring = consumee.rings[i2];
5212                 var winding = consumee.windings[i2];
5213                 var index2 = consumer.rings.indexOf(ring);
5214                 if (index2 === -1) {
5215                   consumer.rings.push(ring);
5216                   consumer.windings.push(winding);
5217                 } else
5218                   consumer.windings[index2] += winding;
5219               }
5220               consumee.rings = null;
5221               consumee.windings = null;
5222               consumee.consumedBy = consumer;
5223               consumee.leftSE.consumedBy = consumer.leftSE;
5224               consumee.rightSE.consumedBy = consumer.rightSE;
5225             }
5226             /* The first segment previous segment chain that is in the result */
5227           }, {
5228             key: "prevInResult",
5229             value: function prevInResult() {
5230               if (this._prevInResult !== void 0)
5231                 return this._prevInResult;
5232               if (!this.prev)
5233                 this._prevInResult = null;
5234               else if (this.prev.isInResult())
5235                 this._prevInResult = this.prev;
5236               else
5237                 this._prevInResult = this.prev.prevInResult();
5238               return this._prevInResult;
5239             }
5240           }, {
5241             key: "beforeState",
5242             value: function beforeState() {
5243               if (this._beforeState !== void 0)
5244                 return this._beforeState;
5245               if (!this.prev)
5246                 this._beforeState = {
5247                   rings: [],
5248                   windings: [],
5249                   multiPolys: []
5250                 };
5251               else {
5252                 var seg = this.prev.consumedBy || this.prev;
5253                 this._beforeState = seg.afterState();
5254               }
5255               return this._beforeState;
5256             }
5257           }, {
5258             key: "afterState",
5259             value: function afterState() {
5260               if (this._afterState !== void 0)
5261                 return this._afterState;
5262               var beforeState = this.beforeState();
5263               this._afterState = {
5264                 rings: beforeState.rings.slice(0),
5265                 windings: beforeState.windings.slice(0),
5266                 multiPolys: []
5267               };
5268               var ringsAfter = this._afterState.rings;
5269               var windingsAfter = this._afterState.windings;
5270               var mpsAfter = this._afterState.multiPolys;
5271               for (var i2 = 0, iMax = this.rings.length; i2 < iMax; i2++) {
5272                 var ring = this.rings[i2];
5273                 var winding = this.windings[i2];
5274                 var index2 = ringsAfter.indexOf(ring);
5275                 if (index2 === -1) {
5276                   ringsAfter.push(ring);
5277                   windingsAfter.push(winding);
5278                 } else
5279                   windingsAfter[index2] += winding;
5280               }
5281               var polysAfter = [];
5282               var polysExclude = [];
5283               for (var _i = 0, _iMax = ringsAfter.length; _i < _iMax; _i++) {
5284                 if (windingsAfter[_i] === 0)
5285                   continue;
5286                 var _ring = ringsAfter[_i];
5287                 var poly = _ring.poly;
5288                 if (polysExclude.indexOf(poly) !== -1)
5289                   continue;
5290                 if (_ring.isExterior)
5291                   polysAfter.push(poly);
5292                 else {
5293                   if (polysExclude.indexOf(poly) === -1)
5294                     polysExclude.push(poly);
5295                   var _index = polysAfter.indexOf(_ring.poly);
5296                   if (_index !== -1)
5297                     polysAfter.splice(_index, 1);
5298                 }
5299               }
5300               for (var _i2 = 0, _iMax2 = polysAfter.length; _i2 < _iMax2; _i2++) {
5301                 var mp = polysAfter[_i2].multiPoly;
5302                 if (mpsAfter.indexOf(mp) === -1)
5303                   mpsAfter.push(mp);
5304               }
5305               return this._afterState;
5306             }
5307             /* Is this segment part of the final result? */
5308           }, {
5309             key: "isInResult",
5310             value: function isInResult() {
5311               if (this.consumedBy)
5312                 return false;
5313               if (this._isInResult !== void 0)
5314                 return this._isInResult;
5315               var mpsBefore = this.beforeState().multiPolys;
5316               var mpsAfter = this.afterState().multiPolys;
5317               switch (operation.type) {
5318                 case "union": {
5319                   var noBefores = mpsBefore.length === 0;
5320                   var noAfters = mpsAfter.length === 0;
5321                   this._isInResult = noBefores !== noAfters;
5322                   break;
5323                 }
5324                 case "intersection": {
5325                   var least;
5326                   var most;
5327                   if (mpsBefore.length < mpsAfter.length) {
5328                     least = mpsBefore.length;
5329                     most = mpsAfter.length;
5330                   } else {
5331                     least = mpsAfter.length;
5332                     most = mpsBefore.length;
5333                   }
5334                   this._isInResult = most === operation.numMultiPolys && least < most;
5335                   break;
5336                 }
5337                 case "xor": {
5338                   var diff = Math.abs(mpsBefore.length - mpsAfter.length);
5339                   this._isInResult = diff % 2 === 1;
5340                   break;
5341                 }
5342                 case "difference": {
5343                   var isJustSubject = function isJustSubject2(mps) {
5344                     return mps.length === 1 && mps[0].isSubject;
5345                   };
5346                   this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter);
5347                   break;
5348                 }
5349                 default:
5350                   throw new Error("Unrecognized operation type found ".concat(operation.type));
5351               }
5352               return this._isInResult;
5353             }
5354           }], [{
5355             key: "fromRing",
5356             value: function fromRing(pt1, pt2, ring) {
5357               var leftPt, rightPt, winding;
5358               var cmpPts = SweepEvent.comparePoints(pt1, pt2);
5359               if (cmpPts < 0) {
5360                 leftPt = pt1;
5361                 rightPt = pt2;
5362                 winding = 1;
5363               } else if (cmpPts > 0) {
5364                 leftPt = pt2;
5365                 rightPt = pt1;
5366                 winding = -1;
5367               } else
5368                 throw new Error("Tried to create degenerate segment at [".concat(pt1.x, ", ").concat(pt1.y, "]"));
5369               var leftSE = new SweepEvent(leftPt, true);
5370               var rightSE = new SweepEvent(rightPt, false);
5371               return new Segment2(leftSE, rightSE, [ring], [winding]);
5372             }
5373           }]);
5374           return Segment2;
5375         }();
5376         var RingIn = /* @__PURE__ */ function() {
5377           function RingIn2(geomRing, poly, isExterior) {
5378             _classCallCheck(this, RingIn2);
5379             if (!Array.isArray(geomRing) || geomRing.length === 0) {
5380               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5381             }
5382             this.poly = poly;
5383             this.isExterior = isExterior;
5384             this.segments = [];
5385             if (typeof geomRing[0][0] !== "number" || typeof geomRing[0][1] !== "number") {
5386               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5387             }
5388             var firstPoint = rounder.round(geomRing[0][0], geomRing[0][1]);
5389             this.bbox = {
5390               ll: {
5391                 x: firstPoint.x,
5392                 y: firstPoint.y
5393               },
5394               ur: {
5395                 x: firstPoint.x,
5396                 y: firstPoint.y
5397               }
5398             };
5399             var prevPoint = firstPoint;
5400             for (var i2 = 1, iMax = geomRing.length; i2 < iMax; i2++) {
5401               if (typeof geomRing[i2][0] !== "number" || typeof geomRing[i2][1] !== "number") {
5402                 throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5403               }
5404               var point2 = rounder.round(geomRing[i2][0], geomRing[i2][1]);
5405               if (point2.x === prevPoint.x && point2.y === prevPoint.y)
5406                 continue;
5407               this.segments.push(Segment.fromRing(prevPoint, point2, this));
5408               if (point2.x < this.bbox.ll.x)
5409                 this.bbox.ll.x = point2.x;
5410               if (point2.y < this.bbox.ll.y)
5411                 this.bbox.ll.y = point2.y;
5412               if (point2.x > this.bbox.ur.x)
5413                 this.bbox.ur.x = point2.x;
5414               if (point2.y > this.bbox.ur.y)
5415                 this.bbox.ur.y = point2.y;
5416               prevPoint = point2;
5417             }
5418             if (firstPoint.x !== prevPoint.x || firstPoint.y !== prevPoint.y) {
5419               this.segments.push(Segment.fromRing(prevPoint, firstPoint, this));
5420             }
5421           }
5422           _createClass(RingIn2, [{
5423             key: "getSweepEvents",
5424             value: function getSweepEvents() {
5425               var sweepEvents = [];
5426               for (var i2 = 0, iMax = this.segments.length; i2 < iMax; i2++) {
5427                 var segment = this.segments[i2];
5428                 sweepEvents.push(segment.leftSE);
5429                 sweepEvents.push(segment.rightSE);
5430               }
5431               return sweepEvents;
5432             }
5433           }]);
5434           return RingIn2;
5435         }();
5436         var PolyIn = /* @__PURE__ */ function() {
5437           function PolyIn2(geomPoly, multiPoly) {
5438             _classCallCheck(this, PolyIn2);
5439             if (!Array.isArray(geomPoly)) {
5440               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5441             }
5442             this.exteriorRing = new RingIn(geomPoly[0], this, true);
5443             this.bbox = {
5444               ll: {
5445                 x: this.exteriorRing.bbox.ll.x,
5446                 y: this.exteriorRing.bbox.ll.y
5447               },
5448               ur: {
5449                 x: this.exteriorRing.bbox.ur.x,
5450                 y: this.exteriorRing.bbox.ur.y
5451               }
5452             };
5453             this.interiorRings = [];
5454             for (var i2 = 1, iMax = geomPoly.length; i2 < iMax; i2++) {
5455               var ring = new RingIn(geomPoly[i2], this, false);
5456               if (ring.bbox.ll.x < this.bbox.ll.x)
5457                 this.bbox.ll.x = ring.bbox.ll.x;
5458               if (ring.bbox.ll.y < this.bbox.ll.y)
5459                 this.bbox.ll.y = ring.bbox.ll.y;
5460               if (ring.bbox.ur.x > this.bbox.ur.x)
5461                 this.bbox.ur.x = ring.bbox.ur.x;
5462               if (ring.bbox.ur.y > this.bbox.ur.y)
5463                 this.bbox.ur.y = ring.bbox.ur.y;
5464               this.interiorRings.push(ring);
5465             }
5466             this.multiPoly = multiPoly;
5467           }
5468           _createClass(PolyIn2, [{
5469             key: "getSweepEvents",
5470             value: function getSweepEvents() {
5471               var sweepEvents = this.exteriorRing.getSweepEvents();
5472               for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) {
5473                 var ringSweepEvents = this.interiorRings[i2].getSweepEvents();
5474                 for (var j2 = 0, jMax = ringSweepEvents.length; j2 < jMax; j2++) {
5475                   sweepEvents.push(ringSweepEvents[j2]);
5476                 }
5477               }
5478               return sweepEvents;
5479             }
5480           }]);
5481           return PolyIn2;
5482         }();
5483         var MultiPolyIn = /* @__PURE__ */ function() {
5484           function MultiPolyIn2(geom, isSubject) {
5485             _classCallCheck(this, MultiPolyIn2);
5486             if (!Array.isArray(geom)) {
5487               throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
5488             }
5489             try {
5490               if (typeof geom[0][0][0] === "number")
5491                 geom = [geom];
5492             } catch (ex) {
5493             }
5494             this.polys = [];
5495             this.bbox = {
5496               ll: {
5497                 x: Number.POSITIVE_INFINITY,
5498                 y: Number.POSITIVE_INFINITY
5499               },
5500               ur: {
5501                 x: Number.NEGATIVE_INFINITY,
5502                 y: Number.NEGATIVE_INFINITY
5503               }
5504             };
5505             for (var i2 = 0, iMax = geom.length; i2 < iMax; i2++) {
5506               var poly = new PolyIn(geom[i2], this);
5507               if (poly.bbox.ll.x < this.bbox.ll.x)
5508                 this.bbox.ll.x = poly.bbox.ll.x;
5509               if (poly.bbox.ll.y < this.bbox.ll.y)
5510                 this.bbox.ll.y = poly.bbox.ll.y;
5511               if (poly.bbox.ur.x > this.bbox.ur.x)
5512                 this.bbox.ur.x = poly.bbox.ur.x;
5513               if (poly.bbox.ur.y > this.bbox.ur.y)
5514                 this.bbox.ur.y = poly.bbox.ur.y;
5515               this.polys.push(poly);
5516             }
5517             this.isSubject = isSubject;
5518           }
5519           _createClass(MultiPolyIn2, [{
5520             key: "getSweepEvents",
5521             value: function getSweepEvents() {
5522               var sweepEvents = [];
5523               for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) {
5524                 var polySweepEvents = this.polys[i2].getSweepEvents();
5525                 for (var j2 = 0, jMax = polySweepEvents.length; j2 < jMax; j2++) {
5526                   sweepEvents.push(polySweepEvents[j2]);
5527                 }
5528               }
5529               return sweepEvents;
5530             }
5531           }]);
5532           return MultiPolyIn2;
5533         }();
5534         var RingOut = /* @__PURE__ */ function() {
5535           _createClass(RingOut2, null, [{
5536             key: "factory",
5537             /* Given the segments from the sweep line pass, compute & return a series
5538              * of closed rings from all the segments marked to be part of the result */
5539             value: function factory(allSegments) {
5540               var ringsOut = [];
5541               for (var i2 = 0, iMax = allSegments.length; i2 < iMax; i2++) {
5542                 var segment = allSegments[i2];
5543                 if (!segment.isInResult() || segment.ringOut)
5544                   continue;
5545                 var prevEvent = null;
5546                 var event = segment.leftSE;
5547                 var nextEvent = segment.rightSE;
5548                 var events = [event];
5549                 var startingPoint = event.point;
5550                 var intersectionLEs = [];
5551                 while (true) {
5552                   prevEvent = event;
5553                   event = nextEvent;
5554                   events.push(event);
5555                   if (event.point === startingPoint)
5556                     break;
5557                   while (true) {
5558                     var availableLEs = event.getAvailableLinkedEvents();
5559                     if (availableLEs.length === 0) {
5560                       var firstPt = events[0].point;
5561                       var lastPt = events[events.length - 1].point;
5562                       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, "]."));
5563                     }
5564                     if (availableLEs.length === 1) {
5565                       nextEvent = availableLEs[0].otherSE;
5566                       break;
5567                     }
5568                     var indexLE = null;
5569                     for (var j2 = 0, jMax = intersectionLEs.length; j2 < jMax; j2++) {
5570                       if (intersectionLEs[j2].point === event.point) {
5571                         indexLE = j2;
5572                         break;
5573                       }
5574                     }
5575                     if (indexLE !== null) {
5576                       var intersectionLE = intersectionLEs.splice(indexLE)[0];
5577                       var ringEvents = events.splice(intersectionLE.index);
5578                       ringEvents.unshift(ringEvents[0].otherSE);
5579                       ringsOut.push(new RingOut2(ringEvents.reverse()));
5580                       continue;
5581                     }
5582                     intersectionLEs.push({
5583                       index: events.length,
5584                       point: event.point
5585                     });
5586                     var comparator = event.getLeftmostComparator(prevEvent);
5587                     nextEvent = availableLEs.sort(comparator)[0].otherSE;
5588                     break;
5589                   }
5590                 }
5591                 ringsOut.push(new RingOut2(events));
5592               }
5593               return ringsOut;
5594             }
5595           }]);
5596           function RingOut2(events) {
5597             _classCallCheck(this, RingOut2);
5598             this.events = events;
5599             for (var i2 = 0, iMax = events.length; i2 < iMax; i2++) {
5600               events[i2].segment.ringOut = this;
5601             }
5602             this.poly = null;
5603           }
5604           _createClass(RingOut2, [{
5605             key: "getGeom",
5606             value: function getGeom2() {
5607               var prevPt = this.events[0].point;
5608               var points = [prevPt];
5609               for (var i2 = 1, iMax = this.events.length - 1; i2 < iMax; i2++) {
5610                 var _pt = this.events[i2].point;
5611                 var _nextPt = this.events[i2 + 1].point;
5612                 if (compareVectorAngles(_pt, prevPt, _nextPt) === 0)
5613                   continue;
5614                 points.push(_pt);
5615                 prevPt = _pt;
5616               }
5617               if (points.length === 1)
5618                 return null;
5619               var pt = points[0];
5620               var nextPt = points[1];
5621               if (compareVectorAngles(pt, prevPt, nextPt) === 0)
5622                 points.shift();
5623               points.push(points[0]);
5624               var step = this.isExteriorRing() ? 1 : -1;
5625               var iStart = this.isExteriorRing() ? 0 : points.length - 1;
5626               var iEnd = this.isExteriorRing() ? points.length : -1;
5627               var orderedPoints = [];
5628               for (var _i = iStart; _i != iEnd; _i += step) {
5629                 orderedPoints.push([points[_i].x, points[_i].y]);
5630               }
5631               return orderedPoints;
5632             }
5633           }, {
5634             key: "isExteriorRing",
5635             value: function isExteriorRing() {
5636               if (this._isExteriorRing === void 0) {
5637                 var enclosing = this.enclosingRing();
5638                 this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true;
5639               }
5640               return this._isExteriorRing;
5641             }
5642           }, {
5643             key: "enclosingRing",
5644             value: function enclosingRing() {
5645               if (this._enclosingRing === void 0) {
5646                 this._enclosingRing = this._calcEnclosingRing();
5647               }
5648               return this._enclosingRing;
5649             }
5650             /* Returns the ring that encloses this one, if any */
5651           }, {
5652             key: "_calcEnclosingRing",
5653             value: function _calcEnclosingRing() {
5654               var leftMostEvt = this.events[0];
5655               for (var i2 = 1, iMax = this.events.length; i2 < iMax; i2++) {
5656                 var evt = this.events[i2];
5657                 if (SweepEvent.compare(leftMostEvt, evt) > 0)
5658                   leftMostEvt = evt;
5659               }
5660               var prevSeg = leftMostEvt.segment.prevInResult();
5661               var prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
5662               while (true) {
5663                 if (!prevSeg)
5664                   return null;
5665                 if (!prevPrevSeg)
5666                   return prevSeg.ringOut;
5667                 if (prevPrevSeg.ringOut !== prevSeg.ringOut) {
5668                   if (prevPrevSeg.ringOut.enclosingRing() !== prevSeg.ringOut) {
5669                     return prevSeg.ringOut;
5670                   } else
5671                     return prevSeg.ringOut.enclosingRing();
5672                 }
5673                 prevSeg = prevPrevSeg.prevInResult();
5674                 prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null;
5675               }
5676             }
5677           }]);
5678           return RingOut2;
5679         }();
5680         var PolyOut = /* @__PURE__ */ function() {
5681           function PolyOut2(exteriorRing) {
5682             _classCallCheck(this, PolyOut2);
5683             this.exteriorRing = exteriorRing;
5684             exteriorRing.poly = this;
5685             this.interiorRings = [];
5686           }
5687           _createClass(PolyOut2, [{
5688             key: "addInterior",
5689             value: function addInterior(ring) {
5690               this.interiorRings.push(ring);
5691               ring.poly = this;
5692             }
5693           }, {
5694             key: "getGeom",
5695             value: function getGeom2() {
5696               var geom = [this.exteriorRing.getGeom()];
5697               if (geom[0] === null)
5698                 return null;
5699               for (var i2 = 0, iMax = this.interiorRings.length; i2 < iMax; i2++) {
5700                 var ringGeom = this.interiorRings[i2].getGeom();
5701                 if (ringGeom === null)
5702                   continue;
5703                 geom.push(ringGeom);
5704               }
5705               return geom;
5706             }
5707           }]);
5708           return PolyOut2;
5709         }();
5710         var MultiPolyOut = /* @__PURE__ */ function() {
5711           function MultiPolyOut2(rings) {
5712             _classCallCheck(this, MultiPolyOut2);
5713             this.rings = rings;
5714             this.polys = this._composePolys(rings);
5715           }
5716           _createClass(MultiPolyOut2, [{
5717             key: "getGeom",
5718             value: function getGeom2() {
5719               var geom = [];
5720               for (var i2 = 0, iMax = this.polys.length; i2 < iMax; i2++) {
5721                 var polyGeom = this.polys[i2].getGeom();
5722                 if (polyGeom === null)
5723                   continue;
5724                 geom.push(polyGeom);
5725               }
5726               return geom;
5727             }
5728           }, {
5729             key: "_composePolys",
5730             value: function _composePolys(rings) {
5731               var polys = [];
5732               for (var i2 = 0, iMax = rings.length; i2 < iMax; i2++) {
5733                 var ring = rings[i2];
5734                 if (ring.poly)
5735                   continue;
5736                 if (ring.isExteriorRing())
5737                   polys.push(new PolyOut(ring));
5738                 else {
5739                   var enclosingRing = ring.enclosingRing();
5740                   if (!enclosingRing.poly)
5741                     polys.push(new PolyOut(enclosingRing));
5742                   enclosingRing.poly.addInterior(ring);
5743                 }
5744               }
5745               return polys;
5746             }
5747           }]);
5748           return MultiPolyOut2;
5749         }();
5750         var SweepLine = /* @__PURE__ */ function() {
5751           function SweepLine2(queue) {
5752             var comparator = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Segment.compare;
5753             _classCallCheck(this, SweepLine2);
5754             this.queue = queue;
5755             this.tree = new Tree(comparator);
5756             this.segments = [];
5757           }
5758           _createClass(SweepLine2, [{
5759             key: "process",
5760             value: function process2(event) {
5761               var segment = event.segment;
5762               var newEvents = [];
5763               if (event.consumedBy) {
5764                 if (event.isLeft)
5765                   this.queue.remove(event.otherSE);
5766                 else
5767                   this.tree.remove(segment);
5768                 return newEvents;
5769               }
5770               var node = event.isLeft ? this.tree.insert(segment) : this.tree.find(segment);
5771               if (!node)
5772                 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.");
5773               var prevNode = node;
5774               var nextNode = node;
5775               var prevSeg = void 0;
5776               var nextSeg = void 0;
5777               while (prevSeg === void 0) {
5778                 prevNode = this.tree.prev(prevNode);
5779                 if (prevNode === null)
5780                   prevSeg = null;
5781                 else if (prevNode.key.consumedBy === void 0)
5782                   prevSeg = prevNode.key;
5783               }
5784               while (nextSeg === void 0) {
5785                 nextNode = this.tree.next(nextNode);
5786                 if (nextNode === null)
5787                   nextSeg = null;
5788                 else if (nextNode.key.consumedBy === void 0)
5789                   nextSeg = nextNode.key;
5790               }
5791               if (event.isLeft) {
5792                 var prevMySplitter = null;
5793                 if (prevSeg) {
5794                   var prevInter = prevSeg.getIntersection(segment);
5795                   if (prevInter !== null) {
5796                     if (!segment.isAnEndpoint(prevInter))
5797                       prevMySplitter = prevInter;
5798                     if (!prevSeg.isAnEndpoint(prevInter)) {
5799                       var newEventsFromSplit = this._splitSafely(prevSeg, prevInter);
5800                       for (var i2 = 0, iMax = newEventsFromSplit.length; i2 < iMax; i2++) {
5801                         newEvents.push(newEventsFromSplit[i2]);
5802                       }
5803                     }
5804                   }
5805                 }
5806                 var nextMySplitter = null;
5807                 if (nextSeg) {
5808                   var nextInter = nextSeg.getIntersection(segment);
5809                   if (nextInter !== null) {
5810                     if (!segment.isAnEndpoint(nextInter))
5811                       nextMySplitter = nextInter;
5812                     if (!nextSeg.isAnEndpoint(nextInter)) {
5813                       var _newEventsFromSplit = this._splitSafely(nextSeg, nextInter);
5814                       for (var _i = 0, _iMax = _newEventsFromSplit.length; _i < _iMax; _i++) {
5815                         newEvents.push(_newEventsFromSplit[_i]);
5816                       }
5817                     }
5818                   }
5819                 }
5820                 if (prevMySplitter !== null || nextMySplitter !== null) {
5821                   var mySplitter = null;
5822                   if (prevMySplitter === null)
5823                     mySplitter = nextMySplitter;
5824                   else if (nextMySplitter === null)
5825                     mySplitter = prevMySplitter;
5826                   else {
5827                     var cmpSplitters = SweepEvent.comparePoints(prevMySplitter, nextMySplitter);
5828                     mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter;
5829                   }
5830                   this.queue.remove(segment.rightSE);
5831                   newEvents.push(segment.rightSE);
5832                   var _newEventsFromSplit2 = segment.split(mySplitter);
5833                   for (var _i2 = 0, _iMax2 = _newEventsFromSplit2.length; _i2 < _iMax2; _i2++) {
5834                     newEvents.push(_newEventsFromSplit2[_i2]);
5835                   }
5836                 }
5837                 if (newEvents.length > 0) {
5838                   this.tree.remove(segment);
5839                   newEvents.push(event);
5840                 } else {
5841                   this.segments.push(segment);
5842                   segment.prev = prevSeg;
5843                 }
5844               } else {
5845                 if (prevSeg && nextSeg) {
5846                   var inter = prevSeg.getIntersection(nextSeg);
5847                   if (inter !== null) {
5848                     if (!prevSeg.isAnEndpoint(inter)) {
5849                       var _newEventsFromSplit3 = this._splitSafely(prevSeg, inter);
5850                       for (var _i3 = 0, _iMax3 = _newEventsFromSplit3.length; _i3 < _iMax3; _i3++) {
5851                         newEvents.push(_newEventsFromSplit3[_i3]);
5852                       }
5853                     }
5854                     if (!nextSeg.isAnEndpoint(inter)) {
5855                       var _newEventsFromSplit4 = this._splitSafely(nextSeg, inter);
5856                       for (var _i4 = 0, _iMax4 = _newEventsFromSplit4.length; _i4 < _iMax4; _i4++) {
5857                         newEvents.push(_newEventsFromSplit4[_i4]);
5858                       }
5859                     }
5860                   }
5861                 }
5862                 this.tree.remove(segment);
5863               }
5864               return newEvents;
5865             }
5866             /* Safely split a segment that is currently in the datastructures
5867              * IE - a segment other than the one that is currently being processed. */
5868           }, {
5869             key: "_splitSafely",
5870             value: function _splitSafely(seg, pt) {
5871               this.tree.remove(seg);
5872               var rightSE = seg.rightSE;
5873               this.queue.remove(rightSE);
5874               var newEvents = seg.split(pt);
5875               newEvents.push(rightSE);
5876               if (seg.consumedBy === void 0)
5877                 this.tree.insert(seg);
5878               return newEvents;
5879             }
5880           }]);
5881           return SweepLine2;
5882         }();
5883         var POLYGON_CLIPPING_MAX_QUEUE_SIZE = typeof process !== "undefined" && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1e6;
5884         var POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS = typeof process !== "undefined" && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1e6;
5885         var Operation = /* @__PURE__ */ function() {
5886           function Operation2() {
5887             _classCallCheck(this, Operation2);
5888           }
5889           _createClass(Operation2, [{
5890             key: "run",
5891             value: function run(type2, geom, moreGeoms) {
5892               operation.type = type2;
5893               rounder.reset();
5894               var multipolys = [new MultiPolyIn(geom, true)];
5895               for (var i2 = 0, iMax = moreGeoms.length; i2 < iMax; i2++) {
5896                 multipolys.push(new MultiPolyIn(moreGeoms[i2], false));
5897               }
5898               operation.numMultiPolys = multipolys.length;
5899               if (operation.type === "difference") {
5900                 var subject = multipolys[0];
5901                 var _i = 1;
5902                 while (_i < multipolys.length) {
5903                   if (getBboxOverlap(multipolys[_i].bbox, subject.bbox) !== null)
5904                     _i++;
5905                   else
5906                     multipolys.splice(_i, 1);
5907                 }
5908               }
5909               if (operation.type === "intersection") {
5910                 for (var _i2 = 0, _iMax = multipolys.length; _i2 < _iMax; _i2++) {
5911                   var mpA = multipolys[_i2];
5912                   for (var j2 = _i2 + 1, jMax = multipolys.length; j2 < jMax; j2++) {
5913                     if (getBboxOverlap(mpA.bbox, multipolys[j2].bbox) === null)
5914                       return [];
5915                   }
5916                 }
5917               }
5918               var queue = new Tree(SweepEvent.compare);
5919               for (var _i3 = 0, _iMax2 = multipolys.length; _i3 < _iMax2; _i3++) {
5920                 var sweepEvents = multipolys[_i3].getSweepEvents();
5921                 for (var _j = 0, _jMax = sweepEvents.length; _j < _jMax; _j++) {
5922                   queue.insert(sweepEvents[_j]);
5923                   if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
5924                     throw new Error("Infinite loop when putting segment endpoints in a priority queue (queue size too big). Please file a bug report.");
5925                   }
5926                 }
5927               }
5928               var sweepLine = new SweepLine(queue);
5929               var prevQueueSize = queue.size;
5930               var node = queue.pop();
5931               while (node) {
5932                 var evt = node.key;
5933                 if (queue.size === prevQueueSize) {
5934                   var seg = evt.segment;
5935                   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.");
5936                 }
5937                 if (queue.size > POLYGON_CLIPPING_MAX_QUEUE_SIZE) {
5938                   throw new Error("Infinite loop when passing sweep line over endpoints (queue size too big). Please file a bug report.");
5939                 }
5940                 if (sweepLine.segments.length > POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS) {
5941                   throw new Error("Infinite loop when passing sweep line over endpoints (too many sweep line segments). Please file a bug report.");
5942                 }
5943                 var newEvents = sweepLine.process(evt);
5944                 for (var _i4 = 0, _iMax3 = newEvents.length; _i4 < _iMax3; _i4++) {
5945                   var _evt = newEvents[_i4];
5946                   if (_evt.consumedBy === void 0)
5947                     queue.insert(_evt);
5948                 }
5949                 prevQueueSize = queue.size;
5950                 node = queue.pop();
5951               }
5952               rounder.reset();
5953               var ringsOut = RingOut.factory(sweepLine.segments);
5954               var result = new MultiPolyOut(ringsOut);
5955               return result.getGeom();
5956             }
5957           }]);
5958           return Operation2;
5959         }();
5960         var operation = new Operation();
5961         var union = function union2(geom) {
5962           for (var _len = arguments.length, moreGeoms = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
5963             moreGeoms[_key - 1] = arguments[_key];
5964           }
5965           return operation.run("union", geom, moreGeoms);
5966         };
5967         var intersection$1 = function intersection2(geom) {
5968           for (var _len2 = arguments.length, moreGeoms = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
5969             moreGeoms[_key2 - 1] = arguments[_key2];
5970           }
5971           return operation.run("intersection", geom, moreGeoms);
5972         };
5973         var xor = function xor2(geom) {
5974           for (var _len3 = arguments.length, moreGeoms = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
5975             moreGeoms[_key3 - 1] = arguments[_key3];
5976           }
5977           return operation.run("xor", geom, moreGeoms);
5978         };
5979         var difference = function difference2(subjectGeom) {
5980           for (var _len4 = arguments.length, clippingGeoms = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
5981             clippingGeoms[_key4 - 1] = arguments[_key4];
5982           }
5983           return operation.run("difference", subjectGeom, clippingGeoms);
5984         };
5985         var index = {
5986           union,
5987           intersection: intersection$1,
5988           xor,
5989           difference
5990         };
5991         return index;
5992       });
5993     }
5994   });
5995
5996   // node_modules/geojson-precision/index.js
5997   var require_geojson_precision = __commonJS({
5998     "node_modules/geojson-precision/index.js"(exports2, module2) {
5999       (function() {
6000         function parse(t, coordinatePrecision, extrasPrecision) {
6001           function point2(p) {
6002             return p.map(function(e, index) {
6003               if (index < 2) {
6004                 return 1 * e.toFixed(coordinatePrecision);
6005               } else {
6006                 return 1 * e.toFixed(extrasPrecision);
6007               }
6008             });
6009           }
6010           function multi(l) {
6011             return l.map(point2);
6012           }
6013           function poly(p) {
6014             return p.map(multi);
6015           }
6016           function multiPoly(m) {
6017             return m.map(poly);
6018           }
6019           function geometry(obj) {
6020             if (!obj) {
6021               return {};
6022             }
6023             switch (obj.type) {
6024               case "Point":
6025                 obj.coordinates = point2(obj.coordinates);
6026                 return obj;
6027               case "LineString":
6028               case "MultiPoint":
6029                 obj.coordinates = multi(obj.coordinates);
6030                 return obj;
6031               case "Polygon":
6032               case "MultiLineString":
6033                 obj.coordinates = poly(obj.coordinates);
6034                 return obj;
6035               case "MultiPolygon":
6036                 obj.coordinates = multiPoly(obj.coordinates);
6037                 return obj;
6038               case "GeometryCollection":
6039                 obj.geometries = obj.geometries.map(geometry);
6040                 return obj;
6041               default:
6042                 return {};
6043             }
6044           }
6045           function feature3(obj) {
6046             obj.geometry = geometry(obj.geometry);
6047             return obj;
6048           }
6049           function featureCollection(f2) {
6050             f2.features = f2.features.map(feature3);
6051             return f2;
6052           }
6053           function geometryCollection(g) {
6054             g.geometries = g.geometries.map(geometry);
6055             return g;
6056           }
6057           if (!t) {
6058             return t;
6059           }
6060           switch (t.type) {
6061             case "Feature":
6062               return feature3(t);
6063             case "GeometryCollection":
6064               return geometryCollection(t);
6065             case "FeatureCollection":
6066               return featureCollection(t);
6067             case "Point":
6068             case "LineString":
6069             case "Polygon":
6070             case "MultiPoint":
6071             case "MultiPolygon":
6072             case "MultiLineString":
6073               return geometry(t);
6074             default:
6075               return t;
6076           }
6077         }
6078         module2.exports = parse;
6079         module2.exports.parse = parse;
6080       })();
6081     }
6082   });
6083
6084   // node_modules/@aitodotai/json-stringify-pretty-compact/index.js
6085   var require_json_stringify_pretty_compact = __commonJS({
6086     "node_modules/@aitodotai/json-stringify-pretty-compact/index.js"(exports2, module2) {
6087       function isObject3(obj) {
6088         return typeof obj === "object" && obj !== null;
6089       }
6090       function forEach(obj, cb) {
6091         if (Array.isArray(obj)) {
6092           obj.forEach(cb);
6093         } else if (isObject3(obj)) {
6094           Object.keys(obj).forEach(function(key) {
6095             var val = obj[key];
6096             cb(val, key);
6097           });
6098         }
6099       }
6100       function getTreeDepth(obj) {
6101         var depth = 0;
6102         if (Array.isArray(obj) || isObject3(obj)) {
6103           forEach(obj, function(val) {
6104             if (Array.isArray(val) || isObject3(val)) {
6105               var tmpDepth = getTreeDepth(val);
6106               if (tmpDepth > depth) {
6107                 depth = tmpDepth;
6108               }
6109             }
6110           });
6111           return depth + 1;
6112         }
6113         return depth;
6114       }
6115       function stringify3(obj, options2) {
6116         options2 = options2 || {};
6117         var indent2 = JSON.stringify([1], null, get4(options2, "indent", 2)).slice(2, -3);
6118         var addMargin = get4(options2, "margins", false);
6119         var addArrayMargin = get4(options2, "arrayMargins", false);
6120         var addObjectMargin = get4(options2, "objectMargins", false);
6121         var maxLength = indent2 === "" ? Infinity : get4(options2, "maxLength", 80);
6122         var maxNesting = get4(options2, "maxNesting", Infinity);
6123         return function _stringify(obj2, currentIndent, reserved) {
6124           if (obj2 && typeof obj2.toJSON === "function") {
6125             obj2 = obj2.toJSON();
6126           }
6127           var string = JSON.stringify(obj2);
6128           if (string === void 0) {
6129             return string;
6130           }
6131           var length = maxLength - currentIndent.length - reserved;
6132           var treeDepth = getTreeDepth(obj2);
6133           if (treeDepth <= maxNesting && string.length <= length) {
6134             var prettified = prettify(string, {
6135               addMargin,
6136               addArrayMargin,
6137               addObjectMargin
6138             });
6139             if (prettified.length <= length) {
6140               return prettified;
6141             }
6142           }
6143           if (isObject3(obj2)) {
6144             var nextIndent = currentIndent + indent2;
6145             var items = [];
6146             var delimiters;
6147             var comma = function(array2, index2) {
6148               return index2 === array2.length - 1 ? 0 : 1;
6149             };
6150             if (Array.isArray(obj2)) {
6151               for (var index = 0; index < obj2.length; index++) {
6152                 items.push(
6153                   _stringify(obj2[index], nextIndent, comma(obj2, index)) || "null"
6154                 );
6155               }
6156               delimiters = "[]";
6157             } else {
6158               Object.keys(obj2).forEach(function(key, index2, array2) {
6159                 var keyPart = JSON.stringify(key) + ": ";
6160                 var value = _stringify(
6161                   obj2[key],
6162                   nextIndent,
6163                   keyPart.length + comma(array2, index2)
6164                 );
6165                 if (value !== void 0) {
6166                   items.push(keyPart + value);
6167                 }
6168               });
6169               delimiters = "{}";
6170             }
6171             if (items.length > 0) {
6172               return [
6173                 delimiters[0],
6174                 indent2 + items.join(",\n" + nextIndent),
6175                 delimiters[1]
6176               ].join("\n" + currentIndent);
6177             }
6178           }
6179           return string;
6180         }(obj, "", 0);
6181       }
6182       var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,\][}{]/g;
6183       function prettify(string, options2) {
6184         options2 = options2 || {};
6185         var tokens = {
6186           "{": "{",
6187           "}": "}",
6188           "[": "[",
6189           "]": "]",
6190           ",": ", ",
6191           ":": ": "
6192         };
6193         if (options2.addMargin || options2.addObjectMargin) {
6194           tokens["{"] = "{ ";
6195           tokens["}"] = " }";
6196         }
6197         if (options2.addMargin || options2.addArrayMargin) {
6198           tokens["["] = "[ ";
6199           tokens["]"] = " ]";
6200         }
6201         return string.replace(stringOrChar, function(match, string2) {
6202           return string2 ? match : tokens[match];
6203         });
6204       }
6205       function get4(options2, name, defaultValue) {
6206         return name in options2 ? options2[name] : defaultValue;
6207       }
6208       module2.exports = stringify3;
6209     }
6210   });
6211
6212   // node_modules/aes-js/index.js
6213   var require_aes_js = __commonJS({
6214     "node_modules/aes-js/index.js"(exports2, module2) {
6215       (function(root3) {
6216         "use strict";
6217         function checkInt(value) {
6218           return parseInt(value) === value;
6219         }
6220         function checkInts(arrayish) {
6221           if (!checkInt(arrayish.length)) {
6222             return false;
6223           }
6224           for (var i2 = 0; i2 < arrayish.length; i2++) {
6225             if (!checkInt(arrayish[i2]) || arrayish[i2] < 0 || arrayish[i2] > 255) {
6226               return false;
6227             }
6228           }
6229           return true;
6230         }
6231         function coerceArray(arg, copy2) {
6232           if (arg.buffer && arg.name === "Uint8Array") {
6233             if (copy2) {
6234               if (arg.slice) {
6235                 arg = arg.slice();
6236               } else {
6237                 arg = Array.prototype.slice.call(arg);
6238               }
6239             }
6240             return arg;
6241           }
6242           if (Array.isArray(arg)) {
6243             if (!checkInts(arg)) {
6244               throw new Error("Array contains invalid value: " + arg);
6245             }
6246             return new Uint8Array(arg);
6247           }
6248           if (checkInt(arg.length) && checkInts(arg)) {
6249             return new Uint8Array(arg);
6250           }
6251           throw new Error("unsupported array-like object");
6252         }
6253         function createArray(length) {
6254           return new Uint8Array(length);
6255         }
6256         function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
6257           if (sourceStart != null || sourceEnd != null) {
6258             if (sourceArray.slice) {
6259               sourceArray = sourceArray.slice(sourceStart, sourceEnd);
6260             } else {
6261               sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
6262             }
6263           }
6264           targetArray.set(sourceArray, targetStart);
6265         }
6266         var convertUtf8 = function() {
6267           function toBytes(text2) {
6268             var result = [], i2 = 0;
6269             text2 = encodeURI(text2);
6270             while (i2 < text2.length) {
6271               var c = text2.charCodeAt(i2++);
6272               if (c === 37) {
6273                 result.push(parseInt(text2.substr(i2, 2), 16));
6274                 i2 += 2;
6275               } else {
6276                 result.push(c);
6277               }
6278             }
6279             return coerceArray(result);
6280           }
6281           function fromBytes(bytes) {
6282             var result = [], i2 = 0;
6283             while (i2 < bytes.length) {
6284               var c = bytes[i2];
6285               if (c < 128) {
6286                 result.push(String.fromCharCode(c));
6287                 i2++;
6288               } else if (c > 191 && c < 224) {
6289                 result.push(String.fromCharCode((c & 31) << 6 | bytes[i2 + 1] & 63));
6290                 i2 += 2;
6291               } else {
6292                 result.push(String.fromCharCode((c & 15) << 12 | (bytes[i2 + 1] & 63) << 6 | bytes[i2 + 2] & 63));
6293                 i2 += 3;
6294               }
6295             }
6296             return result.join("");
6297           }
6298           return {
6299             toBytes,
6300             fromBytes
6301           };
6302         }();
6303         var convertHex = function() {
6304           function toBytes(text2) {
6305             var result = [];
6306             for (var i2 = 0; i2 < text2.length; i2 += 2) {
6307               result.push(parseInt(text2.substr(i2, 2), 16));
6308             }
6309             return result;
6310           }
6311           var Hex = "0123456789abcdef";
6312           function fromBytes(bytes) {
6313             var result = [];
6314             for (var i2 = 0; i2 < bytes.length; i2++) {
6315               var v = bytes[i2];
6316               result.push(Hex[(v & 240) >> 4] + Hex[v & 15]);
6317             }
6318             return result.join("");
6319           }
6320           return {
6321             toBytes,
6322             fromBytes
6323           };
6324         }();
6325         var numberOfRounds = { 16: 10, 24: 12, 32: 14 };
6326         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];
6327         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];
6328         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];
6329         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];
6330         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];
6331         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];
6332         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];
6333         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];
6334         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];
6335         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];
6336         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];
6337         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];
6338         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];
6339         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];
6340         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];
6341         function convertToInt32(bytes) {
6342           var result = [];
6343           for (var i2 = 0; i2 < bytes.length; i2 += 4) {
6344             result.push(
6345               bytes[i2] << 24 | bytes[i2 + 1] << 16 | bytes[i2 + 2] << 8 | bytes[i2 + 3]
6346             );
6347           }
6348           return result;
6349         }
6350         var AES = function(key) {
6351           if (!(this instanceof AES)) {
6352             throw Error("AES must be instanitated with `new`");
6353           }
6354           Object.defineProperty(this, "key", {
6355             value: coerceArray(key, true)
6356           });
6357           this._prepare();
6358         };
6359         AES.prototype._prepare = function() {
6360           var rounds = numberOfRounds[this.key.length];
6361           if (rounds == null) {
6362             throw new Error("invalid key size (must be 16, 24 or 32 bytes)");
6363           }
6364           this._Ke = [];
6365           this._Kd = [];
6366           for (var i2 = 0; i2 <= rounds; i2++) {
6367             this._Ke.push([0, 0, 0, 0]);
6368             this._Kd.push([0, 0, 0, 0]);
6369           }
6370           var roundKeyCount = (rounds + 1) * 4;
6371           var KC = this.key.length / 4;
6372           var tk = convertToInt32(this.key);
6373           var index;
6374           for (var i2 = 0; i2 < KC; i2++) {
6375             index = i2 >> 2;
6376             this._Ke[index][i2 % 4] = tk[i2];
6377             this._Kd[rounds - index][i2 % 4] = tk[i2];
6378           }
6379           var rconpointer = 0;
6380           var t = KC, tt;
6381           while (t < roundKeyCount) {
6382             tt = tk[KC - 1];
6383             tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24;
6384             rconpointer += 1;
6385             if (KC != 8) {
6386               for (var i2 = 1; i2 < KC; i2++) {
6387                 tk[i2] ^= tk[i2 - 1];
6388               }
6389             } else {
6390               for (var i2 = 1; i2 < KC / 2; i2++) {
6391                 tk[i2] ^= tk[i2 - 1];
6392               }
6393               tt = tk[KC / 2 - 1];
6394               tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24;
6395               for (var i2 = KC / 2 + 1; i2 < KC; i2++) {
6396                 tk[i2] ^= tk[i2 - 1];
6397               }
6398             }
6399             var i2 = 0, r, c;
6400             while (i2 < KC && t < roundKeyCount) {
6401               r = t >> 2;
6402               c = t % 4;
6403               this._Ke[r][c] = tk[i2];
6404               this._Kd[rounds - r][c] = tk[i2++];
6405               t++;
6406             }
6407           }
6408           for (var r = 1; r < rounds; r++) {
6409             for (var c = 0; c < 4; c++) {
6410               tt = this._Kd[r][c];
6411               this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255];
6412             }
6413           }
6414         };
6415         AES.prototype.encrypt = function(plaintext) {
6416           if (plaintext.length != 16) {
6417             throw new Error("invalid plaintext size (must be 16 bytes)");
6418           }
6419           var rounds = this._Ke.length - 1;
6420           var a = [0, 0, 0, 0];
6421           var t = convertToInt32(plaintext);
6422           for (var i2 = 0; i2 < 4; i2++) {
6423             t[i2] ^= this._Ke[0][i2];
6424           }
6425           for (var r = 1; r < rounds; r++) {
6426             for (var i2 = 0; i2 < 4; i2++) {
6427               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];
6428             }
6429             t = a.slice();
6430           }
6431           var result = createArray(16), tt;
6432           for (var i2 = 0; i2 < 4; i2++) {
6433             tt = this._Ke[rounds][i2];
6434             result[4 * i2] = (S[t[i2] >> 24 & 255] ^ tt >> 24) & 255;
6435             result[4 * i2 + 1] = (S[t[(i2 + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255;
6436             result[4 * i2 + 2] = (S[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;
6437             result[4 * i2 + 3] = (S[t[(i2 + 3) % 4] & 255] ^ tt) & 255;
6438           }
6439           return result;
6440         };
6441         AES.prototype.decrypt = function(ciphertext) {
6442           if (ciphertext.length != 16) {
6443             throw new Error("invalid ciphertext size (must be 16 bytes)");
6444           }
6445           var rounds = this._Kd.length - 1;
6446           var a = [0, 0, 0, 0];
6447           var t = convertToInt32(ciphertext);
6448           for (var i2 = 0; i2 < 4; i2++) {
6449             t[i2] ^= this._Kd[0][i2];
6450           }
6451           for (var r = 1; r < rounds; r++) {
6452             for (var i2 = 0; i2 < 4; i2++) {
6453               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];
6454             }
6455             t = a.slice();
6456           }
6457           var result = createArray(16), tt;
6458           for (var i2 = 0; i2 < 4; i2++) {
6459             tt = this._Kd[rounds][i2];
6460             result[4 * i2] = (Si[t[i2] >> 24 & 255] ^ tt >> 24) & 255;
6461             result[4 * i2 + 1] = (Si[t[(i2 + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255;
6462             result[4 * i2 + 2] = (Si[t[(i2 + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;
6463             result[4 * i2 + 3] = (Si[t[(i2 + 1) % 4] & 255] ^ tt) & 255;
6464           }
6465           return result;
6466         };
6467         var ModeOfOperationECB = function(key) {
6468           if (!(this instanceof ModeOfOperationECB)) {
6469             throw Error("AES must be instanitated with `new`");
6470           }
6471           this.description = "Electronic Code Block";
6472           this.name = "ecb";
6473           this._aes = new AES(key);
6474         };
6475         ModeOfOperationECB.prototype.encrypt = function(plaintext) {
6476           plaintext = coerceArray(plaintext);
6477           if (plaintext.length % 16 !== 0) {
6478             throw new Error("invalid plaintext size (must be multiple of 16 bytes)");
6479           }
6480           var ciphertext = createArray(plaintext.length);
6481           var block2 = createArray(16);
6482           for (var i2 = 0; i2 < plaintext.length; i2 += 16) {
6483             copyArray(plaintext, block2, 0, i2, i2 + 16);
6484             block2 = this._aes.encrypt(block2);
6485             copyArray(block2, ciphertext, i2);
6486           }
6487           return ciphertext;
6488         };
6489         ModeOfOperationECB.prototype.decrypt = function(ciphertext) {
6490           ciphertext = coerceArray(ciphertext);
6491           if (ciphertext.length % 16 !== 0) {
6492             throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");
6493           }
6494           var plaintext = createArray(ciphertext.length);
6495           var block2 = createArray(16);
6496           for (var i2 = 0; i2 < ciphertext.length; i2 += 16) {
6497             copyArray(ciphertext, block2, 0, i2, i2 + 16);
6498             block2 = this._aes.decrypt(block2);
6499             copyArray(block2, plaintext, i2);
6500           }
6501           return plaintext;
6502         };
6503         var ModeOfOperationCBC = function(key, iv) {
6504           if (!(this instanceof ModeOfOperationCBC)) {
6505             throw Error("AES must be instanitated with `new`");
6506           }
6507           this.description = "Cipher Block Chaining";
6508           this.name = "cbc";
6509           if (!iv) {
6510             iv = createArray(16);
6511           } else if (iv.length != 16) {
6512             throw new Error("invalid initialation vector size (must be 16 bytes)");
6513           }
6514           this._lastCipherblock = coerceArray(iv, true);
6515           this._aes = new AES(key);
6516         };
6517         ModeOfOperationCBC.prototype.encrypt = function(plaintext) {
6518           plaintext = coerceArray(plaintext);
6519           if (plaintext.length % 16 !== 0) {
6520             throw new Error("invalid plaintext size (must be multiple of 16 bytes)");
6521           }
6522           var ciphertext = createArray(plaintext.length);
6523           var block2 = createArray(16);
6524           for (var i2 = 0; i2 < plaintext.length; i2 += 16) {
6525             copyArray(plaintext, block2, 0, i2, i2 + 16);
6526             for (var j2 = 0; j2 < 16; j2++) {
6527               block2[j2] ^= this._lastCipherblock[j2];
6528             }
6529             this._lastCipherblock = this._aes.encrypt(block2);
6530             copyArray(this._lastCipherblock, ciphertext, i2);
6531           }
6532           return ciphertext;
6533         };
6534         ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {
6535           ciphertext = coerceArray(ciphertext);
6536           if (ciphertext.length % 16 !== 0) {
6537             throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");
6538           }
6539           var plaintext = createArray(ciphertext.length);
6540           var block2 = createArray(16);
6541           for (var i2 = 0; i2 < ciphertext.length; i2 += 16) {
6542             copyArray(ciphertext, block2, 0, i2, i2 + 16);
6543             block2 = this._aes.decrypt(block2);
6544             for (var j2 = 0; j2 < 16; j2++) {
6545               plaintext[i2 + j2] = block2[j2] ^ this._lastCipherblock[j2];
6546             }
6547             copyArray(ciphertext, this._lastCipherblock, 0, i2, i2 + 16);
6548           }
6549           return plaintext;
6550         };
6551         var ModeOfOperationCFB = function(key, iv, segmentSize) {
6552           if (!(this instanceof ModeOfOperationCFB)) {
6553             throw Error("AES must be instanitated with `new`");
6554           }
6555           this.description = "Cipher Feedback";
6556           this.name = "cfb";
6557           if (!iv) {
6558             iv = createArray(16);
6559           } else if (iv.length != 16) {
6560             throw new Error("invalid initialation vector size (must be 16 size)");
6561           }
6562           if (!segmentSize) {
6563             segmentSize = 1;
6564           }
6565           this.segmentSize = segmentSize;
6566           this._shiftRegister = coerceArray(iv, true);
6567           this._aes = new AES(key);
6568         };
6569         ModeOfOperationCFB.prototype.encrypt = function(plaintext) {
6570           if (plaintext.length % this.segmentSize != 0) {
6571             throw new Error("invalid plaintext size (must be segmentSize bytes)");
6572           }
6573           var encrypted = coerceArray(plaintext, true);
6574           var xorSegment;
6575           for (var i2 = 0; i2 < encrypted.length; i2 += this.segmentSize) {
6576             xorSegment = this._aes.encrypt(this._shiftRegister);
6577             for (var j2 = 0; j2 < this.segmentSize; j2++) {
6578               encrypted[i2 + j2] ^= xorSegment[j2];
6579             }
6580             copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
6581             copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize);
6582           }
6583           return encrypted;
6584         };
6585         ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {
6586           if (ciphertext.length % this.segmentSize != 0) {
6587             throw new Error("invalid ciphertext size (must be segmentSize bytes)");
6588           }
6589           var plaintext = coerceArray(ciphertext, true);
6590           var xorSegment;
6591           for (var i2 = 0; i2 < plaintext.length; i2 += this.segmentSize) {
6592             xorSegment = this._aes.encrypt(this._shiftRegister);
6593             for (var j2 = 0; j2 < this.segmentSize; j2++) {
6594               plaintext[i2 + j2] ^= xorSegment[j2];
6595             }
6596             copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
6597             copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i2, i2 + this.segmentSize);
6598           }
6599           return plaintext;
6600         };
6601         var ModeOfOperationOFB = function(key, iv) {
6602           if (!(this instanceof ModeOfOperationOFB)) {
6603             throw Error("AES must be instanitated with `new`");
6604           }
6605           this.description = "Output Feedback";
6606           this.name = "ofb";
6607           if (!iv) {
6608             iv = createArray(16);
6609           } else if (iv.length != 16) {
6610             throw new Error("invalid initialation vector size (must be 16 bytes)");
6611           }
6612           this._lastPrecipher = coerceArray(iv, true);
6613           this._lastPrecipherIndex = 16;
6614           this._aes = new AES(key);
6615         };
6616         ModeOfOperationOFB.prototype.encrypt = function(plaintext) {
6617           var encrypted = coerceArray(plaintext, true);
6618           for (var i2 = 0; i2 < encrypted.length; i2++) {
6619             if (this._lastPrecipherIndex === 16) {
6620               this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
6621               this._lastPrecipherIndex = 0;
6622             }
6623             encrypted[i2] ^= this._lastPrecipher[this._lastPrecipherIndex++];
6624           }
6625           return encrypted;
6626         };
6627         ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
6628         var Counter = function(initialValue) {
6629           if (!(this instanceof Counter)) {
6630             throw Error("Counter must be instanitated with `new`");
6631           }
6632           if (initialValue !== 0 && !initialValue) {
6633             initialValue = 1;
6634           }
6635           if (typeof initialValue === "number") {
6636             this._counter = createArray(16);
6637             this.setValue(initialValue);
6638           } else {
6639             this.setBytes(initialValue);
6640           }
6641         };
6642         Counter.prototype.setValue = function(value) {
6643           if (typeof value !== "number" || parseInt(value) != value) {
6644             throw new Error("invalid counter value (must be an integer)");
6645           }
6646           if (value > Number.MAX_SAFE_INTEGER) {
6647             throw new Error("integer value out of safe range");
6648           }
6649           for (var index = 15; index >= 0; --index) {
6650             this._counter[index] = value % 256;
6651             value = parseInt(value / 256);
6652           }
6653         };
6654         Counter.prototype.setBytes = function(bytes) {
6655           bytes = coerceArray(bytes, true);
6656           if (bytes.length != 16) {
6657             throw new Error("invalid counter bytes size (must be 16 bytes)");
6658           }
6659           this._counter = bytes;
6660         };
6661         Counter.prototype.increment = function() {
6662           for (var i2 = 15; i2 >= 0; i2--) {
6663             if (this._counter[i2] === 255) {
6664               this._counter[i2] = 0;
6665             } else {
6666               this._counter[i2]++;
6667               break;
6668             }
6669           }
6670         };
6671         var ModeOfOperationCTR = function(key, counter) {
6672           if (!(this instanceof ModeOfOperationCTR)) {
6673             throw Error("AES must be instanitated with `new`");
6674           }
6675           this.description = "Counter";
6676           this.name = "ctr";
6677           if (!(counter instanceof Counter)) {
6678             counter = new Counter(counter);
6679           }
6680           this._counter = counter;
6681           this._remainingCounter = null;
6682           this._remainingCounterIndex = 16;
6683           this._aes = new AES(key);
6684         };
6685         ModeOfOperationCTR.prototype.encrypt = function(plaintext) {
6686           var encrypted = coerceArray(plaintext, true);
6687           for (var i2 = 0; i2 < encrypted.length; i2++) {
6688             if (this._remainingCounterIndex === 16) {
6689               this._remainingCounter = this._aes.encrypt(this._counter._counter);
6690               this._remainingCounterIndex = 0;
6691               this._counter.increment();
6692             }
6693             encrypted[i2] ^= this._remainingCounter[this._remainingCounterIndex++];
6694           }
6695           return encrypted;
6696         };
6697         ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;
6698         function pkcs7pad(data) {
6699           data = coerceArray(data, true);
6700           var padder = 16 - data.length % 16;
6701           var result = createArray(data.length + padder);
6702           copyArray(data, result);
6703           for (var i2 = data.length; i2 < result.length; i2++) {
6704             result[i2] = padder;
6705           }
6706           return result;
6707         }
6708         function pkcs7strip(data) {
6709           data = coerceArray(data, true);
6710           if (data.length < 16) {
6711             throw new Error("PKCS#7 invalid length");
6712           }
6713           var padder = data[data.length - 1];
6714           if (padder > 16) {
6715             throw new Error("PKCS#7 padding byte out of range");
6716           }
6717           var length = data.length - padder;
6718           for (var i2 = 0; i2 < padder; i2++) {
6719             if (data[length + i2] !== padder) {
6720               throw new Error("PKCS#7 invalid padding byte");
6721             }
6722           }
6723           var result = createArray(length);
6724           copyArray(data, result, 0, 0, length);
6725           return result;
6726         }
6727         var aesjs2 = {
6728           AES,
6729           Counter,
6730           ModeOfOperation: {
6731             ecb: ModeOfOperationECB,
6732             cbc: ModeOfOperationCBC,
6733             cfb: ModeOfOperationCFB,
6734             ofb: ModeOfOperationOFB,
6735             ctr: ModeOfOperationCTR
6736           },
6737           utils: {
6738             hex: convertHex,
6739             utf8: convertUtf8
6740           },
6741           padding: {
6742             pkcs7: {
6743               pad: pkcs7pad,
6744               strip: pkcs7strip
6745             }
6746           },
6747           _arrayTest: {
6748             coerceArray,
6749             createArray,
6750             copyArray
6751           }
6752         };
6753         if (typeof exports2 !== "undefined") {
6754           module2.exports = aesjs2;
6755         } else if (typeof define === "function" && define.amd) {
6756           define([], function() {
6757             return aesjs2;
6758           });
6759         } else {
6760           if (root3.aesjs) {
6761             aesjs2._aesjs = root3.aesjs;
6762           }
6763           root3.aesjs = aesjs2;
6764         }
6765       })(exports2);
6766     }
6767   });
6768
6769   // node_modules/lodash/lodash.js
6770   var require_lodash = __commonJS({
6771     "node_modules/lodash/lodash.js"(exports2, module2) {
6772       (function() {
6773         var undefined2;
6774         var VERSION = "4.17.21";
6775         var LARGE_ARRAY_SIZE2 = 200;
6776         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`";
6777         var HASH_UNDEFINED4 = "__lodash_hash_undefined__";
6778         var MAX_MEMOIZE_SIZE = 500;
6779         var PLACEHOLDER = "__lodash_placeholder__";
6780         var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4;
6781         var COMPARE_PARTIAL_FLAG5 = 1, COMPARE_UNORDERED_FLAG3 = 2;
6782         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;
6783         var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "...";
6784         var HOT_COUNT = 800, HOT_SPAN = 16;
6785         var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3;
6786         var INFINITY2 = 1 / 0, MAX_SAFE_INTEGER3 = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN2 = 0 / 0;
6787         var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
6788         var wrapFlags = [
6789           ["ary", WRAP_ARY_FLAG],
6790           ["bind", WRAP_BIND_FLAG],
6791           ["bindKey", WRAP_BIND_KEY_FLAG],
6792           ["curry", WRAP_CURRY_FLAG],
6793           ["curryRight", WRAP_CURRY_RIGHT_FLAG],
6794           ["flip", WRAP_FLIP_FLAG],
6795           ["partial", WRAP_PARTIAL_FLAG],
6796           ["partialRight", WRAP_PARTIAL_RIGHT_FLAG],
6797           ["rearg", WRAP_REARG_FLAG]
6798         ];
6799         var argsTag4 = "[object Arguments]", arrayTag3 = "[object Array]", asyncTag2 = "[object AsyncFunction]", boolTag3 = "[object Boolean]", dateTag3 = "[object Date]", domExcTag = "[object DOMException]", errorTag3 = "[object Error]", funcTag3 = "[object Function]", genTag2 = "[object GeneratorFunction]", mapTag4 = "[object Map]", numberTag3 = "[object Number]", nullTag2 = "[object Null]", objectTag4 = "[object Object]", promiseTag2 = "[object Promise]", proxyTag2 = "[object Proxy]", regexpTag3 = "[object RegExp]", setTag4 = "[object Set]", stringTag3 = "[object String]", symbolTag3 = "[object Symbol]", undefinedTag2 = "[object Undefined]", weakMapTag3 = "[object WeakMap]", weakSetTag = "[object WeakSet]";
6800         var arrayBufferTag3 = "[object ArrayBuffer]", dataViewTag4 = "[object DataView]", float32Tag2 = "[object Float32Array]", float64Tag2 = "[object Float64Array]", int8Tag2 = "[object Int8Array]", int16Tag2 = "[object Int16Array]", int32Tag2 = "[object Int32Array]", uint8Tag2 = "[object Uint8Array]", uint8ClampedTag2 = "[object Uint8ClampedArray]", uint16Tag2 = "[object Uint16Array]", uint32Tag2 = "[object Uint32Array]";
6801         var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
6802         var reEscapedHtml2 = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml2 = /[&<>"']/g, reHasEscapedHtml2 = RegExp(reEscapedHtml2.source), reHasUnescapedHtml2 = RegExp(reUnescapedHtml2.source);
6803         var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g;
6804         var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
6805         var reRegExpChar2 = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar2.source);
6806         var reTrimStart2 = /^\s+/;
6807         var reWhitespace2 = /\s/;
6808         var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /;
6809         var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
6810         var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
6811         var reEscapeChar = /\\(\\)?/g;
6812         var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
6813         var reFlags = /\w*$/;
6814         var reIsBadHex2 = /^[-+]0x[0-9a-f]+$/i;
6815         var reIsBinary2 = /^0b[01]+$/i;
6816         var reIsHostCtor2 = /^\[object .+?Constructor\]$/;
6817         var reIsOctal2 = /^0o[0-7]+$/i;
6818         var reIsUint2 = /^(?:0|[1-9]\d*)$/;
6819         var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
6820         var reNoMatch = /($^)/;
6821         var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
6822         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;
6823         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";
6824         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("|") + ")";
6825         var reApos = RegExp(rsApos, "g");
6826         var reComboMark = RegExp(rsCombo, "g");
6827         var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g");
6828         var reUnicodeWord = RegExp([
6829           rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")",
6830           rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")",
6831           rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower,
6832           rsUpper + "+" + rsOptContrUpper,
6833           rsOrdUpper,
6834           rsOrdLower,
6835           rsDigits,
6836           rsEmoji
6837         ].join("|"), "g");
6838         var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]");
6839         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 ]/;
6840         var contextProps = [
6841           "Array",
6842           "Buffer",
6843           "DataView",
6844           "Date",
6845           "Error",
6846           "Float32Array",
6847           "Float64Array",
6848           "Function",
6849           "Int8Array",
6850           "Int16Array",
6851           "Int32Array",
6852           "Map",
6853           "Math",
6854           "Object",
6855           "Promise",
6856           "RegExp",
6857           "Set",
6858           "String",
6859           "Symbol",
6860           "TypeError",
6861           "Uint8Array",
6862           "Uint8ClampedArray",
6863           "Uint16Array",
6864           "Uint32Array",
6865           "WeakMap",
6866           "_",
6867           "clearTimeout",
6868           "isFinite",
6869           "parseInt",
6870           "setTimeout"
6871         ];
6872         var templateCounter = -1;
6873         var typedArrayTags2 = {};
6874         typedArrayTags2[float32Tag2] = typedArrayTags2[float64Tag2] = typedArrayTags2[int8Tag2] = typedArrayTags2[int16Tag2] = typedArrayTags2[int32Tag2] = typedArrayTags2[uint8Tag2] = typedArrayTags2[uint8ClampedTag2] = typedArrayTags2[uint16Tag2] = typedArrayTags2[uint32Tag2] = true;
6875         typedArrayTags2[argsTag4] = typedArrayTags2[arrayTag3] = typedArrayTags2[arrayBufferTag3] = typedArrayTags2[boolTag3] = typedArrayTags2[dataViewTag4] = typedArrayTags2[dateTag3] = typedArrayTags2[errorTag3] = typedArrayTags2[funcTag3] = typedArrayTags2[mapTag4] = typedArrayTags2[numberTag3] = typedArrayTags2[objectTag4] = typedArrayTags2[regexpTag3] = typedArrayTags2[setTag4] = typedArrayTags2[stringTag3] = typedArrayTags2[weakMapTag3] = false;
6876         var cloneableTags = {};
6877         cloneableTags[argsTag4] = cloneableTags[arrayTag3] = cloneableTags[arrayBufferTag3] = cloneableTags[dataViewTag4] = cloneableTags[boolTag3] = cloneableTags[dateTag3] = cloneableTags[float32Tag2] = cloneableTags[float64Tag2] = cloneableTags[int8Tag2] = cloneableTags[int16Tag2] = cloneableTags[int32Tag2] = cloneableTags[mapTag4] = cloneableTags[numberTag3] = cloneableTags[objectTag4] = cloneableTags[regexpTag3] = cloneableTags[setTag4] = cloneableTags[stringTag3] = cloneableTags[symbolTag3] = cloneableTags[uint8Tag2] = cloneableTags[uint8ClampedTag2] = cloneableTags[uint16Tag2] = cloneableTags[uint32Tag2] = true;
6878         cloneableTags[errorTag3] = cloneableTags[funcTag3] = cloneableTags[weakMapTag3] = false;
6879         var deburredLetters = {
6880           // Latin-1 Supplement block.
6881           "\xC0": "A",
6882           "\xC1": "A",
6883           "\xC2": "A",
6884           "\xC3": "A",
6885           "\xC4": "A",
6886           "\xC5": "A",
6887           "\xE0": "a",
6888           "\xE1": "a",
6889           "\xE2": "a",
6890           "\xE3": "a",
6891           "\xE4": "a",
6892           "\xE5": "a",
6893           "\xC7": "C",
6894           "\xE7": "c",
6895           "\xD0": "D",
6896           "\xF0": "d",
6897           "\xC8": "E",
6898           "\xC9": "E",
6899           "\xCA": "E",
6900           "\xCB": "E",
6901           "\xE8": "e",
6902           "\xE9": "e",
6903           "\xEA": "e",
6904           "\xEB": "e",
6905           "\xCC": "I",
6906           "\xCD": "I",
6907           "\xCE": "I",
6908           "\xCF": "I",
6909           "\xEC": "i",
6910           "\xED": "i",
6911           "\xEE": "i",
6912           "\xEF": "i",
6913           "\xD1": "N",
6914           "\xF1": "n",
6915           "\xD2": "O",
6916           "\xD3": "O",
6917           "\xD4": "O",
6918           "\xD5": "O",
6919           "\xD6": "O",
6920           "\xD8": "O",
6921           "\xF2": "o",
6922           "\xF3": "o",
6923           "\xF4": "o",
6924           "\xF5": "o",
6925           "\xF6": "o",
6926           "\xF8": "o",
6927           "\xD9": "U",
6928           "\xDA": "U",
6929           "\xDB": "U",
6930           "\xDC": "U",
6931           "\xF9": "u",
6932           "\xFA": "u",
6933           "\xFB": "u",
6934           "\xFC": "u",
6935           "\xDD": "Y",
6936           "\xFD": "y",
6937           "\xFF": "y",
6938           "\xC6": "Ae",
6939           "\xE6": "ae",
6940           "\xDE": "Th",
6941           "\xFE": "th",
6942           "\xDF": "ss",
6943           // Latin Extended-A block.
6944           "\u0100": "A",
6945           "\u0102": "A",
6946           "\u0104": "A",
6947           "\u0101": "a",
6948           "\u0103": "a",
6949           "\u0105": "a",
6950           "\u0106": "C",
6951           "\u0108": "C",
6952           "\u010A": "C",
6953           "\u010C": "C",
6954           "\u0107": "c",
6955           "\u0109": "c",
6956           "\u010B": "c",
6957           "\u010D": "c",
6958           "\u010E": "D",
6959           "\u0110": "D",
6960           "\u010F": "d",
6961           "\u0111": "d",
6962           "\u0112": "E",
6963           "\u0114": "E",
6964           "\u0116": "E",
6965           "\u0118": "E",
6966           "\u011A": "E",
6967           "\u0113": "e",
6968           "\u0115": "e",
6969           "\u0117": "e",
6970           "\u0119": "e",
6971           "\u011B": "e",
6972           "\u011C": "G",
6973           "\u011E": "G",
6974           "\u0120": "G",
6975           "\u0122": "G",
6976           "\u011D": "g",
6977           "\u011F": "g",
6978           "\u0121": "g",
6979           "\u0123": "g",
6980           "\u0124": "H",
6981           "\u0126": "H",
6982           "\u0125": "h",
6983           "\u0127": "h",
6984           "\u0128": "I",
6985           "\u012A": "I",
6986           "\u012C": "I",
6987           "\u012E": "I",
6988           "\u0130": "I",
6989           "\u0129": "i",
6990           "\u012B": "i",
6991           "\u012D": "i",
6992           "\u012F": "i",
6993           "\u0131": "i",
6994           "\u0134": "J",
6995           "\u0135": "j",
6996           "\u0136": "K",
6997           "\u0137": "k",
6998           "\u0138": "k",
6999           "\u0139": "L",
7000           "\u013B": "L",
7001           "\u013D": "L",
7002           "\u013F": "L",
7003           "\u0141": "L",
7004           "\u013A": "l",
7005           "\u013C": "l",
7006           "\u013E": "l",
7007           "\u0140": "l",
7008           "\u0142": "l",
7009           "\u0143": "N",
7010           "\u0145": "N",
7011           "\u0147": "N",
7012           "\u014A": "N",
7013           "\u0144": "n",
7014           "\u0146": "n",
7015           "\u0148": "n",
7016           "\u014B": "n",
7017           "\u014C": "O",
7018           "\u014E": "O",
7019           "\u0150": "O",
7020           "\u014D": "o",
7021           "\u014F": "o",
7022           "\u0151": "o",
7023           "\u0154": "R",
7024           "\u0156": "R",
7025           "\u0158": "R",
7026           "\u0155": "r",
7027           "\u0157": "r",
7028           "\u0159": "r",
7029           "\u015A": "S",
7030           "\u015C": "S",
7031           "\u015E": "S",
7032           "\u0160": "S",
7033           "\u015B": "s",
7034           "\u015D": "s",
7035           "\u015F": "s",
7036           "\u0161": "s",
7037           "\u0162": "T",
7038           "\u0164": "T",
7039           "\u0166": "T",
7040           "\u0163": "t",
7041           "\u0165": "t",
7042           "\u0167": "t",
7043           "\u0168": "U",
7044           "\u016A": "U",
7045           "\u016C": "U",
7046           "\u016E": "U",
7047           "\u0170": "U",
7048           "\u0172": "U",
7049           "\u0169": "u",
7050           "\u016B": "u",
7051           "\u016D": "u",
7052           "\u016F": "u",
7053           "\u0171": "u",
7054           "\u0173": "u",
7055           "\u0174": "W",
7056           "\u0175": "w",
7057           "\u0176": "Y",
7058           "\u0177": "y",
7059           "\u0178": "Y",
7060           "\u0179": "Z",
7061           "\u017B": "Z",
7062           "\u017D": "Z",
7063           "\u017A": "z",
7064           "\u017C": "z",
7065           "\u017E": "z",
7066           "\u0132": "IJ",
7067           "\u0133": "ij",
7068           "\u0152": "Oe",
7069           "\u0153": "oe",
7070           "\u0149": "'n",
7071           "\u017F": "s"
7072         };
7073         var htmlEscapes2 = {
7074           "&": "&amp;",
7075           "<": "&lt;",
7076           ">": "&gt;",
7077           '"': "&quot;",
7078           "'": "&#39;"
7079         };
7080         var htmlUnescapes2 = {
7081           "&amp;": "&",
7082           "&lt;": "<",
7083           "&gt;": ">",
7084           "&quot;": '"',
7085           "&#39;": "'"
7086         };
7087         var stringEscapes = {
7088           "\\": "\\",
7089           "'": "'",
7090           "\n": "n",
7091           "\r": "r",
7092           "\u2028": "u2028",
7093           "\u2029": "u2029"
7094         };
7095         var freeParseFloat = parseFloat, freeParseInt2 = parseInt;
7096         var freeGlobal2 = typeof global == "object" && global && global.Object === Object && global;
7097         var freeSelf2 = typeof self == "object" && self && self.Object === Object && self;
7098         var root3 = freeGlobal2 || freeSelf2 || Function("return this")();
7099         var freeExports3 = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2;
7100         var freeModule3 = freeExports3 && typeof module2 == "object" && module2 && !module2.nodeType && module2;
7101         var moduleExports3 = freeModule3 && freeModule3.exports === freeExports3;
7102         var freeProcess2 = moduleExports3 && freeGlobal2.process;
7103         var nodeUtil2 = function() {
7104           try {
7105             var types = freeModule3 && freeModule3.require && freeModule3.require("util").types;
7106             if (types) {
7107               return types;
7108             }
7109             return freeProcess2 && freeProcess2.binding && freeProcess2.binding("util");
7110           } catch (e) {
7111           }
7112         }();
7113         var nodeIsArrayBuffer = nodeUtil2 && nodeUtil2.isArrayBuffer, nodeIsDate = nodeUtil2 && nodeUtil2.isDate, nodeIsMap = nodeUtil2 && nodeUtil2.isMap, nodeIsRegExp = nodeUtil2 && nodeUtil2.isRegExp, nodeIsSet = nodeUtil2 && nodeUtil2.isSet, nodeIsTypedArray2 = nodeUtil2 && nodeUtil2.isTypedArray;
7114         function apply(func, thisArg, args) {
7115           switch (args.length) {
7116             case 0:
7117               return func.call(thisArg);
7118             case 1:
7119               return func.call(thisArg, args[0]);
7120             case 2:
7121               return func.call(thisArg, args[0], args[1]);
7122             case 3:
7123               return func.call(thisArg, args[0], args[1], args[2]);
7124           }
7125           return func.apply(thisArg, args);
7126         }
7127         function arrayAggregator(array2, setter, iteratee, accumulator) {
7128           var index = -1, length = array2 == null ? 0 : array2.length;
7129           while (++index < length) {
7130             var value = array2[index];
7131             setter(accumulator, value, iteratee(value), array2);
7132           }
7133           return accumulator;
7134         }
7135         function arrayEach(array2, iteratee) {
7136           var index = -1, length = array2 == null ? 0 : array2.length;
7137           while (++index < length) {
7138             if (iteratee(array2[index], index, array2) === false) {
7139               break;
7140             }
7141           }
7142           return array2;
7143         }
7144         function arrayEachRight(array2, iteratee) {
7145           var length = array2 == null ? 0 : array2.length;
7146           while (length--) {
7147             if (iteratee(array2[length], length, array2) === false) {
7148               break;
7149             }
7150           }
7151           return array2;
7152         }
7153         function arrayEvery(array2, predicate) {
7154           var index = -1, length = array2 == null ? 0 : array2.length;
7155           while (++index < length) {
7156             if (!predicate(array2[index], index, array2)) {
7157               return false;
7158             }
7159           }
7160           return true;
7161         }
7162         function arrayFilter2(array2, predicate) {
7163           var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
7164           while (++index < length) {
7165             var value = array2[index];
7166             if (predicate(value, index, array2)) {
7167               result[resIndex++] = value;
7168             }
7169           }
7170           return result;
7171         }
7172         function arrayIncludes(array2, value) {
7173           var length = array2 == null ? 0 : array2.length;
7174           return !!length && baseIndexOf(array2, value, 0) > -1;
7175         }
7176         function arrayIncludesWith(array2, value, comparator) {
7177           var index = -1, length = array2 == null ? 0 : array2.length;
7178           while (++index < length) {
7179             if (comparator(value, array2[index])) {
7180               return true;
7181             }
7182           }
7183           return false;
7184         }
7185         function arrayMap2(array2, iteratee) {
7186           var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
7187           while (++index < length) {
7188             result[index] = iteratee(array2[index], index, array2);
7189           }
7190           return result;
7191         }
7192         function arrayPush2(array2, values) {
7193           var index = -1, length = values.length, offset = array2.length;
7194           while (++index < length) {
7195             array2[offset + index] = values[index];
7196           }
7197           return array2;
7198         }
7199         function arrayReduce(array2, iteratee, accumulator, initAccum) {
7200           var index = -1, length = array2 == null ? 0 : array2.length;
7201           if (initAccum && length) {
7202             accumulator = array2[++index];
7203           }
7204           while (++index < length) {
7205             accumulator = iteratee(accumulator, array2[index], index, array2);
7206           }
7207           return accumulator;
7208         }
7209         function arrayReduceRight(array2, iteratee, accumulator, initAccum) {
7210           var length = array2 == null ? 0 : array2.length;
7211           if (initAccum && length) {
7212             accumulator = array2[--length];
7213           }
7214           while (length--) {
7215             accumulator = iteratee(accumulator, array2[length], length, array2);
7216           }
7217           return accumulator;
7218         }
7219         function arraySome2(array2, predicate) {
7220           var index = -1, length = array2 == null ? 0 : array2.length;
7221           while (++index < length) {
7222             if (predicate(array2[index], index, array2)) {
7223               return true;
7224             }
7225           }
7226           return false;
7227         }
7228         var asciiSize = baseProperty("length");
7229         function asciiToArray(string) {
7230           return string.split("");
7231         }
7232         function asciiWords(string) {
7233           return string.match(reAsciiWord) || [];
7234         }
7235         function baseFindKey(collection, predicate, eachFunc) {
7236           var result;
7237           eachFunc(collection, function(value, key, collection2) {
7238             if (predicate(value, key, collection2)) {
7239               result = key;
7240               return false;
7241             }
7242           });
7243           return result;
7244         }
7245         function baseFindIndex(array2, predicate, fromIndex, fromRight) {
7246           var length = array2.length, index = fromIndex + (fromRight ? 1 : -1);
7247           while (fromRight ? index-- : ++index < length) {
7248             if (predicate(array2[index], index, array2)) {
7249               return index;
7250             }
7251           }
7252           return -1;
7253         }
7254         function baseIndexOf(array2, value, fromIndex) {
7255           return value === value ? strictIndexOf(array2, value, fromIndex) : baseFindIndex(array2, baseIsNaN, fromIndex);
7256         }
7257         function baseIndexOfWith(array2, value, fromIndex, comparator) {
7258           var index = fromIndex - 1, length = array2.length;
7259           while (++index < length) {
7260             if (comparator(array2[index], value)) {
7261               return index;
7262             }
7263           }
7264           return -1;
7265         }
7266         function baseIsNaN(value) {
7267           return value !== value;
7268         }
7269         function baseMean(array2, iteratee) {
7270           var length = array2 == null ? 0 : array2.length;
7271           return length ? baseSum(array2, iteratee) / length : NAN2;
7272         }
7273         function baseProperty(key) {
7274           return function(object) {
7275             return object == null ? undefined2 : object[key];
7276           };
7277         }
7278         function basePropertyOf2(object) {
7279           return function(key) {
7280             return object == null ? undefined2 : object[key];
7281           };
7282         }
7283         function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
7284           eachFunc(collection, function(value, index, collection2) {
7285             accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2);
7286           });
7287           return accumulator;
7288         }
7289         function baseSortBy(array2, comparer) {
7290           var length = array2.length;
7291           array2.sort(comparer);
7292           while (length--) {
7293             array2[length] = array2[length].value;
7294           }
7295           return array2;
7296         }
7297         function baseSum(array2, iteratee) {
7298           var result, index = -1, length = array2.length;
7299           while (++index < length) {
7300             var current = iteratee(array2[index]);
7301             if (current !== undefined2) {
7302               result = result === undefined2 ? current : result + current;
7303             }
7304           }
7305           return result;
7306         }
7307         function baseTimes2(n2, iteratee) {
7308           var index = -1, result = Array(n2);
7309           while (++index < n2) {
7310             result[index] = iteratee(index);
7311           }
7312           return result;
7313         }
7314         function baseToPairs(object, props) {
7315           return arrayMap2(props, function(key) {
7316             return [key, object[key]];
7317           });
7318         }
7319         function baseTrim2(string) {
7320           return string ? string.slice(0, trimmedEndIndex2(string) + 1).replace(reTrimStart2, "") : string;
7321         }
7322         function baseUnary2(func) {
7323           return function(value) {
7324             return func(value);
7325           };
7326         }
7327         function baseValues(object, props) {
7328           return arrayMap2(props, function(key) {
7329             return object[key];
7330           });
7331         }
7332         function cacheHas2(cache, key) {
7333           return cache.has(key);
7334         }
7335         function charsStartIndex(strSymbols, chrSymbols) {
7336           var index = -1, length = strSymbols.length;
7337           while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
7338           }
7339           return index;
7340         }
7341         function charsEndIndex(strSymbols, chrSymbols) {
7342           var index = strSymbols.length;
7343           while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
7344           }
7345           return index;
7346         }
7347         function countHolders(array2, placeholder) {
7348           var length = array2.length, result = 0;
7349           while (length--) {
7350             if (array2[length] === placeholder) {
7351               ++result;
7352             }
7353           }
7354           return result;
7355         }
7356         var deburrLetter = basePropertyOf2(deburredLetters);
7357         var escapeHtmlChar2 = basePropertyOf2(htmlEscapes2);
7358         function escapeStringChar(chr) {
7359           return "\\" + stringEscapes[chr];
7360         }
7361         function getValue2(object, key) {
7362           return object == null ? undefined2 : object[key];
7363         }
7364         function hasUnicode(string) {
7365           return reHasUnicode.test(string);
7366         }
7367         function hasUnicodeWord(string) {
7368           return reHasUnicodeWord.test(string);
7369         }
7370         function iteratorToArray(iterator) {
7371           var data, result = [];
7372           while (!(data = iterator.next()).done) {
7373             result.push(data.value);
7374           }
7375           return result;
7376         }
7377         function mapToArray2(map2) {
7378           var index = -1, result = Array(map2.size);
7379           map2.forEach(function(value, key) {
7380             result[++index] = [key, value];
7381           });
7382           return result;
7383         }
7384         function overArg2(func, transform2) {
7385           return function(arg) {
7386             return func(transform2(arg));
7387           };
7388         }
7389         function replaceHolders(array2, placeholder) {
7390           var index = -1, length = array2.length, resIndex = 0, result = [];
7391           while (++index < length) {
7392             var value = array2[index];
7393             if (value === placeholder || value === PLACEHOLDER) {
7394               array2[index] = PLACEHOLDER;
7395               result[resIndex++] = index;
7396             }
7397           }
7398           return result;
7399         }
7400         function setToArray2(set3) {
7401           var index = -1, result = Array(set3.size);
7402           set3.forEach(function(value) {
7403             result[++index] = value;
7404           });
7405           return result;
7406         }
7407         function setToPairs(set3) {
7408           var index = -1, result = Array(set3.size);
7409           set3.forEach(function(value) {
7410             result[++index] = [value, value];
7411           });
7412           return result;
7413         }
7414         function strictIndexOf(array2, value, fromIndex) {
7415           var index = fromIndex - 1, length = array2.length;
7416           while (++index < length) {
7417             if (array2[index] === value) {
7418               return index;
7419             }
7420           }
7421           return -1;
7422         }
7423         function strictLastIndexOf(array2, value, fromIndex) {
7424           var index = fromIndex + 1;
7425           while (index--) {
7426             if (array2[index] === value) {
7427               return index;
7428             }
7429           }
7430           return index;
7431         }
7432         function stringSize(string) {
7433           return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
7434         }
7435         function stringToArray(string) {
7436           return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
7437         }
7438         function trimmedEndIndex2(string) {
7439           var index = string.length;
7440           while (index-- && reWhitespace2.test(string.charAt(index))) {
7441           }
7442           return index;
7443         }
7444         var unescapeHtmlChar2 = basePropertyOf2(htmlUnescapes2);
7445         function unicodeSize(string) {
7446           var result = reUnicode.lastIndex = 0;
7447           while (reUnicode.test(string)) {
7448             ++result;
7449           }
7450           return result;
7451         }
7452         function unicodeToArray(string) {
7453           return string.match(reUnicode) || [];
7454         }
7455         function unicodeWords(string) {
7456           return string.match(reUnicodeWord) || [];
7457         }
7458         var runInContext = function runInContext2(context) {
7459           context = context == null ? root3 : _.defaults(root3.Object(), context, _.pick(root3, contextProps));
7460           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;
7461           var arrayProto2 = Array2.prototype, funcProto3 = Function2.prototype, objectProto13 = Object2.prototype;
7462           var coreJsData2 = context["__core-js_shared__"];
7463           var funcToString3 = funcProto3.toString;
7464           var hasOwnProperty10 = objectProto13.hasOwnProperty;
7465           var idCounter = 0;
7466           var maskSrcKey2 = function() {
7467             var uid = /[^.]+$/.exec(coreJsData2 && coreJsData2.keys && coreJsData2.keys.IE_PROTO || "");
7468             return uid ? "Symbol(src)_1." + uid : "";
7469           }();
7470           var nativeObjectToString3 = objectProto13.toString;
7471           var objectCtorString = funcToString3.call(Object2);
7472           var oldDash = root3._;
7473           var reIsNative2 = RegExp2(
7474             "^" + funcToString3.call(hasOwnProperty10).replace(reRegExpChar2, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
7475           );
7476           var Buffer3 = moduleExports3 ? context.Buffer : undefined2, Symbol3 = context.Symbol, Uint8Array3 = context.Uint8Array, allocUnsafe = Buffer3 ? Buffer3.allocUnsafe : undefined2, getPrototype = overArg2(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable3 = objectProto13.propertyIsEnumerable, splice2 = arrayProto2.splice, spreadableSymbol = Symbol3 ? Symbol3.isConcatSpreadable : undefined2, symIterator = Symbol3 ? Symbol3.iterator : undefined2, symToStringTag3 = Symbol3 ? Symbol3.toStringTag : undefined2;
7477           var defineProperty = function() {
7478             try {
7479               var func = getNative2(Object2, "defineProperty");
7480               func({}, "", {});
7481               return func;
7482             } catch (e) {
7483             }
7484           }();
7485           var ctxClearTimeout = context.clearTimeout !== root3.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root3.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root3.setTimeout && context.setTimeout;
7486           var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols2 = Object2.getOwnPropertySymbols, nativeIsBuffer2 = Buffer3 ? Buffer3.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto2.join, nativeKeys2 = overArg2(Object2.keys, Object2), nativeMax2 = Math2.max, nativeMin2 = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto2.reverse;
7487           var DataView3 = getNative2(context, "DataView"), Map3 = getNative2(context, "Map"), Promise3 = getNative2(context, "Promise"), Set3 = getNative2(context, "Set"), WeakMap2 = getNative2(context, "WeakMap"), nativeCreate2 = getNative2(Object2, "create");
7488           var metaMap = WeakMap2 && new WeakMap2();
7489           var realNames = {};
7490           var dataViewCtorString2 = toSource2(DataView3), mapCtorString2 = toSource2(Map3), promiseCtorString2 = toSource2(Promise3), setCtorString2 = toSource2(Set3), weakMapCtorString2 = toSource2(WeakMap2);
7491           var symbolProto3 = Symbol3 ? Symbol3.prototype : undefined2, symbolValueOf2 = symbolProto3 ? symbolProto3.valueOf : undefined2, symbolToString2 = symbolProto3 ? symbolProto3.toString : undefined2;
7492           function lodash(value) {
7493             if (isObjectLike2(value) && !isArray2(value) && !(value instanceof LazyWrapper)) {
7494               if (value instanceof LodashWrapper) {
7495                 return value;
7496               }
7497               if (hasOwnProperty10.call(value, "__wrapped__")) {
7498                 return wrapperClone(value);
7499               }
7500             }
7501             return new LodashWrapper(value);
7502           }
7503           var baseCreate = function() {
7504             function object() {
7505             }
7506             return function(proto) {
7507               if (!isObject3(proto)) {
7508                 return {};
7509               }
7510               if (objectCreate) {
7511                 return objectCreate(proto);
7512               }
7513               object.prototype = proto;
7514               var result2 = new object();
7515               object.prototype = undefined2;
7516               return result2;
7517             };
7518           }();
7519           function baseLodash() {
7520           }
7521           function LodashWrapper(value, chainAll) {
7522             this.__wrapped__ = value;
7523             this.__actions__ = [];
7524             this.__chain__ = !!chainAll;
7525             this.__index__ = 0;
7526             this.__values__ = undefined2;
7527           }
7528           lodash.templateSettings = {
7529             /**
7530              * Used to detect `data` property values to be HTML-escaped.
7531              *
7532              * @memberOf _.templateSettings
7533              * @type {RegExp}
7534              */
7535             "escape": reEscape,
7536             /**
7537              * Used to detect code to be evaluated.
7538              *
7539              * @memberOf _.templateSettings
7540              * @type {RegExp}
7541              */
7542             "evaluate": reEvaluate,
7543             /**
7544              * Used to detect `data` property values to inject.
7545              *
7546              * @memberOf _.templateSettings
7547              * @type {RegExp}
7548              */
7549             "interpolate": reInterpolate,
7550             /**
7551              * Used to reference the data object in the template text.
7552              *
7553              * @memberOf _.templateSettings
7554              * @type {string}
7555              */
7556             "variable": "",
7557             /**
7558              * Used to import variables into the compiled template.
7559              *
7560              * @memberOf _.templateSettings
7561              * @type {Object}
7562              */
7563             "imports": {
7564               /**
7565                * A reference to the `lodash` function.
7566                *
7567                * @memberOf _.templateSettings.imports
7568                * @type {Function}
7569                */
7570               "_": lodash
7571             }
7572           };
7573           lodash.prototype = baseLodash.prototype;
7574           lodash.prototype.constructor = lodash;
7575           LodashWrapper.prototype = baseCreate(baseLodash.prototype);
7576           LodashWrapper.prototype.constructor = LodashWrapper;
7577           function LazyWrapper(value) {
7578             this.__wrapped__ = value;
7579             this.__actions__ = [];
7580             this.__dir__ = 1;
7581             this.__filtered__ = false;
7582             this.__iteratees__ = [];
7583             this.__takeCount__ = MAX_ARRAY_LENGTH;
7584             this.__views__ = [];
7585           }
7586           function lazyClone() {
7587             var result2 = new LazyWrapper(this.__wrapped__);
7588             result2.__actions__ = copyArray(this.__actions__);
7589             result2.__dir__ = this.__dir__;
7590             result2.__filtered__ = this.__filtered__;
7591             result2.__iteratees__ = copyArray(this.__iteratees__);
7592             result2.__takeCount__ = this.__takeCount__;
7593             result2.__views__ = copyArray(this.__views__);
7594             return result2;
7595           }
7596           function lazyReverse() {
7597             if (this.__filtered__) {
7598               var result2 = new LazyWrapper(this);
7599               result2.__dir__ = -1;
7600               result2.__filtered__ = true;
7601             } else {
7602               result2 = this.clone();
7603               result2.__dir__ *= -1;
7604             }
7605             return result2;
7606           }
7607           function lazyValue() {
7608             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__);
7609             if (!isArr || !isRight && arrLength == length && takeCount == length) {
7610               return baseWrapperValue(array2, this.__actions__);
7611             }
7612             var result2 = [];
7613             outer:
7614               while (length-- && resIndex < takeCount) {
7615                 index += dir;
7616                 var iterIndex = -1, value = array2[index];
7617                 while (++iterIndex < iterLength) {
7618                   var data = iteratees[iterIndex], iteratee2 = data.iteratee, type2 = data.type, computed = iteratee2(value);
7619                   if (type2 == LAZY_MAP_FLAG) {
7620                     value = computed;
7621                   } else if (!computed) {
7622                     if (type2 == LAZY_FILTER_FLAG) {
7623                       continue outer;
7624                     } else {
7625                       break outer;
7626                     }
7627                   }
7628                 }
7629                 result2[resIndex++] = value;
7630               }
7631             return result2;
7632           }
7633           LazyWrapper.prototype = baseCreate(baseLodash.prototype);
7634           LazyWrapper.prototype.constructor = LazyWrapper;
7635           function Hash2(entries) {
7636             var index = -1, length = entries == null ? 0 : entries.length;
7637             this.clear();
7638             while (++index < length) {
7639               var entry = entries[index];
7640               this.set(entry[0], entry[1]);
7641             }
7642           }
7643           function hashClear2() {
7644             this.__data__ = nativeCreate2 ? nativeCreate2(null) : {};
7645             this.size = 0;
7646           }
7647           function hashDelete2(key) {
7648             var result2 = this.has(key) && delete this.__data__[key];
7649             this.size -= result2 ? 1 : 0;
7650             return result2;
7651           }
7652           function hashGet2(key) {
7653             var data = this.__data__;
7654             if (nativeCreate2) {
7655               var result2 = data[key];
7656               return result2 === HASH_UNDEFINED4 ? undefined2 : result2;
7657             }
7658             return hasOwnProperty10.call(data, key) ? data[key] : undefined2;
7659           }
7660           function hashHas2(key) {
7661             var data = this.__data__;
7662             return nativeCreate2 ? data[key] !== undefined2 : hasOwnProperty10.call(data, key);
7663           }
7664           function hashSet2(key, value) {
7665             var data = this.__data__;
7666             this.size += this.has(key) ? 0 : 1;
7667             data[key] = nativeCreate2 && value === undefined2 ? HASH_UNDEFINED4 : value;
7668             return this;
7669           }
7670           Hash2.prototype.clear = hashClear2;
7671           Hash2.prototype["delete"] = hashDelete2;
7672           Hash2.prototype.get = hashGet2;
7673           Hash2.prototype.has = hashHas2;
7674           Hash2.prototype.set = hashSet2;
7675           function ListCache2(entries) {
7676             var index = -1, length = entries == null ? 0 : entries.length;
7677             this.clear();
7678             while (++index < length) {
7679               var entry = entries[index];
7680               this.set(entry[0], entry[1]);
7681             }
7682           }
7683           function listCacheClear2() {
7684             this.__data__ = [];
7685             this.size = 0;
7686           }
7687           function listCacheDelete2(key) {
7688             var data = this.__data__, index = assocIndexOf2(data, key);
7689             if (index < 0) {
7690               return false;
7691             }
7692             var lastIndex = data.length - 1;
7693             if (index == lastIndex) {
7694               data.pop();
7695             } else {
7696               splice2.call(data, index, 1);
7697             }
7698             --this.size;
7699             return true;
7700           }
7701           function listCacheGet2(key) {
7702             var data = this.__data__, index = assocIndexOf2(data, key);
7703             return index < 0 ? undefined2 : data[index][1];
7704           }
7705           function listCacheHas2(key) {
7706             return assocIndexOf2(this.__data__, key) > -1;
7707           }
7708           function listCacheSet2(key, value) {
7709             var data = this.__data__, index = assocIndexOf2(data, key);
7710             if (index < 0) {
7711               ++this.size;
7712               data.push([key, value]);
7713             } else {
7714               data[index][1] = value;
7715             }
7716             return this;
7717           }
7718           ListCache2.prototype.clear = listCacheClear2;
7719           ListCache2.prototype["delete"] = listCacheDelete2;
7720           ListCache2.prototype.get = listCacheGet2;
7721           ListCache2.prototype.has = listCacheHas2;
7722           ListCache2.prototype.set = listCacheSet2;
7723           function MapCache2(entries) {
7724             var index = -1, length = entries == null ? 0 : entries.length;
7725             this.clear();
7726             while (++index < length) {
7727               var entry = entries[index];
7728               this.set(entry[0], entry[1]);
7729             }
7730           }
7731           function mapCacheClear2() {
7732             this.size = 0;
7733             this.__data__ = {
7734               "hash": new Hash2(),
7735               "map": new (Map3 || ListCache2)(),
7736               "string": new Hash2()
7737             };
7738           }
7739           function mapCacheDelete2(key) {
7740             var result2 = getMapData2(this, key)["delete"](key);
7741             this.size -= result2 ? 1 : 0;
7742             return result2;
7743           }
7744           function mapCacheGet2(key) {
7745             return getMapData2(this, key).get(key);
7746           }
7747           function mapCacheHas2(key) {
7748             return getMapData2(this, key).has(key);
7749           }
7750           function mapCacheSet2(key, value) {
7751             var data = getMapData2(this, key), size2 = data.size;
7752             data.set(key, value);
7753             this.size += data.size == size2 ? 0 : 1;
7754             return this;
7755           }
7756           MapCache2.prototype.clear = mapCacheClear2;
7757           MapCache2.prototype["delete"] = mapCacheDelete2;
7758           MapCache2.prototype.get = mapCacheGet2;
7759           MapCache2.prototype.has = mapCacheHas2;
7760           MapCache2.prototype.set = mapCacheSet2;
7761           function SetCache2(values2) {
7762             var index = -1, length = values2 == null ? 0 : values2.length;
7763             this.__data__ = new MapCache2();
7764             while (++index < length) {
7765               this.add(values2[index]);
7766             }
7767           }
7768           function setCacheAdd2(value) {
7769             this.__data__.set(value, HASH_UNDEFINED4);
7770             return this;
7771           }
7772           function setCacheHas2(value) {
7773             return this.__data__.has(value);
7774           }
7775           SetCache2.prototype.add = SetCache2.prototype.push = setCacheAdd2;
7776           SetCache2.prototype.has = setCacheHas2;
7777           function Stack2(entries) {
7778             var data = this.__data__ = new ListCache2(entries);
7779             this.size = data.size;
7780           }
7781           function stackClear2() {
7782             this.__data__ = new ListCache2();
7783             this.size = 0;
7784           }
7785           function stackDelete2(key) {
7786             var data = this.__data__, result2 = data["delete"](key);
7787             this.size = data.size;
7788             return result2;
7789           }
7790           function stackGet2(key) {
7791             return this.__data__.get(key);
7792           }
7793           function stackHas2(key) {
7794             return this.__data__.has(key);
7795           }
7796           function stackSet2(key, value) {
7797             var data = this.__data__;
7798             if (data instanceof ListCache2) {
7799               var pairs = data.__data__;
7800               if (!Map3 || pairs.length < LARGE_ARRAY_SIZE2 - 1) {
7801                 pairs.push([key, value]);
7802                 this.size = ++data.size;
7803                 return this;
7804               }
7805               data = this.__data__ = new MapCache2(pairs);
7806             }
7807             data.set(key, value);
7808             this.size = data.size;
7809             return this;
7810           }
7811           Stack2.prototype.clear = stackClear2;
7812           Stack2.prototype["delete"] = stackDelete2;
7813           Stack2.prototype.get = stackGet2;
7814           Stack2.prototype.has = stackHas2;
7815           Stack2.prototype.set = stackSet2;
7816           function arrayLikeKeys2(value, inherited) {
7817             var isArr = isArray2(value), isArg = !isArr && isArguments2(value), isBuff = !isArr && !isArg && isBuffer2(value), isType = !isArr && !isArg && !isBuff && isTypedArray2(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes2(value.length, String2) : [], length = result2.length;
7818             for (var key in value) {
7819               if ((inherited || hasOwnProperty10.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode.
7820               (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers.
7821               isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays.
7822               isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties.
7823               isIndex2(key, length)))) {
7824                 result2.push(key);
7825               }
7826             }
7827             return result2;
7828           }
7829           function arraySample(array2) {
7830             var length = array2.length;
7831             return length ? array2[baseRandom(0, length - 1)] : undefined2;
7832           }
7833           function arraySampleSize(array2, n2) {
7834             return shuffleSelf(copyArray(array2), baseClamp(n2, 0, array2.length));
7835           }
7836           function arrayShuffle(array2) {
7837             return shuffleSelf(copyArray(array2));
7838           }
7839           function assignMergeValue(object, key, value) {
7840             if (value !== undefined2 && !eq2(object[key], value) || value === undefined2 && !(key in object)) {
7841               baseAssignValue(object, key, value);
7842             }
7843           }
7844           function assignValue(object, key, value) {
7845             var objValue = object[key];
7846             if (!(hasOwnProperty10.call(object, key) && eq2(objValue, value)) || value === undefined2 && !(key in object)) {
7847               baseAssignValue(object, key, value);
7848             }
7849           }
7850           function assocIndexOf2(array2, key) {
7851             var length = array2.length;
7852             while (length--) {
7853               if (eq2(array2[length][0], key)) {
7854                 return length;
7855               }
7856             }
7857             return -1;
7858           }
7859           function baseAggregator(collection, setter, iteratee2, accumulator) {
7860             baseEach(collection, function(value, key, collection2) {
7861               setter(accumulator, value, iteratee2(value), collection2);
7862             });
7863             return accumulator;
7864           }
7865           function baseAssign(object, source) {
7866             return object && copyObject(source, keys2(source), object);
7867           }
7868           function baseAssignIn(object, source) {
7869             return object && copyObject(source, keysIn(source), object);
7870           }
7871           function baseAssignValue(object, key, value) {
7872             if (key == "__proto__" && defineProperty) {
7873               defineProperty(object, key, {
7874                 "configurable": true,
7875                 "enumerable": true,
7876                 "value": value,
7877                 "writable": true
7878               });
7879             } else {
7880               object[key] = value;
7881             }
7882           }
7883           function baseAt(object, paths) {
7884             var index = -1, length = paths.length, result2 = Array2(length), skip = object == null;
7885             while (++index < length) {
7886               result2[index] = skip ? undefined2 : get4(object, paths[index]);
7887             }
7888             return result2;
7889           }
7890           function baseClamp(number3, lower2, upper) {
7891             if (number3 === number3) {
7892               if (upper !== undefined2) {
7893                 number3 = number3 <= upper ? number3 : upper;
7894               }
7895               if (lower2 !== undefined2) {
7896                 number3 = number3 >= lower2 ? number3 : lower2;
7897               }
7898             }
7899             return number3;
7900           }
7901           function baseClone(value, bitmask, customizer, key, object, stack) {
7902             var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG;
7903             if (customizer) {
7904               result2 = object ? customizer(value, key, object, stack) : customizer(value);
7905             }
7906             if (result2 !== undefined2) {
7907               return result2;
7908             }
7909             if (!isObject3(value)) {
7910               return value;
7911             }
7912             var isArr = isArray2(value);
7913             if (isArr) {
7914               result2 = initCloneArray(value);
7915               if (!isDeep) {
7916                 return copyArray(value, result2);
7917               }
7918             } else {
7919               var tag = getTag2(value), isFunc = tag == funcTag3 || tag == genTag2;
7920               if (isBuffer2(value)) {
7921                 return cloneBuffer(value, isDeep);
7922               }
7923               if (tag == objectTag4 || tag == argsTag4 || isFunc && !object) {
7924                 result2 = isFlat || isFunc ? {} : initCloneObject(value);
7925                 if (!isDeep) {
7926                   return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value));
7927                 }
7928               } else {
7929                 if (!cloneableTags[tag]) {
7930                   return object ? value : {};
7931                 }
7932                 result2 = initCloneByTag(value, tag, isDeep);
7933               }
7934             }
7935             stack || (stack = new Stack2());
7936             var stacked = stack.get(value);
7937             if (stacked) {
7938               return stacked;
7939             }
7940             stack.set(value, result2);
7941             if (isSet(value)) {
7942               value.forEach(function(subValue) {
7943                 result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
7944               });
7945             } else if (isMap(value)) {
7946               value.forEach(function(subValue, key2) {
7947                 result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
7948               });
7949             }
7950             var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys2 : isFlat ? keysIn : keys2;
7951             var props = isArr ? undefined2 : keysFunc(value);
7952             arrayEach(props || value, function(subValue, key2) {
7953               if (props) {
7954                 key2 = subValue;
7955                 subValue = value[key2];
7956               }
7957               assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack));
7958             });
7959             return result2;
7960           }
7961           function baseConforms(source) {
7962             var props = keys2(source);
7963             return function(object) {
7964               return baseConformsTo(object, source, props);
7965             };
7966           }
7967           function baseConformsTo(object, source, props) {
7968             var length = props.length;
7969             if (object == null) {
7970               return !length;
7971             }
7972             object = Object2(object);
7973             while (length--) {
7974               var key = props[length], predicate = source[key], value = object[key];
7975               if (value === undefined2 && !(key in object) || !predicate(value)) {
7976                 return false;
7977               }
7978             }
7979             return true;
7980           }
7981           function baseDelay(func, wait, args) {
7982             if (typeof func != "function") {
7983               throw new TypeError2(FUNC_ERROR_TEXT3);
7984             }
7985             return setTimeout2(function() {
7986               func.apply(undefined2, args);
7987             }, wait);
7988           }
7989           function baseDifference(array2, values2, iteratee2, comparator) {
7990             var index = -1, includes2 = arrayIncludes, isCommon = true, length = array2.length, result2 = [], valuesLength = values2.length;
7991             if (!length) {
7992               return result2;
7993             }
7994             if (iteratee2) {
7995               values2 = arrayMap2(values2, baseUnary2(iteratee2));
7996             }
7997             if (comparator) {
7998               includes2 = arrayIncludesWith;
7999               isCommon = false;
8000             } else if (values2.length >= LARGE_ARRAY_SIZE2) {
8001               includes2 = cacheHas2;
8002               isCommon = false;
8003               values2 = new SetCache2(values2);
8004             }
8005             outer:
8006               while (++index < length) {
8007                 var value = array2[index], computed = iteratee2 == null ? value : iteratee2(value);
8008                 value = comparator || value !== 0 ? value : 0;
8009                 if (isCommon && computed === computed) {
8010                   var valuesIndex = valuesLength;
8011                   while (valuesIndex--) {
8012                     if (values2[valuesIndex] === computed) {
8013                       continue outer;
8014                     }
8015                   }
8016                   result2.push(value);
8017                 } else if (!includes2(values2, computed, comparator)) {
8018                   result2.push(value);
8019                 }
8020               }
8021             return result2;
8022           }
8023           var baseEach = createBaseEach(baseForOwn);
8024           var baseEachRight = createBaseEach(baseForOwnRight, true);
8025           function baseEvery(collection, predicate) {
8026             var result2 = true;
8027             baseEach(collection, function(value, index, collection2) {
8028               result2 = !!predicate(value, index, collection2);
8029               return result2;
8030             });
8031             return result2;
8032           }
8033           function baseExtremum(array2, iteratee2, comparator) {
8034             var index = -1, length = array2.length;
8035             while (++index < length) {
8036               var value = array2[index], current = iteratee2(value);
8037               if (current != null && (computed === undefined2 ? current === current && !isSymbol2(current) : comparator(current, computed))) {
8038                 var computed = current, result2 = value;
8039               }
8040             }
8041             return result2;
8042           }
8043           function baseFill(array2, value, start2, end) {
8044             var length = array2.length;
8045             start2 = toInteger(start2);
8046             if (start2 < 0) {
8047               start2 = -start2 > length ? 0 : length + start2;
8048             }
8049             end = end === undefined2 || end > length ? length : toInteger(end);
8050             if (end < 0) {
8051               end += length;
8052             }
8053             end = start2 > end ? 0 : toLength(end);
8054             while (start2 < end) {
8055               array2[start2++] = value;
8056             }
8057             return array2;
8058           }
8059           function baseFilter(collection, predicate) {
8060             var result2 = [];
8061             baseEach(collection, function(value, index, collection2) {
8062               if (predicate(value, index, collection2)) {
8063                 result2.push(value);
8064               }
8065             });
8066             return result2;
8067           }
8068           function baseFlatten(array2, depth, predicate, isStrict, result2) {
8069             var index = -1, length = array2.length;
8070             predicate || (predicate = isFlattenable);
8071             result2 || (result2 = []);
8072             while (++index < length) {
8073               var value = array2[index];
8074               if (depth > 0 && predicate(value)) {
8075                 if (depth > 1) {
8076                   baseFlatten(value, depth - 1, predicate, isStrict, result2);
8077                 } else {
8078                   arrayPush2(result2, value);
8079                 }
8080               } else if (!isStrict) {
8081                 result2[result2.length] = value;
8082               }
8083             }
8084             return result2;
8085           }
8086           var baseFor = createBaseFor();
8087           var baseForRight = createBaseFor(true);
8088           function baseForOwn(object, iteratee2) {
8089             return object && baseFor(object, iteratee2, keys2);
8090           }
8091           function baseForOwnRight(object, iteratee2) {
8092             return object && baseForRight(object, iteratee2, keys2);
8093           }
8094           function baseFunctions(object, props) {
8095             return arrayFilter2(props, function(key) {
8096               return isFunction2(object[key]);
8097             });
8098           }
8099           function baseGet(object, path) {
8100             path = castPath(path, object);
8101             var index = 0, length = path.length;
8102             while (object != null && index < length) {
8103               object = object[toKey(path[index++])];
8104             }
8105             return index && index == length ? object : undefined2;
8106           }
8107           function baseGetAllKeys2(object, keysFunc, symbolsFunc) {
8108             var result2 = keysFunc(object);
8109             return isArray2(object) ? result2 : arrayPush2(result2, symbolsFunc(object));
8110           }
8111           function baseGetTag2(value) {
8112             if (value == null) {
8113               return value === undefined2 ? undefinedTag2 : nullTag2;
8114             }
8115             return symToStringTag3 && symToStringTag3 in Object2(value) ? getRawTag2(value) : objectToString2(value);
8116           }
8117           function baseGt(value, other) {
8118             return value > other;
8119           }
8120           function baseHas(object, key) {
8121             return object != null && hasOwnProperty10.call(object, key);
8122           }
8123           function baseHasIn(object, key) {
8124             return object != null && key in Object2(object);
8125           }
8126           function baseInRange(number3, start2, end) {
8127             return number3 >= nativeMin2(start2, end) && number3 < nativeMax2(start2, end);
8128           }
8129           function baseIntersection(arrays, iteratee2, comparator) {
8130             var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = [];
8131             while (othIndex--) {
8132               var array2 = arrays[othIndex];
8133               if (othIndex && iteratee2) {
8134                 array2 = arrayMap2(array2, baseUnary2(iteratee2));
8135               }
8136               maxLength = nativeMin2(array2.length, maxLength);
8137               caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array2.length >= 120) ? new SetCache2(othIndex && array2) : undefined2;
8138             }
8139             array2 = arrays[0];
8140             var index = -1, seen = caches[0];
8141             outer:
8142               while (++index < length && result2.length < maxLength) {
8143                 var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
8144                 value = comparator || value !== 0 ? value : 0;
8145                 if (!(seen ? cacheHas2(seen, computed) : includes2(result2, computed, comparator))) {
8146                   othIndex = othLength;
8147                   while (--othIndex) {
8148                     var cache = caches[othIndex];
8149                     if (!(cache ? cacheHas2(cache, computed) : includes2(arrays[othIndex], computed, comparator))) {
8150                       continue outer;
8151                     }
8152                   }
8153                   if (seen) {
8154                     seen.push(computed);
8155                   }
8156                   result2.push(value);
8157                 }
8158               }
8159             return result2;
8160           }
8161           function baseInverter(object, setter, iteratee2, accumulator) {
8162             baseForOwn(object, function(value, key, object2) {
8163               setter(accumulator, iteratee2(value), key, object2);
8164             });
8165             return accumulator;
8166           }
8167           function baseInvoke(object, path, args) {
8168             path = castPath(path, object);
8169             object = parent(object, path);
8170             var func = object == null ? object : object[toKey(last(path))];
8171             return func == null ? undefined2 : apply(func, object, args);
8172           }
8173           function baseIsArguments2(value) {
8174             return isObjectLike2(value) && baseGetTag2(value) == argsTag4;
8175           }
8176           function baseIsArrayBuffer(value) {
8177             return isObjectLike2(value) && baseGetTag2(value) == arrayBufferTag3;
8178           }
8179           function baseIsDate(value) {
8180             return isObjectLike2(value) && baseGetTag2(value) == dateTag3;
8181           }
8182           function baseIsEqual2(value, other, bitmask, customizer, stack) {
8183             if (value === other) {
8184               return true;
8185             }
8186             if (value == null || other == null || !isObjectLike2(value) && !isObjectLike2(other)) {
8187               return value !== value && other !== other;
8188             }
8189             return baseIsEqualDeep2(value, other, bitmask, customizer, baseIsEqual2, stack);
8190           }
8191           function baseIsEqualDeep2(object, other, bitmask, customizer, equalFunc, stack) {
8192             var objIsArr = isArray2(object), othIsArr = isArray2(other), objTag = objIsArr ? arrayTag3 : getTag2(object), othTag = othIsArr ? arrayTag3 : getTag2(other);
8193             objTag = objTag == argsTag4 ? objectTag4 : objTag;
8194             othTag = othTag == argsTag4 ? objectTag4 : othTag;
8195             var objIsObj = objTag == objectTag4, othIsObj = othTag == objectTag4, isSameTag = objTag == othTag;
8196             if (isSameTag && isBuffer2(object)) {
8197               if (!isBuffer2(other)) {
8198                 return false;
8199               }
8200               objIsArr = true;
8201               objIsObj = false;
8202             }
8203             if (isSameTag && !objIsObj) {
8204               stack || (stack = new Stack2());
8205               return objIsArr || isTypedArray2(object) ? equalArrays2(object, other, bitmask, customizer, equalFunc, stack) : equalByTag2(object, other, objTag, bitmask, customizer, equalFunc, stack);
8206             }
8207             if (!(bitmask & COMPARE_PARTIAL_FLAG5)) {
8208               var objIsWrapped = objIsObj && hasOwnProperty10.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty10.call(other, "__wrapped__");
8209               if (objIsWrapped || othIsWrapped) {
8210                 var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
8211                 stack || (stack = new Stack2());
8212                 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
8213               }
8214             }
8215             if (!isSameTag) {
8216               return false;
8217             }
8218             stack || (stack = new Stack2());
8219             return equalObjects2(object, other, bitmask, customizer, equalFunc, stack);
8220           }
8221           function baseIsMap(value) {
8222             return isObjectLike2(value) && getTag2(value) == mapTag4;
8223           }
8224           function baseIsMatch(object, source, matchData, customizer) {
8225             var index = matchData.length, length = index, noCustomizer = !customizer;
8226             if (object == null) {
8227               return !length;
8228             }
8229             object = Object2(object);
8230             while (index--) {
8231               var data = matchData[index];
8232               if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
8233                 return false;
8234               }
8235             }
8236             while (++index < length) {
8237               data = matchData[index];
8238               var key = data[0], objValue = object[key], srcValue = data[1];
8239               if (noCustomizer && data[2]) {
8240                 if (objValue === undefined2 && !(key in object)) {
8241                   return false;
8242                 }
8243               } else {
8244                 var stack = new Stack2();
8245                 if (customizer) {
8246                   var result2 = customizer(objValue, srcValue, key, object, source, stack);
8247                 }
8248                 if (!(result2 === undefined2 ? baseIsEqual2(srcValue, objValue, COMPARE_PARTIAL_FLAG5 | COMPARE_UNORDERED_FLAG3, customizer, stack) : result2)) {
8249                   return false;
8250                 }
8251               }
8252             }
8253             return true;
8254           }
8255           function baseIsNative2(value) {
8256             if (!isObject3(value) || isMasked2(value)) {
8257               return false;
8258             }
8259             var pattern = isFunction2(value) ? reIsNative2 : reIsHostCtor2;
8260             return pattern.test(toSource2(value));
8261           }
8262           function baseIsRegExp(value) {
8263             return isObjectLike2(value) && baseGetTag2(value) == regexpTag3;
8264           }
8265           function baseIsSet(value) {
8266             return isObjectLike2(value) && getTag2(value) == setTag4;
8267           }
8268           function baseIsTypedArray2(value) {
8269             return isObjectLike2(value) && isLength2(value.length) && !!typedArrayTags2[baseGetTag2(value)];
8270           }
8271           function baseIteratee(value) {
8272             if (typeof value == "function") {
8273               return value;
8274             }
8275             if (value == null) {
8276               return identity4;
8277             }
8278             if (typeof value == "object") {
8279               return isArray2(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
8280             }
8281             return property(value);
8282           }
8283           function baseKeys2(object) {
8284             if (!isPrototype2(object)) {
8285               return nativeKeys2(object);
8286             }
8287             var result2 = [];
8288             for (var key in Object2(object)) {
8289               if (hasOwnProperty10.call(object, key) && key != "constructor") {
8290                 result2.push(key);
8291               }
8292             }
8293             return result2;
8294           }
8295           function baseKeysIn(object) {
8296             if (!isObject3(object)) {
8297               return nativeKeysIn(object);
8298             }
8299             var isProto = isPrototype2(object), result2 = [];
8300             for (var key in object) {
8301               if (!(key == "constructor" && (isProto || !hasOwnProperty10.call(object, key)))) {
8302                 result2.push(key);
8303               }
8304             }
8305             return result2;
8306           }
8307           function baseLt(value, other) {
8308             return value < other;
8309           }
8310           function baseMap(collection, iteratee2) {
8311             var index = -1, result2 = isArrayLike2(collection) ? Array2(collection.length) : [];
8312             baseEach(collection, function(value, key, collection2) {
8313               result2[++index] = iteratee2(value, key, collection2);
8314             });
8315             return result2;
8316           }
8317           function baseMatches(source) {
8318             var matchData = getMatchData(source);
8319             if (matchData.length == 1 && matchData[0][2]) {
8320               return matchesStrictComparable(matchData[0][0], matchData[0][1]);
8321             }
8322             return function(object) {
8323               return object === source || baseIsMatch(object, source, matchData);
8324             };
8325           }
8326           function baseMatchesProperty(path, srcValue) {
8327             if (isKey(path) && isStrictComparable(srcValue)) {
8328               return matchesStrictComparable(toKey(path), srcValue);
8329             }
8330             return function(object) {
8331               var objValue = get4(object, path);
8332               return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual2(srcValue, objValue, COMPARE_PARTIAL_FLAG5 | COMPARE_UNORDERED_FLAG3);
8333             };
8334           }
8335           function baseMerge(object, source, srcIndex, customizer, stack) {
8336             if (object === source) {
8337               return;
8338             }
8339             baseFor(source, function(srcValue, key) {
8340               stack || (stack = new Stack2());
8341               if (isObject3(srcValue)) {
8342                 baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
8343               } else {
8344                 var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : undefined2;
8345                 if (newValue === undefined2) {
8346                   newValue = srcValue;
8347                 }
8348                 assignMergeValue(object, key, newValue);
8349               }
8350             }, keysIn);
8351           }
8352           function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
8353             var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue);
8354             if (stacked) {
8355               assignMergeValue(object, key, stacked);
8356               return;
8357             }
8358             var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : undefined2;
8359             var isCommon = newValue === undefined2;
8360             if (isCommon) {
8361               var isArr = isArray2(srcValue), isBuff = !isArr && isBuffer2(srcValue), isTyped = !isArr && !isBuff && isTypedArray2(srcValue);
8362               newValue = srcValue;
8363               if (isArr || isBuff || isTyped) {
8364                 if (isArray2(objValue)) {
8365                   newValue = objValue;
8366                 } else if (isArrayLikeObject(objValue)) {
8367                   newValue = copyArray(objValue);
8368                 } else if (isBuff) {
8369                   isCommon = false;
8370                   newValue = cloneBuffer(srcValue, true);
8371                 } else if (isTyped) {
8372                   isCommon = false;
8373                   newValue = cloneTypedArray(srcValue, true);
8374                 } else {
8375                   newValue = [];
8376                 }
8377               } else if (isPlainObject(srcValue) || isArguments2(srcValue)) {
8378                 newValue = objValue;
8379                 if (isArguments2(objValue)) {
8380                   newValue = toPlainObject(objValue);
8381                 } else if (!isObject3(objValue) || isFunction2(objValue)) {
8382                   newValue = initCloneObject(srcValue);
8383                 }
8384               } else {
8385                 isCommon = false;
8386               }
8387             }
8388             if (isCommon) {
8389               stack.set(srcValue, newValue);
8390               mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
8391               stack["delete"](srcValue);
8392             }
8393             assignMergeValue(object, key, newValue);
8394           }
8395           function baseNth(array2, n2) {
8396             var length = array2.length;
8397             if (!length) {
8398               return;
8399             }
8400             n2 += n2 < 0 ? length : 0;
8401             return isIndex2(n2, length) ? array2[n2] : undefined2;
8402           }
8403           function baseOrderBy(collection, iteratees, orders) {
8404             if (iteratees.length) {
8405               iteratees = arrayMap2(iteratees, function(iteratee2) {
8406                 if (isArray2(iteratee2)) {
8407                   return function(value) {
8408                     return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2);
8409                   };
8410                 }
8411                 return iteratee2;
8412               });
8413             } else {
8414               iteratees = [identity4];
8415             }
8416             var index = -1;
8417             iteratees = arrayMap2(iteratees, baseUnary2(getIteratee()));
8418             var result2 = baseMap(collection, function(value, key, collection2) {
8419               var criteria = arrayMap2(iteratees, function(iteratee2) {
8420                 return iteratee2(value);
8421               });
8422               return { "criteria": criteria, "index": ++index, "value": value };
8423             });
8424             return baseSortBy(result2, function(object, other) {
8425               return compareMultiple(object, other, orders);
8426             });
8427           }
8428           function basePick(object, paths) {
8429             return basePickBy(object, paths, function(value, path) {
8430               return hasIn(object, path);
8431             });
8432           }
8433           function basePickBy(object, paths, predicate) {
8434             var index = -1, length = paths.length, result2 = {};
8435             while (++index < length) {
8436               var path = paths[index], value = baseGet(object, path);
8437               if (predicate(value, path)) {
8438                 baseSet(result2, castPath(path, object), value);
8439               }
8440             }
8441             return result2;
8442           }
8443           function basePropertyDeep(path) {
8444             return function(object) {
8445               return baseGet(object, path);
8446             };
8447           }
8448           function basePullAll(array2, values2, iteratee2, comparator) {
8449             var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array2;
8450             if (array2 === values2) {
8451               values2 = copyArray(values2);
8452             }
8453             if (iteratee2) {
8454               seen = arrayMap2(array2, baseUnary2(iteratee2));
8455             }
8456             while (++index < length) {
8457               var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value;
8458               while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) {
8459                 if (seen !== array2) {
8460                   splice2.call(seen, fromIndex, 1);
8461                 }
8462                 splice2.call(array2, fromIndex, 1);
8463               }
8464             }
8465             return array2;
8466           }
8467           function basePullAt(array2, indexes) {
8468             var length = array2 ? indexes.length : 0, lastIndex = length - 1;
8469             while (length--) {
8470               var index = indexes[length];
8471               if (length == lastIndex || index !== previous) {
8472                 var previous = index;
8473                 if (isIndex2(index)) {
8474                   splice2.call(array2, index, 1);
8475                 } else {
8476                   baseUnset(array2, index);
8477                 }
8478               }
8479             }
8480             return array2;
8481           }
8482           function baseRandom(lower2, upper) {
8483             return lower2 + nativeFloor(nativeRandom() * (upper - lower2 + 1));
8484           }
8485           function baseRange(start2, end, step, fromRight) {
8486             var index = -1, length = nativeMax2(nativeCeil((end - start2) / (step || 1)), 0), result2 = Array2(length);
8487             while (length--) {
8488               result2[fromRight ? length : ++index] = start2;
8489               start2 += step;
8490             }
8491             return result2;
8492           }
8493           function baseRepeat(string, n2) {
8494             var result2 = "";
8495             if (!string || n2 < 1 || n2 > MAX_SAFE_INTEGER3) {
8496               return result2;
8497             }
8498             do {
8499               if (n2 % 2) {
8500                 result2 += string;
8501               }
8502               n2 = nativeFloor(n2 / 2);
8503               if (n2) {
8504                 string += string;
8505               }
8506             } while (n2);
8507             return result2;
8508           }
8509           function baseRest(func, start2) {
8510             return setToString(overRest(func, start2, identity4), func + "");
8511           }
8512           function baseSample(collection) {
8513             return arraySample(values(collection));
8514           }
8515           function baseSampleSize(collection, n2) {
8516             var array2 = values(collection);
8517             return shuffleSelf(array2, baseClamp(n2, 0, array2.length));
8518           }
8519           function baseSet(object, path, value, customizer) {
8520             if (!isObject3(object)) {
8521               return object;
8522             }
8523             path = castPath(path, object);
8524             var index = -1, length = path.length, lastIndex = length - 1, nested = object;
8525             while (nested != null && ++index < length) {
8526               var key = toKey(path[index]), newValue = value;
8527               if (key === "__proto__" || key === "constructor" || key === "prototype") {
8528                 return object;
8529               }
8530               if (index != lastIndex) {
8531                 var objValue = nested[key];
8532                 newValue = customizer ? customizer(objValue, key, nested) : undefined2;
8533                 if (newValue === undefined2) {
8534                   newValue = isObject3(objValue) ? objValue : isIndex2(path[index + 1]) ? [] : {};
8535                 }
8536               }
8537               assignValue(nested, key, newValue);
8538               nested = nested[key];
8539             }
8540             return object;
8541           }
8542           var baseSetData = !metaMap ? identity4 : function(func, data) {
8543             metaMap.set(func, data);
8544             return func;
8545           };
8546           var baseSetToString = !defineProperty ? identity4 : function(func, string) {
8547             return defineProperty(func, "toString", {
8548               "configurable": true,
8549               "enumerable": false,
8550               "value": constant(string),
8551               "writable": true
8552             });
8553           };
8554           function baseShuffle(collection) {
8555             return shuffleSelf(values(collection));
8556           }
8557           function baseSlice(array2, start2, end) {
8558             var index = -1, length = array2.length;
8559             if (start2 < 0) {
8560               start2 = -start2 > length ? 0 : length + start2;
8561             }
8562             end = end > length ? length : end;
8563             if (end < 0) {
8564               end += length;
8565             }
8566             length = start2 > end ? 0 : end - start2 >>> 0;
8567             start2 >>>= 0;
8568             var result2 = Array2(length);
8569             while (++index < length) {
8570               result2[index] = array2[index + start2];
8571             }
8572             return result2;
8573           }
8574           function baseSome(collection, predicate) {
8575             var result2;
8576             baseEach(collection, function(value, index, collection2) {
8577               result2 = predicate(value, index, collection2);
8578               return !result2;
8579             });
8580             return !!result2;
8581           }
8582           function baseSortedIndex(array2, value, retHighest) {
8583             var low = 0, high = array2 == null ? low : array2.length;
8584             if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
8585               while (low < high) {
8586                 var mid = low + high >>> 1, computed = array2[mid];
8587                 if (computed !== null && !isSymbol2(computed) && (retHighest ? computed <= value : computed < value)) {
8588                   low = mid + 1;
8589                 } else {
8590                   high = mid;
8591                 }
8592               }
8593               return high;
8594             }
8595             return baseSortedIndexBy(array2, value, identity4, retHighest);
8596           }
8597           function baseSortedIndexBy(array2, value, iteratee2, retHighest) {
8598             var low = 0, high = array2 == null ? 0 : array2.length;
8599             if (high === 0) {
8600               return 0;
8601             }
8602             value = iteratee2(value);
8603             var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol2(value), valIsUndefined = value === undefined2;
8604             while (low < high) {
8605               var mid = nativeFloor((low + high) / 2), computed = iteratee2(array2[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol2(computed);
8606               if (valIsNaN) {
8607                 var setLow = retHighest || othIsReflexive;
8608               } else if (valIsUndefined) {
8609                 setLow = othIsReflexive && (retHighest || othIsDefined);
8610               } else if (valIsNull) {
8611                 setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
8612               } else if (valIsSymbol) {
8613                 setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
8614               } else if (othIsNull || othIsSymbol) {
8615                 setLow = false;
8616               } else {
8617                 setLow = retHighest ? computed <= value : computed < value;
8618               }
8619               if (setLow) {
8620                 low = mid + 1;
8621               } else {
8622                 high = mid;
8623               }
8624             }
8625             return nativeMin2(high, MAX_ARRAY_INDEX);
8626           }
8627           function baseSortedUniq(array2, iteratee2) {
8628             var index = -1, length = array2.length, resIndex = 0, result2 = [];
8629             while (++index < length) {
8630               var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
8631               if (!index || !eq2(computed, seen)) {
8632                 var seen = computed;
8633                 result2[resIndex++] = value === 0 ? 0 : value;
8634               }
8635             }
8636             return result2;
8637           }
8638           function baseToNumber(value) {
8639             if (typeof value == "number") {
8640               return value;
8641             }
8642             if (isSymbol2(value)) {
8643               return NAN2;
8644             }
8645             return +value;
8646           }
8647           function baseToString2(value) {
8648             if (typeof value == "string") {
8649               return value;
8650             }
8651             if (isArray2(value)) {
8652               return arrayMap2(value, baseToString2) + "";
8653             }
8654             if (isSymbol2(value)) {
8655               return symbolToString2 ? symbolToString2.call(value) : "";
8656             }
8657             var result2 = value + "";
8658             return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2;
8659           }
8660           function baseUniq(array2, iteratee2, comparator) {
8661             var index = -1, includes2 = arrayIncludes, length = array2.length, isCommon = true, result2 = [], seen = result2;
8662             if (comparator) {
8663               isCommon = false;
8664               includes2 = arrayIncludesWith;
8665             } else if (length >= LARGE_ARRAY_SIZE2) {
8666               var set4 = iteratee2 ? null : createSet(array2);
8667               if (set4) {
8668                 return setToArray2(set4);
8669               }
8670               isCommon = false;
8671               includes2 = cacheHas2;
8672               seen = new SetCache2();
8673             } else {
8674               seen = iteratee2 ? [] : result2;
8675             }
8676             outer:
8677               while (++index < length) {
8678                 var value = array2[index], computed = iteratee2 ? iteratee2(value) : value;
8679                 value = comparator || value !== 0 ? value : 0;
8680                 if (isCommon && computed === computed) {
8681                   var seenIndex = seen.length;
8682                   while (seenIndex--) {
8683                     if (seen[seenIndex] === computed) {
8684                       continue outer;
8685                     }
8686                   }
8687                   if (iteratee2) {
8688                     seen.push(computed);
8689                   }
8690                   result2.push(value);
8691                 } else if (!includes2(seen, computed, comparator)) {
8692                   if (seen !== result2) {
8693                     seen.push(computed);
8694                   }
8695                   result2.push(value);
8696                 }
8697               }
8698             return result2;
8699           }
8700           function baseUnset(object, path) {
8701             path = castPath(path, object);
8702             object = parent(object, path);
8703             return object == null || delete object[toKey(last(path))];
8704           }
8705           function baseUpdate(object, path, updater, customizer) {
8706             return baseSet(object, path, updater(baseGet(object, path)), customizer);
8707           }
8708           function baseWhile(array2, predicate, isDrop, fromRight) {
8709             var length = array2.length, index = fromRight ? length : -1;
8710             while ((fromRight ? index-- : ++index < length) && predicate(array2[index], index, array2)) {
8711             }
8712             return isDrop ? baseSlice(array2, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array2, fromRight ? index + 1 : 0, fromRight ? length : index);
8713           }
8714           function baseWrapperValue(value, actions) {
8715             var result2 = value;
8716             if (result2 instanceof LazyWrapper) {
8717               result2 = result2.value();
8718             }
8719             return arrayReduce(actions, function(result3, action) {
8720               return action.func.apply(action.thisArg, arrayPush2([result3], action.args));
8721             }, result2);
8722           }
8723           function baseXor(arrays, iteratee2, comparator) {
8724             var length = arrays.length;
8725             if (length < 2) {
8726               return length ? baseUniq(arrays[0]) : [];
8727             }
8728             var index = -1, result2 = Array2(length);
8729             while (++index < length) {
8730               var array2 = arrays[index], othIndex = -1;
8731               while (++othIndex < length) {
8732                 if (othIndex != index) {
8733                   result2[index] = baseDifference(result2[index] || array2, arrays[othIndex], iteratee2, comparator);
8734                 }
8735               }
8736             }
8737             return baseUniq(baseFlatten(result2, 1), iteratee2, comparator);
8738           }
8739           function baseZipObject(props, values2, assignFunc) {
8740             var index = -1, length = props.length, valsLength = values2.length, result2 = {};
8741             while (++index < length) {
8742               var value = index < valsLength ? values2[index] : undefined2;
8743               assignFunc(result2, props[index], value);
8744             }
8745             return result2;
8746           }
8747           function castArrayLikeObject(value) {
8748             return isArrayLikeObject(value) ? value : [];
8749           }
8750           function castFunction(value) {
8751             return typeof value == "function" ? value : identity4;
8752           }
8753           function castPath(value, object) {
8754             if (isArray2(value)) {
8755               return value;
8756             }
8757             return isKey(value, object) ? [value] : stringToPath(toString2(value));
8758           }
8759           var castRest = baseRest;
8760           function castSlice(array2, start2, end) {
8761             var length = array2.length;
8762             end = end === undefined2 ? length : end;
8763             return !start2 && end >= length ? array2 : baseSlice(array2, start2, end);
8764           }
8765           var clearTimeout2 = ctxClearTimeout || function(id2) {
8766             return root3.clearTimeout(id2);
8767           };
8768           function cloneBuffer(buffer, isDeep) {
8769             if (isDeep) {
8770               return buffer.slice();
8771             }
8772             var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
8773             buffer.copy(result2);
8774             return result2;
8775           }
8776           function cloneArrayBuffer(arrayBuffer) {
8777             var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength);
8778             new Uint8Array3(result2).set(new Uint8Array3(arrayBuffer));
8779             return result2;
8780           }
8781           function cloneDataView(dataView, isDeep) {
8782             var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
8783             return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
8784           }
8785           function cloneRegExp(regexp) {
8786             var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp));
8787             result2.lastIndex = regexp.lastIndex;
8788             return result2;
8789           }
8790           function cloneSymbol(symbol) {
8791             return symbolValueOf2 ? Object2(symbolValueOf2.call(symbol)) : {};
8792           }
8793           function cloneTypedArray(typedArray, isDeep) {
8794             var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
8795             return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
8796           }
8797           function compareAscending(value, other) {
8798             if (value !== other) {
8799               var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol2(value);
8800               var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol2(other);
8801               if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
8802                 return 1;
8803               }
8804               if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
8805                 return -1;
8806               }
8807             }
8808             return 0;
8809           }
8810           function compareMultiple(object, other, orders) {
8811             var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
8812             while (++index < length) {
8813               var result2 = compareAscending(objCriteria[index], othCriteria[index]);
8814               if (result2) {
8815                 if (index >= ordersLength) {
8816                   return result2;
8817                 }
8818                 var order = orders[index];
8819                 return result2 * (order == "desc" ? -1 : 1);
8820               }
8821             }
8822             return object.index - other.index;
8823           }
8824           function composeArgs(args, partials, holders, isCurried) {
8825             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;
8826             while (++leftIndex < leftLength) {
8827               result2[leftIndex] = partials[leftIndex];
8828             }
8829             while (++argsIndex < holdersLength) {
8830               if (isUncurried || argsIndex < argsLength) {
8831                 result2[holders[argsIndex]] = args[argsIndex];
8832               }
8833             }
8834             while (rangeLength--) {
8835               result2[leftIndex++] = args[argsIndex++];
8836             }
8837             return result2;
8838           }
8839           function composeArgsRight(args, partials, holders, isCurried) {
8840             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;
8841             while (++argsIndex < rangeLength) {
8842               result2[argsIndex] = args[argsIndex];
8843             }
8844             var offset = argsIndex;
8845             while (++rightIndex < rightLength) {
8846               result2[offset + rightIndex] = partials[rightIndex];
8847             }
8848             while (++holdersIndex < holdersLength) {
8849               if (isUncurried || argsIndex < argsLength) {
8850                 result2[offset + holders[holdersIndex]] = args[argsIndex++];
8851               }
8852             }
8853             return result2;
8854           }
8855           function copyArray(source, array2) {
8856             var index = -1, length = source.length;
8857             array2 || (array2 = Array2(length));
8858             while (++index < length) {
8859               array2[index] = source[index];
8860             }
8861             return array2;
8862           }
8863           function copyObject(source, props, object, customizer) {
8864             var isNew = !object;
8865             object || (object = {});
8866             var index = -1, length = props.length;
8867             while (++index < length) {
8868               var key = props[index];
8869               var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined2;
8870               if (newValue === undefined2) {
8871                 newValue = source[key];
8872               }
8873               if (isNew) {
8874                 baseAssignValue(object, key, newValue);
8875               } else {
8876                 assignValue(object, key, newValue);
8877               }
8878             }
8879             return object;
8880           }
8881           function copySymbols(source, object) {
8882             return copyObject(source, getSymbols2(source), object);
8883           }
8884           function copySymbolsIn(source, object) {
8885             return copyObject(source, getSymbolsIn(source), object);
8886           }
8887           function createAggregator(setter, initializer) {
8888             return function(collection, iteratee2) {
8889               var func = isArray2(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {};
8890               return func(collection, setter, getIteratee(iteratee2, 2), accumulator);
8891             };
8892           }
8893           function createAssigner(assigner) {
8894             return baseRest(function(object, sources) {
8895               var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2;
8896               customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2;
8897               if (guard && isIterateeCall(sources[0], sources[1], guard)) {
8898                 customizer = length < 3 ? undefined2 : customizer;
8899                 length = 1;
8900               }
8901               object = Object2(object);
8902               while (++index < length) {
8903                 var source = sources[index];
8904                 if (source) {
8905                   assigner(object, source, index, customizer);
8906                 }
8907               }
8908               return object;
8909             });
8910           }
8911           function createBaseEach(eachFunc, fromRight) {
8912             return function(collection, iteratee2) {
8913               if (collection == null) {
8914                 return collection;
8915               }
8916               if (!isArrayLike2(collection)) {
8917                 return eachFunc(collection, iteratee2);
8918               }
8919               var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection);
8920               while (fromRight ? index-- : ++index < length) {
8921                 if (iteratee2(iterable[index], index, iterable) === false) {
8922                   break;
8923                 }
8924               }
8925               return collection;
8926             };
8927           }
8928           function createBaseFor(fromRight) {
8929             return function(object, iteratee2, keysFunc) {
8930               var index = -1, iterable = Object2(object), props = keysFunc(object), length = props.length;
8931               while (length--) {
8932                 var key = props[fromRight ? length : ++index];
8933                 if (iteratee2(iterable[key], key, iterable) === false) {
8934                   break;
8935                 }
8936               }
8937               return object;
8938             };
8939           }
8940           function createBind(func, bitmask, thisArg) {
8941             var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
8942             function wrapper() {
8943               var fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
8944               return fn.apply(isBind ? thisArg : this, arguments);
8945             }
8946             return wrapper;
8947           }
8948           function createCaseFirst(methodName) {
8949             return function(string) {
8950               string = toString2(string);
8951               var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2;
8952               var chr = strSymbols ? strSymbols[0] : string.charAt(0);
8953               var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1);
8954               return chr[methodName]() + trailing;
8955             };
8956           }
8957           function createCompounder(callback) {
8958             return function(string) {
8959               return arrayReduce(words(deburr(string).replace(reApos, "")), callback, "");
8960             };
8961           }
8962           function createCtor(Ctor) {
8963             return function() {
8964               var args = arguments;
8965               switch (args.length) {
8966                 case 0:
8967                   return new Ctor();
8968                 case 1:
8969                   return new Ctor(args[0]);
8970                 case 2:
8971                   return new Ctor(args[0], args[1]);
8972                 case 3:
8973                   return new Ctor(args[0], args[1], args[2]);
8974                 case 4:
8975                   return new Ctor(args[0], args[1], args[2], args[3]);
8976                 case 5:
8977                   return new Ctor(args[0], args[1], args[2], args[3], args[4]);
8978                 case 6:
8979                   return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
8980                 case 7:
8981                   return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
8982               }
8983               var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args);
8984               return isObject3(result2) ? result2 : thisBinding;
8985             };
8986           }
8987           function createCurry(func, bitmask, arity) {
8988             var Ctor = createCtor(func);
8989             function wrapper() {
8990               var length = arguments.length, args = Array2(length), index = length, placeholder = getHolder(wrapper);
8991               while (index--) {
8992                 args[index] = arguments[index];
8993               }
8994               var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder);
8995               length -= holders.length;
8996               if (length < arity) {
8997                 return createRecurry(
8998                   func,
8999                   bitmask,
9000                   createHybrid,
9001                   wrapper.placeholder,
9002                   undefined2,
9003                   args,
9004                   holders,
9005                   undefined2,
9006                   undefined2,
9007                   arity - length
9008                 );
9009               }
9010               var fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
9011               return apply(fn, this, args);
9012             }
9013             return wrapper;
9014           }
9015           function createFind(findIndexFunc) {
9016             return function(collection, predicate, fromIndex) {
9017               var iterable = Object2(collection);
9018               if (!isArrayLike2(collection)) {
9019                 var iteratee2 = getIteratee(predicate, 3);
9020                 collection = keys2(collection);
9021                 predicate = function(key) {
9022                   return iteratee2(iterable[key], key, iterable);
9023                 };
9024               }
9025               var index = findIndexFunc(collection, predicate, fromIndex);
9026               return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2;
9027             };
9028           }
9029           function createFlow(fromRight) {
9030             return flatRest(function(funcs) {
9031               var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru;
9032               if (fromRight) {
9033                 funcs.reverse();
9034               }
9035               while (index--) {
9036                 var func = funcs[index];
9037                 if (typeof func != "function") {
9038                   throw new TypeError2(FUNC_ERROR_TEXT3);
9039                 }
9040                 if (prereq && !wrapper && getFuncName(func) == "wrapper") {
9041                   var wrapper = new LodashWrapper([], true);
9042                 }
9043               }
9044               index = wrapper ? index : length;
9045               while (++index < length) {
9046                 func = funcs[index];
9047                 var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2;
9048                 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) {
9049                   wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
9050                 } else {
9051                   wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
9052                 }
9053               }
9054               return function() {
9055                 var args = arguments, value = args[0];
9056                 if (wrapper && args.length == 1 && isArray2(value)) {
9057                   return wrapper.plant(value).value();
9058                 }
9059                 var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value;
9060                 while (++index2 < length) {
9061                   result2 = funcs[index2].call(this, result2);
9062                 }
9063                 return result2;
9064               };
9065             });
9066           }
9067           function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) {
9068             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);
9069             function wrapper() {
9070               var length = arguments.length, args = Array2(length), index = length;
9071               while (index--) {
9072                 args[index] = arguments[index];
9073               }
9074               if (isCurried) {
9075                 var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder);
9076               }
9077               if (partials) {
9078                 args = composeArgs(args, partials, holders, isCurried);
9079               }
9080               if (partialsRight) {
9081                 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
9082               }
9083               length -= holdersCount;
9084               if (isCurried && length < arity) {
9085                 var newHolders = replaceHolders(args, placeholder);
9086                 return createRecurry(
9087                   func,
9088                   bitmask,
9089                   createHybrid,
9090                   wrapper.placeholder,
9091                   thisArg,
9092                   args,
9093                   newHolders,
9094                   argPos,
9095                   ary2,
9096                   arity - length
9097                 );
9098               }
9099               var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func;
9100               length = args.length;
9101               if (argPos) {
9102                 args = reorder(args, argPos);
9103               } else if (isFlip && length > 1) {
9104                 args.reverse();
9105               }
9106               if (isAry && ary2 < length) {
9107                 args.length = ary2;
9108               }
9109               if (this && this !== root3 && this instanceof wrapper) {
9110                 fn = Ctor || createCtor(fn);
9111               }
9112               return fn.apply(thisBinding, args);
9113             }
9114             return wrapper;
9115           }
9116           function createInverter(setter, toIteratee) {
9117             return function(object, iteratee2) {
9118               return baseInverter(object, setter, toIteratee(iteratee2), {});
9119             };
9120           }
9121           function createMathOperation(operator, defaultValue) {
9122             return function(value, other) {
9123               var result2;
9124               if (value === undefined2 && other === undefined2) {
9125                 return defaultValue;
9126               }
9127               if (value !== undefined2) {
9128                 result2 = value;
9129               }
9130               if (other !== undefined2) {
9131                 if (result2 === undefined2) {
9132                   return other;
9133                 }
9134                 if (typeof value == "string" || typeof other == "string") {
9135                   value = baseToString2(value);
9136                   other = baseToString2(other);
9137                 } else {
9138                   value = baseToNumber(value);
9139                   other = baseToNumber(other);
9140                 }
9141                 result2 = operator(value, other);
9142               }
9143               return result2;
9144             };
9145           }
9146           function createOver(arrayFunc) {
9147             return flatRest(function(iteratees) {
9148               iteratees = arrayMap2(iteratees, baseUnary2(getIteratee()));
9149               return baseRest(function(args) {
9150                 var thisArg = this;
9151                 return arrayFunc(iteratees, function(iteratee2) {
9152                   return apply(iteratee2, thisArg, args);
9153                 });
9154               });
9155             });
9156           }
9157           function createPadding(length, chars) {
9158             chars = chars === undefined2 ? " " : baseToString2(chars);
9159             var charsLength = chars.length;
9160             if (charsLength < 2) {
9161               return charsLength ? baseRepeat(chars, length) : chars;
9162             }
9163             var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
9164             return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length);
9165           }
9166           function createPartial(func, bitmask, thisArg, partials) {
9167             var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
9168             function wrapper() {
9169               var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn = this && this !== root3 && this instanceof wrapper ? Ctor : func;
9170               while (++leftIndex < leftLength) {
9171                 args[leftIndex] = partials[leftIndex];
9172               }
9173               while (argsLength--) {
9174                 args[leftIndex++] = arguments[++argsIndex];
9175               }
9176               return apply(fn, isBind ? thisArg : this, args);
9177             }
9178             return wrapper;
9179           }
9180           function createRange(fromRight) {
9181             return function(start2, end, step) {
9182               if (step && typeof step != "number" && isIterateeCall(start2, end, step)) {
9183                 end = step = undefined2;
9184               }
9185               start2 = toFinite(start2);
9186               if (end === undefined2) {
9187                 end = start2;
9188                 start2 = 0;
9189               } else {
9190                 end = toFinite(end);
9191               }
9192               step = step === undefined2 ? start2 < end ? 1 : -1 : toFinite(step);
9193               return baseRange(start2, end, step, fromRight);
9194             };
9195           }
9196           function createRelationalOperation(operator) {
9197             return function(value, other) {
9198               if (!(typeof value == "string" && typeof other == "string")) {
9199                 value = toNumber3(value);
9200                 other = toNumber3(other);
9201               }
9202               return operator(value, other);
9203             };
9204           }
9205           function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) {
9206             var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials;
9207             bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
9208             bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
9209             if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
9210               bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
9211             }
9212             var newData = [
9213               func,
9214               bitmask,
9215               thisArg,
9216               newPartials,
9217               newHolders,
9218               newPartialsRight,
9219               newHoldersRight,
9220               argPos,
9221               ary2,
9222               arity
9223             ];
9224             var result2 = wrapFunc.apply(undefined2, newData);
9225             if (isLaziable(func)) {
9226               setData(result2, newData);
9227             }
9228             result2.placeholder = placeholder;
9229             return setWrapToString(result2, func, bitmask);
9230           }
9231           function createRound(methodName) {
9232             var func = Math2[methodName];
9233             return function(number3, precision2) {
9234               number3 = toNumber3(number3);
9235               precision2 = precision2 == null ? 0 : nativeMin2(toInteger(precision2), 292);
9236               if (precision2 && nativeIsFinite(number3)) {
9237                 var pair2 = (toString2(number3) + "e").split("e"), value = func(pair2[0] + "e" + (+pair2[1] + precision2));
9238                 pair2 = (toString2(value) + "e").split("e");
9239                 return +(pair2[0] + "e" + (+pair2[1] - precision2));
9240               }
9241               return func(number3);
9242             };
9243           }
9244           var createSet = !(Set3 && 1 / setToArray2(new Set3([, -0]))[1] == INFINITY2) ? noop3 : function(values2) {
9245             return new Set3(values2);
9246           };
9247           function createToPairs(keysFunc) {
9248             return function(object) {
9249               var tag = getTag2(object);
9250               if (tag == mapTag4) {
9251                 return mapToArray2(object);
9252               }
9253               if (tag == setTag4) {
9254                 return setToPairs(object);
9255               }
9256               return baseToPairs(object, keysFunc(object));
9257             };
9258           }
9259           function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) {
9260             var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
9261             if (!isBindKey && typeof func != "function") {
9262               throw new TypeError2(FUNC_ERROR_TEXT3);
9263             }
9264             var length = partials ? partials.length : 0;
9265             if (!length) {
9266               bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
9267               partials = holders = undefined2;
9268             }
9269             ary2 = ary2 === undefined2 ? ary2 : nativeMax2(toInteger(ary2), 0);
9270             arity = arity === undefined2 ? arity : toInteger(arity);
9271             length -= holders ? holders.length : 0;
9272             if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
9273               var partialsRight = partials, holdersRight = holders;
9274               partials = holders = undefined2;
9275             }
9276             var data = isBindKey ? undefined2 : getData(func);
9277             var newData = [
9278               func,
9279               bitmask,
9280               thisArg,
9281               partials,
9282               holders,
9283               partialsRight,
9284               holdersRight,
9285               argPos,
9286               ary2,
9287               arity
9288             ];
9289             if (data) {
9290               mergeData(newData, data);
9291             }
9292             func = newData[0];
9293             bitmask = newData[1];
9294             thisArg = newData[2];
9295             partials = newData[3];
9296             holders = newData[4];
9297             arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax2(newData[9] - length, 0);
9298             if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
9299               bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
9300             }
9301             if (!bitmask || bitmask == WRAP_BIND_FLAG) {
9302               var result2 = createBind(func, bitmask, thisArg);
9303             } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
9304               result2 = createCurry(func, bitmask, arity);
9305             } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
9306               result2 = createPartial(func, bitmask, thisArg, partials);
9307             } else {
9308               result2 = createHybrid.apply(undefined2, newData);
9309             }
9310             var setter = data ? baseSetData : setData;
9311             return setWrapToString(setter(result2, newData), func, bitmask);
9312           }
9313           function customDefaultsAssignIn(objValue, srcValue, key, object) {
9314             if (objValue === undefined2 || eq2(objValue, objectProto13[key]) && !hasOwnProperty10.call(object, key)) {
9315               return srcValue;
9316             }
9317             return objValue;
9318           }
9319           function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
9320             if (isObject3(objValue) && isObject3(srcValue)) {
9321               stack.set(srcValue, objValue);
9322               baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack);
9323               stack["delete"](srcValue);
9324             }
9325             return objValue;
9326           }
9327           function customOmitClone(value) {
9328             return isPlainObject(value) ? undefined2 : value;
9329           }
9330           function equalArrays2(array2, other, bitmask, customizer, equalFunc, stack) {
9331             var isPartial = bitmask & COMPARE_PARTIAL_FLAG5, arrLength = array2.length, othLength = other.length;
9332             if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
9333               return false;
9334             }
9335             var arrStacked = stack.get(array2);
9336             var othStacked = stack.get(other);
9337             if (arrStacked && othStacked) {
9338               return arrStacked == other && othStacked == array2;
9339             }
9340             var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG3 ? new SetCache2() : undefined2;
9341             stack.set(array2, other);
9342             stack.set(other, array2);
9343             while (++index < arrLength) {
9344               var arrValue = array2[index], othValue = other[index];
9345               if (customizer) {
9346                 var compared = isPartial ? customizer(othValue, arrValue, index, other, array2, stack) : customizer(arrValue, othValue, index, array2, other, stack);
9347               }
9348               if (compared !== undefined2) {
9349                 if (compared) {
9350                   continue;
9351                 }
9352                 result2 = false;
9353                 break;
9354               }
9355               if (seen) {
9356                 if (!arraySome2(other, function(othValue2, othIndex) {
9357                   if (!cacheHas2(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
9358                     return seen.push(othIndex);
9359                   }
9360                 })) {
9361                   result2 = false;
9362                   break;
9363                 }
9364               } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
9365                 result2 = false;
9366                 break;
9367               }
9368             }
9369             stack["delete"](array2);
9370             stack["delete"](other);
9371             return result2;
9372           }
9373           function equalByTag2(object, other, tag, bitmask, customizer, equalFunc, stack) {
9374             switch (tag) {
9375               case dataViewTag4:
9376                 if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
9377                   return false;
9378                 }
9379                 object = object.buffer;
9380                 other = other.buffer;
9381               case arrayBufferTag3:
9382                 if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array3(object), new Uint8Array3(other))) {
9383                   return false;
9384                 }
9385                 return true;
9386               case boolTag3:
9387               case dateTag3:
9388               case numberTag3:
9389                 return eq2(+object, +other);
9390               case errorTag3:
9391                 return object.name == other.name && object.message == other.message;
9392               case regexpTag3:
9393               case stringTag3:
9394                 return object == other + "";
9395               case mapTag4:
9396                 var convert = mapToArray2;
9397               case setTag4:
9398                 var isPartial = bitmask & COMPARE_PARTIAL_FLAG5;
9399                 convert || (convert = setToArray2);
9400                 if (object.size != other.size && !isPartial) {
9401                   return false;
9402                 }
9403                 var stacked = stack.get(object);
9404                 if (stacked) {
9405                   return stacked == other;
9406                 }
9407                 bitmask |= COMPARE_UNORDERED_FLAG3;
9408                 stack.set(object, other);
9409                 var result2 = equalArrays2(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
9410                 stack["delete"](object);
9411                 return result2;
9412               case symbolTag3:
9413                 if (symbolValueOf2) {
9414                   return symbolValueOf2.call(object) == symbolValueOf2.call(other);
9415                 }
9416             }
9417             return false;
9418           }
9419           function equalObjects2(object, other, bitmask, customizer, equalFunc, stack) {
9420             var isPartial = bitmask & COMPARE_PARTIAL_FLAG5, objProps = getAllKeys2(object), objLength = objProps.length, othProps = getAllKeys2(other), othLength = othProps.length;
9421             if (objLength != othLength && !isPartial) {
9422               return false;
9423             }
9424             var index = objLength;
9425             while (index--) {
9426               var key = objProps[index];
9427               if (!(isPartial ? key in other : hasOwnProperty10.call(other, key))) {
9428                 return false;
9429               }
9430             }
9431             var objStacked = stack.get(object);
9432             var othStacked = stack.get(other);
9433             if (objStacked && othStacked) {
9434               return objStacked == other && othStacked == object;
9435             }
9436             var result2 = true;
9437             stack.set(object, other);
9438             stack.set(other, object);
9439             var skipCtor = isPartial;
9440             while (++index < objLength) {
9441               key = objProps[index];
9442               var objValue = object[key], othValue = other[key];
9443               if (customizer) {
9444                 var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
9445               }
9446               if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
9447                 result2 = false;
9448                 break;
9449               }
9450               skipCtor || (skipCtor = key == "constructor");
9451             }
9452             if (result2 && !skipCtor) {
9453               var objCtor = object.constructor, othCtor = other.constructor;
9454               if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
9455                 result2 = false;
9456               }
9457             }
9458             stack["delete"](object);
9459             stack["delete"](other);
9460             return result2;
9461           }
9462           function flatRest(func) {
9463             return setToString(overRest(func, undefined2, flatten2), func + "");
9464           }
9465           function getAllKeys2(object) {
9466             return baseGetAllKeys2(object, keys2, getSymbols2);
9467           }
9468           function getAllKeysIn(object) {
9469             return baseGetAllKeys2(object, keysIn, getSymbolsIn);
9470           }
9471           var getData = !metaMap ? noop3 : function(func) {
9472             return metaMap.get(func);
9473           };
9474           function getFuncName(func) {
9475             var result2 = func.name + "", array2 = realNames[result2], length = hasOwnProperty10.call(realNames, result2) ? array2.length : 0;
9476             while (length--) {
9477               var data = array2[length], otherFunc = data.func;
9478               if (otherFunc == null || otherFunc == func) {
9479                 return data.name;
9480               }
9481             }
9482             return result2;
9483           }
9484           function getHolder(func) {
9485             var object = hasOwnProperty10.call(lodash, "placeholder") ? lodash : func;
9486             return object.placeholder;
9487           }
9488           function getIteratee() {
9489             var result2 = lodash.iteratee || iteratee;
9490             result2 = result2 === iteratee ? baseIteratee : result2;
9491             return arguments.length ? result2(arguments[0], arguments[1]) : result2;
9492           }
9493           function getMapData2(map3, key) {
9494             var data = map3.__data__;
9495             return isKeyable2(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
9496           }
9497           function getMatchData(object) {
9498             var result2 = keys2(object), length = result2.length;
9499             while (length--) {
9500               var key = result2[length], value = object[key];
9501               result2[length] = [key, value, isStrictComparable(value)];
9502             }
9503             return result2;
9504           }
9505           function getNative2(object, key) {
9506             var value = getValue2(object, key);
9507             return baseIsNative2(value) ? value : undefined2;
9508           }
9509           function getRawTag2(value) {
9510             var isOwn = hasOwnProperty10.call(value, symToStringTag3), tag = value[symToStringTag3];
9511             try {
9512               value[symToStringTag3] = undefined2;
9513               var unmasked = true;
9514             } catch (e) {
9515             }
9516             var result2 = nativeObjectToString3.call(value);
9517             if (unmasked) {
9518               if (isOwn) {
9519                 value[symToStringTag3] = tag;
9520               } else {
9521                 delete value[symToStringTag3];
9522               }
9523             }
9524             return result2;
9525           }
9526           var getSymbols2 = !nativeGetSymbols2 ? stubArray2 : function(object) {
9527             if (object == null) {
9528               return [];
9529             }
9530             object = Object2(object);
9531             return arrayFilter2(nativeGetSymbols2(object), function(symbol) {
9532               return propertyIsEnumerable3.call(object, symbol);
9533             });
9534           };
9535           var getSymbolsIn = !nativeGetSymbols2 ? stubArray2 : function(object) {
9536             var result2 = [];
9537             while (object) {
9538               arrayPush2(result2, getSymbols2(object));
9539               object = getPrototype(object);
9540             }
9541             return result2;
9542           };
9543           var getTag2 = baseGetTag2;
9544           if (DataView3 && getTag2(new DataView3(new ArrayBuffer(1))) != dataViewTag4 || Map3 && getTag2(new Map3()) != mapTag4 || Promise3 && getTag2(Promise3.resolve()) != promiseTag2 || Set3 && getTag2(new Set3()) != setTag4 || WeakMap2 && getTag2(new WeakMap2()) != weakMapTag3) {
9545             getTag2 = function(value) {
9546               var result2 = baseGetTag2(value), Ctor = result2 == objectTag4 ? value.constructor : undefined2, ctorString = Ctor ? toSource2(Ctor) : "";
9547               if (ctorString) {
9548                 switch (ctorString) {
9549                   case dataViewCtorString2:
9550                     return dataViewTag4;
9551                   case mapCtorString2:
9552                     return mapTag4;
9553                   case promiseCtorString2:
9554                     return promiseTag2;
9555                   case setCtorString2:
9556                     return setTag4;
9557                   case weakMapCtorString2:
9558                     return weakMapTag3;
9559                 }
9560               }
9561               return result2;
9562             };
9563           }
9564           function getView(start2, end, transforms) {
9565             var index = -1, length = transforms.length;
9566             while (++index < length) {
9567               var data = transforms[index], size2 = data.size;
9568               switch (data.type) {
9569                 case "drop":
9570                   start2 += size2;
9571                   break;
9572                 case "dropRight":
9573                   end -= size2;
9574                   break;
9575                 case "take":
9576                   end = nativeMin2(end, start2 + size2);
9577                   break;
9578                 case "takeRight":
9579                   start2 = nativeMax2(start2, end - size2);
9580                   break;
9581               }
9582             }
9583             return { "start": start2, "end": end };
9584           }
9585           function getWrapDetails(source) {
9586             var match = source.match(reWrapDetails);
9587             return match ? match[1].split(reSplitDetails) : [];
9588           }
9589           function hasPath(object, path, hasFunc) {
9590             path = castPath(path, object);
9591             var index = -1, length = path.length, result2 = false;
9592             while (++index < length) {
9593               var key = toKey(path[index]);
9594               if (!(result2 = object != null && hasFunc(object, key))) {
9595                 break;
9596               }
9597               object = object[key];
9598             }
9599             if (result2 || ++index != length) {
9600               return result2;
9601             }
9602             length = object == null ? 0 : object.length;
9603             return !!length && isLength2(length) && isIndex2(key, length) && (isArray2(object) || isArguments2(object));
9604           }
9605           function initCloneArray(array2) {
9606             var length = array2.length, result2 = new array2.constructor(length);
9607             if (length && typeof array2[0] == "string" && hasOwnProperty10.call(array2, "index")) {
9608               result2.index = array2.index;
9609               result2.input = array2.input;
9610             }
9611             return result2;
9612           }
9613           function initCloneObject(object) {
9614             return typeof object.constructor == "function" && !isPrototype2(object) ? baseCreate(getPrototype(object)) : {};
9615           }
9616           function initCloneByTag(object, tag, isDeep) {
9617             var Ctor = object.constructor;
9618             switch (tag) {
9619               case arrayBufferTag3:
9620                 return cloneArrayBuffer(object);
9621               case boolTag3:
9622               case dateTag3:
9623                 return new Ctor(+object);
9624               case dataViewTag4:
9625                 return cloneDataView(object, isDeep);
9626               case float32Tag2:
9627               case float64Tag2:
9628               case int8Tag2:
9629               case int16Tag2:
9630               case int32Tag2:
9631               case uint8Tag2:
9632               case uint8ClampedTag2:
9633               case uint16Tag2:
9634               case uint32Tag2:
9635                 return cloneTypedArray(object, isDeep);
9636               case mapTag4:
9637                 return new Ctor();
9638               case numberTag3:
9639               case stringTag3:
9640                 return new Ctor(object);
9641               case regexpTag3:
9642                 return cloneRegExp(object);
9643               case setTag4:
9644                 return new Ctor();
9645               case symbolTag3:
9646                 return cloneSymbol(object);
9647             }
9648           }
9649           function insertWrapDetails(source, details) {
9650             var length = details.length;
9651             if (!length) {
9652               return source;
9653             }
9654             var lastIndex = length - 1;
9655             details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex];
9656             details = details.join(length > 2 ? ", " : " ");
9657             return source.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n");
9658           }
9659           function isFlattenable(value) {
9660             return isArray2(value) || isArguments2(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
9661           }
9662           function isIndex2(value, length) {
9663             var type2 = typeof value;
9664             length = length == null ? MAX_SAFE_INTEGER3 : length;
9665             return !!length && (type2 == "number" || type2 != "symbol" && reIsUint2.test(value)) && (value > -1 && value % 1 == 0 && value < length);
9666           }
9667           function isIterateeCall(value, index, object) {
9668             if (!isObject3(object)) {
9669               return false;
9670             }
9671             var type2 = typeof index;
9672             if (type2 == "number" ? isArrayLike2(object) && isIndex2(index, object.length) : type2 == "string" && index in object) {
9673               return eq2(object[index], value);
9674             }
9675             return false;
9676           }
9677           function isKey(value, object) {
9678             if (isArray2(value)) {
9679               return false;
9680             }
9681             var type2 = typeof value;
9682             if (type2 == "number" || type2 == "symbol" || type2 == "boolean" || value == null || isSymbol2(value)) {
9683               return true;
9684             }
9685             return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object);
9686           }
9687           function isKeyable2(value) {
9688             var type2 = typeof value;
9689             return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
9690           }
9691           function isLaziable(func) {
9692             var funcName = getFuncName(func), other = lodash[funcName];
9693             if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) {
9694               return false;
9695             }
9696             if (func === other) {
9697               return true;
9698             }
9699             var data = getData(other);
9700             return !!data && func === data[0];
9701           }
9702           function isMasked2(func) {
9703             return !!maskSrcKey2 && maskSrcKey2 in func;
9704           }
9705           var isMaskable = coreJsData2 ? isFunction2 : stubFalse2;
9706           function isPrototype2(value) {
9707             var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto13;
9708             return value === proto;
9709           }
9710           function isStrictComparable(value) {
9711             return value === value && !isObject3(value);
9712           }
9713           function matchesStrictComparable(key, srcValue) {
9714             return function(object) {
9715               if (object == null) {
9716                 return false;
9717               }
9718               return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object));
9719             };
9720           }
9721           function memoizeCapped(func) {
9722             var result2 = memoize(func, function(key) {
9723               if (cache.size === MAX_MEMOIZE_SIZE) {
9724                 cache.clear();
9725               }
9726               return key;
9727             });
9728             var cache = result2.cache;
9729             return result2;
9730           }
9731           function mergeData(data, source) {
9732             var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
9733             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;
9734             if (!(isCommon || isCombo)) {
9735               return data;
9736             }
9737             if (srcBitmask & WRAP_BIND_FLAG) {
9738               data[2] = source[2];
9739               newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
9740             }
9741             var value = source[3];
9742             if (value) {
9743               var partials = data[3];
9744               data[3] = partials ? composeArgs(partials, value, source[4]) : value;
9745               data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
9746             }
9747             value = source[5];
9748             if (value) {
9749               partials = data[5];
9750               data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
9751               data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
9752             }
9753             value = source[7];
9754             if (value) {
9755               data[7] = value;
9756             }
9757             if (srcBitmask & WRAP_ARY_FLAG) {
9758               data[8] = data[8] == null ? source[8] : nativeMin2(data[8], source[8]);
9759             }
9760             if (data[9] == null) {
9761               data[9] = source[9];
9762             }
9763             data[0] = source[0];
9764             data[1] = newBitmask;
9765             return data;
9766           }
9767           function nativeKeysIn(object) {
9768             var result2 = [];
9769             if (object != null) {
9770               for (var key in Object2(object)) {
9771                 result2.push(key);
9772               }
9773             }
9774             return result2;
9775           }
9776           function objectToString2(value) {
9777             return nativeObjectToString3.call(value);
9778           }
9779           function overRest(func, start2, transform3) {
9780             start2 = nativeMax2(start2 === undefined2 ? func.length - 1 : start2, 0);
9781             return function() {
9782               var args = arguments, index = -1, length = nativeMax2(args.length - start2, 0), array2 = Array2(length);
9783               while (++index < length) {
9784                 array2[index] = args[start2 + index];
9785               }
9786               index = -1;
9787               var otherArgs = Array2(start2 + 1);
9788               while (++index < start2) {
9789                 otherArgs[index] = args[index];
9790               }
9791               otherArgs[start2] = transform3(array2);
9792               return apply(func, this, otherArgs);
9793             };
9794           }
9795           function parent(object, path) {
9796             return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
9797           }
9798           function reorder(array2, indexes) {
9799             var arrLength = array2.length, length = nativeMin2(indexes.length, arrLength), oldArray = copyArray(array2);
9800             while (length--) {
9801               var index = indexes[length];
9802               array2[length] = isIndex2(index, arrLength) ? oldArray[index] : undefined2;
9803             }
9804             return array2;
9805           }
9806           function safeGet(object, key) {
9807             if (key === "constructor" && typeof object[key] === "function") {
9808               return;
9809             }
9810             if (key == "__proto__") {
9811               return;
9812             }
9813             return object[key];
9814           }
9815           var setData = shortOut(baseSetData);
9816           var setTimeout2 = ctxSetTimeout || function(func, wait) {
9817             return root3.setTimeout(func, wait);
9818           };
9819           var setToString = shortOut(baseSetToString);
9820           function setWrapToString(wrapper, reference, bitmask) {
9821             var source = reference + "";
9822             return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
9823           }
9824           function shortOut(func) {
9825             var count = 0, lastCalled = 0;
9826             return function() {
9827               var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
9828               lastCalled = stamp;
9829               if (remaining > 0) {
9830                 if (++count >= HOT_COUNT) {
9831                   return arguments[0];
9832                 }
9833               } else {
9834                 count = 0;
9835               }
9836               return func.apply(undefined2, arguments);
9837             };
9838           }
9839           function shuffleSelf(array2, size2) {
9840             var index = -1, length = array2.length, lastIndex = length - 1;
9841             size2 = size2 === undefined2 ? length : size2;
9842             while (++index < size2) {
9843               var rand = baseRandom(index, lastIndex), value = array2[rand];
9844               array2[rand] = array2[index];
9845               array2[index] = value;
9846             }
9847             array2.length = size2;
9848             return array2;
9849           }
9850           var stringToPath = memoizeCapped(function(string) {
9851             var result2 = [];
9852             if (string.charCodeAt(0) === 46) {
9853               result2.push("");
9854             }
9855             string.replace(rePropName, function(match, number3, quote2, subString) {
9856               result2.push(quote2 ? subString.replace(reEscapeChar, "$1") : number3 || match);
9857             });
9858             return result2;
9859           });
9860           function toKey(value) {
9861             if (typeof value == "string" || isSymbol2(value)) {
9862               return value;
9863             }
9864             var result2 = value + "";
9865             return result2 == "0" && 1 / value == -INFINITY2 ? "-0" : result2;
9866           }
9867           function toSource2(func) {
9868             if (func != null) {
9869               try {
9870                 return funcToString3.call(func);
9871               } catch (e) {
9872               }
9873               try {
9874                 return func + "";
9875               } catch (e) {
9876               }
9877             }
9878             return "";
9879           }
9880           function updateWrapDetails(details, bitmask) {
9881             arrayEach(wrapFlags, function(pair2) {
9882               var value = "_." + pair2[0];
9883               if (bitmask & pair2[1] && !arrayIncludes(details, value)) {
9884                 details.push(value);
9885               }
9886             });
9887             return details.sort();
9888           }
9889           function wrapperClone(wrapper) {
9890             if (wrapper instanceof LazyWrapper) {
9891               return wrapper.clone();
9892             }
9893             var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
9894             result2.__actions__ = copyArray(wrapper.__actions__);
9895             result2.__index__ = wrapper.__index__;
9896             result2.__values__ = wrapper.__values__;
9897             return result2;
9898           }
9899           function chunk(array2, size2, guard) {
9900             if (guard ? isIterateeCall(array2, size2, guard) : size2 === undefined2) {
9901               size2 = 1;
9902             } else {
9903               size2 = nativeMax2(toInteger(size2), 0);
9904             }
9905             var length = array2 == null ? 0 : array2.length;
9906             if (!length || size2 < 1) {
9907               return [];
9908             }
9909             var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2));
9910             while (index < length) {
9911               result2[resIndex++] = baseSlice(array2, index, index += size2);
9912             }
9913             return result2;
9914           }
9915           function compact(array2) {
9916             var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result2 = [];
9917             while (++index < length) {
9918               var value = array2[index];
9919               if (value) {
9920                 result2[resIndex++] = value;
9921               }
9922             }
9923             return result2;
9924           }
9925           function concat() {
9926             var length = arguments.length;
9927             if (!length) {
9928               return [];
9929             }
9930             var args = Array2(length - 1), array2 = arguments[0], index = length;
9931             while (index--) {
9932               args[index - 1] = arguments[index];
9933             }
9934             return arrayPush2(isArray2(array2) ? copyArray(array2) : [array2], baseFlatten(args, 1));
9935           }
9936           var difference = baseRest(function(array2, values2) {
9937             return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true)) : [];
9938           });
9939           var differenceBy = baseRest(function(array2, values2) {
9940             var iteratee2 = last(values2);
9941             if (isArrayLikeObject(iteratee2)) {
9942               iteratee2 = undefined2;
9943             }
9944             return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : [];
9945           });
9946           var differenceWith = baseRest(function(array2, values2) {
9947             var comparator = last(values2);
9948             if (isArrayLikeObject(comparator)) {
9949               comparator = undefined2;
9950             }
9951             return isArrayLikeObject(array2) ? baseDifference(array2, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : [];
9952           });
9953           function drop(array2, n2, guard) {
9954             var length = array2 == null ? 0 : array2.length;
9955             if (!length) {
9956               return [];
9957             }
9958             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
9959             return baseSlice(array2, n2 < 0 ? 0 : n2, length);
9960           }
9961           function dropRight(array2, n2, guard) {
9962             var length = array2 == null ? 0 : array2.length;
9963             if (!length) {
9964               return [];
9965             }
9966             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
9967             n2 = length - n2;
9968             return baseSlice(array2, 0, n2 < 0 ? 0 : n2);
9969           }
9970           function dropRightWhile(array2, predicate) {
9971             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true, true) : [];
9972           }
9973           function dropWhile(array2, predicate) {
9974             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), true) : [];
9975           }
9976           function fill(array2, value, start2, end) {
9977             var length = array2 == null ? 0 : array2.length;
9978             if (!length) {
9979               return [];
9980             }
9981             if (start2 && typeof start2 != "number" && isIterateeCall(array2, value, start2)) {
9982               start2 = 0;
9983               end = length;
9984             }
9985             return baseFill(array2, value, start2, end);
9986           }
9987           function findIndex(array2, predicate, fromIndex) {
9988             var length = array2 == null ? 0 : array2.length;
9989             if (!length) {
9990               return -1;
9991             }
9992             var index = fromIndex == null ? 0 : toInteger(fromIndex);
9993             if (index < 0) {
9994               index = nativeMax2(length + index, 0);
9995             }
9996             return baseFindIndex(array2, getIteratee(predicate, 3), index);
9997           }
9998           function findLastIndex(array2, predicate, fromIndex) {
9999             var length = array2 == null ? 0 : array2.length;
10000             if (!length) {
10001               return -1;
10002             }
10003             var index = length - 1;
10004             if (fromIndex !== undefined2) {
10005               index = toInteger(fromIndex);
10006               index = fromIndex < 0 ? nativeMax2(length + index, 0) : nativeMin2(index, length - 1);
10007             }
10008             return baseFindIndex(array2, getIteratee(predicate, 3), index, true);
10009           }
10010           function flatten2(array2) {
10011             var length = array2 == null ? 0 : array2.length;
10012             return length ? baseFlatten(array2, 1) : [];
10013           }
10014           function flattenDeep(array2) {
10015             var length = array2 == null ? 0 : array2.length;
10016             return length ? baseFlatten(array2, INFINITY2) : [];
10017           }
10018           function flattenDepth(array2, depth) {
10019             var length = array2 == null ? 0 : array2.length;
10020             if (!length) {
10021               return [];
10022             }
10023             depth = depth === undefined2 ? 1 : toInteger(depth);
10024             return baseFlatten(array2, depth);
10025           }
10026           function fromPairs(pairs) {
10027             var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {};
10028             while (++index < length) {
10029               var pair2 = pairs[index];
10030               result2[pair2[0]] = pair2[1];
10031             }
10032             return result2;
10033           }
10034           function head(array2) {
10035             return array2 && array2.length ? array2[0] : undefined2;
10036           }
10037           function indexOf(array2, value, fromIndex) {
10038             var length = array2 == null ? 0 : array2.length;
10039             if (!length) {
10040               return -1;
10041             }
10042             var index = fromIndex == null ? 0 : toInteger(fromIndex);
10043             if (index < 0) {
10044               index = nativeMax2(length + index, 0);
10045             }
10046             return baseIndexOf(array2, value, index);
10047           }
10048           function initial(array2) {
10049             var length = array2 == null ? 0 : array2.length;
10050             return length ? baseSlice(array2, 0, -1) : [];
10051           }
10052           var intersection = baseRest(function(arrays) {
10053             var mapped = arrayMap2(arrays, castArrayLikeObject);
10054             return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
10055           });
10056           var intersectionBy = baseRest(function(arrays) {
10057             var iteratee2 = last(arrays), mapped = arrayMap2(arrays, castArrayLikeObject);
10058             if (iteratee2 === last(mapped)) {
10059               iteratee2 = undefined2;
10060             } else {
10061               mapped.pop();
10062             }
10063             return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : [];
10064           });
10065           var intersectionWith = baseRest(function(arrays) {
10066             var comparator = last(arrays), mapped = arrayMap2(arrays, castArrayLikeObject);
10067             comparator = typeof comparator == "function" ? comparator : undefined2;
10068             if (comparator) {
10069               mapped.pop();
10070             }
10071             return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
10072           });
10073           function join(array2, separator) {
10074             return array2 == null ? "" : nativeJoin.call(array2, separator);
10075           }
10076           function last(array2) {
10077             var length = array2 == null ? 0 : array2.length;
10078             return length ? array2[length - 1] : undefined2;
10079           }
10080           function lastIndexOf(array2, value, fromIndex) {
10081             var length = array2 == null ? 0 : array2.length;
10082             if (!length) {
10083               return -1;
10084             }
10085             var index = length;
10086             if (fromIndex !== undefined2) {
10087               index = toInteger(fromIndex);
10088               index = index < 0 ? nativeMax2(length + index, 0) : nativeMin2(index, length - 1);
10089             }
10090             return value === value ? strictLastIndexOf(array2, value, index) : baseFindIndex(array2, baseIsNaN, index, true);
10091           }
10092           function nth(array2, n2) {
10093             return array2 && array2.length ? baseNth(array2, toInteger(n2)) : undefined2;
10094           }
10095           var pull = baseRest(pullAll);
10096           function pullAll(array2, values2) {
10097             return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2) : array2;
10098           }
10099           function pullAllBy(array2, values2, iteratee2) {
10100             return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2, getIteratee(iteratee2, 2)) : array2;
10101           }
10102           function pullAllWith(array2, values2, comparator) {
10103             return array2 && array2.length && values2 && values2.length ? basePullAll(array2, values2, undefined2, comparator) : array2;
10104           }
10105           var pullAt = flatRest(function(array2, indexes) {
10106             var length = array2 == null ? 0 : array2.length, result2 = baseAt(array2, indexes);
10107             basePullAt(array2, arrayMap2(indexes, function(index) {
10108               return isIndex2(index, length) ? +index : index;
10109             }).sort(compareAscending));
10110             return result2;
10111           });
10112           function remove2(array2, predicate) {
10113             var result2 = [];
10114             if (!(array2 && array2.length)) {
10115               return result2;
10116             }
10117             var index = -1, indexes = [], length = array2.length;
10118             predicate = getIteratee(predicate, 3);
10119             while (++index < length) {
10120               var value = array2[index];
10121               if (predicate(value, index, array2)) {
10122                 result2.push(value);
10123                 indexes.push(index);
10124               }
10125             }
10126             basePullAt(array2, indexes);
10127             return result2;
10128           }
10129           function reverse(array2) {
10130             return array2 == null ? array2 : nativeReverse.call(array2);
10131           }
10132           function slice(array2, start2, end) {
10133             var length = array2 == null ? 0 : array2.length;
10134             if (!length) {
10135               return [];
10136             }
10137             if (end && typeof end != "number" && isIterateeCall(array2, start2, end)) {
10138               start2 = 0;
10139               end = length;
10140             } else {
10141               start2 = start2 == null ? 0 : toInteger(start2);
10142               end = end === undefined2 ? length : toInteger(end);
10143             }
10144             return baseSlice(array2, start2, end);
10145           }
10146           function sortedIndex(array2, value) {
10147             return baseSortedIndex(array2, value);
10148           }
10149           function sortedIndexBy(array2, value, iteratee2) {
10150             return baseSortedIndexBy(array2, value, getIteratee(iteratee2, 2));
10151           }
10152           function sortedIndexOf(array2, value) {
10153             var length = array2 == null ? 0 : array2.length;
10154             if (length) {
10155               var index = baseSortedIndex(array2, value);
10156               if (index < length && eq2(array2[index], value)) {
10157                 return index;
10158               }
10159             }
10160             return -1;
10161           }
10162           function sortedLastIndex(array2, value) {
10163             return baseSortedIndex(array2, value, true);
10164           }
10165           function sortedLastIndexBy(array2, value, iteratee2) {
10166             return baseSortedIndexBy(array2, value, getIteratee(iteratee2, 2), true);
10167           }
10168           function sortedLastIndexOf(array2, value) {
10169             var length = array2 == null ? 0 : array2.length;
10170             if (length) {
10171               var index = baseSortedIndex(array2, value, true) - 1;
10172               if (eq2(array2[index], value)) {
10173                 return index;
10174               }
10175             }
10176             return -1;
10177           }
10178           function sortedUniq(array2) {
10179             return array2 && array2.length ? baseSortedUniq(array2) : [];
10180           }
10181           function sortedUniqBy(array2, iteratee2) {
10182             return array2 && array2.length ? baseSortedUniq(array2, getIteratee(iteratee2, 2)) : [];
10183           }
10184           function tail(array2) {
10185             var length = array2 == null ? 0 : array2.length;
10186             return length ? baseSlice(array2, 1, length) : [];
10187           }
10188           function take(array2, n2, guard) {
10189             if (!(array2 && array2.length)) {
10190               return [];
10191             }
10192             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
10193             return baseSlice(array2, 0, n2 < 0 ? 0 : n2);
10194           }
10195           function takeRight(array2, n2, guard) {
10196             var length = array2 == null ? 0 : array2.length;
10197             if (!length) {
10198               return [];
10199             }
10200             n2 = guard || n2 === undefined2 ? 1 : toInteger(n2);
10201             n2 = length - n2;
10202             return baseSlice(array2, n2 < 0 ? 0 : n2, length);
10203           }
10204           function takeRightWhile(array2, predicate) {
10205             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3), false, true) : [];
10206           }
10207           function takeWhile(array2, predicate) {
10208             return array2 && array2.length ? baseWhile(array2, getIteratee(predicate, 3)) : [];
10209           }
10210           var union = baseRest(function(arrays) {
10211             return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
10212           });
10213           var unionBy = baseRest(function(arrays) {
10214             var iteratee2 = last(arrays);
10215             if (isArrayLikeObject(iteratee2)) {
10216               iteratee2 = undefined2;
10217             }
10218             return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2));
10219           });
10220           var unionWith = baseRest(function(arrays) {
10221             var comparator = last(arrays);
10222             comparator = typeof comparator == "function" ? comparator : undefined2;
10223             return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator);
10224           });
10225           function uniq(array2) {
10226             return array2 && array2.length ? baseUniq(array2) : [];
10227           }
10228           function uniqBy(array2, iteratee2) {
10229             return array2 && array2.length ? baseUniq(array2, getIteratee(iteratee2, 2)) : [];
10230           }
10231           function uniqWith(array2, comparator) {
10232             comparator = typeof comparator == "function" ? comparator : undefined2;
10233             return array2 && array2.length ? baseUniq(array2, undefined2, comparator) : [];
10234           }
10235           function unzip(array2) {
10236             if (!(array2 && array2.length)) {
10237               return [];
10238             }
10239             var length = 0;
10240             array2 = arrayFilter2(array2, function(group) {
10241               if (isArrayLikeObject(group)) {
10242                 length = nativeMax2(group.length, length);
10243                 return true;
10244               }
10245             });
10246             return baseTimes2(length, function(index) {
10247               return arrayMap2(array2, baseProperty(index));
10248             });
10249           }
10250           function unzipWith(array2, iteratee2) {
10251             if (!(array2 && array2.length)) {
10252               return [];
10253             }
10254             var result2 = unzip(array2);
10255             if (iteratee2 == null) {
10256               return result2;
10257             }
10258             return arrayMap2(result2, function(group) {
10259               return apply(iteratee2, undefined2, group);
10260             });
10261           }
10262           var without = baseRest(function(array2, values2) {
10263             return isArrayLikeObject(array2) ? baseDifference(array2, values2) : [];
10264           });
10265           var xor = baseRest(function(arrays) {
10266             return baseXor(arrayFilter2(arrays, isArrayLikeObject));
10267           });
10268           var xorBy = baseRest(function(arrays) {
10269             var iteratee2 = last(arrays);
10270             if (isArrayLikeObject(iteratee2)) {
10271               iteratee2 = undefined2;
10272             }
10273             return baseXor(arrayFilter2(arrays, isArrayLikeObject), getIteratee(iteratee2, 2));
10274           });
10275           var xorWith = baseRest(function(arrays) {
10276             var comparator = last(arrays);
10277             comparator = typeof comparator == "function" ? comparator : undefined2;
10278             return baseXor(arrayFilter2(arrays, isArrayLikeObject), undefined2, comparator);
10279           });
10280           var zip = baseRest(unzip);
10281           function zipObject(props, values2) {
10282             return baseZipObject(props || [], values2 || [], assignValue);
10283           }
10284           function zipObjectDeep(props, values2) {
10285             return baseZipObject(props || [], values2 || [], baseSet);
10286           }
10287           var zipWith = baseRest(function(arrays) {
10288             var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2;
10289             iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2;
10290             return unzipWith(arrays, iteratee2);
10291           });
10292           function chain(value) {
10293             var result2 = lodash(value);
10294             result2.__chain__ = true;
10295             return result2;
10296           }
10297           function tap(value, interceptor) {
10298             interceptor(value);
10299             return value;
10300           }
10301           function thru(value, interceptor) {
10302             return interceptor(value);
10303           }
10304           var wrapperAt = flatRest(function(paths) {
10305             var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) {
10306               return baseAt(object, paths);
10307             };
10308             if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex2(start2)) {
10309               return this.thru(interceptor);
10310             }
10311             value = value.slice(start2, +start2 + (length ? 1 : 0));
10312             value.__actions__.push({
10313               "func": thru,
10314               "args": [interceptor],
10315               "thisArg": undefined2
10316             });
10317             return new LodashWrapper(value, this.__chain__).thru(function(array2) {
10318               if (length && !array2.length) {
10319                 array2.push(undefined2);
10320               }
10321               return array2;
10322             });
10323           });
10324           function wrapperChain() {
10325             return chain(this);
10326           }
10327           function wrapperCommit() {
10328             return new LodashWrapper(this.value(), this.__chain__);
10329           }
10330           function wrapperNext() {
10331             if (this.__values__ === undefined2) {
10332               this.__values__ = toArray(this.value());
10333             }
10334             var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++];
10335             return { "done": done, "value": value };
10336           }
10337           function wrapperToIterator() {
10338             return this;
10339           }
10340           function wrapperPlant(value) {
10341             var result2, parent2 = this;
10342             while (parent2 instanceof baseLodash) {
10343               var clone2 = wrapperClone(parent2);
10344               clone2.__index__ = 0;
10345               clone2.__values__ = undefined2;
10346               if (result2) {
10347                 previous.__wrapped__ = clone2;
10348               } else {
10349                 result2 = clone2;
10350               }
10351               var previous = clone2;
10352               parent2 = parent2.__wrapped__;
10353             }
10354             previous.__wrapped__ = value;
10355             return result2;
10356           }
10357           function wrapperReverse() {
10358             var value = this.__wrapped__;
10359             if (value instanceof LazyWrapper) {
10360               var wrapped = value;
10361               if (this.__actions__.length) {
10362                 wrapped = new LazyWrapper(this);
10363               }
10364               wrapped = wrapped.reverse();
10365               wrapped.__actions__.push({
10366                 "func": thru,
10367                 "args": [reverse],
10368                 "thisArg": undefined2
10369               });
10370               return new LodashWrapper(wrapped, this.__chain__);
10371             }
10372             return this.thru(reverse);
10373           }
10374           function wrapperValue() {
10375             return baseWrapperValue(this.__wrapped__, this.__actions__);
10376           }
10377           var countBy = createAggregator(function(result2, value, key) {
10378             if (hasOwnProperty10.call(result2, key)) {
10379               ++result2[key];
10380             } else {
10381               baseAssignValue(result2, key, 1);
10382             }
10383           });
10384           function every(collection, predicate, guard) {
10385             var func = isArray2(collection) ? arrayEvery : baseEvery;
10386             if (guard && isIterateeCall(collection, predicate, guard)) {
10387               predicate = undefined2;
10388             }
10389             return func(collection, getIteratee(predicate, 3));
10390           }
10391           function filter2(collection, predicate) {
10392             var func = isArray2(collection) ? arrayFilter2 : baseFilter;
10393             return func(collection, getIteratee(predicate, 3));
10394           }
10395           var find2 = createFind(findIndex);
10396           var findLast = createFind(findLastIndex);
10397           function flatMap(collection, iteratee2) {
10398             return baseFlatten(map2(collection, iteratee2), 1);
10399           }
10400           function flatMapDeep(collection, iteratee2) {
10401             return baseFlatten(map2(collection, iteratee2), INFINITY2);
10402           }
10403           function flatMapDepth(collection, iteratee2, depth) {
10404             depth = depth === undefined2 ? 1 : toInteger(depth);
10405             return baseFlatten(map2(collection, iteratee2), depth);
10406           }
10407           function forEach(collection, iteratee2) {
10408             var func = isArray2(collection) ? arrayEach : baseEach;
10409             return func(collection, getIteratee(iteratee2, 3));
10410           }
10411           function forEachRight(collection, iteratee2) {
10412             var func = isArray2(collection) ? arrayEachRight : baseEachRight;
10413             return func(collection, getIteratee(iteratee2, 3));
10414           }
10415           var groupBy = createAggregator(function(result2, value, key) {
10416             if (hasOwnProperty10.call(result2, key)) {
10417               result2[key].push(value);
10418             } else {
10419               baseAssignValue(result2, key, [value]);
10420             }
10421           });
10422           function includes(collection, value, fromIndex, guard) {
10423             collection = isArrayLike2(collection) ? collection : values(collection);
10424             fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
10425             var length = collection.length;
10426             if (fromIndex < 0) {
10427               fromIndex = nativeMax2(length + fromIndex, 0);
10428             }
10429             return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
10430           }
10431           var invokeMap = baseRest(function(collection, path, args) {
10432             var index = -1, isFunc = typeof path == "function", result2 = isArrayLike2(collection) ? Array2(collection.length) : [];
10433             baseEach(collection, function(value) {
10434               result2[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
10435             });
10436             return result2;
10437           });
10438           var keyBy = createAggregator(function(result2, value, key) {
10439             baseAssignValue(result2, key, value);
10440           });
10441           function map2(collection, iteratee2) {
10442             var func = isArray2(collection) ? arrayMap2 : baseMap;
10443             return func(collection, getIteratee(iteratee2, 3));
10444           }
10445           function orderBy(collection, iteratees, orders, guard) {
10446             if (collection == null) {
10447               return [];
10448             }
10449             if (!isArray2(iteratees)) {
10450               iteratees = iteratees == null ? [] : [iteratees];
10451             }
10452             orders = guard ? undefined2 : orders;
10453             if (!isArray2(orders)) {
10454               orders = orders == null ? [] : [orders];
10455             }
10456             return baseOrderBy(collection, iteratees, orders);
10457           }
10458           var partition = createAggregator(function(result2, value, key) {
10459             result2[key ? 0 : 1].push(value);
10460           }, function() {
10461             return [[], []];
10462           });
10463           function reduce(collection, iteratee2, accumulator) {
10464             var func = isArray2(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3;
10465             return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach);
10466           }
10467           function reduceRight(collection, iteratee2, accumulator) {
10468             var func = isArray2(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3;
10469             return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight);
10470           }
10471           function reject(collection, predicate) {
10472             var func = isArray2(collection) ? arrayFilter2 : baseFilter;
10473             return func(collection, negate(getIteratee(predicate, 3)));
10474           }
10475           function sample(collection) {
10476             var func = isArray2(collection) ? arraySample : baseSample;
10477             return func(collection);
10478           }
10479           function sampleSize(collection, n2, guard) {
10480             if (guard ? isIterateeCall(collection, n2, guard) : n2 === undefined2) {
10481               n2 = 1;
10482             } else {
10483               n2 = toInteger(n2);
10484             }
10485             var func = isArray2(collection) ? arraySampleSize : baseSampleSize;
10486             return func(collection, n2);
10487           }
10488           function shuffle(collection) {
10489             var func = isArray2(collection) ? arrayShuffle : baseShuffle;
10490             return func(collection);
10491           }
10492           function size(collection) {
10493             if (collection == null) {
10494               return 0;
10495             }
10496             if (isArrayLike2(collection)) {
10497               return isString(collection) ? stringSize(collection) : collection.length;
10498             }
10499             var tag = getTag2(collection);
10500             if (tag == mapTag4 || tag == setTag4) {
10501               return collection.size;
10502             }
10503             return baseKeys2(collection).length;
10504           }
10505           function some(collection, predicate, guard) {
10506             var func = isArray2(collection) ? arraySome2 : baseSome;
10507             if (guard && isIterateeCall(collection, predicate, guard)) {
10508               predicate = undefined2;
10509             }
10510             return func(collection, getIteratee(predicate, 3));
10511           }
10512           var sortBy = baseRest(function(collection, iteratees) {
10513             if (collection == null) {
10514               return [];
10515             }
10516             var length = iteratees.length;
10517             if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
10518               iteratees = [];
10519             } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
10520               iteratees = [iteratees[0]];
10521             }
10522             return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
10523           });
10524           var now3 = ctxNow || function() {
10525             return root3.Date.now();
10526           };
10527           function after(n2, func) {
10528             if (typeof func != "function") {
10529               throw new TypeError2(FUNC_ERROR_TEXT3);
10530             }
10531             n2 = toInteger(n2);
10532             return function() {
10533               if (--n2 < 1) {
10534                 return func.apply(this, arguments);
10535               }
10536             };
10537           }
10538           function ary(func, n2, guard) {
10539             n2 = guard ? undefined2 : n2;
10540             n2 = func && n2 == null ? func.length : n2;
10541             return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n2);
10542           }
10543           function before(n2, func) {
10544             var result2;
10545             if (typeof func != "function") {
10546               throw new TypeError2(FUNC_ERROR_TEXT3);
10547             }
10548             n2 = toInteger(n2);
10549             return function() {
10550               if (--n2 > 0) {
10551                 result2 = func.apply(this, arguments);
10552               }
10553               if (n2 <= 1) {
10554                 func = undefined2;
10555               }
10556               return result2;
10557             };
10558           }
10559           var bind = baseRest(function(func, thisArg, partials) {
10560             var bitmask = WRAP_BIND_FLAG;
10561             if (partials.length) {
10562               var holders = replaceHolders(partials, getHolder(bind));
10563               bitmask |= WRAP_PARTIAL_FLAG;
10564             }
10565             return createWrap(func, bitmask, thisArg, partials, holders);
10566           });
10567           var bindKey2 = baseRest(function(object, key, partials) {
10568             var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
10569             if (partials.length) {
10570               var holders = replaceHolders(partials, getHolder(bindKey2));
10571               bitmask |= WRAP_PARTIAL_FLAG;
10572             }
10573             return createWrap(key, bitmask, object, partials, holders);
10574           });
10575           function curry(func, arity, guard) {
10576             arity = guard ? undefined2 : arity;
10577             var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
10578             result2.placeholder = curry.placeholder;
10579             return result2;
10580           }
10581           function curryRight(func, arity, guard) {
10582             arity = guard ? undefined2 : arity;
10583             var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
10584             result2.placeholder = curryRight.placeholder;
10585             return result2;
10586           }
10587           function debounce2(func, wait, options2) {
10588             var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
10589             if (typeof func != "function") {
10590               throw new TypeError2(FUNC_ERROR_TEXT3);
10591             }
10592             wait = toNumber3(wait) || 0;
10593             if (isObject3(options2)) {
10594               leading = !!options2.leading;
10595               maxing = "maxWait" in options2;
10596               maxWait = maxing ? nativeMax2(toNumber3(options2.maxWait) || 0, wait) : maxWait;
10597               trailing = "trailing" in options2 ? !!options2.trailing : trailing;
10598             }
10599             function invokeFunc(time) {
10600               var args = lastArgs, thisArg = lastThis;
10601               lastArgs = lastThis = undefined2;
10602               lastInvokeTime = time;
10603               result2 = func.apply(thisArg, args);
10604               return result2;
10605             }
10606             function leadingEdge(time) {
10607               lastInvokeTime = time;
10608               timerId = setTimeout2(timerExpired, wait);
10609               return leading ? invokeFunc(time) : result2;
10610             }
10611             function remainingWait(time) {
10612               var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
10613               return maxing ? nativeMin2(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
10614             }
10615             function shouldInvoke(time) {
10616               var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
10617               return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
10618             }
10619             function timerExpired() {
10620               var time = now3();
10621               if (shouldInvoke(time)) {
10622                 return trailingEdge(time);
10623               }
10624               timerId = setTimeout2(timerExpired, remainingWait(time));
10625             }
10626             function trailingEdge(time) {
10627               timerId = undefined2;
10628               if (trailing && lastArgs) {
10629                 return invokeFunc(time);
10630               }
10631               lastArgs = lastThis = undefined2;
10632               return result2;
10633             }
10634             function cancel() {
10635               if (timerId !== undefined2) {
10636                 clearTimeout2(timerId);
10637               }
10638               lastInvokeTime = 0;
10639               lastArgs = lastCallTime = lastThis = timerId = undefined2;
10640             }
10641             function flush() {
10642               return timerId === undefined2 ? result2 : trailingEdge(now3());
10643             }
10644             function debounced() {
10645               var time = now3(), isInvoking = shouldInvoke(time);
10646               lastArgs = arguments;
10647               lastThis = this;
10648               lastCallTime = time;
10649               if (isInvoking) {
10650                 if (timerId === undefined2) {
10651                   return leadingEdge(lastCallTime);
10652                 }
10653                 if (maxing) {
10654                   clearTimeout2(timerId);
10655                   timerId = setTimeout2(timerExpired, wait);
10656                   return invokeFunc(lastCallTime);
10657                 }
10658               }
10659               if (timerId === undefined2) {
10660                 timerId = setTimeout2(timerExpired, wait);
10661               }
10662               return result2;
10663             }
10664             debounced.cancel = cancel;
10665             debounced.flush = flush;
10666             return debounced;
10667           }
10668           var defer = baseRest(function(func, args) {
10669             return baseDelay(func, 1, args);
10670           });
10671           var delay = baseRest(function(func, wait, args) {
10672             return baseDelay(func, toNumber3(wait) || 0, args);
10673           });
10674           function flip(func) {
10675             return createWrap(func, WRAP_FLIP_FLAG);
10676           }
10677           function memoize(func, resolver) {
10678             if (typeof func != "function" || resolver != null && typeof resolver != "function") {
10679               throw new TypeError2(FUNC_ERROR_TEXT3);
10680             }
10681             var memoized = function() {
10682               var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
10683               if (cache.has(key)) {
10684                 return cache.get(key);
10685               }
10686               var result2 = func.apply(this, args);
10687               memoized.cache = cache.set(key, result2) || cache;
10688               return result2;
10689             };
10690             memoized.cache = new (memoize.Cache || MapCache2)();
10691             return memoized;
10692           }
10693           memoize.Cache = MapCache2;
10694           function negate(predicate) {
10695             if (typeof predicate != "function") {
10696               throw new TypeError2(FUNC_ERROR_TEXT3);
10697             }
10698             return function() {
10699               var args = arguments;
10700               switch (args.length) {
10701                 case 0:
10702                   return !predicate.call(this);
10703                 case 1:
10704                   return !predicate.call(this, args[0]);
10705                 case 2:
10706                   return !predicate.call(this, args[0], args[1]);
10707                 case 3:
10708                   return !predicate.call(this, args[0], args[1], args[2]);
10709               }
10710               return !predicate.apply(this, args);
10711             };
10712           }
10713           function once(func) {
10714             return before(2, func);
10715           }
10716           var overArgs = castRest(function(func, transforms) {
10717             transforms = transforms.length == 1 && isArray2(transforms[0]) ? arrayMap2(transforms[0], baseUnary2(getIteratee())) : arrayMap2(baseFlatten(transforms, 1), baseUnary2(getIteratee()));
10718             var funcsLength = transforms.length;
10719             return baseRest(function(args) {
10720               var index = -1, length = nativeMin2(args.length, funcsLength);
10721               while (++index < length) {
10722                 args[index] = transforms[index].call(this, args[index]);
10723               }
10724               return apply(func, this, args);
10725             });
10726           });
10727           var partial = baseRest(function(func, partials) {
10728             var holders = replaceHolders(partials, getHolder(partial));
10729             return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders);
10730           });
10731           var partialRight = baseRest(function(func, partials) {
10732             var holders = replaceHolders(partials, getHolder(partialRight));
10733             return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders);
10734           });
10735           var rearg = flatRest(function(func, indexes) {
10736             return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes);
10737           });
10738           function rest(func, start2) {
10739             if (typeof func != "function") {
10740               throw new TypeError2(FUNC_ERROR_TEXT3);
10741             }
10742             start2 = start2 === undefined2 ? start2 : toInteger(start2);
10743             return baseRest(func, start2);
10744           }
10745           function spread(func, start2) {
10746             if (typeof func != "function") {
10747               throw new TypeError2(FUNC_ERROR_TEXT3);
10748             }
10749             start2 = start2 == null ? 0 : nativeMax2(toInteger(start2), 0);
10750             return baseRest(function(args) {
10751               var array2 = args[start2], otherArgs = castSlice(args, 0, start2);
10752               if (array2) {
10753                 arrayPush2(otherArgs, array2);
10754               }
10755               return apply(func, this, otherArgs);
10756             });
10757           }
10758           function throttle2(func, wait, options2) {
10759             var leading = true, trailing = true;
10760             if (typeof func != "function") {
10761               throw new TypeError2(FUNC_ERROR_TEXT3);
10762             }
10763             if (isObject3(options2)) {
10764               leading = "leading" in options2 ? !!options2.leading : leading;
10765               trailing = "trailing" in options2 ? !!options2.trailing : trailing;
10766             }
10767             return debounce2(func, wait, {
10768               "leading": leading,
10769               "maxWait": wait,
10770               "trailing": trailing
10771             });
10772           }
10773           function unary(func) {
10774             return ary(func, 1);
10775           }
10776           function wrap2(value, wrapper) {
10777             return partial(castFunction(wrapper), value);
10778           }
10779           function castArray() {
10780             if (!arguments.length) {
10781               return [];
10782             }
10783             var value = arguments[0];
10784             return isArray2(value) ? value : [value];
10785           }
10786           function clone(value) {
10787             return baseClone(value, CLONE_SYMBOLS_FLAG);
10788           }
10789           function cloneWith(value, customizer) {
10790             customizer = typeof customizer == "function" ? customizer : undefined2;
10791             return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
10792           }
10793           function cloneDeep(value) {
10794             return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
10795           }
10796           function cloneDeepWith(value, customizer) {
10797             customizer = typeof customizer == "function" ? customizer : undefined2;
10798             return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
10799           }
10800           function conformsTo(object, source) {
10801             return source == null || baseConformsTo(object, source, keys2(source));
10802           }
10803           function eq2(value, other) {
10804             return value === other || value !== value && other !== other;
10805           }
10806           var gt = createRelationalOperation(baseGt);
10807           var gte = createRelationalOperation(function(value, other) {
10808             return value >= other;
10809           });
10810           var isArguments2 = baseIsArguments2(function() {
10811             return arguments;
10812           }()) ? baseIsArguments2 : function(value) {
10813             return isObjectLike2(value) && hasOwnProperty10.call(value, "callee") && !propertyIsEnumerable3.call(value, "callee");
10814           };
10815           var isArray2 = Array2.isArray;
10816           var isArrayBuffer = nodeIsArrayBuffer ? baseUnary2(nodeIsArrayBuffer) : baseIsArrayBuffer;
10817           function isArrayLike2(value) {
10818             return value != null && isLength2(value.length) && !isFunction2(value);
10819           }
10820           function isArrayLikeObject(value) {
10821             return isObjectLike2(value) && isArrayLike2(value);
10822           }
10823           function isBoolean(value) {
10824             return value === true || value === false || isObjectLike2(value) && baseGetTag2(value) == boolTag3;
10825           }
10826           var isBuffer2 = nativeIsBuffer2 || stubFalse2;
10827           var isDate = nodeIsDate ? baseUnary2(nodeIsDate) : baseIsDate;
10828           function isElement2(value) {
10829             return isObjectLike2(value) && value.nodeType === 1 && !isPlainObject(value);
10830           }
10831           function isEmpty(value) {
10832             if (value == null) {
10833               return true;
10834             }
10835             if (isArrayLike2(value) && (isArray2(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer2(value) || isTypedArray2(value) || isArguments2(value))) {
10836               return !value.length;
10837             }
10838             var tag = getTag2(value);
10839             if (tag == mapTag4 || tag == setTag4) {
10840               return !value.size;
10841             }
10842             if (isPrototype2(value)) {
10843               return !baseKeys2(value).length;
10844             }
10845             for (var key in value) {
10846               if (hasOwnProperty10.call(value, key)) {
10847                 return false;
10848               }
10849             }
10850             return true;
10851           }
10852           function isEqual4(value, other) {
10853             return baseIsEqual2(value, other);
10854           }
10855           function isEqualWith(value, other, customizer) {
10856             customizer = typeof customizer == "function" ? customizer : undefined2;
10857             var result2 = customizer ? customizer(value, other) : undefined2;
10858             return result2 === undefined2 ? baseIsEqual2(value, other, undefined2, customizer) : !!result2;
10859           }
10860           function isError(value) {
10861             if (!isObjectLike2(value)) {
10862               return false;
10863             }
10864             var tag = baseGetTag2(value);
10865             return tag == errorTag3 || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value);
10866           }
10867           function isFinite2(value) {
10868             return typeof value == "number" && nativeIsFinite(value);
10869           }
10870           function isFunction2(value) {
10871             if (!isObject3(value)) {
10872               return false;
10873             }
10874             var tag = baseGetTag2(value);
10875             return tag == funcTag3 || tag == genTag2 || tag == asyncTag2 || tag == proxyTag2;
10876           }
10877           function isInteger(value) {
10878             return typeof value == "number" && value == toInteger(value);
10879           }
10880           function isLength2(value) {
10881             return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER3;
10882           }
10883           function isObject3(value) {
10884             var type2 = typeof value;
10885             return value != null && (type2 == "object" || type2 == "function");
10886           }
10887           function isObjectLike2(value) {
10888             return value != null && typeof value == "object";
10889           }
10890           var isMap = nodeIsMap ? baseUnary2(nodeIsMap) : baseIsMap;
10891           function isMatch(object, source) {
10892             return object === source || baseIsMatch(object, source, getMatchData(source));
10893           }
10894           function isMatchWith(object, source, customizer) {
10895             customizer = typeof customizer == "function" ? customizer : undefined2;
10896             return baseIsMatch(object, source, getMatchData(source), customizer);
10897           }
10898           function isNaN2(value) {
10899             return isNumber2(value) && value != +value;
10900           }
10901           function isNative(value) {
10902             if (isMaskable(value)) {
10903               throw new Error2(CORE_ERROR_TEXT);
10904             }
10905             return baseIsNative2(value);
10906           }
10907           function isNull(value) {
10908             return value === null;
10909           }
10910           function isNil(value) {
10911             return value == null;
10912           }
10913           function isNumber2(value) {
10914             return typeof value == "number" || isObjectLike2(value) && baseGetTag2(value) == numberTag3;
10915           }
10916           function isPlainObject(value) {
10917             if (!isObjectLike2(value) || baseGetTag2(value) != objectTag4) {
10918               return false;
10919             }
10920             var proto = getPrototype(value);
10921             if (proto === null) {
10922               return true;
10923             }
10924             var Ctor = hasOwnProperty10.call(proto, "constructor") && proto.constructor;
10925             return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString3.call(Ctor) == objectCtorString;
10926           }
10927           var isRegExp = nodeIsRegExp ? baseUnary2(nodeIsRegExp) : baseIsRegExp;
10928           function isSafeInteger(value) {
10929             return isInteger(value) && value >= -MAX_SAFE_INTEGER3 && value <= MAX_SAFE_INTEGER3;
10930           }
10931           var isSet = nodeIsSet ? baseUnary2(nodeIsSet) : baseIsSet;
10932           function isString(value) {
10933             return typeof value == "string" || !isArray2(value) && isObjectLike2(value) && baseGetTag2(value) == stringTag3;
10934           }
10935           function isSymbol2(value) {
10936             return typeof value == "symbol" || isObjectLike2(value) && baseGetTag2(value) == symbolTag3;
10937           }
10938           var isTypedArray2 = nodeIsTypedArray2 ? baseUnary2(nodeIsTypedArray2) : baseIsTypedArray2;
10939           function isUndefined(value) {
10940             return value === undefined2;
10941           }
10942           function isWeakMap(value) {
10943             return isObjectLike2(value) && getTag2(value) == weakMapTag3;
10944           }
10945           function isWeakSet(value) {
10946             return isObjectLike2(value) && baseGetTag2(value) == weakSetTag;
10947           }
10948           var lt = createRelationalOperation(baseLt);
10949           var lte = createRelationalOperation(function(value, other) {
10950             return value <= other;
10951           });
10952           function toArray(value) {
10953             if (!value) {
10954               return [];
10955             }
10956             if (isArrayLike2(value)) {
10957               return isString(value) ? stringToArray(value) : copyArray(value);
10958             }
10959             if (symIterator && value[symIterator]) {
10960               return iteratorToArray(value[symIterator]());
10961             }
10962             var tag = getTag2(value), func = tag == mapTag4 ? mapToArray2 : tag == setTag4 ? setToArray2 : values;
10963             return func(value);
10964           }
10965           function toFinite(value) {
10966             if (!value) {
10967               return value === 0 ? value : 0;
10968             }
10969             value = toNumber3(value);
10970             if (value === INFINITY2 || value === -INFINITY2) {
10971               var sign2 = value < 0 ? -1 : 1;
10972               return sign2 * MAX_INTEGER;
10973             }
10974             return value === value ? value : 0;
10975           }
10976           function toInteger(value) {
10977             var result2 = toFinite(value), remainder = result2 % 1;
10978             return result2 === result2 ? remainder ? result2 - remainder : result2 : 0;
10979           }
10980           function toLength(value) {
10981             return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
10982           }
10983           function toNumber3(value) {
10984             if (typeof value == "number") {
10985               return value;
10986             }
10987             if (isSymbol2(value)) {
10988               return NAN2;
10989             }
10990             if (isObject3(value)) {
10991               var other = typeof value.valueOf == "function" ? value.valueOf() : value;
10992               value = isObject3(other) ? other + "" : other;
10993             }
10994             if (typeof value != "string") {
10995               return value === 0 ? value : +value;
10996             }
10997             value = baseTrim2(value);
10998             var isBinary = reIsBinary2.test(value);
10999             return isBinary || reIsOctal2.test(value) ? freeParseInt2(value.slice(2), isBinary ? 2 : 8) : reIsBadHex2.test(value) ? NAN2 : +value;
11000           }
11001           function toPlainObject(value) {
11002             return copyObject(value, keysIn(value));
11003           }
11004           function toSafeInteger(value) {
11005             return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER3, MAX_SAFE_INTEGER3) : value === 0 ? value : 0;
11006           }
11007           function toString2(value) {
11008             return value == null ? "" : baseToString2(value);
11009           }
11010           var assign = createAssigner(function(object, source) {
11011             if (isPrototype2(source) || isArrayLike2(source)) {
11012               copyObject(source, keys2(source), object);
11013               return;
11014             }
11015             for (var key in source) {
11016               if (hasOwnProperty10.call(source, key)) {
11017                 assignValue(object, key, source[key]);
11018               }
11019             }
11020           });
11021           var assignIn = createAssigner(function(object, source) {
11022             copyObject(source, keysIn(source), object);
11023           });
11024           var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
11025             copyObject(source, keysIn(source), object, customizer);
11026           });
11027           var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
11028             copyObject(source, keys2(source), object, customizer);
11029           });
11030           var at = flatRest(baseAt);
11031           function create2(prototype, properties) {
11032             var result2 = baseCreate(prototype);
11033             return properties == null ? result2 : baseAssign(result2, properties);
11034           }
11035           var defaults2 = baseRest(function(object, sources) {
11036             object = Object2(object);
11037             var index = -1;
11038             var length = sources.length;
11039             var guard = length > 2 ? sources[2] : undefined2;
11040             if (guard && isIterateeCall(sources[0], sources[1], guard)) {
11041               length = 1;
11042             }
11043             while (++index < length) {
11044               var source = sources[index];
11045               var props = keysIn(source);
11046               var propsIndex = -1;
11047               var propsLength = props.length;
11048               while (++propsIndex < propsLength) {
11049                 var key = props[propsIndex];
11050                 var value = object[key];
11051                 if (value === undefined2 || eq2(value, objectProto13[key]) && !hasOwnProperty10.call(object, key)) {
11052                   object[key] = source[key];
11053                 }
11054               }
11055             }
11056             return object;
11057           });
11058           var defaultsDeep = baseRest(function(args) {
11059             args.push(undefined2, customDefaultsMerge);
11060             return apply(mergeWith, undefined2, args);
11061           });
11062           function findKey(object, predicate) {
11063             return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
11064           }
11065           function findLastKey(object, predicate) {
11066             return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
11067           }
11068           function forIn(object, iteratee2) {
11069             return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn);
11070           }
11071           function forInRight(object, iteratee2) {
11072             return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn);
11073           }
11074           function forOwn(object, iteratee2) {
11075             return object && baseForOwn(object, getIteratee(iteratee2, 3));
11076           }
11077           function forOwnRight(object, iteratee2) {
11078             return object && baseForOwnRight(object, getIteratee(iteratee2, 3));
11079           }
11080           function functions(object) {
11081             return object == null ? [] : baseFunctions(object, keys2(object));
11082           }
11083           function functionsIn(object) {
11084             return object == null ? [] : baseFunctions(object, keysIn(object));
11085           }
11086           function get4(object, path, defaultValue) {
11087             var result2 = object == null ? undefined2 : baseGet(object, path);
11088             return result2 === undefined2 ? defaultValue : result2;
11089           }
11090           function has(object, path) {
11091             return object != null && hasPath(object, path, baseHas);
11092           }
11093           function hasIn(object, path) {
11094             return object != null && hasPath(object, path, baseHasIn);
11095           }
11096           var invert = createInverter(function(result2, value, key) {
11097             if (value != null && typeof value.toString != "function") {
11098               value = nativeObjectToString3.call(value);
11099             }
11100             result2[value] = key;
11101           }, constant(identity4));
11102           var invertBy = createInverter(function(result2, value, key) {
11103             if (value != null && typeof value.toString != "function") {
11104               value = nativeObjectToString3.call(value);
11105             }
11106             if (hasOwnProperty10.call(result2, value)) {
11107               result2[value].push(key);
11108             } else {
11109               result2[value] = [key];
11110             }
11111           }, getIteratee);
11112           var invoke = baseRest(baseInvoke);
11113           function keys2(object) {
11114             return isArrayLike2(object) ? arrayLikeKeys2(object) : baseKeys2(object);
11115           }
11116           function keysIn(object) {
11117             return isArrayLike2(object) ? arrayLikeKeys2(object, true) : baseKeysIn(object);
11118           }
11119           function mapKeys(object, iteratee2) {
11120             var result2 = {};
11121             iteratee2 = getIteratee(iteratee2, 3);
11122             baseForOwn(object, function(value, key, object2) {
11123               baseAssignValue(result2, iteratee2(value, key, object2), value);
11124             });
11125             return result2;
11126           }
11127           function mapValues(object, iteratee2) {
11128             var result2 = {};
11129             iteratee2 = getIteratee(iteratee2, 3);
11130             baseForOwn(object, function(value, key, object2) {
11131               baseAssignValue(result2, key, iteratee2(value, key, object2));
11132             });
11133             return result2;
11134           }
11135           var merge2 = createAssigner(function(object, source, srcIndex) {
11136             baseMerge(object, source, srcIndex);
11137           });
11138           var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
11139             baseMerge(object, source, srcIndex, customizer);
11140           });
11141           var omit = flatRest(function(object, paths) {
11142             var result2 = {};
11143             if (object == null) {
11144               return result2;
11145             }
11146             var isDeep = false;
11147             paths = arrayMap2(paths, function(path) {
11148               path = castPath(path, object);
11149               isDeep || (isDeep = path.length > 1);
11150               return path;
11151             });
11152             copyObject(object, getAllKeysIn(object), result2);
11153             if (isDeep) {
11154               result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
11155             }
11156             var length = paths.length;
11157             while (length--) {
11158               baseUnset(result2, paths[length]);
11159             }
11160             return result2;
11161           });
11162           function omitBy(object, predicate) {
11163             return pickBy(object, negate(getIteratee(predicate)));
11164           }
11165           var pick = flatRest(function(object, paths) {
11166             return object == null ? {} : basePick(object, paths);
11167           });
11168           function pickBy(object, predicate) {
11169             if (object == null) {
11170               return {};
11171             }
11172             var props = arrayMap2(getAllKeysIn(object), function(prop) {
11173               return [prop];
11174             });
11175             predicate = getIteratee(predicate);
11176             return basePickBy(object, props, function(value, path) {
11177               return predicate(value, path[0]);
11178             });
11179           }
11180           function result(object, path, defaultValue) {
11181             path = castPath(path, object);
11182             var index = -1, length = path.length;
11183             if (!length) {
11184               length = 1;
11185               object = undefined2;
11186             }
11187             while (++index < length) {
11188               var value = object == null ? undefined2 : object[toKey(path[index])];
11189               if (value === undefined2) {
11190                 index = length;
11191                 value = defaultValue;
11192               }
11193               object = isFunction2(value) ? value.call(object) : value;
11194             }
11195             return object;
11196           }
11197           function set3(object, path, value) {
11198             return object == null ? object : baseSet(object, path, value);
11199           }
11200           function setWith(object, path, value, customizer) {
11201             customizer = typeof customizer == "function" ? customizer : undefined2;
11202             return object == null ? object : baseSet(object, path, value, customizer);
11203           }
11204           var toPairs = createToPairs(keys2);
11205           var toPairsIn = createToPairs(keysIn);
11206           function transform2(object, iteratee2, accumulator) {
11207             var isArr = isArray2(object), isArrLike = isArr || isBuffer2(object) || isTypedArray2(object);
11208             iteratee2 = getIteratee(iteratee2, 4);
11209             if (accumulator == null) {
11210               var Ctor = object && object.constructor;
11211               if (isArrLike) {
11212                 accumulator = isArr ? new Ctor() : [];
11213               } else if (isObject3(object)) {
11214                 accumulator = isFunction2(Ctor) ? baseCreate(getPrototype(object)) : {};
11215               } else {
11216                 accumulator = {};
11217               }
11218             }
11219             (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) {
11220               return iteratee2(accumulator, value, index, object2);
11221             });
11222             return accumulator;
11223           }
11224           function unset(object, path) {
11225             return object == null ? true : baseUnset(object, path);
11226           }
11227           function update(object, path, updater) {
11228             return object == null ? object : baseUpdate(object, path, castFunction(updater));
11229           }
11230           function updateWith(object, path, updater, customizer) {
11231             customizer = typeof customizer == "function" ? customizer : undefined2;
11232             return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
11233           }
11234           function values(object) {
11235             return object == null ? [] : baseValues(object, keys2(object));
11236           }
11237           function valuesIn(object) {
11238             return object == null ? [] : baseValues(object, keysIn(object));
11239           }
11240           function clamp3(number3, lower2, upper) {
11241             if (upper === undefined2) {
11242               upper = lower2;
11243               lower2 = undefined2;
11244             }
11245             if (upper !== undefined2) {
11246               upper = toNumber3(upper);
11247               upper = upper === upper ? upper : 0;
11248             }
11249             if (lower2 !== undefined2) {
11250               lower2 = toNumber3(lower2);
11251               lower2 = lower2 === lower2 ? lower2 : 0;
11252             }
11253             return baseClamp(toNumber3(number3), lower2, upper);
11254           }
11255           function inRange(number3, start2, end) {
11256             start2 = toFinite(start2);
11257             if (end === undefined2) {
11258               end = start2;
11259               start2 = 0;
11260             } else {
11261               end = toFinite(end);
11262             }
11263             number3 = toNumber3(number3);
11264             return baseInRange(number3, start2, end);
11265           }
11266           function random(lower2, upper, floating) {
11267             if (floating && typeof floating != "boolean" && isIterateeCall(lower2, upper, floating)) {
11268               upper = floating = undefined2;
11269             }
11270             if (floating === undefined2) {
11271               if (typeof upper == "boolean") {
11272                 floating = upper;
11273                 upper = undefined2;
11274               } else if (typeof lower2 == "boolean") {
11275                 floating = lower2;
11276                 lower2 = undefined2;
11277               }
11278             }
11279             if (lower2 === undefined2 && upper === undefined2) {
11280               lower2 = 0;
11281               upper = 1;
11282             } else {
11283               lower2 = toFinite(lower2);
11284               if (upper === undefined2) {
11285                 upper = lower2;
11286                 lower2 = 0;
11287               } else {
11288                 upper = toFinite(upper);
11289               }
11290             }
11291             if (lower2 > upper) {
11292               var temp = lower2;
11293               lower2 = upper;
11294               upper = temp;
11295             }
11296             if (floating || lower2 % 1 || upper % 1) {
11297               var rand = nativeRandom();
11298               return nativeMin2(lower2 + rand * (upper - lower2 + freeParseFloat("1e-" + ((rand + "").length - 1))), upper);
11299             }
11300             return baseRandom(lower2, upper);
11301           }
11302           var camelCase = createCompounder(function(result2, word, index) {
11303             word = word.toLowerCase();
11304             return result2 + (index ? capitalize(word) : word);
11305           });
11306           function capitalize(string) {
11307             return upperFirst(toString2(string).toLowerCase());
11308           }
11309           function deburr(string) {
11310             string = toString2(string);
11311             return string && string.replace(reLatin, deburrLetter).replace(reComboMark, "");
11312           }
11313           function endsWith(string, target, position) {
11314             string = toString2(string);
11315             target = baseToString2(target);
11316             var length = string.length;
11317             position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length);
11318             var end = position;
11319             position -= target.length;
11320             return position >= 0 && string.slice(position, end) == target;
11321           }
11322           function escape6(string) {
11323             string = toString2(string);
11324             return string && reHasUnescapedHtml2.test(string) ? string.replace(reUnescapedHtml2, escapeHtmlChar2) : string;
11325           }
11326           function escapeRegExp(string) {
11327             string = toString2(string);
11328             return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar2, "\\$&") : string;
11329           }
11330           var kebabCase = createCompounder(function(result2, word, index) {
11331             return result2 + (index ? "-" : "") + word.toLowerCase();
11332           });
11333           var lowerCase = createCompounder(function(result2, word, index) {
11334             return result2 + (index ? " " : "") + word.toLowerCase();
11335           });
11336           var lowerFirst = createCaseFirst("toLowerCase");
11337           function pad2(string, length, chars) {
11338             string = toString2(string);
11339             length = toInteger(length);
11340             var strLength = length ? stringSize(string) : 0;
11341             if (!length || strLength >= length) {
11342               return string;
11343             }
11344             var mid = (length - strLength) / 2;
11345             return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
11346           }
11347           function padEnd(string, length, chars) {
11348             string = toString2(string);
11349             length = toInteger(length);
11350             var strLength = length ? stringSize(string) : 0;
11351             return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
11352           }
11353           function padStart(string, length, chars) {
11354             string = toString2(string);
11355             length = toInteger(length);
11356             var strLength = length ? stringSize(string) : 0;
11357             return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
11358           }
11359           function parseInt2(string, radix, guard) {
11360             if (guard || radix == null) {
11361               radix = 0;
11362             } else if (radix) {
11363               radix = +radix;
11364             }
11365             return nativeParseInt(toString2(string).replace(reTrimStart2, ""), radix || 0);
11366           }
11367           function repeat(string, n2, guard) {
11368             if (guard ? isIterateeCall(string, n2, guard) : n2 === undefined2) {
11369               n2 = 1;
11370             } else {
11371               n2 = toInteger(n2);
11372             }
11373             return baseRepeat(toString2(string), n2);
11374           }
11375           function replace() {
11376             var args = arguments, string = toString2(args[0]);
11377             return args.length < 3 ? string : string.replace(args[1], args[2]);
11378           }
11379           var snakeCase = createCompounder(function(result2, word, index) {
11380             return result2 + (index ? "_" : "") + word.toLowerCase();
11381           });
11382           function split(string, separator, limit) {
11383             if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) {
11384               separator = limit = undefined2;
11385             }
11386             limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0;
11387             if (!limit) {
11388               return [];
11389             }
11390             string = toString2(string);
11391             if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) {
11392               separator = baseToString2(separator);
11393               if (!separator && hasUnicode(string)) {
11394                 return castSlice(stringToArray(string), 0, limit);
11395               }
11396             }
11397             return string.split(separator, limit);
11398           }
11399           var startCase = createCompounder(function(result2, word, index) {
11400             return result2 + (index ? " " : "") + upperFirst(word);
11401           });
11402           function startsWith(string, target, position) {
11403             string = toString2(string);
11404             position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
11405             target = baseToString2(target);
11406             return string.slice(position, position + target.length) == target;
11407           }
11408           function template(string, options2, guard) {
11409             var settings = lodash.templateSettings;
11410             if (guard && isIterateeCall(string, options2, guard)) {
11411               options2 = undefined2;
11412             }
11413             string = toString2(string);
11414             options2 = assignInWith({}, options2, settings, customDefaultsAssignIn);
11415             var imports = assignInWith({}, options2.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys2(imports), importsValues = baseValues(imports, importsKeys);
11416             var isEscaping, isEvaluating, index = 0, interpolate = options2.interpolate || reNoMatch, source = "__p += '";
11417             var reDelimiters = RegExp2(
11418               (options2.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options2.evaluate || reNoMatch).source + "|$",
11419               "g"
11420             );
11421             var sourceURL = "//# sourceURL=" + (hasOwnProperty10.call(options2, "sourceURL") ? (options2.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n";
11422             string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
11423               interpolateValue || (interpolateValue = esTemplateValue);
11424               source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
11425               if (escapeValue) {
11426                 isEscaping = true;
11427                 source += "' +\n__e(" + escapeValue + ") +\n'";
11428               }
11429               if (evaluateValue) {
11430                 isEvaluating = true;
11431                 source += "';\n" + evaluateValue + ";\n__p += '";
11432               }
11433               if (interpolateValue) {
11434                 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
11435               }
11436               index = offset + match.length;
11437               return match;
11438             });
11439             source += "';\n";
11440             var variable = hasOwnProperty10.call(options2, "variable") && options2.variable;
11441             if (!variable) {
11442               source = "with (obj) {\n" + source + "\n}\n";
11443             } else if (reForbiddenIdentifierChars.test(variable)) {
11444               throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT);
11445             }
11446             source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;");
11447             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}";
11448             var result2 = attempt(function() {
11449               return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues);
11450             });
11451             result2.source = source;
11452             if (isError(result2)) {
11453               throw result2;
11454             }
11455             return result2;
11456           }
11457           function toLower(value) {
11458             return toString2(value).toLowerCase();
11459           }
11460           function toUpper(value) {
11461             return toString2(value).toUpperCase();
11462           }
11463           function trim(string, chars, guard) {
11464             string = toString2(string);
11465             if (string && (guard || chars === undefined2)) {
11466               return baseTrim2(string);
11467             }
11468             if (!string || !(chars = baseToString2(chars))) {
11469               return string;
11470             }
11471             var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1;
11472             return castSlice(strSymbols, start2, end).join("");
11473           }
11474           function trimEnd(string, chars, guard) {
11475             string = toString2(string);
11476             if (string && (guard || chars === undefined2)) {
11477               return string.slice(0, trimmedEndIndex2(string) + 1);
11478             }
11479             if (!string || !(chars = baseToString2(chars))) {
11480               return string;
11481             }
11482             var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
11483             return castSlice(strSymbols, 0, end).join("");
11484           }
11485           function trimStart(string, chars, guard) {
11486             string = toString2(string);
11487             if (string && (guard || chars === undefined2)) {
11488               return string.replace(reTrimStart2, "");
11489             }
11490             if (!string || !(chars = baseToString2(chars))) {
11491               return string;
11492             }
11493             var strSymbols = stringToArray(string), start2 = charsStartIndex(strSymbols, stringToArray(chars));
11494             return castSlice(strSymbols, start2).join("");
11495           }
11496           function truncate(string, options2) {
11497             var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;
11498             if (isObject3(options2)) {
11499               var separator = "separator" in options2 ? options2.separator : separator;
11500               length = "length" in options2 ? toInteger(options2.length) : length;
11501               omission = "omission" in options2 ? baseToString2(options2.omission) : omission;
11502             }
11503             string = toString2(string);
11504             var strLength = string.length;
11505             if (hasUnicode(string)) {
11506               var strSymbols = stringToArray(string);
11507               strLength = strSymbols.length;
11508             }
11509             if (length >= strLength) {
11510               return string;
11511             }
11512             var end = length - stringSize(omission);
11513             if (end < 1) {
11514               return omission;
11515             }
11516             var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end);
11517             if (separator === undefined2) {
11518               return result2 + omission;
11519             }
11520             if (strSymbols) {
11521               end += result2.length - end;
11522             }
11523             if (isRegExp(separator)) {
11524               if (string.slice(end).search(separator)) {
11525                 var match, substring = result2;
11526                 if (!separator.global) {
11527                   separator = RegExp2(separator.source, toString2(reFlags.exec(separator)) + "g");
11528                 }
11529                 separator.lastIndex = 0;
11530                 while (match = separator.exec(substring)) {
11531                   var newEnd = match.index;
11532                 }
11533                 result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd);
11534               }
11535             } else if (string.indexOf(baseToString2(separator), end) != end) {
11536               var index = result2.lastIndexOf(separator);
11537               if (index > -1) {
11538                 result2 = result2.slice(0, index);
11539               }
11540             }
11541             return result2 + omission;
11542           }
11543           function unescape4(string) {
11544             string = toString2(string);
11545             return string && reHasEscapedHtml2.test(string) ? string.replace(reEscapedHtml2, unescapeHtmlChar2) : string;
11546           }
11547           var upperCase = createCompounder(function(result2, word, index) {
11548             return result2 + (index ? " " : "") + word.toUpperCase();
11549           });
11550           var upperFirst = createCaseFirst("toUpperCase");
11551           function words(string, pattern, guard) {
11552             string = toString2(string);
11553             pattern = guard ? undefined2 : pattern;
11554             if (pattern === undefined2) {
11555               return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
11556             }
11557             return string.match(pattern) || [];
11558           }
11559           var attempt = baseRest(function(func, args) {
11560             try {
11561               return apply(func, undefined2, args);
11562             } catch (e) {
11563               return isError(e) ? e : new Error2(e);
11564             }
11565           });
11566           var bindAll = flatRest(function(object, methodNames) {
11567             arrayEach(methodNames, function(key) {
11568               key = toKey(key);
11569               baseAssignValue(object, key, bind(object[key], object));
11570             });
11571             return object;
11572           });
11573           function cond(pairs) {
11574             var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee();
11575             pairs = !length ? [] : arrayMap2(pairs, function(pair2) {
11576               if (typeof pair2[1] != "function") {
11577                 throw new TypeError2(FUNC_ERROR_TEXT3);
11578               }
11579               return [toIteratee(pair2[0]), pair2[1]];
11580             });
11581             return baseRest(function(args) {
11582               var index = -1;
11583               while (++index < length) {
11584                 var pair2 = pairs[index];
11585                 if (apply(pair2[0], this, args)) {
11586                   return apply(pair2[1], this, args);
11587                 }
11588               }
11589             });
11590           }
11591           function conforms(source) {
11592             return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
11593           }
11594           function constant(value) {
11595             return function() {
11596               return value;
11597             };
11598           }
11599           function defaultTo(value, defaultValue) {
11600             return value == null || value !== value ? defaultValue : value;
11601           }
11602           var flow = createFlow();
11603           var flowRight = createFlow(true);
11604           function identity4(value) {
11605             return value;
11606           }
11607           function iteratee(func) {
11608             return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG));
11609           }
11610           function matches(source) {
11611             return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
11612           }
11613           function matchesProperty(path, srcValue) {
11614             return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
11615           }
11616           var method = baseRest(function(path, args) {
11617             return function(object) {
11618               return baseInvoke(object, path, args);
11619             };
11620           });
11621           var methodOf = baseRest(function(object, args) {
11622             return function(path) {
11623               return baseInvoke(object, path, args);
11624             };
11625           });
11626           function mixin(object, source, options2) {
11627             var props = keys2(source), methodNames = baseFunctions(source, props);
11628             if (options2 == null && !(isObject3(source) && (methodNames.length || !props.length))) {
11629               options2 = source;
11630               source = object;
11631               object = this;
11632               methodNames = baseFunctions(source, keys2(source));
11633             }
11634             var chain2 = !(isObject3(options2) && "chain" in options2) || !!options2.chain, isFunc = isFunction2(object);
11635             arrayEach(methodNames, function(methodName) {
11636               var func = source[methodName];
11637               object[methodName] = func;
11638               if (isFunc) {
11639                 object.prototype[methodName] = function() {
11640                   var chainAll = this.__chain__;
11641                   if (chain2 || chainAll) {
11642                     var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__);
11643                     actions.push({ "func": func, "args": arguments, "thisArg": object });
11644                     result2.__chain__ = chainAll;
11645                     return result2;
11646                   }
11647                   return func.apply(object, arrayPush2([this.value()], arguments));
11648                 };
11649               }
11650             });
11651             return object;
11652           }
11653           function noConflict() {
11654             if (root3._ === this) {
11655               root3._ = oldDash;
11656             }
11657             return this;
11658           }
11659           function noop3() {
11660           }
11661           function nthArg(n2) {
11662             n2 = toInteger(n2);
11663             return baseRest(function(args) {
11664               return baseNth(args, n2);
11665             });
11666           }
11667           var over = createOver(arrayMap2);
11668           var overEvery = createOver(arrayEvery);
11669           var overSome = createOver(arraySome2);
11670           function property(path) {
11671             return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
11672           }
11673           function propertyOf(object) {
11674             return function(path) {
11675               return object == null ? undefined2 : baseGet(object, path);
11676             };
11677           }
11678           var range3 = createRange();
11679           var rangeRight = createRange(true);
11680           function stubArray2() {
11681             return [];
11682           }
11683           function stubFalse2() {
11684             return false;
11685           }
11686           function stubObject() {
11687             return {};
11688           }
11689           function stubString() {
11690             return "";
11691           }
11692           function stubTrue() {
11693             return true;
11694           }
11695           function times(n2, iteratee2) {
11696             n2 = toInteger(n2);
11697             if (n2 < 1 || n2 > MAX_SAFE_INTEGER3) {
11698               return [];
11699             }
11700             var index = MAX_ARRAY_LENGTH, length = nativeMin2(n2, MAX_ARRAY_LENGTH);
11701             iteratee2 = getIteratee(iteratee2);
11702             n2 -= MAX_ARRAY_LENGTH;
11703             var result2 = baseTimes2(length, iteratee2);
11704             while (++index < n2) {
11705               iteratee2(index);
11706             }
11707             return result2;
11708           }
11709           function toPath(value) {
11710             if (isArray2(value)) {
11711               return arrayMap2(value, toKey);
11712             }
11713             return isSymbol2(value) ? [value] : copyArray(stringToPath(toString2(value)));
11714           }
11715           function uniqueId(prefix) {
11716             var id2 = ++idCounter;
11717             return toString2(prefix) + id2;
11718           }
11719           var add = createMathOperation(function(augend, addend) {
11720             return augend + addend;
11721           }, 0);
11722           var ceil = createRound("ceil");
11723           var divide = createMathOperation(function(dividend, divisor) {
11724             return dividend / divisor;
11725           }, 1);
11726           var floor = createRound("floor");
11727           function max3(array2) {
11728             return array2 && array2.length ? baseExtremum(array2, identity4, baseGt) : undefined2;
11729           }
11730           function maxBy(array2, iteratee2) {
11731             return array2 && array2.length ? baseExtremum(array2, getIteratee(iteratee2, 2), baseGt) : undefined2;
11732           }
11733           function mean(array2) {
11734             return baseMean(array2, identity4);
11735           }
11736           function meanBy(array2, iteratee2) {
11737             return baseMean(array2, getIteratee(iteratee2, 2));
11738           }
11739           function min3(array2) {
11740             return array2 && array2.length ? baseExtremum(array2, identity4, baseLt) : undefined2;
11741           }
11742           function minBy(array2, iteratee2) {
11743             return array2 && array2.length ? baseExtremum(array2, getIteratee(iteratee2, 2), baseLt) : undefined2;
11744           }
11745           var multiply = createMathOperation(function(multiplier, multiplicand) {
11746             return multiplier * multiplicand;
11747           }, 1);
11748           var round = createRound("round");
11749           var subtract = createMathOperation(function(minuend, subtrahend) {
11750             return minuend - subtrahend;
11751           }, 0);
11752           function sum(array2) {
11753             return array2 && array2.length ? baseSum(array2, identity4) : 0;
11754           }
11755           function sumBy(array2, iteratee2) {
11756             return array2 && array2.length ? baseSum(array2, getIteratee(iteratee2, 2)) : 0;
11757           }
11758           lodash.after = after;
11759           lodash.ary = ary;
11760           lodash.assign = assign;
11761           lodash.assignIn = assignIn;
11762           lodash.assignInWith = assignInWith;
11763           lodash.assignWith = assignWith;
11764           lodash.at = at;
11765           lodash.before = before;
11766           lodash.bind = bind;
11767           lodash.bindAll = bindAll;
11768           lodash.bindKey = bindKey2;
11769           lodash.castArray = castArray;
11770           lodash.chain = chain;
11771           lodash.chunk = chunk;
11772           lodash.compact = compact;
11773           lodash.concat = concat;
11774           lodash.cond = cond;
11775           lodash.conforms = conforms;
11776           lodash.constant = constant;
11777           lodash.countBy = countBy;
11778           lodash.create = create2;
11779           lodash.curry = curry;
11780           lodash.curryRight = curryRight;
11781           lodash.debounce = debounce2;
11782           lodash.defaults = defaults2;
11783           lodash.defaultsDeep = defaultsDeep;
11784           lodash.defer = defer;
11785           lodash.delay = delay;
11786           lodash.difference = difference;
11787           lodash.differenceBy = differenceBy;
11788           lodash.differenceWith = differenceWith;
11789           lodash.drop = drop;
11790           lodash.dropRight = dropRight;
11791           lodash.dropRightWhile = dropRightWhile;
11792           lodash.dropWhile = dropWhile;
11793           lodash.fill = fill;
11794           lodash.filter = filter2;
11795           lodash.flatMap = flatMap;
11796           lodash.flatMapDeep = flatMapDeep;
11797           lodash.flatMapDepth = flatMapDepth;
11798           lodash.flatten = flatten2;
11799           lodash.flattenDeep = flattenDeep;
11800           lodash.flattenDepth = flattenDepth;
11801           lodash.flip = flip;
11802           lodash.flow = flow;
11803           lodash.flowRight = flowRight;
11804           lodash.fromPairs = fromPairs;
11805           lodash.functions = functions;
11806           lodash.functionsIn = functionsIn;
11807           lodash.groupBy = groupBy;
11808           lodash.initial = initial;
11809           lodash.intersection = intersection;
11810           lodash.intersectionBy = intersectionBy;
11811           lodash.intersectionWith = intersectionWith;
11812           lodash.invert = invert;
11813           lodash.invertBy = invertBy;
11814           lodash.invokeMap = invokeMap;
11815           lodash.iteratee = iteratee;
11816           lodash.keyBy = keyBy;
11817           lodash.keys = keys2;
11818           lodash.keysIn = keysIn;
11819           lodash.map = map2;
11820           lodash.mapKeys = mapKeys;
11821           lodash.mapValues = mapValues;
11822           lodash.matches = matches;
11823           lodash.matchesProperty = matchesProperty;
11824           lodash.memoize = memoize;
11825           lodash.merge = merge2;
11826           lodash.mergeWith = mergeWith;
11827           lodash.method = method;
11828           lodash.methodOf = methodOf;
11829           lodash.mixin = mixin;
11830           lodash.negate = negate;
11831           lodash.nthArg = nthArg;
11832           lodash.omit = omit;
11833           lodash.omitBy = omitBy;
11834           lodash.once = once;
11835           lodash.orderBy = orderBy;
11836           lodash.over = over;
11837           lodash.overArgs = overArgs;
11838           lodash.overEvery = overEvery;
11839           lodash.overSome = overSome;
11840           lodash.partial = partial;
11841           lodash.partialRight = partialRight;
11842           lodash.partition = partition;
11843           lodash.pick = pick;
11844           lodash.pickBy = pickBy;
11845           lodash.property = property;
11846           lodash.propertyOf = propertyOf;
11847           lodash.pull = pull;
11848           lodash.pullAll = pullAll;
11849           lodash.pullAllBy = pullAllBy;
11850           lodash.pullAllWith = pullAllWith;
11851           lodash.pullAt = pullAt;
11852           lodash.range = range3;
11853           lodash.rangeRight = rangeRight;
11854           lodash.rearg = rearg;
11855           lodash.reject = reject;
11856           lodash.remove = remove2;
11857           lodash.rest = rest;
11858           lodash.reverse = reverse;
11859           lodash.sampleSize = sampleSize;
11860           lodash.set = set3;
11861           lodash.setWith = setWith;
11862           lodash.shuffle = shuffle;
11863           lodash.slice = slice;
11864           lodash.sortBy = sortBy;
11865           lodash.sortedUniq = sortedUniq;
11866           lodash.sortedUniqBy = sortedUniqBy;
11867           lodash.split = split;
11868           lodash.spread = spread;
11869           lodash.tail = tail;
11870           lodash.take = take;
11871           lodash.takeRight = takeRight;
11872           lodash.takeRightWhile = takeRightWhile;
11873           lodash.takeWhile = takeWhile;
11874           lodash.tap = tap;
11875           lodash.throttle = throttle2;
11876           lodash.thru = thru;
11877           lodash.toArray = toArray;
11878           lodash.toPairs = toPairs;
11879           lodash.toPairsIn = toPairsIn;
11880           lodash.toPath = toPath;
11881           lodash.toPlainObject = toPlainObject;
11882           lodash.transform = transform2;
11883           lodash.unary = unary;
11884           lodash.union = union;
11885           lodash.unionBy = unionBy;
11886           lodash.unionWith = unionWith;
11887           lodash.uniq = uniq;
11888           lodash.uniqBy = uniqBy;
11889           lodash.uniqWith = uniqWith;
11890           lodash.unset = unset;
11891           lodash.unzip = unzip;
11892           lodash.unzipWith = unzipWith;
11893           lodash.update = update;
11894           lodash.updateWith = updateWith;
11895           lodash.values = values;
11896           lodash.valuesIn = valuesIn;
11897           lodash.without = without;
11898           lodash.words = words;
11899           lodash.wrap = wrap2;
11900           lodash.xor = xor;
11901           lodash.xorBy = xorBy;
11902           lodash.xorWith = xorWith;
11903           lodash.zip = zip;
11904           lodash.zipObject = zipObject;
11905           lodash.zipObjectDeep = zipObjectDeep;
11906           lodash.zipWith = zipWith;
11907           lodash.entries = toPairs;
11908           lodash.entriesIn = toPairsIn;
11909           lodash.extend = assignIn;
11910           lodash.extendWith = assignInWith;
11911           mixin(lodash, lodash);
11912           lodash.add = add;
11913           lodash.attempt = attempt;
11914           lodash.camelCase = camelCase;
11915           lodash.capitalize = capitalize;
11916           lodash.ceil = ceil;
11917           lodash.clamp = clamp3;
11918           lodash.clone = clone;
11919           lodash.cloneDeep = cloneDeep;
11920           lodash.cloneDeepWith = cloneDeepWith;
11921           lodash.cloneWith = cloneWith;
11922           lodash.conformsTo = conformsTo;
11923           lodash.deburr = deburr;
11924           lodash.defaultTo = defaultTo;
11925           lodash.divide = divide;
11926           lodash.endsWith = endsWith;
11927           lodash.eq = eq2;
11928           lodash.escape = escape6;
11929           lodash.escapeRegExp = escapeRegExp;
11930           lodash.every = every;
11931           lodash.find = find2;
11932           lodash.findIndex = findIndex;
11933           lodash.findKey = findKey;
11934           lodash.findLast = findLast;
11935           lodash.findLastIndex = findLastIndex;
11936           lodash.findLastKey = findLastKey;
11937           lodash.floor = floor;
11938           lodash.forEach = forEach;
11939           lodash.forEachRight = forEachRight;
11940           lodash.forIn = forIn;
11941           lodash.forInRight = forInRight;
11942           lodash.forOwn = forOwn;
11943           lodash.forOwnRight = forOwnRight;
11944           lodash.get = get4;
11945           lodash.gt = gt;
11946           lodash.gte = gte;
11947           lodash.has = has;
11948           lodash.hasIn = hasIn;
11949           lodash.head = head;
11950           lodash.identity = identity4;
11951           lodash.includes = includes;
11952           lodash.indexOf = indexOf;
11953           lodash.inRange = inRange;
11954           lodash.invoke = invoke;
11955           lodash.isArguments = isArguments2;
11956           lodash.isArray = isArray2;
11957           lodash.isArrayBuffer = isArrayBuffer;
11958           lodash.isArrayLike = isArrayLike2;
11959           lodash.isArrayLikeObject = isArrayLikeObject;
11960           lodash.isBoolean = isBoolean;
11961           lodash.isBuffer = isBuffer2;
11962           lodash.isDate = isDate;
11963           lodash.isElement = isElement2;
11964           lodash.isEmpty = isEmpty;
11965           lodash.isEqual = isEqual4;
11966           lodash.isEqualWith = isEqualWith;
11967           lodash.isError = isError;
11968           lodash.isFinite = isFinite2;
11969           lodash.isFunction = isFunction2;
11970           lodash.isInteger = isInteger;
11971           lodash.isLength = isLength2;
11972           lodash.isMap = isMap;
11973           lodash.isMatch = isMatch;
11974           lodash.isMatchWith = isMatchWith;
11975           lodash.isNaN = isNaN2;
11976           lodash.isNative = isNative;
11977           lodash.isNil = isNil;
11978           lodash.isNull = isNull;
11979           lodash.isNumber = isNumber2;
11980           lodash.isObject = isObject3;
11981           lodash.isObjectLike = isObjectLike2;
11982           lodash.isPlainObject = isPlainObject;
11983           lodash.isRegExp = isRegExp;
11984           lodash.isSafeInteger = isSafeInteger;
11985           lodash.isSet = isSet;
11986           lodash.isString = isString;
11987           lodash.isSymbol = isSymbol2;
11988           lodash.isTypedArray = isTypedArray2;
11989           lodash.isUndefined = isUndefined;
11990           lodash.isWeakMap = isWeakMap;
11991           lodash.isWeakSet = isWeakSet;
11992           lodash.join = join;
11993           lodash.kebabCase = kebabCase;
11994           lodash.last = last;
11995           lodash.lastIndexOf = lastIndexOf;
11996           lodash.lowerCase = lowerCase;
11997           lodash.lowerFirst = lowerFirst;
11998           lodash.lt = lt;
11999           lodash.lte = lte;
12000           lodash.max = max3;
12001           lodash.maxBy = maxBy;
12002           lodash.mean = mean;
12003           lodash.meanBy = meanBy;
12004           lodash.min = min3;
12005           lodash.minBy = minBy;
12006           lodash.stubArray = stubArray2;
12007           lodash.stubFalse = stubFalse2;
12008           lodash.stubObject = stubObject;
12009           lodash.stubString = stubString;
12010           lodash.stubTrue = stubTrue;
12011           lodash.multiply = multiply;
12012           lodash.nth = nth;
12013           lodash.noConflict = noConflict;
12014           lodash.noop = noop3;
12015           lodash.now = now3;
12016           lodash.pad = pad2;
12017           lodash.padEnd = padEnd;
12018           lodash.padStart = padStart;
12019           lodash.parseInt = parseInt2;
12020           lodash.random = random;
12021           lodash.reduce = reduce;
12022           lodash.reduceRight = reduceRight;
12023           lodash.repeat = repeat;
12024           lodash.replace = replace;
12025           lodash.result = result;
12026           lodash.round = round;
12027           lodash.runInContext = runInContext2;
12028           lodash.sample = sample;
12029           lodash.size = size;
12030           lodash.snakeCase = snakeCase;
12031           lodash.some = some;
12032           lodash.sortedIndex = sortedIndex;
12033           lodash.sortedIndexBy = sortedIndexBy;
12034           lodash.sortedIndexOf = sortedIndexOf;
12035           lodash.sortedLastIndex = sortedLastIndex;
12036           lodash.sortedLastIndexBy = sortedLastIndexBy;
12037           lodash.sortedLastIndexOf = sortedLastIndexOf;
12038           lodash.startCase = startCase;
12039           lodash.startsWith = startsWith;
12040           lodash.subtract = subtract;
12041           lodash.sum = sum;
12042           lodash.sumBy = sumBy;
12043           lodash.template = template;
12044           lodash.times = times;
12045           lodash.toFinite = toFinite;
12046           lodash.toInteger = toInteger;
12047           lodash.toLength = toLength;
12048           lodash.toLower = toLower;
12049           lodash.toNumber = toNumber3;
12050           lodash.toSafeInteger = toSafeInteger;
12051           lodash.toString = toString2;
12052           lodash.toUpper = toUpper;
12053           lodash.trim = trim;
12054           lodash.trimEnd = trimEnd;
12055           lodash.trimStart = trimStart;
12056           lodash.truncate = truncate;
12057           lodash.unescape = unescape4;
12058           lodash.uniqueId = uniqueId;
12059           lodash.upperCase = upperCase;
12060           lodash.upperFirst = upperFirst;
12061           lodash.each = forEach;
12062           lodash.eachRight = forEachRight;
12063           lodash.first = head;
12064           mixin(lodash, function() {
12065             var source = {};
12066             baseForOwn(lodash, function(func, methodName) {
12067               if (!hasOwnProperty10.call(lodash.prototype, methodName)) {
12068                 source[methodName] = func;
12069               }
12070             });
12071             return source;
12072           }(), { "chain": false });
12073           lodash.VERSION = VERSION;
12074           arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) {
12075             lodash[methodName].placeholder = lodash;
12076           });
12077           arrayEach(["drop", "take"], function(methodName, index) {
12078             LazyWrapper.prototype[methodName] = function(n2) {
12079               n2 = n2 === undefined2 ? 1 : nativeMax2(toInteger(n2), 0);
12080               var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone();
12081               if (result2.__filtered__) {
12082                 result2.__takeCount__ = nativeMin2(n2, result2.__takeCount__);
12083               } else {
12084                 result2.__views__.push({
12085                   "size": nativeMin2(n2, MAX_ARRAY_LENGTH),
12086                   "type": methodName + (result2.__dir__ < 0 ? "Right" : "")
12087                 });
12088               }
12089               return result2;
12090             };
12091             LazyWrapper.prototype[methodName + "Right"] = function(n2) {
12092               return this.reverse()[methodName](n2).reverse();
12093             };
12094           });
12095           arrayEach(["filter", "map", "takeWhile"], function(methodName, index) {
12096             var type2 = index + 1, isFilter = type2 == LAZY_FILTER_FLAG || type2 == LAZY_WHILE_FLAG;
12097             LazyWrapper.prototype[methodName] = function(iteratee2) {
12098               var result2 = this.clone();
12099               result2.__iteratees__.push({
12100                 "iteratee": getIteratee(iteratee2, 3),
12101                 "type": type2
12102               });
12103               result2.__filtered__ = result2.__filtered__ || isFilter;
12104               return result2;
12105             };
12106           });
12107           arrayEach(["head", "last"], function(methodName, index) {
12108             var takeName = "take" + (index ? "Right" : "");
12109             LazyWrapper.prototype[methodName] = function() {
12110               return this[takeName](1).value()[0];
12111             };
12112           });
12113           arrayEach(["initial", "tail"], function(methodName, index) {
12114             var dropName = "drop" + (index ? "" : "Right");
12115             LazyWrapper.prototype[methodName] = function() {
12116               return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
12117             };
12118           });
12119           LazyWrapper.prototype.compact = function() {
12120             return this.filter(identity4);
12121           };
12122           LazyWrapper.prototype.find = function(predicate) {
12123             return this.filter(predicate).head();
12124           };
12125           LazyWrapper.prototype.findLast = function(predicate) {
12126             return this.reverse().find(predicate);
12127           };
12128           LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
12129             if (typeof path == "function") {
12130               return new LazyWrapper(this);
12131             }
12132             return this.map(function(value) {
12133               return baseInvoke(value, path, args);
12134             });
12135           });
12136           LazyWrapper.prototype.reject = function(predicate) {
12137             return this.filter(negate(getIteratee(predicate)));
12138           };
12139           LazyWrapper.prototype.slice = function(start2, end) {
12140             start2 = toInteger(start2);
12141             var result2 = this;
12142             if (result2.__filtered__ && (start2 > 0 || end < 0)) {
12143               return new LazyWrapper(result2);
12144             }
12145             if (start2 < 0) {
12146               result2 = result2.takeRight(-start2);
12147             } else if (start2) {
12148               result2 = result2.drop(start2);
12149             }
12150             if (end !== undefined2) {
12151               end = toInteger(end);
12152               result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start2);
12153             }
12154             return result2;
12155           };
12156           LazyWrapper.prototype.takeRightWhile = function(predicate) {
12157             return this.reverse().takeWhile(predicate).reverse();
12158           };
12159           LazyWrapper.prototype.toArray = function() {
12160             return this.take(MAX_ARRAY_LENGTH);
12161           };
12162           baseForOwn(LazyWrapper.prototype, function(func, methodName) {
12163             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);
12164             if (!lodashFunc) {
12165               return;
12166             }
12167             lodash.prototype[methodName] = function() {
12168               var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray2(value);
12169               var interceptor = function(value2) {
12170                 var result3 = lodashFunc.apply(lodash, arrayPush2([value2], args));
12171                 return isTaker && chainAll ? result3[0] : result3;
12172               };
12173               if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) {
12174                 isLazy = useLazy = false;
12175               }
12176               var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid;
12177               if (!retUnwrapped && useLazy) {
12178                 value = onlyLazy ? value : new LazyWrapper(this);
12179                 var result2 = func.apply(value, args);
12180                 result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 });
12181                 return new LodashWrapper(result2, chainAll);
12182               }
12183               if (isUnwrapped && onlyLazy) {
12184                 return func.apply(this, args);
12185               }
12186               result2 = this.thru(interceptor);
12187               return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2;
12188             };
12189           });
12190           arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) {
12191             var func = arrayProto2[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName);
12192             lodash.prototype[methodName] = function() {
12193               var args = arguments;
12194               if (retUnwrapped && !this.__chain__) {
12195                 var value = this.value();
12196                 return func.apply(isArray2(value) ? value : [], args);
12197               }
12198               return this[chainName](function(value2) {
12199                 return func.apply(isArray2(value2) ? value2 : [], args);
12200               });
12201             };
12202           });
12203           baseForOwn(LazyWrapper.prototype, function(func, methodName) {
12204             var lodashFunc = lodash[methodName];
12205             if (lodashFunc) {
12206               var key = lodashFunc.name + "";
12207               if (!hasOwnProperty10.call(realNames, key)) {
12208                 realNames[key] = [];
12209               }
12210               realNames[key].push({ "name": methodName, "func": lodashFunc });
12211             }
12212           });
12213           realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{
12214             "name": "wrapper",
12215             "func": undefined2
12216           }];
12217           LazyWrapper.prototype.clone = lazyClone;
12218           LazyWrapper.prototype.reverse = lazyReverse;
12219           LazyWrapper.prototype.value = lazyValue;
12220           lodash.prototype.at = wrapperAt;
12221           lodash.prototype.chain = wrapperChain;
12222           lodash.prototype.commit = wrapperCommit;
12223           lodash.prototype.next = wrapperNext;
12224           lodash.prototype.plant = wrapperPlant;
12225           lodash.prototype.reverse = wrapperReverse;
12226           lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
12227           lodash.prototype.first = lodash.prototype.head;
12228           if (symIterator) {
12229             lodash.prototype[symIterator] = wrapperToIterator;
12230           }
12231           return lodash;
12232         };
12233         var _ = runInContext();
12234         if (typeof define == "function" && typeof define.amd == "object" && define.amd) {
12235           root3._ = _;
12236           define(function() {
12237             return _;
12238           });
12239         } else if (freeModule3) {
12240           (freeModule3.exports = _)._ = _;
12241           freeExports3._ = _;
12242         } else {
12243           root3._ = _;
12244         }
12245       }).call(exports2);
12246     }
12247   });
12248
12249   // node_modules/fast-deep-equal/index.js
12250   var require_fast_deep_equal = __commonJS({
12251     "node_modules/fast-deep-equal/index.js"(exports2, module2) {
12252       "use strict";
12253       module2.exports = function equal(a, b) {
12254         if (a === b)
12255           return true;
12256         if (a && b && typeof a == "object" && typeof b == "object") {
12257           if (a.constructor !== b.constructor)
12258             return false;
12259           var length, i2, keys2;
12260           if (Array.isArray(a)) {
12261             length = a.length;
12262             if (length != b.length)
12263               return false;
12264             for (i2 = length; i2-- !== 0; )
12265               if (!equal(a[i2], b[i2]))
12266                 return false;
12267             return true;
12268           }
12269           if (a.constructor === RegExp)
12270             return a.source === b.source && a.flags === b.flags;
12271           if (a.valueOf !== Object.prototype.valueOf)
12272             return a.valueOf() === b.valueOf();
12273           if (a.toString !== Object.prototype.toString)
12274             return a.toString() === b.toString();
12275           keys2 = Object.keys(a);
12276           length = keys2.length;
12277           if (length !== Object.keys(b).length)
12278             return false;
12279           for (i2 = length; i2-- !== 0; )
12280             if (!Object.prototype.hasOwnProperty.call(b, keys2[i2]))
12281               return false;
12282           for (i2 = length; i2-- !== 0; ) {
12283             var key = keys2[i2];
12284             if (!equal(a[key], b[key]))
12285               return false;
12286           }
12287           return true;
12288         }
12289         return a !== a && b !== b;
12290       };
12291     }
12292   });
12293
12294   // node_modules/rbush/rbush.min.js
12295   var require_rbush_min = __commonJS({
12296     "node_modules/rbush/rbush.min.js"(exports2, module2) {
12297       !function(t, i2) {
12298         "object" == typeof exports2 && "undefined" != typeof module2 ? module2.exports = i2() : "function" == typeof define && define.amd ? define(i2) : (t = t || self).RBush = i2();
12299       }(exports2, function() {
12300         "use strict";
12301         function t(t2, r2, e3, a2, h2) {
12302           !function t3(n3, r3, e4, a3, h3) {
12303             for (; a3 > e4; ) {
12304               if (a3 - e4 > 600) {
12305                 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));
12306                 t3(n3, r3, m2, c2, h3);
12307               }
12308               var p2 = n3[r3], d2 = e4, x = a3;
12309               for (i2(n3, e4, r3), h3(n3[a3], p2) > 0 && i2(n3, e4, a3); d2 < x; ) {
12310                 for (i2(n3, d2, x), d2++, x--; h3(n3[d2], p2) < 0; )
12311                   d2++;
12312                 for (; h3(n3[x], p2) > 0; )
12313                   x--;
12314               }
12315               0 === h3(n3[e4], p2) ? i2(n3, e4, x) : i2(n3, ++x, a3), x <= r3 && (e4 = x + 1), r3 <= x && (a3 = x - 1);
12316             }
12317           }(t2, r2, e3 || 0, a2 || t2.length - 1, h2 || n2);
12318         }
12319         function i2(t2, i3, n3) {
12320           var r2 = t2[i3];
12321           t2[i3] = t2[n3], t2[n3] = r2;
12322         }
12323         function n2(t2, i3) {
12324           return t2 < i3 ? -1 : t2 > i3 ? 1 : 0;
12325         }
12326         var r = function(t2) {
12327           void 0 === t2 && (t2 = 9), this._maxEntries = Math.max(4, t2), this._minEntries = Math.max(2, Math.ceil(0.4 * this._maxEntries)), this.clear();
12328         };
12329         function e(t2, i3, n3) {
12330           if (!n3)
12331             return i3.indexOf(t2);
12332           for (var r2 = 0; r2 < i3.length; r2++)
12333             if (n3(t2, i3[r2]))
12334               return r2;
12335           return -1;
12336         }
12337         function a(t2, i3) {
12338           h(t2, 0, t2.children.length, i3, t2);
12339         }
12340         function h(t2, i3, n3, r2, e3) {
12341           e3 || (e3 = p(null)), e3.minX = 1 / 0, e3.minY = 1 / 0, e3.maxX = -1 / 0, e3.maxY = -1 / 0;
12342           for (var a2 = i3; a2 < n3; a2++) {
12343             var h2 = t2.children[a2];
12344             o(e3, t2.leaf ? r2(h2) : h2);
12345           }
12346           return e3;
12347         }
12348         function o(t2, i3) {
12349           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;
12350         }
12351         function s(t2, i3) {
12352           return t2.minX - i3.minX;
12353         }
12354         function l(t2, i3) {
12355           return t2.minY - i3.minY;
12356         }
12357         function f2(t2) {
12358           return (t2.maxX - t2.minX) * (t2.maxY - t2.minY);
12359         }
12360         function u(t2) {
12361           return t2.maxX - t2.minX + (t2.maxY - t2.minY);
12362         }
12363         function m(t2, i3) {
12364           return t2.minX <= i3.minX && t2.minY <= i3.minY && i3.maxX <= t2.maxX && i3.maxY <= t2.maxY;
12365         }
12366         function c(t2, i3) {
12367           return i3.minX <= t2.maxX && i3.minY <= t2.maxY && i3.maxX >= t2.minX && i3.maxY >= t2.minY;
12368         }
12369         function p(t2) {
12370           return { children: t2, height: 1, leaf: true, minX: 1 / 0, minY: 1 / 0, maxX: -1 / 0, maxY: -1 / 0 };
12371         }
12372         function d(i3, n3, r2, e3, a2) {
12373           for (var h2 = [n3, r2]; h2.length; )
12374             if (!((r2 = h2.pop()) - (n3 = h2.pop()) <= e3)) {
12375               var o2 = n3 + Math.ceil((r2 - n3) / e3 / 2) * e3;
12376               t(i3, o2, n3, r2, a2), h2.push(n3, o2, o2, r2);
12377             }
12378         }
12379         return r.prototype.all = function() {
12380           return this._all(this.data, []);
12381         }, r.prototype.search = function(t2) {
12382           var i3 = this.data, n3 = [];
12383           if (!c(t2, i3))
12384             return n3;
12385           for (var r2 = this.toBBox, e3 = []; i3; ) {
12386             for (var a2 = 0; a2 < i3.children.length; a2++) {
12387               var h2 = i3.children[a2], o2 = i3.leaf ? r2(h2) : h2;
12388               c(t2, o2) && (i3.leaf ? n3.push(h2) : m(t2, o2) ? this._all(h2, n3) : e3.push(h2));
12389             }
12390             i3 = e3.pop();
12391           }
12392           return n3;
12393         }, r.prototype.collides = function(t2) {
12394           var i3 = this.data;
12395           if (!c(t2, i3))
12396             return false;
12397           for (var n3 = []; i3; ) {
12398             for (var r2 = 0; r2 < i3.children.length; r2++) {
12399               var e3 = i3.children[r2], a2 = i3.leaf ? this.toBBox(e3) : e3;
12400               if (c(t2, a2)) {
12401                 if (i3.leaf || m(t2, a2))
12402                   return true;
12403                 n3.push(e3);
12404               }
12405             }
12406             i3 = n3.pop();
12407           }
12408           return false;
12409         }, r.prototype.load = function(t2) {
12410           if (!t2 || !t2.length)
12411             return this;
12412           if (t2.length < this._minEntries) {
12413             for (var i3 = 0; i3 < t2.length; i3++)
12414               this.insert(t2[i3]);
12415             return this;
12416           }
12417           var n3 = this._build(t2.slice(), 0, t2.length - 1, 0);
12418           if (this.data.children.length)
12419             if (this.data.height === n3.height)
12420               this._splitRoot(this.data, n3);
12421             else {
12422               if (this.data.height < n3.height) {
12423                 var r2 = this.data;
12424                 this.data = n3, n3 = r2;
12425               }
12426               this._insert(n3, this.data.height - n3.height - 1, true);
12427             }
12428           else
12429             this.data = n3;
12430           return this;
12431         }, r.prototype.insert = function(t2) {
12432           return t2 && this._insert(t2, this.data.height - 1), this;
12433         }, r.prototype.clear = function() {
12434           return this.data = p([]), this;
12435         }, r.prototype.remove = function(t2, i3) {
12436           if (!t2)
12437             return this;
12438           for (var n3, r2, a2, h2 = this.data, o2 = this.toBBox(t2), s2 = [], l2 = []; h2 || s2.length; ) {
12439             if (h2 || (h2 = s2.pop(), r2 = s2[s2.length - 1], n3 = l2.pop(), a2 = true), h2.leaf) {
12440               var f3 = e(t2, h2.children, i3);
12441               if (-1 !== f3)
12442                 return h2.children.splice(f3, 1), s2.push(h2), this._condense(s2), this;
12443             }
12444             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]);
12445           }
12446           return this;
12447         }, r.prototype.toBBox = function(t2) {
12448           return t2;
12449         }, r.prototype.compareMinX = function(t2, i3) {
12450           return t2.minX - i3.minX;
12451         }, r.prototype.compareMinY = function(t2, i3) {
12452           return t2.minY - i3.minY;
12453         }, r.prototype.toJSON = function() {
12454           return this.data;
12455         }, r.prototype.fromJSON = function(t2) {
12456           return this.data = t2, this;
12457         }, r.prototype._all = function(t2, i3) {
12458           for (var n3 = []; t2; )
12459             t2.leaf ? i3.push.apply(i3, t2.children) : n3.push.apply(n3, t2.children), t2 = n3.pop();
12460           return i3;
12461         }, r.prototype._build = function(t2, i3, n3, r2) {
12462           var e3, h2 = n3 - i3 + 1, o2 = this._maxEntries;
12463           if (h2 <= o2)
12464             return a(e3 = p(t2.slice(i3, n3 + 1)), this.toBBox), e3;
12465           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;
12466           var s2 = Math.ceil(h2 / o2), l2 = s2 * Math.ceil(Math.sqrt(o2));
12467           d(t2, i3, n3, l2, this.compareMinX);
12468           for (var f3 = i3; f3 <= n3; f3 += l2) {
12469             var u2 = Math.min(f3 + l2 - 1, n3);
12470             d(t2, f3, u2, s2, this.compareMinY);
12471             for (var m2 = f3; m2 <= u2; m2 += s2) {
12472               var c2 = Math.min(m2 + s2 - 1, u2);
12473               e3.children.push(this._build(t2, m2, c2, r2 - 1));
12474             }
12475           }
12476           return a(e3, this.toBBox), e3;
12477         }, r.prototype._chooseSubtree = function(t2, i3, n3, r2) {
12478           for (; r2.push(i3), !i3.leaf && r2.length - 1 !== n3; ) {
12479             for (var e3 = 1 / 0, a2 = 1 / 0, h2 = void 0, o2 = 0; o2 < i3.children.length; o2++) {
12480               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);
12481               u2 < a2 ? (a2 = u2, e3 = l2 < e3 ? l2 : e3, h2 = s2) : u2 === a2 && l2 < e3 && (e3 = l2, h2 = s2);
12482             }
12483             i3 = h2 || i3.children[0];
12484           }
12485           var m2, c2;
12486           return i3;
12487         }, r.prototype._insert = function(t2, i3, n3) {
12488           var r2 = n3 ? t2 : this.toBBox(t2), e3 = [], a2 = this._chooseSubtree(r2, this.data, i3, e3);
12489           for (a2.children.push(t2), o(a2, r2); i3 >= 0 && e3[i3].children.length > this._maxEntries; )
12490             this._split(e3, i3), i3--;
12491           this._adjustParentBBoxes(r2, e3, i3);
12492         }, r.prototype._split = function(t2, i3) {
12493           var n3 = t2[i3], r2 = n3.children.length, e3 = this._minEntries;
12494           this._chooseSplitAxis(n3, e3, r2);
12495           var h2 = this._chooseSplitIndex(n3, e3, r2), o2 = p(n3.children.splice(h2, n3.children.length - h2));
12496           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);
12497         }, r.prototype._splitRoot = function(t2, i3) {
12498           this.data = p([t2, i3]), this.data.height = t2.height + 1, this.data.leaf = false, a(this.data, this.toBBox);
12499         }, r.prototype._chooseSplitIndex = function(t2, i3, n3) {
12500           for (var r2, e3, a2, o2, s2, l2, u2, m2 = 1 / 0, c2 = 1 / 0, p2 = i3; p2 <= n3 - i3; p2++) {
12501             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);
12502             v < m2 ? (m2 = v, r2 = p2, c2 = M < c2 ? M : c2) : v === m2 && M < c2 && (c2 = M, r2 = p2);
12503           }
12504           return r2 || n3 - i3;
12505         }, r.prototype._chooseSplitAxis = function(t2, i3, n3) {
12506           var r2 = t2.leaf ? this.compareMinX : s, e3 = t2.leaf ? this.compareMinY : l;
12507           this._allDistMargin(t2, i3, n3, r2) < this._allDistMargin(t2, i3, n3, e3) && t2.children.sort(r2);
12508         }, r.prototype._allDistMargin = function(t2, i3, n3, r2) {
12509           t2.children.sort(r2);
12510           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++) {
12511             var m2 = t2.children[f3];
12512             o(a2, t2.leaf ? e3(m2) : m2), l2 += u(a2);
12513           }
12514           for (var c2 = n3 - i3 - 1; c2 >= i3; c2--) {
12515             var p2 = t2.children[c2];
12516             o(s2, t2.leaf ? e3(p2) : p2), l2 += u(s2);
12517           }
12518           return l2;
12519         }, r.prototype._adjustParentBBoxes = function(t2, i3, n3) {
12520           for (var r2 = n3; r2 >= 0; r2--)
12521             o(i3[r2], t2);
12522         }, r.prototype._condense = function(t2) {
12523           for (var i3 = t2.length - 1, n3 = void 0; i3 >= 0; i3--)
12524             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);
12525         }, r;
12526       });
12527     }
12528   });
12529
12530   // node_modules/ieee754/index.js
12531   var require_ieee754 = __commonJS({
12532     "node_modules/ieee754/index.js"(exports2) {
12533       exports2.read = function(buffer, offset, isLE, mLen, nBytes) {
12534         var e, m;
12535         var eLen = nBytes * 8 - mLen - 1;
12536         var eMax = (1 << eLen) - 1;
12537         var eBias = eMax >> 1;
12538         var nBits = -7;
12539         var i2 = isLE ? nBytes - 1 : 0;
12540         var d = isLE ? -1 : 1;
12541         var s = buffer[offset + i2];
12542         i2 += d;
12543         e = s & (1 << -nBits) - 1;
12544         s >>= -nBits;
12545         nBits += eLen;
12546         for (; nBits > 0; e = e * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
12547         }
12548         m = e & (1 << -nBits) - 1;
12549         e >>= -nBits;
12550         nBits += mLen;
12551         for (; nBits > 0; m = m * 256 + buffer[offset + i2], i2 += d, nBits -= 8) {
12552         }
12553         if (e === 0) {
12554           e = 1 - eBias;
12555         } else if (e === eMax) {
12556           return m ? NaN : (s ? -1 : 1) * Infinity;
12557         } else {
12558           m = m + Math.pow(2, mLen);
12559           e = e - eBias;
12560         }
12561         return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
12562       };
12563       exports2.write = function(buffer, value, offset, isLE, mLen, nBytes) {
12564         var e, m, c;
12565         var eLen = nBytes * 8 - mLen - 1;
12566         var eMax = (1 << eLen) - 1;
12567         var eBias = eMax >> 1;
12568         var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
12569         var i2 = isLE ? 0 : nBytes - 1;
12570         var d = isLE ? 1 : -1;
12571         var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
12572         value = Math.abs(value);
12573         if (isNaN(value) || value === Infinity) {
12574           m = isNaN(value) ? 1 : 0;
12575           e = eMax;
12576         } else {
12577           e = Math.floor(Math.log(value) / Math.LN2);
12578           if (value * (c = Math.pow(2, -e)) < 1) {
12579             e--;
12580             c *= 2;
12581           }
12582           if (e + eBias >= 1) {
12583             value += rt / c;
12584           } else {
12585             value += rt * Math.pow(2, 1 - eBias);
12586           }
12587           if (value * c >= 2) {
12588             e++;
12589             c /= 2;
12590           }
12591           if (e + eBias >= eMax) {
12592             m = 0;
12593             e = eMax;
12594           } else if (e + eBias >= 1) {
12595             m = (value * c - 1) * Math.pow(2, mLen);
12596             e = e + eBias;
12597           } else {
12598             m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
12599             e = 0;
12600           }
12601         }
12602         for (; mLen >= 8; buffer[offset + i2] = m & 255, i2 += d, m /= 256, mLen -= 8) {
12603         }
12604         e = e << mLen | m;
12605         eLen += mLen;
12606         for (; eLen > 0; buffer[offset + i2] = e & 255, i2 += d, e /= 256, eLen -= 8) {
12607         }
12608         buffer[offset + i2 - d] |= s * 128;
12609       };
12610     }
12611   });
12612
12613   // node_modules/pbf/index.js
12614   var require_pbf = __commonJS({
12615     "node_modules/pbf/index.js"(exports2, module2) {
12616       "use strict";
12617       module2.exports = Pbf;
12618       var ieee754 = require_ieee754();
12619       function Pbf(buf) {
12620         this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
12621         this.pos = 0;
12622         this.type = 0;
12623         this.length = this.buf.length;
12624       }
12625       Pbf.Varint = 0;
12626       Pbf.Fixed64 = 1;
12627       Pbf.Bytes = 2;
12628       Pbf.Fixed32 = 5;
12629       var SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
12630       var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
12631       var TEXT_DECODER_MIN_LENGTH = 12;
12632       var utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf8");
12633       Pbf.prototype = {
12634         destroy: function() {
12635           this.buf = null;
12636         },
12637         // === READING =================================================================
12638         readFields: function(readField, result, end) {
12639           end = end || this.length;
12640           while (this.pos < end) {
12641             var val = this.readVarint(), tag = val >> 3, startPos = this.pos;
12642             this.type = val & 7;
12643             readField(tag, result, this);
12644             if (this.pos === startPos)
12645               this.skip(val);
12646           }
12647           return result;
12648         },
12649         readMessage: function(readField, result) {
12650           return this.readFields(readField, result, this.readVarint() + this.pos);
12651         },
12652         readFixed32: function() {
12653           var val = readUInt32(this.buf, this.pos);
12654           this.pos += 4;
12655           return val;
12656         },
12657         readSFixed32: function() {
12658           var val = readInt32(this.buf, this.pos);
12659           this.pos += 4;
12660           return val;
12661         },
12662         // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
12663         readFixed64: function() {
12664           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
12665           this.pos += 8;
12666           return val;
12667         },
12668         readSFixed64: function() {
12669           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
12670           this.pos += 8;
12671           return val;
12672         },
12673         readFloat: function() {
12674           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
12675           this.pos += 4;
12676           return val;
12677         },
12678         readDouble: function() {
12679           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
12680           this.pos += 8;
12681           return val;
12682         },
12683         readVarint: function(isSigned) {
12684           var buf = this.buf, val, b;
12685           b = buf[this.pos++];
12686           val = b & 127;
12687           if (b < 128)
12688             return val;
12689           b = buf[this.pos++];
12690           val |= (b & 127) << 7;
12691           if (b < 128)
12692             return val;
12693           b = buf[this.pos++];
12694           val |= (b & 127) << 14;
12695           if (b < 128)
12696             return val;
12697           b = buf[this.pos++];
12698           val |= (b & 127) << 21;
12699           if (b < 128)
12700             return val;
12701           b = buf[this.pos];
12702           val |= (b & 15) << 28;
12703           return readVarintRemainder(val, isSigned, this);
12704         },
12705         readVarint64: function() {
12706           return this.readVarint(true);
12707         },
12708         readSVarint: function() {
12709           var num = this.readVarint();
12710           return num % 2 === 1 ? (num + 1) / -2 : num / 2;
12711         },
12712         readBoolean: function() {
12713           return Boolean(this.readVarint());
12714         },
12715         readString: function() {
12716           var end = this.readVarint() + this.pos;
12717           var pos = this.pos;
12718           this.pos = end;
12719           if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {
12720             return readUtf8TextDecoder(this.buf, pos, end);
12721           }
12722           return readUtf8(this.buf, pos, end);
12723         },
12724         readBytes: function() {
12725           var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end);
12726           this.pos = end;
12727           return buffer;
12728         },
12729         // verbose for performance reasons; doesn't affect gzipped size
12730         readPackedVarint: function(arr, isSigned) {
12731           if (this.type !== Pbf.Bytes)
12732             return arr.push(this.readVarint(isSigned));
12733           var end = readPackedEnd(this);
12734           arr = arr || [];
12735           while (this.pos < end)
12736             arr.push(this.readVarint(isSigned));
12737           return arr;
12738         },
12739         readPackedSVarint: function(arr) {
12740           if (this.type !== Pbf.Bytes)
12741             return arr.push(this.readSVarint());
12742           var end = readPackedEnd(this);
12743           arr = arr || [];
12744           while (this.pos < end)
12745             arr.push(this.readSVarint());
12746           return arr;
12747         },
12748         readPackedBoolean: function(arr) {
12749           if (this.type !== Pbf.Bytes)
12750             return arr.push(this.readBoolean());
12751           var end = readPackedEnd(this);
12752           arr = arr || [];
12753           while (this.pos < end)
12754             arr.push(this.readBoolean());
12755           return arr;
12756         },
12757         readPackedFloat: function(arr) {
12758           if (this.type !== Pbf.Bytes)
12759             return arr.push(this.readFloat());
12760           var end = readPackedEnd(this);
12761           arr = arr || [];
12762           while (this.pos < end)
12763             arr.push(this.readFloat());
12764           return arr;
12765         },
12766         readPackedDouble: function(arr) {
12767           if (this.type !== Pbf.Bytes)
12768             return arr.push(this.readDouble());
12769           var end = readPackedEnd(this);
12770           arr = arr || [];
12771           while (this.pos < end)
12772             arr.push(this.readDouble());
12773           return arr;
12774         },
12775         readPackedFixed32: function(arr) {
12776           if (this.type !== Pbf.Bytes)
12777             return arr.push(this.readFixed32());
12778           var end = readPackedEnd(this);
12779           arr = arr || [];
12780           while (this.pos < end)
12781             arr.push(this.readFixed32());
12782           return arr;
12783         },
12784         readPackedSFixed32: function(arr) {
12785           if (this.type !== Pbf.Bytes)
12786             return arr.push(this.readSFixed32());
12787           var end = readPackedEnd(this);
12788           arr = arr || [];
12789           while (this.pos < end)
12790             arr.push(this.readSFixed32());
12791           return arr;
12792         },
12793         readPackedFixed64: function(arr) {
12794           if (this.type !== Pbf.Bytes)
12795             return arr.push(this.readFixed64());
12796           var end = readPackedEnd(this);
12797           arr = arr || [];
12798           while (this.pos < end)
12799             arr.push(this.readFixed64());
12800           return arr;
12801         },
12802         readPackedSFixed64: function(arr) {
12803           if (this.type !== Pbf.Bytes)
12804             return arr.push(this.readSFixed64());
12805           var end = readPackedEnd(this);
12806           arr = arr || [];
12807           while (this.pos < end)
12808             arr.push(this.readSFixed64());
12809           return arr;
12810         },
12811         skip: function(val) {
12812           var type2 = val & 7;
12813           if (type2 === Pbf.Varint)
12814             while (this.buf[this.pos++] > 127) {
12815             }
12816           else if (type2 === Pbf.Bytes)
12817             this.pos = this.readVarint() + this.pos;
12818           else if (type2 === Pbf.Fixed32)
12819             this.pos += 4;
12820           else if (type2 === Pbf.Fixed64)
12821             this.pos += 8;
12822           else
12823             throw new Error("Unimplemented type: " + type2);
12824         },
12825         // === WRITING =================================================================
12826         writeTag: function(tag, type2) {
12827           this.writeVarint(tag << 3 | type2);
12828         },
12829         realloc: function(min3) {
12830           var length = this.length || 16;
12831           while (length < this.pos + min3)
12832             length *= 2;
12833           if (length !== this.length) {
12834             var buf = new Uint8Array(length);
12835             buf.set(this.buf);
12836             this.buf = buf;
12837             this.length = length;
12838           }
12839         },
12840         finish: function() {
12841           this.length = this.pos;
12842           this.pos = 0;
12843           return this.buf.subarray(0, this.length);
12844         },
12845         writeFixed32: function(val) {
12846           this.realloc(4);
12847           writeInt32(this.buf, val, this.pos);
12848           this.pos += 4;
12849         },
12850         writeSFixed32: function(val) {
12851           this.realloc(4);
12852           writeInt32(this.buf, val, this.pos);
12853           this.pos += 4;
12854         },
12855         writeFixed64: function(val) {
12856           this.realloc(8);
12857           writeInt32(this.buf, val & -1, this.pos);
12858           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
12859           this.pos += 8;
12860         },
12861         writeSFixed64: function(val) {
12862           this.realloc(8);
12863           writeInt32(this.buf, val & -1, this.pos);
12864           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
12865           this.pos += 8;
12866         },
12867         writeVarint: function(val) {
12868           val = +val || 0;
12869           if (val > 268435455 || val < 0) {
12870             writeBigVarint(val, this);
12871             return;
12872           }
12873           this.realloc(4);
12874           this.buf[this.pos++] = val & 127 | (val > 127 ? 128 : 0);
12875           if (val <= 127)
12876             return;
12877           this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0);
12878           if (val <= 127)
12879             return;
12880           this.buf[this.pos++] = (val >>>= 7) & 127 | (val > 127 ? 128 : 0);
12881           if (val <= 127)
12882             return;
12883           this.buf[this.pos++] = val >>> 7 & 127;
12884         },
12885         writeSVarint: function(val) {
12886           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
12887         },
12888         writeBoolean: function(val) {
12889           this.writeVarint(Boolean(val));
12890         },
12891         writeString: function(str2) {
12892           str2 = String(str2);
12893           this.realloc(str2.length * 4);
12894           this.pos++;
12895           var startPos = this.pos;
12896           this.pos = writeUtf8(this.buf, str2, this.pos);
12897           var len = this.pos - startPos;
12898           if (len >= 128)
12899             makeRoomForExtraLength(startPos, len, this);
12900           this.pos = startPos - 1;
12901           this.writeVarint(len);
12902           this.pos += len;
12903         },
12904         writeFloat: function(val) {
12905           this.realloc(4);
12906           ieee754.write(this.buf, val, this.pos, true, 23, 4);
12907           this.pos += 4;
12908         },
12909         writeDouble: function(val) {
12910           this.realloc(8);
12911           ieee754.write(this.buf, val, this.pos, true, 52, 8);
12912           this.pos += 8;
12913         },
12914         writeBytes: function(buffer) {
12915           var len = buffer.length;
12916           this.writeVarint(len);
12917           this.realloc(len);
12918           for (var i2 = 0; i2 < len; i2++)
12919             this.buf[this.pos++] = buffer[i2];
12920         },
12921         writeRawMessage: function(fn, obj) {
12922           this.pos++;
12923           var startPos = this.pos;
12924           fn(obj, this);
12925           var len = this.pos - startPos;
12926           if (len >= 128)
12927             makeRoomForExtraLength(startPos, len, this);
12928           this.pos = startPos - 1;
12929           this.writeVarint(len);
12930           this.pos += len;
12931         },
12932         writeMessage: function(tag, fn, obj) {
12933           this.writeTag(tag, Pbf.Bytes);
12934           this.writeRawMessage(fn, obj);
12935         },
12936         writePackedVarint: function(tag, arr) {
12937           if (arr.length)
12938             this.writeMessage(tag, writePackedVarint, arr);
12939         },
12940         writePackedSVarint: function(tag, arr) {
12941           if (arr.length)
12942             this.writeMessage(tag, writePackedSVarint, arr);
12943         },
12944         writePackedBoolean: function(tag, arr) {
12945           if (arr.length)
12946             this.writeMessage(tag, writePackedBoolean, arr);
12947         },
12948         writePackedFloat: function(tag, arr) {
12949           if (arr.length)
12950             this.writeMessage(tag, writePackedFloat, arr);
12951         },
12952         writePackedDouble: function(tag, arr) {
12953           if (arr.length)
12954             this.writeMessage(tag, writePackedDouble, arr);
12955         },
12956         writePackedFixed32: function(tag, arr) {
12957           if (arr.length)
12958             this.writeMessage(tag, writePackedFixed32, arr);
12959         },
12960         writePackedSFixed32: function(tag, arr) {
12961           if (arr.length)
12962             this.writeMessage(tag, writePackedSFixed32, arr);
12963         },
12964         writePackedFixed64: function(tag, arr) {
12965           if (arr.length)
12966             this.writeMessage(tag, writePackedFixed64, arr);
12967         },
12968         writePackedSFixed64: function(tag, arr) {
12969           if (arr.length)
12970             this.writeMessage(tag, writePackedSFixed64, arr);
12971         },
12972         writeBytesField: function(tag, buffer) {
12973           this.writeTag(tag, Pbf.Bytes);
12974           this.writeBytes(buffer);
12975         },
12976         writeFixed32Field: function(tag, val) {
12977           this.writeTag(tag, Pbf.Fixed32);
12978           this.writeFixed32(val);
12979         },
12980         writeSFixed32Field: function(tag, val) {
12981           this.writeTag(tag, Pbf.Fixed32);
12982           this.writeSFixed32(val);
12983         },
12984         writeFixed64Field: function(tag, val) {
12985           this.writeTag(tag, Pbf.Fixed64);
12986           this.writeFixed64(val);
12987         },
12988         writeSFixed64Field: function(tag, val) {
12989           this.writeTag(tag, Pbf.Fixed64);
12990           this.writeSFixed64(val);
12991         },
12992         writeVarintField: function(tag, val) {
12993           this.writeTag(tag, Pbf.Varint);
12994           this.writeVarint(val);
12995         },
12996         writeSVarintField: function(tag, val) {
12997           this.writeTag(tag, Pbf.Varint);
12998           this.writeSVarint(val);
12999         },
13000         writeStringField: function(tag, str2) {
13001           this.writeTag(tag, Pbf.Bytes);
13002           this.writeString(str2);
13003         },
13004         writeFloatField: function(tag, val) {
13005           this.writeTag(tag, Pbf.Fixed32);
13006           this.writeFloat(val);
13007         },
13008         writeDoubleField: function(tag, val) {
13009           this.writeTag(tag, Pbf.Fixed64);
13010           this.writeDouble(val);
13011         },
13012         writeBooleanField: function(tag, val) {
13013           this.writeVarintField(tag, Boolean(val));
13014         }
13015       };
13016       function readVarintRemainder(l, s, p) {
13017         var buf = p.buf, h, b;
13018         b = buf[p.pos++];
13019         h = (b & 112) >> 4;
13020         if (b < 128)
13021           return toNum(l, h, s);
13022         b = buf[p.pos++];
13023         h |= (b & 127) << 3;
13024         if (b < 128)
13025           return toNum(l, h, s);
13026         b = buf[p.pos++];
13027         h |= (b & 127) << 10;
13028         if (b < 128)
13029           return toNum(l, h, s);
13030         b = buf[p.pos++];
13031         h |= (b & 127) << 17;
13032         if (b < 128)
13033           return toNum(l, h, s);
13034         b = buf[p.pos++];
13035         h |= (b & 127) << 24;
13036         if (b < 128)
13037           return toNum(l, h, s);
13038         b = buf[p.pos++];
13039         h |= (b & 1) << 31;
13040         if (b < 128)
13041           return toNum(l, h, s);
13042         throw new Error("Expected varint not more than 10 bytes");
13043       }
13044       function readPackedEnd(pbf) {
13045         return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1;
13046       }
13047       function toNum(low, high, isSigned) {
13048         if (isSigned) {
13049           return high * 4294967296 + (low >>> 0);
13050         }
13051         return (high >>> 0) * 4294967296 + (low >>> 0);
13052       }
13053       function writeBigVarint(val, pbf) {
13054         var low, high;
13055         if (val >= 0) {
13056           low = val % 4294967296 | 0;
13057           high = val / 4294967296 | 0;
13058         } else {
13059           low = ~(-val % 4294967296);
13060           high = ~(-val / 4294967296);
13061           if (low ^ 4294967295) {
13062             low = low + 1 | 0;
13063           } else {
13064             low = 0;
13065             high = high + 1 | 0;
13066           }
13067         }
13068         if (val >= 18446744073709552e3 || val < -18446744073709552e3) {
13069           throw new Error("Given varint doesn't fit into 10 bytes");
13070         }
13071         pbf.realloc(10);
13072         writeBigVarintLow(low, high, pbf);
13073         writeBigVarintHigh(high, pbf);
13074       }
13075       function writeBigVarintLow(low, high, pbf) {
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 | 128;
13083         low >>>= 7;
13084         pbf.buf[pbf.pos] = low & 127;
13085       }
13086       function writeBigVarintHigh(high, pbf) {
13087         var lsb = (high & 7) << 4;
13088         pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 128 : 0);
13089         if (!high)
13090           return;
13091         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13092         if (!high)
13093           return;
13094         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13095         if (!high)
13096           return;
13097         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13098         if (!high)
13099           return;
13100         pbf.buf[pbf.pos++] = high & 127 | ((high >>>= 7) ? 128 : 0);
13101         if (!high)
13102           return;
13103         pbf.buf[pbf.pos++] = high & 127;
13104       }
13105       function makeRoomForExtraLength(startPos, len, pbf) {
13106         var extraLen = len <= 16383 ? 1 : len <= 2097151 ? 2 : len <= 268435455 ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
13107         pbf.realloc(extraLen);
13108         for (var i2 = pbf.pos - 1; i2 >= startPos; i2--)
13109           pbf.buf[i2 + extraLen] = pbf.buf[i2];
13110       }
13111       function writePackedVarint(arr, pbf) {
13112         for (var i2 = 0; i2 < arr.length; i2++)
13113           pbf.writeVarint(arr[i2]);
13114       }
13115       function writePackedSVarint(arr, pbf) {
13116         for (var i2 = 0; i2 < arr.length; i2++)
13117           pbf.writeSVarint(arr[i2]);
13118       }
13119       function writePackedFloat(arr, pbf) {
13120         for (var i2 = 0; i2 < arr.length; i2++)
13121           pbf.writeFloat(arr[i2]);
13122       }
13123       function writePackedDouble(arr, pbf) {
13124         for (var i2 = 0; i2 < arr.length; i2++)
13125           pbf.writeDouble(arr[i2]);
13126       }
13127       function writePackedBoolean(arr, pbf) {
13128         for (var i2 = 0; i2 < arr.length; i2++)
13129           pbf.writeBoolean(arr[i2]);
13130       }
13131       function writePackedFixed32(arr, pbf) {
13132         for (var i2 = 0; i2 < arr.length; i2++)
13133           pbf.writeFixed32(arr[i2]);
13134       }
13135       function writePackedSFixed32(arr, pbf) {
13136         for (var i2 = 0; i2 < arr.length; i2++)
13137           pbf.writeSFixed32(arr[i2]);
13138       }
13139       function writePackedFixed64(arr, pbf) {
13140         for (var i2 = 0; i2 < arr.length; i2++)
13141           pbf.writeFixed64(arr[i2]);
13142       }
13143       function writePackedSFixed64(arr, pbf) {
13144         for (var i2 = 0; i2 < arr.length; i2++)
13145           pbf.writeSFixed64(arr[i2]);
13146       }
13147       function readUInt32(buf, pos) {
13148         return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + buf[pos + 3] * 16777216;
13149       }
13150       function writeInt32(buf, val, pos) {
13151         buf[pos] = val;
13152         buf[pos + 1] = val >>> 8;
13153         buf[pos + 2] = val >>> 16;
13154         buf[pos + 3] = val >>> 24;
13155       }
13156       function readInt32(buf, pos) {
13157         return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16) + (buf[pos + 3] << 24);
13158       }
13159       function readUtf8(buf, pos, end) {
13160         var str2 = "";
13161         var i2 = pos;
13162         while (i2 < end) {
13163           var b0 = buf[i2];
13164           var c = null;
13165           var bytesPerSequence = b0 > 239 ? 4 : b0 > 223 ? 3 : b0 > 191 ? 2 : 1;
13166           if (i2 + bytesPerSequence > end)
13167             break;
13168           var b1, b2, b3;
13169           if (bytesPerSequence === 1) {
13170             if (b0 < 128) {
13171               c = b0;
13172             }
13173           } else if (bytesPerSequence === 2) {
13174             b1 = buf[i2 + 1];
13175             if ((b1 & 192) === 128) {
13176               c = (b0 & 31) << 6 | b1 & 63;
13177               if (c <= 127) {
13178                 c = null;
13179               }
13180             }
13181           } else if (bytesPerSequence === 3) {
13182             b1 = buf[i2 + 1];
13183             b2 = buf[i2 + 2];
13184             if ((b1 & 192) === 128 && (b2 & 192) === 128) {
13185               c = (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63;
13186               if (c <= 2047 || c >= 55296 && c <= 57343) {
13187                 c = null;
13188               }
13189             }
13190           } else if (bytesPerSequence === 4) {
13191             b1 = buf[i2 + 1];
13192             b2 = buf[i2 + 2];
13193             b3 = buf[i2 + 3];
13194             if ((b1 & 192) === 128 && (b2 & 192) === 128 && (b3 & 192) === 128) {
13195               c = (b0 & 15) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63;
13196               if (c <= 65535 || c >= 1114112) {
13197                 c = null;
13198               }
13199             }
13200           }
13201           if (c === null) {
13202             c = 65533;
13203             bytesPerSequence = 1;
13204           } else if (c > 65535) {
13205             c -= 65536;
13206             str2 += String.fromCharCode(c >>> 10 & 1023 | 55296);
13207             c = 56320 | c & 1023;
13208           }
13209           str2 += String.fromCharCode(c);
13210           i2 += bytesPerSequence;
13211         }
13212         return str2;
13213       }
13214       function readUtf8TextDecoder(buf, pos, end) {
13215         return utf8TextDecoder.decode(buf.subarray(pos, end));
13216       }
13217       function writeUtf8(buf, str2, pos) {
13218         for (var i2 = 0, c, lead; i2 < str2.length; i2++) {
13219           c = str2.charCodeAt(i2);
13220           if (c > 55295 && c < 57344) {
13221             if (lead) {
13222               if (c < 56320) {
13223                 buf[pos++] = 239;
13224                 buf[pos++] = 191;
13225                 buf[pos++] = 189;
13226                 lead = c;
13227                 continue;
13228               } else {
13229                 c = lead - 55296 << 10 | c - 56320 | 65536;
13230                 lead = null;
13231               }
13232             } else {
13233               if (c > 56319 || i2 + 1 === str2.length) {
13234                 buf[pos++] = 239;
13235                 buf[pos++] = 191;
13236                 buf[pos++] = 189;
13237               } else {
13238                 lead = c;
13239               }
13240               continue;
13241             }
13242           } else if (lead) {
13243             buf[pos++] = 239;
13244             buf[pos++] = 191;
13245             buf[pos++] = 189;
13246             lead = null;
13247           }
13248           if (c < 128) {
13249             buf[pos++] = c;
13250           } else {
13251             if (c < 2048) {
13252               buf[pos++] = c >> 6 | 192;
13253             } else {
13254               if (c < 65536) {
13255                 buf[pos++] = c >> 12 | 224;
13256               } else {
13257                 buf[pos++] = c >> 18 | 240;
13258                 buf[pos++] = c >> 12 & 63 | 128;
13259               }
13260               buf[pos++] = c >> 6 & 63 | 128;
13261             }
13262             buf[pos++] = c & 63 | 128;
13263           }
13264         }
13265         return pos;
13266       }
13267     }
13268   });
13269
13270   // node_modules/@mapbox/point-geometry/index.js
13271   var require_point_geometry = __commonJS({
13272     "node_modules/@mapbox/point-geometry/index.js"(exports2, module2) {
13273       "use strict";
13274       module2.exports = Point;
13275       function Point(x, y) {
13276         this.x = x;
13277         this.y = y;
13278       }
13279       Point.prototype = {
13280         /**
13281          * Clone this point, returning a new point that can be modified
13282          * without affecting the old one.
13283          * @return {Point} the clone
13284          */
13285         clone: function() {
13286           return new Point(this.x, this.y);
13287         },
13288         /**
13289          * Add this point's x & y coordinates to another point,
13290          * yielding a new point.
13291          * @param {Point} p the other point
13292          * @return {Point} output point
13293          */
13294         add: function(p) {
13295           return this.clone()._add(p);
13296         },
13297         /**
13298          * Subtract this point's x & y coordinates to from point,
13299          * yielding a new point.
13300          * @param {Point} p the other point
13301          * @return {Point} output point
13302          */
13303         sub: function(p) {
13304           return this.clone()._sub(p);
13305         },
13306         /**
13307          * Multiply this point's x & y coordinates by point,
13308          * yielding a new point.
13309          * @param {Point} p the other point
13310          * @return {Point} output point
13311          */
13312         multByPoint: function(p) {
13313           return this.clone()._multByPoint(p);
13314         },
13315         /**
13316          * Divide this point's x & y coordinates by point,
13317          * yielding a new point.
13318          * @param {Point} p the other point
13319          * @return {Point} output point
13320          */
13321         divByPoint: function(p) {
13322           return this.clone()._divByPoint(p);
13323         },
13324         /**
13325          * Multiply this point's x & y coordinates by a factor,
13326          * yielding a new point.
13327          * @param {Point} k factor
13328          * @return {Point} output point
13329          */
13330         mult: function(k) {
13331           return this.clone()._mult(k);
13332         },
13333         /**
13334          * Divide this point's x & y coordinates by a factor,
13335          * yielding a new point.
13336          * @param {Point} k factor
13337          * @return {Point} output point
13338          */
13339         div: function(k) {
13340           return this.clone()._div(k);
13341         },
13342         /**
13343          * Rotate this point around the 0, 0 origin by an angle a,
13344          * given in radians
13345          * @param {Number} a angle to rotate around, in radians
13346          * @return {Point} output point
13347          */
13348         rotate: function(a) {
13349           return this.clone()._rotate(a);
13350         },
13351         /**
13352          * Rotate this point around p point by an angle a,
13353          * given in radians
13354          * @param {Number} a angle to rotate around, in radians
13355          * @param {Point} p Point to rotate around
13356          * @return {Point} output point
13357          */
13358         rotateAround: function(a, p) {
13359           return this.clone()._rotateAround(a, p);
13360         },
13361         /**
13362          * Multiply this point by a 4x1 transformation matrix
13363          * @param {Array<Number>} m transformation matrix
13364          * @return {Point} output point
13365          */
13366         matMult: function(m) {
13367           return this.clone()._matMult(m);
13368         },
13369         /**
13370          * Calculate this point but as a unit vector from 0, 0, meaning
13371          * that the distance from the resulting point to the 0, 0
13372          * coordinate will be equal to 1 and the angle from the resulting
13373          * point to the 0, 0 coordinate will be the same as before.
13374          * @return {Point} unit vector point
13375          */
13376         unit: function() {
13377           return this.clone()._unit();
13378         },
13379         /**
13380          * Compute a perpendicular point, where the new y coordinate
13381          * is the old x coordinate and the new x coordinate is the old y
13382          * coordinate multiplied by -1
13383          * @return {Point} perpendicular point
13384          */
13385         perp: function() {
13386           return this.clone()._perp();
13387         },
13388         /**
13389          * Return a version of this point with the x & y coordinates
13390          * rounded to integers.
13391          * @return {Point} rounded point
13392          */
13393         round: function() {
13394           return this.clone()._round();
13395         },
13396         /**
13397          * Return the magitude of this point: this is the Euclidean
13398          * distance from the 0, 0 coordinate to this point's x and y
13399          * coordinates.
13400          * @return {Number} magnitude
13401          */
13402         mag: function() {
13403           return Math.sqrt(this.x * this.x + this.y * this.y);
13404         },
13405         /**
13406          * Judge whether this point is equal to another point, returning
13407          * true or false.
13408          * @param {Point} other the other point
13409          * @return {boolean} whether the points are equal
13410          */
13411         equals: function(other) {
13412           return this.x === other.x && this.y === other.y;
13413         },
13414         /**
13415          * Calculate the distance from this point to another point
13416          * @param {Point} p the other point
13417          * @return {Number} distance
13418          */
13419         dist: function(p) {
13420           return Math.sqrt(this.distSqr(p));
13421         },
13422         /**
13423          * Calculate the distance from this point to another point,
13424          * without the square root step. Useful if you're comparing
13425          * relative distances.
13426          * @param {Point} p the other point
13427          * @return {Number} distance
13428          */
13429         distSqr: function(p) {
13430           var dx = p.x - this.x, dy = p.y - this.y;
13431           return dx * dx + dy * dy;
13432         },
13433         /**
13434          * Get the angle from the 0, 0 coordinate to this point, in radians
13435          * coordinates.
13436          * @return {Number} angle
13437          */
13438         angle: function() {
13439           return Math.atan2(this.y, this.x);
13440         },
13441         /**
13442          * Get the angle from this point to another point, in radians
13443          * @param {Point} b the other point
13444          * @return {Number} angle
13445          */
13446         angleTo: function(b) {
13447           return Math.atan2(this.y - b.y, this.x - b.x);
13448         },
13449         /**
13450          * Get the angle between this point and another point, in radians
13451          * @param {Point} b the other point
13452          * @return {Number} angle
13453          */
13454         angleWith: function(b) {
13455           return this.angleWithSep(b.x, b.y);
13456         },
13457         /*
13458          * Find the angle of the two vectors, solving the formula for
13459          * the cross product a x b = |a||b|sin(θ) for θ.
13460          * @param {Number} x the x-coordinate
13461          * @param {Number} y the y-coordinate
13462          * @return {Number} the angle in radians
13463          */
13464         angleWithSep: function(x, y) {
13465           return Math.atan2(
13466             this.x * y - this.y * x,
13467             this.x * x + this.y * y
13468           );
13469         },
13470         _matMult: function(m) {
13471           var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y;
13472           this.x = x;
13473           this.y = y;
13474           return this;
13475         },
13476         _add: function(p) {
13477           this.x += p.x;
13478           this.y += p.y;
13479           return this;
13480         },
13481         _sub: function(p) {
13482           this.x -= p.x;
13483           this.y -= p.y;
13484           return this;
13485         },
13486         _mult: function(k) {
13487           this.x *= k;
13488           this.y *= k;
13489           return this;
13490         },
13491         _div: function(k) {
13492           this.x /= k;
13493           this.y /= k;
13494           return this;
13495         },
13496         _multByPoint: function(p) {
13497           this.x *= p.x;
13498           this.y *= p.y;
13499           return this;
13500         },
13501         _divByPoint: function(p) {
13502           this.x /= p.x;
13503           this.y /= p.y;
13504           return this;
13505         },
13506         _unit: function() {
13507           this._div(this.mag());
13508           return this;
13509         },
13510         _perp: function() {
13511           var y = this.y;
13512           this.y = this.x;
13513           this.x = -y;
13514           return this;
13515         },
13516         _rotate: function(angle2) {
13517           var cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), x = cos2 * this.x - sin2 * this.y, y = sin2 * this.x + cos2 * this.y;
13518           this.x = x;
13519           this.y = y;
13520           return this;
13521         },
13522         _rotateAround: function(angle2, p) {
13523           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);
13524           this.x = x;
13525           this.y = y;
13526           return this;
13527         },
13528         _round: function() {
13529           this.x = Math.round(this.x);
13530           this.y = Math.round(this.y);
13531           return this;
13532         }
13533       };
13534       Point.convert = function(a) {
13535         if (a instanceof Point) {
13536           return a;
13537         }
13538         if (Array.isArray(a)) {
13539           return new Point(a[0], a[1]);
13540         }
13541         return a;
13542       };
13543     }
13544   });
13545
13546   // node_modules/@mapbox/vector-tile/lib/vectortilefeature.js
13547   var require_vectortilefeature = __commonJS({
13548     "node_modules/@mapbox/vector-tile/lib/vectortilefeature.js"(exports2, module2) {
13549       "use strict";
13550       var Point = require_point_geometry();
13551       module2.exports = VectorTileFeature;
13552       function VectorTileFeature(pbf, end, extent, keys2, values) {
13553         this.properties = {};
13554         this.extent = extent;
13555         this.type = 0;
13556         this._pbf = pbf;
13557         this._geometry = -1;
13558         this._keys = keys2;
13559         this._values = values;
13560         pbf.readFields(readFeature, this, end);
13561       }
13562       function readFeature(tag, feature3, pbf) {
13563         if (tag == 1)
13564           feature3.id = pbf.readVarint();
13565         else if (tag == 2)
13566           readTag(pbf, feature3);
13567         else if (tag == 3)
13568           feature3.type = pbf.readVarint();
13569         else if (tag == 4)
13570           feature3._geometry = pbf.pos;
13571       }
13572       function readTag(pbf, feature3) {
13573         var end = pbf.readVarint() + pbf.pos;
13574         while (pbf.pos < end) {
13575           var key = feature3._keys[pbf.readVarint()], value = feature3._values[pbf.readVarint()];
13576           feature3.properties[key] = value;
13577         }
13578       }
13579       VectorTileFeature.types = ["Unknown", "Point", "LineString", "Polygon"];
13580       VectorTileFeature.prototype.loadGeometry = function() {
13581         var pbf = this._pbf;
13582         pbf.pos = this._geometry;
13583         var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line;
13584         while (pbf.pos < end) {
13585           if (length <= 0) {
13586             var cmdLen = pbf.readVarint();
13587             cmd = cmdLen & 7;
13588             length = cmdLen >> 3;
13589           }
13590           length--;
13591           if (cmd === 1 || cmd === 2) {
13592             x += pbf.readSVarint();
13593             y += pbf.readSVarint();
13594             if (cmd === 1) {
13595               if (line)
13596                 lines.push(line);
13597               line = [];
13598             }
13599             line.push(new Point(x, y));
13600           } else if (cmd === 7) {
13601             if (line) {
13602               line.push(line[0].clone());
13603             }
13604           } else {
13605             throw new Error("unknown command " + cmd);
13606           }
13607         }
13608         if (line)
13609           lines.push(line);
13610         return lines;
13611       };
13612       VectorTileFeature.prototype.bbox = function() {
13613         var pbf = this._pbf;
13614         pbf.pos = this._geometry;
13615         var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x12 = Infinity, x2 = -Infinity, y12 = Infinity, y2 = -Infinity;
13616         while (pbf.pos < end) {
13617           if (length <= 0) {
13618             var cmdLen = pbf.readVarint();
13619             cmd = cmdLen & 7;
13620             length = cmdLen >> 3;
13621           }
13622           length--;
13623           if (cmd === 1 || cmd === 2) {
13624             x += pbf.readSVarint();
13625             y += pbf.readSVarint();
13626             if (x < x12)
13627               x12 = x;
13628             if (x > x2)
13629               x2 = x;
13630             if (y < y12)
13631               y12 = y;
13632             if (y > y2)
13633               y2 = y;
13634           } else if (cmd !== 7) {
13635             throw new Error("unknown command " + cmd);
13636           }
13637         }
13638         return [x12, y12, x2, y2];
13639       };
13640       VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
13641         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;
13642         function project(line) {
13643           for (var j3 = 0; j3 < line.length; j3++) {
13644             var p = line[j3], y2 = 180 - (p.y + y05) * 360 / size;
13645             line[j3] = [
13646               (p.x + x05) * 360 / size - 180,
13647               360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
13648             ];
13649           }
13650         }
13651         switch (this.type) {
13652           case 1:
13653             var points = [];
13654             for (i2 = 0; i2 < coords.length; i2++) {
13655               points[i2] = coords[i2][0];
13656             }
13657             coords = points;
13658             project(coords);
13659             break;
13660           case 2:
13661             for (i2 = 0; i2 < coords.length; i2++) {
13662               project(coords[i2]);
13663             }
13664             break;
13665           case 3:
13666             coords = classifyRings(coords);
13667             for (i2 = 0; i2 < coords.length; i2++) {
13668               for (j2 = 0; j2 < coords[i2].length; j2++) {
13669                 project(coords[i2][j2]);
13670               }
13671             }
13672             break;
13673         }
13674         if (coords.length === 1) {
13675           coords = coords[0];
13676         } else {
13677           type2 = "Multi" + type2;
13678         }
13679         var result = {
13680           type: "Feature",
13681           geometry: {
13682             type: type2,
13683             coordinates: coords
13684           },
13685           properties: this.properties
13686         };
13687         if ("id" in this) {
13688           result.id = this.id;
13689         }
13690         return result;
13691       };
13692       function classifyRings(rings) {
13693         var len = rings.length;
13694         if (len <= 1)
13695           return [rings];
13696         var polygons = [], polygon2, ccw;
13697         for (var i2 = 0; i2 < len; i2++) {
13698           var area = signedArea(rings[i2]);
13699           if (area === 0)
13700             continue;
13701           if (ccw === void 0)
13702             ccw = area < 0;
13703           if (ccw === area < 0) {
13704             if (polygon2)
13705               polygons.push(polygon2);
13706             polygon2 = [rings[i2]];
13707           } else {
13708             polygon2.push(rings[i2]);
13709           }
13710         }
13711         if (polygon2)
13712           polygons.push(polygon2);
13713         return polygons;
13714       }
13715       function signedArea(ring) {
13716         var sum = 0;
13717         for (var i2 = 0, len = ring.length, j2 = len - 1, p1, p2; i2 < len; j2 = i2++) {
13718           p1 = ring[i2];
13719           p2 = ring[j2];
13720           sum += (p2.x - p1.x) * (p1.y + p2.y);
13721         }
13722         return sum;
13723       }
13724     }
13725   });
13726
13727   // node_modules/@mapbox/vector-tile/lib/vectortilelayer.js
13728   var require_vectortilelayer = __commonJS({
13729     "node_modules/@mapbox/vector-tile/lib/vectortilelayer.js"(exports2, module2) {
13730       "use strict";
13731       var VectorTileFeature = require_vectortilefeature();
13732       module2.exports = VectorTileLayer;
13733       function VectorTileLayer(pbf, end) {
13734         this.version = 1;
13735         this.name = null;
13736         this.extent = 4096;
13737         this.length = 0;
13738         this._pbf = pbf;
13739         this._keys = [];
13740         this._values = [];
13741         this._features = [];
13742         pbf.readFields(readLayer, this, end);
13743         this.length = this._features.length;
13744       }
13745       function readLayer(tag, layer, pbf) {
13746         if (tag === 15)
13747           layer.version = pbf.readVarint();
13748         else if (tag === 1)
13749           layer.name = pbf.readString();
13750         else if (tag === 5)
13751           layer.extent = pbf.readVarint();
13752         else if (tag === 2)
13753           layer._features.push(pbf.pos);
13754         else if (tag === 3)
13755           layer._keys.push(pbf.readString());
13756         else if (tag === 4)
13757           layer._values.push(readValueMessage(pbf));
13758       }
13759       function readValueMessage(pbf) {
13760         var value = null, end = pbf.readVarint() + pbf.pos;
13761         while (pbf.pos < end) {
13762           var tag = pbf.readVarint() >> 3;
13763           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;
13764         }
13765         return value;
13766       }
13767       VectorTileLayer.prototype.feature = function(i2) {
13768         if (i2 < 0 || i2 >= this._features.length)
13769           throw new Error("feature index out of bounds");
13770         this._pbf.pos = this._features[i2];
13771         var end = this._pbf.readVarint() + this._pbf.pos;
13772         return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);
13773       };
13774     }
13775   });
13776
13777   // node_modules/@mapbox/vector-tile/lib/vectortile.js
13778   var require_vectortile = __commonJS({
13779     "node_modules/@mapbox/vector-tile/lib/vectortile.js"(exports2, module2) {
13780       "use strict";
13781       var VectorTileLayer = require_vectortilelayer();
13782       module2.exports = VectorTile2;
13783       function VectorTile2(pbf, end) {
13784         this.layers = pbf.readFields(readTile, {}, end);
13785       }
13786       function readTile(tag, layers, pbf) {
13787         if (tag === 3) {
13788           var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);
13789           if (layer.length)
13790             layers[layer.name] = layer;
13791         }
13792       }
13793     }
13794   });
13795
13796   // node_modules/@mapbox/vector-tile/index.js
13797   var require_vector_tile = __commonJS({
13798     "node_modules/@mapbox/vector-tile/index.js"(exports2, module2) {
13799       module2.exports.VectorTile = require_vectortile();
13800       module2.exports.VectorTileFeature = require_vectortilefeature();
13801       module2.exports.VectorTileLayer = require_vectortilelayer();
13802     }
13803   });
13804
13805   // node_modules/fast-json-stable-stringify/index.js
13806   var require_fast_json_stable_stringify = __commonJS({
13807     "node_modules/fast-json-stable-stringify/index.js"(exports2, module2) {
13808       "use strict";
13809       module2.exports = function(data, opts) {
13810         if (!opts)
13811           opts = {};
13812         if (typeof opts === "function")
13813           opts = { cmp: opts };
13814         var cycles = typeof opts.cycles === "boolean" ? opts.cycles : false;
13815         var cmp = opts.cmp && function(f2) {
13816           return function(node) {
13817             return function(a, b) {
13818               var aobj = { key: a, value: node[a] };
13819               var bobj = { key: b, value: node[b] };
13820               return f2(aobj, bobj);
13821             };
13822           };
13823         }(opts.cmp);
13824         var seen = [];
13825         return function stringify3(node) {
13826           if (node && node.toJSON && typeof node.toJSON === "function") {
13827             node = node.toJSON();
13828           }
13829           if (node === void 0)
13830             return;
13831           if (typeof node == "number")
13832             return isFinite(node) ? "" + node : "null";
13833           if (typeof node !== "object")
13834             return JSON.stringify(node);
13835           var i2, out;
13836           if (Array.isArray(node)) {
13837             out = "[";
13838             for (i2 = 0; i2 < node.length; i2++) {
13839               if (i2)
13840                 out += ",";
13841               out += stringify3(node[i2]) || "null";
13842             }
13843             return out + "]";
13844           }
13845           if (node === null)
13846             return "null";
13847           if (seen.indexOf(node) !== -1) {
13848             if (cycles)
13849               return JSON.stringify("__cycle__");
13850             throw new TypeError("Converting circular structure to JSON");
13851           }
13852           var seenIndex = seen.push(node) - 1;
13853           var keys2 = Object.keys(node).sort(cmp && cmp(node));
13854           out = "";
13855           for (i2 = 0; i2 < keys2.length; i2++) {
13856             var key = keys2[i2];
13857             var value = stringify3(node[key]);
13858             if (!value)
13859               continue;
13860             if (out)
13861               out += ",";
13862             out += JSON.stringify(key) + ":" + value;
13863           }
13864           seen.splice(seenIndex, 1);
13865           return "{" + out + "}";
13866         }(data);
13867       };
13868     }
13869   });
13870
13871   // node_modules/@mapbox/sexagesimal/index.js
13872   var require_sexagesimal = __commonJS({
13873     "node_modules/@mapbox/sexagesimal/index.js"(exports2, module2) {
13874       module2.exports = element;
13875       module2.exports.pair = pair2;
13876       module2.exports.format = format2;
13877       module2.exports.formatPair = formatPair;
13878       module2.exports.coordToDMS = coordToDMS;
13879       function element(input, dims) {
13880         var result = search(input, dims);
13881         return result === null ? null : result.val;
13882       }
13883       function formatPair(input) {
13884         return format2(input.lat, "lat") + " " + format2(input.lon, "lon");
13885       }
13886       function format2(input, dim) {
13887         var dms = coordToDMS(input, dim);
13888         return dms.whole + "\xB0 " + (dms.minutes ? dms.minutes + "' " : "") + (dms.seconds ? dms.seconds + '" ' : "") + dms.dir;
13889       }
13890       function coordToDMS(input, dim) {
13891         var dirs = { lat: ["N", "S"], lon: ["E", "W"] }[dim] || "";
13892         var dir = dirs[input >= 0 ? 0 : 1];
13893         var abs3 = Math.abs(input);
13894         var whole = Math.floor(abs3);
13895         var fraction = abs3 - whole;
13896         var fractionMinutes = fraction * 60;
13897         var minutes = Math.floor(fractionMinutes);
13898         var seconds = Math.floor((fractionMinutes - minutes) * 60);
13899         return {
13900           whole,
13901           minutes,
13902           seconds,
13903           dir
13904         };
13905       }
13906       function search(input, dims) {
13907         if (!dims)
13908           dims = "NSEW";
13909         if (typeof input !== "string")
13910           return null;
13911         input = input.toUpperCase();
13912         var regex = /^[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)[°º˚]?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/;
13913         var m = input.match(regex);
13914         if (!m)
13915           return null;
13916         var matched = m[0];
13917         var dim;
13918         if (m[1] && m[5]) {
13919           dim = m[1];
13920           matched = matched.slice(0, -1);
13921         } else {
13922           dim = m[1] || m[5];
13923         }
13924         if (dim && dims.indexOf(dim) === -1)
13925           return null;
13926         var deg = m[2] ? parseFloat(m[2]) : 0;
13927         var min3 = m[3] ? parseFloat(m[3]) / 60 : 0;
13928         var sec = m[4] ? parseFloat(m[4]) / 3600 : 0;
13929         var sign2 = deg < 0 ? -1 : 1;
13930         if (dim === "S" || dim === "W")
13931           sign2 *= -1;
13932         return {
13933           val: (Math.abs(deg) + min3 + sec) * sign2,
13934           dim,
13935           matched,
13936           remain: input.slice(matched.length)
13937         };
13938       }
13939       function pair2(input, dims) {
13940         input = input.trim();
13941         var one2 = search(input, dims);
13942         if (!one2)
13943           return null;
13944         input = one2.remain.trim();
13945         var two = search(input, dims);
13946         if (!two || two.remain)
13947           return null;
13948         if (one2.dim) {
13949           return swapdim(one2.val, two.val, one2.dim);
13950         } else {
13951           return [one2.val, two.val];
13952         }
13953       }
13954       function swapdim(a, b, dim) {
13955         if (dim === "N" || dim === "S")
13956           return [a, b];
13957         if (dim === "W" || dim === "E")
13958           return [b, a];
13959       }
13960     }
13961   });
13962
13963   // node_modules/store/src/util.js
13964   var require_util = __commonJS({
13965     "node_modules/store/src/util.js"(exports2, module2) {
13966       var assign = make_assign();
13967       var create2 = make_create();
13968       var trim = make_trim();
13969       var Global = typeof window !== "undefined" ? window : global;
13970       module2.exports = {
13971         assign,
13972         create: create2,
13973         trim,
13974         bind,
13975         slice,
13976         each,
13977         map: map2,
13978         pluck,
13979         isList,
13980         isFunction: isFunction2,
13981         isObject: isObject3,
13982         Global
13983       };
13984       function make_assign() {
13985         if (Object.assign) {
13986           return Object.assign;
13987         } else {
13988           return function shimAssign(obj, props1, props2, etc) {
13989             for (var i2 = 1; i2 < arguments.length; i2++) {
13990               each(Object(arguments[i2]), function(val, key) {
13991                 obj[key] = val;
13992               });
13993             }
13994             return obj;
13995           };
13996         }
13997       }
13998       function make_create() {
13999         if (Object.create) {
14000           return function create3(obj, assignProps1, assignProps2, etc) {
14001             var assignArgsList = slice(arguments, 1);
14002             return assign.apply(this, [Object.create(obj)].concat(assignArgsList));
14003           };
14004         } else {
14005           let F2 = function() {
14006           };
14007           var F = F2;
14008           return function create3(obj, assignProps1, assignProps2, etc) {
14009             var assignArgsList = slice(arguments, 1);
14010             F2.prototype = obj;
14011             return assign.apply(this, [new F2()].concat(assignArgsList));
14012           };
14013         }
14014       }
14015       function make_trim() {
14016         if (String.prototype.trim) {
14017           return function trim2(str2) {
14018             return String.prototype.trim.call(str2);
14019           };
14020         } else {
14021           return function trim2(str2) {
14022             return str2.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
14023           };
14024         }
14025       }
14026       function bind(obj, fn) {
14027         return function() {
14028           return fn.apply(obj, Array.prototype.slice.call(arguments, 0));
14029         };
14030       }
14031       function slice(arr, index) {
14032         return Array.prototype.slice.call(arr, index || 0);
14033       }
14034       function each(obj, fn) {
14035         pluck(obj, function(val, key) {
14036           fn(val, key);
14037           return false;
14038         });
14039       }
14040       function map2(obj, fn) {
14041         var res = isList(obj) ? [] : {};
14042         pluck(obj, function(v, k) {
14043           res[k] = fn(v, k);
14044           return false;
14045         });
14046         return res;
14047       }
14048       function pluck(obj, fn) {
14049         if (isList(obj)) {
14050           for (var i2 = 0; i2 < obj.length; i2++) {
14051             if (fn(obj[i2], i2)) {
14052               return obj[i2];
14053             }
14054           }
14055         } else {
14056           for (var key in obj) {
14057             if (obj.hasOwnProperty(key)) {
14058               if (fn(obj[key], key)) {
14059                 return obj[key];
14060               }
14061             }
14062           }
14063         }
14064       }
14065       function isList(val) {
14066         return val != null && typeof val != "function" && typeof val.length == "number";
14067       }
14068       function isFunction2(val) {
14069         return val && {}.toString.call(val) === "[object Function]";
14070       }
14071       function isObject3(val) {
14072         return val && {}.toString.call(val) === "[object Object]";
14073       }
14074     }
14075   });
14076
14077   // node_modules/store/src/store-engine.js
14078   var require_store_engine = __commonJS({
14079     "node_modules/store/src/store-engine.js"(exports2, module2) {
14080       var util = require_util();
14081       var slice = util.slice;
14082       var pluck = util.pluck;
14083       var each = util.each;
14084       var bind = util.bind;
14085       var create2 = util.create;
14086       var isList = util.isList;
14087       var isFunction2 = util.isFunction;
14088       var isObject3 = util.isObject;
14089       module2.exports = {
14090         createStore
14091       };
14092       var storeAPI = {
14093         version: "2.0.12",
14094         enabled: false,
14095         // get returns the value of the given key. If that value
14096         // is undefined, it returns optionalDefaultValue instead.
14097         get: function(key, optionalDefaultValue) {
14098           var data = this.storage.read(this._namespacePrefix + key);
14099           return this._deserialize(data, optionalDefaultValue);
14100         },
14101         // set will store the given value at key and returns value.
14102         // Calling set with value === undefined is equivalent to calling remove.
14103         set: function(key, value) {
14104           if (value === void 0) {
14105             return this.remove(key);
14106           }
14107           this.storage.write(this._namespacePrefix + key, this._serialize(value));
14108           return value;
14109         },
14110         // remove deletes the key and value stored at the given key.
14111         remove: function(key) {
14112           this.storage.remove(this._namespacePrefix + key);
14113         },
14114         // each will call the given callback once for each key-value pair
14115         // in this store.
14116         each: function(callback) {
14117           var self2 = this;
14118           this.storage.each(function(val, namespacedKey) {
14119             callback.call(self2, self2._deserialize(val), (namespacedKey || "").replace(self2._namespaceRegexp, ""));
14120           });
14121         },
14122         // clearAll will remove all the stored key-value pairs in this store.
14123         clearAll: function() {
14124           this.storage.clearAll();
14125         },
14126         // additional functionality that can't live in plugins
14127         // ---------------------------------------------------
14128         // hasNamespace returns true if this store instance has the given namespace.
14129         hasNamespace: function(namespace) {
14130           return this._namespacePrefix == "__storejs_" + namespace + "_";
14131         },
14132         // createStore creates a store.js instance with the first
14133         // functioning storage in the list of storage candidates,
14134         // and applies the the given mixins to the instance.
14135         createStore: function() {
14136           return createStore.apply(this, arguments);
14137         },
14138         addPlugin: function(plugin) {
14139           this._addPlugin(plugin);
14140         },
14141         namespace: function(namespace) {
14142           return createStore(this.storage, this.plugins, namespace);
14143         }
14144       };
14145       function _warn() {
14146         var _console = typeof console == "undefined" ? null : console;
14147         if (!_console) {
14148           return;
14149         }
14150         var fn = _console.warn ? _console.warn : _console.log;
14151         fn.apply(_console, arguments);
14152       }
14153       function createStore(storages, plugins, namespace) {
14154         if (!namespace) {
14155           namespace = "";
14156         }
14157         if (storages && !isList(storages)) {
14158           storages = [storages];
14159         }
14160         if (plugins && !isList(plugins)) {
14161           plugins = [plugins];
14162         }
14163         var namespacePrefix = namespace ? "__storejs_" + namespace + "_" : "";
14164         var namespaceRegexp = namespace ? new RegExp("^" + namespacePrefix) : null;
14165         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/;
14166         if (!legalNamespaces.test(namespace)) {
14167           throw new Error("store.js namespaces can only have alphanumerics + underscores and dashes");
14168         }
14169         var _privateStoreProps = {
14170           _namespacePrefix: namespacePrefix,
14171           _namespaceRegexp: namespaceRegexp,
14172           _testStorage: function(storage) {
14173             try {
14174               var testStr = "__storejs__test__";
14175               storage.write(testStr, testStr);
14176               var ok = storage.read(testStr) === testStr;
14177               storage.remove(testStr);
14178               return ok;
14179             } catch (e) {
14180               return false;
14181             }
14182           },
14183           _assignPluginFnProp: function(pluginFnProp, propName) {
14184             var oldFn = this[propName];
14185             this[propName] = function pluginFn() {
14186               var args = slice(arguments, 0);
14187               var self2 = this;
14188               function super_fn() {
14189                 if (!oldFn) {
14190                   return;
14191                 }
14192                 each(arguments, function(arg, i2) {
14193                   args[i2] = arg;
14194                 });
14195                 return oldFn.apply(self2, args);
14196               }
14197               var newFnArgs = [super_fn].concat(args);
14198               return pluginFnProp.apply(self2, newFnArgs);
14199             };
14200           },
14201           _serialize: function(obj) {
14202             return JSON.stringify(obj);
14203           },
14204           _deserialize: function(strVal, defaultVal) {
14205             if (!strVal) {
14206               return defaultVal;
14207             }
14208             var val = "";
14209             try {
14210               val = JSON.parse(strVal);
14211             } catch (e) {
14212               val = strVal;
14213             }
14214             return val !== void 0 ? val : defaultVal;
14215           },
14216           _addStorage: function(storage) {
14217             if (this.enabled) {
14218               return;
14219             }
14220             if (this._testStorage(storage)) {
14221               this.storage = storage;
14222               this.enabled = true;
14223             }
14224           },
14225           _addPlugin: function(plugin) {
14226             var self2 = this;
14227             if (isList(plugin)) {
14228               each(plugin, function(plugin2) {
14229                 self2._addPlugin(plugin2);
14230               });
14231               return;
14232             }
14233             var seenPlugin = pluck(this.plugins, function(seenPlugin2) {
14234               return plugin === seenPlugin2;
14235             });
14236             if (seenPlugin) {
14237               return;
14238             }
14239             this.plugins.push(plugin);
14240             if (!isFunction2(plugin)) {
14241               throw new Error("Plugins must be function values that return objects");
14242             }
14243             var pluginProperties = plugin.call(this);
14244             if (!isObject3(pluginProperties)) {
14245               throw new Error("Plugins must return an object of function properties");
14246             }
14247             each(pluginProperties, function(pluginFnProp, propName) {
14248               if (!isFunction2(pluginFnProp)) {
14249                 throw new Error("Bad plugin property: " + propName + " from plugin " + plugin.name + ". Plugins should only return functions.");
14250               }
14251               self2._assignPluginFnProp(pluginFnProp, propName);
14252             });
14253           },
14254           // Put deprecated properties in the private API, so as to not expose it to accidential
14255           // discovery through inspection of the store object.
14256           // Deprecated: addStorage
14257           addStorage: function(storage) {
14258             _warn("store.addStorage(storage) is deprecated. Use createStore([storages])");
14259             this._addStorage(storage);
14260           }
14261         };
14262         var store2 = create2(_privateStoreProps, storeAPI, {
14263           plugins: []
14264         });
14265         store2.raw = {};
14266         each(store2, function(prop, propName) {
14267           if (isFunction2(prop)) {
14268             store2.raw[propName] = bind(store2, prop);
14269           }
14270         });
14271         each(storages, function(storage) {
14272           store2._addStorage(storage);
14273         });
14274         each(plugins, function(plugin) {
14275           store2._addPlugin(plugin);
14276         });
14277         return store2;
14278       }
14279     }
14280   });
14281
14282   // node_modules/store/storages/localStorage.js
14283   var require_localStorage = __commonJS({
14284     "node_modules/store/storages/localStorage.js"(exports2, module2) {
14285       var util = require_util();
14286       var Global = util.Global;
14287       module2.exports = {
14288         name: "localStorage",
14289         read,
14290         write,
14291         each,
14292         remove: remove2,
14293         clearAll
14294       };
14295       function localStorage2() {
14296         return Global.localStorage;
14297       }
14298       function read(key) {
14299         return localStorage2().getItem(key);
14300       }
14301       function write(key, data) {
14302         return localStorage2().setItem(key, data);
14303       }
14304       function each(fn) {
14305         for (var i2 = localStorage2().length - 1; i2 >= 0; i2--) {
14306           var key = localStorage2().key(i2);
14307           fn(read(key), key);
14308         }
14309       }
14310       function remove2(key) {
14311         return localStorage2().removeItem(key);
14312       }
14313       function clearAll() {
14314         return localStorage2().clear();
14315       }
14316     }
14317   });
14318
14319   // node_modules/store/storages/oldFF-globalStorage.js
14320   var require_oldFF_globalStorage = __commonJS({
14321     "node_modules/store/storages/oldFF-globalStorage.js"(exports2, module2) {
14322       var util = require_util();
14323       var Global = util.Global;
14324       module2.exports = {
14325         name: "oldFF-globalStorage",
14326         read,
14327         write,
14328         each,
14329         remove: remove2,
14330         clearAll
14331       };
14332       var globalStorage = Global.globalStorage;
14333       function read(key) {
14334         return globalStorage[key];
14335       }
14336       function write(key, data) {
14337         globalStorage[key] = data;
14338       }
14339       function each(fn) {
14340         for (var i2 = globalStorage.length - 1; i2 >= 0; i2--) {
14341           var key = globalStorage.key(i2);
14342           fn(globalStorage[key], key);
14343         }
14344       }
14345       function remove2(key) {
14346         return globalStorage.removeItem(key);
14347       }
14348       function clearAll() {
14349         each(function(key, _) {
14350           delete globalStorage[key];
14351         });
14352       }
14353     }
14354   });
14355
14356   // node_modules/store/storages/oldIE-userDataStorage.js
14357   var require_oldIE_userDataStorage = __commonJS({
14358     "node_modules/store/storages/oldIE-userDataStorage.js"(exports2, module2) {
14359       var util = require_util();
14360       var Global = util.Global;
14361       module2.exports = {
14362         name: "oldIE-userDataStorage",
14363         write,
14364         read,
14365         each,
14366         remove: remove2,
14367         clearAll
14368       };
14369       var storageName = "storejs";
14370       var doc = Global.document;
14371       var _withStorageEl = _makeIEStorageElFunction();
14372       var disable = (Global.navigator ? Global.navigator.userAgent : "").match(/ (MSIE 8|MSIE 9|MSIE 10)\./);
14373       function write(unfixedKey, data) {
14374         if (disable) {
14375           return;
14376         }
14377         var fixedKey = fixKey(unfixedKey);
14378         _withStorageEl(function(storageEl) {
14379           storageEl.setAttribute(fixedKey, data);
14380           storageEl.save(storageName);
14381         });
14382       }
14383       function read(unfixedKey) {
14384         if (disable) {
14385           return;
14386         }
14387         var fixedKey = fixKey(unfixedKey);
14388         var res = null;
14389         _withStorageEl(function(storageEl) {
14390           res = storageEl.getAttribute(fixedKey);
14391         });
14392         return res;
14393       }
14394       function each(callback) {
14395         _withStorageEl(function(storageEl) {
14396           var attributes = storageEl.XMLDocument.documentElement.attributes;
14397           for (var i2 = attributes.length - 1; i2 >= 0; i2--) {
14398             var attr = attributes[i2];
14399             callback(storageEl.getAttribute(attr.name), attr.name);
14400           }
14401         });
14402       }
14403       function remove2(unfixedKey) {
14404         var fixedKey = fixKey(unfixedKey);
14405         _withStorageEl(function(storageEl) {
14406           storageEl.removeAttribute(fixedKey);
14407           storageEl.save(storageName);
14408         });
14409       }
14410       function clearAll() {
14411         _withStorageEl(function(storageEl) {
14412           var attributes = storageEl.XMLDocument.documentElement.attributes;
14413           storageEl.load(storageName);
14414           for (var i2 = attributes.length - 1; i2 >= 0; i2--) {
14415             storageEl.removeAttribute(attributes[i2].name);
14416           }
14417           storageEl.save(storageName);
14418         });
14419       }
14420       var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
14421       function fixKey(key) {
14422         return key.replace(/^\d/, "___$&").replace(forbiddenCharsRegex, "___");
14423       }
14424       function _makeIEStorageElFunction() {
14425         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
14426           return null;
14427         }
14428         var scriptTag = "script", storageOwner, storageContainer, storageEl;
14429         try {
14430           storageContainer = new ActiveXObject("htmlfile");
14431           storageContainer.open();
14432           storageContainer.write("<" + scriptTag + ">document.w=window</" + scriptTag + '><iframe src="/favicon.ico"></iframe>');
14433           storageContainer.close();
14434           storageOwner = storageContainer.w.frames[0].document;
14435           storageEl = storageOwner.createElement("div");
14436         } catch (e) {
14437           storageEl = doc.createElement("div");
14438           storageOwner = doc.body;
14439         }
14440         return function(storeFunction) {
14441           var args = [].slice.call(arguments, 0);
14442           args.unshift(storageEl);
14443           storageOwner.appendChild(storageEl);
14444           storageEl.addBehavior("#default#userData");
14445           storageEl.load(storageName);
14446           storeFunction.apply(this, args);
14447           storageOwner.removeChild(storageEl);
14448           return;
14449         };
14450       }
14451     }
14452   });
14453
14454   // node_modules/store/storages/cookieStorage.js
14455   var require_cookieStorage = __commonJS({
14456     "node_modules/store/storages/cookieStorage.js"(exports2, module2) {
14457       var util = require_util();
14458       var Global = util.Global;
14459       var trim = util.trim;
14460       module2.exports = {
14461         name: "cookieStorage",
14462         read,
14463         write,
14464         each,
14465         remove: remove2,
14466         clearAll
14467       };
14468       var doc = Global.document;
14469       function read(key) {
14470         if (!key || !_has(key)) {
14471           return null;
14472         }
14473         var regexpStr = "(?:^|.*;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
14474         return unescape(doc.cookie.replace(new RegExp(regexpStr), "$1"));
14475       }
14476       function each(callback) {
14477         var cookies = doc.cookie.split(/; ?/g);
14478         for (var i2 = cookies.length - 1; i2 >= 0; i2--) {
14479           if (!trim(cookies[i2])) {
14480             continue;
14481           }
14482           var kvp = cookies[i2].split("=");
14483           var key = unescape(kvp[0]);
14484           var val = unescape(kvp[1]);
14485           callback(val, key);
14486         }
14487       }
14488       function write(key, data) {
14489         if (!key) {
14490           return;
14491         }
14492         doc.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
14493       }
14494       function remove2(key) {
14495         if (!key || !_has(key)) {
14496           return;
14497         }
14498         doc.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
14499       }
14500       function clearAll() {
14501         each(function(_, key) {
14502           remove2(key);
14503         });
14504       }
14505       function _has(key) {
14506         return new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(doc.cookie);
14507       }
14508     }
14509   });
14510
14511   // node_modules/store/storages/sessionStorage.js
14512   var require_sessionStorage = __commonJS({
14513     "node_modules/store/storages/sessionStorage.js"(exports2, module2) {
14514       var util = require_util();
14515       var Global = util.Global;
14516       module2.exports = {
14517         name: "sessionStorage",
14518         read,
14519         write,
14520         each,
14521         remove: remove2,
14522         clearAll
14523       };
14524       function sessionStorage() {
14525         return Global.sessionStorage;
14526       }
14527       function read(key) {
14528         return sessionStorage().getItem(key);
14529       }
14530       function write(key, data) {
14531         return sessionStorage().setItem(key, data);
14532       }
14533       function each(fn) {
14534         for (var i2 = sessionStorage().length - 1; i2 >= 0; i2--) {
14535           var key = sessionStorage().key(i2);
14536           fn(read(key), key);
14537         }
14538       }
14539       function remove2(key) {
14540         return sessionStorage().removeItem(key);
14541       }
14542       function clearAll() {
14543         return sessionStorage().clear();
14544       }
14545     }
14546   });
14547
14548   // node_modules/store/storages/memoryStorage.js
14549   var require_memoryStorage = __commonJS({
14550     "node_modules/store/storages/memoryStorage.js"(exports2, module2) {
14551       module2.exports = {
14552         name: "memoryStorage",
14553         read,
14554         write,
14555         each,
14556         remove: remove2,
14557         clearAll
14558       };
14559       var memoryStorage = {};
14560       function read(key) {
14561         return memoryStorage[key];
14562       }
14563       function write(key, data) {
14564         memoryStorage[key] = data;
14565       }
14566       function each(callback) {
14567         for (var key in memoryStorage) {
14568           if (memoryStorage.hasOwnProperty(key)) {
14569             callback(memoryStorage[key], key);
14570           }
14571         }
14572       }
14573       function remove2(key) {
14574         delete memoryStorage[key];
14575       }
14576       function clearAll(key) {
14577         memoryStorage = {};
14578       }
14579     }
14580   });
14581
14582   // node_modules/store/storages/all.js
14583   var require_all = __commonJS({
14584     "node_modules/store/storages/all.js"(exports2, module2) {
14585       module2.exports = [
14586         // Listed in order of usage preference
14587         require_localStorage(),
14588         require_oldFF_globalStorage(),
14589         require_oldIE_userDataStorage(),
14590         require_cookieStorage(),
14591         require_sessionStorage(),
14592         require_memoryStorage()
14593       ];
14594     }
14595   });
14596
14597   // node_modules/store/plugins/lib/json2.js
14598   var require_json2 = __commonJS({
14599     "node_modules/store/plugins/lib/json2.js"(exports, module) {
14600       if (typeof JSON !== "object") {
14601         JSON = {};
14602       }
14603       (function() {
14604         "use strict";
14605         var rx_one = /^[\],:{}\s]*$/;
14606         var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
14607         var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
14608         var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
14609         var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
14610         var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
14611         function f(n2) {
14612           return n2 < 10 ? "0" + n2 : n2;
14613         }
14614         function this_value() {
14615           return this.valueOf();
14616         }
14617         if (typeof Date.prototype.toJSON !== "function") {
14618           Date.prototype.toJSON = function() {
14619             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;
14620           };
14621           Boolean.prototype.toJSON = this_value;
14622           Number.prototype.toJSON = this_value;
14623           String.prototype.toJSON = this_value;
14624         }
14625         var gap;
14626         var indent;
14627         var meta;
14628         var rep;
14629         function quote(string) {
14630           rx_escapable.lastIndex = 0;
14631           return rx_escapable.test(string) ? '"' + string.replace(rx_escapable, function(a) {
14632             var c = meta[a];
14633             return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
14634           }) + '"' : '"' + string + '"';
14635         }
14636         function str(key, holder) {
14637           var i2;
14638           var k;
14639           var v;
14640           var length;
14641           var mind = gap;
14642           var partial;
14643           var value = holder[key];
14644           if (value && typeof value === "object" && typeof value.toJSON === "function") {
14645             value = value.toJSON(key);
14646           }
14647           if (typeof rep === "function") {
14648             value = rep.call(holder, key, value);
14649           }
14650           switch (typeof value) {
14651             case "string":
14652               return quote(value);
14653             case "number":
14654               return isFinite(value) ? String(value) : "null";
14655             case "boolean":
14656             case "null":
14657               return String(value);
14658             case "object":
14659               if (!value) {
14660                 return "null";
14661               }
14662               gap += indent;
14663               partial = [];
14664               if (Object.prototype.toString.apply(value) === "[object Array]") {
14665                 length = value.length;
14666                 for (i2 = 0; i2 < length; i2 += 1) {
14667                   partial[i2] = str(i2, value) || "null";
14668                 }
14669                 v = partial.length === 0 ? "[]" : gap ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" : "[" + partial.join(",") + "]";
14670                 gap = mind;
14671                 return v;
14672               }
14673               if (rep && typeof rep === "object") {
14674                 length = rep.length;
14675                 for (i2 = 0; i2 < length; i2 += 1) {
14676                   if (typeof rep[i2] === "string") {
14677                     k = rep[i2];
14678                     v = str(k, value);
14679                     if (v) {
14680                       partial.push(quote(k) + (gap ? ": " : ":") + v);
14681                     }
14682                   }
14683                 }
14684               } else {
14685                 for (k in value) {
14686                   if (Object.prototype.hasOwnProperty.call(value, k)) {
14687                     v = str(k, value);
14688                     if (v) {
14689                       partial.push(quote(k) + (gap ? ": " : ":") + v);
14690                     }
14691                   }
14692                 }
14693               }
14694               v = partial.length === 0 ? "{}" : gap ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" : "{" + partial.join(",") + "}";
14695               gap = mind;
14696               return v;
14697           }
14698         }
14699         if (typeof JSON.stringify !== "function") {
14700           meta = {
14701             // table of character substitutions
14702             "\b": "\\b",
14703             "   ": "\\t",
14704             "\n": "\\n",
14705             "\f": "\\f",
14706             "\r": "\\r",
14707             '"': '\\"',
14708             "\\": "\\\\"
14709           };
14710           JSON.stringify = function(value, replacer, space) {
14711             var i2;
14712             gap = "";
14713             indent = "";
14714             if (typeof space === "number") {
14715               for (i2 = 0; i2 < space; i2 += 1) {
14716                 indent += " ";
14717               }
14718             } else if (typeof space === "string") {
14719               indent = space;
14720             }
14721             rep = replacer;
14722             if (replacer && typeof replacer !== "function" && (typeof replacer !== "object" || typeof replacer.length !== "number")) {
14723               throw new Error("JSON.stringify");
14724             }
14725             return str("", { "": value });
14726           };
14727         }
14728         if (typeof JSON.parse !== "function") {
14729           JSON.parse = function(text, reviver) {
14730             var j;
14731             function walk(holder, key) {
14732               var k;
14733               var v;
14734               var value = holder[key];
14735               if (value && typeof value === "object") {
14736                 for (k in value) {
14737                   if (Object.prototype.hasOwnProperty.call(value, k)) {
14738                     v = walk(value, k);
14739                     if (v !== void 0) {
14740                       value[k] = v;
14741                     } else {
14742                       delete value[k];
14743                     }
14744                   }
14745                 }
14746               }
14747               return reviver.call(holder, key, value);
14748             }
14749             text = String(text);
14750             rx_dangerous.lastIndex = 0;
14751             if (rx_dangerous.test(text)) {
14752               text = text.replace(rx_dangerous, function(a) {
14753                 return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
14754               });
14755             }
14756             if (rx_one.test(
14757               text.replace(rx_two, "@").replace(rx_three, "]").replace(rx_four, "")
14758             )) {
14759               j = eval("(" + text + ")");
14760               return typeof reviver === "function" ? walk({ "": j }, "") : j;
14761             }
14762             throw new SyntaxError("JSON.parse");
14763           };
14764         }
14765       })();
14766     }
14767   });
14768
14769   // node_modules/store/plugins/json2.js
14770   var require_json22 = __commonJS({
14771     "node_modules/store/plugins/json2.js"(exports2, module2) {
14772       module2.exports = json2Plugin;
14773       function json2Plugin() {
14774         require_json2();
14775         return {};
14776       }
14777     }
14778   });
14779
14780   // node_modules/store/dist/store.legacy.js
14781   var require_store_legacy = __commonJS({
14782     "node_modules/store/dist/store.legacy.js"(exports2, module2) {
14783       var engine = require_store_engine();
14784       var storages = require_all();
14785       var plugins = [require_json22()];
14786       module2.exports = engine.createStore(storages, plugins);
14787     }
14788   });
14789
14790   // node_modules/whatwg-fetch/fetch.js
14791   var global2 = typeof globalThis !== "undefined" && globalThis || typeof self !== "undefined" && self || typeof global2 !== "undefined" && global2;
14792   var support = {
14793     searchParams: "URLSearchParams" in global2,
14794     iterable: "Symbol" in global2 && "iterator" in Symbol,
14795     blob: "FileReader" in global2 && "Blob" in global2 && function() {
14796       try {
14797         new Blob();
14798         return true;
14799       } catch (e) {
14800         return false;
14801       }
14802     }(),
14803     formData: "FormData" in global2,
14804     arrayBuffer: "ArrayBuffer" in global2
14805   };
14806   function isDataView(obj) {
14807     return obj && DataView.prototype.isPrototypeOf(obj);
14808   }
14809   if (support.arrayBuffer) {
14810     viewClasses = [
14811       "[object Int8Array]",
14812       "[object Uint8Array]",
14813       "[object Uint8ClampedArray]",
14814       "[object Int16Array]",
14815       "[object Uint16Array]",
14816       "[object Int32Array]",
14817       "[object Uint32Array]",
14818       "[object Float32Array]",
14819       "[object Float64Array]"
14820     ];
14821     isArrayBufferView = ArrayBuffer.isView || function(obj) {
14822       return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
14823     };
14824   }
14825   var viewClasses;
14826   var isArrayBufferView;
14827   function normalizeName(name) {
14828     if (typeof name !== "string") {
14829       name = String(name);
14830     }
14831     if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === "") {
14832       throw new TypeError('Invalid character in header field name: "' + name + '"');
14833     }
14834     return name.toLowerCase();
14835   }
14836   function normalizeValue(value) {
14837     if (typeof value !== "string") {
14838       value = String(value);
14839     }
14840     return value;
14841   }
14842   function iteratorFor(items) {
14843     var iterator = {
14844       next: function() {
14845         var value = items.shift();
14846         return { done: value === void 0, value };
14847       }
14848     };
14849     if (support.iterable) {
14850       iterator[Symbol.iterator] = function() {
14851         return iterator;
14852       };
14853     }
14854     return iterator;
14855   }
14856   function Headers(headers) {
14857     this.map = {};
14858     if (headers instanceof Headers) {
14859       headers.forEach(function(value, name) {
14860         this.append(name, value);
14861       }, this);
14862     } else if (Array.isArray(headers)) {
14863       headers.forEach(function(header) {
14864         this.append(header[0], header[1]);
14865       }, this);
14866     } else if (headers) {
14867       Object.getOwnPropertyNames(headers).forEach(function(name) {
14868         this.append(name, headers[name]);
14869       }, this);
14870     }
14871   }
14872   Headers.prototype.append = function(name, value) {
14873     name = normalizeName(name);
14874     value = normalizeValue(value);
14875     var oldValue = this.map[name];
14876     this.map[name] = oldValue ? oldValue + ", " + value : value;
14877   };
14878   Headers.prototype["delete"] = function(name) {
14879     delete this.map[normalizeName(name)];
14880   };
14881   Headers.prototype.get = function(name) {
14882     name = normalizeName(name);
14883     return this.has(name) ? this.map[name] : null;
14884   };
14885   Headers.prototype.has = function(name) {
14886     return this.map.hasOwnProperty(normalizeName(name));
14887   };
14888   Headers.prototype.set = function(name, value) {
14889     this.map[normalizeName(name)] = normalizeValue(value);
14890   };
14891   Headers.prototype.forEach = function(callback, thisArg) {
14892     for (var name in this.map) {
14893       if (this.map.hasOwnProperty(name)) {
14894         callback.call(thisArg, this.map[name], name, this);
14895       }
14896     }
14897   };
14898   Headers.prototype.keys = function() {
14899     var items = [];
14900     this.forEach(function(value, name) {
14901       items.push(name);
14902     });
14903     return iteratorFor(items);
14904   };
14905   Headers.prototype.values = function() {
14906     var items = [];
14907     this.forEach(function(value) {
14908       items.push(value);
14909     });
14910     return iteratorFor(items);
14911   };
14912   Headers.prototype.entries = function() {
14913     var items = [];
14914     this.forEach(function(value, name) {
14915       items.push([name, value]);
14916     });
14917     return iteratorFor(items);
14918   };
14919   if (support.iterable) {
14920     Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
14921   }
14922   function consumed(body) {
14923     if (body.bodyUsed) {
14924       return Promise.reject(new TypeError("Already read"));
14925     }
14926     body.bodyUsed = true;
14927   }
14928   function fileReaderReady(reader) {
14929     return new Promise(function(resolve, reject) {
14930       reader.onload = function() {
14931         resolve(reader.result);
14932       };
14933       reader.onerror = function() {
14934         reject(reader.error);
14935       };
14936     });
14937   }
14938   function readBlobAsArrayBuffer(blob) {
14939     var reader = new FileReader();
14940     var promise = fileReaderReady(reader);
14941     reader.readAsArrayBuffer(blob);
14942     return promise;
14943   }
14944   function readBlobAsText(blob) {
14945     var reader = new FileReader();
14946     var promise = fileReaderReady(reader);
14947     reader.readAsText(blob);
14948     return promise;
14949   }
14950   function readArrayBufferAsText(buf) {
14951     var view = new Uint8Array(buf);
14952     var chars = new Array(view.length);
14953     for (var i2 = 0; i2 < view.length; i2++) {
14954       chars[i2] = String.fromCharCode(view[i2]);
14955     }
14956     return chars.join("");
14957   }
14958   function bufferClone(buf) {
14959     if (buf.slice) {
14960       return buf.slice(0);
14961     } else {
14962       var view = new Uint8Array(buf.byteLength);
14963       view.set(new Uint8Array(buf));
14964       return view.buffer;
14965     }
14966   }
14967   function Body() {
14968     this.bodyUsed = false;
14969     this._initBody = function(body) {
14970       this.bodyUsed = this.bodyUsed;
14971       this._bodyInit = body;
14972       if (!body) {
14973         this._bodyText = "";
14974       } else if (typeof body === "string") {
14975         this._bodyText = body;
14976       } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
14977         this._bodyBlob = body;
14978       } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
14979         this._bodyFormData = body;
14980       } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
14981         this._bodyText = body.toString();
14982       } else if (support.arrayBuffer && support.blob && isDataView(body)) {
14983         this._bodyArrayBuffer = bufferClone(body.buffer);
14984         this._bodyInit = new Blob([this._bodyArrayBuffer]);
14985       } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
14986         this._bodyArrayBuffer = bufferClone(body);
14987       } else {
14988         this._bodyText = body = Object.prototype.toString.call(body);
14989       }
14990       if (!this.headers.get("content-type")) {
14991         if (typeof body === "string") {
14992           this.headers.set("content-type", "text/plain;charset=UTF-8");
14993         } else if (this._bodyBlob && this._bodyBlob.type) {
14994           this.headers.set("content-type", this._bodyBlob.type);
14995         } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
14996           this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
14997         }
14998       }
14999     };
15000     if (support.blob) {
15001       this.blob = function() {
15002         var rejected = consumed(this);
15003         if (rejected) {
15004           return rejected;
15005         }
15006         if (this._bodyBlob) {
15007           return Promise.resolve(this._bodyBlob);
15008         } else if (this._bodyArrayBuffer) {
15009           return Promise.resolve(new Blob([this._bodyArrayBuffer]));
15010         } else if (this._bodyFormData) {
15011           throw new Error("could not read FormData body as blob");
15012         } else {
15013           return Promise.resolve(new Blob([this._bodyText]));
15014         }
15015       };
15016       this.arrayBuffer = function() {
15017         if (this._bodyArrayBuffer) {
15018           var isConsumed = consumed(this);
15019           if (isConsumed) {
15020             return isConsumed;
15021           }
15022           if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
15023             return Promise.resolve(
15024               this._bodyArrayBuffer.buffer.slice(
15025                 this._bodyArrayBuffer.byteOffset,
15026                 this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength
15027               )
15028             );
15029           } else {
15030             return Promise.resolve(this._bodyArrayBuffer);
15031           }
15032         } else {
15033           return this.blob().then(readBlobAsArrayBuffer);
15034         }
15035       };
15036     }
15037     this.text = function() {
15038       var rejected = consumed(this);
15039       if (rejected) {
15040         return rejected;
15041       }
15042       if (this._bodyBlob) {
15043         return readBlobAsText(this._bodyBlob);
15044       } else if (this._bodyArrayBuffer) {
15045         return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
15046       } else if (this._bodyFormData) {
15047         throw new Error("could not read FormData body as text");
15048       } else {
15049         return Promise.resolve(this._bodyText);
15050       }
15051     };
15052     if (support.formData) {
15053       this.formData = function() {
15054         return this.text().then(decode);
15055       };
15056     }
15057     this.json = function() {
15058       return this.text().then(JSON.parse);
15059     };
15060     return this;
15061   }
15062   var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
15063   function normalizeMethod(method) {
15064     var upcased = method.toUpperCase();
15065     return methods.indexOf(upcased) > -1 ? upcased : method;
15066   }
15067   function Request(input, options2) {
15068     if (!(this instanceof Request)) {
15069       throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
15070     }
15071     options2 = options2 || {};
15072     var body = options2.body;
15073     if (input instanceof Request) {
15074       if (input.bodyUsed) {
15075         throw new TypeError("Already read");
15076       }
15077       this.url = input.url;
15078       this.credentials = input.credentials;
15079       if (!options2.headers) {
15080         this.headers = new Headers(input.headers);
15081       }
15082       this.method = input.method;
15083       this.mode = input.mode;
15084       this.signal = input.signal;
15085       if (!body && input._bodyInit != null) {
15086         body = input._bodyInit;
15087         input.bodyUsed = true;
15088       }
15089     } else {
15090       this.url = String(input);
15091     }
15092     this.credentials = options2.credentials || this.credentials || "same-origin";
15093     if (options2.headers || !this.headers) {
15094       this.headers = new Headers(options2.headers);
15095     }
15096     this.method = normalizeMethod(options2.method || this.method || "GET");
15097     this.mode = options2.mode || this.mode || null;
15098     this.signal = options2.signal || this.signal;
15099     this.referrer = null;
15100     if ((this.method === "GET" || this.method === "HEAD") && body) {
15101       throw new TypeError("Body not allowed for GET or HEAD requests");
15102     }
15103     this._initBody(body);
15104     if (this.method === "GET" || this.method === "HEAD") {
15105       if (options2.cache === "no-store" || options2.cache === "no-cache") {
15106         var reParamSearch = /([?&])_=[^&]*/;
15107         if (reParamSearch.test(this.url)) {
15108           this.url = this.url.replace(reParamSearch, "$1_=" + (/* @__PURE__ */ new Date()).getTime());
15109         } else {
15110           var reQueryString = /\?/;
15111           this.url += (reQueryString.test(this.url) ? "&" : "?") + "_=" + (/* @__PURE__ */ new Date()).getTime();
15112         }
15113       }
15114     }
15115   }
15116   Request.prototype.clone = function() {
15117     return new Request(this, { body: this._bodyInit });
15118   };
15119   function decode(body) {
15120     var form = new FormData();
15121     body.trim().split("&").forEach(function(bytes) {
15122       if (bytes) {
15123         var split = bytes.split("=");
15124         var name = split.shift().replace(/\+/g, " ");
15125         var value = split.join("=").replace(/\+/g, " ");
15126         form.append(decodeURIComponent(name), decodeURIComponent(value));
15127       }
15128     });
15129     return form;
15130   }
15131   function parseHeaders(rawHeaders) {
15132     var headers = new Headers();
15133     var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, " ");
15134     preProcessedHeaders.split("\r").map(function(header) {
15135       return header.indexOf("\n") === 0 ? header.substr(1, header.length) : header;
15136     }).forEach(function(line) {
15137       var parts = line.split(":");
15138       var key = parts.shift().trim();
15139       if (key) {
15140         var value = parts.join(":").trim();
15141         headers.append(key, value);
15142       }
15143     });
15144     return headers;
15145   }
15146   Body.call(Request.prototype);
15147   function Response(bodyInit, options2) {
15148     if (!(this instanceof Response)) {
15149       throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
15150     }
15151     if (!options2) {
15152       options2 = {};
15153     }
15154     this.type = "default";
15155     this.status = options2.status === void 0 ? 200 : options2.status;
15156     this.ok = this.status >= 200 && this.status < 300;
15157     this.statusText = options2.statusText === void 0 ? "" : "" + options2.statusText;
15158     this.headers = new Headers(options2.headers);
15159     this.url = options2.url || "";
15160     this._initBody(bodyInit);
15161   }
15162   Body.call(Response.prototype);
15163   Response.prototype.clone = function() {
15164     return new Response(this._bodyInit, {
15165       status: this.status,
15166       statusText: this.statusText,
15167       headers: new Headers(this.headers),
15168       url: this.url
15169     });
15170   };
15171   Response.error = function() {
15172     var response = new Response(null, { status: 0, statusText: "" });
15173     response.type = "error";
15174     return response;
15175   };
15176   var redirectStatuses = [301, 302, 303, 307, 308];
15177   Response.redirect = function(url, status) {
15178     if (redirectStatuses.indexOf(status) === -1) {
15179       throw new RangeError("Invalid status code");
15180     }
15181     return new Response(null, { status, headers: { location: url } });
15182   };
15183   var DOMException2 = global2.DOMException;
15184   try {
15185     new DOMException2();
15186   } catch (err) {
15187     DOMException2 = function(message, name) {
15188       this.message = message;
15189       this.name = name;
15190       var error = Error(message);
15191       this.stack = error.stack;
15192     };
15193     DOMException2.prototype = Object.create(Error.prototype);
15194     DOMException2.prototype.constructor = DOMException2;
15195   }
15196   function fetch2(input, init2) {
15197     return new Promise(function(resolve, reject) {
15198       var request3 = new Request(input, init2);
15199       if (request3.signal && request3.signal.aborted) {
15200         return reject(new DOMException2("Aborted", "AbortError"));
15201       }
15202       var xhr = new XMLHttpRequest();
15203       function abortXhr() {
15204         xhr.abort();
15205       }
15206       xhr.onload = function() {
15207         var options2 = {
15208           status: xhr.status,
15209           statusText: xhr.statusText,
15210           headers: parseHeaders(xhr.getAllResponseHeaders() || "")
15211         };
15212         options2.url = "responseURL" in xhr ? xhr.responseURL : options2.headers.get("X-Request-URL");
15213         var body = "response" in xhr ? xhr.response : xhr.responseText;
15214         setTimeout(function() {
15215           resolve(new Response(body, options2));
15216         }, 0);
15217       };
15218       xhr.onerror = function() {
15219         setTimeout(function() {
15220           reject(new TypeError("Network request failed"));
15221         }, 0);
15222       };
15223       xhr.ontimeout = function() {
15224         setTimeout(function() {
15225           reject(new TypeError("Network request failed"));
15226         }, 0);
15227       };
15228       xhr.onabort = function() {
15229         setTimeout(function() {
15230           reject(new DOMException2("Aborted", "AbortError"));
15231         }, 0);
15232       };
15233       function fixUrl(url) {
15234         try {
15235           return url === "" && global2.location.href ? global2.location.href : url;
15236         } catch (e) {
15237           return url;
15238         }
15239       }
15240       xhr.open(request3.method, fixUrl(request3.url), true);
15241       if (request3.credentials === "include") {
15242         xhr.withCredentials = true;
15243       } else if (request3.credentials === "omit") {
15244         xhr.withCredentials = false;
15245       }
15246       if ("responseType" in xhr) {
15247         if (support.blob) {
15248           xhr.responseType = "blob";
15249         } else if (support.arrayBuffer && request3.headers.get("Content-Type") && request3.headers.get("Content-Type").indexOf("application/octet-stream") !== -1) {
15250           xhr.responseType = "arraybuffer";
15251         }
15252       }
15253       if (init2 && typeof init2.headers === "object" && !(init2.headers instanceof Headers)) {
15254         Object.getOwnPropertyNames(init2.headers).forEach(function(name) {
15255           xhr.setRequestHeader(name, normalizeValue(init2.headers[name]));
15256         });
15257       } else {
15258         request3.headers.forEach(function(value, name) {
15259           xhr.setRequestHeader(name, value);
15260         });
15261       }
15262       if (request3.signal) {
15263         request3.signal.addEventListener("abort", abortXhr);
15264         xhr.onreadystatechange = function() {
15265           if (xhr.readyState === 4) {
15266             request3.signal.removeEventListener("abort", abortXhr);
15267           }
15268         };
15269       }
15270       xhr.send(typeof request3._bodyInit === "undefined" ? null : request3._bodyInit);
15271     });
15272   }
15273   fetch2.polyfill = true;
15274   if (!global2.fetch) {
15275     global2.fetch = fetch2;
15276     global2.Headers = Headers;
15277     global2.Request = Request;
15278     global2.Response = Response;
15279   }
15280
15281   // node_modules/abortcontroller-polyfill/dist/polyfill-patch-fetch.js
15282   (function(factory) {
15283     typeof define === "function" && define.amd ? define(factory) : factory();
15284   })(function() {
15285     "use strict";
15286     function _classCallCheck(instance, Constructor) {
15287       if (!(instance instanceof Constructor)) {
15288         throw new TypeError("Cannot call a class as a function");
15289       }
15290     }
15291     function _defineProperties(target, props) {
15292       for (var i2 = 0; i2 < props.length; i2++) {
15293         var descriptor = props[i2];
15294         descriptor.enumerable = descriptor.enumerable || false;
15295         descriptor.configurable = true;
15296         if ("value" in descriptor)
15297           descriptor.writable = true;
15298         Object.defineProperty(target, descriptor.key, descriptor);
15299       }
15300     }
15301     function _createClass(Constructor, protoProps, staticProps) {
15302       if (protoProps)
15303         _defineProperties(Constructor.prototype, protoProps);
15304       if (staticProps)
15305         _defineProperties(Constructor, staticProps);
15306       Object.defineProperty(Constructor, "prototype", {
15307         writable: false
15308       });
15309       return Constructor;
15310     }
15311     function _inherits(subClass, superClass) {
15312       if (typeof superClass !== "function" && superClass !== null) {
15313         throw new TypeError("Super expression must either be null or a function");
15314       }
15315       subClass.prototype = Object.create(superClass && superClass.prototype, {
15316         constructor: {
15317           value: subClass,
15318           writable: true,
15319           configurable: true
15320         }
15321       });
15322       Object.defineProperty(subClass, "prototype", {
15323         writable: false
15324       });
15325       if (superClass)
15326         _setPrototypeOf(subClass, superClass);
15327     }
15328     function _getPrototypeOf(o) {
15329       _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) {
15330         return o2.__proto__ || Object.getPrototypeOf(o2);
15331       };
15332       return _getPrototypeOf(o);
15333     }
15334     function _setPrototypeOf(o, p) {
15335       _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o2, p2) {
15336         o2.__proto__ = p2;
15337         return o2;
15338       };
15339       return _setPrototypeOf(o, p);
15340     }
15341     function _isNativeReflectConstruct() {
15342       if (typeof Reflect === "undefined" || !Reflect.construct)
15343         return false;
15344       if (Reflect.construct.sham)
15345         return false;
15346       if (typeof Proxy === "function")
15347         return true;
15348       try {
15349         Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
15350         }));
15351         return true;
15352       } catch (e) {
15353         return false;
15354       }
15355     }
15356     function _assertThisInitialized(self2) {
15357       if (self2 === void 0) {
15358         throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
15359       }
15360       return self2;
15361     }
15362     function _possibleConstructorReturn(self2, call) {
15363       if (call && (typeof call === "object" || typeof call === "function")) {
15364         return call;
15365       } else if (call !== void 0) {
15366         throw new TypeError("Derived constructors may only return object or undefined");
15367       }
15368       return _assertThisInitialized(self2);
15369     }
15370     function _createSuper(Derived) {
15371       var hasNativeReflectConstruct = _isNativeReflectConstruct();
15372       return function _createSuperInternal() {
15373         var Super = _getPrototypeOf(Derived), result;
15374         if (hasNativeReflectConstruct) {
15375           var NewTarget = _getPrototypeOf(this).constructor;
15376           result = Reflect.construct(Super, arguments, NewTarget);
15377         } else {
15378           result = Super.apply(this, arguments);
15379         }
15380         return _possibleConstructorReturn(this, result);
15381       };
15382     }
15383     function _superPropBase(object, property) {
15384       while (!Object.prototype.hasOwnProperty.call(object, property)) {
15385         object = _getPrototypeOf(object);
15386         if (object === null)
15387           break;
15388       }
15389       return object;
15390     }
15391     function _get() {
15392       if (typeof Reflect !== "undefined" && Reflect.get) {
15393         _get = Reflect.get.bind();
15394       } else {
15395         _get = function _get2(target, property, receiver) {
15396           var base = _superPropBase(target, property);
15397           if (!base)
15398             return;
15399           var desc = Object.getOwnPropertyDescriptor(base, property);
15400           if (desc.get) {
15401             return desc.get.call(arguments.length < 3 ? target : receiver);
15402           }
15403           return desc.value;
15404         };
15405       }
15406       return _get.apply(this, arguments);
15407     }
15408     var Emitter = /* @__PURE__ */ function() {
15409       function Emitter2() {
15410         _classCallCheck(this, Emitter2);
15411         Object.defineProperty(this, "listeners", {
15412           value: {},
15413           writable: true,
15414           configurable: true
15415         });
15416       }
15417       _createClass(Emitter2, [{
15418         key: "addEventListener",
15419         value: function addEventListener(type2, callback, options2) {
15420           if (!(type2 in this.listeners)) {
15421             this.listeners[type2] = [];
15422           }
15423           this.listeners[type2].push({
15424             callback,
15425             options: options2
15426           });
15427         }
15428       }, {
15429         key: "removeEventListener",
15430         value: function removeEventListener(type2, callback) {
15431           if (!(type2 in this.listeners)) {
15432             return;
15433           }
15434           var stack = this.listeners[type2];
15435           for (var i2 = 0, l = stack.length; i2 < l; i2++) {
15436             if (stack[i2].callback === callback) {
15437               stack.splice(i2, 1);
15438               return;
15439             }
15440           }
15441         }
15442       }, {
15443         key: "dispatchEvent",
15444         value: function dispatchEvent2(event) {
15445           if (!(event.type in this.listeners)) {
15446             return;
15447           }
15448           var stack = this.listeners[event.type];
15449           var stackToCall = stack.slice();
15450           for (var i2 = 0, l = stackToCall.length; i2 < l; i2++) {
15451             var listener = stackToCall[i2];
15452             try {
15453               listener.callback.call(this, event);
15454             } catch (e) {
15455               Promise.resolve().then(function() {
15456                 throw e;
15457               });
15458             }
15459             if (listener.options && listener.options.once) {
15460               this.removeEventListener(event.type, listener.callback);
15461             }
15462           }
15463           return !event.defaultPrevented;
15464         }
15465       }]);
15466       return Emitter2;
15467     }();
15468     var AbortSignal = /* @__PURE__ */ function(_Emitter) {
15469       _inherits(AbortSignal2, _Emitter);
15470       var _super = _createSuper(AbortSignal2);
15471       function AbortSignal2() {
15472         var _this;
15473         _classCallCheck(this, AbortSignal2);
15474         _this = _super.call(this);
15475         if (!_this.listeners) {
15476           Emitter.call(_assertThisInitialized(_this));
15477         }
15478         Object.defineProperty(_assertThisInitialized(_this), "aborted", {
15479           value: false,
15480           writable: true,
15481           configurable: true
15482         });
15483         Object.defineProperty(_assertThisInitialized(_this), "onabort", {
15484           value: null,
15485           writable: true,
15486           configurable: true
15487         });
15488         Object.defineProperty(_assertThisInitialized(_this), "reason", {
15489           value: void 0,
15490           writable: true,
15491           configurable: true
15492         });
15493         return _this;
15494       }
15495       _createClass(AbortSignal2, [{
15496         key: "toString",
15497         value: function toString2() {
15498           return "[object AbortSignal]";
15499         }
15500       }, {
15501         key: "dispatchEvent",
15502         value: function dispatchEvent2(event) {
15503           if (event.type === "abort") {
15504             this.aborted = true;
15505             if (typeof this.onabort === "function") {
15506               this.onabort.call(this, event);
15507             }
15508           }
15509           _get(_getPrototypeOf(AbortSignal2.prototype), "dispatchEvent", this).call(this, event);
15510         }
15511       }]);
15512       return AbortSignal2;
15513     }(Emitter);
15514     var AbortController2 = /* @__PURE__ */ function() {
15515       function AbortController3() {
15516         _classCallCheck(this, AbortController3);
15517         Object.defineProperty(this, "signal", {
15518           value: new AbortSignal(),
15519           writable: true,
15520           configurable: true
15521         });
15522       }
15523       _createClass(AbortController3, [{
15524         key: "abort",
15525         value: function abort(reason) {
15526           var event;
15527           try {
15528             event = new Event("abort");
15529           } catch (e) {
15530             if (typeof document !== "undefined") {
15531               if (!document.createEvent) {
15532                 event = document.createEventObject();
15533                 event.type = "abort";
15534               } else {
15535                 event = document.createEvent("Event");
15536                 event.initEvent("abort", false, false);
15537               }
15538             } else {
15539               event = {
15540                 type: "abort",
15541                 bubbles: false,
15542                 cancelable: false
15543               };
15544             }
15545           }
15546           var signalReason = reason;
15547           if (signalReason === void 0) {
15548             if (typeof document === "undefined") {
15549               signalReason = new Error("This operation was aborted");
15550               signalReason.name = "AbortError";
15551             } else {
15552               try {
15553                 signalReason = new DOMException("signal is aborted without reason");
15554               } catch (err) {
15555                 signalReason = new Error("This operation was aborted");
15556                 signalReason.name = "AbortError";
15557               }
15558             }
15559           }
15560           this.signal.reason = signalReason;
15561           this.signal.dispatchEvent(event);
15562         }
15563       }, {
15564         key: "toString",
15565         value: function toString2() {
15566           return "[object AbortController]";
15567         }
15568       }]);
15569       return AbortController3;
15570     }();
15571     if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
15572       AbortController2.prototype[Symbol.toStringTag] = "AbortController";
15573       AbortSignal.prototype[Symbol.toStringTag] = "AbortSignal";
15574     }
15575     function polyfillNeeded(self2) {
15576       if (self2.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
15577         console.log("__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill");
15578         return true;
15579       }
15580       return typeof self2.Request === "function" && !self2.Request.prototype.hasOwnProperty("signal") || !self2.AbortController;
15581     }
15582     function abortableFetchDecorator(patchTargets) {
15583       if ("function" === typeof patchTargets) {
15584         patchTargets = {
15585           fetch: patchTargets
15586         };
15587       }
15588       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;
15589       if (!polyfillNeeded({
15590         fetch: fetch3,
15591         Request: NativeRequest,
15592         AbortController: NativeAbortController,
15593         __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
15594       })) {
15595         return {
15596           fetch: fetch3,
15597           Request: Request2
15598         };
15599       }
15600       var Request2 = NativeRequest;
15601       if (Request2 && !Request2.prototype.hasOwnProperty("signal") || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
15602         Request2 = function Request3(input, init2) {
15603           var signal;
15604           if (init2 && init2.signal) {
15605             signal = init2.signal;
15606             delete init2.signal;
15607           }
15608           var request3 = new NativeRequest(input, init2);
15609           if (signal) {
15610             Object.defineProperty(request3, "signal", {
15611               writable: false,
15612               enumerable: false,
15613               configurable: true,
15614               value: signal
15615             });
15616           }
15617           return request3;
15618         };
15619         Request2.prototype = NativeRequest.prototype;
15620       }
15621       var realFetch = fetch3;
15622       var abortableFetch = function abortableFetch2(input, init2) {
15623         var signal = Request2 && Request2.prototype.isPrototypeOf(input) ? input.signal : init2 ? init2.signal : void 0;
15624         if (signal) {
15625           var abortError;
15626           try {
15627             abortError = new DOMException("Aborted", "AbortError");
15628           } catch (err) {
15629             abortError = new Error("Aborted");
15630             abortError.name = "AbortError";
15631           }
15632           if (signal.aborted) {
15633             return Promise.reject(abortError);
15634           }
15635           var cancellation = new Promise(function(_, reject) {
15636             signal.addEventListener("abort", function() {
15637               return reject(abortError);
15638             }, {
15639               once: true
15640             });
15641           });
15642           if (init2 && init2.signal) {
15643             delete init2.signal;
15644           }
15645           return Promise.race([cancellation, realFetch(input, init2)]);
15646         }
15647         return realFetch(input, init2);
15648       };
15649       return {
15650         fetch: abortableFetch,
15651         Request: Request2
15652       };
15653     }
15654     (function(self2) {
15655       if (!polyfillNeeded(self2)) {
15656         return;
15657       }
15658       if (!self2.fetch) {
15659         console.warn("fetch() is not available, cannot install abortcontroller-polyfill");
15660         return;
15661       }
15662       var _abortableFetch = abortableFetchDecorator(self2), fetch3 = _abortableFetch.fetch, Request2 = _abortableFetch.Request;
15663       self2.fetch = fetch3;
15664       self2.Request = Request2;
15665       Object.defineProperty(self2, "AbortController", {
15666         writable: true,
15667         enumerable: false,
15668         configurable: true,
15669         value: AbortController2
15670       });
15671       Object.defineProperty(self2, "AbortSignal", {
15672         writable: true,
15673         enumerable: false,
15674         configurable: true,
15675         value: AbortSignal
15676       });
15677     })(typeof self !== "undefined" ? self : global);
15678   });
15679
15680   // modules/index.js
15681   var modules_exports = {};
15682   __export(modules_exports, {
15683     LocationManager: () => LocationManager,
15684     QAItem: () => QAItem,
15685     actionAddEntity: () => actionAddEntity,
15686     actionAddMember: () => actionAddMember,
15687     actionAddMidpoint: () => actionAddMidpoint,
15688     actionAddVertex: () => actionAddVertex,
15689     actionChangeMember: () => actionChangeMember,
15690     actionChangePreset: () => actionChangePreset,
15691     actionChangeTags: () => actionChangeTags,
15692     actionCircularize: () => actionCircularize,
15693     actionConnect: () => actionConnect,
15694     actionCopyEntities: () => actionCopyEntities,
15695     actionDeleteMember: () => actionDeleteMember,
15696     actionDeleteMultiple: () => actionDeleteMultiple,
15697     actionDeleteNode: () => actionDeleteNode,
15698     actionDeleteRelation: () => actionDeleteRelation,
15699     actionDeleteWay: () => actionDeleteWay,
15700     actionDiscardTags: () => actionDiscardTags,
15701     actionDisconnect: () => actionDisconnect,
15702     actionExtract: () => actionExtract,
15703     actionJoin: () => actionJoin,
15704     actionMerge: () => actionMerge,
15705     actionMergeNodes: () => actionMergeNodes,
15706     actionMergePolygon: () => actionMergePolygon,
15707     actionMergeRemoteChanges: () => actionMergeRemoteChanges,
15708     actionMove: () => actionMove,
15709     actionMoveMember: () => actionMoveMember,
15710     actionMoveNode: () => actionMoveNode,
15711     actionNoop: () => actionNoop,
15712     actionOrthogonalize: () => actionOrthogonalize,
15713     actionReflect: () => actionReflect,
15714     actionRestrictTurn: () => actionRestrictTurn,
15715     actionReverse: () => actionReverse,
15716     actionRevert: () => actionRevert,
15717     actionRotate: () => actionRotate,
15718     actionScale: () => actionScale,
15719     actionSplit: () => actionSplit,
15720     actionStraightenNodes: () => actionStraightenNodes,
15721     actionStraightenWay: () => actionStraightenWay,
15722     actionUnrestrictTurn: () => actionUnrestrictTurn,
15723     actionUpgradeTags: () => actionUpgradeTags,
15724     behaviorAddWay: () => behaviorAddWay,
15725     behaviorBreathe: () => behaviorBreathe,
15726     behaviorDrag: () => behaviorDrag,
15727     behaviorDraw: () => behaviorDraw,
15728     behaviorDrawWay: () => behaviorDrawWay,
15729     behaviorEdit: () => behaviorEdit,
15730     behaviorHash: () => behaviorHash,
15731     behaviorHover: () => behaviorHover,
15732     behaviorLasso: () => behaviorLasso,
15733     behaviorOperation: () => behaviorOperation,
15734     behaviorPaste: () => behaviorPaste,
15735     behaviorSelect: () => behaviorSelect,
15736     coreContext: () => coreContext,
15737     coreDifference: () => coreDifference,
15738     coreFileFetcher: () => coreFileFetcher,
15739     coreGraph: () => coreGraph,
15740     coreHistory: () => coreHistory,
15741     coreLocalizer: () => coreLocalizer,
15742     coreTree: () => coreTree,
15743     coreUploader: () => coreUploader,
15744     coreValidator: () => coreValidator,
15745     d3: () => d3,
15746     debug: () => debug,
15747     fileFetcher: () => _mainFileFetcher,
15748     geoAngle: () => geoAngle,
15749     geoChooseEdge: () => geoChooseEdge,
15750     geoEdgeEqual: () => geoEdgeEqual,
15751     geoExtent: () => geoExtent,
15752     geoGetSmallestSurroundingRectangle: () => geoGetSmallestSurroundingRectangle,
15753     geoHasLineIntersections: () => geoHasLineIntersections,
15754     geoHasSelfIntersections: () => geoHasSelfIntersections,
15755     geoLatToMeters: () => geoLatToMeters,
15756     geoLineIntersection: () => geoLineIntersection,
15757     geoLonToMeters: () => geoLonToMeters,
15758     geoMetersToLat: () => geoMetersToLat,
15759     geoMetersToLon: () => geoMetersToLon,
15760     geoMetersToOffset: () => geoMetersToOffset,
15761     geoOffsetToMeters: () => geoOffsetToMeters,
15762     geoOrthoCalcScore: () => geoOrthoCalcScore,
15763     geoOrthoCanOrthogonalize: () => geoOrthoCanOrthogonalize,
15764     geoOrthoMaxOffsetAngle: () => geoOrthoMaxOffsetAngle,
15765     geoOrthoNormalizedDotProduct: () => geoOrthoNormalizedDotProduct,
15766     geoPathHasIntersections: () => geoPathHasIntersections,
15767     geoPathIntersections: () => geoPathIntersections,
15768     geoPathLength: () => geoPathLength,
15769     geoPointInPolygon: () => geoPointInPolygon,
15770     geoPolygonContainsPolygon: () => geoPolygonContainsPolygon,
15771     geoPolygonIntersectsPolygon: () => geoPolygonIntersectsPolygon,
15772     geoRawMercator: () => geoRawMercator,
15773     geoRotate: () => geoRotate,
15774     geoScaleToZoom: () => geoScaleToZoom,
15775     geoSphericalClosestNode: () => geoSphericalClosestNode,
15776     geoSphericalDistance: () => geoSphericalDistance,
15777     geoVecAdd: () => geoVecAdd,
15778     geoVecAngle: () => geoVecAngle,
15779     geoVecCross: () => geoVecCross,
15780     geoVecDot: () => geoVecDot,
15781     geoVecEqual: () => geoVecEqual,
15782     geoVecFloor: () => geoVecFloor,
15783     geoVecInterp: () => geoVecInterp,
15784     geoVecLength: () => geoVecLength,
15785     geoVecLengthSquare: () => geoVecLengthSquare,
15786     geoVecNormalize: () => geoVecNormalize,
15787     geoVecNormalizedDot: () => geoVecNormalizedDot,
15788     geoVecProject: () => geoVecProject,
15789     geoVecScale: () => geoVecScale,
15790     geoVecSubtract: () => geoVecSubtract,
15791     geoViewportEdge: () => geoViewportEdge,
15792     geoZoomToScale: () => geoZoomToScale,
15793     likelyRawNumberFormat: () => likelyRawNumberFormat,
15794     localizer: () => _mainLocalizer,
15795     locationManager: () => _sharedLocationManager,
15796     modeAddArea: () => modeAddArea,
15797     modeAddLine: () => modeAddLine,
15798     modeAddNote: () => modeAddNote,
15799     modeAddPoint: () => modeAddPoint,
15800     modeBrowse: () => modeBrowse,
15801     modeDragNode: () => modeDragNode,
15802     modeDragNote: () => modeDragNote,
15803     modeDrawArea: () => modeDrawArea,
15804     modeDrawLine: () => modeDrawLine,
15805     modeMove: () => modeMove,
15806     modeRotate: () => modeRotate,
15807     modeSave: () => modeSave,
15808     modeSelect: () => modeSelect,
15809     modeSelectData: () => modeSelectData,
15810     modeSelectError: () => modeSelectError,
15811     modeSelectNote: () => modeSelectNote,
15812     operationCircularize: () => operationCircularize,
15813     operationContinue: () => operationContinue,
15814     operationCopy: () => operationCopy,
15815     operationDelete: () => operationDelete,
15816     operationDisconnect: () => operationDisconnect,
15817     operationDowngrade: () => operationDowngrade,
15818     operationExtract: () => operationExtract,
15819     operationMerge: () => operationMerge,
15820     operationMove: () => operationMove,
15821     operationOrthogonalize: () => operationOrthogonalize,
15822     operationPaste: () => operationPaste,
15823     operationReflectLong: () => operationReflectLong,
15824     operationReflectShort: () => operationReflectShort,
15825     operationReverse: () => operationReverse,
15826     operationRotate: () => operationRotate,
15827     operationSplit: () => operationSplit,
15828     operationStraighten: () => operationStraighten,
15829     osmAreaKeys: () => osmAreaKeys,
15830     osmChangeset: () => osmChangeset,
15831     osmEntity: () => osmEntity,
15832     osmFlowingWaterwayTagValues: () => osmFlowingWaterwayTagValues,
15833     osmInferRestriction: () => osmInferRestriction,
15834     osmIntersection: () => osmIntersection,
15835     osmIsInterestingTag: () => osmIsInterestingTag,
15836     osmIsOldMultipolygonOuterMember: () => osmIsOldMultipolygonOuterMember,
15837     osmJoinWays: () => osmJoinWays,
15838     osmLanes: () => osmLanes,
15839     osmLifecyclePrefixes: () => osmLifecyclePrefixes,
15840     osmNode: () => osmNode,
15841     osmNodeGeometriesForTags: () => osmNodeGeometriesForTags,
15842     osmNote: () => osmNote,
15843     osmOldMultipolygonOuterMember: () => osmOldMultipolygonOuterMember,
15844     osmOldMultipolygonOuterMemberOfRelation: () => osmOldMultipolygonOuterMemberOfRelation,
15845     osmOneWayTags: () => osmOneWayTags,
15846     osmPavedTags: () => osmPavedTags,
15847     osmPointTags: () => osmPointTags,
15848     osmRailwayTrackTagValues: () => osmRailwayTrackTagValues,
15849     osmRelation: () => osmRelation,
15850     osmRemoveLifecyclePrefix: () => osmRemoveLifecyclePrefix,
15851     osmRoutableHighwayTagValues: () => osmRoutableHighwayTagValues,
15852     osmSetAreaKeys: () => osmSetAreaKeys,
15853     osmSetPointTags: () => osmSetPointTags,
15854     osmSetVertexTags: () => osmSetVertexTags,
15855     osmTagSuggestingArea: () => osmTagSuggestingArea,
15856     osmTurn: () => osmTurn,
15857     osmVertexTags: () => osmVertexTags,
15858     osmWay: () => osmWay,
15859     prefs: () => corePreferences,
15860     presetCategory: () => presetCategory,
15861     presetCollection: () => presetCollection,
15862     presetField: () => presetField,
15863     presetIndex: () => presetIndex,
15864     presetManager: () => _mainPresetIndex,
15865     presetPreset: () => presetPreset,
15866     rendererBackground: () => rendererBackground,
15867     rendererBackgroundSource: () => rendererBackgroundSource,
15868     rendererFeatures: () => rendererFeatures,
15869     rendererMap: () => rendererMap,
15870     rendererPhotos: () => rendererPhotos,
15871     rendererTileLayer: () => rendererTileLayer,
15872     serviceImproveOSM: () => improveOSM_default,
15873     serviceKartaview: () => kartaview_default,
15874     serviceKeepRight: () => keepRight_default,
15875     serviceMapRules: () => maprules_default,
15876     serviceMapillary: () => mapillary_default,
15877     serviceNominatim: () => nominatim_default,
15878     serviceNsi: () => nsi_default,
15879     serviceOsm: () => osm_default,
15880     serviceOsmWikibase: () => osm_wikibase_default,
15881     serviceOsmose: () => osmose_default,
15882     serviceStreetside: () => streetside_default,
15883     serviceTaginfo: () => taginfo_default,
15884     serviceVectorTile: () => vector_tile_default,
15885     serviceWikidata: () => wikidata_default,
15886     serviceWikipedia: () => wikipedia_default,
15887     services: () => services,
15888     svgAreas: () => svgAreas,
15889     svgData: () => svgData,
15890     svgDebug: () => svgDebug,
15891     svgDefs: () => svgDefs,
15892     svgGeolocate: () => svgGeolocate,
15893     svgIcon: () => svgIcon,
15894     svgKartaviewImages: () => svgKartaviewImages,
15895     svgKeepRight: () => svgKeepRight,
15896     svgLabels: () => svgLabels,
15897     svgLayers: () => svgLayers,
15898     svgLines: () => svgLines,
15899     svgMapillaryImages: () => svgMapillaryImages,
15900     svgMapillarySigns: () => svgMapillarySigns,
15901     svgMarkerSegments: () => svgMarkerSegments,
15902     svgMidpoints: () => svgMidpoints,
15903     svgNotes: () => svgNotes,
15904     svgOsm: () => svgOsm,
15905     svgPassiveVertex: () => svgPassiveVertex,
15906     svgPath: () => svgPath,
15907     svgPointTransform: () => svgPointTransform,
15908     svgPoints: () => svgPoints,
15909     svgRelationMemberTags: () => svgRelationMemberTags,
15910     svgSegmentWay: () => svgSegmentWay,
15911     svgStreetside: () => svgStreetside,
15912     svgTagClasses: () => svgTagClasses,
15913     svgTagPattern: () => svgTagPattern,
15914     svgTouch: () => svgTouch,
15915     svgTurns: () => svgTurns,
15916     svgVertices: () => svgVertices,
15917     t: () => _t,
15918     uiAccount: () => uiAccount,
15919     uiAttribution: () => uiAttribution,
15920     uiChangesetEditor: () => uiChangesetEditor,
15921     uiCmd: () => uiCmd,
15922     uiCombobox: () => uiCombobox,
15923     uiCommit: () => uiCommit,
15924     uiCommitWarnings: () => uiCommitWarnings,
15925     uiConfirm: () => uiConfirm,
15926     uiConflicts: () => uiConflicts,
15927     uiContributors: () => uiContributors,
15928     uiCurtain: () => uiCurtain,
15929     uiDataEditor: () => uiDataEditor,
15930     uiDataHeader: () => uiDataHeader,
15931     uiDisclosure: () => uiDisclosure,
15932     uiEditMenu: () => uiEditMenu,
15933     uiEntityEditor: () => uiEntityEditor,
15934     uiFeatureInfo: () => uiFeatureInfo,
15935     uiFeatureList: () => uiFeatureList,
15936     uiField: () => uiField,
15937     uiFieldAccess: () => uiFieldAccess,
15938     uiFieldAddress: () => uiFieldAddress,
15939     uiFieldCheck: () => uiFieldCheck,
15940     uiFieldColour: () => uiFieldText,
15941     uiFieldCombo: () => uiFieldCombo,
15942     uiFieldDefaultCheck: () => uiFieldCheck,
15943     uiFieldDirectionalCombo: () => uiFieldDirectionalCombo,
15944     uiFieldEmail: () => uiFieldText,
15945     uiFieldHelp: () => uiFieldHelp,
15946     uiFieldIdentifier: () => uiFieldText,
15947     uiFieldLanes: () => uiFieldLanes,
15948     uiFieldLocalized: () => uiFieldLocalized,
15949     uiFieldManyCombo: () => uiFieldCombo,
15950     uiFieldMultiCombo: () => uiFieldCombo,
15951     uiFieldNetworkCombo: () => uiFieldCombo,
15952     uiFieldNumber: () => uiFieldText,
15953     uiFieldOnewayCheck: () => uiFieldCheck,
15954     uiFieldRadio: () => uiFieldRadio,
15955     uiFieldRestrictions: () => uiFieldRestrictions,
15956     uiFieldRoadheight: () => uiFieldRoadheight,
15957     uiFieldRoadspeed: () => uiFieldRoadspeed,
15958     uiFieldSemiCombo: () => uiFieldCombo,
15959     uiFieldStructureRadio: () => uiFieldRadio,
15960     uiFieldTel: () => uiFieldText,
15961     uiFieldText: () => uiFieldText,
15962     uiFieldTextarea: () => uiFieldTextarea,
15963     uiFieldTypeCombo: () => uiFieldCombo,
15964     uiFieldUrl: () => uiFieldText,
15965     uiFieldWikidata: () => uiFieldWikidata,
15966     uiFieldWikipedia: () => uiFieldWikipedia,
15967     uiFields: () => uiFields,
15968     uiFlash: () => uiFlash,
15969     uiFormFields: () => uiFormFields,
15970     uiFullScreen: () => uiFullScreen,
15971     uiGeolocate: () => uiGeolocate,
15972     uiImproveOsmComments: () => uiImproveOsmComments,
15973     uiImproveOsmDetails: () => uiImproveOsmDetails,
15974     uiImproveOsmEditor: () => uiImproveOsmEditor,
15975     uiImproveOsmHeader: () => uiImproveOsmHeader,
15976     uiInfo: () => uiInfo,
15977     uiInfoPanels: () => uiInfoPanels,
15978     uiInit: () => uiInit,
15979     uiInspector: () => uiInspector,
15980     uiIntro: () => uiIntro,
15981     uiIssuesInfo: () => uiIssuesInfo,
15982     uiKeepRightDetails: () => uiKeepRightDetails,
15983     uiKeepRightEditor: () => uiKeepRightEditor,
15984     uiKeepRightHeader: () => uiKeepRightHeader,
15985     uiLasso: () => uiLasso,
15986     uiLengthIndicator: () => uiLengthIndicator,
15987     uiLoading: () => uiLoading,
15988     uiMapInMap: () => uiMapInMap,
15989     uiModal: () => uiModal,
15990     uiNoteComments: () => uiNoteComments,
15991     uiNoteEditor: () => uiNoteEditor,
15992     uiNoteHeader: () => uiNoteHeader,
15993     uiNoteReport: () => uiNoteReport,
15994     uiNotice: () => uiNotice,
15995     uiPaneBackground: () => uiPaneBackground,
15996     uiPaneHelp: () => uiPaneHelp,
15997     uiPaneIssues: () => uiPaneIssues,
15998     uiPaneMapData: () => uiPaneMapData,
15999     uiPanePreferences: () => uiPanePreferences,
16000     uiPanelBackground: () => uiPanelBackground,
16001     uiPanelHistory: () => uiPanelHistory,
16002     uiPanelLocation: () => uiPanelLocation,
16003     uiPanelMeasurement: () => uiPanelMeasurement,
16004     uiPopover: () => uiPopover,
16005     uiPresetIcon: () => uiPresetIcon,
16006     uiPresetList: () => uiPresetList,
16007     uiRestore: () => uiRestore,
16008     uiScale: () => uiScale,
16009     uiSectionBackgroundDisplayOptions: () => uiSectionBackgroundDisplayOptions,
16010     uiSectionBackgroundList: () => uiSectionBackgroundList,
16011     uiSectionBackgroundOffset: () => uiSectionBackgroundOffset,
16012     uiSectionChanges: () => uiSectionChanges,
16013     uiSectionDataLayers: () => uiSectionDataLayers,
16014     uiSectionEntityIssues: () => uiSectionEntityIssues,
16015     uiSectionFeatureType: () => uiSectionFeatureType,
16016     uiSectionMapFeatures: () => uiSectionMapFeatures,
16017     uiSectionMapStyleOptions: () => uiSectionMapStyleOptions,
16018     uiSectionOverlayList: () => uiSectionOverlayList,
16019     uiSectionPhotoOverlays: () => uiSectionPhotoOverlays,
16020     uiSectionPresetFields: () => uiSectionPresetFields,
16021     uiSectionPrivacy: () => uiSectionPrivacy,
16022     uiSectionRawMemberEditor: () => uiSectionRawMemberEditor,
16023     uiSectionRawMembershipEditor: () => uiSectionRawMembershipEditor,
16024     uiSectionRawTagEditor: () => uiSectionRawTagEditor,
16025     uiSectionSelectionList: () => uiSectionSelectionList,
16026     uiSectionValidationIssues: () => uiSectionValidationIssues,
16027     uiSectionValidationOptions: () => uiSectionValidationOptions,
16028     uiSectionValidationRules: () => uiSectionValidationRules,
16029     uiSectionValidationStatus: () => uiSectionValidationStatus,
16030     uiSettingsCustomBackground: () => uiSettingsCustomBackground,
16031     uiSettingsCustomData: () => uiSettingsCustomData,
16032     uiSidebar: () => uiSidebar,
16033     uiSourceSwitch: () => uiSourceSwitch,
16034     uiSpinner: () => uiSpinner,
16035     uiSplash: () => uiSplash,
16036     uiStatus: () => uiStatus,
16037     uiSuccess: () => uiSuccess,
16038     uiTagReference: () => uiTagReference,
16039     uiToggle: () => uiToggle,
16040     uiTooltip: () => uiTooltip,
16041     uiVersion: () => uiVersion,
16042     uiViewOnKeepRight: () => uiViewOnKeepRight,
16043     uiViewOnOSM: () => uiViewOnOSM,
16044     uiZoom: () => uiZoom,
16045     utilAesDecrypt: () => utilAesDecrypt,
16046     utilAesEncrypt: () => utilAesEncrypt,
16047     utilArrayChunk: () => utilArrayChunk,
16048     utilArrayDifference: () => utilArrayDifference,
16049     utilArrayFlatten: () => utilArrayFlatten,
16050     utilArrayGroupBy: () => utilArrayGroupBy,
16051     utilArrayIdentical: () => utilArrayIdentical,
16052     utilArrayIntersection: () => utilArrayIntersection,
16053     utilArrayUnion: () => utilArrayUnion,
16054     utilArrayUniq: () => utilArrayUniq,
16055     utilArrayUniqBy: () => utilArrayUniqBy,
16056     utilAsyncMap: () => utilAsyncMap,
16057     utilCleanOsmString: () => utilCleanOsmString,
16058     utilCleanTags: () => utilCleanTags,
16059     utilCombinedTags: () => utilCombinedTags,
16060     utilCompareIDs: () => utilCompareIDs,
16061     utilDeepMemberSelector: () => utilDeepMemberSelector,
16062     utilDetect: () => utilDetect,
16063     utilDisplayLabel: () => utilDisplayLabel,
16064     utilDisplayName: () => utilDisplayName,
16065     utilDisplayNameForPath: () => utilDisplayNameForPath,
16066     utilDisplayType: () => utilDisplayType,
16067     utilEditDistance: () => utilEditDistance,
16068     utilEntityAndDeepMemberIDs: () => utilEntityAndDeepMemberIDs,
16069     utilEntityOrDeepMemberSelector: () => utilEntityOrDeepMemberSelector,
16070     utilEntityOrMemberSelector: () => utilEntityOrMemberSelector,
16071     utilEntityRoot: () => utilEntityRoot,
16072     utilEntitySelector: () => utilEntitySelector,
16073     utilFastMouse: () => utilFastMouse,
16074     utilFunctor: () => utilFunctor,
16075     utilGetAllNodes: () => utilGetAllNodes,
16076     utilGetSetValue: () => utilGetSetValue,
16077     utilHashcode: () => utilHashcode,
16078     utilHighlightEntities: () => utilHighlightEntities,
16079     utilKeybinding: () => utilKeybinding,
16080     utilNoAuto: () => utilNoAuto,
16081     utilObjectOmit: () => utilObjectOmit,
16082     utilOldestID: () => utilOldestID,
16083     utilPrefixCSSProperty: () => utilPrefixCSSProperty,
16084     utilPrefixDOMProperty: () => utilPrefixDOMProperty,
16085     utilQsString: () => utilQsString,
16086     utilRebind: () => utilRebind,
16087     utilSafeClassName: () => utilSafeClassName,
16088     utilSessionMutex: () => utilSessionMutex,
16089     utilSetTransform: () => utilSetTransform,
16090     utilStringQs: () => utilStringQs,
16091     utilTagDiff: () => utilTagDiff,
16092     utilTagText: () => utilTagText,
16093     utilTiler: () => utilTiler,
16094     utilTotalExtent: () => utilTotalExtent,
16095     utilTriggerEvent: () => utilTriggerEvent,
16096     utilUnicodeCharsCount: () => utilUnicodeCharsCount,
16097     utilUnicodeCharsTruncated: () => utilUnicodeCharsTruncated,
16098     utilUniqueDomId: () => utilUniqueDomId,
16099     utilWrap: () => utilWrap,
16100     validationAlmostJunction: () => validationAlmostJunction,
16101     validationCloseNodes: () => validationCloseNodes,
16102     validationCrossingWays: () => validationCrossingWays,
16103     validationDisconnectedWay: () => validationDisconnectedWay,
16104     validationFormatting: () => validationFormatting,
16105     validationHelpRequest: () => validationHelpRequest,
16106     validationImpossibleOneway: () => validationImpossibleOneway,
16107     validationIncompatibleSource: () => validationIncompatibleSource,
16108     validationMaprules: () => validationMaprules,
16109     validationMismatchedGeometry: () => validationMismatchedGeometry,
16110     validationMissingRole: () => validationMissingRole,
16111     validationMissingTag: () => validationMissingTag,
16112     validationOutdatedTags: () => validationOutdatedTags,
16113     validationPrivateData: () => validationPrivateData,
16114     validationSuspiciousName: () => validationSuspiciousName,
16115     validationUnsquareWay: () => validationUnsquareWay
16116   });
16117
16118   // modules/actions/add_entity.js
16119   function actionAddEntity(way) {
16120     return function(graph) {
16121       return graph.replace(way);
16122     };
16123   }
16124
16125   // modules/actions/reverse.js
16126   function actionReverse(entityID, options2) {
16127     var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
16128     var numeric = /^([+\-]?)(?=[\d.])/;
16129     var directionKey = /direction$/;
16130     var turn_lanes = /^turn:lanes:?/;
16131     var keyReplacements = [
16132       [/:right$/, ":left"],
16133       [/:left$/, ":right"],
16134       [/:forward$/, ":backward"],
16135       [/:backward$/, ":forward"],
16136       [/:right:/, ":left:"],
16137       [/:left:/, ":right:"],
16138       [/:forward:/, ":backward:"],
16139       [/:backward:/, ":forward:"]
16140     ];
16141     var valueReplacements = {
16142       left: "right",
16143       right: "left",
16144       up: "down",
16145       down: "up",
16146       forward: "backward",
16147       backward: "forward",
16148       forwards: "backward",
16149       backwards: "forward"
16150     };
16151     var roleReplacements = {
16152       forward: "backward",
16153       backward: "forward",
16154       forwards: "backward",
16155       backwards: "forward"
16156     };
16157     var onewayReplacements = {
16158       yes: "-1",
16159       "1": "-1",
16160       "-1": "yes"
16161     };
16162     var compassReplacements = {
16163       N: "S",
16164       NNE: "SSW",
16165       NE: "SW",
16166       ENE: "WSW",
16167       E: "W",
16168       ESE: "WNW",
16169       SE: "NW",
16170       SSE: "NNW",
16171       S: "N",
16172       SSW: "NNE",
16173       SW: "NE",
16174       WSW: "ENE",
16175       W: "E",
16176       WNW: "ESE",
16177       NW: "SE",
16178       NNW: "SSE"
16179     };
16180     function reverseKey(key) {
16181       for (var i2 = 0; i2 < keyReplacements.length; ++i2) {
16182         var replacement = keyReplacements[i2];
16183         if (replacement[0].test(key)) {
16184           return key.replace(replacement[0], replacement[1]);
16185         }
16186       }
16187       return key;
16188     }
16189     function reverseValue(key, value, includeAbsolute) {
16190       if (ignoreKey.test(key))
16191         return value;
16192       if (turn_lanes.test(key)) {
16193         return value;
16194       } else if (key === "incline" && numeric.test(value)) {
16195         return value.replace(numeric, function(_, sign2) {
16196           return sign2 === "-" ? "" : "-";
16197         });
16198       } else if (options2 && options2.reverseOneway && key === "oneway") {
16199         return onewayReplacements[value] || value;
16200       } else if (includeAbsolute && directionKey.test(key)) {
16201         return value.split(";").map((value2) => {
16202           if (compassReplacements[value2])
16203             return compassReplacements[value2];
16204           var degrees3 = Number(value2);
16205           if (isFinite(degrees3)) {
16206             if (degrees3 < 180) {
16207               degrees3 += 180;
16208             } else {
16209               degrees3 -= 180;
16210             }
16211             return degrees3.toString();
16212           } else {
16213             return valueReplacements[value2] || value2;
16214           }
16215         }).join(";");
16216       }
16217       return valueReplacements[value] || value;
16218     }
16219     function reverseNodeTags(graph, nodeIDs) {
16220       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
16221         var node = graph.hasEntity(nodeIDs[i2]);
16222         if (!node || !Object.keys(node.tags).length)
16223           continue;
16224         var tags = {};
16225         for (var key in node.tags) {
16226           tags[reverseKey(key)] = reverseValue(key, node.tags[key], node.id === entityID);
16227         }
16228         graph = graph.replace(node.update({ tags }));
16229       }
16230       return graph;
16231     }
16232     function reverseWay(graph, way) {
16233       var nodes = way.nodes.slice().reverse();
16234       var tags = {};
16235       var role;
16236       for (var key in way.tags) {
16237         tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
16238       }
16239       graph.parentRelations(way).forEach(function(relation) {
16240         relation.members.forEach(function(member, index) {
16241           if (member.id === way.id && (role = roleReplacements[member.role])) {
16242             relation = relation.updateMember({ role }, index);
16243             graph = graph.replace(relation);
16244           }
16245         });
16246       });
16247       return reverseNodeTags(graph, nodes).replace(way.update({ nodes, tags }));
16248     }
16249     var action = function(graph) {
16250       var entity = graph.entity(entityID);
16251       if (entity.type === "way") {
16252         return reverseWay(graph, entity);
16253       }
16254       return reverseNodeTags(graph, [entityID]);
16255     };
16256     action.disabled = function(graph) {
16257       var entity = graph.hasEntity(entityID);
16258       if (!entity || entity.type === "way")
16259         return false;
16260       for (var key in entity.tags) {
16261         var value = entity.tags[key];
16262         if (reverseKey(key) !== key || reverseValue(key, value, true) !== value) {
16263           return false;
16264         }
16265       }
16266       return "nondirectional_node";
16267     };
16268     action.entityID = function() {
16269       return entityID;
16270     };
16271     return action;
16272   }
16273
16274   // modules/osm/tags.js
16275   function osmIsInterestingTag(key) {
16276     return key !== "attribution" && key !== "created_by" && key !== "source" && key !== "odbl" && key.indexOf("source:") !== 0 && key.indexOf("source_ref") !== 0 && // purposely exclude colon
16277     key.indexOf("tiger:") !== 0;
16278   }
16279   var osmLifecyclePrefixes = {
16280     // nonexistent, might be built
16281     proposed: true,
16282     planned: true,
16283     // under maintentance or between groundbreaking and opening
16284     construction: true,
16285     // existent but not functional
16286     disused: true,
16287     // dilapidated to nonexistent
16288     abandoned: true,
16289     was: true,
16290     // nonexistent, still may appear in imagery
16291     dismantled: true,
16292     razed: true,
16293     demolished: true,
16294     destroyed: true,
16295     removed: true,
16296     obliterated: true,
16297     // existent occasionally, e.g. stormwater drainage basin
16298     intermittent: true
16299   };
16300   function osmRemoveLifecyclePrefix(key) {
16301     const keySegments = key.split(":");
16302     if (keySegments.length === 1)
16303       return key;
16304     if (keySegments[0] in osmLifecyclePrefixes) {
16305       return key.slice(keySegments[0].length + 1);
16306     }
16307     return key;
16308   }
16309   var osmAreaKeys = {};
16310   function osmSetAreaKeys(value) {
16311     osmAreaKeys = value;
16312   }
16313   var osmAreaKeysExceptions = {
16314     highway: {
16315       elevator: true,
16316       rest_area: true,
16317       services: true
16318     },
16319     public_transport: {
16320       platform: true
16321     },
16322     railway: {
16323       platform: true,
16324       roundhouse: true,
16325       station: true,
16326       traverser: true,
16327       turntable: true,
16328       wash: true
16329     },
16330     traffic_calming: {
16331       island: true
16332     },
16333     waterway: {
16334       dam: true
16335     }
16336   };
16337   function osmTagSuggestingArea(tags) {
16338     if (tags.area === "yes")
16339       return { area: "yes" };
16340     if (tags.area === "no")
16341       return null;
16342     var returnTags = {};
16343     for (var realKey in tags) {
16344       const key = osmRemoveLifecyclePrefix(realKey);
16345       if (key in osmAreaKeys && !(tags[realKey] in osmAreaKeys[key])) {
16346         returnTags[realKey] = tags[realKey];
16347         return returnTags;
16348       }
16349       if (key in osmAreaKeysExceptions && tags[realKey] in osmAreaKeysExceptions[key]) {
16350         returnTags[realKey] = tags[realKey];
16351         return returnTags;
16352       }
16353     }
16354     return null;
16355   }
16356   var osmLineTags = {};
16357   function osmSetLineTags(value) {
16358     osmLineTags = value;
16359   }
16360   var osmPointTags = {};
16361   function osmSetPointTags(value) {
16362     osmPointTags = value;
16363   }
16364   var osmVertexTags = {};
16365   function osmSetVertexTags(value) {
16366     osmVertexTags = value;
16367   }
16368   function osmNodeGeometriesForTags(nodeTags) {
16369     var geometries = {};
16370     for (var key in nodeTags) {
16371       if (osmPointTags[key] && (osmPointTags[key]["*"] || osmPointTags[key][nodeTags[key]])) {
16372         geometries.point = true;
16373       }
16374       if (osmVertexTags[key] && (osmVertexTags[key]["*"] || osmVertexTags[key][nodeTags[key]])) {
16375         geometries.vertex = true;
16376       }
16377       if (geometries.point && geometries.vertex)
16378         break;
16379     }
16380     return geometries;
16381   }
16382   var osmOneWayTags = {
16383     "aerialway": {
16384       "chair_lift": true,
16385       "drag_lift": true,
16386       "j-bar": true,
16387       "magic_carpet": true,
16388       "mixed_lift": true,
16389       "platter": true,
16390       "rope_tow": true,
16391       "t-bar": true,
16392       "zip_line": true
16393     },
16394     "highway": {
16395       "motorway": true
16396     },
16397     "junction": {
16398       "circular": true,
16399       "roundabout": true
16400     },
16401     "man_made": {
16402       "goods_conveyor": true,
16403       "piste:halfpipe": true
16404     },
16405     "piste:type": {
16406       "downhill": true,
16407       "sled": true,
16408       "yes": true
16409     },
16410     "seamark:type": {
16411       "two-way_route": true,
16412       "recommended_traffic_lane": true,
16413       "separation_lane": true,
16414       "separation_roundabout": true
16415     },
16416     "waterway": {
16417       "canal": true,
16418       "ditch": true,
16419       "drain": true,
16420       "fish_pass": true,
16421       "pressurised": true,
16422       "river": true,
16423       "spillway": true,
16424       "stream": true,
16425       "tidal_channel": true
16426     }
16427   };
16428   var osmPavedTags = {
16429     "surface": {
16430       "paved": true,
16431       "asphalt": true,
16432       "concrete": true,
16433       "chipseal": true,
16434       "concrete:lanes": true,
16435       "concrete:plates": true
16436     },
16437     "tracktype": {
16438       "grade1": true
16439     }
16440   };
16441   var osmSemipavedTags = {
16442     "surface": {
16443       "cobblestone": true,
16444       "cobblestone:flattened": true,
16445       "unhewn_cobblestone": true,
16446       "sett": true,
16447       "paving_stones": true,
16448       "metal": true,
16449       "wood": true
16450     }
16451   };
16452   var osmRightSideIsInsideTags = {
16453     "natural": {
16454       "cliff": true,
16455       "coastline": "coastline"
16456     },
16457     "barrier": {
16458       "retaining_wall": true,
16459       "kerb": true,
16460       "guard_rail": true,
16461       "city_wall": true
16462     },
16463     "man_made": {
16464       "embankment": true,
16465       "quay": true
16466     },
16467     "waterway": {
16468       "weir": true
16469     }
16470   };
16471   var osmRoutableHighwayTagValues = {
16472     motorway: true,
16473     trunk: true,
16474     primary: true,
16475     secondary: true,
16476     tertiary: true,
16477     residential: true,
16478     motorway_link: true,
16479     trunk_link: true,
16480     primary_link: true,
16481     secondary_link: true,
16482     tertiary_link: true,
16483     unclassified: true,
16484     road: true,
16485     service: true,
16486     track: true,
16487     living_street: true,
16488     bus_guideway: true,
16489     path: true,
16490     footway: true,
16491     cycleway: true,
16492     bridleway: true,
16493     pedestrian: true,
16494     corridor: true,
16495     steps: true
16496   };
16497   var osmPathHighwayTagValues = {
16498     path: true,
16499     footway: true,
16500     cycleway: true,
16501     bridleway: true,
16502     pedestrian: true,
16503     corridor: true,
16504     steps: true
16505   };
16506   var osmRailwayTrackTagValues = {
16507     rail: true,
16508     light_rail: true,
16509     tram: true,
16510     subway: true,
16511     monorail: true,
16512     funicular: true,
16513     miniature: true,
16514     narrow_gauge: true,
16515     disused: true,
16516     preserved: true
16517   };
16518   var osmFlowingWaterwayTagValues = {
16519     canal: true,
16520     ditch: true,
16521     drain: true,
16522     fish_pass: true,
16523     river: true,
16524     stream: true,
16525     tidal_channel: true
16526   };
16527   var allowUpperCaseTagValues = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer|country|target|brewery|cai_scale|traffic_sign/;
16528
16529   // node_modules/d3-array/src/ascending.js
16530   function ascending(a, b) {
16531     return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
16532   }
16533
16534   // node_modules/d3-array/src/descending.js
16535   function descending(a, b) {
16536     return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
16537   }
16538
16539   // node_modules/d3-array/src/bisector.js
16540   function bisector(f2) {
16541     let compare1, compare2, delta;
16542     if (f2.length !== 2) {
16543       compare1 = ascending;
16544       compare2 = (d, x) => ascending(f2(d), x);
16545       delta = (d, x) => f2(d) - x;
16546     } else {
16547       compare1 = f2 === ascending || f2 === descending ? f2 : zero;
16548       compare2 = f2;
16549       delta = f2;
16550     }
16551     function left(a, x, lo = 0, hi = a.length) {
16552       if (lo < hi) {
16553         if (compare1(x, x) !== 0)
16554           return hi;
16555         do {
16556           const mid = lo + hi >>> 1;
16557           if (compare2(a[mid], x) < 0)
16558             lo = mid + 1;
16559           else
16560             hi = mid;
16561         } while (lo < hi);
16562       }
16563       return lo;
16564     }
16565     function right(a, x, lo = 0, hi = a.length) {
16566       if (lo < hi) {
16567         if (compare1(x, x) !== 0)
16568           return hi;
16569         do {
16570           const mid = lo + hi >>> 1;
16571           if (compare2(a[mid], x) <= 0)
16572             lo = mid + 1;
16573           else
16574             hi = mid;
16575         } while (lo < hi);
16576       }
16577       return lo;
16578     }
16579     function center(a, x, lo = 0, hi = a.length) {
16580       const i2 = left(a, x, lo, hi - 1);
16581       return i2 > lo && delta(a[i2 - 1], x) > -delta(a[i2], x) ? i2 - 1 : i2;
16582     }
16583     return { left, center, right };
16584   }
16585   function zero() {
16586     return 0;
16587   }
16588
16589   // node_modules/d3-array/src/number.js
16590   function number(x) {
16591     return x === null ? NaN : +x;
16592   }
16593   function* numbers(values, valueof) {
16594     if (valueof === void 0) {
16595       for (let value of values) {
16596         if (value != null && (value = +value) >= value) {
16597           yield value;
16598         }
16599       }
16600     } else {
16601       let index = -1;
16602       for (let value of values) {
16603         if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {
16604           yield value;
16605         }
16606       }
16607     }
16608   }
16609
16610   // node_modules/d3-array/src/bisect.js
16611   var ascendingBisect = bisector(ascending);
16612   var bisectRight = ascendingBisect.right;
16613   var bisectLeft = ascendingBisect.left;
16614   var bisectCenter = bisector(number).center;
16615   var bisect_default = bisectRight;
16616
16617   // node_modules/d3-array/src/fsum.js
16618   var Adder = class {
16619     constructor() {
16620       this._partials = new Float64Array(32);
16621       this._n = 0;
16622     }
16623     add(x) {
16624       const p = this._partials;
16625       let i2 = 0;
16626       for (let j2 = 0; j2 < this._n && j2 < 32; j2++) {
16627         const y = p[j2], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);
16628         if (lo)
16629           p[i2++] = lo;
16630         x = hi;
16631       }
16632       p[i2] = x;
16633       this._n = i2 + 1;
16634       return this;
16635     }
16636     valueOf() {
16637       const p = this._partials;
16638       let n2 = this._n, x, y, lo, hi = 0;
16639       if (n2 > 0) {
16640         hi = p[--n2];
16641         while (n2 > 0) {
16642           x = hi;
16643           y = p[--n2];
16644           hi = x + y;
16645           lo = y - (hi - x);
16646           if (lo)
16647             break;
16648         }
16649         if (n2 > 0 && (lo < 0 && p[n2 - 1] < 0 || lo > 0 && p[n2 - 1] > 0)) {
16650           y = lo * 2;
16651           x = hi + y;
16652           if (y == x - hi)
16653             hi = x;
16654         }
16655       }
16656       return hi;
16657     }
16658   };
16659
16660   // node_modules/d3-array/src/sort.js
16661   function compareDefined(compare = ascending) {
16662     if (compare === ascending)
16663       return ascendingDefined;
16664     if (typeof compare !== "function")
16665       throw new TypeError("compare is not a function");
16666     return (a, b) => {
16667       const x = compare(a, b);
16668       if (x || x === 0)
16669         return x;
16670       return (compare(b, b) === 0) - (compare(a, a) === 0);
16671     };
16672   }
16673   function ascendingDefined(a, b) {
16674     return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);
16675   }
16676
16677   // node_modules/d3-array/src/ticks.js
16678   var e10 = Math.sqrt(50);
16679   var e5 = Math.sqrt(10);
16680   var e2 = Math.sqrt(2);
16681   function ticks(start2, stop, count) {
16682     var reverse, i2 = -1, n2, ticks2, step;
16683     stop = +stop, start2 = +start2, count = +count;
16684     if (start2 === stop && count > 0)
16685       return [start2];
16686     if (reverse = stop < start2)
16687       n2 = start2, start2 = stop, stop = n2;
16688     if ((step = tickIncrement(start2, stop, count)) === 0 || !isFinite(step))
16689       return [];
16690     if (step > 0) {
16691       let r0 = Math.round(start2 / step), r1 = Math.round(stop / step);
16692       if (r0 * step < start2)
16693         ++r0;
16694       if (r1 * step > stop)
16695         --r1;
16696       ticks2 = new Array(n2 = r1 - r0 + 1);
16697       while (++i2 < n2)
16698         ticks2[i2] = (r0 + i2) * step;
16699     } else {
16700       step = -step;
16701       let r0 = Math.round(start2 * step), r1 = Math.round(stop * step);
16702       if (r0 / step < start2)
16703         ++r0;
16704       if (r1 / step > stop)
16705         --r1;
16706       ticks2 = new Array(n2 = r1 - r0 + 1);
16707       while (++i2 < n2)
16708         ticks2[i2] = (r0 + i2) / step;
16709     }
16710     if (reverse)
16711       ticks2.reverse();
16712     return ticks2;
16713   }
16714   function tickIncrement(start2, stop, count) {
16715     var step = (stop - start2) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);
16716     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);
16717   }
16718   function tickStep(start2, stop, count) {
16719     var step0 = Math.abs(stop - start2) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;
16720     if (error >= e10)
16721       step1 *= 10;
16722     else if (error >= e5)
16723       step1 *= 5;
16724     else if (error >= e2)
16725       step1 *= 2;
16726     return stop < start2 ? -step1 : step1;
16727   }
16728
16729   // node_modules/d3-array/src/max.js
16730   function max(values, valueof) {
16731     let max3;
16732     if (valueof === void 0) {
16733       for (const value of values) {
16734         if (value != null && (max3 < value || max3 === void 0 && value >= value)) {
16735           max3 = value;
16736         }
16737       }
16738     } else {
16739       let index = -1;
16740       for (let value of values) {
16741         if ((value = valueof(value, ++index, values)) != null && (max3 < value || max3 === void 0 && value >= value)) {
16742           max3 = value;
16743         }
16744       }
16745     }
16746     return max3;
16747   }
16748
16749   // node_modules/d3-array/src/min.js
16750   function min(values, valueof) {
16751     let min3;
16752     if (valueof === void 0) {
16753       for (const value of values) {
16754         if (value != null && (min3 > value || min3 === void 0 && value >= value)) {
16755           min3 = value;
16756         }
16757       }
16758     } else {
16759       let index = -1;
16760       for (let value of values) {
16761         if ((value = valueof(value, ++index, values)) != null && (min3 > value || min3 === void 0 && value >= value)) {
16762           min3 = value;
16763         }
16764       }
16765     }
16766     return min3;
16767   }
16768
16769   // node_modules/d3-array/src/quickselect.js
16770   function quickselect(array2, k, left = 0, right = array2.length - 1, compare) {
16771     compare = compare === void 0 ? ascendingDefined : compareDefined(compare);
16772     while (right > left) {
16773       if (right - left > 600) {
16774         const n2 = right - left + 1;
16775         const m = k - left + 1;
16776         const z = Math.log(n2);
16777         const s = 0.5 * Math.exp(2 * z / 3);
16778         const sd = 0.5 * Math.sqrt(z * s * (n2 - s) / n2) * (m - n2 / 2 < 0 ? -1 : 1);
16779         const newLeft = Math.max(left, Math.floor(k - m * s / n2 + sd));
16780         const newRight = Math.min(right, Math.floor(k + (n2 - m) * s / n2 + sd));
16781         quickselect(array2, k, newLeft, newRight, compare);
16782       }
16783       const t = array2[k];
16784       let i2 = left;
16785       let j2 = right;
16786       swap(array2, left, k);
16787       if (compare(array2[right], t) > 0)
16788         swap(array2, left, right);
16789       while (i2 < j2) {
16790         swap(array2, i2, j2), ++i2, --j2;
16791         while (compare(array2[i2], t) < 0)
16792           ++i2;
16793         while (compare(array2[j2], t) > 0)
16794           --j2;
16795       }
16796       if (compare(array2[left], t) === 0)
16797         swap(array2, left, j2);
16798       else
16799         ++j2, swap(array2, j2, right);
16800       if (j2 <= k)
16801         left = j2 + 1;
16802       if (k <= j2)
16803         right = j2 - 1;
16804     }
16805     return array2;
16806   }
16807   function swap(array2, i2, j2) {
16808     const t = array2[i2];
16809     array2[i2] = array2[j2];
16810     array2[j2] = t;
16811   }
16812
16813   // node_modules/d3-array/src/quantile.js
16814   function quantile(values, p, valueof) {
16815     values = Float64Array.from(numbers(values, valueof));
16816     if (!(n2 = values.length))
16817       return;
16818     if ((p = +p) <= 0 || n2 < 2)
16819       return min(values);
16820     if (p >= 1)
16821       return max(values);
16822     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));
16823     return value0 + (value1 - value0) * (i2 - i0);
16824   }
16825
16826   // node_modules/d3-array/src/median.js
16827   function median(values, valueof) {
16828     return quantile(values, 0.5, valueof);
16829   }
16830
16831   // node_modules/d3-array/src/merge.js
16832   function* flatten(arrays) {
16833     for (const array2 of arrays) {
16834       yield* array2;
16835     }
16836   }
16837   function merge(arrays) {
16838     return Array.from(flatten(arrays));
16839   }
16840
16841   // node_modules/d3-array/src/range.js
16842   function range(start2, stop, step) {
16843     start2 = +start2, stop = +stop, step = (n2 = arguments.length) < 2 ? (stop = start2, start2 = 0, 1) : n2 < 3 ? 1 : +step;
16844     var i2 = -1, n2 = Math.max(0, Math.ceil((stop - start2) / step)) | 0, range3 = new Array(n2);
16845     while (++i2 < n2) {
16846       range3[i2] = start2 + i2 * step;
16847     }
16848     return range3;
16849   }
16850
16851   // node_modules/d3-geo/src/math.js
16852   var epsilon = 1e-6;
16853   var epsilon2 = 1e-12;
16854   var pi = Math.PI;
16855   var halfPi = pi / 2;
16856   var quarterPi = pi / 4;
16857   var tau = pi * 2;
16858   var degrees = 180 / pi;
16859   var radians = pi / 180;
16860   var abs = Math.abs;
16861   var atan = Math.atan;
16862   var atan2 = Math.atan2;
16863   var cos = Math.cos;
16864   var exp = Math.exp;
16865   var log = Math.log;
16866   var sin = Math.sin;
16867   var sign = Math.sign || function(x) {
16868     return x > 0 ? 1 : x < 0 ? -1 : 0;
16869   };
16870   var sqrt = Math.sqrt;
16871   var tan = Math.tan;
16872   function acos(x) {
16873     return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
16874   }
16875   function asin(x) {
16876     return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);
16877   }
16878
16879   // node_modules/d3-geo/src/noop.js
16880   function noop() {
16881   }
16882
16883   // node_modules/d3-geo/src/stream.js
16884   function streamGeometry(geometry, stream) {
16885     if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
16886       streamGeometryType[geometry.type](geometry, stream);
16887     }
16888   }
16889   var streamObjectType = {
16890     Feature: function(object, stream) {
16891       streamGeometry(object.geometry, stream);
16892     },
16893     FeatureCollection: function(object, stream) {
16894       var features = object.features, i2 = -1, n2 = features.length;
16895       while (++i2 < n2)
16896         streamGeometry(features[i2].geometry, stream);
16897     }
16898   };
16899   var streamGeometryType = {
16900     Sphere: function(object, stream) {
16901       stream.sphere();
16902     },
16903     Point: function(object, stream) {
16904       object = object.coordinates;
16905       stream.point(object[0], object[1], object[2]);
16906     },
16907     MultiPoint: function(object, stream) {
16908       var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
16909       while (++i2 < n2)
16910         object = coordinates[i2], stream.point(object[0], object[1], object[2]);
16911     },
16912     LineString: function(object, stream) {
16913       streamLine(object.coordinates, stream, 0);
16914     },
16915     MultiLineString: function(object, stream) {
16916       var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
16917       while (++i2 < n2)
16918         streamLine(coordinates[i2], stream, 0);
16919     },
16920     Polygon: function(object, stream) {
16921       streamPolygon(object.coordinates, stream);
16922     },
16923     MultiPolygon: function(object, stream) {
16924       var coordinates = object.coordinates, i2 = -1, n2 = coordinates.length;
16925       while (++i2 < n2)
16926         streamPolygon(coordinates[i2], stream);
16927     },
16928     GeometryCollection: function(object, stream) {
16929       var geometries = object.geometries, i2 = -1, n2 = geometries.length;
16930       while (++i2 < n2)
16931         streamGeometry(geometries[i2], stream);
16932     }
16933   };
16934   function streamLine(coordinates, stream, closed) {
16935     var i2 = -1, n2 = coordinates.length - closed, coordinate;
16936     stream.lineStart();
16937     while (++i2 < n2)
16938       coordinate = coordinates[i2], stream.point(coordinate[0], coordinate[1], coordinate[2]);
16939     stream.lineEnd();
16940   }
16941   function streamPolygon(coordinates, stream) {
16942     var i2 = -1, n2 = coordinates.length;
16943     stream.polygonStart();
16944     while (++i2 < n2)
16945       streamLine(coordinates[i2], stream, 1);
16946     stream.polygonEnd();
16947   }
16948   function stream_default(object, stream) {
16949     if (object && streamObjectType.hasOwnProperty(object.type)) {
16950       streamObjectType[object.type](object, stream);
16951     } else {
16952       streamGeometry(object, stream);
16953     }
16954   }
16955
16956   // node_modules/d3-geo/src/area.js
16957   var areaRingSum = new Adder();
16958   var areaSum = new Adder();
16959   var lambda00;
16960   var phi00;
16961   var lambda0;
16962   var cosPhi0;
16963   var sinPhi0;
16964   var areaStream = {
16965     point: noop,
16966     lineStart: noop,
16967     lineEnd: noop,
16968     polygonStart: function() {
16969       areaRingSum = new Adder();
16970       areaStream.lineStart = areaRingStart;
16971       areaStream.lineEnd = areaRingEnd;
16972     },
16973     polygonEnd: function() {
16974       var areaRing = +areaRingSum;
16975       areaSum.add(areaRing < 0 ? tau + areaRing : areaRing);
16976       this.lineStart = this.lineEnd = this.point = noop;
16977     },
16978     sphere: function() {
16979       areaSum.add(tau);
16980     }
16981   };
16982   function areaRingStart() {
16983     areaStream.point = areaPointFirst;
16984   }
16985   function areaRingEnd() {
16986     areaPoint(lambda00, phi00);
16987   }
16988   function areaPointFirst(lambda, phi) {
16989     areaStream.point = areaPoint;
16990     lambda00 = lambda, phi00 = phi;
16991     lambda *= radians, phi *= radians;
16992     lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi);
16993   }
16994   function areaPoint(lambda, phi) {
16995     lambda *= radians, phi *= radians;
16996     phi = phi / 2 + quarterPi;
16997     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);
16998     areaRingSum.add(atan2(v, u));
16999     lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
17000   }
17001   function area_default(object) {
17002     areaSum = new Adder();
17003     stream_default(object, areaStream);
17004     return areaSum * 2;
17005   }
17006
17007   // node_modules/d3-geo/src/cartesian.js
17008   function spherical(cartesian2) {
17009     return [atan2(cartesian2[1], cartesian2[0]), asin(cartesian2[2])];
17010   }
17011   function cartesian(spherical2) {
17012     var lambda = spherical2[0], phi = spherical2[1], cosPhi = cos(phi);
17013     return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];
17014   }
17015   function cartesianDot(a, b) {
17016     return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
17017   }
17018   function cartesianCross(a, b) {
17019     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]];
17020   }
17021   function cartesianAddInPlace(a, b) {
17022     a[0] += b[0], a[1] += b[1], a[2] += b[2];
17023   }
17024   function cartesianScale(vector, k) {
17025     return [vector[0] * k, vector[1] * k, vector[2] * k];
17026   }
17027   function cartesianNormalizeInPlace(d) {
17028     var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
17029     d[0] /= l, d[1] /= l, d[2] /= l;
17030   }
17031
17032   // node_modules/d3-geo/src/bounds.js
17033   var lambda02;
17034   var phi0;
17035   var lambda1;
17036   var phi1;
17037   var lambda2;
17038   var lambda002;
17039   var phi002;
17040   var p0;
17041   var deltaSum;
17042   var ranges;
17043   var range2;
17044   var boundsStream = {
17045     point: boundsPoint,
17046     lineStart: boundsLineStart,
17047     lineEnd: boundsLineEnd,
17048     polygonStart: function() {
17049       boundsStream.point = boundsRingPoint;
17050       boundsStream.lineStart = boundsRingStart;
17051       boundsStream.lineEnd = boundsRingEnd;
17052       deltaSum = new Adder();
17053       areaStream.polygonStart();
17054     },
17055     polygonEnd: function() {
17056       areaStream.polygonEnd();
17057       boundsStream.point = boundsPoint;
17058       boundsStream.lineStart = boundsLineStart;
17059       boundsStream.lineEnd = boundsLineEnd;
17060       if (areaRingSum < 0)
17061         lambda02 = -(lambda1 = 180), phi0 = -(phi1 = 90);
17062       else if (deltaSum > epsilon)
17063         phi1 = 90;
17064       else if (deltaSum < -epsilon)
17065         phi0 = -90;
17066       range2[0] = lambda02, range2[1] = lambda1;
17067     },
17068     sphere: function() {
17069       lambda02 = -(lambda1 = 180), phi0 = -(phi1 = 90);
17070     }
17071   };
17072   function boundsPoint(lambda, phi) {
17073     ranges.push(range2 = [lambda02 = lambda, lambda1 = lambda]);
17074     if (phi < phi0)
17075       phi0 = phi;
17076     if (phi > phi1)
17077       phi1 = phi;
17078   }
17079   function linePoint(lambda, phi) {
17080     var p = cartesian([lambda * radians, phi * radians]);
17081     if (p0) {
17082       var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);
17083       cartesianNormalizeInPlace(inflection);
17084       inflection = spherical(inflection);
17085       var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs(delta) > 180;
17086       if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {
17087         phii = inflection[1] * degrees;
17088         if (phii > phi1)
17089           phi1 = phii;
17090       } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {
17091         phii = -inflection[1] * degrees;
17092         if (phii < phi0)
17093           phi0 = phii;
17094       } else {
17095         if (phi < phi0)
17096           phi0 = phi;
17097         if (phi > phi1)
17098           phi1 = phi;
17099       }
17100       if (antimeridian) {
17101         if (lambda < lambda2) {
17102           if (angle(lambda02, lambda) > angle(lambda02, lambda1))
17103             lambda1 = lambda;
17104         } else {
17105           if (angle(lambda, lambda1) > angle(lambda02, lambda1))
17106             lambda02 = lambda;
17107         }
17108       } else {
17109         if (lambda1 >= lambda02) {
17110           if (lambda < lambda02)
17111             lambda02 = lambda;
17112           if (lambda > lambda1)
17113             lambda1 = lambda;
17114         } else {
17115           if (lambda > lambda2) {
17116             if (angle(lambda02, lambda) > angle(lambda02, lambda1))
17117               lambda1 = lambda;
17118           } else {
17119             if (angle(lambda, lambda1) > angle(lambda02, lambda1))
17120               lambda02 = lambda;
17121           }
17122         }
17123       }
17124     } else {
17125       ranges.push(range2 = [lambda02 = lambda, lambda1 = lambda]);
17126     }
17127     if (phi < phi0)
17128       phi0 = phi;
17129     if (phi > phi1)
17130       phi1 = phi;
17131     p0 = p, lambda2 = lambda;
17132   }
17133   function boundsLineStart() {
17134     boundsStream.point = linePoint;
17135   }
17136   function boundsLineEnd() {
17137     range2[0] = lambda02, range2[1] = lambda1;
17138     boundsStream.point = boundsPoint;
17139     p0 = null;
17140   }
17141   function boundsRingPoint(lambda, phi) {
17142     if (p0) {
17143       var delta = lambda - lambda2;
17144       deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
17145     } else {
17146       lambda002 = lambda, phi002 = phi;
17147     }
17148     areaStream.point(lambda, phi);
17149     linePoint(lambda, phi);
17150   }
17151   function boundsRingStart() {
17152     areaStream.lineStart();
17153   }
17154   function boundsRingEnd() {
17155     boundsRingPoint(lambda002, phi002);
17156     areaStream.lineEnd();
17157     if (abs(deltaSum) > epsilon)
17158       lambda02 = -(lambda1 = 180);
17159     range2[0] = lambda02, range2[1] = lambda1;
17160     p0 = null;
17161   }
17162   function angle(lambda04, lambda12) {
17163     return (lambda12 -= lambda04) < 0 ? lambda12 + 360 : lambda12;
17164   }
17165   function rangeCompare(a, b) {
17166     return a[0] - b[0];
17167   }
17168   function rangeContains(range3, x) {
17169     return range3[0] <= range3[1] ? range3[0] <= x && x <= range3[1] : x < range3[0] || range3[1] < x;
17170   }
17171   function bounds_default(feature3) {
17172     var i2, n2, a, b, merged, deltaMax, delta;
17173     phi1 = lambda1 = -(lambda02 = phi0 = Infinity);
17174     ranges = [];
17175     stream_default(feature3, boundsStream);
17176     if (n2 = ranges.length) {
17177       ranges.sort(rangeCompare);
17178       for (i2 = 1, a = ranges[0], merged = [a]; i2 < n2; ++i2) {
17179         b = ranges[i2];
17180         if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
17181           if (angle(a[0], b[1]) > angle(a[0], a[1]))
17182             a[1] = b[1];
17183           if (angle(b[0], a[1]) > angle(a[0], a[1]))
17184             a[0] = b[0];
17185         } else {
17186           merged.push(a = b);
17187         }
17188       }
17189       for (deltaMax = -Infinity, n2 = merged.length - 1, i2 = 0, a = merged[n2]; i2 <= n2; a = b, ++i2) {
17190         b = merged[i2];
17191         if ((delta = angle(a[1], b[0])) > deltaMax)
17192           deltaMax = delta, lambda02 = b[0], lambda1 = a[1];
17193       }
17194     }
17195     ranges = range2 = null;
17196     return lambda02 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda02, phi0], [lambda1, phi1]];
17197   }
17198
17199   // node_modules/d3-geo/src/compose.js
17200   function compose_default(a, b) {
17201     function compose(x, y) {
17202       return x = a(x, y), b(x[0], x[1]);
17203     }
17204     if (a.invert && b.invert)
17205       compose.invert = function(x, y) {
17206         return x = b.invert(x, y), x && a.invert(x[0], x[1]);
17207       };
17208     return compose;
17209   }
17210
17211   // node_modules/d3-geo/src/rotation.js
17212   function rotationIdentity(lambda, phi) {
17213     return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi];
17214   }
17215   rotationIdentity.invert = rotationIdentity;
17216   function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
17217     return (deltaLambda %= tau) ? deltaPhi || deltaGamma ? compose_default(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;
17218   }
17219   function forwardRotationLambda(deltaLambda) {
17220     return function(lambda, phi) {
17221       return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi];
17222     };
17223   }
17224   function rotationLambda(deltaLambda) {
17225     var rotation = forwardRotationLambda(deltaLambda);
17226     rotation.invert = forwardRotationLambda(-deltaLambda);
17227     return rotation;
17228   }
17229   function rotationPhiGamma(deltaPhi, deltaGamma) {
17230     var cosDeltaPhi = cos(deltaPhi), sinDeltaPhi = sin(deltaPhi), cosDeltaGamma = cos(deltaGamma), sinDeltaGamma = sin(deltaGamma);
17231     function rotation(lambda, phi) {
17232       var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaPhi + x * sinDeltaPhi;
17233       return [
17234         atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
17235         asin(k * cosDeltaGamma + y * sinDeltaGamma)
17236       ];
17237     }
17238     rotation.invert = function(lambda, phi) {
17239       var cosPhi = cos(phi), x = cos(lambda) * cosPhi, y = sin(lambda) * cosPhi, z = sin(phi), k = z * cosDeltaGamma - y * sinDeltaGamma;
17240       return [
17241         atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
17242         asin(k * cosDeltaPhi - x * sinDeltaPhi)
17243       ];
17244     };
17245     return rotation;
17246   }
17247   function rotation_default(rotate) {
17248     rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
17249     function forward(coordinates) {
17250       coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
17251       return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
17252     }
17253     forward.invert = function(coordinates) {
17254       coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
17255       return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;
17256     };
17257     return forward;
17258   }
17259
17260   // node_modules/d3-geo/src/circle.js
17261   function circleStream(stream, radius, delta, direction, t0, t1) {
17262     if (!delta)
17263       return;
17264     var cosRadius = cos(radius), sinRadius = sin(radius), step = direction * delta;
17265     if (t0 == null) {
17266       t0 = radius + direction * tau;
17267       t1 = radius - step / 2;
17268     } else {
17269       t0 = circleRadius(cosRadius, t0);
17270       t1 = circleRadius(cosRadius, t1);
17271       if (direction > 0 ? t0 < t1 : t0 > t1)
17272         t0 += direction * tau;
17273     }
17274     for (var point2, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
17275       point2 = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);
17276       stream.point(point2[0], point2[1]);
17277     }
17278   }
17279   function circleRadius(cosRadius, point2) {
17280     point2 = cartesian(point2), point2[0] -= cosRadius;
17281     cartesianNormalizeInPlace(point2);
17282     var radius = acos(-point2[1]);
17283     return ((-point2[2] < 0 ? -radius : radius) + tau - epsilon) % tau;
17284   }
17285
17286   // node_modules/d3-geo/src/clip/buffer.js
17287   function buffer_default() {
17288     var lines = [], line;
17289     return {
17290       point: function(x, y, m) {
17291         line.push([x, y, m]);
17292       },
17293       lineStart: function() {
17294         lines.push(line = []);
17295       },
17296       lineEnd: noop,
17297       rejoin: function() {
17298         if (lines.length > 1)
17299           lines.push(lines.pop().concat(lines.shift()));
17300       },
17301       result: function() {
17302         var result = lines;
17303         lines = [];
17304         line = null;
17305         return result;
17306       }
17307     };
17308   }
17309
17310   // node_modules/d3-geo/src/pointEqual.js
17311   function pointEqual_default(a, b) {
17312     return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;
17313   }
17314
17315   // node_modules/d3-geo/src/clip/rejoin.js
17316   function Intersection(point2, points, other, entry) {
17317     this.x = point2;
17318     this.z = points;
17319     this.o = other;
17320     this.e = entry;
17321     this.v = false;
17322     this.n = this.p = null;
17323   }
17324   function rejoin_default(segments, compareIntersection2, startInside, interpolate, stream) {
17325     var subject = [], clip = [], i2, n2;
17326     segments.forEach(function(segment) {
17327       if ((n3 = segment.length - 1) <= 0)
17328         return;
17329       var n3, p02 = segment[0], p1 = segment[n3], x;
17330       if (pointEqual_default(p02, p1)) {
17331         if (!p02[2] && !p1[2]) {
17332           stream.lineStart();
17333           for (i2 = 0; i2 < n3; ++i2)
17334             stream.point((p02 = segment[i2])[0], p02[1]);
17335           stream.lineEnd();
17336           return;
17337         }
17338         p1[0] += 2 * epsilon;
17339       }
17340       subject.push(x = new Intersection(p02, segment, null, true));
17341       clip.push(x.o = new Intersection(p02, null, x, false));
17342       subject.push(x = new Intersection(p1, segment, null, false));
17343       clip.push(x.o = new Intersection(p1, null, x, true));
17344     });
17345     if (!subject.length)
17346       return;
17347     clip.sort(compareIntersection2);
17348     link(subject);
17349     link(clip);
17350     for (i2 = 0, n2 = clip.length; i2 < n2; ++i2) {
17351       clip[i2].e = startInside = !startInside;
17352     }
17353     var start2 = subject[0], points, point2;
17354     while (1) {
17355       var current = start2, isSubject = true;
17356       while (current.v)
17357         if ((current = current.n) === start2)
17358           return;
17359       points = current.z;
17360       stream.lineStart();
17361       do {
17362         current.v = current.o.v = true;
17363         if (current.e) {
17364           if (isSubject) {
17365             for (i2 = 0, n2 = points.length; i2 < n2; ++i2)
17366               stream.point((point2 = points[i2])[0], point2[1]);
17367           } else {
17368             interpolate(current.x, current.n.x, 1, stream);
17369           }
17370           current = current.n;
17371         } else {
17372           if (isSubject) {
17373             points = current.p.z;
17374             for (i2 = points.length - 1; i2 >= 0; --i2)
17375               stream.point((point2 = points[i2])[0], point2[1]);
17376           } else {
17377             interpolate(current.x, current.p.x, -1, stream);
17378           }
17379           current = current.p;
17380         }
17381         current = current.o;
17382         points = current.z;
17383         isSubject = !isSubject;
17384       } while (!current.v);
17385       stream.lineEnd();
17386     }
17387   }
17388   function link(array2) {
17389     if (!(n2 = array2.length))
17390       return;
17391     var n2, i2 = 0, a = array2[0], b;
17392     while (++i2 < n2) {
17393       a.n = b = array2[i2];
17394       b.p = a;
17395       a = b;
17396     }
17397     a.n = b = array2[0];
17398     b.p = a;
17399   }
17400
17401   // node_modules/d3-geo/src/polygonContains.js
17402   function longitude(point2) {
17403     return abs(point2[0]) <= pi ? point2[0] : sign(point2[0]) * ((abs(point2[0]) + pi) % tau - pi);
17404   }
17405   function polygonContains_default(polygon2, point2) {
17406     var lambda = longitude(point2), phi = point2[1], sinPhi = sin(phi), normal = [sin(lambda), -cos(lambda), 0], angle2 = 0, winding = 0;
17407     var sum = new Adder();
17408     if (sinPhi === 1)
17409       phi = halfPi + epsilon;
17410     else if (sinPhi === -1)
17411       phi = -halfPi - epsilon;
17412     for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) {
17413       if (!(m = (ring = polygon2[i2]).length))
17414         continue;
17415       var ring, m, point0 = ring[m - 1], lambda04 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi03 = sin(phi02), cosPhi03 = cos(phi02);
17416       for (var j2 = 0; j2 < m; ++j2, lambda04 = lambda12, sinPhi03 = sinPhi1, cosPhi03 = cosPhi1, point0 = point1) {
17417         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;
17418         sum.add(atan2(k * sign2 * sin(absDelta), cosPhi03 * cosPhi1 + k * cos(absDelta)));
17419         angle2 += antimeridian ? delta + sign2 * tau : delta;
17420         if (antimeridian ^ lambda04 >= lambda ^ lambda12 >= lambda) {
17421           var arc = cartesianCross(cartesian(point0), cartesian(point1));
17422           cartesianNormalizeInPlace(arc);
17423           var intersection = cartesianCross(normal, arc);
17424           cartesianNormalizeInPlace(intersection);
17425           var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
17426           if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
17427             winding += antimeridian ^ delta >= 0 ? 1 : -1;
17428           }
17429         }
17430       }
17431     }
17432     return (angle2 < -epsilon || angle2 < epsilon && sum < -epsilon2) ^ winding & 1;
17433   }
17434
17435   // node_modules/d3-geo/src/clip/index.js
17436   function clip_default(pointVisible, clipLine, interpolate, start2) {
17437     return function(sink) {
17438       var line = clipLine(sink), ringBuffer = buffer_default(), ringSink = clipLine(ringBuffer), polygonStarted = false, polygon2, segments, ring;
17439       var clip = {
17440         point: point2,
17441         lineStart,
17442         lineEnd,
17443         polygonStart: function() {
17444           clip.point = pointRing;
17445           clip.lineStart = ringStart;
17446           clip.lineEnd = ringEnd;
17447           segments = [];
17448           polygon2 = [];
17449         },
17450         polygonEnd: function() {
17451           clip.point = point2;
17452           clip.lineStart = lineStart;
17453           clip.lineEnd = lineEnd;
17454           segments = merge(segments);
17455           var startInside = polygonContains_default(polygon2, start2);
17456           if (segments.length) {
17457             if (!polygonStarted)
17458               sink.polygonStart(), polygonStarted = true;
17459             rejoin_default(segments, compareIntersection, startInside, interpolate, sink);
17460           } else if (startInside) {
17461             if (!polygonStarted)
17462               sink.polygonStart(), polygonStarted = true;
17463             sink.lineStart();
17464             interpolate(null, null, 1, sink);
17465             sink.lineEnd();
17466           }
17467           if (polygonStarted)
17468             sink.polygonEnd(), polygonStarted = false;
17469           segments = polygon2 = null;
17470         },
17471         sphere: function() {
17472           sink.polygonStart();
17473           sink.lineStart();
17474           interpolate(null, null, 1, sink);
17475           sink.lineEnd();
17476           sink.polygonEnd();
17477         }
17478       };
17479       function point2(lambda, phi) {
17480         if (pointVisible(lambda, phi))
17481           sink.point(lambda, phi);
17482       }
17483       function pointLine(lambda, phi) {
17484         line.point(lambda, phi);
17485       }
17486       function lineStart() {
17487         clip.point = pointLine;
17488         line.lineStart();
17489       }
17490       function lineEnd() {
17491         clip.point = point2;
17492         line.lineEnd();
17493       }
17494       function pointRing(lambda, phi) {
17495         ring.push([lambda, phi]);
17496         ringSink.point(lambda, phi);
17497       }
17498       function ringStart() {
17499         ringSink.lineStart();
17500         ring = [];
17501       }
17502       function ringEnd() {
17503         pointRing(ring[0][0], ring[0][1]);
17504         ringSink.lineEnd();
17505         var clean2 = ringSink.clean(), ringSegments = ringBuffer.result(), i2, n2 = ringSegments.length, m, segment, point3;
17506         ring.pop();
17507         polygon2.push(ring);
17508         ring = null;
17509         if (!n2)
17510           return;
17511         if (clean2 & 1) {
17512           segment = ringSegments[0];
17513           if ((m = segment.length - 1) > 0) {
17514             if (!polygonStarted)
17515               sink.polygonStart(), polygonStarted = true;
17516             sink.lineStart();
17517             for (i2 = 0; i2 < m; ++i2)
17518               sink.point((point3 = segment[i2])[0], point3[1]);
17519             sink.lineEnd();
17520           }
17521           return;
17522         }
17523         if (n2 > 1 && clean2 & 2)
17524           ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
17525         segments.push(ringSegments.filter(validSegment));
17526       }
17527       return clip;
17528     };
17529   }
17530   function validSegment(segment) {
17531     return segment.length > 1;
17532   }
17533   function compareIntersection(a, b) {
17534     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]);
17535   }
17536
17537   // node_modules/d3-geo/src/clip/antimeridian.js
17538   var antimeridian_default = clip_default(
17539     function() {
17540       return true;
17541     },
17542     clipAntimeridianLine,
17543     clipAntimeridianInterpolate,
17544     [-pi, -halfPi]
17545   );
17546   function clipAntimeridianLine(stream) {
17547     var lambda04 = NaN, phi02 = NaN, sign0 = NaN, clean2;
17548     return {
17549       lineStart: function() {
17550         stream.lineStart();
17551         clean2 = 1;
17552       },
17553       point: function(lambda12, phi12) {
17554         var sign1 = lambda12 > 0 ? pi : -pi, delta = abs(lambda12 - lambda04);
17555         if (abs(delta - pi) < epsilon) {
17556           stream.point(lambda04, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi : -halfPi);
17557           stream.point(sign0, phi02);
17558           stream.lineEnd();
17559           stream.lineStart();
17560           stream.point(sign1, phi02);
17561           stream.point(lambda12, phi02);
17562           clean2 = 0;
17563         } else if (sign0 !== sign1 && delta >= pi) {
17564           if (abs(lambda04 - sign0) < epsilon)
17565             lambda04 -= sign0 * epsilon;
17566           if (abs(lambda12 - sign1) < epsilon)
17567             lambda12 -= sign1 * epsilon;
17568           phi02 = clipAntimeridianIntersect(lambda04, phi02, lambda12, phi12);
17569           stream.point(sign0, phi02);
17570           stream.lineEnd();
17571           stream.lineStart();
17572           stream.point(sign1, phi02);
17573           clean2 = 0;
17574         }
17575         stream.point(lambda04 = lambda12, phi02 = phi12);
17576         sign0 = sign1;
17577       },
17578       lineEnd: function() {
17579         stream.lineEnd();
17580         lambda04 = phi02 = NaN;
17581       },
17582       clean: function() {
17583         return 2 - clean2;
17584       }
17585     };
17586   }
17587   function clipAntimeridianIntersect(lambda04, phi02, lambda12, phi12) {
17588     var cosPhi03, cosPhi1, sinLambda0Lambda1 = sin(lambda04 - lambda12);
17589     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;
17590   }
17591   function clipAntimeridianInterpolate(from, to, direction, stream) {
17592     var phi;
17593     if (from == null) {
17594       phi = direction * halfPi;
17595       stream.point(-pi, phi);
17596       stream.point(0, phi);
17597       stream.point(pi, phi);
17598       stream.point(pi, 0);
17599       stream.point(pi, -phi);
17600       stream.point(0, -phi);
17601       stream.point(-pi, -phi);
17602       stream.point(-pi, 0);
17603       stream.point(-pi, phi);
17604     } else if (abs(from[0] - to[0]) > epsilon) {
17605       var lambda = from[0] < to[0] ? pi : -pi;
17606       phi = direction * lambda / 2;
17607       stream.point(-lambda, phi);
17608       stream.point(0, phi);
17609       stream.point(lambda, phi);
17610     } else {
17611       stream.point(to[0], to[1]);
17612     }
17613   }
17614
17615   // node_modules/d3-geo/src/clip/circle.js
17616   function circle_default(radius) {
17617     var cr = cos(radius), delta = 6 * radians, smallRadius = cr > 0, notHemisphere = abs(cr) > epsilon;
17618     function interpolate(from, to, direction, stream) {
17619       circleStream(stream, radius, delta, direction, from, to);
17620     }
17621     function visible(lambda, phi) {
17622       return cos(lambda) * cos(phi) > cr;
17623     }
17624     function clipLine(stream) {
17625       var point0, c0, v0, v00, clean2;
17626       return {
17627         lineStart: function() {
17628           v00 = v0 = false;
17629           clean2 = 1;
17630         },
17631         point: function(lambda, phi) {
17632           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;
17633           if (!point0 && (v00 = v0 = v))
17634             stream.lineStart();
17635           if (v !== v0) {
17636             point2 = intersect2(point0, point1);
17637             if (!point2 || pointEqual_default(point0, point2) || pointEqual_default(point1, point2))
17638               point1[2] = 1;
17639           }
17640           if (v !== v0) {
17641             clean2 = 0;
17642             if (v) {
17643               stream.lineStart();
17644               point2 = intersect2(point1, point0);
17645               stream.point(point2[0], point2[1]);
17646             } else {
17647               point2 = intersect2(point0, point1);
17648               stream.point(point2[0], point2[1], 2);
17649               stream.lineEnd();
17650             }
17651             point0 = point2;
17652           } else if (notHemisphere && point0 && smallRadius ^ v) {
17653             var t;
17654             if (!(c & c0) && (t = intersect2(point1, point0, true))) {
17655               clean2 = 0;
17656               if (smallRadius) {
17657                 stream.lineStart();
17658                 stream.point(t[0][0], t[0][1]);
17659                 stream.point(t[1][0], t[1][1]);
17660                 stream.lineEnd();
17661               } else {
17662                 stream.point(t[1][0], t[1][1]);
17663                 stream.lineEnd();
17664                 stream.lineStart();
17665                 stream.point(t[0][0], t[0][1], 3);
17666               }
17667             }
17668           }
17669           if (v && (!point0 || !pointEqual_default(point0, point1))) {
17670             stream.point(point1[0], point1[1]);
17671           }
17672           point0 = point1, v0 = v, c0 = c;
17673         },
17674         lineEnd: function() {
17675           if (v0)
17676             stream.lineEnd();
17677           point0 = null;
17678         },
17679         // Rejoin first and last segments if there were intersections and the first
17680         // and last points were visible.
17681         clean: function() {
17682           return clean2 | (v00 && v0) << 1;
17683         }
17684       };
17685     }
17686     function intersect2(a, b, two) {
17687       var pa = cartesian(a), pb = cartesian(b);
17688       var n1 = [1, 0, 0], n2 = cartesianCross(pa, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
17689       if (!determinant)
17690         return !two && a;
17691       var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A = cartesianScale(n1, c1), B = cartesianScale(n2, c2);
17692       cartesianAddInPlace(A, B);
17693       var u = n1xn2, w = cartesianDot(A, u), uu = cartesianDot(u, u), t2 = w * w - uu * (cartesianDot(A, A) - 1);
17694       if (t2 < 0)
17695         return;
17696       var t = sqrt(t2), q = cartesianScale(u, (-w - t) / uu);
17697       cartesianAddInPlace(q, A);
17698       q = spherical(q);
17699       if (!two)
17700         return q;
17701       var lambda04 = a[0], lambda12 = b[0], phi02 = a[1], phi12 = b[1], z;
17702       if (lambda12 < lambda04)
17703         z = lambda04, lambda04 = lambda12, lambda12 = z;
17704       var delta2 = lambda12 - lambda04, polar = abs(delta2 - pi) < epsilon, meridian = polar || delta2 < epsilon;
17705       if (!polar && phi12 < phi02)
17706         z = phi02, phi02 = phi12, phi12 = z;
17707       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)) {
17708         var q1 = cartesianScale(u, (-w + t) / uu);
17709         cartesianAddInPlace(q1, A);
17710         return [q, spherical(q1)];
17711       }
17712     }
17713     function code(lambda, phi) {
17714       var r = smallRadius ? radius : pi - radius, code2 = 0;
17715       if (lambda < -r)
17716         code2 |= 1;
17717       else if (lambda > r)
17718         code2 |= 2;
17719       if (phi < -r)
17720         code2 |= 4;
17721       else if (phi > r)
17722         code2 |= 8;
17723       return code2;
17724     }
17725     return clip_default(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);
17726   }
17727
17728   // node_modules/d3-geo/src/clip/line.js
17729   function line_default(a, b, x05, y05, x12, y12) {
17730     var ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
17731     r = x05 - ax;
17732     if (!dx && r > 0)
17733       return;
17734     r /= dx;
17735     if (dx < 0) {
17736       if (r < t0)
17737         return;
17738       if (r < t1)
17739         t1 = r;
17740     } else if (dx > 0) {
17741       if (r > t1)
17742         return;
17743       if (r > t0)
17744         t0 = r;
17745     }
17746     r = x12 - ax;
17747     if (!dx && r < 0)
17748       return;
17749     r /= dx;
17750     if (dx < 0) {
17751       if (r > t1)
17752         return;
17753       if (r > t0)
17754         t0 = r;
17755     } else if (dx > 0) {
17756       if (r < t0)
17757         return;
17758       if (r < t1)
17759         t1 = r;
17760     }
17761     r = y05 - ay;
17762     if (!dy && r > 0)
17763       return;
17764     r /= dy;
17765     if (dy < 0) {
17766       if (r < t0)
17767         return;
17768       if (r < t1)
17769         t1 = r;
17770     } else if (dy > 0) {
17771       if (r > t1)
17772         return;
17773       if (r > t0)
17774         t0 = r;
17775     }
17776     r = y12 - ay;
17777     if (!dy && r < 0)
17778       return;
17779     r /= dy;
17780     if (dy < 0) {
17781       if (r > t1)
17782         return;
17783       if (r > t0)
17784         t0 = r;
17785     } else if (dy > 0) {
17786       if (r < t0)
17787         return;
17788       if (r < t1)
17789         t1 = r;
17790     }
17791     if (t0 > 0)
17792       a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
17793     if (t1 < 1)
17794       b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
17795     return true;
17796   }
17797
17798   // node_modules/d3-geo/src/clip/rectangle.js
17799   var clipMax = 1e9;
17800   var clipMin = -clipMax;
17801   function clipRectangle(x05, y05, x12, y12) {
17802     function visible(x, y) {
17803       return x05 <= x && x <= x12 && y05 <= y && y <= y12;
17804     }
17805     function interpolate(from, to, direction, stream) {
17806       var a = 0, a1 = 0;
17807       if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {
17808         do
17809           stream.point(a === 0 || a === 3 ? x05 : x12, a > 1 ? y12 : y05);
17810         while ((a = (a + direction + 4) % 4) !== a1);
17811       } else {
17812         stream.point(to[0], to[1]);
17813       }
17814     }
17815     function corner(p, direction) {
17816       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;
17817     }
17818     function compareIntersection2(a, b) {
17819       return comparePoint(a.x, b.x);
17820     }
17821     function comparePoint(a, b) {
17822       var ca = corner(a, 1), cb = corner(b, 1);
17823       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];
17824     }
17825     return function(stream) {
17826       var activeStream = stream, bufferStream = buffer_default(), segments, polygon2, ring, x__, y__, v__, x_, y_, v_, first, clean2;
17827       var clipStream = {
17828         point: point2,
17829         lineStart,
17830         lineEnd,
17831         polygonStart,
17832         polygonEnd
17833       };
17834       function point2(x, y) {
17835         if (visible(x, y))
17836           activeStream.point(x, y);
17837       }
17838       function polygonInside() {
17839         var winding = 0;
17840         for (var i2 = 0, n2 = polygon2.length; i2 < n2; ++i2) {
17841           for (var ring2 = polygon2[i2], j2 = 1, m = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j2 < m; ++j2) {
17842             a0 = b0, a1 = b1, point3 = ring2[j2], b0 = point3[0], b1 = point3[1];
17843             if (a1 <= y12) {
17844               if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x05 - a0))
17845                 ++winding;
17846             } else {
17847               if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x05 - a0))
17848                 --winding;
17849             }
17850           }
17851         }
17852         return winding;
17853       }
17854       function polygonStart() {
17855         activeStream = bufferStream, segments = [], polygon2 = [], clean2 = true;
17856       }
17857       function polygonEnd() {
17858         var startInside = polygonInside(), cleanInside = clean2 && startInside, visible2 = (segments = merge(segments)).length;
17859         if (cleanInside || visible2) {
17860           stream.polygonStart();
17861           if (cleanInside) {
17862             stream.lineStart();
17863             interpolate(null, null, 1, stream);
17864             stream.lineEnd();
17865           }
17866           if (visible2) {
17867             rejoin_default(segments, compareIntersection2, startInside, interpolate, stream);
17868           }
17869           stream.polygonEnd();
17870         }
17871         activeStream = stream, segments = polygon2 = ring = null;
17872       }
17873       function lineStart() {
17874         clipStream.point = linePoint2;
17875         if (polygon2)
17876           polygon2.push(ring = []);
17877         first = true;
17878         v_ = false;
17879         x_ = y_ = NaN;
17880       }
17881       function lineEnd() {
17882         if (segments) {
17883           linePoint2(x__, y__);
17884           if (v__ && v_)
17885             bufferStream.rejoin();
17886           segments.push(bufferStream.result());
17887         }
17888         clipStream.point = point2;
17889         if (v_)
17890           activeStream.lineEnd();
17891       }
17892       function linePoint2(x, y) {
17893         var v = visible(x, y);
17894         if (polygon2)
17895           ring.push([x, y]);
17896         if (first) {
17897           x__ = x, y__ = y, v__ = v;
17898           first = false;
17899           if (v) {
17900             activeStream.lineStart();
17901             activeStream.point(x, y);
17902           }
17903         } else {
17904           if (v && v_)
17905             activeStream.point(x, y);
17906           else {
17907             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))];
17908             if (line_default(a, b, x05, y05, x12, y12)) {
17909               if (!v_) {
17910                 activeStream.lineStart();
17911                 activeStream.point(a[0], a[1]);
17912               }
17913               activeStream.point(b[0], b[1]);
17914               if (!v)
17915                 activeStream.lineEnd();
17916               clean2 = false;
17917             } else if (v) {
17918               activeStream.lineStart();
17919               activeStream.point(x, y);
17920               clean2 = false;
17921             }
17922           }
17923         }
17924         x_ = x, y_ = y, v_ = v;
17925       }
17926       return clipStream;
17927     };
17928   }
17929
17930   // node_modules/d3-geo/src/length.js
17931   var lengthSum;
17932   var lambda03;
17933   var sinPhi02;
17934   var cosPhi02;
17935   var lengthStream = {
17936     sphere: noop,
17937     point: noop,
17938     lineStart: lengthLineStart,
17939     lineEnd: noop,
17940     polygonStart: noop,
17941     polygonEnd: noop
17942   };
17943   function lengthLineStart() {
17944     lengthStream.point = lengthPointFirst;
17945     lengthStream.lineEnd = lengthLineEnd;
17946   }
17947   function lengthLineEnd() {
17948     lengthStream.point = lengthStream.lineEnd = noop;
17949   }
17950   function lengthPointFirst(lambda, phi) {
17951     lambda *= radians, phi *= radians;
17952     lambda03 = lambda, sinPhi02 = sin(phi), cosPhi02 = cos(phi);
17953     lengthStream.point = lengthPoint;
17954   }
17955   function lengthPoint(lambda, phi) {
17956     lambda *= radians, phi *= radians;
17957     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;
17958     lengthSum.add(atan2(sqrt(x * x + y * y), z));
17959     lambda03 = lambda, sinPhi02 = sinPhi, cosPhi02 = cosPhi;
17960   }
17961   function length_default(object) {
17962     lengthSum = new Adder();
17963     stream_default(object, lengthStream);
17964     return +lengthSum;
17965   }
17966
17967   // node_modules/d3-geo/src/identity.js
17968   var identity_default = (x) => x;
17969
17970   // node_modules/d3-geo/src/path/area.js
17971   var areaSum2 = new Adder();
17972   var areaRingSum2 = new Adder();
17973   var x00;
17974   var y00;
17975   var x0;
17976   var y0;
17977   var areaStream2 = {
17978     point: noop,
17979     lineStart: noop,
17980     lineEnd: noop,
17981     polygonStart: function() {
17982       areaStream2.lineStart = areaRingStart2;
17983       areaStream2.lineEnd = areaRingEnd2;
17984     },
17985     polygonEnd: function() {
17986       areaStream2.lineStart = areaStream2.lineEnd = areaStream2.point = noop;
17987       areaSum2.add(abs(areaRingSum2));
17988       areaRingSum2 = new Adder();
17989     },
17990     result: function() {
17991       var area = areaSum2 / 2;
17992       areaSum2 = new Adder();
17993       return area;
17994     }
17995   };
17996   function areaRingStart2() {
17997     areaStream2.point = areaPointFirst2;
17998   }
17999   function areaPointFirst2(x, y) {
18000     areaStream2.point = areaPoint2;
18001     x00 = x0 = x, y00 = y0 = y;
18002   }
18003   function areaPoint2(x, y) {
18004     areaRingSum2.add(y0 * x - x0 * y);
18005     x0 = x, y0 = y;
18006   }
18007   function areaRingEnd2() {
18008     areaPoint2(x00, y00);
18009   }
18010   var area_default2 = areaStream2;
18011
18012   // node_modules/d3-geo/src/path/bounds.js
18013   var x02 = Infinity;
18014   var y02 = x02;
18015   var x1 = -x02;
18016   var y1 = x1;
18017   var boundsStream2 = {
18018     point: boundsPoint2,
18019     lineStart: noop,
18020     lineEnd: noop,
18021     polygonStart: noop,
18022     polygonEnd: noop,
18023     result: function() {
18024       var bounds = [[x02, y02], [x1, y1]];
18025       x1 = y1 = -(y02 = x02 = Infinity);
18026       return bounds;
18027     }
18028   };
18029   function boundsPoint2(x, y) {
18030     if (x < x02)
18031       x02 = x;
18032     if (x > x1)
18033       x1 = x;
18034     if (y < y02)
18035       y02 = y;
18036     if (y > y1)
18037       y1 = y;
18038   }
18039   var bounds_default2 = boundsStream2;
18040
18041   // node_modules/d3-geo/src/path/centroid.js
18042   var X0 = 0;
18043   var Y0 = 0;
18044   var Z0 = 0;
18045   var X1 = 0;
18046   var Y1 = 0;
18047   var Z1 = 0;
18048   var X2 = 0;
18049   var Y2 = 0;
18050   var Z2 = 0;
18051   var x002;
18052   var y002;
18053   var x03;
18054   var y03;
18055   var centroidStream = {
18056     point: centroidPoint,
18057     lineStart: centroidLineStart,
18058     lineEnd: centroidLineEnd,
18059     polygonStart: function() {
18060       centroidStream.lineStart = centroidRingStart;
18061       centroidStream.lineEnd = centroidRingEnd;
18062     },
18063     polygonEnd: function() {
18064       centroidStream.point = centroidPoint;
18065       centroidStream.lineStart = centroidLineStart;
18066       centroidStream.lineEnd = centroidLineEnd;
18067     },
18068     result: function() {
18069       var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];
18070       X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;
18071       return centroid;
18072     }
18073   };
18074   function centroidPoint(x, y) {
18075     X0 += x;
18076     Y0 += y;
18077     ++Z0;
18078   }
18079   function centroidLineStart() {
18080     centroidStream.point = centroidPointFirstLine;
18081   }
18082   function centroidPointFirstLine(x, y) {
18083     centroidStream.point = centroidPointLine;
18084     centroidPoint(x03 = x, y03 = y);
18085   }
18086   function centroidPointLine(x, y) {
18087     var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy);
18088     X1 += z * (x03 + x) / 2;
18089     Y1 += z * (y03 + y) / 2;
18090     Z1 += z;
18091     centroidPoint(x03 = x, y03 = y);
18092   }
18093   function centroidLineEnd() {
18094     centroidStream.point = centroidPoint;
18095   }
18096   function centroidRingStart() {
18097     centroidStream.point = centroidPointFirstRing;
18098   }
18099   function centroidRingEnd() {
18100     centroidPointRing(x002, y002);
18101   }
18102   function centroidPointFirstRing(x, y) {
18103     centroidStream.point = centroidPointRing;
18104     centroidPoint(x002 = x03 = x, y002 = y03 = y);
18105   }
18106   function centroidPointRing(x, y) {
18107     var dx = x - x03, dy = y - y03, z = sqrt(dx * dx + dy * dy);
18108     X1 += z * (x03 + x) / 2;
18109     Y1 += z * (y03 + y) / 2;
18110     Z1 += z;
18111     z = y03 * x - x03 * y;
18112     X2 += z * (x03 + x);
18113     Y2 += z * (y03 + y);
18114     Z2 += z * 3;
18115     centroidPoint(x03 = x, y03 = y);
18116   }
18117   var centroid_default = centroidStream;
18118
18119   // node_modules/d3-geo/src/path/context.js
18120   function PathContext(context) {
18121     this._context = context;
18122   }
18123   PathContext.prototype = {
18124     _radius: 4.5,
18125     pointRadius: function(_) {
18126       return this._radius = _, this;
18127     },
18128     polygonStart: function() {
18129       this._line = 0;
18130     },
18131     polygonEnd: function() {
18132       this._line = NaN;
18133     },
18134     lineStart: function() {
18135       this._point = 0;
18136     },
18137     lineEnd: function() {
18138       if (this._line === 0)
18139         this._context.closePath();
18140       this._point = NaN;
18141     },
18142     point: function(x, y) {
18143       switch (this._point) {
18144         case 0: {
18145           this._context.moveTo(x, y);
18146           this._point = 1;
18147           break;
18148         }
18149         case 1: {
18150           this._context.lineTo(x, y);
18151           break;
18152         }
18153         default: {
18154           this._context.moveTo(x + this._radius, y);
18155           this._context.arc(x, y, this._radius, 0, tau);
18156           break;
18157         }
18158       }
18159     },
18160     result: noop
18161   };
18162
18163   // node_modules/d3-geo/src/path/measure.js
18164   var lengthSum2 = new Adder();
18165   var lengthRing;
18166   var x003;
18167   var y003;
18168   var x04;
18169   var y04;
18170   var lengthStream2 = {
18171     point: noop,
18172     lineStart: function() {
18173       lengthStream2.point = lengthPointFirst2;
18174     },
18175     lineEnd: function() {
18176       if (lengthRing)
18177         lengthPoint2(x003, y003);
18178       lengthStream2.point = noop;
18179     },
18180     polygonStart: function() {
18181       lengthRing = true;
18182     },
18183     polygonEnd: function() {
18184       lengthRing = null;
18185     },
18186     result: function() {
18187       var length = +lengthSum2;
18188       lengthSum2 = new Adder();
18189       return length;
18190     }
18191   };
18192   function lengthPointFirst2(x, y) {
18193     lengthStream2.point = lengthPoint2;
18194     x003 = x04 = x, y003 = y04 = y;
18195   }
18196   function lengthPoint2(x, y) {
18197     x04 -= x, y04 -= y;
18198     lengthSum2.add(sqrt(x04 * x04 + y04 * y04));
18199     x04 = x, y04 = y;
18200   }
18201   var measure_default = lengthStream2;
18202
18203   // node_modules/d3-geo/src/path/string.js
18204   function PathString() {
18205     this._string = [];
18206   }
18207   PathString.prototype = {
18208     _radius: 4.5,
18209     _circle: circle(4.5),
18210     pointRadius: function(_) {
18211       if ((_ = +_) !== this._radius)
18212         this._radius = _, this._circle = null;
18213       return this;
18214     },
18215     polygonStart: function() {
18216       this._line = 0;
18217     },
18218     polygonEnd: function() {
18219       this._line = NaN;
18220     },
18221     lineStart: function() {
18222       this._point = 0;
18223     },
18224     lineEnd: function() {
18225       if (this._line === 0)
18226         this._string.push("Z");
18227       this._point = NaN;
18228     },
18229     point: function(x, y) {
18230       switch (this._point) {
18231         case 0: {
18232           this._string.push("M", x, ",", y);
18233           this._point = 1;
18234           break;
18235         }
18236         case 1: {
18237           this._string.push("L", x, ",", y);
18238           break;
18239         }
18240         default: {
18241           if (this._circle == null)
18242             this._circle = circle(this._radius);
18243           this._string.push("M", x, ",", y, this._circle);
18244           break;
18245         }
18246       }
18247     },
18248     result: function() {
18249       if (this._string.length) {
18250         var result = this._string.join("");
18251         this._string = [];
18252         return result;
18253       } else {
18254         return null;
18255       }
18256     }
18257   };
18258   function circle(radius) {
18259     return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
18260   }
18261
18262   // node_modules/d3-geo/src/path/index.js
18263   function path_default(projection2, context) {
18264     var pointRadius = 4.5, projectionStream, contextStream;
18265     function path(object) {
18266       if (object) {
18267         if (typeof pointRadius === "function")
18268           contextStream.pointRadius(+pointRadius.apply(this, arguments));
18269         stream_default(object, projectionStream(contextStream));
18270       }
18271       return contextStream.result();
18272     }
18273     path.area = function(object) {
18274       stream_default(object, projectionStream(area_default2));
18275       return area_default2.result();
18276     };
18277     path.measure = function(object) {
18278       stream_default(object, projectionStream(measure_default));
18279       return measure_default.result();
18280     };
18281     path.bounds = function(object) {
18282       stream_default(object, projectionStream(bounds_default2));
18283       return bounds_default2.result();
18284     };
18285     path.centroid = function(object) {
18286       stream_default(object, projectionStream(centroid_default));
18287       return centroid_default.result();
18288     };
18289     path.projection = function(_) {
18290       return arguments.length ? (projectionStream = _ == null ? (projection2 = null, identity_default) : (projection2 = _).stream, path) : projection2;
18291     };
18292     path.context = function(_) {
18293       if (!arguments.length)
18294         return context;
18295       contextStream = _ == null ? (context = null, new PathString()) : new PathContext(context = _);
18296       if (typeof pointRadius !== "function")
18297         contextStream.pointRadius(pointRadius);
18298       return path;
18299     };
18300     path.pointRadius = function(_) {
18301       if (!arguments.length)
18302         return pointRadius;
18303       pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
18304       return path;
18305     };
18306     return path.projection(projection2).context(context);
18307   }
18308
18309   // node_modules/d3-geo/src/transform.js
18310   function transform_default(methods2) {
18311     return {
18312       stream: transformer(methods2)
18313     };
18314   }
18315   function transformer(methods2) {
18316     return function(stream) {
18317       var s = new TransformStream();
18318       for (var key in methods2)
18319         s[key] = methods2[key];
18320       s.stream = stream;
18321       return s;
18322     };
18323   }
18324   function TransformStream() {
18325   }
18326   TransformStream.prototype = {
18327     constructor: TransformStream,
18328     point: function(x, y) {
18329       this.stream.point(x, y);
18330     },
18331     sphere: function() {
18332       this.stream.sphere();
18333     },
18334     lineStart: function() {
18335       this.stream.lineStart();
18336     },
18337     lineEnd: function() {
18338       this.stream.lineEnd();
18339     },
18340     polygonStart: function() {
18341       this.stream.polygonStart();
18342     },
18343     polygonEnd: function() {
18344       this.stream.polygonEnd();
18345     }
18346   };
18347
18348   // node_modules/d3-geo/src/projection/fit.js
18349   function fit(projection2, fitBounds, object) {
18350     var clip = projection2.clipExtent && projection2.clipExtent();
18351     projection2.scale(150).translate([0, 0]);
18352     if (clip != null)
18353       projection2.clipExtent(null);
18354     stream_default(object, projection2.stream(bounds_default2));
18355     fitBounds(bounds_default2.result());
18356     if (clip != null)
18357       projection2.clipExtent(clip);
18358     return projection2;
18359   }
18360   function fitExtent(projection2, extent, object) {
18361     return fit(projection2, function(b) {
18362       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;
18363       projection2.scale(150 * k).translate([x, y]);
18364     }, object);
18365   }
18366   function fitSize(projection2, size, object) {
18367     return fitExtent(projection2, [[0, 0], size], object);
18368   }
18369   function fitWidth(projection2, width, object) {
18370     return fit(projection2, function(b) {
18371       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];
18372       projection2.scale(150 * k).translate([x, y]);
18373     }, object);
18374   }
18375   function fitHeight(projection2, height, object) {
18376     return fit(projection2, function(b) {
18377       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;
18378       projection2.scale(150 * k).translate([x, y]);
18379     }, object);
18380   }
18381
18382   // node_modules/d3-geo/src/projection/resample.js
18383   var maxDepth = 16;
18384   var cosMinDistance = cos(30 * radians);
18385   function resample_default(project, delta2) {
18386     return +delta2 ? resample(project, delta2) : resampleNone(project);
18387   }
18388   function resampleNone(project) {
18389     return transformer({
18390       point: function(x, y) {
18391         x = project(x, y);
18392         this.stream.point(x[0], x[1]);
18393       }
18394     });
18395   }
18396   function resample(project, delta2) {
18397     function resampleLineTo(x05, y05, lambda04, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream) {
18398       var dx = x12 - x05, dy = y12 - y05, d2 = dx * dx + dy * dy;
18399       if (d2 > 4 * delta2 && depth--) {
18400         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;
18401         if (dz * dz / d2 > delta2 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
18402           resampleLineTo(x05, y05, lambda04, a0, b0, c0, x2, y2, lambda22, a /= m, b /= m, c, depth, stream);
18403           stream.point(x2, y2);
18404           resampleLineTo(x2, y2, lambda22, a, b, c, x12, y12, lambda12, a1, b1, c1, depth, stream);
18405         }
18406       }
18407     }
18408     return function(stream) {
18409       var lambda003, x004, y004, a00, b00, c00, lambda04, x05, y05, a0, b0, c0;
18410       var resampleStream = {
18411         point: point2,
18412         lineStart,
18413         lineEnd,
18414         polygonStart: function() {
18415           stream.polygonStart();
18416           resampleStream.lineStart = ringStart;
18417         },
18418         polygonEnd: function() {
18419           stream.polygonEnd();
18420           resampleStream.lineStart = lineStart;
18421         }
18422       };
18423       function point2(x, y) {
18424         x = project(x, y);
18425         stream.point(x[0], x[1]);
18426       }
18427       function lineStart() {
18428         x05 = NaN;
18429         resampleStream.point = linePoint2;
18430         stream.lineStart();
18431       }
18432       function linePoint2(lambda, phi) {
18433         var c = cartesian([lambda, phi]), p = project(lambda, phi);
18434         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);
18435         stream.point(x05, y05);
18436       }
18437       function lineEnd() {
18438         resampleStream.point = point2;
18439         stream.lineEnd();
18440       }
18441       function ringStart() {
18442         lineStart();
18443         resampleStream.point = ringPoint;
18444         resampleStream.lineEnd = ringEnd;
18445       }
18446       function ringPoint(lambda, phi) {
18447         linePoint2(lambda003 = lambda, phi), x004 = x05, y004 = y05, a00 = a0, b00 = b0, c00 = c0;
18448         resampleStream.point = linePoint2;
18449       }
18450       function ringEnd() {
18451         resampleLineTo(x05, y05, lambda04, a0, b0, c0, x004, y004, lambda003, a00, b00, c00, maxDepth, stream);
18452         resampleStream.lineEnd = lineEnd;
18453         lineEnd();
18454       }
18455       return resampleStream;
18456     };
18457   }
18458
18459   // node_modules/d3-geo/src/projection/index.js
18460   var transformRadians = transformer({
18461     point: function(x, y) {
18462       this.stream.point(x * radians, y * radians);
18463     }
18464   });
18465   function transformRotate(rotate) {
18466     return transformer({
18467       point: function(x, y) {
18468         var r = rotate(x, y);
18469         return this.stream.point(r[0], r[1]);
18470       }
18471     });
18472   }
18473   function scaleTranslate(k, dx, dy, sx, sy) {
18474     function transform2(x, y) {
18475       x *= sx;
18476       y *= sy;
18477       return [dx + k * x, dy - k * y];
18478     }
18479     transform2.invert = function(x, y) {
18480       return [(x - dx) / k * sx, (dy - y) / k * sy];
18481     };
18482     return transform2;
18483   }
18484   function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {
18485     if (!alpha)
18486       return scaleTranslate(k, dx, dy, sx, sy);
18487     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;
18488     function transform2(x, y) {
18489       x *= sx;
18490       y *= sy;
18491       return [a * x - b * y + dx, dy - b * x - a * y];
18492     }
18493     transform2.invert = function(x, y) {
18494       return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];
18495     };
18496     return transform2;
18497   }
18498   function projection(project) {
18499     return projectionMutator(function() {
18500       return project;
18501     })();
18502   }
18503   function projectionMutator(projectAt) {
18504     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;
18505     function projection2(point2) {
18506       return projectRotateTransform(point2[0] * radians, point2[1] * radians);
18507     }
18508     function invert(point2) {
18509       point2 = projectRotateTransform.invert(point2[0], point2[1]);
18510       return point2 && [point2[0] * degrees, point2[1] * degrees];
18511     }
18512     projection2.stream = function(stream) {
18513       return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
18514     };
18515     projection2.preclip = function(_) {
18516       return arguments.length ? (preclip = _, theta = void 0, reset()) : preclip;
18517     };
18518     projection2.postclip = function(_) {
18519       return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip;
18520     };
18521     projection2.clipAngle = function(_) {
18522       return arguments.length ? (preclip = +_ ? circle_default(theta = _ * radians) : (theta = null, antimeridian_default), reset()) : theta * degrees;
18523     };
18524     projection2.clipExtent = function(_) {
18525       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]];
18526     };
18527     projection2.scale = function(_) {
18528       return arguments.length ? (k = +_, recenter()) : k;
18529     };
18530     projection2.translate = function(_) {
18531       return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
18532     };
18533     projection2.center = function(_) {
18534       return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];
18535     };
18536     projection2.rotate = function(_) {
18537       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];
18538     };
18539     projection2.angle = function(_) {
18540       return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;
18541     };
18542     projection2.reflectX = function(_) {
18543       return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;
18544     };
18545     projection2.reflectY = function(_) {
18546       return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;
18547     };
18548     projection2.precision = function(_) {
18549       return arguments.length ? (projectResample = resample_default(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
18550     };
18551     projection2.fitExtent = function(extent, object) {
18552       return fitExtent(projection2, extent, object);
18553     };
18554     projection2.fitSize = function(size, object) {
18555       return fitSize(projection2, size, object);
18556     };
18557     projection2.fitWidth = function(width, object) {
18558       return fitWidth(projection2, width, object);
18559     };
18560     projection2.fitHeight = function(height, object) {
18561       return fitHeight(projection2, height, object);
18562     };
18563     function recenter() {
18564       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);
18565       rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
18566       projectTransform = compose_default(project, transform2);
18567       projectRotateTransform = compose_default(rotate, projectTransform);
18568       projectResample = resample_default(projectTransform, delta2);
18569       return reset();
18570     }
18571     function reset() {
18572       cache = cacheStream = null;
18573       return projection2;
18574     }
18575     return function() {
18576       project = projectAt.apply(this, arguments);
18577       projection2.invert = project.invert && invert;
18578       return recenter();
18579     };
18580   }
18581
18582   // node_modules/d3-geo/src/projection/mercator.js
18583   function mercatorRaw(lambda, phi) {
18584     return [lambda, log(tan((halfPi + phi) / 2))];
18585   }
18586   mercatorRaw.invert = function(x, y) {
18587     return [x, 2 * atan(exp(y)) - halfPi];
18588   };
18589   function mercator_default() {
18590     return mercatorProjection(mercatorRaw).scale(961 / tau);
18591   }
18592   function mercatorProjection(project) {
18593     var m = projection(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x05 = null, y05, x12, y12;
18594     m.scale = function(_) {
18595       return arguments.length ? (scale(_), reclip()) : scale();
18596     };
18597     m.translate = function(_) {
18598       return arguments.length ? (translate(_), reclip()) : translate();
18599     };
18600     m.center = function(_) {
18601       return arguments.length ? (center(_), reclip()) : center();
18602     };
18603     m.clipExtent = function(_) {
18604       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]];
18605     };
18606     function reclip() {
18607       var k = pi * scale(), t = m(rotation_default(m.rotate()).invert([0, 0]));
18608       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)]]);
18609     }
18610     return reclip();
18611   }
18612
18613   // node_modules/d3-geo/src/projection/identity.js
18614   function identity_default2() {
18615     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({
18616       point: function(x, y) {
18617         var p = projection2([x, y]);
18618         this.stream.point(p[0], p[1]);
18619       }
18620     }), postclip = identity_default, cache, cacheStream;
18621     function reset() {
18622       kx = k * sx;
18623       ky = k * sy;
18624       cache = cacheStream = null;
18625       return projection2;
18626     }
18627     function projection2(p) {
18628       var x = p[0] * kx, y = p[1] * ky;
18629       if (alpha) {
18630         var t = y * ca - x * sa;
18631         x = x * ca + y * sa;
18632         y = t;
18633       }
18634       return [x + tx, y + ty];
18635     }
18636     projection2.invert = function(p) {
18637       var x = p[0] - tx, y = p[1] - ty;
18638       if (alpha) {
18639         var t = y * ca + x * sa;
18640         x = x * ca - y * sa;
18641         y = t;
18642       }
18643       return [x / kx, y / ky];
18644     };
18645     projection2.stream = function(stream) {
18646       return cache && cacheStream === stream ? cache : cache = transform2(postclip(cacheStream = stream));
18647     };
18648     projection2.postclip = function(_) {
18649       return arguments.length ? (postclip = _, x05 = y05 = x12 = y12 = null, reset()) : postclip;
18650     };
18651     projection2.clipExtent = function(_) {
18652       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]];
18653     };
18654     projection2.scale = function(_) {
18655       return arguments.length ? (k = +_, reset()) : k;
18656     };
18657     projection2.translate = function(_) {
18658       return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty];
18659     };
18660     projection2.angle = function(_) {
18661       return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees;
18662     };
18663     projection2.reflectX = function(_) {
18664       return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;
18665     };
18666     projection2.reflectY = function(_) {
18667       return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;
18668     };
18669     projection2.fitExtent = function(extent, object) {
18670       return fitExtent(projection2, extent, object);
18671     };
18672     projection2.fitSize = function(size, object) {
18673       return fitSize(projection2, size, object);
18674     };
18675     projection2.fitWidth = function(width, object) {
18676       return fitWidth(projection2, width, object);
18677     };
18678     projection2.fitHeight = function(height, object) {
18679       return fitHeight(projection2, height, object);
18680     };
18681     return projection2;
18682   }
18683
18684   // modules/geo/geo.js
18685   var TAU = 2 * Math.PI;
18686   var EQUATORIAL_RADIUS = 6356752314245179e-9;
18687   var POLAR_RADIUS = 6378137;
18688   function geoLatToMeters(dLat) {
18689     return dLat * (TAU * POLAR_RADIUS / 360);
18690   }
18691   function geoLonToMeters(dLon, atLat) {
18692     return Math.abs(atLat) >= 90 ? 0 : dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
18693   }
18694   function geoMetersToLat(m) {
18695     return m / (TAU * POLAR_RADIUS / 360);
18696   }
18697   function geoMetersToLon(m, atLat) {
18698     return Math.abs(atLat) >= 90 ? 0 : m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
18699   }
18700   function geoMetersToOffset(meters, tileSize) {
18701     tileSize = tileSize || 256;
18702     return [
18703       meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
18704       -meters[1] * tileSize / (TAU * POLAR_RADIUS)
18705     ];
18706   }
18707   function geoOffsetToMeters(offset, tileSize) {
18708     tileSize = tileSize || 256;
18709     return [
18710       offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
18711       -offset[1] * TAU * POLAR_RADIUS / tileSize
18712     ];
18713   }
18714   function geoSphericalDistance(a, b) {
18715     var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
18716     var y = geoLatToMeters(a[1] - b[1]);
18717     return Math.sqrt(x * x + y * y);
18718   }
18719   function geoScaleToZoom(k, tileSize) {
18720     tileSize = tileSize || 256;
18721     var log2ts = Math.log(tileSize) * Math.LOG2E;
18722     return Math.log(k * TAU) / Math.LN2 - log2ts;
18723   }
18724   function geoZoomToScale(z, tileSize) {
18725     tileSize = tileSize || 256;
18726     return tileSize * Math.pow(2, z) / TAU;
18727   }
18728   function geoSphericalClosestNode(nodes, point2) {
18729     var minDistance = Infinity, distance;
18730     var indexOfMin;
18731     for (var i2 in nodes) {
18732       distance = geoSphericalDistance(nodes[i2].loc, point2);
18733       if (distance < minDistance) {
18734         minDistance = distance;
18735         indexOfMin = i2;
18736       }
18737     }
18738     if (indexOfMin !== void 0) {
18739       return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
18740     } else {
18741       return null;
18742     }
18743   }
18744
18745   // modules/geo/extent.js
18746   function geoExtent(min3, max3) {
18747     if (!(this instanceof geoExtent)) {
18748       return new geoExtent(min3, max3);
18749     } else if (min3 instanceof geoExtent) {
18750       return min3;
18751     } else if (min3 && min3.length === 2 && min3[0].length === 2 && min3[1].length === 2) {
18752       this[0] = min3[0];
18753       this[1] = min3[1];
18754     } else {
18755       this[0] = min3 || [Infinity, Infinity];
18756       this[1] = max3 || min3 || [-Infinity, -Infinity];
18757     }
18758   }
18759   geoExtent.prototype = new Array(2);
18760   Object.assign(geoExtent.prototype, {
18761     equals: function(obj) {
18762       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];
18763     },
18764     extend: function(obj) {
18765       if (!(obj instanceof geoExtent))
18766         obj = new geoExtent(obj);
18767       return geoExtent(
18768         [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
18769         [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
18770       );
18771     },
18772     _extend: function(extent) {
18773       this[0][0] = Math.min(extent[0][0], this[0][0]);
18774       this[0][1] = Math.min(extent[0][1], this[0][1]);
18775       this[1][0] = Math.max(extent[1][0], this[1][0]);
18776       this[1][1] = Math.max(extent[1][1], this[1][1]);
18777     },
18778     area: function() {
18779       return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
18780     },
18781     center: function() {
18782       return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
18783     },
18784     rectangle: function() {
18785       return [this[0][0], this[0][1], this[1][0], this[1][1]];
18786     },
18787     bbox: function() {
18788       return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
18789     },
18790     polygon: function() {
18791       return [
18792         [this[0][0], this[0][1]],
18793         [this[0][0], this[1][1]],
18794         [this[1][0], this[1][1]],
18795         [this[1][0], this[0][1]],
18796         [this[0][0], this[0][1]]
18797       ];
18798     },
18799     contains: function(obj) {
18800       if (!(obj instanceof geoExtent))
18801         obj = new geoExtent(obj);
18802       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];
18803     },
18804     intersects: function(obj) {
18805       if (!(obj instanceof geoExtent))
18806         obj = new geoExtent(obj);
18807       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];
18808     },
18809     intersection: function(obj) {
18810       if (!this.intersects(obj))
18811         return new geoExtent();
18812       return new geoExtent(
18813         [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
18814         [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
18815       );
18816     },
18817     percentContainedIn: function(obj) {
18818       if (!(obj instanceof geoExtent))
18819         obj = new geoExtent(obj);
18820       var a1 = this.intersection(obj).area();
18821       var a2 = this.area();
18822       if (a1 === Infinity || a2 === Infinity) {
18823         return 0;
18824       } else if (a1 === 0 || a2 === 0) {
18825         if (obj.contains(this)) {
18826           return 1;
18827         }
18828         return 0;
18829       } else {
18830         return a1 / a2;
18831       }
18832     },
18833     padByMeters: function(meters) {
18834       var dLat = geoMetersToLat(meters);
18835       var dLon = geoMetersToLon(meters, this.center()[1]);
18836       return geoExtent(
18837         [this[0][0] - dLon, this[0][1] - dLat],
18838         [this[1][0] + dLon, this[1][1] + dLat]
18839       );
18840     },
18841     toParam: function() {
18842       return this.rectangle().join(",");
18843     }
18844   });
18845
18846   // node_modules/d3-polygon/src/area.js
18847   function area_default3(polygon2) {
18848     var i2 = -1, n2 = polygon2.length, a, b = polygon2[n2 - 1], area = 0;
18849     while (++i2 < n2) {
18850       a = b;
18851       b = polygon2[i2];
18852       area += a[1] * b[0] - a[0] * b[1];
18853     }
18854     return area / 2;
18855   }
18856
18857   // node_modules/d3-polygon/src/centroid.js
18858   function centroid_default2(polygon2) {
18859     var i2 = -1, n2 = polygon2.length, x = 0, y = 0, a, b = polygon2[n2 - 1], c, k = 0;
18860     while (++i2 < n2) {
18861       a = b;
18862       b = polygon2[i2];
18863       k += c = a[0] * b[1] - b[0] * a[1];
18864       x += (a[0] + b[0]) * c;
18865       y += (a[1] + b[1]) * c;
18866     }
18867     return k *= 3, [x / k, y / k];
18868   }
18869
18870   // node_modules/d3-polygon/src/cross.js
18871   function cross_default(a, b, c) {
18872     return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
18873   }
18874
18875   // node_modules/d3-polygon/src/hull.js
18876   function lexicographicOrder(a, b) {
18877     return a[0] - b[0] || a[1] - b[1];
18878   }
18879   function computeUpperHullIndexes(points) {
18880     const n2 = points.length, indexes = [0, 1];
18881     let size = 2, i2;
18882     for (i2 = 2; i2 < n2; ++i2) {
18883       while (size > 1 && cross_default(points[indexes[size - 2]], points[indexes[size - 1]], points[i2]) <= 0)
18884         --size;
18885       indexes[size++] = i2;
18886     }
18887     return indexes.slice(0, size);
18888   }
18889   function hull_default(points) {
18890     if ((n2 = points.length) < 3)
18891       return null;
18892     var i2, n2, sortedPoints = new Array(n2), flippedPoints = new Array(n2);
18893     for (i2 = 0; i2 < n2; ++i2)
18894       sortedPoints[i2] = [+points[i2][0], +points[i2][1], i2];
18895     sortedPoints.sort(lexicographicOrder);
18896     for (i2 = 0; i2 < n2; ++i2)
18897       flippedPoints[i2] = [sortedPoints[i2][0], -sortedPoints[i2][1]];
18898     var upperIndexes = computeUpperHullIndexes(sortedPoints), lowerIndexes = computeUpperHullIndexes(flippedPoints);
18899     var skipLeft = lowerIndexes[0] === upperIndexes[0], skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], hull = [];
18900     for (i2 = upperIndexes.length - 1; i2 >= 0; --i2)
18901       hull.push(points[sortedPoints[upperIndexes[i2]][2]]);
18902     for (i2 = +skipLeft; i2 < lowerIndexes.length - skipRight; ++i2)
18903       hull.push(points[sortedPoints[lowerIndexes[i2]][2]]);
18904     return hull;
18905   }
18906
18907   // modules/geo/vector.js
18908   function geoVecEqual(a, b, epsilon3) {
18909     if (epsilon3) {
18910       return Math.abs(a[0] - b[0]) <= epsilon3 && Math.abs(a[1] - b[1]) <= epsilon3;
18911     } else {
18912       return a[0] === b[0] && a[1] === b[1];
18913     }
18914   }
18915   function geoVecAdd(a, b) {
18916     return [a[0] + b[0], a[1] + b[1]];
18917   }
18918   function geoVecSubtract(a, b) {
18919     return [a[0] - b[0], a[1] - b[1]];
18920   }
18921   function geoVecScale(a, mag) {
18922     return [a[0] * mag, a[1] * mag];
18923   }
18924   function geoVecFloor(a) {
18925     return [Math.floor(a[0]), Math.floor(a[1])];
18926   }
18927   function geoVecInterp(a, b, t) {
18928     return [
18929       a[0] + (b[0] - a[0]) * t,
18930       a[1] + (b[1] - a[1]) * t
18931     ];
18932   }
18933   function geoVecLength(a, b) {
18934     return Math.sqrt(geoVecLengthSquare(a, b));
18935   }
18936   function geoVecLengthSquare(a, b) {
18937     b = b || [0, 0];
18938     var x = a[0] - b[0];
18939     var y = a[1] - b[1];
18940     return x * x + y * y;
18941   }
18942   function geoVecNormalize(a) {
18943     var length = Math.sqrt(a[0] * a[0] + a[1] * a[1]);
18944     if (length !== 0) {
18945       return geoVecScale(a, 1 / length);
18946     }
18947     return [0, 0];
18948   }
18949   function geoVecAngle(a, b) {
18950     return Math.atan2(b[1] - a[1], b[0] - a[0]);
18951   }
18952   function geoVecDot(a, b, origin) {
18953     origin = origin || [0, 0];
18954     var p = geoVecSubtract(a, origin);
18955     var q = geoVecSubtract(b, origin);
18956     return p[0] * q[0] + p[1] * q[1];
18957   }
18958   function geoVecNormalizedDot(a, b, origin) {
18959     origin = origin || [0, 0];
18960     var p = geoVecNormalize(geoVecSubtract(a, origin));
18961     var q = geoVecNormalize(geoVecSubtract(b, origin));
18962     return geoVecDot(p, q);
18963   }
18964   function geoVecCross(a, b, origin) {
18965     origin = origin || [0, 0];
18966     var p = geoVecSubtract(a, origin);
18967     var q = geoVecSubtract(b, origin);
18968     return p[0] * q[1] - p[1] * q[0];
18969   }
18970   function geoVecProject(a, points) {
18971     var min3 = Infinity;
18972     var idx;
18973     var target;
18974     for (var i2 = 0; i2 < points.length - 1; i2++) {
18975       var o = points[i2];
18976       var s = geoVecSubtract(points[i2 + 1], o);
18977       var v = geoVecSubtract(a, o);
18978       var proj = geoVecDot(v, s) / geoVecDot(s, s);
18979       var p;
18980       if (proj < 0) {
18981         p = o;
18982       } else if (proj > 1) {
18983         p = points[i2 + 1];
18984       } else {
18985         p = [o[0] + proj * s[0], o[1] + proj * s[1]];
18986       }
18987       var dist = geoVecLength(p, a);
18988       if (dist < min3) {
18989         min3 = dist;
18990         idx = i2 + 1;
18991         target = p;
18992       }
18993     }
18994     if (idx !== void 0) {
18995       return { index: idx, distance: min3, target };
18996     } else {
18997       return null;
18998     }
18999   }
19000
19001   // modules/geo/geom.js
19002   function geoAngle(a, b, projection2) {
19003     return geoVecAngle(projection2(a.loc), projection2(b.loc));
19004   }
19005   function geoEdgeEqual(a, b) {
19006     return a[0] === b[0] && a[1] === b[1] || a[0] === b[1] && a[1] === b[0];
19007   }
19008   function geoRotate(points, angle2, around) {
19009     return points.map(function(point2) {
19010       var radial = geoVecSubtract(point2, around);
19011       return [
19012         radial[0] * Math.cos(angle2) - radial[1] * Math.sin(angle2) + around[0],
19013         radial[0] * Math.sin(angle2) + radial[1] * Math.cos(angle2) + around[1]
19014       ];
19015     });
19016   }
19017   function geoChooseEdge(nodes, point2, projection2, activeID) {
19018     var dist = geoVecLength;
19019     var points = nodes.map(function(n2) {
19020       return projection2(n2.loc);
19021     });
19022     var ids = nodes.map(function(n2) {
19023       return n2.id;
19024     });
19025     var min3 = Infinity;
19026     var idx;
19027     var loc;
19028     for (var i2 = 0; i2 < points.length - 1; i2++) {
19029       if (ids[i2] === activeID || ids[i2 + 1] === activeID)
19030         continue;
19031       var o = points[i2];
19032       var s = geoVecSubtract(points[i2 + 1], o);
19033       var v = geoVecSubtract(point2, o);
19034       var proj = geoVecDot(v, s) / geoVecDot(s, s);
19035       var p;
19036       if (proj < 0) {
19037         p = o;
19038       } else if (proj > 1) {
19039         p = points[i2 + 1];
19040       } else {
19041         p = [o[0] + proj * s[0], o[1] + proj * s[1]];
19042       }
19043       var d = dist(p, point2);
19044       if (d < min3) {
19045         min3 = d;
19046         idx = i2 + 1;
19047         loc = projection2.invert(p);
19048       }
19049     }
19050     if (idx !== void 0) {
19051       return { index: idx, distance: min3, loc };
19052     } else {
19053       return null;
19054     }
19055   }
19056   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
19057     var actives = [];
19058     var inactives = [];
19059     var j2, k, n1, n2, segment;
19060     for (j2 = 0; j2 < activeNodes.length - 1; j2++) {
19061       n1 = activeNodes[j2];
19062       n2 = activeNodes[j2 + 1];
19063       segment = [n1.loc, n2.loc];
19064       if (n1.id === activeID || n2.id === activeID) {
19065         actives.push(segment);
19066       }
19067     }
19068     for (j2 = 0; j2 < inactiveNodes.length - 1; j2++) {
19069       n1 = inactiveNodes[j2];
19070       n2 = inactiveNodes[j2 + 1];
19071       segment = [n1.loc, n2.loc];
19072       inactives.push(segment);
19073     }
19074     for (j2 = 0; j2 < actives.length; j2++) {
19075       for (k = 0; k < inactives.length; k++) {
19076         var p = actives[j2];
19077         var q = inactives[k];
19078         var hit = geoLineIntersection(p, q);
19079         if (hit) {
19080           return true;
19081         }
19082       }
19083     }
19084     return false;
19085   }
19086   function geoHasSelfIntersections(nodes, activeID) {
19087     var actives = [];
19088     var inactives = [];
19089     var j2, k;
19090     for (j2 = 0; j2 < nodes.length - 1; j2++) {
19091       var n1 = nodes[j2];
19092       var n2 = nodes[j2 + 1];
19093       var segment = [n1.loc, n2.loc];
19094       if (n1.id === activeID || n2.id === activeID) {
19095         actives.push(segment);
19096       } else {
19097         inactives.push(segment);
19098       }
19099     }
19100     for (j2 = 0; j2 < actives.length; j2++) {
19101       for (k = 0; k < inactives.length; k++) {
19102         var p = actives[j2];
19103         var q = inactives[k];
19104         if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) || geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1])) {
19105           continue;
19106         }
19107         var hit = geoLineIntersection(p, q);
19108         if (hit) {
19109           var epsilon3 = 1e-8;
19110           if (geoVecEqual(p[1], hit, epsilon3) || geoVecEqual(p[0], hit, epsilon3) || geoVecEqual(q[1], hit, epsilon3) || geoVecEqual(q[0], hit, epsilon3)) {
19111             continue;
19112           } else {
19113             return true;
19114           }
19115         }
19116       }
19117     }
19118     return false;
19119   }
19120   function geoLineIntersection(a, b) {
19121     var p = [a[0][0], a[0][1]];
19122     var p2 = [a[1][0], a[1][1]];
19123     var q = [b[0][0], b[0][1]];
19124     var q2 = [b[1][0], b[1][1]];
19125     var r = geoVecSubtract(p2, p);
19126     var s = geoVecSubtract(q2, q);
19127     var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
19128     var denominator = geoVecCross(r, s);
19129     if (uNumerator && denominator) {
19130       var u = uNumerator / denominator;
19131       var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
19132       if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {
19133         return geoVecInterp(p, p2, t);
19134       }
19135     }
19136     return null;
19137   }
19138   function geoPathIntersections(path1, path2) {
19139     var intersections = [];
19140     for (var i2 = 0; i2 < path1.length - 1; i2++) {
19141       for (var j2 = 0; j2 < path2.length - 1; j2++) {
19142         var a = [path1[i2], path1[i2 + 1]];
19143         var b = [path2[j2], path2[j2 + 1]];
19144         var hit = geoLineIntersection(a, b);
19145         if (hit) {
19146           intersections.push(hit);
19147         }
19148       }
19149     }
19150     return intersections;
19151   }
19152   function geoPathHasIntersections(path1, path2) {
19153     for (var i2 = 0; i2 < path1.length - 1; i2++) {
19154       for (var j2 = 0; j2 < path2.length - 1; j2++) {
19155         var a = [path1[i2], path1[i2 + 1]];
19156         var b = [path2[j2], path2[j2 + 1]];
19157         var hit = geoLineIntersection(a, b);
19158         if (hit) {
19159           return true;
19160         }
19161       }
19162     }
19163     return false;
19164   }
19165   function geoPointInPolygon(point2, polygon2) {
19166     var x = point2[0];
19167     var y = point2[1];
19168     var inside = false;
19169     for (var i2 = 0, j2 = polygon2.length - 1; i2 < polygon2.length; j2 = i2++) {
19170       var xi = polygon2[i2][0];
19171       var yi = polygon2[i2][1];
19172       var xj = polygon2[j2][0];
19173       var yj = polygon2[j2][1];
19174       var intersect2 = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
19175       if (intersect2)
19176         inside = !inside;
19177     }
19178     return inside;
19179   }
19180   function geoPolygonContainsPolygon(outer, inner) {
19181     return inner.every(function(point2) {
19182       return geoPointInPolygon(point2, outer);
19183     });
19184   }
19185   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
19186     function testPoints(outer2, inner2) {
19187       return inner2.some(function(point2) {
19188         return geoPointInPolygon(point2, outer2);
19189       });
19190     }
19191     return testPoints(outer, inner) || !!checkSegments && geoPathHasIntersections(outer, inner);
19192   }
19193   function geoGetSmallestSurroundingRectangle(points) {
19194     var hull = hull_default(points);
19195     var centroid = centroid_default2(hull);
19196     var minArea = Infinity;
19197     var ssrExtent = [];
19198     var ssrAngle = 0;
19199     var c1 = hull[0];
19200     for (var i2 = 0; i2 <= hull.length - 1; i2++) {
19201       var c2 = i2 === hull.length - 1 ? hull[0] : hull[i2 + 1];
19202       var angle2 = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
19203       var poly = geoRotate(hull, -angle2, centroid);
19204       var extent = poly.reduce(function(extent2, point2) {
19205         return extent2.extend(geoExtent(point2));
19206       }, geoExtent());
19207       var area = extent.area();
19208       if (area < minArea) {
19209         minArea = area;
19210         ssrExtent = extent;
19211         ssrAngle = angle2;
19212       }
19213       c1 = c2;
19214     }
19215     return {
19216       poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
19217       angle: ssrAngle
19218     };
19219   }
19220   function geoPathLength(path) {
19221     var length = 0;
19222     for (var i2 = 0; i2 < path.length - 1; i2++) {
19223       length += geoVecLength(path[i2], path[i2 + 1]);
19224     }
19225     return length;
19226   }
19227   function geoViewportEdge(point2, dimensions) {
19228     var pad2 = [80, 20, 50, 20];
19229     var x = 0;
19230     var y = 0;
19231     if (point2[0] > dimensions[0] - pad2[1]) {
19232       x = -10;
19233     }
19234     if (point2[0] < pad2[3]) {
19235       x = 10;
19236     }
19237     if (point2[1] > dimensions[1] - pad2[2]) {
19238       y = -10;
19239     }
19240     if (point2[1] < pad2[0]) {
19241       y = 10;
19242     }
19243     if (x || y) {
19244       return [x, y];
19245     } else {
19246       return null;
19247     }
19248   }
19249
19250   // node_modules/d3-dispatch/src/dispatch.js
19251   var noop2 = { value: () => {
19252   } };
19253   function dispatch() {
19254     for (var i2 = 0, n2 = arguments.length, _ = {}, t; i2 < n2; ++i2) {
19255       if (!(t = arguments[i2] + "") || t in _ || /[\s.]/.test(t))
19256         throw new Error("illegal type: " + t);
19257       _[t] = [];
19258     }
19259     return new Dispatch(_);
19260   }
19261   function Dispatch(_) {
19262     this._ = _;
19263   }
19264   function parseTypenames(typenames, types) {
19265     return typenames.trim().split(/^|\s+/).map(function(t) {
19266       var name = "", i2 = t.indexOf(".");
19267       if (i2 >= 0)
19268         name = t.slice(i2 + 1), t = t.slice(0, i2);
19269       if (t && !types.hasOwnProperty(t))
19270         throw new Error("unknown type: " + t);
19271       return { type: t, name };
19272     });
19273   }
19274   Dispatch.prototype = dispatch.prototype = {
19275     constructor: Dispatch,
19276     on: function(typename, callback) {
19277       var _ = this._, T = parseTypenames(typename + "", _), t, i2 = -1, n2 = T.length;
19278       if (arguments.length < 2) {
19279         while (++i2 < n2)
19280           if ((t = (typename = T[i2]).type) && (t = get(_[t], typename.name)))
19281             return t;
19282         return;
19283       }
19284       if (callback != null && typeof callback !== "function")
19285         throw new Error("invalid callback: " + callback);
19286       while (++i2 < n2) {
19287         if (t = (typename = T[i2]).type)
19288           _[t] = set(_[t], typename.name, callback);
19289         else if (callback == null)
19290           for (t in _)
19291             _[t] = set(_[t], typename.name, null);
19292       }
19293       return this;
19294     },
19295     copy: function() {
19296       var copy2 = {}, _ = this._;
19297       for (var t in _)
19298         copy2[t] = _[t].slice();
19299       return new Dispatch(copy2);
19300     },
19301     call: function(type2, that) {
19302       if ((n2 = arguments.length - 2) > 0)
19303         for (var args = new Array(n2), i2 = 0, n2, t; i2 < n2; ++i2)
19304           args[i2] = arguments[i2 + 2];
19305       if (!this._.hasOwnProperty(type2))
19306         throw new Error("unknown type: " + type2);
19307       for (t = this._[type2], i2 = 0, n2 = t.length; i2 < n2; ++i2)
19308         t[i2].value.apply(that, args);
19309     },
19310     apply: function(type2, that, args) {
19311       if (!this._.hasOwnProperty(type2))
19312         throw new Error("unknown type: " + type2);
19313       for (var t = this._[type2], i2 = 0, n2 = t.length; i2 < n2; ++i2)
19314         t[i2].value.apply(that, args);
19315     }
19316   };
19317   function get(type2, name) {
19318     for (var i2 = 0, n2 = type2.length, c; i2 < n2; ++i2) {
19319       if ((c = type2[i2]).name === name) {
19320         return c.value;
19321       }
19322     }
19323   }
19324   function set(type2, name, callback) {
19325     for (var i2 = 0, n2 = type2.length; i2 < n2; ++i2) {
19326       if (type2[i2].name === name) {
19327         type2[i2] = noop2, type2 = type2.slice(0, i2).concat(type2.slice(i2 + 1));
19328         break;
19329       }
19330     }
19331     if (callback != null)
19332       type2.push({ name, value: callback });
19333     return type2;
19334   }
19335   var dispatch_default = dispatch;
19336
19337   // node_modules/d3-selection/src/namespaces.js
19338   var xhtml = "http://www.w3.org/1999/xhtml";
19339   var namespaces_default = {
19340     svg: "http://www.w3.org/2000/svg",
19341     xhtml,
19342     xlink: "http://www.w3.org/1999/xlink",
19343     xml: "http://www.w3.org/XML/1998/namespace",
19344     xmlns: "http://www.w3.org/2000/xmlns/"
19345   };
19346
19347   // node_modules/d3-selection/src/namespace.js
19348   function namespace_default(name) {
19349     var prefix = name += "", i2 = prefix.indexOf(":");
19350     if (i2 >= 0 && (prefix = name.slice(0, i2)) !== "xmlns")
19351       name = name.slice(i2 + 1);
19352     return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name;
19353   }
19354
19355   // node_modules/d3-selection/src/creator.js
19356   function creatorInherit(name) {
19357     return function() {
19358       var document2 = this.ownerDocument, uri = this.namespaceURI;
19359       return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name);
19360     };
19361   }
19362   function creatorFixed(fullname) {
19363     return function() {
19364       return this.ownerDocument.createElementNS(fullname.space, fullname.local);
19365     };
19366   }
19367   function creator_default(name) {
19368     var fullname = namespace_default(name);
19369     return (fullname.local ? creatorFixed : creatorInherit)(fullname);
19370   }
19371
19372   // node_modules/d3-selection/src/selector.js
19373   function none() {
19374   }
19375   function selector_default(selector) {
19376     return selector == null ? none : function() {
19377       return this.querySelector(selector);
19378     };
19379   }
19380
19381   // node_modules/d3-selection/src/selection/select.js
19382   function select_default(select) {
19383     if (typeof select !== "function")
19384       select = selector_default(select);
19385     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
19386       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) {
19387         if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) {
19388           if ("__data__" in node)
19389             subnode.__data__ = node.__data__;
19390           subgroup[i2] = subnode;
19391         }
19392       }
19393     }
19394     return new Selection(subgroups, this._parents);
19395   }
19396
19397   // node_modules/d3-selection/src/array.js
19398   function array(x) {
19399     return x == null ? [] : Array.isArray(x) ? x : Array.from(x);
19400   }
19401
19402   // node_modules/d3-selection/src/selectorAll.js
19403   function empty() {
19404     return [];
19405   }
19406   function selectorAll_default(selector) {
19407     return selector == null ? empty : function() {
19408       return this.querySelectorAll(selector);
19409     };
19410   }
19411
19412   // node_modules/d3-selection/src/selection/selectAll.js
19413   function arrayAll(select) {
19414     return function() {
19415       return array(select.apply(this, arguments));
19416     };
19417   }
19418   function selectAll_default(select) {
19419     if (typeof select === "function")
19420       select = arrayAll(select);
19421     else
19422       select = selectorAll_default(select);
19423     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) {
19424       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
19425         if (node = group[i2]) {
19426           subgroups.push(select.call(node, node.__data__, i2, group));
19427           parents.push(node);
19428         }
19429       }
19430     }
19431     return new Selection(subgroups, parents);
19432   }
19433
19434   // node_modules/d3-selection/src/matcher.js
19435   function matcher_default(selector) {
19436     return function() {
19437       return this.matches(selector);
19438     };
19439   }
19440   function childMatcher(selector) {
19441     return function(node) {
19442       return node.matches(selector);
19443     };
19444   }
19445
19446   // node_modules/d3-selection/src/selection/selectChild.js
19447   var find = Array.prototype.find;
19448   function childFind(match) {
19449     return function() {
19450       return find.call(this.children, match);
19451     };
19452   }
19453   function childFirst() {
19454     return this.firstElementChild;
19455   }
19456   function selectChild_default(match) {
19457     return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match)));
19458   }
19459
19460   // node_modules/d3-selection/src/selection/selectChildren.js
19461   var filter = Array.prototype.filter;
19462   function children() {
19463     return Array.from(this.children);
19464   }
19465   function childrenFilter(match) {
19466     return function() {
19467       return filter.call(this.children, match);
19468     };
19469   }
19470   function selectChildren_default(match) {
19471     return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match)));
19472   }
19473
19474   // node_modules/d3-selection/src/selection/filter.js
19475   function filter_default(match) {
19476     if (typeof match !== "function")
19477       match = matcher_default(match);
19478     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
19479       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) {
19480         if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) {
19481           subgroup.push(node);
19482         }
19483       }
19484     }
19485     return new Selection(subgroups, this._parents);
19486   }
19487
19488   // node_modules/d3-selection/src/selection/sparse.js
19489   function sparse_default(update) {
19490     return new Array(update.length);
19491   }
19492
19493   // node_modules/d3-selection/src/selection/enter.js
19494   function enter_default() {
19495     return new Selection(this._enter || this._groups.map(sparse_default), this._parents);
19496   }
19497   function EnterNode(parent, datum2) {
19498     this.ownerDocument = parent.ownerDocument;
19499     this.namespaceURI = parent.namespaceURI;
19500     this._next = null;
19501     this._parent = parent;
19502     this.__data__ = datum2;
19503   }
19504   EnterNode.prototype = {
19505     constructor: EnterNode,
19506     appendChild: function(child) {
19507       return this._parent.insertBefore(child, this._next);
19508     },
19509     insertBefore: function(child, next) {
19510       return this._parent.insertBefore(child, next);
19511     },
19512     querySelector: function(selector) {
19513       return this._parent.querySelector(selector);
19514     },
19515     querySelectorAll: function(selector) {
19516       return this._parent.querySelectorAll(selector);
19517     }
19518   };
19519
19520   // node_modules/d3-selection/src/constant.js
19521   function constant_default(x) {
19522     return function() {
19523       return x;
19524     };
19525   }
19526
19527   // node_modules/d3-selection/src/selection/data.js
19528   function bindIndex(parent, group, enter, update, exit, data) {
19529     var i2 = 0, node, groupLength = group.length, dataLength = data.length;
19530     for (; i2 < dataLength; ++i2) {
19531       if (node = group[i2]) {
19532         node.__data__ = data[i2];
19533         update[i2] = node;
19534       } else {
19535         enter[i2] = new EnterNode(parent, data[i2]);
19536       }
19537     }
19538     for (; i2 < groupLength; ++i2) {
19539       if (node = group[i2]) {
19540         exit[i2] = node;
19541       }
19542     }
19543   }
19544   function bindKey(parent, group, enter, update, exit, data, key) {
19545     var i2, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue;
19546     for (i2 = 0; i2 < groupLength; ++i2) {
19547       if (node = group[i2]) {
19548         keyValues[i2] = keyValue = key.call(node, node.__data__, i2, group) + "";
19549         if (nodeByKeyValue.has(keyValue)) {
19550           exit[i2] = node;
19551         } else {
19552           nodeByKeyValue.set(keyValue, node);
19553         }
19554       }
19555     }
19556     for (i2 = 0; i2 < dataLength; ++i2) {
19557       keyValue = key.call(parent, data[i2], i2, data) + "";
19558       if (node = nodeByKeyValue.get(keyValue)) {
19559         update[i2] = node;
19560         node.__data__ = data[i2];
19561         nodeByKeyValue.delete(keyValue);
19562       } else {
19563         enter[i2] = new EnterNode(parent, data[i2]);
19564       }
19565     }
19566     for (i2 = 0; i2 < groupLength; ++i2) {
19567       if ((node = group[i2]) && nodeByKeyValue.get(keyValues[i2]) === node) {
19568         exit[i2] = node;
19569       }
19570     }
19571   }
19572   function datum(node) {
19573     return node.__data__;
19574   }
19575   function data_default(value, key) {
19576     if (!arguments.length)
19577       return Array.from(this, datum);
19578     var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups;
19579     if (typeof value !== "function")
19580       value = constant_default(value);
19581     for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j2 = 0; j2 < m; ++j2) {
19582       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);
19583       bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
19584       for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
19585         if (previous = enterGroup[i0]) {
19586           if (i0 >= i1)
19587             i1 = i0 + 1;
19588           while (!(next = updateGroup[i1]) && ++i1 < dataLength)
19589             ;
19590           previous._next = next || null;
19591         }
19592       }
19593     }
19594     update = new Selection(update, parents);
19595     update._enter = enter;
19596     update._exit = exit;
19597     return update;
19598   }
19599   function arraylike(data) {
19600     return typeof data === "object" && "length" in data ? data : Array.from(data);
19601   }
19602
19603   // node_modules/d3-selection/src/selection/exit.js
19604   function exit_default() {
19605     return new Selection(this._exit || this._groups.map(sparse_default), this._parents);
19606   }
19607
19608   // node_modules/d3-selection/src/selection/join.js
19609   function join_default(onenter, onupdate, onexit) {
19610     var enter = this.enter(), update = this, exit = this.exit();
19611     if (typeof onenter === "function") {
19612       enter = onenter(enter);
19613       if (enter)
19614         enter = enter.selection();
19615     } else {
19616       enter = enter.append(onenter + "");
19617     }
19618     if (onupdate != null) {
19619       update = onupdate(update);
19620       if (update)
19621         update = update.selection();
19622     }
19623     if (onexit == null)
19624       exit.remove();
19625     else
19626       onexit(exit);
19627     return enter && update ? enter.merge(update).order() : update;
19628   }
19629
19630   // node_modules/d3-selection/src/selection/merge.js
19631   function merge_default(context) {
19632     var selection2 = context.selection ? context.selection() : context;
19633     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) {
19634       for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge2 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
19635         if (node = group0[i2] || group1[i2]) {
19636           merge2[i2] = node;
19637         }
19638       }
19639     }
19640     for (; j2 < m0; ++j2) {
19641       merges[j2] = groups0[j2];
19642     }
19643     return new Selection(merges, this._parents);
19644   }
19645
19646   // node_modules/d3-selection/src/selection/order.js
19647   function order_default() {
19648     for (var groups = this._groups, j2 = -1, m = groups.length; ++j2 < m; ) {
19649       for (var group = groups[j2], i2 = group.length - 1, next = group[i2], node; --i2 >= 0; ) {
19650         if (node = group[i2]) {
19651           if (next && node.compareDocumentPosition(next) ^ 4)
19652             next.parentNode.insertBefore(node, next);
19653           next = node;
19654         }
19655       }
19656     }
19657     return this;
19658   }
19659
19660   // node_modules/d3-selection/src/selection/sort.js
19661   function sort_default(compare) {
19662     if (!compare)
19663       compare = ascending2;
19664     function compareNode(a, b) {
19665       return a && b ? compare(a.__data__, b.__data__) : !a - !b;
19666     }
19667     for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
19668       for (var group = groups[j2], n2 = group.length, sortgroup = sortgroups[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
19669         if (node = group[i2]) {
19670           sortgroup[i2] = node;
19671         }
19672       }
19673       sortgroup.sort(compareNode);
19674     }
19675     return new Selection(sortgroups, this._parents).order();
19676   }
19677   function ascending2(a, b) {
19678     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
19679   }
19680
19681   // node_modules/d3-selection/src/selection/call.js
19682   function call_default() {
19683     var callback = arguments[0];
19684     arguments[0] = this;
19685     callback.apply(null, arguments);
19686     return this;
19687   }
19688
19689   // node_modules/d3-selection/src/selection/nodes.js
19690   function nodes_default() {
19691     return Array.from(this);
19692   }
19693
19694   // node_modules/d3-selection/src/selection/node.js
19695   function node_default() {
19696     for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
19697       for (var group = groups[j2], i2 = 0, n2 = group.length; i2 < n2; ++i2) {
19698         var node = group[i2];
19699         if (node)
19700           return node;
19701       }
19702     }
19703     return null;
19704   }
19705
19706   // node_modules/d3-selection/src/selection/size.js
19707   function size_default() {
19708     let size = 0;
19709     for (const node of this)
19710       ++size;
19711     return size;
19712   }
19713
19714   // node_modules/d3-selection/src/selection/empty.js
19715   function empty_default() {
19716     return !this.node();
19717   }
19718
19719   // node_modules/d3-selection/src/selection/each.js
19720   function each_default(callback) {
19721     for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
19722       for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) {
19723         if (node = group[i2])
19724           callback.call(node, node.__data__, i2, group);
19725       }
19726     }
19727     return this;
19728   }
19729
19730   // node_modules/d3-selection/src/selection/attr.js
19731   function attrRemove(name) {
19732     return function() {
19733       this.removeAttribute(name);
19734     };
19735   }
19736   function attrRemoveNS(fullname) {
19737     return function() {
19738       this.removeAttributeNS(fullname.space, fullname.local);
19739     };
19740   }
19741   function attrConstant(name, value) {
19742     return function() {
19743       this.setAttribute(name, value);
19744     };
19745   }
19746   function attrConstantNS(fullname, value) {
19747     return function() {
19748       this.setAttributeNS(fullname.space, fullname.local, value);
19749     };
19750   }
19751   function attrFunction(name, value) {
19752     return function() {
19753       var v = value.apply(this, arguments);
19754       if (v == null)
19755         this.removeAttribute(name);
19756       else
19757         this.setAttribute(name, v);
19758     };
19759   }
19760   function attrFunctionNS(fullname, value) {
19761     return function() {
19762       var v = value.apply(this, arguments);
19763       if (v == null)
19764         this.removeAttributeNS(fullname.space, fullname.local);
19765       else
19766         this.setAttributeNS(fullname.space, fullname.local, v);
19767     };
19768   }
19769   function attr_default(name, value) {
19770     var fullname = namespace_default(name);
19771     if (arguments.length < 2) {
19772       var node = this.node();
19773       return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname);
19774     }
19775     return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value));
19776   }
19777
19778   // node_modules/d3-selection/src/window.js
19779   function window_default(node) {
19780     return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView;
19781   }
19782
19783   // node_modules/d3-selection/src/selection/style.js
19784   function styleRemove(name) {
19785     return function() {
19786       this.style.removeProperty(name);
19787     };
19788   }
19789   function styleConstant(name, value, priority) {
19790     return function() {
19791       this.style.setProperty(name, value, priority);
19792     };
19793   }
19794   function styleFunction(name, value, priority) {
19795     return function() {
19796       var v = value.apply(this, arguments);
19797       if (v == null)
19798         this.style.removeProperty(name);
19799       else
19800         this.style.setProperty(name, v, priority);
19801     };
19802   }
19803   function style_default(name, value, priority) {
19804     return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name);
19805   }
19806   function styleValue(node, name) {
19807     return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name);
19808   }
19809
19810   // node_modules/d3-selection/src/selection/property.js
19811   function propertyRemove(name) {
19812     return function() {
19813       delete this[name];
19814     };
19815   }
19816   function propertyConstant(name, value) {
19817     return function() {
19818       this[name] = value;
19819     };
19820   }
19821   function propertyFunction(name, value) {
19822     return function() {
19823       var v = value.apply(this, arguments);
19824       if (v == null)
19825         delete this[name];
19826       else
19827         this[name] = v;
19828     };
19829   }
19830   function property_default(name, value) {
19831     return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name];
19832   }
19833
19834   // node_modules/d3-selection/src/selection/classed.js
19835   function classArray(string) {
19836     return string.trim().split(/^|\s+/);
19837   }
19838   function classList(node) {
19839     return node.classList || new ClassList(node);
19840   }
19841   function ClassList(node) {
19842     this._node = node;
19843     this._names = classArray(node.getAttribute("class") || "");
19844   }
19845   ClassList.prototype = {
19846     add: function(name) {
19847       var i2 = this._names.indexOf(name);
19848       if (i2 < 0) {
19849         this._names.push(name);
19850         this._node.setAttribute("class", this._names.join(" "));
19851       }
19852     },
19853     remove: function(name) {
19854       var i2 = this._names.indexOf(name);
19855       if (i2 >= 0) {
19856         this._names.splice(i2, 1);
19857         this._node.setAttribute("class", this._names.join(" "));
19858       }
19859     },
19860     contains: function(name) {
19861       return this._names.indexOf(name) >= 0;
19862     }
19863   };
19864   function classedAdd(node, names) {
19865     var list = classList(node), i2 = -1, n2 = names.length;
19866     while (++i2 < n2)
19867       list.add(names[i2]);
19868   }
19869   function classedRemove(node, names) {
19870     var list = classList(node), i2 = -1, n2 = names.length;
19871     while (++i2 < n2)
19872       list.remove(names[i2]);
19873   }
19874   function classedTrue(names) {
19875     return function() {
19876       classedAdd(this, names);
19877     };
19878   }
19879   function classedFalse(names) {
19880     return function() {
19881       classedRemove(this, names);
19882     };
19883   }
19884   function classedFunction(names, value) {
19885     return function() {
19886       (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
19887     };
19888   }
19889   function classed_default(name, value) {
19890     var names = classArray(name + "");
19891     if (arguments.length < 2) {
19892       var list = classList(this.node()), i2 = -1, n2 = names.length;
19893       while (++i2 < n2)
19894         if (!list.contains(names[i2]))
19895           return false;
19896       return true;
19897     }
19898     return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value));
19899   }
19900
19901   // node_modules/d3-selection/src/selection/text.js
19902   function textRemove() {
19903     this.textContent = "";
19904   }
19905   function textConstant(value) {
19906     return function() {
19907       this.textContent = value;
19908     };
19909   }
19910   function textFunction(value) {
19911     return function() {
19912       var v = value.apply(this, arguments);
19913       this.textContent = v == null ? "" : v;
19914     };
19915   }
19916   function text_default(value) {
19917     return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent;
19918   }
19919
19920   // node_modules/d3-selection/src/selection/html.js
19921   function htmlRemove() {
19922     this.innerHTML = "";
19923   }
19924   function htmlConstant(value) {
19925     return function() {
19926       this.innerHTML = value;
19927     };
19928   }
19929   function htmlFunction(value) {
19930     return function() {
19931       var v = value.apply(this, arguments);
19932       this.innerHTML = v == null ? "" : v;
19933     };
19934   }
19935   function html_default(value) {
19936     return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML;
19937   }
19938
19939   // node_modules/d3-selection/src/selection/raise.js
19940   function raise() {
19941     if (this.nextSibling)
19942       this.parentNode.appendChild(this);
19943   }
19944   function raise_default() {
19945     return this.each(raise);
19946   }
19947
19948   // node_modules/d3-selection/src/selection/lower.js
19949   function lower() {
19950     if (this.previousSibling)
19951       this.parentNode.insertBefore(this, this.parentNode.firstChild);
19952   }
19953   function lower_default() {
19954     return this.each(lower);
19955   }
19956
19957   // node_modules/d3-selection/src/selection/append.js
19958   function append_default(name) {
19959     var create2 = typeof name === "function" ? name : creator_default(name);
19960     return this.select(function() {
19961       return this.appendChild(create2.apply(this, arguments));
19962     });
19963   }
19964
19965   // node_modules/d3-selection/src/selection/insert.js
19966   function constantNull() {
19967     return null;
19968   }
19969   function insert_default(name, before) {
19970     var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before);
19971     return this.select(function() {
19972       return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null);
19973     });
19974   }
19975
19976   // node_modules/d3-selection/src/selection/remove.js
19977   function remove() {
19978     var parent = this.parentNode;
19979     if (parent)
19980       parent.removeChild(this);
19981   }
19982   function remove_default() {
19983     return this.each(remove);
19984   }
19985
19986   // node_modules/d3-selection/src/selection/clone.js
19987   function selection_cloneShallow() {
19988     var clone = this.cloneNode(false), parent = this.parentNode;
19989     return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
19990   }
19991   function selection_cloneDeep() {
19992     var clone = this.cloneNode(true), parent = this.parentNode;
19993     return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
19994   }
19995   function clone_default(deep) {
19996     return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
19997   }
19998
19999   // node_modules/d3-selection/src/selection/datum.js
20000   function datum_default(value) {
20001     return arguments.length ? this.property("__data__", value) : this.node().__data__;
20002   }
20003
20004   // node_modules/d3-selection/src/selection/on.js
20005   function contextListener(listener) {
20006     return function(event) {
20007       listener.call(this, event, this.__data__);
20008     };
20009   }
20010   function parseTypenames2(typenames) {
20011     return typenames.trim().split(/^|\s+/).map(function(t) {
20012       var name = "", i2 = t.indexOf(".");
20013       if (i2 >= 0)
20014         name = t.slice(i2 + 1), t = t.slice(0, i2);
20015       return { type: t, name };
20016     });
20017   }
20018   function onRemove(typename) {
20019     return function() {
20020       var on = this.__on;
20021       if (!on)
20022         return;
20023       for (var j2 = 0, i2 = -1, m = on.length, o; j2 < m; ++j2) {
20024         if (o = on[j2], (!typename.type || o.type === typename.type) && o.name === typename.name) {
20025           this.removeEventListener(o.type, o.listener, o.options);
20026         } else {
20027           on[++i2] = o;
20028         }
20029       }
20030       if (++i2)
20031         on.length = i2;
20032       else
20033         delete this.__on;
20034     };
20035   }
20036   function onAdd(typename, value, options2) {
20037     return function() {
20038       var on = this.__on, o, listener = contextListener(value);
20039       if (on)
20040         for (var j2 = 0, m = on.length; j2 < m; ++j2) {
20041           if ((o = on[j2]).type === typename.type && o.name === typename.name) {
20042             this.removeEventListener(o.type, o.listener, o.options);
20043             this.addEventListener(o.type, o.listener = listener, o.options = options2);
20044             o.value = value;
20045             return;
20046           }
20047         }
20048       this.addEventListener(typename.type, listener, options2);
20049       o = { type: typename.type, name: typename.name, value, listener, options: options2 };
20050       if (!on)
20051         this.__on = [o];
20052       else
20053         on.push(o);
20054     };
20055   }
20056   function on_default(typename, value, options2) {
20057     var typenames = parseTypenames2(typename + ""), i2, n2 = typenames.length, t;
20058     if (arguments.length < 2) {
20059       var on = this.node().__on;
20060       if (on)
20061         for (var j2 = 0, m = on.length, o; j2 < m; ++j2) {
20062           for (i2 = 0, o = on[j2]; i2 < n2; ++i2) {
20063             if ((t = typenames[i2]).type === o.type && t.name === o.name) {
20064               return o.value;
20065             }
20066           }
20067         }
20068       return;
20069     }
20070     on = value ? onAdd : onRemove;
20071     for (i2 = 0; i2 < n2; ++i2)
20072       this.each(on(typenames[i2], value, options2));
20073     return this;
20074   }
20075
20076   // node_modules/d3-selection/src/selection/dispatch.js
20077   function dispatchEvent(node, type2, params) {
20078     var window2 = window_default(node), event = window2.CustomEvent;
20079     if (typeof event === "function") {
20080       event = new event(type2, params);
20081     } else {
20082       event = window2.document.createEvent("Event");
20083       if (params)
20084         event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail;
20085       else
20086         event.initEvent(type2, false, false);
20087     }
20088     node.dispatchEvent(event);
20089   }
20090   function dispatchConstant(type2, params) {
20091     return function() {
20092       return dispatchEvent(this, type2, params);
20093     };
20094   }
20095   function dispatchFunction(type2, params) {
20096     return function() {
20097       return dispatchEvent(this, type2, params.apply(this, arguments));
20098     };
20099   }
20100   function dispatch_default2(type2, params) {
20101     return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params));
20102   }
20103
20104   // node_modules/d3-selection/src/selection/iterator.js
20105   function* iterator_default() {
20106     for (var groups = this._groups, j2 = 0, m = groups.length; j2 < m; ++j2) {
20107       for (var group = groups[j2], i2 = 0, n2 = group.length, node; i2 < n2; ++i2) {
20108         if (node = group[i2])
20109           yield node;
20110       }
20111     }
20112   }
20113
20114   // node_modules/d3-selection/src/selection/index.js
20115   var root = [null];
20116   function Selection(groups, parents) {
20117     this._groups = groups;
20118     this._parents = parents;
20119   }
20120   function selection() {
20121     return new Selection([[document.documentElement]], root);
20122   }
20123   function selection_selection() {
20124     return this;
20125   }
20126   Selection.prototype = selection.prototype = {
20127     constructor: Selection,
20128     select: select_default,
20129     selectAll: selectAll_default,
20130     selectChild: selectChild_default,
20131     selectChildren: selectChildren_default,
20132     filter: filter_default,
20133     data: data_default,
20134     enter: enter_default,
20135     exit: exit_default,
20136     join: join_default,
20137     merge: merge_default,
20138     selection: selection_selection,
20139     order: order_default,
20140     sort: sort_default,
20141     call: call_default,
20142     nodes: nodes_default,
20143     node: node_default,
20144     size: size_default,
20145     empty: empty_default,
20146     each: each_default,
20147     attr: attr_default,
20148     style: style_default,
20149     property: property_default,
20150     classed: classed_default,
20151     text: text_default,
20152     html: html_default,
20153     raise: raise_default,
20154     lower: lower_default,
20155     append: append_default,
20156     insert: insert_default,
20157     remove: remove_default,
20158     clone: clone_default,
20159     datum: datum_default,
20160     on: on_default,
20161     dispatch: dispatch_default2,
20162     [Symbol.iterator]: iterator_default
20163   };
20164   var selection_default = selection;
20165
20166   // node_modules/d3-selection/src/select.js
20167   function select_default2(selector) {
20168     return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root);
20169   }
20170
20171   // node_modules/d3-selection/src/sourceEvent.js
20172   function sourceEvent_default(event) {
20173     let sourceEvent;
20174     while (sourceEvent = event.sourceEvent)
20175       event = sourceEvent;
20176     return event;
20177   }
20178
20179   // node_modules/d3-selection/src/pointer.js
20180   function pointer_default(event, node) {
20181     event = sourceEvent_default(event);
20182     if (node === void 0)
20183       node = event.currentTarget;
20184     if (node) {
20185       var svg2 = node.ownerSVGElement || node;
20186       if (svg2.createSVGPoint) {
20187         var point2 = svg2.createSVGPoint();
20188         point2.x = event.clientX, point2.y = event.clientY;
20189         point2 = point2.matrixTransform(node.getScreenCTM().inverse());
20190         return [point2.x, point2.y];
20191       }
20192       if (node.getBoundingClientRect) {
20193         var rect = node.getBoundingClientRect();
20194         return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
20195       }
20196     }
20197     return [event.pageX, event.pageY];
20198   }
20199
20200   // node_modules/d3-selection/src/selectAll.js
20201   function selectAll_default2(selector) {
20202     return typeof selector === "string" ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) : new Selection([array(selector)], root);
20203   }
20204
20205   // node_modules/d3-drag/src/noevent.js
20206   var nonpassive = { passive: false };
20207   var nonpassivecapture = { capture: true, passive: false };
20208   function nopropagation(event) {
20209     event.stopImmediatePropagation();
20210   }
20211   function noevent_default(event) {
20212     event.preventDefault();
20213     event.stopImmediatePropagation();
20214   }
20215
20216   // node_modules/d3-drag/src/nodrag.js
20217   function nodrag_default(view) {
20218     var root3 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture);
20219     if ("onselectstart" in root3) {
20220       selection2.on("selectstart.drag", noevent_default, nonpassivecapture);
20221     } else {
20222       root3.__noselect = root3.style.MozUserSelect;
20223       root3.style.MozUserSelect = "none";
20224     }
20225   }
20226   function yesdrag(view, noclick) {
20227     var root3 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null);
20228     if (noclick) {
20229       selection2.on("click.drag", noevent_default, nonpassivecapture);
20230       setTimeout(function() {
20231         selection2.on("click.drag", null);
20232       }, 0);
20233     }
20234     if ("onselectstart" in root3) {
20235       selection2.on("selectstart.drag", null);
20236     } else {
20237       root3.style.MozUserSelect = root3.__noselect;
20238       delete root3.__noselect;
20239     }
20240   }
20241
20242   // node_modules/d3-drag/src/constant.js
20243   var constant_default2 = (x) => () => x;
20244
20245   // node_modules/d3-drag/src/event.js
20246   function DragEvent(type2, {
20247     sourceEvent,
20248     subject,
20249     target,
20250     identifier,
20251     active,
20252     x,
20253     y,
20254     dx,
20255     dy,
20256     dispatch: dispatch10
20257   }) {
20258     Object.defineProperties(this, {
20259       type: { value: type2, enumerable: true, configurable: true },
20260       sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
20261       subject: { value: subject, enumerable: true, configurable: true },
20262       target: { value: target, enumerable: true, configurable: true },
20263       identifier: { value: identifier, enumerable: true, configurable: true },
20264       active: { value: active, enumerable: true, configurable: true },
20265       x: { value: x, enumerable: true, configurable: true },
20266       y: { value: y, enumerable: true, configurable: true },
20267       dx: { value: dx, enumerable: true, configurable: true },
20268       dy: { value: dy, enumerable: true, configurable: true },
20269       _: { value: dispatch10 }
20270     });
20271   }
20272   DragEvent.prototype.on = function() {
20273     var value = this._.on.apply(this._, arguments);
20274     return value === this._ ? this : value;
20275   };
20276
20277   // node_modules/d3-drag/src/drag.js
20278   function defaultFilter(event) {
20279     return !event.ctrlKey && !event.button;
20280   }
20281   function defaultContainer() {
20282     return this.parentNode;
20283   }
20284   function defaultSubject(event, d) {
20285     return d == null ? { x: event.x, y: event.y } : d;
20286   }
20287   function defaultTouchable() {
20288     return navigator.maxTouchPoints || "ontouchstart" in this;
20289   }
20290   function drag_default() {
20291     var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0;
20292     function drag(selection2) {
20293       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)");
20294     }
20295     function mousedowned(event, d) {
20296       if (touchending || !filter2.call(this, event, d))
20297         return;
20298       var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse");
20299       if (!gesture)
20300         return;
20301       select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture);
20302       nodrag_default(event.view);
20303       nopropagation(event);
20304       mousemoving = false;
20305       mousedownx = event.clientX;
20306       mousedowny = event.clientY;
20307       gesture("start", event);
20308     }
20309     function mousemoved(event) {
20310       noevent_default(event);
20311       if (!mousemoving) {
20312         var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
20313         mousemoving = dx * dx + dy * dy > clickDistance2;
20314       }
20315       gestures.mouse("drag", event);
20316     }
20317     function mouseupped(event) {
20318       select_default2(event.view).on("mousemove.drag mouseup.drag", null);
20319       yesdrag(event.view, mousemoving);
20320       noevent_default(event);
20321       gestures.mouse("end", event);
20322     }
20323     function touchstarted(event, d) {
20324       if (!filter2.call(this, event, d))
20325         return;
20326       var touches = event.changedTouches, c = container.call(this, event, d), n2 = touches.length, i2, gesture;
20327       for (i2 = 0; i2 < n2; ++i2) {
20328         if (gesture = beforestart(this, c, event, d, touches[i2].identifier, touches[i2])) {
20329           nopropagation(event);
20330           gesture("start", event, touches[i2]);
20331         }
20332       }
20333     }
20334     function touchmoved(event) {
20335       var touches = event.changedTouches, n2 = touches.length, i2, gesture;
20336       for (i2 = 0; i2 < n2; ++i2) {
20337         if (gesture = gestures[touches[i2].identifier]) {
20338           noevent_default(event);
20339           gesture("drag", event, touches[i2]);
20340         }
20341       }
20342     }
20343     function touchended(event) {
20344       var touches = event.changedTouches, n2 = touches.length, i2, gesture;
20345       if (touchending)
20346         clearTimeout(touchending);
20347       touchending = setTimeout(function() {
20348         touchending = null;
20349       }, 500);
20350       for (i2 = 0; i2 < n2; ++i2) {
20351         if (gesture = gestures[touches[i2].identifier]) {
20352           nopropagation(event);
20353           gesture("end", event, touches[i2]);
20354         }
20355       }
20356     }
20357     function beforestart(that, container2, event, d, identifier, touch) {
20358       var dispatch10 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s;
20359       if ((s = subject.call(that, new DragEvent("beforestart", {
20360         sourceEvent: event,
20361         target: drag,
20362         identifier,
20363         active,
20364         x: p[0],
20365         y: p[1],
20366         dx: 0,
20367         dy: 0,
20368         dispatch: dispatch10
20369       }), d)) == null)
20370         return;
20371       dx = s.x - p[0] || 0;
20372       dy = s.y - p[1] || 0;
20373       return function gesture(type2, event2, touch2) {
20374         var p02 = p, n2;
20375         switch (type2) {
20376           case "start":
20377             gestures[identifier] = gesture, n2 = active++;
20378             break;
20379           case "end":
20380             delete gestures[identifier], --active;
20381           case "drag":
20382             p = pointer_default(touch2 || event2, container2), n2 = active;
20383             break;
20384         }
20385         dispatch10.call(
20386           type2,
20387           that,
20388           new DragEvent(type2, {
20389             sourceEvent: event2,
20390             subject: s,
20391             target: drag,
20392             identifier,
20393             active: n2,
20394             x: p[0] + dx,
20395             y: p[1] + dy,
20396             dx: p[0] - p02[0],
20397             dy: p[1] - p02[1],
20398             dispatch: dispatch10
20399           }),
20400           d
20401         );
20402       };
20403     }
20404     drag.filter = function(_) {
20405       return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2;
20406     };
20407     drag.container = function(_) {
20408       return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container;
20409     };
20410     drag.subject = function(_) {
20411       return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject;
20412     };
20413     drag.touchable = function(_) {
20414       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable;
20415     };
20416     drag.on = function() {
20417       var value = listeners.on.apply(listeners, arguments);
20418       return value === listeners ? drag : value;
20419     };
20420     drag.clickDistance = function(_) {
20421       return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
20422     };
20423     return drag;
20424   }
20425
20426   // node_modules/d3-color/src/define.js
20427   function define_default(constructor, factory, prototype) {
20428     constructor.prototype = factory.prototype = prototype;
20429     prototype.constructor = constructor;
20430   }
20431   function extend(parent, definition) {
20432     var prototype = Object.create(parent.prototype);
20433     for (var key in definition)
20434       prototype[key] = definition[key];
20435     return prototype;
20436   }
20437
20438   // node_modules/d3-color/src/color.js
20439   function Color() {
20440   }
20441   var darker = 0.7;
20442   var brighter = 1 / darker;
20443   var reI = "\\s*([+-]?\\d+)\\s*";
20444   var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*";
20445   var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
20446   var reHex = /^#([0-9a-f]{3,8})$/;
20447   var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`);
20448   var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`);
20449   var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`);
20450   var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`);
20451   var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`);
20452   var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`);
20453   var named = {
20454     aliceblue: 15792383,
20455     antiquewhite: 16444375,
20456     aqua: 65535,
20457     aquamarine: 8388564,
20458     azure: 15794175,
20459     beige: 16119260,
20460     bisque: 16770244,
20461     black: 0,
20462     blanchedalmond: 16772045,
20463     blue: 255,
20464     blueviolet: 9055202,
20465     brown: 10824234,
20466     burlywood: 14596231,
20467     cadetblue: 6266528,
20468     chartreuse: 8388352,
20469     chocolate: 13789470,
20470     coral: 16744272,
20471     cornflowerblue: 6591981,
20472     cornsilk: 16775388,
20473     crimson: 14423100,
20474     cyan: 65535,
20475     darkblue: 139,
20476     darkcyan: 35723,
20477     darkgoldenrod: 12092939,
20478     darkgray: 11119017,
20479     darkgreen: 25600,
20480     darkgrey: 11119017,
20481     darkkhaki: 12433259,
20482     darkmagenta: 9109643,
20483     darkolivegreen: 5597999,
20484     darkorange: 16747520,
20485     darkorchid: 10040012,
20486     darkred: 9109504,
20487     darksalmon: 15308410,
20488     darkseagreen: 9419919,
20489     darkslateblue: 4734347,
20490     darkslategray: 3100495,
20491     darkslategrey: 3100495,
20492     darkturquoise: 52945,
20493     darkviolet: 9699539,
20494     deeppink: 16716947,
20495     deepskyblue: 49151,
20496     dimgray: 6908265,
20497     dimgrey: 6908265,
20498     dodgerblue: 2003199,
20499     firebrick: 11674146,
20500     floralwhite: 16775920,
20501     forestgreen: 2263842,
20502     fuchsia: 16711935,
20503     gainsboro: 14474460,
20504     ghostwhite: 16316671,
20505     gold: 16766720,
20506     goldenrod: 14329120,
20507     gray: 8421504,
20508     green: 32768,
20509     greenyellow: 11403055,
20510     grey: 8421504,
20511     honeydew: 15794160,
20512     hotpink: 16738740,
20513     indianred: 13458524,
20514     indigo: 4915330,
20515     ivory: 16777200,
20516     khaki: 15787660,
20517     lavender: 15132410,
20518     lavenderblush: 16773365,
20519     lawngreen: 8190976,
20520     lemonchiffon: 16775885,
20521     lightblue: 11393254,
20522     lightcoral: 15761536,
20523     lightcyan: 14745599,
20524     lightgoldenrodyellow: 16448210,
20525     lightgray: 13882323,
20526     lightgreen: 9498256,
20527     lightgrey: 13882323,
20528     lightpink: 16758465,
20529     lightsalmon: 16752762,
20530     lightseagreen: 2142890,
20531     lightskyblue: 8900346,
20532     lightslategray: 7833753,
20533     lightslategrey: 7833753,
20534     lightsteelblue: 11584734,
20535     lightyellow: 16777184,
20536     lime: 65280,
20537     limegreen: 3329330,
20538     linen: 16445670,
20539     magenta: 16711935,
20540     maroon: 8388608,
20541     mediumaquamarine: 6737322,
20542     mediumblue: 205,
20543     mediumorchid: 12211667,
20544     mediumpurple: 9662683,
20545     mediumseagreen: 3978097,
20546     mediumslateblue: 8087790,
20547     mediumspringgreen: 64154,
20548     mediumturquoise: 4772300,
20549     mediumvioletred: 13047173,
20550     midnightblue: 1644912,
20551     mintcream: 16121850,
20552     mistyrose: 16770273,
20553     moccasin: 16770229,
20554     navajowhite: 16768685,
20555     navy: 128,
20556     oldlace: 16643558,
20557     olive: 8421376,
20558     olivedrab: 7048739,
20559     orange: 16753920,
20560     orangered: 16729344,
20561     orchid: 14315734,
20562     palegoldenrod: 15657130,
20563     palegreen: 10025880,
20564     paleturquoise: 11529966,
20565     palevioletred: 14381203,
20566     papayawhip: 16773077,
20567     peachpuff: 16767673,
20568     peru: 13468991,
20569     pink: 16761035,
20570     plum: 14524637,
20571     powderblue: 11591910,
20572     purple: 8388736,
20573     rebeccapurple: 6697881,
20574     red: 16711680,
20575     rosybrown: 12357519,
20576     royalblue: 4286945,
20577     saddlebrown: 9127187,
20578     salmon: 16416882,
20579     sandybrown: 16032864,
20580     seagreen: 3050327,
20581     seashell: 16774638,
20582     sienna: 10506797,
20583     silver: 12632256,
20584     skyblue: 8900331,
20585     slateblue: 6970061,
20586     slategray: 7372944,
20587     slategrey: 7372944,
20588     snow: 16775930,
20589     springgreen: 65407,
20590     steelblue: 4620980,
20591     tan: 13808780,
20592     teal: 32896,
20593     thistle: 14204888,
20594     tomato: 16737095,
20595     turquoise: 4251856,
20596     violet: 15631086,
20597     wheat: 16113331,
20598     white: 16777215,
20599     whitesmoke: 16119285,
20600     yellow: 16776960,
20601     yellowgreen: 10145074
20602   };
20603   define_default(Color, color, {
20604     copy(channels) {
20605       return Object.assign(new this.constructor(), this, channels);
20606     },
20607     displayable() {
20608       return this.rgb().displayable();
20609     },
20610     hex: color_formatHex,
20611     // Deprecated! Use color.formatHex.
20612     formatHex: color_formatHex,
20613     formatHex8: color_formatHex8,
20614     formatHsl: color_formatHsl,
20615     formatRgb: color_formatRgb,
20616     toString: color_formatRgb
20617   });
20618   function color_formatHex() {
20619     return this.rgb().formatHex();
20620   }
20621   function color_formatHex8() {
20622     return this.rgb().formatHex8();
20623   }
20624   function color_formatHsl() {
20625     return hslConvert(this).formatHsl();
20626   }
20627   function color_formatRgb() {
20628     return this.rgb().formatRgb();
20629   }
20630   function color(format2) {
20631     var m, l;
20632     format2 = (format2 + "").trim().toLowerCase();
20633     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;
20634   }
20635   function rgbn(n2) {
20636     return new Rgb(n2 >> 16 & 255, n2 >> 8 & 255, n2 & 255, 1);
20637   }
20638   function rgba(r, g, b, a) {
20639     if (a <= 0)
20640       r = g = b = NaN;
20641     return new Rgb(r, g, b, a);
20642   }
20643   function rgbConvert(o) {
20644     if (!(o instanceof Color))
20645       o = color(o);
20646     if (!o)
20647       return new Rgb();
20648     o = o.rgb();
20649     return new Rgb(o.r, o.g, o.b, o.opacity);
20650   }
20651   function rgb(r, g, b, opacity) {
20652     return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
20653   }
20654   function Rgb(r, g, b, opacity) {
20655     this.r = +r;
20656     this.g = +g;
20657     this.b = +b;
20658     this.opacity = +opacity;
20659   }
20660   define_default(Rgb, rgb, extend(Color, {
20661     brighter(k) {
20662       k = k == null ? brighter : Math.pow(brighter, k);
20663       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
20664     },
20665     darker(k) {
20666       k = k == null ? darker : Math.pow(darker, k);
20667       return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
20668     },
20669     rgb() {
20670       return this;
20671     },
20672     clamp() {
20673       return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));
20674     },
20675     displayable() {
20676       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);
20677     },
20678     hex: rgb_formatHex,
20679     // Deprecated! Use color.formatHex.
20680     formatHex: rgb_formatHex,
20681     formatHex8: rgb_formatHex8,
20682     formatRgb: rgb_formatRgb,
20683     toString: rgb_formatRgb
20684   }));
20685   function rgb_formatHex() {
20686     return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;
20687   }
20688   function rgb_formatHex8() {
20689     return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;
20690   }
20691   function rgb_formatRgb() {
20692     const a = clampa(this.opacity);
20693     return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`;
20694   }
20695   function clampa(opacity) {
20696     return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));
20697   }
20698   function clampi(value) {
20699     return Math.max(0, Math.min(255, Math.round(value) || 0));
20700   }
20701   function hex(value) {
20702     value = clampi(value);
20703     return (value < 16 ? "0" : "") + value.toString(16);
20704   }
20705   function hsla(h, s, l, a) {
20706     if (a <= 0)
20707       h = s = l = NaN;
20708     else if (l <= 0 || l >= 1)
20709       h = s = NaN;
20710     else if (s <= 0)
20711       h = NaN;
20712     return new Hsl(h, s, l, a);
20713   }
20714   function hslConvert(o) {
20715     if (o instanceof Hsl)
20716       return new Hsl(o.h, o.s, o.l, o.opacity);
20717     if (!(o instanceof Color))
20718       o = color(o);
20719     if (!o)
20720       return new Hsl();
20721     if (o instanceof Hsl)
20722       return o;
20723     o = o.rgb();
20724     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;
20725     if (s) {
20726       if (r === max3)
20727         h = (g - b) / s + (g < b) * 6;
20728       else if (g === max3)
20729         h = (b - r) / s + 2;
20730       else
20731         h = (r - g) / s + 4;
20732       s /= l < 0.5 ? max3 + min3 : 2 - max3 - min3;
20733       h *= 60;
20734     } else {
20735       s = l > 0 && l < 1 ? 0 : h;
20736     }
20737     return new Hsl(h, s, l, o.opacity);
20738   }
20739   function hsl(h, s, l, opacity) {
20740     return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
20741   }
20742   function Hsl(h, s, l, opacity) {
20743     this.h = +h;
20744     this.s = +s;
20745     this.l = +l;
20746     this.opacity = +opacity;
20747   }
20748   define_default(Hsl, hsl, extend(Color, {
20749     brighter(k) {
20750       k = k == null ? brighter : Math.pow(brighter, k);
20751       return new Hsl(this.h, this.s, this.l * k, this.opacity);
20752     },
20753     darker(k) {
20754       k = k == null ? darker : Math.pow(darker, k);
20755       return new Hsl(this.h, this.s, this.l * k, this.opacity);
20756     },
20757     rgb() {
20758       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;
20759       return new Rgb(
20760         hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
20761         hsl2rgb(h, m1, m2),
20762         hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
20763         this.opacity
20764       );
20765     },
20766     clamp() {
20767       return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));
20768     },
20769     displayable() {
20770       return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);
20771     },
20772     formatHsl() {
20773       const a = clampa(this.opacity);
20774       return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`;
20775     }
20776   }));
20777   function clamph(value) {
20778     value = (value || 0) % 360;
20779     return value < 0 ? value + 360 : value;
20780   }
20781   function clampt(value) {
20782     return Math.max(0, Math.min(1, value || 0));
20783   }
20784   function hsl2rgb(h, m1, m2) {
20785     return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
20786   }
20787
20788   // node_modules/d3-interpolate/src/basis.js
20789   function basis(t1, v0, v1, v2, v3) {
20790     var t2 = t1 * t1, t3 = t2 * t1;
20791     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;
20792   }
20793   function basis_default(values) {
20794     var n2 = values.length - 1;
20795     return function(t) {
20796       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;
20797       return basis((t - i2 / n2) * n2, v0, v1, v2, v3);
20798     };
20799   }
20800
20801   // node_modules/d3-interpolate/src/basisClosed.js
20802   function basisClosed_default(values) {
20803     var n2 = values.length;
20804     return function(t) {
20805       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];
20806       return basis((t - i2 / n2) * n2, v0, v1, v2, v3);
20807     };
20808   }
20809
20810   // node_modules/d3-interpolate/src/constant.js
20811   var constant_default3 = (x) => () => x;
20812
20813   // node_modules/d3-interpolate/src/color.js
20814   function linear(a, d) {
20815     return function(t) {
20816       return a + t * d;
20817     };
20818   }
20819   function exponential(a, b, y) {
20820     return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
20821       return Math.pow(a + t * b, y);
20822     };
20823   }
20824   function gamma(y) {
20825     return (y = +y) === 1 ? nogamma : function(a, b) {
20826       return b - a ? exponential(a, b, y) : constant_default3(isNaN(a) ? b : a);
20827     };
20828   }
20829   function nogamma(a, b) {
20830     var d = b - a;
20831     return d ? linear(a, d) : constant_default3(isNaN(a) ? b : a);
20832   }
20833
20834   // node_modules/d3-interpolate/src/rgb.js
20835   var rgb_default = function rgbGamma(y) {
20836     var color2 = gamma(y);
20837     function rgb2(start2, end) {
20838       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);
20839       return function(t) {
20840         start2.r = r(t);
20841         start2.g = g(t);
20842         start2.b = b(t);
20843         start2.opacity = opacity(t);
20844         return start2 + "";
20845       };
20846     }
20847     rgb2.gamma = rgbGamma;
20848     return rgb2;
20849   }(1);
20850   function rgbSpline(spline) {
20851     return function(colors) {
20852       var n2 = colors.length, r = new Array(n2), g = new Array(n2), b = new Array(n2), i2, color2;
20853       for (i2 = 0; i2 < n2; ++i2) {
20854         color2 = rgb(colors[i2]);
20855         r[i2] = color2.r || 0;
20856         g[i2] = color2.g || 0;
20857         b[i2] = color2.b || 0;
20858       }
20859       r = spline(r);
20860       g = spline(g);
20861       b = spline(b);
20862       color2.opacity = 1;
20863       return function(t) {
20864         color2.r = r(t);
20865         color2.g = g(t);
20866         color2.b = b(t);
20867         return color2 + "";
20868       };
20869     };
20870   }
20871   var rgbBasis = rgbSpline(basis_default);
20872   var rgbBasisClosed = rgbSpline(basisClosed_default);
20873
20874   // node_modules/d3-interpolate/src/numberArray.js
20875   function numberArray_default(a, b) {
20876     if (!b)
20877       b = [];
20878     var n2 = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i2;
20879     return function(t) {
20880       for (i2 = 0; i2 < n2; ++i2)
20881         c[i2] = a[i2] * (1 - t) + b[i2] * t;
20882       return c;
20883     };
20884   }
20885   function isNumberArray(x) {
20886     return ArrayBuffer.isView(x) && !(x instanceof DataView);
20887   }
20888
20889   // node_modules/d3-interpolate/src/array.js
20890   function genericArray(a, b) {
20891     var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i2;
20892     for (i2 = 0; i2 < na; ++i2)
20893       x[i2] = value_default(a[i2], b[i2]);
20894     for (; i2 < nb; ++i2)
20895       c[i2] = b[i2];
20896     return function(t) {
20897       for (i2 = 0; i2 < na; ++i2)
20898         c[i2] = x[i2](t);
20899       return c;
20900     };
20901   }
20902
20903   // node_modules/d3-interpolate/src/date.js
20904   function date_default(a, b) {
20905     var d = /* @__PURE__ */ new Date();
20906     return a = +a, b = +b, function(t) {
20907       return d.setTime(a * (1 - t) + b * t), d;
20908     };
20909   }
20910
20911   // node_modules/d3-interpolate/src/number.js
20912   function number_default(a, b) {
20913     return a = +a, b = +b, function(t) {
20914       return a * (1 - t) + b * t;
20915     };
20916   }
20917
20918   // node_modules/d3-interpolate/src/object.js
20919   function object_default(a, b) {
20920     var i2 = {}, c = {}, k;
20921     if (a === null || typeof a !== "object")
20922       a = {};
20923     if (b === null || typeof b !== "object")
20924       b = {};
20925     for (k in b) {
20926       if (k in a) {
20927         i2[k] = value_default(a[k], b[k]);
20928       } else {
20929         c[k] = b[k];
20930       }
20931     }
20932     return function(t) {
20933       for (k in i2)
20934         c[k] = i2[k](t);
20935       return c;
20936     };
20937   }
20938
20939   // node_modules/d3-interpolate/src/string.js
20940   var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
20941   var reB = new RegExp(reA.source, "g");
20942   function zero2(b) {
20943     return function() {
20944       return b;
20945     };
20946   }
20947   function one(b) {
20948     return function(t) {
20949       return b(t) + "";
20950     };
20951   }
20952   function string_default(a, b) {
20953     var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i2 = -1, s = [], q = [];
20954     a = a + "", b = b + "";
20955     while ((am = reA.exec(a)) && (bm = reB.exec(b))) {
20956       if ((bs = bm.index) > bi) {
20957         bs = b.slice(bi, bs);
20958         if (s[i2])
20959           s[i2] += bs;
20960         else
20961           s[++i2] = bs;
20962       }
20963       if ((am = am[0]) === (bm = bm[0])) {
20964         if (s[i2])
20965           s[i2] += bm;
20966         else
20967           s[++i2] = bm;
20968       } else {
20969         s[++i2] = null;
20970         q.push({ i: i2, x: number_default(am, bm) });
20971       }
20972       bi = reB.lastIndex;
20973     }
20974     if (bi < b.length) {
20975       bs = b.slice(bi);
20976       if (s[i2])
20977         s[i2] += bs;
20978       else
20979         s[++i2] = bs;
20980     }
20981     return s.length < 2 ? q[0] ? one(q[0].x) : zero2(b) : (b = q.length, function(t) {
20982       for (var i3 = 0, o; i3 < b; ++i3)
20983         s[(o = q[i3]).i] = o.x(t);
20984       return s.join("");
20985     });
20986   }
20987
20988   // node_modules/d3-interpolate/src/value.js
20989   function value_default(a, b) {
20990     var t = typeof b, c;
20991     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);
20992   }
20993
20994   // node_modules/d3-interpolate/src/round.js
20995   function round_default(a, b) {
20996     return a = +a, b = +b, function(t) {
20997       return Math.round(a * (1 - t) + b * t);
20998     };
20999   }
21000
21001   // node_modules/d3-interpolate/src/transform/decompose.js
21002   var degrees2 = 180 / Math.PI;
21003   var identity = {
21004     translateX: 0,
21005     translateY: 0,
21006     rotate: 0,
21007     skewX: 0,
21008     scaleX: 1,
21009     scaleY: 1
21010   };
21011   function decompose_default(a, b, c, d, e, f2) {
21012     var scaleX, scaleY, skewX;
21013     if (scaleX = Math.sqrt(a * a + b * b))
21014       a /= scaleX, b /= scaleX;
21015     if (skewX = a * c + b * d)
21016       c -= a * skewX, d -= b * skewX;
21017     if (scaleY = Math.sqrt(c * c + d * d))
21018       c /= scaleY, d /= scaleY, skewX /= scaleY;
21019     if (a * d < b * c)
21020       a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
21021     return {
21022       translateX: e,
21023       translateY: f2,
21024       rotate: Math.atan2(b, a) * degrees2,
21025       skewX: Math.atan(skewX) * degrees2,
21026       scaleX,
21027       scaleY
21028     };
21029   }
21030
21031   // node_modules/d3-interpolate/src/transform/parse.js
21032   var svgNode;
21033   function parseCss(value) {
21034     const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + "");
21035     return m.isIdentity ? identity : decompose_default(m.a, m.b, m.c, m.d, m.e, m.f);
21036   }
21037   function parseSvg(value) {
21038     if (value == null)
21039       return identity;
21040     if (!svgNode)
21041       svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
21042     svgNode.setAttribute("transform", value);
21043     if (!(value = svgNode.transform.baseVal.consolidate()))
21044       return identity;
21045     value = value.matrix;
21046     return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f);
21047   }
21048
21049   // node_modules/d3-interpolate/src/transform/index.js
21050   function interpolateTransform(parse, pxComma, pxParen, degParen) {
21051     function pop(s) {
21052       return s.length ? s.pop() + " " : "";
21053     }
21054     function translate(xa, ya, xb, yb, s, q) {
21055       if (xa !== xb || ya !== yb) {
21056         var i2 = s.push("translate(", null, pxComma, null, pxParen);
21057         q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) });
21058       } else if (xb || yb) {
21059         s.push("translate(" + xb + pxComma + yb + pxParen);
21060       }
21061     }
21062     function rotate(a, b, s, q) {
21063       if (a !== b) {
21064         if (a - b > 180)
21065           b += 360;
21066         else if (b - a > 180)
21067           a += 360;
21068         q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a, b) });
21069       } else if (b) {
21070         s.push(pop(s) + "rotate(" + b + degParen);
21071       }
21072     }
21073     function skewX(a, b, s, q) {
21074       if (a !== b) {
21075         q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a, b) });
21076       } else if (b) {
21077         s.push(pop(s) + "skewX(" + b + degParen);
21078       }
21079     }
21080     function scale(xa, ya, xb, yb, s, q) {
21081       if (xa !== xb || ya !== yb) {
21082         var i2 = s.push(pop(s) + "scale(", null, ",", null, ")");
21083         q.push({ i: i2 - 4, x: number_default(xa, xb) }, { i: i2 - 2, x: number_default(ya, yb) });
21084       } else if (xb !== 1 || yb !== 1) {
21085         s.push(pop(s) + "scale(" + xb + "," + yb + ")");
21086       }
21087     }
21088     return function(a, b) {
21089       var s = [], q = [];
21090       a = parse(a), b = parse(b);
21091       translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
21092       rotate(a.rotate, b.rotate, s, q);
21093       skewX(a.skewX, b.skewX, s, q);
21094       scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
21095       a = b = null;
21096       return function(t) {
21097         var i2 = -1, n2 = q.length, o;
21098         while (++i2 < n2)
21099           s[(o = q[i2]).i] = o.x(t);
21100         return s.join("");
21101       };
21102     };
21103   }
21104   var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
21105   var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
21106
21107   // node_modules/d3-interpolate/src/zoom.js
21108   var epsilon22 = 1e-12;
21109   function cosh(x) {
21110     return ((x = Math.exp(x)) + 1 / x) / 2;
21111   }
21112   function sinh(x) {
21113     return ((x = Math.exp(x)) - 1 / x) / 2;
21114   }
21115   function tanh(x) {
21116     return ((x = Math.exp(2 * x)) - 1) / (x + 1);
21117   }
21118   var zoom_default = function zoomRho(rho, rho2, rho4) {
21119     function zoom(p02, p1) {
21120       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;
21121       if (d2 < epsilon22) {
21122         S = Math.log(w1 / w0) / rho;
21123         i2 = function(t) {
21124           return [
21125             ux0 + t * dx,
21126             uy0 + t * dy,
21127             w0 * Math.exp(rho * t * S)
21128           ];
21129         };
21130       } else {
21131         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);
21132         S = (r1 - r0) / rho;
21133         i2 = function(t) {
21134           var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
21135           return [
21136             ux0 + u * dx,
21137             uy0 + u * dy,
21138             w0 * coshr0 / cosh(rho * s + r0)
21139           ];
21140         };
21141       }
21142       i2.duration = S * 1e3 * rho / Math.SQRT2;
21143       return i2;
21144     }
21145     zoom.rho = function(_) {
21146       var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;
21147       return zoomRho(_1, _2, _4);
21148     };
21149     return zoom;
21150   }(Math.SQRT2, 2, 4);
21151
21152   // node_modules/d3-interpolate/src/quantize.js
21153   function quantize_default(interpolator, n2) {
21154     var samples = new Array(n2);
21155     for (var i2 = 0; i2 < n2; ++i2)
21156       samples[i2] = interpolator(i2 / (n2 - 1));
21157     return samples;
21158   }
21159
21160   // node_modules/d3-timer/src/timer.js
21161   var frame = 0;
21162   var timeout = 0;
21163   var interval = 0;
21164   var pokeDelay = 1e3;
21165   var taskHead;
21166   var taskTail;
21167   var clockLast = 0;
21168   var clockNow = 0;
21169   var clockSkew = 0;
21170   var clock = typeof performance === "object" && performance.now ? performance : Date;
21171   var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f2) {
21172     setTimeout(f2, 17);
21173   };
21174   function now() {
21175     return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
21176   }
21177   function clearNow() {
21178     clockNow = 0;
21179   }
21180   function Timer() {
21181     this._call = this._time = this._next = null;
21182   }
21183   Timer.prototype = timer.prototype = {
21184     constructor: Timer,
21185     restart: function(callback, delay, time) {
21186       if (typeof callback !== "function")
21187         throw new TypeError("callback is not a function");
21188       time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
21189       if (!this._next && taskTail !== this) {
21190         if (taskTail)
21191           taskTail._next = this;
21192         else
21193           taskHead = this;
21194         taskTail = this;
21195       }
21196       this._call = callback;
21197       this._time = time;
21198       sleep();
21199     },
21200     stop: function() {
21201       if (this._call) {
21202         this._call = null;
21203         this._time = Infinity;
21204         sleep();
21205       }
21206     }
21207   };
21208   function timer(callback, delay, time) {
21209     var t = new Timer();
21210     t.restart(callback, delay, time);
21211     return t;
21212   }
21213   function timerFlush() {
21214     now();
21215     ++frame;
21216     var t = taskHead, e;
21217     while (t) {
21218       if ((e = clockNow - t._time) >= 0)
21219         t._call.call(void 0, e);
21220       t = t._next;
21221     }
21222     --frame;
21223   }
21224   function wake() {
21225     clockNow = (clockLast = clock.now()) + clockSkew;
21226     frame = timeout = 0;
21227     try {
21228       timerFlush();
21229     } finally {
21230       frame = 0;
21231       nap();
21232       clockNow = 0;
21233     }
21234   }
21235   function poke() {
21236     var now3 = clock.now(), delay = now3 - clockLast;
21237     if (delay > pokeDelay)
21238       clockSkew -= delay, clockLast = now3;
21239   }
21240   function nap() {
21241     var t0, t1 = taskHead, t2, time = Infinity;
21242     while (t1) {
21243       if (t1._call) {
21244         if (time > t1._time)
21245           time = t1._time;
21246         t0 = t1, t1 = t1._next;
21247       } else {
21248         t2 = t1._next, t1._next = null;
21249         t1 = t0 ? t0._next = t2 : taskHead = t2;
21250       }
21251     }
21252     taskTail = t0;
21253     sleep(time);
21254   }
21255   function sleep(time) {
21256     if (frame)
21257       return;
21258     if (timeout)
21259       timeout = clearTimeout(timeout);
21260     var delay = time - clockNow;
21261     if (delay > 24) {
21262       if (time < Infinity)
21263         timeout = setTimeout(wake, time - clock.now() - clockSkew);
21264       if (interval)
21265         interval = clearInterval(interval);
21266     } else {
21267       if (!interval)
21268         clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
21269       frame = 1, setFrame(wake);
21270     }
21271   }
21272
21273   // node_modules/d3-timer/src/timeout.js
21274   function timeout_default(callback, delay, time) {
21275     var t = new Timer();
21276     delay = delay == null ? 0 : +delay;
21277     t.restart((elapsed) => {
21278       t.stop();
21279       callback(elapsed + delay);
21280     }, delay, time);
21281     return t;
21282   }
21283
21284   // node_modules/d3-transition/src/transition/schedule.js
21285   var emptyOn = dispatch_default("start", "end", "cancel", "interrupt");
21286   var emptyTween = [];
21287   var CREATED = 0;
21288   var SCHEDULED = 1;
21289   var STARTING = 2;
21290   var STARTED = 3;
21291   var RUNNING = 4;
21292   var ENDING = 5;
21293   var ENDED = 6;
21294   function schedule_default(node, name, id2, index, group, timing) {
21295     var schedules = node.__transition;
21296     if (!schedules)
21297       node.__transition = {};
21298     else if (id2 in schedules)
21299       return;
21300     create(node, id2, {
21301       name,
21302       index,
21303       // For context during callback.
21304       group,
21305       // For context during callback.
21306       on: emptyOn,
21307       tween: emptyTween,
21308       time: timing.time,
21309       delay: timing.delay,
21310       duration: timing.duration,
21311       ease: timing.ease,
21312       timer: null,
21313       state: CREATED
21314     });
21315   }
21316   function init(node, id2) {
21317     var schedule = get2(node, id2);
21318     if (schedule.state > CREATED)
21319       throw new Error("too late; already scheduled");
21320     return schedule;
21321   }
21322   function set2(node, id2) {
21323     var schedule = get2(node, id2);
21324     if (schedule.state > STARTED)
21325       throw new Error("too late; already running");
21326     return schedule;
21327   }
21328   function get2(node, id2) {
21329     var schedule = node.__transition;
21330     if (!schedule || !(schedule = schedule[id2]))
21331       throw new Error("transition not found");
21332     return schedule;
21333   }
21334   function create(node, id2, self2) {
21335     var schedules = node.__transition, tween;
21336     schedules[id2] = self2;
21337     self2.timer = timer(schedule, 0, self2.time);
21338     function schedule(elapsed) {
21339       self2.state = SCHEDULED;
21340       self2.timer.restart(start2, self2.delay, self2.time);
21341       if (self2.delay <= elapsed)
21342         start2(elapsed - self2.delay);
21343     }
21344     function start2(elapsed) {
21345       var i2, j2, n2, o;
21346       if (self2.state !== SCHEDULED)
21347         return stop();
21348       for (i2 in schedules) {
21349         o = schedules[i2];
21350         if (o.name !== self2.name)
21351           continue;
21352         if (o.state === STARTED)
21353           return timeout_default(start2);
21354         if (o.state === RUNNING) {
21355           o.state = ENDED;
21356           o.timer.stop();
21357           o.on.call("interrupt", node, node.__data__, o.index, o.group);
21358           delete schedules[i2];
21359         } else if (+i2 < id2) {
21360           o.state = ENDED;
21361           o.timer.stop();
21362           o.on.call("cancel", node, node.__data__, o.index, o.group);
21363           delete schedules[i2];
21364         }
21365       }
21366       timeout_default(function() {
21367         if (self2.state === STARTED) {
21368           self2.state = RUNNING;
21369           self2.timer.restart(tick, self2.delay, self2.time);
21370           tick(elapsed);
21371         }
21372       });
21373       self2.state = STARTING;
21374       self2.on.call("start", node, node.__data__, self2.index, self2.group);
21375       if (self2.state !== STARTING)
21376         return;
21377       self2.state = STARTED;
21378       tween = new Array(n2 = self2.tween.length);
21379       for (i2 = 0, j2 = -1; i2 < n2; ++i2) {
21380         if (o = self2.tween[i2].value.call(node, node.__data__, self2.index, self2.group)) {
21381           tween[++j2] = o;
21382         }
21383       }
21384       tween.length = j2 + 1;
21385     }
21386     function tick(elapsed) {
21387       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;
21388       while (++i2 < n2) {
21389         tween[i2].call(node, t);
21390       }
21391       if (self2.state === ENDING) {
21392         self2.on.call("end", node, node.__data__, self2.index, self2.group);
21393         stop();
21394       }
21395     }
21396     function stop() {
21397       self2.state = ENDED;
21398       self2.timer.stop();
21399       delete schedules[id2];
21400       for (var i2 in schedules)
21401         return;
21402       delete node.__transition;
21403     }
21404   }
21405
21406   // node_modules/d3-transition/src/interrupt.js
21407   function interrupt_default(node, name) {
21408     var schedules = node.__transition, schedule, active, empty2 = true, i2;
21409     if (!schedules)
21410       return;
21411     name = name == null ? null : name + "";
21412     for (i2 in schedules) {
21413       if ((schedule = schedules[i2]).name !== name) {
21414         empty2 = false;
21415         continue;
21416       }
21417       active = schedule.state > STARTING && schedule.state < ENDING;
21418       schedule.state = ENDED;
21419       schedule.timer.stop();
21420       schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
21421       delete schedules[i2];
21422     }
21423     if (empty2)
21424       delete node.__transition;
21425   }
21426
21427   // node_modules/d3-transition/src/selection/interrupt.js
21428   function interrupt_default2(name) {
21429     return this.each(function() {
21430       interrupt_default(this, name);
21431     });
21432   }
21433
21434   // node_modules/d3-transition/src/transition/tween.js
21435   function tweenRemove(id2, name) {
21436     var tween0, tween1;
21437     return function() {
21438       var schedule = set2(this, id2), tween = schedule.tween;
21439       if (tween !== tween0) {
21440         tween1 = tween0 = tween;
21441         for (var i2 = 0, n2 = tween1.length; i2 < n2; ++i2) {
21442           if (tween1[i2].name === name) {
21443             tween1 = tween1.slice();
21444             tween1.splice(i2, 1);
21445             break;
21446           }
21447         }
21448       }
21449       schedule.tween = tween1;
21450     };
21451   }
21452   function tweenFunction(id2, name, value) {
21453     var tween0, tween1;
21454     if (typeof value !== "function")
21455       throw new Error();
21456     return function() {
21457       var schedule = set2(this, id2), tween = schedule.tween;
21458       if (tween !== tween0) {
21459         tween1 = (tween0 = tween).slice();
21460         for (var t = { name, value }, i2 = 0, n2 = tween1.length; i2 < n2; ++i2) {
21461           if (tween1[i2].name === name) {
21462             tween1[i2] = t;
21463             break;
21464           }
21465         }
21466         if (i2 === n2)
21467           tween1.push(t);
21468       }
21469       schedule.tween = tween1;
21470     };
21471   }
21472   function tween_default(name, value) {
21473     var id2 = this._id;
21474     name += "";
21475     if (arguments.length < 2) {
21476       var tween = get2(this.node(), id2).tween;
21477       for (var i2 = 0, n2 = tween.length, t; i2 < n2; ++i2) {
21478         if ((t = tween[i2]).name === name) {
21479           return t.value;
21480         }
21481       }
21482       return null;
21483     }
21484     return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value));
21485   }
21486   function tweenValue(transition2, name, value) {
21487     var id2 = transition2._id;
21488     transition2.each(function() {
21489       var schedule = set2(this, id2);
21490       (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
21491     });
21492     return function(node) {
21493       return get2(node, id2).value[name];
21494     };
21495   }
21496
21497   // node_modules/d3-transition/src/transition/interpolate.js
21498   function interpolate_default(a, b) {
21499     var c;
21500     return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c = color(b)) ? (b = c, rgb_default) : string_default)(a, b);
21501   }
21502
21503   // node_modules/d3-transition/src/transition/attr.js
21504   function attrRemove2(name) {
21505     return function() {
21506       this.removeAttribute(name);
21507     };
21508   }
21509   function attrRemoveNS2(fullname) {
21510     return function() {
21511       this.removeAttributeNS(fullname.space, fullname.local);
21512     };
21513   }
21514   function attrConstant2(name, interpolate, value1) {
21515     var string00, string1 = value1 + "", interpolate0;
21516     return function() {
21517       var string0 = this.getAttribute(name);
21518       return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
21519     };
21520   }
21521   function attrConstantNS2(fullname, interpolate, value1) {
21522     var string00, string1 = value1 + "", interpolate0;
21523     return function() {
21524       var string0 = this.getAttributeNS(fullname.space, fullname.local);
21525       return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
21526     };
21527   }
21528   function attrFunction2(name, interpolate, value) {
21529     var string00, string10, interpolate0;
21530     return function() {
21531       var string0, value1 = value(this), string1;
21532       if (value1 == null)
21533         return void this.removeAttribute(name);
21534       string0 = this.getAttribute(name);
21535       string1 = value1 + "";
21536       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
21537     };
21538   }
21539   function attrFunctionNS2(fullname, interpolate, value) {
21540     var string00, string10, interpolate0;
21541     return function() {
21542       var string0, value1 = value(this), string1;
21543       if (value1 == null)
21544         return void this.removeAttributeNS(fullname.space, fullname.local);
21545       string0 = this.getAttributeNS(fullname.space, fullname.local);
21546       string1 = value1 + "";
21547       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
21548     };
21549   }
21550   function attr_default2(name, value) {
21551     var fullname = namespace_default(name), i2 = fullname === "transform" ? interpolateTransformSvg : interpolate_default;
21552     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));
21553   }
21554
21555   // node_modules/d3-transition/src/transition/attrTween.js
21556   function attrInterpolate(name, i2) {
21557     return function(t) {
21558       this.setAttribute(name, i2.call(this, t));
21559     };
21560   }
21561   function attrInterpolateNS(fullname, i2) {
21562     return function(t) {
21563       this.setAttributeNS(fullname.space, fullname.local, i2.call(this, t));
21564     };
21565   }
21566   function attrTweenNS(fullname, value) {
21567     var t0, i0;
21568     function tween() {
21569       var i2 = value.apply(this, arguments);
21570       if (i2 !== i0)
21571         t0 = (i0 = i2) && attrInterpolateNS(fullname, i2);
21572       return t0;
21573     }
21574     tween._value = value;
21575     return tween;
21576   }
21577   function attrTween(name, value) {
21578     var t0, i0;
21579     function tween() {
21580       var i2 = value.apply(this, arguments);
21581       if (i2 !== i0)
21582         t0 = (i0 = i2) && attrInterpolate(name, i2);
21583       return t0;
21584     }
21585     tween._value = value;
21586     return tween;
21587   }
21588   function attrTween_default(name, value) {
21589     var key = "attr." + name;
21590     if (arguments.length < 2)
21591       return (key = this.tween(key)) && key._value;
21592     if (value == null)
21593       return this.tween(key, null);
21594     if (typeof value !== "function")
21595       throw new Error();
21596     var fullname = namespace_default(name);
21597     return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
21598   }
21599
21600   // node_modules/d3-transition/src/transition/delay.js
21601   function delayFunction(id2, value) {
21602     return function() {
21603       init(this, id2).delay = +value.apply(this, arguments);
21604     };
21605   }
21606   function delayConstant(id2, value) {
21607     return value = +value, function() {
21608       init(this, id2).delay = value;
21609     };
21610   }
21611   function delay_default(value) {
21612     var id2 = this._id;
21613     return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay;
21614   }
21615
21616   // node_modules/d3-transition/src/transition/duration.js
21617   function durationFunction(id2, value) {
21618     return function() {
21619       set2(this, id2).duration = +value.apply(this, arguments);
21620     };
21621   }
21622   function durationConstant(id2, value) {
21623     return value = +value, function() {
21624       set2(this, id2).duration = value;
21625     };
21626   }
21627   function duration_default(value) {
21628     var id2 = this._id;
21629     return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration;
21630   }
21631
21632   // node_modules/d3-transition/src/transition/ease.js
21633   function easeConstant(id2, value) {
21634     if (typeof value !== "function")
21635       throw new Error();
21636     return function() {
21637       set2(this, id2).ease = value;
21638     };
21639   }
21640   function ease_default(value) {
21641     var id2 = this._id;
21642     return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease;
21643   }
21644
21645   // node_modules/d3-transition/src/transition/easeVarying.js
21646   function easeVarying(id2, value) {
21647     return function() {
21648       var v = value.apply(this, arguments);
21649       if (typeof v !== "function")
21650         throw new Error();
21651       set2(this, id2).ease = v;
21652     };
21653   }
21654   function easeVarying_default(value) {
21655     if (typeof value !== "function")
21656       throw new Error();
21657     return this.each(easeVarying(this._id, value));
21658   }
21659
21660   // node_modules/d3-transition/src/transition/filter.js
21661   function filter_default2(match) {
21662     if (typeof match !== "function")
21663       match = matcher_default(match);
21664     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
21665       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = [], node, i2 = 0; i2 < n2; ++i2) {
21666         if ((node = group[i2]) && match.call(node, node.__data__, i2, group)) {
21667           subgroup.push(node);
21668         }
21669       }
21670     }
21671     return new Transition(subgroups, this._parents, this._name, this._id);
21672   }
21673
21674   // node_modules/d3-transition/src/transition/merge.js
21675   function merge_default2(transition2) {
21676     if (transition2._id !== this._id)
21677       throw new Error();
21678     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) {
21679       for (var group0 = groups0[j2], group1 = groups1[j2], n2 = group0.length, merge2 = merges[j2] = new Array(n2), node, i2 = 0; i2 < n2; ++i2) {
21680         if (node = group0[i2] || group1[i2]) {
21681           merge2[i2] = node;
21682         }
21683       }
21684     }
21685     for (; j2 < m0; ++j2) {
21686       merges[j2] = groups0[j2];
21687     }
21688     return new Transition(merges, this._parents, this._name, this._id);
21689   }
21690
21691   // node_modules/d3-transition/src/transition/on.js
21692   function start(name) {
21693     return (name + "").trim().split(/^|\s+/).every(function(t) {
21694       var i2 = t.indexOf(".");
21695       if (i2 >= 0)
21696         t = t.slice(0, i2);
21697       return !t || t === "start";
21698     });
21699   }
21700   function onFunction(id2, name, listener) {
21701     var on0, on1, sit = start(name) ? init : set2;
21702     return function() {
21703       var schedule = sit(this, id2), on = schedule.on;
21704       if (on !== on0)
21705         (on1 = (on0 = on).copy()).on(name, listener);
21706       schedule.on = on1;
21707     };
21708   }
21709   function on_default2(name, listener) {
21710     var id2 = this._id;
21711     return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener));
21712   }
21713
21714   // node_modules/d3-transition/src/transition/remove.js
21715   function removeFunction(id2) {
21716     return function() {
21717       var parent = this.parentNode;
21718       for (var i2 in this.__transition)
21719         if (+i2 !== id2)
21720           return;
21721       if (parent)
21722         parent.removeChild(this);
21723     };
21724   }
21725   function remove_default2() {
21726     return this.on("end.remove", removeFunction(this._id));
21727   }
21728
21729   // node_modules/d3-transition/src/transition/select.js
21730   function select_default3(select) {
21731     var name = this._name, id2 = this._id;
21732     if (typeof select !== "function")
21733       select = selector_default(select);
21734     for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j2 = 0; j2 < m; ++j2) {
21735       for (var group = groups[j2], n2 = group.length, subgroup = subgroups[j2] = new Array(n2), node, subnode, i2 = 0; i2 < n2; ++i2) {
21736         if ((node = group[i2]) && (subnode = select.call(node, node.__data__, i2, group))) {
21737           if ("__data__" in node)
21738             subnode.__data__ = node.__data__;
21739           subgroup[i2] = subnode;
21740           schedule_default(subgroup[i2], name, id2, i2, subgroup, get2(node, id2));
21741         }
21742       }
21743     }
21744     return new Transition(subgroups, this._parents, name, id2);
21745   }
21746
21747   // node_modules/d3-transition/src/transition/selectAll.js
21748   function selectAll_default3(select) {
21749     var name = this._name, id2 = this._id;
21750     if (typeof select !== "function")
21751       select = selectorAll_default(select);
21752     for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j2 = 0; j2 < m; ++j2) {
21753       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
21754         if (node = group[i2]) {
21755           for (var children2 = select.call(node, node.__data__, i2, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) {
21756             if (child = children2[k]) {
21757               schedule_default(child, name, id2, k, children2, inherit2);
21758             }
21759           }
21760           subgroups.push(children2);
21761           parents.push(node);
21762         }
21763       }
21764     }
21765     return new Transition(subgroups, parents, name, id2);
21766   }
21767
21768   // node_modules/d3-transition/src/transition/selection.js
21769   var Selection2 = selection_default.prototype.constructor;
21770   function selection_default2() {
21771     return new Selection2(this._groups, this._parents);
21772   }
21773
21774   // node_modules/d3-transition/src/transition/style.js
21775   function styleNull(name, interpolate) {
21776     var string00, string10, interpolate0;
21777     return function() {
21778       var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name));
21779       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1);
21780     };
21781   }
21782   function styleRemove2(name) {
21783     return function() {
21784       this.style.removeProperty(name);
21785     };
21786   }
21787   function styleConstant2(name, interpolate, value1) {
21788     var string00, string1 = value1 + "", interpolate0;
21789     return function() {
21790       var string0 = styleValue(this, name);
21791       return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1);
21792     };
21793   }
21794   function styleFunction2(name, interpolate, value) {
21795     var string00, string10, interpolate0;
21796     return function() {
21797       var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + "";
21798       if (value1 == null)
21799         string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
21800       return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
21801     };
21802   }
21803   function styleMaybeRemove(id2, name) {
21804     var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2;
21805     return function() {
21806       var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0;
21807       if (on !== on0 || listener0 !== listener)
21808         (on1 = (on0 = on).copy()).on(event, listener0 = listener);
21809       schedule.on = on1;
21810     };
21811   }
21812   function style_default2(name, value, priority) {
21813     var i2 = (name += "") === "transform" ? interpolateTransformCss : interpolate_default;
21814     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);
21815   }
21816
21817   // node_modules/d3-transition/src/transition/styleTween.js
21818   function styleInterpolate(name, i2, priority) {
21819     return function(t) {
21820       this.style.setProperty(name, i2.call(this, t), priority);
21821     };
21822   }
21823   function styleTween(name, value, priority) {
21824     var t, i0;
21825     function tween() {
21826       var i2 = value.apply(this, arguments);
21827       if (i2 !== i0)
21828         t = (i0 = i2) && styleInterpolate(name, i2, priority);
21829       return t;
21830     }
21831     tween._value = value;
21832     return tween;
21833   }
21834   function styleTween_default(name, value, priority) {
21835     var key = "style." + (name += "");
21836     if (arguments.length < 2)
21837       return (key = this.tween(key)) && key._value;
21838     if (value == null)
21839       return this.tween(key, null);
21840     if (typeof value !== "function")
21841       throw new Error();
21842     return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
21843   }
21844
21845   // node_modules/d3-transition/src/transition/text.js
21846   function textConstant2(value) {
21847     return function() {
21848       this.textContent = value;
21849     };
21850   }
21851   function textFunction2(value) {
21852     return function() {
21853       var value1 = value(this);
21854       this.textContent = value1 == null ? "" : value1;
21855     };
21856   }
21857   function text_default2(value) {
21858     return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + ""));
21859   }
21860
21861   // node_modules/d3-transition/src/transition/textTween.js
21862   function textInterpolate(i2) {
21863     return function(t) {
21864       this.textContent = i2.call(this, t);
21865     };
21866   }
21867   function textTween(value) {
21868     var t0, i0;
21869     function tween() {
21870       var i2 = value.apply(this, arguments);
21871       if (i2 !== i0)
21872         t0 = (i0 = i2) && textInterpolate(i2);
21873       return t0;
21874     }
21875     tween._value = value;
21876     return tween;
21877   }
21878   function textTween_default(value) {
21879     var key = "text";
21880     if (arguments.length < 1)
21881       return (key = this.tween(key)) && key._value;
21882     if (value == null)
21883       return this.tween(key, null);
21884     if (typeof value !== "function")
21885       throw new Error();
21886     return this.tween(key, textTween(value));
21887   }
21888
21889   // node_modules/d3-transition/src/transition/transition.js
21890   function transition_default() {
21891     var name = this._name, id0 = this._id, id1 = newId();
21892     for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) {
21893       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
21894         if (node = group[i2]) {
21895           var inherit2 = get2(node, id0);
21896           schedule_default(node, name, id1, i2, group, {
21897             time: inherit2.time + inherit2.delay + inherit2.duration,
21898             delay: 0,
21899             duration: inherit2.duration,
21900             ease: inherit2.ease
21901           });
21902         }
21903       }
21904     }
21905     return new Transition(groups, this._parents, name, id1);
21906   }
21907
21908   // node_modules/d3-transition/src/transition/end.js
21909   function end_default() {
21910     var on0, on1, that = this, id2 = that._id, size = that.size();
21911     return new Promise(function(resolve, reject) {
21912       var cancel = { value: reject }, end = { value: function() {
21913         if (--size === 0)
21914           resolve();
21915       } };
21916       that.each(function() {
21917         var schedule = set2(this, id2), on = schedule.on;
21918         if (on !== on0) {
21919           on1 = (on0 = on).copy();
21920           on1._.cancel.push(cancel);
21921           on1._.interrupt.push(cancel);
21922           on1._.end.push(end);
21923         }
21924         schedule.on = on1;
21925       });
21926       if (size === 0)
21927         resolve();
21928     });
21929   }
21930
21931   // node_modules/d3-transition/src/transition/index.js
21932   var id = 0;
21933   function Transition(groups, parents, name, id2) {
21934     this._groups = groups;
21935     this._parents = parents;
21936     this._name = name;
21937     this._id = id2;
21938   }
21939   function transition(name) {
21940     return selection_default().transition(name);
21941   }
21942   function newId() {
21943     return ++id;
21944   }
21945   var selection_prototype = selection_default.prototype;
21946   Transition.prototype = transition.prototype = {
21947     constructor: Transition,
21948     select: select_default3,
21949     selectAll: selectAll_default3,
21950     selectChild: selection_prototype.selectChild,
21951     selectChildren: selection_prototype.selectChildren,
21952     filter: filter_default2,
21953     merge: merge_default2,
21954     selection: selection_default2,
21955     transition: transition_default,
21956     call: selection_prototype.call,
21957     nodes: selection_prototype.nodes,
21958     node: selection_prototype.node,
21959     size: selection_prototype.size,
21960     empty: selection_prototype.empty,
21961     each: selection_prototype.each,
21962     on: on_default2,
21963     attr: attr_default2,
21964     attrTween: attrTween_default,
21965     style: style_default2,
21966     styleTween: styleTween_default,
21967     text: text_default2,
21968     textTween: textTween_default,
21969     remove: remove_default2,
21970     tween: tween_default,
21971     delay: delay_default,
21972     duration: duration_default,
21973     ease: ease_default,
21974     easeVarying: easeVarying_default,
21975     end: end_default,
21976     [Symbol.iterator]: selection_prototype[Symbol.iterator]
21977   };
21978
21979   // node_modules/d3-ease/src/linear.js
21980   var linear2 = (t) => +t;
21981
21982   // node_modules/d3-ease/src/cubic.js
21983   function cubicInOut(t) {
21984     return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
21985   }
21986
21987   // node_modules/d3-transition/src/selection/transition.js
21988   var defaultTiming = {
21989     time: null,
21990     // Set on use.
21991     delay: 0,
21992     duration: 250,
21993     ease: cubicInOut
21994   };
21995   function inherit(node, id2) {
21996     var timing;
21997     while (!(timing = node.__transition) || !(timing = timing[id2])) {
21998       if (!(node = node.parentNode)) {
21999         throw new Error(`transition ${id2} not found`);
22000       }
22001     }
22002     return timing;
22003   }
22004   function transition_default2(name) {
22005     var id2, timing;
22006     if (name instanceof Transition) {
22007       id2 = name._id, name = name._name;
22008     } else {
22009       id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
22010     }
22011     for (var groups = this._groups, m = groups.length, j2 = 0; j2 < m; ++j2) {
22012       for (var group = groups[j2], n2 = group.length, node, i2 = 0; i2 < n2; ++i2) {
22013         if (node = group[i2]) {
22014           schedule_default(node, name, id2, i2, group, timing || inherit(node, id2));
22015         }
22016       }
22017     }
22018     return new Transition(groups, this._parents, name, id2);
22019   }
22020
22021   // node_modules/d3-transition/src/selection/index.js
22022   selection_default.prototype.interrupt = interrupt_default2;
22023   selection_default.prototype.transition = transition_default2;
22024
22025   // node_modules/d3-zoom/src/constant.js
22026   var constant_default4 = (x) => () => x;
22027
22028   // node_modules/d3-zoom/src/event.js
22029   function ZoomEvent(type2, {
22030     sourceEvent,
22031     target,
22032     transform: transform2,
22033     dispatch: dispatch10
22034   }) {
22035     Object.defineProperties(this, {
22036       type: { value: type2, enumerable: true, configurable: true },
22037       sourceEvent: { value: sourceEvent, enumerable: true, configurable: true },
22038       target: { value: target, enumerable: true, configurable: true },
22039       transform: { value: transform2, enumerable: true, configurable: true },
22040       _: { value: dispatch10 }
22041     });
22042   }
22043
22044   // node_modules/d3-zoom/src/transform.js
22045   function Transform(k, x, y) {
22046     this.k = k;
22047     this.x = x;
22048     this.y = y;
22049   }
22050   Transform.prototype = {
22051     constructor: Transform,
22052     scale: function(k) {
22053       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22054     },
22055     translate: function(x, y) {
22056       return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22057     },
22058     apply: function(point2) {
22059       return [point2[0] * this.k + this.x, point2[1] * this.k + this.y];
22060     },
22061     applyX: function(x) {
22062       return x * this.k + this.x;
22063     },
22064     applyY: function(y) {
22065       return y * this.k + this.y;
22066     },
22067     invert: function(location) {
22068       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22069     },
22070     invertX: function(x) {
22071       return (x - this.x) / this.k;
22072     },
22073     invertY: function(y) {
22074       return (y - this.y) / this.k;
22075     },
22076     rescaleX: function(x) {
22077       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22078     },
22079     rescaleY: function(y) {
22080       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22081     },
22082     toString: function() {
22083       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22084     }
22085   };
22086   var identity2 = new Transform(1, 0, 0);
22087   transform.prototype = Transform.prototype;
22088   function transform(node) {
22089     while (!node.__zoom)
22090       if (!(node = node.parentNode))
22091         return identity2;
22092     return node.__zoom;
22093   }
22094
22095   // node_modules/d3-zoom/src/noevent.js
22096   function nopropagation2(event) {
22097     event.stopImmediatePropagation();
22098   }
22099   function noevent_default2(event) {
22100     event.preventDefault();
22101     event.stopImmediatePropagation();
22102   }
22103
22104   // node_modules/d3-zoom/src/zoom.js
22105   function defaultFilter2(event) {
22106     return (!event.ctrlKey || event.type === "wheel") && !event.button;
22107   }
22108   function defaultExtent() {
22109     var e = this;
22110     if (e instanceof SVGElement) {
22111       e = e.ownerSVGElement || e;
22112       if (e.hasAttribute("viewBox")) {
22113         e = e.viewBox.baseVal;
22114         return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
22115       }
22116       return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
22117     }
22118     return [[0, 0], [e.clientWidth, e.clientHeight]];
22119   }
22120   function defaultTransform() {
22121     return this.__zoom || identity2;
22122   }
22123   function defaultWheelDelta(event) {
22124     return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1);
22125   }
22126   function defaultTouchable2() {
22127     return navigator.maxTouchPoints || "ontouchstart" in this;
22128   }
22129   function defaultConstrain(transform2, extent, translateExtent) {
22130     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];
22131     return transform2.translate(
22132       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22133       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22134     );
22135   }
22136   function zoom_default2() {
22137     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;
22138     function zoom(selection2) {
22139       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)");
22140     }
22141     zoom.transform = function(collection, transform2, point2, event) {
22142       var selection2 = collection.selection ? collection.selection() : collection;
22143       selection2.property("__zoom", defaultTransform);
22144       if (collection !== selection2) {
22145         schedule(collection, transform2, point2, event);
22146       } else {
22147         selection2.interrupt().each(function() {
22148           gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end();
22149         });
22150       }
22151     };
22152     zoom.scaleBy = function(selection2, k, p, event) {
22153       zoom.scaleTo(selection2, function() {
22154         var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22155         return k0 * k1;
22156       }, p, event);
22157     };
22158     zoom.scaleTo = function(selection2, k, p, event) {
22159       zoom.transform(selection2, function() {
22160         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;
22161         return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent);
22162       }, p, event);
22163     };
22164     zoom.translateBy = function(selection2, x, y, event) {
22165       zoom.transform(selection2, function() {
22166         return constrain(this.__zoom.translate(
22167           typeof x === "function" ? x.apply(this, arguments) : x,
22168           typeof y === "function" ? y.apply(this, arguments) : y
22169         ), extent.apply(this, arguments), translateExtent);
22170       }, null, event);
22171     };
22172     zoom.translateTo = function(selection2, x, y, p, event) {
22173       zoom.transform(selection2, function() {
22174         var e = extent.apply(this, arguments), t = this.__zoom, p02 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
22175         return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate(
22176           typeof x === "function" ? -x.apply(this, arguments) : -x,
22177           typeof y === "function" ? -y.apply(this, arguments) : -y
22178         ), e, translateExtent);
22179       }, p, event);
22180     };
22181     function scale(transform2, k) {
22182       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22183       return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
22184     }
22185     function translate(transform2, p02, p1) {
22186       var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k;
22187       return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y);
22188     }
22189     function centroid(extent2) {
22190       return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
22191     }
22192     function schedule(transition2, transform2, point2, event) {
22193       transition2.on("start.zoom", function() {
22194         gesture(this, arguments).event(event).start();
22195       }).on("interrupt.zoom end.zoom", function() {
22196         gesture(this, arguments).event(event).end();
22197       }).tween("zoom", function() {
22198         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));
22199         return function(t) {
22200           if (t === 1)
22201             t = b;
22202           else {
22203             var l = i2(t), k = w / l[2];
22204             t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
22205           }
22206           g.zoom(null, t);
22207         };
22208       });
22209     }
22210     function gesture(that, args, clean2) {
22211       return !clean2 && that.__zooming || new Gesture(that, args);
22212     }
22213     function Gesture(that, args) {
22214       this.that = that;
22215       this.args = args;
22216       this.active = 0;
22217       this.sourceEvent = null;
22218       this.extent = extent.apply(that, args);
22219       this.taps = 0;
22220     }
22221     Gesture.prototype = {
22222       event: function(event) {
22223         if (event)
22224           this.sourceEvent = event;
22225         return this;
22226       },
22227       start: function() {
22228         if (++this.active === 1) {
22229           this.that.__zooming = this;
22230           this.emit("start");
22231         }
22232         return this;
22233       },
22234       zoom: function(key, transform2) {
22235         if (this.mouse && key !== "mouse")
22236           this.mouse[1] = transform2.invert(this.mouse[0]);
22237         if (this.touch0 && key !== "touch")
22238           this.touch0[1] = transform2.invert(this.touch0[0]);
22239         if (this.touch1 && key !== "touch")
22240           this.touch1[1] = transform2.invert(this.touch1[0]);
22241         this.that.__zoom = transform2;
22242         this.emit("zoom");
22243         return this;
22244       },
22245       end: function() {
22246         if (--this.active === 0) {
22247           delete this.that.__zooming;
22248           this.emit("end");
22249         }
22250         return this;
22251       },
22252       emit: function(type2) {
22253         var d = select_default2(this.that).datum();
22254         listeners.call(
22255           type2,
22256           this.that,
22257           new ZoomEvent(type2, {
22258             sourceEvent: this.sourceEvent,
22259             target: zoom,
22260             type: type2,
22261             transform: this.that.__zoom,
22262             dispatch: listeners
22263           }),
22264           d
22265         );
22266       }
22267     };
22268     function wheeled(event, ...args) {
22269       if (!filter2.apply(this, arguments))
22270         return;
22271       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);
22272       if (g.wheel) {
22273         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22274           g.mouse[1] = t.invert(g.mouse[0] = p);
22275         }
22276         clearTimeout(g.wheel);
22277       } else if (t.k === k)
22278         return;
22279       else {
22280         g.mouse = [p, t.invert(p)];
22281         interrupt_default(this);
22282         g.start();
22283       }
22284       noevent_default2(event);
22285       g.wheel = setTimeout(wheelidled, wheelDelay);
22286       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22287       function wheelidled() {
22288         g.wheel = null;
22289         g.end();
22290       }
22291     }
22292     function mousedowned(event, ...args) {
22293       if (touchending || !filter2.apply(this, arguments))
22294         return;
22295       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;
22296       nodrag_default(event.view);
22297       nopropagation2(event);
22298       g.mouse = [p, this.__zoom.invert(p)];
22299       interrupt_default(this);
22300       g.start();
22301       function mousemoved(event2) {
22302         noevent_default2(event2);
22303         if (!g.moved) {
22304           var dx = event2.clientX - x05, dy = event2.clientY - y05;
22305           g.moved = dx * dx + dy * dy > clickDistance2;
22306         }
22307         g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent));
22308       }
22309       function mouseupped(event2) {
22310         v.on("mousemove.zoom mouseup.zoom", null);
22311         yesdrag(event2.view, g.moved);
22312         noevent_default2(event2);
22313         g.event(event2).end();
22314       }
22315     }
22316     function dblclicked(event, ...args) {
22317       if (!filter2.apply(this, arguments))
22318         return;
22319       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);
22320       noevent_default2(event);
22321       if (duration > 0)
22322         select_default2(this).transition().duration(duration).call(schedule, t1, p02, event);
22323       else
22324         select_default2(this).call(zoom.transform, t1, p02, event);
22325     }
22326     function touchstarted(event, ...args) {
22327       if (!filter2.apply(this, arguments))
22328         return;
22329       var touches = event.touches, n2 = touches.length, g = gesture(this, args, event.changedTouches.length === n2).event(event), started, i2, t, p;
22330       nopropagation2(event);
22331       for (i2 = 0; i2 < n2; ++i2) {
22332         t = touches[i2], p = pointer_default(t, this);
22333         p = [p, this.__zoom.invert(p), t.identifier];
22334         if (!g.touch0)
22335           g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
22336         else if (!g.touch1 && g.touch0[2] !== p[2])
22337           g.touch1 = p, g.taps = 0;
22338       }
22339       if (touchstarting)
22340         touchstarting = clearTimeout(touchstarting);
22341       if (started) {
22342         if (g.taps < 2)
22343           touchfirst = p[0], touchstarting = setTimeout(function() {
22344             touchstarting = null;
22345           }, touchDelay);
22346         interrupt_default(this);
22347         g.start();
22348       }
22349     }
22350     function touchmoved(event, ...args) {
22351       if (!this.__zooming)
22352         return;
22353       var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t, p, l;
22354       noevent_default2(event);
22355       for (i2 = 0; i2 < n2; ++i2) {
22356         t = touches[i2], p = pointer_default(t, this);
22357         if (g.touch0 && g.touch0[2] === t.identifier)
22358           g.touch0[0] = p;
22359         else if (g.touch1 && g.touch1[2] === t.identifier)
22360           g.touch1[0] = p;
22361       }
22362       t = g.that.__zoom;
22363       if (g.touch1) {
22364         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;
22365         t = scale(t, Math.sqrt(dp / dl));
22366         p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2];
22367         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
22368       } else if (g.touch0)
22369         p = g.touch0[0], l = g.touch0[1];
22370       else
22371         return;
22372       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
22373     }
22374     function touchended(event, ...args) {
22375       if (!this.__zooming)
22376         return;
22377       var g = gesture(this, args).event(event), touches = event.changedTouches, n2 = touches.length, i2, t;
22378       nopropagation2(event);
22379       if (touchending)
22380         clearTimeout(touchending);
22381       touchending = setTimeout(function() {
22382         touchending = null;
22383       }, touchDelay);
22384       for (i2 = 0; i2 < n2; ++i2) {
22385         t = touches[i2];
22386         if (g.touch0 && g.touch0[2] === t.identifier)
22387           delete g.touch0;
22388         else if (g.touch1 && g.touch1[2] === t.identifier)
22389           delete g.touch1;
22390       }
22391       if (g.touch1 && !g.touch0)
22392         g.touch0 = g.touch1, delete g.touch1;
22393       if (g.touch0)
22394         g.touch0[1] = this.__zoom.invert(g.touch0[0]);
22395       else {
22396         g.end();
22397         if (g.taps === 2) {
22398           t = pointer_default(t, this);
22399           if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {
22400             var p = select_default2(this).on("dblclick.zoom");
22401             if (p)
22402               p.apply(this, arguments);
22403           }
22404         }
22405       }
22406     }
22407     zoom.wheelDelta = function(_) {
22408       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default4(+_), zoom) : wheelDelta;
22409     };
22410     zoom.filter = function(_) {
22411       return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : filter2;
22412     };
22413     zoom.touchable = function(_) {
22414       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : touchable;
22415     };
22416     zoom.extent = function(_) {
22417       return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
22418     };
22419     zoom.scaleExtent = function(_) {
22420       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
22421     };
22422     zoom.translateExtent = function(_) {
22423       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]]];
22424     };
22425     zoom.constrain = function(_) {
22426       return arguments.length ? (constrain = _, zoom) : constrain;
22427     };
22428     zoom.duration = function(_) {
22429       return arguments.length ? (duration = +_, zoom) : duration;
22430     };
22431     zoom.interpolate = function(_) {
22432       return arguments.length ? (interpolate = _, zoom) : interpolate;
22433     };
22434     zoom.on = function() {
22435       var value = listeners.on.apply(listeners, arguments);
22436       return value === listeners ? zoom : value;
22437     };
22438     zoom.clickDistance = function(_) {
22439       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
22440     };
22441     zoom.tapDistance = function(_) {
22442       return arguments.length ? (tapDistance = +_, zoom) : tapDistance;
22443     };
22444     return zoom;
22445   }
22446
22447   // modules/geo/raw_mercator.js
22448   function geoRawMercator() {
22449     var project = mercatorRaw;
22450     var k = 512 / Math.PI;
22451     var x = 0;
22452     var y = 0;
22453     var clipExtent = [[0, 0], [0, 0]];
22454     function projection2(point2) {
22455       point2 = project(point2[0] * Math.PI / 180, point2[1] * Math.PI / 180);
22456       return [point2[0] * k + x, y - point2[1] * k];
22457     }
22458     projection2.invert = function(point2) {
22459       point2 = project.invert((point2[0] - x) / k, (y - point2[1]) / k);
22460       return point2 && [point2[0] * 180 / Math.PI, point2[1] * 180 / Math.PI];
22461     };
22462     projection2.scale = function(_) {
22463       if (!arguments.length)
22464         return k;
22465       k = +_;
22466       return projection2;
22467     };
22468     projection2.translate = function(_) {
22469       if (!arguments.length)
22470         return [x, y];
22471       x = +_[0];
22472       y = +_[1];
22473       return projection2;
22474     };
22475     projection2.clipExtent = function(_) {
22476       if (!arguments.length)
22477         return clipExtent;
22478       clipExtent = _;
22479       return projection2;
22480     };
22481     projection2.transform = function(obj) {
22482       if (!arguments.length)
22483         return identity2.translate(x, y).scale(k);
22484       x = +obj.x;
22485       y = +obj.y;
22486       k = +obj.k;
22487       return projection2;
22488     };
22489     projection2.stream = transform_default({
22490       point: function(x2, y2) {
22491         var vec = projection2([x2, y2]);
22492         this.stream.point(vec[0], vec[1]);
22493       }
22494     }).stream;
22495     return projection2;
22496   }
22497
22498   // modules/geo/ortho.js
22499   function geoOrthoNormalizedDotProduct(a, b, origin) {
22500     if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
22501       return 1;
22502     }
22503     return geoVecNormalizedDot(a, b, origin);
22504   }
22505   function geoOrthoFilterDotProduct(dotp, epsilon3, lowerThreshold, upperThreshold, allowStraightAngles) {
22506     var val = Math.abs(dotp);
22507     if (val < epsilon3) {
22508       return 0;
22509     } else if (allowStraightAngles && Math.abs(val - 1) < epsilon3) {
22510       return 0;
22511     } else if (val < lowerThreshold || val > upperThreshold) {
22512       return dotp;
22513     } else {
22514       return null;
22515     }
22516   }
22517   function geoOrthoCalcScore(points, isClosed, epsilon3, threshold) {
22518     var score = 0;
22519     var first = isClosed ? 0 : 1;
22520     var last = isClosed ? points.length : points.length - 1;
22521     var coords = points.map(function(p) {
22522       return p.coord;
22523     });
22524     var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
22525     var upperThreshold = Math.cos(threshold * Math.PI / 180);
22526     for (var i2 = first; i2 < last; i2++) {
22527       var a = coords[(i2 - 1 + coords.length) % coords.length];
22528       var origin = coords[i2];
22529       var b = coords[(i2 + 1) % coords.length];
22530       var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold);
22531       if (dotp === null)
22532         continue;
22533       score = score + 2 * Math.min(Math.abs(dotp - 1), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
22534     }
22535     return score;
22536   }
22537   function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
22538     var max3 = -Infinity;
22539     var first = isClosed ? 0 : 1;
22540     var last = isClosed ? coords.length : coords.length - 1;
22541     for (var i2 = first; i2 < last; i2++) {
22542       var a = coords[(i2 - 1 + coords.length) % coords.length];
22543       var origin = coords[i2];
22544       var b = coords[(i2 + 1) % coords.length];
22545       var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
22546       var angle2 = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
22547       if (angle2 > 45)
22548         angle2 = 90 - angle2;
22549       if (angle2 >= lessThan)
22550         continue;
22551       if (angle2 > max3)
22552         max3 = angle2;
22553     }
22554     if (max3 === -Infinity)
22555       return null;
22556     return max3;
22557   }
22558   function geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles) {
22559     var score = null;
22560     var first = isClosed ? 0 : 1;
22561     var last = isClosed ? coords.length : coords.length - 1;
22562     var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
22563     var upperThreshold = Math.cos(threshold * Math.PI / 180);
22564     for (var i2 = first; i2 < last; i2++) {
22565       var a = coords[(i2 - 1 + coords.length) % coords.length];
22566       var origin = coords[i2];
22567       var b = coords[(i2 + 1) % coords.length];
22568       var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon3, lowerThreshold, upperThreshold, allowStraightAngles);
22569       if (dotp === null)
22570         continue;
22571       if (Math.abs(dotp) > 0)
22572         return 1;
22573       score = 0;
22574     }
22575     return score;
22576   }
22577
22578   // modules/util/array.js
22579   function utilArrayIdentical(a, b) {
22580     if (a === b)
22581       return true;
22582     var i2 = a.length;
22583     if (i2 !== b.length)
22584       return false;
22585     while (i2--) {
22586       if (a[i2] !== b[i2])
22587         return false;
22588     }
22589     return true;
22590   }
22591   function utilArrayDifference(a, b) {
22592     var other = new Set(b);
22593     return Array.from(new Set(a)).filter(function(v) {
22594       return !other.has(v);
22595     });
22596   }
22597   function utilArrayIntersection(a, b) {
22598     var other = new Set(b);
22599     return Array.from(new Set(a)).filter(function(v) {
22600       return other.has(v);
22601     });
22602   }
22603   function utilArrayUnion(a, b) {
22604     var result = new Set(a);
22605     b.forEach(function(v) {
22606       result.add(v);
22607     });
22608     return Array.from(result);
22609   }
22610   function utilArrayUniq(a) {
22611     return Array.from(new Set(a));
22612   }
22613   function utilArrayChunk(a, chunkSize) {
22614     if (!chunkSize || chunkSize < 0)
22615       return [a.slice()];
22616     var result = new Array(Math.ceil(a.length / chunkSize));
22617     return Array.from(result, function(item, i2) {
22618       return a.slice(i2 * chunkSize, i2 * chunkSize + chunkSize);
22619     });
22620   }
22621   function utilArrayFlatten(a) {
22622     return a.reduce(function(acc, val) {
22623       return acc.concat(val);
22624     }, []);
22625   }
22626   function utilArrayGroupBy(a, key) {
22627     return a.reduce(function(acc, item) {
22628       var group = typeof key === "function" ? key(item) : item[key];
22629       (acc[group] = acc[group] || []).push(item);
22630       return acc;
22631     }, {});
22632   }
22633   function utilArrayUniqBy(a, key) {
22634     var seen = /* @__PURE__ */ new Set();
22635     return a.reduce(function(acc, item) {
22636       var val = typeof key === "function" ? key(item) : item[key];
22637       if (val && !seen.has(val)) {
22638         seen.add(val);
22639         acc.push(item);
22640       }
22641       return acc;
22642     }, []);
22643   }
22644
22645   // modules/util/util.js
22646   var import_diacritics = __toESM(require_diacritics());
22647
22648   // modules/util/svg_paths_rtl_fix.js
22649   var import_alif_toolkit = __toESM(require_lib());
22650   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0750-\u07BF\u08A0–\u08BF]/;
22651   function fixRTLTextForSvg(inputText) {
22652     var ret = "", rtlBuffer = [];
22653     var arabicRegex = /[\u0600-\u06FF]/g;
22654     var arabicDiacritics = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06ED]/g;
22655     var arabicMath = /[\u0660-\u066C\u06F0-\u06F9]+/g;
22656     var thaanaVowel = /[\u07A6-\u07B0]/;
22657     var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
22658     if (arabicRegex.test(inputText)) {
22659       inputText = (0, import_alif_toolkit.WordShaper)(inputText);
22660     }
22661     for (var n2 = 0; n2 < inputText.length; n2++) {
22662       var c = inputText[n2];
22663       if (arabicMath.test(c)) {
22664         ret += rtlBuffer.reverse().join("");
22665         rtlBuffer = [c];
22666       } else {
22667         if (rtlBuffer.length && arabicMath.test(rtlBuffer[rtlBuffer.length - 1])) {
22668           ret += rtlBuffer.reverse().join("");
22669           rtlBuffer = [];
22670         }
22671         if ((thaanaVowel.test(c) || hebrewSign.test(c) || arabicDiacritics.test(c)) && rtlBuffer.length) {
22672           rtlBuffer[rtlBuffer.length - 1] += c;
22673         } else if (rtlRegex.test(c) || c.charCodeAt(0) >= 64336 && c.charCodeAt(0) <= 65023 || c.charCodeAt(0) >= 65136 && c.charCodeAt(0) <= 65279) {
22674           rtlBuffer.push(c);
22675         } else if (c === " " && rtlBuffer.length) {
22676           rtlBuffer = [rtlBuffer.reverse().join("") + " "];
22677         } else {
22678           ret += rtlBuffer.reverse().join("") + c;
22679           rtlBuffer = [];
22680         }
22681       }
22682     }
22683     ret += rtlBuffer.reverse().join("");
22684     return ret;
22685   }
22686
22687   // modules/core/preferences.js
22688   var _storage;
22689   try {
22690     _storage = localStorage;
22691   } catch (e) {
22692   }
22693   _storage = _storage || (() => {
22694     let s = {};
22695     return {
22696       getItem: (k) => s[k],
22697       setItem: (k, v) => s[k] = v,
22698       removeItem: (k) => delete s[k]
22699     };
22700   })();
22701   var _listeners = {};
22702   function corePreferences(k, v) {
22703     try {
22704       if (v === void 0)
22705         return _storage.getItem(k);
22706       else if (v === null)
22707         _storage.removeItem(k);
22708       else
22709         _storage.setItem(k, v);
22710       if (_listeners[k]) {
22711         _listeners[k].forEach((handler) => handler(v));
22712       }
22713       return true;
22714     } catch (e) {
22715       if (typeof console !== "undefined") {
22716         console.error("localStorage quota exceeded");
22717       }
22718       return false;
22719     }
22720   }
22721   corePreferences.onChange = function(k, handler) {
22722     _listeners[k] = _listeners[k] || [];
22723     _listeners[k].push(handler);
22724   };
22725
22726   // modules/core/file_fetcher.js
22727   var import_vparse = __toESM(require_vparse());
22728
22729   // config/id.js
22730   var presetsCdnUrl = "https://cdn.jsdelivr.net/npm/@openstreetmap/id-tagging-schema@{presets_version}/";
22731   var ociCdnUrl = "https://cdn.jsdelivr.net/npm/osm-community-index@{version}/";
22732   var wmfSitematrixCdnUrl = "https://cdn.jsdelivr.net/npm/wmf-sitematrix@{version}/";
22733   var nsiCdnUrl = "https://cdn.jsdelivr.net/npm/name-suggestion-index@{version}/";
22734   var defaultOsmApiConnections = {
22735     live: {
22736       url: "https://www.openstreetmap.org",
22737       client_id: "0tmNTmd0Jo1dQp4AUmMBLtGiD9YpMuXzHefitcuVStc",
22738       client_secret: "BTlNrNxIPitHdL4sP2clHw5KLoee9aKkA7dQbc0Bj7Q"
22739     },
22740     dev: {
22741       url: "https://api06.dev.openstreetmap.org",
22742       client_id: "Ee1wWJ6UlpERbF6BfTNOpwn0R8k_06mvMXdDUkeHMgw",
22743       client_secret: "OnfWFC-JkZNHyYdr_viNn_h_RTZXRslKcUxllOXqf5g"
22744     }
22745   };
22746   var osmApiConnections = [];
22747   if (false) {
22748     osmApiConnections.push({
22749       url: null,
22750       client_id: null,
22751       client_secret: null
22752     });
22753   } else if (false) {
22754     osmApiConnections.push(defaultOsmApiConnections[null]);
22755   } else {
22756     osmApiConnections.push(defaultOsmApiConnections.live);
22757     osmApiConnections.push(defaultOsmApiConnections.dev);
22758   }
22759   var taginfoApiUrl = "https://taginfo.openstreetmap.org/api/4/";
22760   var nominatimApiUrl = "https://nominatim.openstreetmap.org/";
22761
22762   // package.json
22763   var package_default = {
22764     name: "iD",
22765     version: "2.26.0",
22766     description: "A friendly editor for OpenStreetMap",
22767     main: "dist/iD.min.js",
22768     repository: "github:openstreetmap/iD",
22769     homepage: "https://github.com/openstreetmap/iD",
22770     bugs: "https://github.com/openstreetmap/iD/issues",
22771     keywords: [
22772       "editor",
22773       "openstreetmap"
22774     ],
22775     license: "ISC",
22776     scripts: {
22777       all: "run-s clean build dist",
22778       build: "run-s build:css build:data build:js",
22779       "build:css": "node scripts/build_css.js",
22780       "build:data": "shx mkdir -p dist/data && node scripts/build_data.js",
22781       "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",
22782       "build:js": "node config/esbuild.config.mjs",
22783       "build:js:watch": "node config/esbuild.config.mjs --watch",
22784       clean: "shx rm -f dist/esbuild.json dist/*.js dist/*.map dist/*.css dist/img/*.svg",
22785       dist: "run-p dist:**",
22786       "dist:mapillary": "shx mkdir -p dist/mapillary-js && shx cp -R node_modules/mapillary-js/dist/* dist/mapillary-js/",
22787       "dist:pannellum": "shx mkdir -p dist/pannellum-streetside && shx cp -R node_modules/pannellum/build/* dist/pannellum-streetside/",
22788       "dist:min": "node config/esbuild.config.min.mjs",
22789       "dist:svg:iD": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "iD-%s" --symbol-sprite dist/img/iD-sprite.svg "svg/iD-sprite/**/*.svg"',
22790       "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',
22791       "dist:svg:fa": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/fa-sprite.svg svg/fontawesome/*.svg",
22792       "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',
22793       "dist:svg:mapillary:signs": "svg-sprite --symbol --symbol-dest . --symbol-sprite dist/img/mapillary-sprite.svg node_modules/mapillary_sprite_source/package_signs/*.svg",
22794       "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",
22795       "dist:svg:roentgen": 'svg-sprite --shape-id-generator "roentgen-%s" --shape-dim-width 16 --shape-dim-height 16 --symbol --symbol-dest . --symbol-sprite dist/img/roentgen-sprite.svg svg/roentgen/*.svg',
22796       "dist:svg:temaki": 'svg-sprite --symbol --symbol-dest . --shape-id-generator "temaki-%s" --symbol-sprite dist/img/temaki-sprite.svg node_modules/@rapideditor/temaki/icons/*.svg',
22797       imagery: "node scripts/update_imagery.js",
22798       lint: "eslint config scripts test/spec modules --ext js,mjs",
22799       "lint:fix": "eslint scripts test/spec modules --fix",
22800       start: "run-s start:watch",
22801       "start:single-build": "run-p build:js start:server",
22802       "start:watch": "run-p build:js:watch start:server",
22803       "start:server": "node scripts/server.js",
22804       test: "npm-run-all -s lint build test:spec",
22805       "test:spec": "karma start config/karma.conf.js",
22806       translations: "node scripts/update_locales.js"
22807     },
22808     dependencies: {
22809       "@rapideditor/country-coder": "~5.2.0",
22810       "@rapideditor/location-conflation": "~1.2.0",
22811       "@mapbox/geojson-area": "^0.2.2",
22812       "@mapbox/sexagesimal": "1.2.0",
22813       "@mapbox/vector-tile": "^1.3.1",
22814       "@tmcw/togeojson": "^5.6.2",
22815       "@turf/bbox": "^6.0.0",
22816       "@turf/bbox-clip": "^6.0.0",
22817       "abortcontroller-polyfill": "^1.7.5",
22818       "aes-js": "^3.1.2",
22819       "alif-toolkit": "^1.2.9",
22820       "core-js-bundle": "^3.31.1",
22821       diacritics: "1.3.0",
22822       "fast-deep-equal": "~3.1.1",
22823       "fast-json-stable-stringify": "2.1.0",
22824       "lodash-es": "~4.17.15",
22825       marked: "~5.1.1",
22826       "node-diff3": "~3.1.0",
22827       "osm-auth": "~2.1.0",
22828       pannellum: "2.5.6",
22829       pbf: "^3.2.1",
22830       "polygon-clipping": "~0.15.1",
22831       rbush: "3.0.1",
22832       "whatwg-fetch": "^3.4.1",
22833       "which-polygon": "2.2.1"
22834     },
22835     devDependencies: {
22836       "@fortawesome/fontawesome-svg-core": "~6.4.0",
22837       "@fortawesome/free-brands-svg-icons": "~6.4.0",
22838       "@fortawesome/free-regular-svg-icons": "~6.4.0",
22839       "@fortawesome/free-solid-svg-icons": "~6.4.0",
22840       "@rapideditor/temaki": "~5.4.0",
22841       "@mapbox/maki": "^8.0.1",
22842       "@openstreetmap/id-tagging-schema": "^6.3.0",
22843       "@transifex/api": "^5.4.0",
22844       autoprefixer: "^10.4.14",
22845       chai: "^4.3.7",
22846       chalk: "^4.1.2",
22847       "cldr-core": "^43.0.0",
22848       "cldr-localenames-full": "^43.1.0",
22849       "concat-files": "^0.1.1",
22850       d3: "~7.8.5",
22851       dotenv: "^16.3.1",
22852       "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages",
22853       esbuild: "^0.18.11",
22854       "esbuild-visualizer": "^0.4.1",
22855       eslint: "^8.44.0",
22856       "fetch-mock": "^9.11.0",
22857       gaze: "^1.1.3",
22858       glob: "^10.3.3",
22859       happen: "^0.3.2",
22860       "js-yaml": "^4.0.0",
22861       "json-stringify-pretty-compact": "^3.0.0",
22862       karma: "^6.4.2",
22863       "karma-chrome-launcher": "^3.2.0",
22864       "karma-coverage": "2.1.1",
22865       "karma-mocha": "^2.0.1",
22866       "karma-remap-istanbul": "^0.6.0",
22867       mapillary_sprite_source: "^1.8.0",
22868       "mapillary-js": "4.1.1",
22869       minimist: "^1.2.8",
22870       mocha: "^10.2.0",
22871       "name-suggestion-index": "~6.0",
22872       "node-fetch": "^2.6.11",
22873       "npm-run-all": "^4.0.0",
22874       "osm-community-index": "~5.5.3",
22875       postcss: "^8.4.25",
22876       "postcss-selector-prepend": "^0.5.0",
22877       shelljs: "^0.8.0",
22878       shx: "^0.3.0",
22879       sinon: "^11.1.2",
22880       "sinon-chai": "^3.7.0",
22881       smash: "0.0",
22882       "static-server": "^2.2.1",
22883       "svg-sprite": "2.0.2",
22884       vparse: "~1.1.0"
22885     },
22886     engines: {
22887       node: ">=16.14"
22888     },
22889     browserslist: [
22890       "> 0.2%, last 6 major versions, Firefox ESR, maintained node versions"
22891     ]
22892   };
22893
22894   // modules/core/file_fetcher.js
22895   var _mainFileFetcher = coreFileFetcher();
22896   function coreFileFetcher() {
22897     const ociVersion = package_default.dependencies["osm-community-index"] || package_default.devDependencies["osm-community-index"];
22898     const v = (0, import_vparse.default)(ociVersion);
22899     const ociVersionMinor = `${v.major}.${v.minor}`;
22900     const presetsVersion = package_default.devDependencies["@openstreetmap/id-tagging-schema"];
22901     let _this = {};
22902     let _inflight4 = {};
22903     let _fileMap = {
22904       "address_formats": "data/address_formats.min.json",
22905       "imagery": "data/imagery.min.json",
22906       "intro_graph": "data/intro_graph.min.json",
22907       "keepRight": "data/keepRight.min.json",
22908       "languages": "data/languages.min.json",
22909       "locales": "locales/index.min.json",
22910       "phone_formats": "data/phone_formats.min.json",
22911       "qa_data": "data/qa_data.min.json",
22912       "shortcuts": "data/shortcuts.min.json",
22913       "territory_languages": "data/territory_languages.min.json",
22914       "oci_defaults": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/defaults.min.json",
22915       "oci_features": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/featureCollection.min.json",
22916       "oci_resources": ociCdnUrl.replace("{version}", ociVersionMinor) + "dist/resources.min.json",
22917       "presets_package": presetsCdnUrl.replace("{presets_version}", presetsVersion) + "package.json",
22918       "deprecated": presetsCdnUrl + "dist/deprecated.min.json",
22919       "discarded": presetsCdnUrl + "dist/discarded.min.json",
22920       "preset_categories": presetsCdnUrl + "dist/preset_categories.min.json",
22921       "preset_defaults": presetsCdnUrl + "dist/preset_defaults.min.json",
22922       "preset_fields": presetsCdnUrl + "dist/fields.min.json",
22923       "preset_presets": presetsCdnUrl + "dist/presets.min.json",
22924       "wmf_sitematrix": wmfSitematrixCdnUrl.replace("{version}", "0.1") + "wikipedia.min.json"
22925     };
22926     let _cachedData = {};
22927     _this.cache = () => _cachedData;
22928     _this.get = (which) => {
22929       if (_cachedData[which]) {
22930         return Promise.resolve(_cachedData[which]);
22931       }
22932       const file = _fileMap[which];
22933       const url = file && _this.asset(file);
22934       if (!url) {
22935         return Promise.reject(`Unknown data file for "${which}"`);
22936       }
22937       if (url.includes("{presets_version}")) {
22938         return _this.get("presets_package").then((result) => {
22939           const presetsVersion2 = result.version;
22940           return getUrl(url.replace("{presets_version}", presetsVersion2), which);
22941         });
22942       } else {
22943         return getUrl(url);
22944       }
22945     };
22946     function getUrl(url, which) {
22947       let prom = _inflight4[url];
22948       if (!prom) {
22949         _inflight4[url] = prom = fetch(url).then((response) => {
22950           if (!response.ok || !response.json) {
22951             throw new Error(response.status + " " + response.statusText);
22952           }
22953           if (response.status === 204 || response.status === 205)
22954             return;
22955           return response.json();
22956         }).then((result) => {
22957           delete _inflight4[url];
22958           if (!result) {
22959             throw new Error(`No data loaded for "${which}"`);
22960           }
22961           _cachedData[which] = result;
22962           return result;
22963         }).catch((err) => {
22964           delete _inflight4[url];
22965           throw err;
22966         });
22967       }
22968       return prom;
22969     }
22970     _this.fileMap = function(val) {
22971       if (!arguments.length)
22972         return _fileMap;
22973       _fileMap = val;
22974       return _this;
22975     };
22976     let _assetPath = "";
22977     _this.assetPath = function(val) {
22978       if (!arguments.length)
22979         return _assetPath;
22980       _assetPath = val;
22981       return _this;
22982     };
22983     let _assetMap = {};
22984     _this.assetMap = function(val) {
22985       if (!arguments.length)
22986         return _assetMap;
22987       _assetMap = val;
22988       return _this;
22989     };
22990     _this.asset = (val) => {
22991       if (/^http(s)?:\/\//i.test(val))
22992         return val;
22993       const filename = _assetPath + val;
22994       return _assetMap[filename] || filename;
22995     };
22996     return _this;
22997   }
22998
22999   // node_modules/@rapideditor/country-coder/dist/country-coder.mjs
23000   var import_which_polygon = __toESM(require_which_polygon(), 1);
23001   var borders_default = { type: "FeatureCollection", features: [
23002     { 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]]]] } },
23003     { 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]]]] } },
23004     { 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]]]] } },
23005     { 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]]]] } },
23006     { 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]]]] } },
23007     { 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]]]] } },
23008     { 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]]]] } },
23009     { 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]]]] } },
23010     { 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]]]] } },
23011     { 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]]]] } },
23012     { 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]]]] } },
23013     { 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]]]] } },
23014     { 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]]]] } },
23015     { 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]]]] } },
23016     { 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]]]] } },
23017     { 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]]]] } },
23018     { 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]]]] } },
23019     { 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]]]] } },
23020     { 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]]]] } },
23021     { type: "Feature", properties: { wikidata: "Q12837", nameEn: "Iberia", level: "sharedLandform" }, geometry: null },
23022     { 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]]]] } },
23023     { 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]]]] } },
23024     { type: "Feature", properties: { wikidata: "Q22890", nameEn: "Ireland", level: "sharedLandform" }, geometry: null },
23025     { type: "Feature", properties: { wikidata: "Q23666", nameEn: "Great Britain", country: "GB", level: "sharedLandform" }, geometry: null },
23026     { 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]]]] } },
23027     { 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]]]] } },
23028     { 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]]]] } },
23029     { 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]]]] } },
23030     { 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]]]] } },
23031     { 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]]]] } },
23032     { 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]]]] } },
23033     { 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]]]] } },
23034     { 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]]]] } },
23035     { 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]]]] } },
23036     { 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]]]] } },
23037     { 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]]]] } },
23038     { type: "Feature", properties: { wikidata: "Q35657", nameEn: "US States", country: "US", level: "subcountryGroup" }, geometry: null },
23039     { type: "Feature", properties: { wikidata: "Q36117", nameEn: "Borneo", level: "sharedLandform" }, geometry: null },
23040     { 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]]]] } },
23041     { type: "Feature", properties: { wikidata: "Q37362", nameEn: "Akrotiri and Dhekelia", aliases: ["SBA"], country: "GB" }, geometry: null },
23042     { 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]]]] } },
23043     { 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]]]] } },
23044     { 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]]]] } },
23045     { 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]]]] } },
23046     { 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]]]] } },
23047     { 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]]]] } },
23048     { type: "Feature", properties: { wikidata: "Q46395", nameEn: "British Overseas Territories", aliases: ["BOTS", "UKOTS"], country: "GB", level: "subcountryGroup" }, geometry: null },
23049     { 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]]]] } },
23050     { 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]]]] } },
23051     { 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]]]] } },
23052     { 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]]]] } },
23053     { type: "Feature", properties: { wikidata: "Q105472", nameEn: "Macaronesia", level: "sharedLandform" }, geometry: null },
23054     { 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]]]] } },
23055     { 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]]]] } },
23056     { 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]]]] } },
23057     { 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]]]] } },
23058     { 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]]]] } },
23059     { 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]]]] } },
23060     { 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]]]] } },
23061     { 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]]]] } },
23062     { 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]]]] } },
23063     { 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]]]] } },
23064     { type: "Feature", properties: { wikidata: "Q153732", nameEn: "Mariana Islands", level: "sharedLandform" }, geometry: null },
23065     { 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]]]] } },
23066     { 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]]]] } },
23067     { type: "Feature", properties: { wikidata: "Q185086", nameEn: "Crown Dependencies", country: "GB", level: "subcountryGroup" }, geometry: null },
23068     { 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]]]] } },
23069     { type: "Feature", properties: { wikidata: "Q191011", nameEn: "Plazas de soberan\xEDa", country: "ES" }, geometry: null },
23070     { 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]]]] } },
23071     { 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]]]] } },
23072     { 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]]]] } },
23073     { 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]]]] } },
23074     { 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]]]] } },
23075     { type: "Feature", properties: { wikidata: "Q644636", nameEn: "Cyprus", level: "sharedLandform" }, geometry: null },
23076     { type: "Feature", properties: { wikidata: "Q851132", nameEn: "New Zealand Outlying Islands", country: "NZ", level: "subcountryGroup" }, geometry: null },
23077     { 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]]]] } },
23078     { 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]]]] } },
23079     { 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]]]] } },
23080     { 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]]]] } },
23081     { type: "Feature", properties: { wikidata: "Q1352230", nameEn: "US Territories", country: "US", level: "subcountryGroup" }, geometry: null },
23082     { type: "Feature", properties: { wikidata: "Q1451600", nameEn: "Overseas Countries and Territories of the EU", aliases: ["OCT"], level: "subunion" }, geometry: null },
23083     { 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]]]] } },
23084     { 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]]]] } },
23085     { 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]]]] } },
23086     { 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]]]] } },
23087     { 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]]]] } },
23088     { 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]]]] } },
23089     { 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]]]] } },
23090     { 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]]]] } },
23091     { type: "Feature", properties: { wikidata: "Q2914565", nameEn: "Autonomous Regions of Portugal", country: "PT", level: "subcountryGroup" }, geometry: null },
23092     { 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]]]] } },
23093     { 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]]]] } },
23094     { type: "Feature", properties: { wikidata: "Q3320166", nameEn: "Outermost Regions of the EU", aliases: ["OMR"], level: "subunion" }, geometry: null },
23095     { type: "Feature", properties: { wikidata: "Q3336843", nameEn: "Countries of the United Kingdom", aliases: ["GB-UKM"], country: "GB", level: "subcountryGroup" }, geometry: null },
23096     { 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]]]] } },
23097     { 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]]]] } },
23098     { 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]]]] } },
23099     { 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]]]] } },
23100     { 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]]]] } },
23101     { 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]]]] } },
23102     { type: "Feature", properties: { m49: "001", wikidata: "Q2", nameEn: "World", aliases: ["Earth", "Planet"], level: "world" }, geometry: null },
23103     { type: "Feature", properties: { m49: "002", wikidata: "Q15", nameEn: "Africa", level: "region" }, geometry: null },
23104     { type: "Feature", properties: { m49: "003", wikidata: "Q49", nameEn: "North America", level: "subregion" }, geometry: null },
23105     { type: "Feature", properties: { m49: "005", wikidata: "Q18", nameEn: "South America", level: "intermediateRegion" }, geometry: null },
23106     { type: "Feature", properties: { m49: "009", wikidata: "Q538", nameEn: "Oceania", level: "region" }, geometry: null },
23107     { type: "Feature", properties: { m49: "011", wikidata: "Q4412", nameEn: "Western Africa", level: "intermediateRegion" }, geometry: null },
23108     { type: "Feature", properties: { m49: "013", wikidata: "Q27611", nameEn: "Central America", level: "intermediateRegion" }, geometry: null },
23109     { type: "Feature", properties: { m49: "014", wikidata: "Q27407", nameEn: "Eastern Africa", level: "intermediateRegion" }, geometry: null },
23110     { type: "Feature", properties: { m49: "015", wikidata: "Q27381", nameEn: "Northern Africa", level: "subregion" }, geometry: null },
23111     { type: "Feature", properties: { m49: "017", wikidata: "Q27433", nameEn: "Middle Africa", level: "intermediateRegion" }, geometry: null },
23112     { type: "Feature", properties: { m49: "018", wikidata: "Q27394", nameEn: "Southern Africa", level: "intermediateRegion" }, geometry: null },
23113     { type: "Feature", properties: { m49: "019", wikidata: "Q828", nameEn: "Americas", level: "region" }, geometry: null },
23114     { type: "Feature", properties: { m49: "021", wikidata: "Q2017699", nameEn: "Northern America", level: "subregion" }, geometry: null },
23115     { type: "Feature", properties: { m49: "029", wikidata: "Q664609", nameEn: "Caribbean", level: "intermediateRegion" }, geometry: null },
23116     { type: "Feature", properties: { m49: "030", wikidata: "Q27231", nameEn: "Eastern Asia", level: "subregion" }, geometry: null },
23117     { type: "Feature", properties: { m49: "034", wikidata: "Q771405", nameEn: "Southern Asia", level: "subregion" }, geometry: null },
23118     { type: "Feature", properties: { m49: "035", wikidata: "Q11708", nameEn: "South-eastern Asia", level: "subregion" }, geometry: null },
23119     { type: "Feature", properties: { m49: "039", wikidata: "Q27449", nameEn: "Southern Europe", level: "subregion" }, geometry: null },
23120     { type: "Feature", properties: { m49: "053", wikidata: "Q45256", nameEn: "Australia and New Zealand", aliases: ["Australasia"], level: "subregion" }, geometry: null },
23121     { type: "Feature", properties: { m49: "054", wikidata: "Q37394", nameEn: "Melanesia", level: "subregion" }, geometry: null },
23122     { type: "Feature", properties: { m49: "057", wikidata: "Q3359409", nameEn: "Micronesia", level: "subregion" }, geometry: null },
23123     { type: "Feature", properties: { m49: "061", wikidata: "Q35942", nameEn: "Polynesia", level: "subregion" }, geometry: null },
23124     { type: "Feature", properties: { m49: "142", wikidata: "Q48", nameEn: "Asia", level: "region" }, geometry: null },
23125     { type: "Feature", properties: { m49: "143", wikidata: "Q27275", nameEn: "Central Asia", level: "subregion" }, geometry: null },
23126     { type: "Feature", properties: { m49: "145", wikidata: "Q27293", nameEn: "Western Asia", level: "subregion" }, geometry: null },
23127     { type: "Feature", properties: { m49: "150", wikidata: "Q46", nameEn: "Europe", level: "region" }, geometry: null },
23128     { type: "Feature", properties: { m49: "151", wikidata: "Q27468", nameEn: "Eastern Europe", level: "subregion" }, geometry: null },
23129     { type: "Feature", properties: { m49: "154", wikidata: "Q27479", nameEn: "Northern Europe", level: "subregion" }, geometry: null },
23130     { type: "Feature", properties: { m49: "155", wikidata: "Q27496", nameEn: "Western Europe", level: "subregion" }, geometry: null },
23131     { type: "Feature", properties: { m49: "202", wikidata: "Q132959", nameEn: "Sub-Saharan Africa", level: "subregion" }, geometry: null },
23132     { type: "Feature", properties: { m49: "419", wikidata: "Q72829598", nameEn: "Latin America and the Caribbean", level: "subregion" }, geometry: null },
23133     { 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]]]] } },
23134     { type: "Feature", properties: { m49: "830", wikidata: "Q42314", nameEn: "Channel Islands", level: "intermediateRegion" }, geometry: null },
23135     { 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]]]] } },
23136     { 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]]]] } },
23137     { 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]]]] } },
23138     { 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]]]] } },
23139     { 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]]]] } },
23140     { 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]]]] } },
23141     { 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]]]] } },
23142     { 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]]]] } },
23143     { 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]]]] } },
23144     { 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]]]] } },
23145     { 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]]]] } },
23146     { 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]]]] } },
23147     { 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]]]] } },
23148     { type: "Feature", properties: { iso1A2: "AU", iso1A3: "AUS", iso1N3: "036", wikidata: "Q408", nameEn: "Australia" }, geometry: null },
23149     { 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]]]] } },
23150     { 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]]]] } },
23151     { 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]]]] } },
23152     { 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]]]] } },
23153     { 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]]]] } },
23154     { 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]]]] } },
23155     { 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]]]] } },
23156     { 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]]]] } },
23157     { 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]]]] } },
23158     { 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]]]] } },
23159     { 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]]]] } },
23160     { 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]]]] } },
23161     { 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]]]] } },
23162     { 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]]]] } },
23163     { 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]]]] } },
23164     { 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]]]] } },
23165     { type: "Feature", properties: { iso1A2: "BQ", iso1A3: "BES", iso1N3: "535", wikidata: "Q27561", nameEn: "Caribbean Netherlands", country: "NL" }, geometry: null },
23166     { 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]]]] } },
23167     { 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]]]] } },
23168     { 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]]]] } },
23169     { 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]]]] } },
23170     { 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]]]] } },
23171     { 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]]]] } },
23172     { 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]]]] } },
23173     { 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]]]] } },
23174     { 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]]]] } },
23175     { 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]]]] } },
23176     { 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]]]] } },
23177     { 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]]]] } },
23178     { 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"] } },
23179     { 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]]]] } },
23180     { 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]]]] } },
23181     { 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]]]] } },
23182     { 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]]]] } },
23183     { type: "Feature", properties: { iso1A2: "CN", iso1A3: "CHN", iso1N3: "156", wikidata: "Q148", nameEn: "People's Republic of China" }, geometry: null },
23184     { 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]]]] } },
23185     { 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]]]] } },
23186     { 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]]]] } },
23187     { 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]]]] } },
23188     { 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]]]] } },
23189     { 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]]]] } },
23190     { 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]]]] } },
23191     { 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]]]] } },
23192     { 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]]]] } },
23193     { 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]]]] } },
23194     { 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]]]] } },
23195     { 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]]]] } },
23196     { type: "Feature", properties: { iso1A2: "DK", iso1A3: "DNK", iso1N3: "208", wikidata: "Q756617", nameEn: "Kingdom of Denmark" }, geometry: null },
23197     { 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]]]] } },
23198     { 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]]]] } },
23199     { 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]]]] } },
23200     { type: "Feature", properties: { iso1A2: "EA", wikidata: "Q28868874", nameEn: "Ceuta, Melilla", country: "ES", level: "territory", isoStatus: "excRes" }, geometry: null },
23201     { type: "Feature", properties: { iso1A2: "EC", iso1A3: "ECU", iso1N3: "218", wikidata: "Q736", nameEn: "Ecuador" }, geometry: null },
23202     { 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]]]] } },
23203     { 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]]]] } },
23204     { 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]]]] } },
23205     { 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]]]] } },
23206     { type: "Feature", properties: { iso1A2: "ES", iso1A3: "ESP", iso1N3: "724", wikidata: "Q29", nameEn: "Spain" }, geometry: null },
23207     { 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]]]] } },
23208     { type: "Feature", properties: { iso1A2: "EU", iso1A3: "EUE", wikidata: "Q458", nameEn: "European Union", level: "union", isoStatus: "excRes" }, geometry: null },
23209     { type: "Feature", properties: { iso1A2: "FI", iso1A3: "FIN", iso1N3: "246", wikidata: "Q33", nameEn: "Finland", aliases: ["SF"] }, geometry: null },
23210     { 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]]]] } },
23211     { 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]]]] } },
23212     { 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]]]] } },
23213     { 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]]]] } },
23214     { type: "Feature", properties: { iso1A2: "FR", iso1A3: "FRA", iso1N3: "250", wikidata: "Q142", nameEn: "France" }, geometry: null },
23215     { 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]]]] } },
23216     { 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]]]] } },
23217     { type: "Feature", properties: { iso1A2: "GB", iso1A3: "GBR", iso1N3: "826", wikidata: "Q145", ccTLD: ".uk", nameEn: "United Kingdom", aliases: ["UK"] }, geometry: null },
23218     { 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]]]] } },
23219     { 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]]]] } },
23220     { 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]]]] } },
23221     { type: "Feature", properties: { iso1A2: "GG", iso1A3: "GGY", iso1N3: "831", wikidata: "Q25230", nameEn: "Bailiwick of Guernsey", country: "GB" }, geometry: null },
23222     { 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]]]] } },
23223     { 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]]]] } },
23224     { 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]]]] } },
23225     { 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]]]] } },
23226     { 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]]]] } },
23227     { 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]]]] } },
23228     { 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]]]] } },
23229     { 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]]]] } },
23230     { 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]]]] } },
23231     { 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]]]] } },
23232     { 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]]]] } },
23233     { 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]]]] } },
23234     { 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]]]] } },
23235     { 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]]]] } },
23236     { 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]]]] } },
23237     { 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]]]] } },
23238     { 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]]]] } },
23239     { 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]]]] } },
23240     { 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]]]] } },
23241     { 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]]]] } },
23242     { type: "Feature", properties: { iso1A2: "ID", iso1A3: "IDN", iso1N3: "360", wikidata: "Q252", nameEn: "Indonesia", aliases: ["RI"] }, geometry: null },
23243     { 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"] } },
23244     { 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]]]] } },
23245     { 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]]]] } },
23246     { type: "Feature", properties: { iso1A2: "IN", iso1A3: "IND", iso1N3: "356", wikidata: "Q668", nameEn: "India" }, geometry: null },
23247     { type: "Feature", properties: { iso1A2: "IO", iso1A3: "IOT", iso1N3: "086", wikidata: "Q43448", nameEn: "British Indian Ocean Territory", country: "GB" }, geometry: null },
23248     { 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]]]] } },
23249     { 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]]]] } },
23250     { 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]]]] } },
23251     { 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]]]] } },
23252     { 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]]]] } },
23253     { 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]]]] } },
23254     { 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]]]] } },
23255     { 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]]]] } },
23256     { 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]]]] } },
23257     { 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]]]] } },
23258     { 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]]]] } },
23259     { 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]]]] } },
23260     { 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]]]] } },
23261     { 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]]]] } },
23262     { 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]]]] } },
23263     { 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]]]] } },
23264     { 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]]]] } },
23265     { 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]]]] } },
23266     { 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]]]] } },
23267     { 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]]]] } },
23268     { 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]]]] } },
23269     { 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]]]] } },
23270     { 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]]]] } },
23271     { 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]]]] } },
23272     { 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]]]] } },
23273     { 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]]]] } },
23274     { 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]]]] } },
23275     { 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]]]] } },
23276     { 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]]]] } },
23277     { 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]]]] } },
23278     { 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]]]] } },
23279     { 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]]]] } },
23280     { 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]]]] } },
23281     { 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]]]] } },
23282     { 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]]]] } },
23283     { 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]]]] } },
23284     { 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]]]] } },
23285     { 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]]]] } },
23286     { 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]]]] } },
23287     { 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]]]] } },
23288     { 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]]]] } },
23289     { 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]]]] } },
23290     { 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]]]] } },
23291     { 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]]]] } },
23292     { 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]]]] } },
23293     { 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]]]] } },
23294     { 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]]]] } },
23295     { 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]]]] } },
23296     { 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]]]] } },
23297     { 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]]]] } },
23298     { 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]]]] } },
23299     { type: "Feature", properties: { iso1A2: "MY", iso1A3: "MYS", iso1N3: "458", wikidata: "Q833", nameEn: "Malaysia" }, geometry: null },
23300     { 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]]]] } },
23301     { 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]]]] } },
23302     { 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]]]] } },
23303     { 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]]]] } },
23304     { 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]]]] } },
23305     { 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]]]] } },
23306     { 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]]]] } },
23307     { type: "Feature", properties: { iso1A2: "NL", iso1A3: "NLD", iso1N3: "528", wikidata: "Q29999", nameEn: "Kingdom of the Netherlands" }, geometry: null },
23308     { type: "Feature", properties: { iso1A2: "NO", iso1A3: "NOR", iso1N3: "578", wikidata: "Q20", nameEn: "Norway" }, geometry: null },
23309     { 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]]]] } },
23310     { 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]]]] } },
23311     { 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]]]] } },
23312     { type: "Feature", properties: { iso1A2: "NZ", iso1A3: "NZL", iso1N3: "554", wikidata: "Q664", nameEn: "New Zealand" }, geometry: null },
23313     { 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]]]] } },
23314     { 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]]]] } },
23315     { 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]]]] } },
23316     { 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]]]] } },
23317     { 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]]]] } },
23318     { 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]]]] } },
23319     { 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]]]] } },
23320     { 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]]]] } },
23321     { 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]]]] } },
23322     { 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]]]] } },
23323     { 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]]]] } },
23324     { type: "Feature", properties: { iso1A2: "PS", iso1A3: "PSE", iso1N3: "275", wikidata: "Q219060", nameEn: "Palestine" }, geometry: null },
23325     { type: "Feature", properties: { iso1A2: "PT", iso1A3: "PRT", iso1N3: "620", wikidata: "Q45", nameEn: "Portugal" }, geometry: null },
23326     { 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]]]] } },
23327     { 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]]]] } },
23328     { 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]]]] } },
23329     { 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]]]] } },
23330     { 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]]]] } },
23331     { 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]]]] } },
23332     { type: "Feature", properties: { iso1A2: "RU", iso1A3: "RUS", iso1N3: "643", wikidata: "Q159", nameEn: "Russia" }, geometry: null },
23333     { 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]]]] } },
23334     { 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]]]] } },
23335     { 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]]]] } },
23336     { 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]]]] } },
23337     { 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]]]] } },
23338     { 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]]]] } },
23339     { 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]]]] } },
23340     { type: "Feature", properties: { iso1A2: "SH", iso1A3: "SHN", iso1N3: "654", wikidata: "Q192184", nameEn: "Saint Helena, Ascension and Tristan da Cunha", country: "GB" }, geometry: null },
23341     { 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]]]] } },
23342     { type: "Feature", properties: { iso1A2: "SJ", iso1A3: "SJM", iso1N3: "744", wikidata: "Q842829", nameEn: "Svalbard and Jan Mayen", country: "NO" }, geometry: null },
23343     { 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]]]] } },
23344     { 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]]]] } },
23345     { 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]]]] } },
23346     { 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]]]] } },
23347     { 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]]]] } },
23348     { 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]]]] } },
23349     { 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]]]] } },
23350     { 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]]]] } },
23351     { 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]]]] } },
23352     { 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]]]] } },
23353     { 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]]]] } },
23354     { 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]]]] } },
23355     { 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]]]] } },
23356     { 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]]]] } },
23357     { 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]]]] } },
23358     { type: "Feature", properties: { iso1A2: "TF", iso1A3: "ATF", iso1N3: "260", wikidata: "Q129003", nameEn: "French Southern Territories", country: "FR", groups: ["EU", "UN"] }, geometry: null },
23359     { 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]]]] } },
23360     { 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]]]] } },
23361     { 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]]]] } },
23362     { 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]]]] } },
23363     { 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]]]] } },
23364     { 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]]]] } },
23365     { 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]]]] } },
23366     { 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]]]] } },
23367     { 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]]]] } },
23368     { 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]]]] } },
23369     { 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]]]] } },
23370     { 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]]]] } },
23371     { 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]]]] } },
23372     { 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]]]] } },
23373     { 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]]]] } },
23374     { type: "Feature", properties: { iso1A2: "UM", iso1A3: "UMI", iso1N3: "581", wikidata: "Q16645", nameEn: "United States Minor Outlying Islands", country: "US" }, geometry: null },
23375     { type: "Feature", properties: { iso1A2: "UN", wikidata: "Q1065", nameEn: "United Nations", level: "unitedNations", isoStatus: "excRes" }, geometry: null },
23376     { type: "Feature", properties: { iso1A2: "US", iso1A3: "USA", iso1N3: "840", wikidata: "Q30", nameEn: "United States of America" }, geometry: null },
23377     { 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]]]] } },
23378     { 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]]]] } },
23379     { 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]]]] } },
23380     { 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]]]] } },
23381     { 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]]]] } },
23382     { 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]]]] } },
23383     { 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]]]] } },
23384     { 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]]]] } },
23385     { 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]]]] } },
23386     { 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]]]] } },
23387     { 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]]]] } },
23388     { 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]]]] } },
23389     { 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]]]] } },
23390     { 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]]]] } },
23391     { 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]]]] } },
23392     { 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]]]] } },
23393     { 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]]]] } }
23394   ] };
23395   var borders = borders_default;
23396   var whichPolygonGetter = {};
23397   var featuresByCode = {};
23398   var idFilterRegex = /(?=(?!^(and|the|of|el|la|de)$))(\b(and|the|of|el|la|de)\b)|[-_ .,'()&[\]/]/gi;
23399   function canonicalID(id2) {
23400     const s = id2 || "";
23401     if (s.charAt(0) === ".") {
23402       return s.toUpperCase();
23403     } else {
23404       return s.replace(idFilterRegex, "").toUpperCase();
23405     }
23406   }
23407   var levels = [
23408     "subterritory",
23409     "territory",
23410     "subcountryGroup",
23411     "country",
23412     "sharedLandform",
23413     "intermediateRegion",
23414     "subregion",
23415     "region",
23416     "subunion",
23417     "union",
23418     "unitedNations",
23419     "world"
23420   ];
23421   loadDerivedDataAndCaches(borders);
23422   function loadDerivedDataAndCaches(borders2) {
23423     const identifierProps = ["iso1A2", "iso1A3", "m49", "wikidata", "emojiFlag", "ccTLD", "nameEn"];
23424     let geometryFeatures = [];
23425     borders2.features.forEach((feature22) => {
23426       feature22.properties.id = feature22.properties.iso1A2 || feature22.properties.m49 || feature22.properties.wikidata;
23427       loadM49(feature22);
23428       loadTLD(feature22);
23429       loadIsoStatus(feature22);
23430       loadLevel(feature22);
23431       loadGroups(feature22);
23432       loadFlag(feature22);
23433       cacheFeatureByIDs(feature22);
23434       if (feature22.geometry)
23435         geometryFeatures.push(feature22);
23436     });
23437     borders2.features.forEach((feature22) => {
23438       feature22.properties.groups = feature22.properties.groups.map((groupID) => {
23439         return featuresByCode[groupID].properties.id;
23440       });
23441       loadMembersForGroupsOf(feature22);
23442     });
23443     borders2.features.forEach((feature22) => {
23444       loadRoadSpeedUnit(feature22);
23445       loadRoadHeightUnit(feature22);
23446       loadDriveSide(feature22);
23447       loadCallingCodes(feature22);
23448       loadGroupGroups(feature22);
23449     });
23450     borders2.features.forEach((feature22) => {
23451       feature22.properties.groups.sort((groupID1, groupID2) => {
23452         return levels.indexOf(featuresByCode[groupID1].properties.level) - levels.indexOf(featuresByCode[groupID2].properties.level);
23453       });
23454       if (feature22.properties.members)
23455         feature22.properties.members.sort((id1, id2) => {
23456           const diff = levels.indexOf(featuresByCode[id1].properties.level) - levels.indexOf(featuresByCode[id2].properties.level);
23457           if (diff === 0) {
23458             return borders2.features.indexOf(featuresByCode[id1]) - borders2.features.indexOf(featuresByCode[id2]);
23459           }
23460           return diff;
23461         });
23462     });
23463     const geometryOnlyCollection = {
23464       type: "FeatureCollection",
23465       features: geometryFeatures
23466     };
23467     whichPolygonGetter = (0, import_which_polygon.default)(geometryOnlyCollection);
23468     function loadGroups(feature22) {
23469       const props = feature22.properties;
23470       if (!props.groups) {
23471         props.groups = [];
23472       }
23473       if (feature22.geometry && props.country) {
23474         props.groups.push(props.country);
23475       }
23476       if (props.m49 !== "001") {
23477         props.groups.push("001");
23478       }
23479     }
23480     function loadM49(feature22) {
23481       const props = feature22.properties;
23482       if (!props.m49 && props.iso1N3) {
23483         props.m49 = props.iso1N3;
23484       }
23485     }
23486     function loadTLD(feature22) {
23487       const props = feature22.properties;
23488       if (props.level === "unitedNations")
23489         return;
23490       if (!props.ccTLD && props.iso1A2) {
23491         props.ccTLD = "." + props.iso1A2.toLowerCase();
23492       }
23493     }
23494     function loadIsoStatus(feature22) {
23495       const props = feature22.properties;
23496       if (!props.isoStatus && props.iso1A2) {
23497         props.isoStatus = "official";
23498       }
23499     }
23500     function loadLevel(feature22) {
23501       const props = feature22.properties;
23502       if (props.level)
23503         return;
23504       if (!props.country) {
23505         props.level = "country";
23506       } else if (!props.iso1A2 || props.isoStatus === "official") {
23507         props.level = "territory";
23508       } else {
23509         props.level = "subterritory";
23510       }
23511     }
23512     function loadGroupGroups(feature22) {
23513       const props = feature22.properties;
23514       if (feature22.geometry || !props.members)
23515         return;
23516       const featureLevelIndex = levels.indexOf(props.level);
23517       let sharedGroups = [];
23518       props.members.forEach((memberID, index) => {
23519         const member = featuresByCode[memberID];
23520         const memberGroups = member.properties.groups.filter((groupID) => {
23521           return groupID !== feature22.properties.id && featureLevelIndex < levels.indexOf(featuresByCode[groupID].properties.level);
23522         });
23523         if (index === 0) {
23524           sharedGroups = memberGroups;
23525         } else {
23526           sharedGroups = sharedGroups.filter((groupID) => memberGroups.indexOf(groupID) !== -1);
23527         }
23528       });
23529       props.groups = props.groups.concat(
23530         sharedGroups.filter((groupID) => props.groups.indexOf(groupID) === -1)
23531       );
23532       sharedGroups.forEach((groupID) => {
23533         const groupFeature = featuresByCode[groupID];
23534         if (groupFeature.properties.members.indexOf(props.id) === -1) {
23535           groupFeature.properties.members.push(props.id);
23536         }
23537       });
23538     }
23539     function loadRoadSpeedUnit(feature22) {
23540       const props = feature22.properties;
23541       if (feature22.geometry) {
23542         if (!props.roadSpeedUnit)
23543           props.roadSpeedUnit = "km/h";
23544       } else if (props.members) {
23545         const vals = Array.from(
23546           new Set(
23547             props.members.map((id2) => {
23548               const member = featuresByCode[id2];
23549               if (member.geometry)
23550                 return member.properties.roadSpeedUnit || "km/h";
23551             }).filter(Boolean)
23552           )
23553         );
23554         if (vals.length === 1)
23555           props.roadSpeedUnit = vals[0];
23556       }
23557     }
23558     function loadRoadHeightUnit(feature22) {
23559       const props = feature22.properties;
23560       if (feature22.geometry) {
23561         if (!props.roadHeightUnit)
23562           props.roadHeightUnit = "m";
23563       } else if (props.members) {
23564         const vals = Array.from(
23565           new Set(
23566             props.members.map((id2) => {
23567               const member = featuresByCode[id2];
23568               if (member.geometry)
23569                 return member.properties.roadHeightUnit || "m";
23570             }).filter(Boolean)
23571           )
23572         );
23573         if (vals.length === 1)
23574           props.roadHeightUnit = vals[0];
23575       }
23576     }
23577     function loadDriveSide(feature22) {
23578       const props = feature22.properties;
23579       if (feature22.geometry) {
23580         if (!props.driveSide)
23581           props.driveSide = "right";
23582       } else if (props.members) {
23583         const vals = Array.from(
23584           new Set(
23585             props.members.map((id2) => {
23586               const member = featuresByCode[id2];
23587               if (member.geometry)
23588                 return member.properties.driveSide || "right";
23589             }).filter(Boolean)
23590           )
23591         );
23592         if (vals.length === 1)
23593           props.driveSide = vals[0];
23594       }
23595     }
23596     function loadCallingCodes(feature22) {
23597       const props = feature22.properties;
23598       if (!feature22.geometry && props.members) {
23599         props.callingCodes = Array.from(
23600           new Set(
23601             props.members.reduce((array2, id2) => {
23602               const member = featuresByCode[id2];
23603               if (member.geometry && member.properties.callingCodes) {
23604                 return array2.concat(member.properties.callingCodes);
23605               }
23606               return array2;
23607             }, [])
23608           )
23609         );
23610       }
23611     }
23612     function loadFlag(feature22) {
23613       if (!feature22.properties.iso1A2)
23614         return;
23615       const flag = feature22.properties.iso1A2.replace(/./g, function(char) {
23616         return String.fromCodePoint(char.charCodeAt(0) + 127397);
23617       });
23618       feature22.properties.emojiFlag = flag;
23619     }
23620     function loadMembersForGroupsOf(feature22) {
23621       feature22.properties.groups.forEach((groupID) => {
23622         const groupFeature = featuresByCode[groupID];
23623         if (!groupFeature.properties.members) {
23624           groupFeature.properties.members = [];
23625         }
23626         groupFeature.properties.members.push(feature22.properties.id);
23627       });
23628     }
23629     function cacheFeatureByIDs(feature22) {
23630       let ids = [];
23631       identifierProps.forEach((prop) => {
23632         const id2 = feature22.properties[prop];
23633         if (id2)
23634           ids.push(id2);
23635       });
23636       (feature22.properties.aliases || []).forEach((alias) => {
23637         ids.push(alias);
23638       });
23639       ids.forEach((id2) => {
23640         let cid = canonicalID(id2);
23641         featuresByCode[cid] = feature22;
23642       });
23643     }
23644   }
23645   function locArray(loc) {
23646     if (Array.isArray(loc)) {
23647       return loc;
23648     } else if (loc.coordinates) {
23649       return loc.coordinates;
23650     }
23651     return loc.geometry.coordinates;
23652   }
23653   function smallestFeature(loc) {
23654     const query = locArray(loc);
23655     const featureProperties = whichPolygonGetter(query);
23656     if (!featureProperties)
23657       return null;
23658     return featuresByCode[featureProperties.id];
23659   }
23660   function countryFeature(loc) {
23661     const feature22 = smallestFeature(loc);
23662     if (!feature22)
23663       return null;
23664     const countryCode = feature22.properties.country || feature22.properties.iso1A2;
23665     return featuresByCode[countryCode] || null;
23666   }
23667   var defaultOpts = {
23668     level: void 0,
23669     maxLevel: void 0,
23670     withProp: void 0
23671   };
23672   function featureForLoc(loc, opts) {
23673     const targetLevel = opts.level || "country";
23674     const maxLevel = opts.maxLevel || "world";
23675     const withProp = opts.withProp;
23676     const targetLevelIndex = levels.indexOf(targetLevel);
23677     if (targetLevelIndex === -1)
23678       return null;
23679     const maxLevelIndex = levels.indexOf(maxLevel);
23680     if (maxLevelIndex === -1)
23681       return null;
23682     if (maxLevelIndex < targetLevelIndex)
23683       return null;
23684     if (targetLevel === "country") {
23685       const fastFeature = countryFeature(loc);
23686       if (fastFeature) {
23687         if (!withProp || fastFeature.properties[withProp]) {
23688           return fastFeature;
23689         }
23690       }
23691     }
23692     const features = featuresContaining(loc);
23693     const match = features.find((feature22) => {
23694       let levelIndex = levels.indexOf(feature22.properties.level);
23695       if (feature22.properties.level === targetLevel || // if no feature exists at the target level, return the first feature at the next level up
23696       levelIndex > targetLevelIndex && levelIndex <= maxLevelIndex) {
23697         if (!withProp || feature22.properties[withProp]) {
23698           return feature22;
23699         }
23700       }
23701       return false;
23702     });
23703     return match || null;
23704   }
23705   function featureForID(id2) {
23706     let stringID;
23707     if (typeof id2 === "number") {
23708       stringID = id2.toString();
23709       if (stringID.length === 1) {
23710         stringID = "00" + stringID;
23711       } else if (stringID.length === 2) {
23712         stringID = "0" + stringID;
23713       }
23714     } else {
23715       stringID = canonicalID(id2);
23716     }
23717     return featuresByCode[stringID] || null;
23718   }
23719   function smallestFeaturesForBbox(bbox2) {
23720     return whichPolygonGetter.bbox(bbox2).map((props) => featuresByCode[props.id]);
23721   }
23722   function smallestOrMatchingFeature(query) {
23723     if (typeof query === "object") {
23724       return smallestFeature(query);
23725     }
23726     return featureForID(query);
23727   }
23728   function feature(query, opts = defaultOpts) {
23729     if (typeof query === "object") {
23730       return featureForLoc(query, opts);
23731     }
23732     return featureForID(query);
23733   }
23734   function iso1A2Code(query, opts = defaultOpts) {
23735     opts.withProp = "iso1A2";
23736     const match = feature(query, opts);
23737     if (!match)
23738       return null;
23739     return match.properties.iso1A2 || null;
23740   }
23741   function featuresContaining(query, strict) {
23742     let matchingFeatures;
23743     if (Array.isArray(query) && query.length === 4) {
23744       matchingFeatures = smallestFeaturesForBbox(query);
23745     } else {
23746       const smallestOrMatching = smallestOrMatchingFeature(query);
23747       matchingFeatures = smallestOrMatching ? [smallestOrMatching] : [];
23748     }
23749     if (!matchingFeatures.length)
23750       return [];
23751     let returnFeatures;
23752     if (!strict || typeof query === "object") {
23753       returnFeatures = matchingFeatures.slice();
23754     } else {
23755       returnFeatures = [];
23756     }
23757     matchingFeatures.forEach((feature22) => {
23758       const properties = feature22.properties;
23759       properties.groups.forEach((groupID) => {
23760         const groupFeature = featuresByCode[groupID];
23761         if (returnFeatures.indexOf(groupFeature) === -1) {
23762           returnFeatures.push(groupFeature);
23763         }
23764       });
23765     });
23766     return returnFeatures;
23767   }
23768   function featuresIn(id2, strict) {
23769     const feature22 = featureForID(id2);
23770     if (!feature22)
23771       return [];
23772     let features = [];
23773     if (!strict) {
23774       features.push(feature22);
23775     }
23776     const properties = feature22.properties;
23777     (properties.members || []).forEach((memberID) => {
23778       features.push(featuresByCode[memberID]);
23779     });
23780     return features;
23781   }
23782   function aggregateFeature(id2) {
23783     const features = featuresIn(id2, false);
23784     if (features.length === 0)
23785       return null;
23786     let aggregateCoordinates = [];
23787     features.forEach((feature22) => {
23788       if (feature22.geometry && feature22.geometry.type === "MultiPolygon" && feature22.geometry.coordinates) {
23789         aggregateCoordinates = aggregateCoordinates.concat(feature22.geometry.coordinates);
23790       }
23791     });
23792     return {
23793       type: "Feature",
23794       properties: features[0].properties,
23795       geometry: {
23796         type: "MultiPolygon",
23797         coordinates: aggregateCoordinates
23798       }
23799     };
23800   }
23801   function roadSpeedUnit(query) {
23802     const feature22 = smallestOrMatchingFeature(query);
23803     return feature22 && feature22.properties.roadSpeedUnit || null;
23804   }
23805   function roadHeightUnit(query) {
23806     const feature22 = smallestOrMatchingFeature(query);
23807     return feature22 && feature22.properties.roadHeightUnit || null;
23808   }
23809
23810   // node_modules/@rapideditor/location-conflation/index.mjs
23811   var import_geojson_area = __toESM(require_geojson_area(), 1);
23812   var import_circle_to_polygon = __toESM(require_circle_to_polygon(), 1);
23813   var import_polygon_clipping = __toESM(require_polygon_clipping_umd(), 1);
23814   var import_geojson_precision = __toESM(require_geojson_precision(), 1);
23815   var import_json_stringify_pretty_compact = __toESM(require_json_stringify_pretty_compact(), 1);
23816   var location_conflation_default = class {
23817     // constructor
23818     //
23819     // `fc`  Optional FeatureCollection of known features
23820     //
23821     // Optionally pass a GeoJSON FeatureCollection of known features which we can refer to later.
23822     // Each feature must have a filename-like `id`, for example: `something.geojson`
23823     //
23824     // {
23825     //   "type": "FeatureCollection"
23826     //   "features": [
23827     //     {
23828     //       "type": "Feature",
23829     //       "id": "philly_metro.geojson",
23830     //       "properties": { … },
23831     //       "geometry": { … }
23832     //     }
23833     //   ]
23834     // }
23835     constructor(fc) {
23836       this._cache = {};
23837       this._strict = true;
23838       if (fc && fc.type === "FeatureCollection" && Array.isArray(fc.features)) {
23839         fc.features.forEach((feature3) => {
23840           feature3.properties = feature3.properties || {};
23841           let props = feature3.properties;
23842           let id2 = feature3.id || props.id;
23843           if (!id2 || !/^\S+\.geojson$/i.test(id2))
23844             return;
23845           id2 = id2.toLowerCase();
23846           feature3.id = id2;
23847           props.id = id2;
23848           if (!props.area) {
23849             const area = import_geojson_area.default.geometry(feature3.geometry) / 1e6;
23850             props.area = Number(area.toFixed(2));
23851           }
23852           this._cache[id2] = feature3;
23853         });
23854       }
23855       let world = _cloneDeep(feature("Q2"));
23856       world.geometry = {
23857         type: "Polygon",
23858         coordinates: [[[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]]]
23859       };
23860       world.id = "Q2";
23861       world.properties.id = "Q2";
23862       world.properties.area = import_geojson_area.default.geometry(world.geometry) / 1e6;
23863       this._cache.Q2 = world;
23864     }
23865     // validateLocation
23866     // `location`  The location to validate
23867     //
23868     // Pass a `location` value to validate
23869     //
23870     // Returns a result like:
23871     //   {
23872     //     type:     'point', 'geojson', or 'countrycoder'
23873     //     location:  the queried location
23874     //     id:        the stable identifier for the feature
23875     //   }
23876     // or `null` if the location is invalid
23877     //
23878     validateLocation(location) {
23879       if (Array.isArray(location) && (location.length === 2 || location.length === 3)) {
23880         const lon = location[0];
23881         const lat = location[1];
23882         const radius = location[2];
23883         if (Number.isFinite(lon) && lon >= -180 && lon <= 180 && Number.isFinite(lat) && lat >= -90 && lat <= 90 && (location.length === 2 || Number.isFinite(radius) && radius > 0)) {
23884           const id2 = "[" + location.toString() + "]";
23885           return { type: "point", location, id: id2 };
23886         }
23887       } else if (typeof location === "string" && /^\S+\.geojson$/i.test(location)) {
23888         const id2 = location.toLowerCase();
23889         if (this._cache[id2]) {
23890           return { type: "geojson", location, id: id2 };
23891         }
23892       } else if (typeof location === "string" || typeof location === "number") {
23893         const feature3 = feature(location);
23894         if (feature3) {
23895           const id2 = feature3.properties.wikidata;
23896           return { type: "countrycoder", location, id: id2 };
23897         }
23898       }
23899       if (this._strict) {
23900         throw new Error(`validateLocation:  Invalid location: "${location}".`);
23901       } else {
23902         return null;
23903       }
23904     }
23905     // resolveLocation
23906     // `location`  The location to resolve
23907     //
23908     // Pass a `location` value to resolve
23909     //
23910     // Returns a result like:
23911     //   {
23912     //     type:      'point', 'geojson', or 'countrycoder'
23913     //     location:  the queried location
23914     //     id:        a stable identifier for the feature
23915     //     feature:   the resolved GeoJSON feature
23916     //   }
23917     //  or `null` if the location is invalid
23918     //
23919     resolveLocation(location) {
23920       const valid = this.validateLocation(location);
23921       if (!valid)
23922         return null;
23923       const id2 = valid.id;
23924       if (this._cache[id2]) {
23925         return Object.assign(valid, { feature: this._cache[id2] });
23926       }
23927       if (valid.type === "point") {
23928         const lon = location[0];
23929         const lat = location[1];
23930         const radius = location[2] || 25;
23931         const EDGES = 10;
23932         const PRECISION = 3;
23933         const area = Math.PI * radius * radius;
23934         const feature3 = this._cache[id2] = (0, import_geojson_precision.default)({
23935           type: "Feature",
23936           id: id2,
23937           properties: { id: id2, area: Number(area.toFixed(2)) },
23938           geometry: (0, import_circle_to_polygon.default)([lon, lat], radius * 1e3, EDGES)
23939           // km to m
23940         }, PRECISION);
23941         return Object.assign(valid, { feature: feature3 });
23942       } else if (valid.type === "geojson") {
23943       } else if (valid.type === "countrycoder") {
23944         let feature3 = _cloneDeep(feature(id2));
23945         let props = feature3.properties;
23946         if (Array.isArray(props.members)) {
23947           let aggregate = aggregateFeature(id2);
23948           aggregate.geometry.coordinates = _clip([aggregate], "UNION").geometry.coordinates;
23949           feature3.geometry = aggregate.geometry;
23950         }
23951         if (!props.area) {
23952           const area = import_geojson_area.default.geometry(feature3.geometry) / 1e6;
23953           props.area = Number(area.toFixed(2));
23954         }
23955         feature3.id = id2;
23956         props.id = id2;
23957         this._cache[id2] = feature3;
23958         return Object.assign(valid, { feature: feature3 });
23959       }
23960       if (this._strict) {
23961         throw new Error(`resolveLocation:  Couldn't resolve location "${location}".`);
23962       } else {
23963         return null;
23964       }
23965     }
23966     // validateLocationSet
23967     // `locationSet`  the locationSet to validate
23968     //
23969     // Pass a locationSet Object to validate like:
23970     //   {
23971     //     include: [ Array of locations ],
23972     //     exclude: [ Array of locations ]
23973     //   }
23974     //
23975     // Returns a result like:
23976     //   {
23977     //     type:         'locationset'
23978     //     locationSet:  the queried locationSet
23979     //     id:           the stable identifier for the feature
23980     //   }
23981     // or `null` if the locationSet is invalid
23982     //
23983     validateLocationSet(locationSet) {
23984       locationSet = locationSet || {};
23985       const validator = this.validateLocation.bind(this);
23986       let include = (locationSet.include || []).map(validator).filter(Boolean);
23987       let exclude = (locationSet.exclude || []).map(validator).filter(Boolean);
23988       if (!include.length) {
23989         if (this._strict) {
23990           throw new Error(`validateLocationSet:  LocationSet includes nothing.`);
23991         } else {
23992           locationSet.include = ["Q2"];
23993           include = [{ type: "countrycoder", location: "Q2", id: "Q2" }];
23994         }
23995       }
23996       include.sort(_sortLocations);
23997       let id2 = "+[" + include.map((d) => d.id).join(",") + "]";
23998       if (exclude.length) {
23999         exclude.sort(_sortLocations);
24000         id2 += "-[" + exclude.map((d) => d.id).join(",") + "]";
24001       }
24002       return { type: "locationset", locationSet, id: id2 };
24003     }
24004     // resolveLocationSet
24005     // `locationSet`  the locationSet to resolve
24006     //
24007     // Pass a locationSet Object to validate like:
24008     //   {
24009     //     include: [ Array of locations ],
24010     //     exclude: [ Array of locations ]
24011     //   }
24012     //
24013     // Returns a result like:
24014     //   {
24015     //     type:         'locationset'
24016     //     locationSet:  the queried locationSet
24017     //     id:           the stable identifier for the feature
24018     //     feature:      the resolved GeoJSON feature
24019     //   }
24020     // or `null` if the locationSet is invalid
24021     //
24022     resolveLocationSet(locationSet) {
24023       locationSet = locationSet || {};
24024       const valid = this.validateLocationSet(locationSet);
24025       if (!valid)
24026         return null;
24027       const id2 = valid.id;
24028       if (this._cache[id2]) {
24029         return Object.assign(valid, { feature: this._cache[id2] });
24030       }
24031       const resolver = this.resolveLocation.bind(this);
24032       const includes = (locationSet.include || []).map(resolver).filter(Boolean);
24033       const excludes = (locationSet.exclude || []).map(resolver).filter(Boolean);
24034       if (includes.length === 1 && excludes.length === 0) {
24035         return Object.assign(valid, { feature: includes[0].feature });
24036       }
24037       const includeGeoJSON = _clip(includes.map((d) => d.feature), "UNION");
24038       const excludeGeoJSON = _clip(excludes.map((d) => d.feature), "UNION");
24039       let resultGeoJSON = excludeGeoJSON ? _clip([includeGeoJSON, excludeGeoJSON], "DIFFERENCE") : includeGeoJSON;
24040       const area = import_geojson_area.default.geometry(resultGeoJSON.geometry) / 1e6;
24041       resultGeoJSON.id = id2;
24042       resultGeoJSON.properties = { id: id2, area: Number(area.toFixed(2)) };
24043       this._cache[id2] = resultGeoJSON;
24044       return Object.assign(valid, { feature: resultGeoJSON });
24045     }
24046     // strict
24047     //
24048     strict(val) {
24049       if (val === void 0) {
24050         return this._strict;
24051       } else {
24052         this._strict = val;
24053         return this;
24054       }
24055     }
24056     // cache
24057     // convenience method to access the internal cache
24058     cache() {
24059       return this._cache;
24060     }
24061     // stringify
24062     // convenience method to prettyStringify the given object
24063     stringify(obj, options2) {
24064       return (0, import_json_stringify_pretty_compact.default)(obj, options2);
24065     }
24066   };
24067   function _clip(features, which) {
24068     if (!Array.isArray(features) || !features.length)
24069       return null;
24070     const fn = { UNION: import_polygon_clipping.default.union, DIFFERENCE: import_polygon_clipping.default.difference }[which];
24071     const args = features.map((feature3) => feature3.geometry.coordinates);
24072     const coords = fn.apply(null, args);
24073     return {
24074       type: "Feature",
24075       properties: {},
24076       geometry: {
24077         type: whichType(coords),
24078         coordinates: coords
24079       }
24080     };
24081     function whichType(coords2) {
24082       const a = Array.isArray(coords2);
24083       const b = a && Array.isArray(coords2[0]);
24084       const c = b && Array.isArray(coords2[0][0]);
24085       const d = c && Array.isArray(coords2[0][0][0]);
24086       return d ? "MultiPolygon" : "Polygon";
24087     }
24088   }
24089   function _cloneDeep(obj) {
24090     return JSON.parse(JSON.stringify(obj));
24091   }
24092   function _sortLocations(a, b) {
24093     const rank = { countrycoder: 1, geojson: 2, point: 3 };
24094     const aRank = rank[a.type];
24095     const bRank = rank[b.type];
24096     return aRank > bRank ? 1 : aRank < bRank ? -1 : a.id.localeCompare(b.id);
24097   }
24098
24099   // modules/core/LocationManager.js
24100   var import_which_polygon2 = __toESM(require_which_polygon());
24101   var import_geojson_area2 = __toESM(require_geojson_area());
24102   var _loco = new location_conflation_default();
24103   var LocationManager = class {
24104     /**
24105      * @constructor
24106      */
24107     constructor() {
24108       this._wp = null;
24109       this._resolved = /* @__PURE__ */ new Map();
24110       this._knownLocationSets = /* @__PURE__ */ new Map();
24111       this._locationIncludedIn = /* @__PURE__ */ new Map();
24112       this._locationExcludedIn = /* @__PURE__ */ new Map();
24113       const world = { locationSet: { include: ["Q2"] } };
24114       this._resolveLocationSet(world);
24115       this._rebuildIndex();
24116     }
24117     /**
24118      * _validateLocationSet
24119      * Pass an Object with a `locationSet` property.
24120      * Validates the `locationSet` and sets a `locationSetID` property on the object.
24121      * To avoid so much computation we only resolve the include and exclude regions, but not the locationSet itself.
24122      *
24123      * Use `_resolveLocationSet()` instead if you need to resolve geojson of locationSet, for example to render it.
24124      * Note: You need to call `_rebuildIndex()` after you're all finished validating the locationSets.
24125      *
24126      * @param  `obj`  Object to check, it should have `locationSet` property
24127      */
24128     _validateLocationSet(obj) {
24129       if (obj.locationSetID)
24130         return;
24131       try {
24132         let locationSet = obj.locationSet;
24133         if (!locationSet) {
24134           throw new Error("object missing locationSet property");
24135         }
24136         if (!locationSet.include) {
24137           locationSet.include = ["Q2"];
24138         }
24139         const locationSetID = _loco.validateLocationSet(locationSet).id;
24140         obj.locationSetID = locationSetID;
24141         if (this._knownLocationSets.has(locationSetID))
24142           return;
24143         let area = 0;
24144         (locationSet.include || []).forEach((location) => {
24145           const locationID = _loco.validateLocation(location).id;
24146           let geojson = this._resolved.get(locationID);
24147           if (!geojson) {
24148             geojson = _loco.resolveLocation(location).feature;
24149             this._resolved.set(locationID, geojson);
24150           }
24151           area += geojson.properties.area;
24152           let s = this._locationIncludedIn.get(locationID);
24153           if (!s) {
24154             s = /* @__PURE__ */ new Set();
24155             this._locationIncludedIn.set(locationID, s);
24156           }
24157           s.add(locationSetID);
24158         });
24159         (locationSet.exclude || []).forEach((location) => {
24160           const locationID = _loco.validateLocation(location).id;
24161           let geojson = this._resolved.get(locationID);
24162           if (!geojson) {
24163             geojson = _loco.resolveLocation(location).feature;
24164             this._resolved.set(locationID, geojson);
24165           }
24166           area -= geojson.properties.area;
24167           let s = this._locationExcludedIn.get(locationID);
24168           if (!s) {
24169             s = /* @__PURE__ */ new Set();
24170             this._locationExcludedIn.set(locationID, s);
24171           }
24172           s.add(locationSetID);
24173         });
24174         this._knownLocationSets.set(locationSetID, area);
24175       } catch (err) {
24176         obj.locationSet = { include: ["Q2"] };
24177         obj.locationSetID = "+[Q2]";
24178       }
24179     }
24180     /**
24181      * _resolveLocationSet
24182      * Does everything that `_validateLocationSet()` does, but then "resolves" the locationSet into GeoJSON.
24183      * This step is a bit more computationally expensive, so really only needed if you intend to render the shape.
24184      *
24185      * Note: You need to call `_rebuildIndex()` after you're all finished validating the locationSets.
24186      *
24187      * @param  `obj`  Object to check, it should have `locationSet` property
24188      */
24189     _resolveLocationSet(obj) {
24190       this._validateLocationSet(obj);
24191       if (this._resolved.has(obj.locationSetID))
24192         return;
24193       try {
24194         const result = _loco.resolveLocationSet(obj.locationSet);
24195         const locationSetID = result.id;
24196         obj.locationSetID = locationSetID;
24197         if (!result.feature.geometry.coordinates.length || !result.feature.properties.area) {
24198           throw new Error(`locationSet ${locationSetID} resolves to an empty feature.`);
24199         }
24200         let geojson = JSON.parse(JSON.stringify(result.feature));
24201         geojson.id = locationSetID;
24202         geojson.properties.id = locationSetID;
24203         this._resolved.set(locationSetID, geojson);
24204       } catch (err) {
24205         obj.locationSet = { include: ["Q2"] };
24206         obj.locationSetID = "+[Q2]";
24207       }
24208     }
24209     /**
24210      * _rebuildIndex
24211      * Rebuilds the whichPolygon index with whatever features have been resolved into GeoJSON.
24212      */
24213     _rebuildIndex() {
24214       this._wp = (0, import_which_polygon2.default)({ features: [...this._resolved.values()] });
24215     }
24216     /**
24217      * mergeCustomGeoJSON
24218      * Accepts a FeatureCollection-like object containing custom locations
24219      * Each feature must have a filename-like `id`, for example: `something.geojson`
24220      * {
24221      *   "type": "FeatureCollection"
24222      *   "features": [
24223      *     {
24224      *       "type": "Feature",
24225      *       "id": "philly_metro.geojson",
24226      *       "properties": { … },
24227      *       "geometry": { … }
24228      *     }
24229      *   ]
24230      * }
24231      *
24232      * @param  `fc`  FeatureCollection-like Object containing custom locations
24233      */
24234     mergeCustomGeoJSON(fc) {
24235       if (!fc || fc.type !== "FeatureCollection" || !Array.isArray(fc.features))
24236         return;
24237       fc.features.forEach((feature3) => {
24238         feature3.properties = feature3.properties || {};
24239         let props = feature3.properties;
24240         let id2 = feature3.id || props.id;
24241         if (!id2 || !/^\S+\.geojson$/i.test(id2))
24242           return;
24243         id2 = id2.toLowerCase();
24244         feature3.id = id2;
24245         props.id = id2;
24246         if (!props.area) {
24247           const area = import_geojson_area2.default.geometry(feature3.geometry) / 1e6;
24248           props.area = Number(area.toFixed(2));
24249         }
24250         _loco._cache[id2] = feature3;
24251       });
24252     }
24253     /**
24254      * mergeLocationSets
24255      * Accepts an Array of Objects containing `locationSet` properties:
24256      * [
24257      *  { id: 'preset1', locationSet: {…} },
24258      *  { id: 'preset2', locationSet: {…} },
24259      *  …
24260      * ]
24261      * After validating, the Objects will be decorated with a `locationSetID` property:
24262      * [
24263      *  { id: 'preset1', locationSet: {…}, locationSetID: '+[Q2]' },
24264      *  { id: 'preset2', locationSet: {…}, locationSetID: '+[Q30]' },
24265      *  …
24266      * ]
24267      *
24268      * @param  `objects`  Objects to check - they should have `locationSet` property
24269      * @return  Promise resolved true (this function used to be slow/async, now it's faster and sync)
24270      */
24271     mergeLocationSets(objects) {
24272       if (!Array.isArray(objects))
24273         return Promise.reject("nothing to do");
24274       objects.forEach((obj) => this._validateLocationSet(obj));
24275       this._rebuildIndex();
24276       return Promise.resolve(objects);
24277     }
24278     /**
24279      * locationSetID
24280      * Returns a locationSetID for a given locationSet (fallback to `+[Q2]`, world)
24281      * (The locationSet doesn't necessarily need to be resolved to compute its `id`)
24282      *
24283      * @param  `locationSet`  A locationSet Object, e.g. `{ include: ['us'] }`
24284      * @return  String locationSetID, e.g. `+[Q30]`
24285      */
24286     locationSetID(locationSet) {
24287       let locationSetID;
24288       try {
24289         locationSetID = _loco.validateLocationSet(locationSet).id;
24290       } catch (err) {
24291         locationSetID = "+[Q2]";
24292       }
24293       return locationSetID;
24294     }
24295     /**
24296      * feature
24297      * Returns the resolved GeoJSON feature for a given locationSetID (fallback to 'world')
24298      * A GeoJSON feature:
24299      * {
24300      *   type: 'Feature',
24301      *   id: '+[Q30]',
24302      *   properties: { id: '+[Q30]', area: 21817019.17, … },
24303      *   geometry: { … }
24304      * }
24305      *
24306      * @param  `locationSetID`  String identifier, e.g. `+[Q30]`
24307      * @return  GeoJSON object (fallback to world)
24308      */
24309     feature(locationSetID = "+[Q2]") {
24310       const feature3 = this._resolved.get(locationSetID);
24311       return feature3 || this._resolved.get("+[Q2]");
24312     }
24313     /**
24314      * locationSetsAt
24315      * Find all the locationSets valid at the given location.
24316      * Results include the area (in km²) to facilitate sorting.
24317      *
24318      * Object of locationSetIDs to areas (in km²)
24319      * {
24320      *   "+[Q2]": 511207893.3958111,
24321      *   "+[Q30]": 21817019.17,
24322      *   "+[new_jersey.geojson]": 22390.77,
24323      *   …
24324      * }
24325      *
24326      * @param  `loc`  `[lon,lat]` location to query, e.g. `[-74.4813, 40.7967]`
24327      * @return  Object of locationSetIDs valid at given location
24328      */
24329     locationSetsAt(loc) {
24330       let result = {};
24331       const hits = this._wp(loc, true) || [];
24332       const thiz = this;
24333       hits.forEach((prop) => {
24334         if (prop.id[0] !== "+")
24335           return;
24336         const locationSetID = prop.id;
24337         const area = thiz._knownLocationSets.get(locationSetID);
24338         if (area) {
24339           result[locationSetID] = area;
24340         }
24341       });
24342       hits.forEach((prop) => {
24343         if (prop.id[0] === "+")
24344           return;
24345         const locationID = prop.id;
24346         const included = thiz._locationIncludedIn.get(locationID);
24347         (included || []).forEach((locationSetID) => {
24348           const area = thiz._knownLocationSets.get(locationSetID);
24349           if (area) {
24350             result[locationSetID] = area;
24351           }
24352         });
24353       });
24354       hits.forEach((prop) => {
24355         if (prop.id[0] === "+")
24356           return;
24357         const locationID = prop.id;
24358         const excluded = thiz._locationExcludedIn.get(locationID);
24359         (excluded || []).forEach((locationSetID) => {
24360           delete result[locationSetID];
24361         });
24362       });
24363       return result;
24364     }
24365     // Direct access to the location-conflation resolver
24366     loco() {
24367       return _loco;
24368     }
24369   };
24370   var _sharedLocationManager = new LocationManager();
24371
24372   // node_modules/lodash-es/_freeGlobal.js
24373   var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
24374   var freeGlobal_default = freeGlobal;
24375
24376   // node_modules/lodash-es/_root.js
24377   var freeSelf = typeof self == "object" && self && self.Object === Object && self;
24378   var root2 = freeGlobal_default || freeSelf || Function("return this")();
24379   var root_default = root2;
24380
24381   // node_modules/lodash-es/_Symbol.js
24382   var Symbol2 = root_default.Symbol;
24383   var Symbol_default = Symbol2;
24384
24385   // node_modules/lodash-es/_getRawTag.js
24386   var objectProto = Object.prototype;
24387   var hasOwnProperty = objectProto.hasOwnProperty;
24388   var nativeObjectToString = objectProto.toString;
24389   var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0;
24390   function getRawTag(value) {
24391     var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
24392     try {
24393       value[symToStringTag] = void 0;
24394       var unmasked = true;
24395     } catch (e) {
24396     }
24397     var result = nativeObjectToString.call(value);
24398     if (unmasked) {
24399       if (isOwn) {
24400         value[symToStringTag] = tag;
24401       } else {
24402         delete value[symToStringTag];
24403       }
24404     }
24405     return result;
24406   }
24407   var getRawTag_default = getRawTag;
24408
24409   // node_modules/lodash-es/_objectToString.js
24410   var objectProto2 = Object.prototype;
24411   var nativeObjectToString2 = objectProto2.toString;
24412   function objectToString(value) {
24413     return nativeObjectToString2.call(value);
24414   }
24415   var objectToString_default = objectToString;
24416
24417   // node_modules/lodash-es/_baseGetTag.js
24418   var nullTag = "[object Null]";
24419   var undefinedTag = "[object Undefined]";
24420   var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0;
24421   function baseGetTag(value) {
24422     if (value == null) {
24423       return value === void 0 ? undefinedTag : nullTag;
24424     }
24425     return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value);
24426   }
24427   var baseGetTag_default = baseGetTag;
24428
24429   // node_modules/lodash-es/isObjectLike.js
24430   function isObjectLike(value) {
24431     return value != null && typeof value == "object";
24432   }
24433   var isObjectLike_default = isObjectLike;
24434
24435   // node_modules/lodash-es/isSymbol.js
24436   var symbolTag = "[object Symbol]";
24437   function isSymbol(value) {
24438     return typeof value == "symbol" || isObjectLike_default(value) && baseGetTag_default(value) == symbolTag;
24439   }
24440   var isSymbol_default = isSymbol;
24441
24442   // node_modules/lodash-es/_arrayMap.js
24443   function arrayMap(array2, iteratee) {
24444     var index = -1, length = array2 == null ? 0 : array2.length, result = Array(length);
24445     while (++index < length) {
24446       result[index] = iteratee(array2[index], index, array2);
24447     }
24448     return result;
24449   }
24450   var arrayMap_default = arrayMap;
24451
24452   // node_modules/lodash-es/isArray.js
24453   var isArray = Array.isArray;
24454   var isArray_default = isArray;
24455
24456   // node_modules/lodash-es/_baseToString.js
24457   var INFINITY = 1 / 0;
24458   var symbolProto = Symbol_default ? Symbol_default.prototype : void 0;
24459   var symbolToString = symbolProto ? symbolProto.toString : void 0;
24460   function baseToString(value) {
24461     if (typeof value == "string") {
24462       return value;
24463     }
24464     if (isArray_default(value)) {
24465       return arrayMap_default(value, baseToString) + "";
24466     }
24467     if (isSymbol_default(value)) {
24468       return symbolToString ? symbolToString.call(value) : "";
24469     }
24470     var result = value + "";
24471     return result == "0" && 1 / value == -INFINITY ? "-0" : result;
24472   }
24473   var baseToString_default = baseToString;
24474
24475   // node_modules/lodash-es/_trimmedEndIndex.js
24476   var reWhitespace = /\s/;
24477   function trimmedEndIndex(string) {
24478     var index = string.length;
24479     while (index-- && reWhitespace.test(string.charAt(index))) {
24480     }
24481     return index;
24482   }
24483   var trimmedEndIndex_default = trimmedEndIndex;
24484
24485   // node_modules/lodash-es/_baseTrim.js
24486   var reTrimStart = /^\s+/;
24487   function baseTrim(string) {
24488     return string ? string.slice(0, trimmedEndIndex_default(string) + 1).replace(reTrimStart, "") : string;
24489   }
24490   var baseTrim_default = baseTrim;
24491
24492   // node_modules/lodash-es/isObject.js
24493   function isObject(value) {
24494     var type2 = typeof value;
24495     return value != null && (type2 == "object" || type2 == "function");
24496   }
24497   var isObject_default = isObject;
24498
24499   // node_modules/lodash-es/toNumber.js
24500   var NAN = 0 / 0;
24501   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
24502   var reIsBinary = /^0b[01]+$/i;
24503   var reIsOctal = /^0o[0-7]+$/i;
24504   var freeParseInt = parseInt;
24505   function toNumber(value) {
24506     if (typeof value == "number") {
24507       return value;
24508     }
24509     if (isSymbol_default(value)) {
24510       return NAN;
24511     }
24512     if (isObject_default(value)) {
24513       var other = typeof value.valueOf == "function" ? value.valueOf() : value;
24514       value = isObject_default(other) ? other + "" : other;
24515     }
24516     if (typeof value != "string") {
24517       return value === 0 ? value : +value;
24518     }
24519     value = baseTrim_default(value);
24520     var isBinary = reIsBinary.test(value);
24521     return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
24522   }
24523   var toNumber_default = toNumber;
24524
24525   // node_modules/lodash-es/isFunction.js
24526   var asyncTag = "[object AsyncFunction]";
24527   var funcTag = "[object Function]";
24528   var genTag = "[object GeneratorFunction]";
24529   var proxyTag = "[object Proxy]";
24530   function isFunction(value) {
24531     if (!isObject_default(value)) {
24532       return false;
24533     }
24534     var tag = baseGetTag_default(value);
24535     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
24536   }
24537   var isFunction_default = isFunction;
24538
24539   // node_modules/lodash-es/_coreJsData.js
24540   var coreJsData = root_default["__core-js_shared__"];
24541   var coreJsData_default = coreJsData;
24542
24543   // node_modules/lodash-es/_isMasked.js
24544   var maskSrcKey = function() {
24545     var uid = /[^.]+$/.exec(coreJsData_default && coreJsData_default.keys && coreJsData_default.keys.IE_PROTO || "");
24546     return uid ? "Symbol(src)_1." + uid : "";
24547   }();
24548   function isMasked(func) {
24549     return !!maskSrcKey && maskSrcKey in func;
24550   }
24551   var isMasked_default = isMasked;
24552
24553   // node_modules/lodash-es/_toSource.js
24554   var funcProto = Function.prototype;
24555   var funcToString = funcProto.toString;
24556   function toSource(func) {
24557     if (func != null) {
24558       try {
24559         return funcToString.call(func);
24560       } catch (e) {
24561       }
24562       try {
24563         return func + "";
24564       } catch (e) {
24565       }
24566     }
24567     return "";
24568   }
24569   var toSource_default = toSource;
24570
24571   // node_modules/lodash-es/_baseIsNative.js
24572   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
24573   var reIsHostCtor = /^\[object .+?Constructor\]$/;
24574   var funcProto2 = Function.prototype;
24575   var objectProto3 = Object.prototype;
24576   var funcToString2 = funcProto2.toString;
24577   var hasOwnProperty2 = objectProto3.hasOwnProperty;
24578   var reIsNative = RegExp(
24579     "^" + funcToString2.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
24580   );
24581   function baseIsNative(value) {
24582     if (!isObject_default(value) || isMasked_default(value)) {
24583       return false;
24584     }
24585     var pattern = isFunction_default(value) ? reIsNative : reIsHostCtor;
24586     return pattern.test(toSource_default(value));
24587   }
24588   var baseIsNative_default = baseIsNative;
24589
24590   // node_modules/lodash-es/_getValue.js
24591   function getValue(object, key) {
24592     return object == null ? void 0 : object[key];
24593   }
24594   var getValue_default = getValue;
24595
24596   // node_modules/lodash-es/_getNative.js
24597   function getNative(object, key) {
24598     var value = getValue_default(object, key);
24599     return baseIsNative_default(value) ? value : void 0;
24600   }
24601   var getNative_default = getNative;
24602
24603   // node_modules/lodash-es/_WeakMap.js
24604   var WeakMap = getNative_default(root_default, "WeakMap");
24605   var WeakMap_default = WeakMap;
24606
24607   // node_modules/lodash-es/_isIndex.js
24608   var MAX_SAFE_INTEGER = 9007199254740991;
24609   var reIsUint = /^(?:0|[1-9]\d*)$/;
24610   function isIndex(value, length) {
24611     var type2 = typeof value;
24612     length = length == null ? MAX_SAFE_INTEGER : length;
24613     return !!length && (type2 == "number" || type2 != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
24614   }
24615   var isIndex_default = isIndex;
24616
24617   // node_modules/lodash-es/eq.js
24618   function eq(value, other) {
24619     return value === other || value !== value && other !== other;
24620   }
24621   var eq_default = eq;
24622
24623   // node_modules/lodash-es/isLength.js
24624   var MAX_SAFE_INTEGER2 = 9007199254740991;
24625   function isLength(value) {
24626     return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER2;
24627   }
24628   var isLength_default = isLength;
24629
24630   // node_modules/lodash-es/isArrayLike.js
24631   function isArrayLike(value) {
24632     return value != null && isLength_default(value.length) && !isFunction_default(value);
24633   }
24634   var isArrayLike_default = isArrayLike;
24635
24636   // node_modules/lodash-es/_isPrototype.js
24637   var objectProto4 = Object.prototype;
24638   function isPrototype(value) {
24639     var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto4;
24640     return value === proto;
24641   }
24642   var isPrototype_default = isPrototype;
24643
24644   // node_modules/lodash-es/_baseTimes.js
24645   function baseTimes(n2, iteratee) {
24646     var index = -1, result = Array(n2);
24647     while (++index < n2) {
24648       result[index] = iteratee(index);
24649     }
24650     return result;
24651   }
24652   var baseTimes_default = baseTimes;
24653
24654   // node_modules/lodash-es/_baseIsArguments.js
24655   var argsTag = "[object Arguments]";
24656   function baseIsArguments(value) {
24657     return isObjectLike_default(value) && baseGetTag_default(value) == argsTag;
24658   }
24659   var baseIsArguments_default = baseIsArguments;
24660
24661   // node_modules/lodash-es/isArguments.js
24662   var objectProto5 = Object.prototype;
24663   var hasOwnProperty3 = objectProto5.hasOwnProperty;
24664   var propertyIsEnumerable = objectProto5.propertyIsEnumerable;
24665   var isArguments = baseIsArguments_default(function() {
24666     return arguments;
24667   }()) ? baseIsArguments_default : function(value) {
24668     return isObjectLike_default(value) && hasOwnProperty3.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
24669   };
24670   var isArguments_default = isArguments;
24671
24672   // node_modules/lodash-es/stubFalse.js
24673   function stubFalse() {
24674     return false;
24675   }
24676   var stubFalse_default = stubFalse;
24677
24678   // node_modules/lodash-es/isBuffer.js
24679   var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
24680   var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module;
24681   var moduleExports = freeModule && freeModule.exports === freeExports;
24682   var Buffer2 = moduleExports ? root_default.Buffer : void 0;
24683   var nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : void 0;
24684   var isBuffer = nativeIsBuffer || stubFalse_default;
24685   var isBuffer_default = isBuffer;
24686
24687   // node_modules/lodash-es/_baseIsTypedArray.js
24688   var argsTag2 = "[object Arguments]";
24689   var arrayTag = "[object Array]";
24690   var boolTag = "[object Boolean]";
24691   var dateTag = "[object Date]";
24692   var errorTag = "[object Error]";
24693   var funcTag2 = "[object Function]";
24694   var mapTag = "[object Map]";
24695   var numberTag = "[object Number]";
24696   var objectTag = "[object Object]";
24697   var regexpTag = "[object RegExp]";
24698   var setTag = "[object Set]";
24699   var stringTag = "[object String]";
24700   var weakMapTag = "[object WeakMap]";
24701   var arrayBufferTag = "[object ArrayBuffer]";
24702   var dataViewTag = "[object DataView]";
24703   var float32Tag = "[object Float32Array]";
24704   var float64Tag = "[object Float64Array]";
24705   var int8Tag = "[object Int8Array]";
24706   var int16Tag = "[object Int16Array]";
24707   var int32Tag = "[object Int32Array]";
24708   var uint8Tag = "[object Uint8Array]";
24709   var uint8ClampedTag = "[object Uint8ClampedArray]";
24710   var uint16Tag = "[object Uint16Array]";
24711   var uint32Tag = "[object Uint32Array]";
24712   var typedArrayTags = {};
24713   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
24714   typedArrayTags[argsTag2] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag2] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
24715   function baseIsTypedArray(value) {
24716     return isObjectLike_default(value) && isLength_default(value.length) && !!typedArrayTags[baseGetTag_default(value)];
24717   }
24718   var baseIsTypedArray_default = baseIsTypedArray;
24719
24720   // node_modules/lodash-es/_baseUnary.js
24721   function baseUnary(func) {
24722     return function(value) {
24723       return func(value);
24724     };
24725   }
24726   var baseUnary_default = baseUnary;
24727
24728   // node_modules/lodash-es/_nodeUtil.js
24729   var freeExports2 = typeof exports == "object" && exports && !exports.nodeType && exports;
24730   var freeModule2 = freeExports2 && typeof module == "object" && module && !module.nodeType && module;
24731   var moduleExports2 = freeModule2 && freeModule2.exports === freeExports2;
24732   var freeProcess = moduleExports2 && freeGlobal_default.process;
24733   var nodeUtil = function() {
24734     try {
24735       var types = freeModule2 && freeModule2.require && freeModule2.require("util").types;
24736       if (types) {
24737         return types;
24738       }
24739       return freeProcess && freeProcess.binding && freeProcess.binding("util");
24740     } catch (e) {
24741     }
24742   }();
24743   var nodeUtil_default = nodeUtil;
24744
24745   // node_modules/lodash-es/isTypedArray.js
24746   var nodeIsTypedArray = nodeUtil_default && nodeUtil_default.isTypedArray;
24747   var isTypedArray = nodeIsTypedArray ? baseUnary_default(nodeIsTypedArray) : baseIsTypedArray_default;
24748   var isTypedArray_default = isTypedArray;
24749
24750   // node_modules/lodash-es/_arrayLikeKeys.js
24751   var objectProto6 = Object.prototype;
24752   var hasOwnProperty4 = objectProto6.hasOwnProperty;
24753   function arrayLikeKeys(value, inherited) {
24754     var isArr = isArray_default(value), isArg = !isArr && isArguments_default(value), isBuff = !isArr && !isArg && isBuffer_default(value), isType = !isArr && !isArg && !isBuff && isTypedArray_default(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes_default(value.length, String) : [], length = result.length;
24755     for (var key in value) {
24756       if ((inherited || hasOwnProperty4.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode.
24757       (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers.
24758       isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays.
24759       isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties.
24760       isIndex_default(key, length)))) {
24761         result.push(key);
24762       }
24763     }
24764     return result;
24765   }
24766   var arrayLikeKeys_default = arrayLikeKeys;
24767
24768   // node_modules/lodash-es/_overArg.js
24769   function overArg(func, transform2) {
24770     return function(arg) {
24771       return func(transform2(arg));
24772     };
24773   }
24774   var overArg_default = overArg;
24775
24776   // node_modules/lodash-es/_nativeKeys.js
24777   var nativeKeys = overArg_default(Object.keys, Object);
24778   var nativeKeys_default = nativeKeys;
24779
24780   // node_modules/lodash-es/_baseKeys.js
24781   var objectProto7 = Object.prototype;
24782   var hasOwnProperty5 = objectProto7.hasOwnProperty;
24783   function baseKeys(object) {
24784     if (!isPrototype_default(object)) {
24785       return nativeKeys_default(object);
24786     }
24787     var result = [];
24788     for (var key in Object(object)) {
24789       if (hasOwnProperty5.call(object, key) && key != "constructor") {
24790         result.push(key);
24791       }
24792     }
24793     return result;
24794   }
24795   var baseKeys_default = baseKeys;
24796
24797   // node_modules/lodash-es/keys.js
24798   function keys(object) {
24799     return isArrayLike_default(object) ? arrayLikeKeys_default(object) : baseKeys_default(object);
24800   }
24801   var keys_default = keys;
24802
24803   // node_modules/lodash-es/_nativeCreate.js
24804   var nativeCreate = getNative_default(Object, "create");
24805   var nativeCreate_default = nativeCreate;
24806
24807   // node_modules/lodash-es/_hashClear.js
24808   function hashClear() {
24809     this.__data__ = nativeCreate_default ? nativeCreate_default(null) : {};
24810     this.size = 0;
24811   }
24812   var hashClear_default = hashClear;
24813
24814   // node_modules/lodash-es/_hashDelete.js
24815   function hashDelete(key) {
24816     var result = this.has(key) && delete this.__data__[key];
24817     this.size -= result ? 1 : 0;
24818     return result;
24819   }
24820   var hashDelete_default = hashDelete;
24821
24822   // node_modules/lodash-es/_hashGet.js
24823   var HASH_UNDEFINED = "__lodash_hash_undefined__";
24824   var objectProto8 = Object.prototype;
24825   var hasOwnProperty6 = objectProto8.hasOwnProperty;
24826   function hashGet(key) {
24827     var data = this.__data__;
24828     if (nativeCreate_default) {
24829       var result = data[key];
24830       return result === HASH_UNDEFINED ? void 0 : result;
24831     }
24832     return hasOwnProperty6.call(data, key) ? data[key] : void 0;
24833   }
24834   var hashGet_default = hashGet;
24835
24836   // node_modules/lodash-es/_hashHas.js
24837   var objectProto9 = Object.prototype;
24838   var hasOwnProperty7 = objectProto9.hasOwnProperty;
24839   function hashHas(key) {
24840     var data = this.__data__;
24841     return nativeCreate_default ? data[key] !== void 0 : hasOwnProperty7.call(data, key);
24842   }
24843   var hashHas_default = hashHas;
24844
24845   // node_modules/lodash-es/_hashSet.js
24846   var HASH_UNDEFINED2 = "__lodash_hash_undefined__";
24847   function hashSet(key, value) {
24848     var data = this.__data__;
24849     this.size += this.has(key) ? 0 : 1;
24850     data[key] = nativeCreate_default && value === void 0 ? HASH_UNDEFINED2 : value;
24851     return this;
24852   }
24853   var hashSet_default = hashSet;
24854
24855   // node_modules/lodash-es/_Hash.js
24856   function Hash(entries) {
24857     var index = -1, length = entries == null ? 0 : entries.length;
24858     this.clear();
24859     while (++index < length) {
24860       var entry = entries[index];
24861       this.set(entry[0], entry[1]);
24862     }
24863   }
24864   Hash.prototype.clear = hashClear_default;
24865   Hash.prototype["delete"] = hashDelete_default;
24866   Hash.prototype.get = hashGet_default;
24867   Hash.prototype.has = hashHas_default;
24868   Hash.prototype.set = hashSet_default;
24869   var Hash_default = Hash;
24870
24871   // node_modules/lodash-es/_listCacheClear.js
24872   function listCacheClear() {
24873     this.__data__ = [];
24874     this.size = 0;
24875   }
24876   var listCacheClear_default = listCacheClear;
24877
24878   // node_modules/lodash-es/_assocIndexOf.js
24879   function assocIndexOf(array2, key) {
24880     var length = array2.length;
24881     while (length--) {
24882       if (eq_default(array2[length][0], key)) {
24883         return length;
24884       }
24885     }
24886     return -1;
24887   }
24888   var assocIndexOf_default = assocIndexOf;
24889
24890   // node_modules/lodash-es/_listCacheDelete.js
24891   var arrayProto = Array.prototype;
24892   var splice = arrayProto.splice;
24893   function listCacheDelete(key) {
24894     var data = this.__data__, index = assocIndexOf_default(data, key);
24895     if (index < 0) {
24896       return false;
24897     }
24898     var lastIndex = data.length - 1;
24899     if (index == lastIndex) {
24900       data.pop();
24901     } else {
24902       splice.call(data, index, 1);
24903     }
24904     --this.size;
24905     return true;
24906   }
24907   var listCacheDelete_default = listCacheDelete;
24908
24909   // node_modules/lodash-es/_listCacheGet.js
24910   function listCacheGet(key) {
24911     var data = this.__data__, index = assocIndexOf_default(data, key);
24912     return index < 0 ? void 0 : data[index][1];
24913   }
24914   var listCacheGet_default = listCacheGet;
24915
24916   // node_modules/lodash-es/_listCacheHas.js
24917   function listCacheHas(key) {
24918     return assocIndexOf_default(this.__data__, key) > -1;
24919   }
24920   var listCacheHas_default = listCacheHas;
24921
24922   // node_modules/lodash-es/_listCacheSet.js
24923   function listCacheSet(key, value) {
24924     var data = this.__data__, index = assocIndexOf_default(data, key);
24925     if (index < 0) {
24926       ++this.size;
24927       data.push([key, value]);
24928     } else {
24929       data[index][1] = value;
24930     }
24931     return this;
24932   }
24933   var listCacheSet_default = listCacheSet;
24934
24935   // node_modules/lodash-es/_ListCache.js
24936   function ListCache(entries) {
24937     var index = -1, length = entries == null ? 0 : entries.length;
24938     this.clear();
24939     while (++index < length) {
24940       var entry = entries[index];
24941       this.set(entry[0], entry[1]);
24942     }
24943   }
24944   ListCache.prototype.clear = listCacheClear_default;
24945   ListCache.prototype["delete"] = listCacheDelete_default;
24946   ListCache.prototype.get = listCacheGet_default;
24947   ListCache.prototype.has = listCacheHas_default;
24948   ListCache.prototype.set = listCacheSet_default;
24949   var ListCache_default = ListCache;
24950
24951   // node_modules/lodash-es/_Map.js
24952   var Map2 = getNative_default(root_default, "Map");
24953   var Map_default = Map2;
24954
24955   // node_modules/lodash-es/_mapCacheClear.js
24956   function mapCacheClear() {
24957     this.size = 0;
24958     this.__data__ = {
24959       "hash": new Hash_default(),
24960       "map": new (Map_default || ListCache_default)(),
24961       "string": new Hash_default()
24962     };
24963   }
24964   var mapCacheClear_default = mapCacheClear;
24965
24966   // node_modules/lodash-es/_isKeyable.js
24967   function isKeyable(value) {
24968     var type2 = typeof value;
24969     return type2 == "string" || type2 == "number" || type2 == "symbol" || type2 == "boolean" ? value !== "__proto__" : value === null;
24970   }
24971   var isKeyable_default = isKeyable;
24972
24973   // node_modules/lodash-es/_getMapData.js
24974   function getMapData(map2, key) {
24975     var data = map2.__data__;
24976     return isKeyable_default(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
24977   }
24978   var getMapData_default = getMapData;
24979
24980   // node_modules/lodash-es/_mapCacheDelete.js
24981   function mapCacheDelete(key) {
24982     var result = getMapData_default(this, key)["delete"](key);
24983     this.size -= result ? 1 : 0;
24984     return result;
24985   }
24986   var mapCacheDelete_default = mapCacheDelete;
24987
24988   // node_modules/lodash-es/_mapCacheGet.js
24989   function mapCacheGet(key) {
24990     return getMapData_default(this, key).get(key);
24991   }
24992   var mapCacheGet_default = mapCacheGet;
24993
24994   // node_modules/lodash-es/_mapCacheHas.js
24995   function mapCacheHas(key) {
24996     return getMapData_default(this, key).has(key);
24997   }
24998   var mapCacheHas_default = mapCacheHas;
24999
25000   // node_modules/lodash-es/_mapCacheSet.js
25001   function mapCacheSet(key, value) {
25002     var data = getMapData_default(this, key), size = data.size;
25003     data.set(key, value);
25004     this.size += data.size == size ? 0 : 1;
25005     return this;
25006   }
25007   var mapCacheSet_default = mapCacheSet;
25008
25009   // node_modules/lodash-es/_MapCache.js
25010   function MapCache(entries) {
25011     var index = -1, length = entries == null ? 0 : entries.length;
25012     this.clear();
25013     while (++index < length) {
25014       var entry = entries[index];
25015       this.set(entry[0], entry[1]);
25016     }
25017   }
25018   MapCache.prototype.clear = mapCacheClear_default;
25019   MapCache.prototype["delete"] = mapCacheDelete_default;
25020   MapCache.prototype.get = mapCacheGet_default;
25021   MapCache.prototype.has = mapCacheHas_default;
25022   MapCache.prototype.set = mapCacheSet_default;
25023   var MapCache_default = MapCache;
25024
25025   // node_modules/lodash-es/toString.js
25026   function toString(value) {
25027     return value == null ? "" : baseToString_default(value);
25028   }
25029   var toString_default = toString;
25030
25031   // node_modules/lodash-es/_arrayPush.js
25032   function arrayPush(array2, values) {
25033     var index = -1, length = values.length, offset = array2.length;
25034     while (++index < length) {
25035       array2[offset + index] = values[index];
25036     }
25037     return array2;
25038   }
25039   var arrayPush_default = arrayPush;
25040
25041   // node_modules/lodash-es/_basePropertyOf.js
25042   function basePropertyOf(object) {
25043     return function(key) {
25044       return object == null ? void 0 : object[key];
25045     };
25046   }
25047   var basePropertyOf_default = basePropertyOf;
25048
25049   // node_modules/lodash-es/_stackClear.js
25050   function stackClear() {
25051     this.__data__ = new ListCache_default();
25052     this.size = 0;
25053   }
25054   var stackClear_default = stackClear;
25055
25056   // node_modules/lodash-es/_stackDelete.js
25057   function stackDelete(key) {
25058     var data = this.__data__, result = data["delete"](key);
25059     this.size = data.size;
25060     return result;
25061   }
25062   var stackDelete_default = stackDelete;
25063
25064   // node_modules/lodash-es/_stackGet.js
25065   function stackGet(key) {
25066     return this.__data__.get(key);
25067   }
25068   var stackGet_default = stackGet;
25069
25070   // node_modules/lodash-es/_stackHas.js
25071   function stackHas(key) {
25072     return this.__data__.has(key);
25073   }
25074   var stackHas_default = stackHas;
25075
25076   // node_modules/lodash-es/_stackSet.js
25077   var LARGE_ARRAY_SIZE = 200;
25078   function stackSet(key, value) {
25079     var data = this.__data__;
25080     if (data instanceof ListCache_default) {
25081       var pairs = data.__data__;
25082       if (!Map_default || pairs.length < LARGE_ARRAY_SIZE - 1) {
25083         pairs.push([key, value]);
25084         this.size = ++data.size;
25085         return this;
25086       }
25087       data = this.__data__ = new MapCache_default(pairs);
25088     }
25089     data.set(key, value);
25090     this.size = data.size;
25091     return this;
25092   }
25093   var stackSet_default = stackSet;
25094
25095   // node_modules/lodash-es/_Stack.js
25096   function Stack(entries) {
25097     var data = this.__data__ = new ListCache_default(entries);
25098     this.size = data.size;
25099   }
25100   Stack.prototype.clear = stackClear_default;
25101   Stack.prototype["delete"] = stackDelete_default;
25102   Stack.prototype.get = stackGet_default;
25103   Stack.prototype.has = stackHas_default;
25104   Stack.prototype.set = stackSet_default;
25105   var Stack_default = Stack;
25106
25107   // node_modules/lodash-es/_arrayFilter.js
25108   function arrayFilter(array2, predicate) {
25109     var index = -1, length = array2 == null ? 0 : array2.length, resIndex = 0, result = [];
25110     while (++index < length) {
25111       var value = array2[index];
25112       if (predicate(value, index, array2)) {
25113         result[resIndex++] = value;
25114       }
25115     }
25116     return result;
25117   }
25118   var arrayFilter_default = arrayFilter;
25119
25120   // node_modules/lodash-es/stubArray.js
25121   function stubArray() {
25122     return [];
25123   }
25124   var stubArray_default = stubArray;
25125
25126   // node_modules/lodash-es/_getSymbols.js
25127   var objectProto10 = Object.prototype;
25128   var propertyIsEnumerable2 = objectProto10.propertyIsEnumerable;
25129   var nativeGetSymbols = Object.getOwnPropertySymbols;
25130   var getSymbols = !nativeGetSymbols ? stubArray_default : function(object) {
25131     if (object == null) {
25132       return [];
25133     }
25134     object = Object(object);
25135     return arrayFilter_default(nativeGetSymbols(object), function(symbol) {
25136       return propertyIsEnumerable2.call(object, symbol);
25137     });
25138   };
25139   var getSymbols_default = getSymbols;
25140
25141   // node_modules/lodash-es/_baseGetAllKeys.js
25142   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
25143     var result = keysFunc(object);
25144     return isArray_default(object) ? result : arrayPush_default(result, symbolsFunc(object));
25145   }
25146   var baseGetAllKeys_default = baseGetAllKeys;
25147
25148   // node_modules/lodash-es/_getAllKeys.js
25149   function getAllKeys(object) {
25150     return baseGetAllKeys_default(object, keys_default, getSymbols_default);
25151   }
25152   var getAllKeys_default = getAllKeys;
25153
25154   // node_modules/lodash-es/_DataView.js
25155   var DataView2 = getNative_default(root_default, "DataView");
25156   var DataView_default = DataView2;
25157
25158   // node_modules/lodash-es/_Promise.js
25159   var Promise2 = getNative_default(root_default, "Promise");
25160   var Promise_default = Promise2;
25161
25162   // node_modules/lodash-es/_Set.js
25163   var Set2 = getNative_default(root_default, "Set");
25164   var Set_default = Set2;
25165
25166   // node_modules/lodash-es/_getTag.js
25167   var mapTag2 = "[object Map]";
25168   var objectTag2 = "[object Object]";
25169   var promiseTag = "[object Promise]";
25170   var setTag2 = "[object Set]";
25171   var weakMapTag2 = "[object WeakMap]";
25172   var dataViewTag2 = "[object DataView]";
25173   var dataViewCtorString = toSource_default(DataView_default);
25174   var mapCtorString = toSource_default(Map_default);
25175   var promiseCtorString = toSource_default(Promise_default);
25176   var setCtorString = toSource_default(Set_default);
25177   var weakMapCtorString = toSource_default(WeakMap_default);
25178   var getTag = baseGetTag_default;
25179   if (DataView_default && getTag(new DataView_default(new ArrayBuffer(1))) != dataViewTag2 || Map_default && getTag(new Map_default()) != mapTag2 || Promise_default && getTag(Promise_default.resolve()) != promiseTag || Set_default && getTag(new Set_default()) != setTag2 || WeakMap_default && getTag(new WeakMap_default()) != weakMapTag2) {
25180     getTag = function(value) {
25181       var result = baseGetTag_default(value), Ctor = result == objectTag2 ? value.constructor : void 0, ctorString = Ctor ? toSource_default(Ctor) : "";
25182       if (ctorString) {
25183         switch (ctorString) {
25184           case dataViewCtorString:
25185             return dataViewTag2;
25186           case mapCtorString:
25187             return mapTag2;
25188           case promiseCtorString:
25189             return promiseTag;
25190           case setCtorString:
25191             return setTag2;
25192           case weakMapCtorString:
25193             return weakMapTag2;
25194         }
25195       }
25196       return result;
25197     };
25198   }
25199   var getTag_default = getTag;
25200
25201   // node_modules/lodash-es/_Uint8Array.js
25202   var Uint8Array2 = root_default.Uint8Array;
25203   var Uint8Array_default = Uint8Array2;
25204
25205   // node_modules/lodash-es/_setCacheAdd.js
25206   var HASH_UNDEFINED3 = "__lodash_hash_undefined__";
25207   function setCacheAdd(value) {
25208     this.__data__.set(value, HASH_UNDEFINED3);
25209     return this;
25210   }
25211   var setCacheAdd_default = setCacheAdd;
25212
25213   // node_modules/lodash-es/_setCacheHas.js
25214   function setCacheHas(value) {
25215     return this.__data__.has(value);
25216   }
25217   var setCacheHas_default = setCacheHas;
25218
25219   // node_modules/lodash-es/_SetCache.js
25220   function SetCache(values) {
25221     var index = -1, length = values == null ? 0 : values.length;
25222     this.__data__ = new MapCache_default();
25223     while (++index < length) {
25224       this.add(values[index]);
25225     }
25226   }
25227   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd_default;
25228   SetCache.prototype.has = setCacheHas_default;
25229   var SetCache_default = SetCache;
25230
25231   // node_modules/lodash-es/_arraySome.js
25232   function arraySome(array2, predicate) {
25233     var index = -1, length = array2 == null ? 0 : array2.length;
25234     while (++index < length) {
25235       if (predicate(array2[index], index, array2)) {
25236         return true;
25237       }
25238     }
25239     return false;
25240   }
25241   var arraySome_default = arraySome;
25242
25243   // node_modules/lodash-es/_cacheHas.js
25244   function cacheHas(cache, key) {
25245     return cache.has(key);
25246   }
25247   var cacheHas_default = cacheHas;
25248
25249   // node_modules/lodash-es/_equalArrays.js
25250   var COMPARE_PARTIAL_FLAG = 1;
25251   var COMPARE_UNORDERED_FLAG = 2;
25252   function equalArrays(array2, other, bitmask, customizer, equalFunc, stack) {
25253     var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array2.length, othLength = other.length;
25254     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
25255       return false;
25256     }
25257     var arrStacked = stack.get(array2);
25258     var othStacked = stack.get(other);
25259     if (arrStacked && othStacked) {
25260       return arrStacked == other && othStacked == array2;
25261     }
25262     var index = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache_default() : void 0;
25263     stack.set(array2, other);
25264     stack.set(other, array2);
25265     while (++index < arrLength) {
25266       var arrValue = array2[index], othValue = other[index];
25267       if (customizer) {
25268         var compared = isPartial ? customizer(othValue, arrValue, index, other, array2, stack) : customizer(arrValue, othValue, index, array2, other, stack);
25269       }
25270       if (compared !== void 0) {
25271         if (compared) {
25272           continue;
25273         }
25274         result = false;
25275         break;
25276       }
25277       if (seen) {
25278         if (!arraySome_default(other, function(othValue2, othIndex) {
25279           if (!cacheHas_default(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
25280             return seen.push(othIndex);
25281           }
25282         })) {
25283           result = false;
25284           break;
25285         }
25286       } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
25287         result = false;
25288         break;
25289       }
25290     }
25291     stack["delete"](array2);
25292     stack["delete"](other);
25293     return result;
25294   }
25295   var equalArrays_default = equalArrays;
25296
25297   // node_modules/lodash-es/_mapToArray.js
25298   function mapToArray(map2) {
25299     var index = -1, result = Array(map2.size);
25300     map2.forEach(function(value, key) {
25301       result[++index] = [key, value];
25302     });
25303     return result;
25304   }
25305   var mapToArray_default = mapToArray;
25306
25307   // node_modules/lodash-es/_setToArray.js
25308   function setToArray(set3) {
25309     var index = -1, result = Array(set3.size);
25310     set3.forEach(function(value) {
25311       result[++index] = value;
25312     });
25313     return result;
25314   }
25315   var setToArray_default = setToArray;
25316
25317   // node_modules/lodash-es/_equalByTag.js
25318   var COMPARE_PARTIAL_FLAG2 = 1;
25319   var COMPARE_UNORDERED_FLAG2 = 2;
25320   var boolTag2 = "[object Boolean]";
25321   var dateTag2 = "[object Date]";
25322   var errorTag2 = "[object Error]";
25323   var mapTag3 = "[object Map]";
25324   var numberTag2 = "[object Number]";
25325   var regexpTag2 = "[object RegExp]";
25326   var setTag3 = "[object Set]";
25327   var stringTag2 = "[object String]";
25328   var symbolTag2 = "[object Symbol]";
25329   var arrayBufferTag2 = "[object ArrayBuffer]";
25330   var dataViewTag3 = "[object DataView]";
25331   var symbolProto2 = Symbol_default ? Symbol_default.prototype : void 0;
25332   var symbolValueOf = symbolProto2 ? symbolProto2.valueOf : void 0;
25333   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
25334     switch (tag) {
25335       case dataViewTag3:
25336         if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
25337           return false;
25338         }
25339         object = object.buffer;
25340         other = other.buffer;
25341       case arrayBufferTag2:
25342         if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array_default(object), new Uint8Array_default(other))) {
25343           return false;
25344         }
25345         return true;
25346       case boolTag2:
25347       case dateTag2:
25348       case numberTag2:
25349         return eq_default(+object, +other);
25350       case errorTag2:
25351         return object.name == other.name && object.message == other.message;
25352       case regexpTag2:
25353       case stringTag2:
25354         return object == other + "";
25355       case mapTag3:
25356         var convert = mapToArray_default;
25357       case setTag3:
25358         var isPartial = bitmask & COMPARE_PARTIAL_FLAG2;
25359         convert || (convert = setToArray_default);
25360         if (object.size != other.size && !isPartial) {
25361           return false;
25362         }
25363         var stacked = stack.get(object);
25364         if (stacked) {
25365           return stacked == other;
25366         }
25367         bitmask |= COMPARE_UNORDERED_FLAG2;
25368         stack.set(object, other);
25369         var result = equalArrays_default(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
25370         stack["delete"](object);
25371         return result;
25372       case symbolTag2:
25373         if (symbolValueOf) {
25374           return symbolValueOf.call(object) == symbolValueOf.call(other);
25375         }
25376     }
25377     return false;
25378   }
25379   var equalByTag_default = equalByTag;
25380
25381   // node_modules/lodash-es/_equalObjects.js
25382   var COMPARE_PARTIAL_FLAG3 = 1;
25383   var objectProto11 = Object.prototype;
25384   var hasOwnProperty8 = objectProto11.hasOwnProperty;
25385   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
25386     var isPartial = bitmask & COMPARE_PARTIAL_FLAG3, objProps = getAllKeys_default(object), objLength = objProps.length, othProps = getAllKeys_default(other), othLength = othProps.length;
25387     if (objLength != othLength && !isPartial) {
25388       return false;
25389     }
25390     var index = objLength;
25391     while (index--) {
25392       var key = objProps[index];
25393       if (!(isPartial ? key in other : hasOwnProperty8.call(other, key))) {
25394         return false;
25395       }
25396     }
25397     var objStacked = stack.get(object);
25398     var othStacked = stack.get(other);
25399     if (objStacked && othStacked) {
25400       return objStacked == other && othStacked == object;
25401     }
25402     var result = true;
25403     stack.set(object, other);
25404     stack.set(other, object);
25405     var skipCtor = isPartial;
25406     while (++index < objLength) {
25407       key = objProps[index];
25408       var objValue = object[key], othValue = other[key];
25409       if (customizer) {
25410         var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
25411       }
25412       if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
25413         result = false;
25414         break;
25415       }
25416       skipCtor || (skipCtor = key == "constructor");
25417     }
25418     if (result && !skipCtor) {
25419       var objCtor = object.constructor, othCtor = other.constructor;
25420       if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
25421         result = false;
25422       }
25423     }
25424     stack["delete"](object);
25425     stack["delete"](other);
25426     return result;
25427   }
25428   var equalObjects_default = equalObjects;
25429
25430   // node_modules/lodash-es/_baseIsEqualDeep.js
25431   var COMPARE_PARTIAL_FLAG4 = 1;
25432   var argsTag3 = "[object Arguments]";
25433   var arrayTag2 = "[object Array]";
25434   var objectTag3 = "[object Object]";
25435   var objectProto12 = Object.prototype;
25436   var hasOwnProperty9 = objectProto12.hasOwnProperty;
25437   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
25438     var objIsArr = isArray_default(object), othIsArr = isArray_default(other), objTag = objIsArr ? arrayTag2 : getTag_default(object), othTag = othIsArr ? arrayTag2 : getTag_default(other);
25439     objTag = objTag == argsTag3 ? objectTag3 : objTag;
25440     othTag = othTag == argsTag3 ? objectTag3 : othTag;
25441     var objIsObj = objTag == objectTag3, othIsObj = othTag == objectTag3, isSameTag = objTag == othTag;
25442     if (isSameTag && isBuffer_default(object)) {
25443       if (!isBuffer_default(other)) {
25444         return false;
25445       }
25446       objIsArr = true;
25447       objIsObj = false;
25448     }
25449     if (isSameTag && !objIsObj) {
25450       stack || (stack = new Stack_default());
25451       return objIsArr || isTypedArray_default(object) ? equalArrays_default(object, other, bitmask, customizer, equalFunc, stack) : equalByTag_default(object, other, objTag, bitmask, customizer, equalFunc, stack);
25452     }
25453     if (!(bitmask & COMPARE_PARTIAL_FLAG4)) {
25454       var objIsWrapped = objIsObj && hasOwnProperty9.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty9.call(other, "__wrapped__");
25455       if (objIsWrapped || othIsWrapped) {
25456         var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
25457         stack || (stack = new Stack_default());
25458         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
25459       }
25460     }
25461     if (!isSameTag) {
25462       return false;
25463     }
25464     stack || (stack = new Stack_default());
25465     return equalObjects_default(object, other, bitmask, customizer, equalFunc, stack);
25466   }
25467   var baseIsEqualDeep_default = baseIsEqualDeep;
25468
25469   // node_modules/lodash-es/_baseIsEqual.js
25470   function baseIsEqual(value, other, bitmask, customizer, stack) {
25471     if (value === other) {
25472       return true;
25473     }
25474     if (value == null || other == null || !isObjectLike_default(value) && !isObjectLike_default(other)) {
25475       return value !== value && other !== other;
25476     }
25477     return baseIsEqualDeep_default(value, other, bitmask, customizer, baseIsEqual, stack);
25478   }
25479   var baseIsEqual_default = baseIsEqual;
25480
25481   // node_modules/lodash-es/now.js
25482   var now2 = function() {
25483     return root_default.Date.now();
25484   };
25485   var now_default = now2;
25486
25487   // node_modules/lodash-es/debounce.js
25488   var FUNC_ERROR_TEXT = "Expected a function";
25489   var nativeMax = Math.max;
25490   var nativeMin = Math.min;
25491   function debounce(func, wait, options2) {
25492     var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
25493     if (typeof func != "function") {
25494       throw new TypeError(FUNC_ERROR_TEXT);
25495     }
25496     wait = toNumber_default(wait) || 0;
25497     if (isObject_default(options2)) {
25498       leading = !!options2.leading;
25499       maxing = "maxWait" in options2;
25500       maxWait = maxing ? nativeMax(toNumber_default(options2.maxWait) || 0, wait) : maxWait;
25501       trailing = "trailing" in options2 ? !!options2.trailing : trailing;
25502     }
25503     function invokeFunc(time) {
25504       var args = lastArgs, thisArg = lastThis;
25505       lastArgs = lastThis = void 0;
25506       lastInvokeTime = time;
25507       result = func.apply(thisArg, args);
25508       return result;
25509     }
25510     function leadingEdge(time) {
25511       lastInvokeTime = time;
25512       timerId = setTimeout(timerExpired, wait);
25513       return leading ? invokeFunc(time) : result;
25514     }
25515     function remainingWait(time) {
25516       var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
25517       return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
25518     }
25519     function shouldInvoke(time) {
25520       var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
25521       return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
25522     }
25523     function timerExpired() {
25524       var time = now_default();
25525       if (shouldInvoke(time)) {
25526         return trailingEdge(time);
25527       }
25528       timerId = setTimeout(timerExpired, remainingWait(time));
25529     }
25530     function trailingEdge(time) {
25531       timerId = void 0;
25532       if (trailing && lastArgs) {
25533         return invokeFunc(time);
25534       }
25535       lastArgs = lastThis = void 0;
25536       return result;
25537     }
25538     function cancel() {
25539       if (timerId !== void 0) {
25540         clearTimeout(timerId);
25541       }
25542       lastInvokeTime = 0;
25543       lastArgs = lastCallTime = lastThis = timerId = void 0;
25544     }
25545     function flush() {
25546       return timerId === void 0 ? result : trailingEdge(now_default());
25547     }
25548     function debounced() {
25549       var time = now_default(), isInvoking = shouldInvoke(time);
25550       lastArgs = arguments;
25551       lastThis = this;
25552       lastCallTime = time;
25553       if (isInvoking) {
25554         if (timerId === void 0) {
25555           return leadingEdge(lastCallTime);
25556         }
25557         if (maxing) {
25558           clearTimeout(timerId);
25559           timerId = setTimeout(timerExpired, wait);
25560           return invokeFunc(lastCallTime);
25561         }
25562       }
25563       if (timerId === void 0) {
25564         timerId = setTimeout(timerExpired, wait);
25565       }
25566       return result;
25567     }
25568     debounced.cancel = cancel;
25569     debounced.flush = flush;
25570     return debounced;
25571   }
25572   var debounce_default = debounce;
25573
25574   // node_modules/lodash-es/_escapeHtmlChar.js
25575   var htmlEscapes = {
25576     "&": "&amp;",
25577     "<": "&lt;",
25578     ">": "&gt;",
25579     '"': "&quot;",
25580     "'": "&#39;"
25581   };
25582   var escapeHtmlChar = basePropertyOf_default(htmlEscapes);
25583   var escapeHtmlChar_default = escapeHtmlChar;
25584
25585   // node_modules/lodash-es/escape.js
25586   var reUnescapedHtml = /[&<>"']/g;
25587   var reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
25588   function escape2(string) {
25589     string = toString_default(string);
25590     return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar_default) : string;
25591   }
25592   var escape_default = escape2;
25593
25594   // node_modules/lodash-es/isEqual.js
25595   function isEqual(value, other) {
25596     return baseIsEqual_default(value, other);
25597   }
25598   var isEqual_default = isEqual;
25599
25600   // node_modules/lodash-es/throttle.js
25601   var FUNC_ERROR_TEXT2 = "Expected a function";
25602   function throttle(func, wait, options2) {
25603     var leading = true, trailing = true;
25604     if (typeof func != "function") {
25605       throw new TypeError(FUNC_ERROR_TEXT2);
25606     }
25607     if (isObject_default(options2)) {
25608       leading = "leading" in options2 ? !!options2.leading : leading;
25609       trailing = "trailing" in options2 ? !!options2.trailing : trailing;
25610     }
25611     return debounce_default(func, wait, {
25612       "leading": leading,
25613       "maxWait": wait,
25614       "trailing": trailing
25615     });
25616   }
25617   var throttle_default = throttle;
25618
25619   // node_modules/lodash-es/_unescapeHtmlChar.js
25620   var htmlUnescapes = {
25621     "&amp;": "&",
25622     "&lt;": "<",
25623     "&gt;": ">",
25624     "&quot;": '"',
25625     "&#39;": "'"
25626   };
25627   var unescapeHtmlChar = basePropertyOf_default(htmlUnescapes);
25628   var unescapeHtmlChar_default = unescapeHtmlChar;
25629
25630   // node_modules/lodash-es/unescape.js
25631   var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;
25632   var reHasEscapedHtml = RegExp(reEscapedHtml.source);
25633   function unescape2(string) {
25634     string = toString_default(string);
25635     return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar_default) : string;
25636   }
25637   var unescape_default = unescape2;
25638
25639   // modules/util/detect.js
25640   var _detected;
25641   function utilDetect(refresh2) {
25642     if (_detected && !refresh2)
25643       return _detected;
25644     _detected = {};
25645     const ua = navigator.userAgent;
25646     let m = null;
25647     m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);
25648     if (m !== null) {
25649       _detected.browser = m[1];
25650       _detected.version = m[2];
25651     }
25652     if (!_detected.browser) {
25653       m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);
25654       if (m !== null) {
25655         _detected.browser = "msie";
25656         _detected.version = m[1];
25657       }
25658     }
25659     if (!_detected.browser) {
25660       m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);
25661       if (m !== null) {
25662         _detected.browser = "Opera";
25663         _detected.version = m[2];
25664       }
25665     }
25666     if (!_detected.browser) {
25667       m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
25668       if (m !== null) {
25669         _detected.browser = m[1];
25670         _detected.version = m[2];
25671         m = ua.match(/version\/([\.\d]+)/i);
25672         if (m !== null)
25673           _detected.version = m[1];
25674       }
25675     }
25676     if (!_detected.browser) {
25677       _detected.browser = navigator.appName;
25678       _detected.version = navigator.appVersion;
25679     }
25680     _detected.version = _detected.version.split(/\W/).slice(0, 2).join(".");
25681     _detected.opera = _detected.browser.toLowerCase() === "opera" && Number(_detected.version) < 15;
25682     if (_detected.browser.toLowerCase() === "msie") {
25683       _detected.ie = true;
25684       _detected.browser = "Internet Explorer";
25685       _detected.support = false;
25686     } else {
25687       _detected.ie = false;
25688       _detected.support = true;
25689     }
25690     _detected.filedrop = window.FileReader && "ondrop" in window;
25691     if (/Win/.test(ua)) {
25692       _detected.os = "win";
25693       _detected.platform = "Windows";
25694     } else if (/Mac/.test(ua)) {
25695       _detected.os = "mac";
25696       _detected.platform = "Macintosh";
25697     } else if (/X11/.test(ua) || /Linux/.test(ua)) {
25698       _detected.os = "linux";
25699       _detected.platform = "Linux";
25700     } else {
25701       _detected.os = "win";
25702       _detected.platform = "Unknown";
25703     }
25704     _detected.isMobileWebKit = (/\b(iPad|iPhone|iPod)\b/.test(ua) || // HACK: iPadOS 13+ requests desktop sites by default by using a Mac user agent,
25705     // so assume any "mac" with multitouch is actually iOS
25706     navigator.platform === "MacIntel" && "maxTouchPoints" in navigator && navigator.maxTouchPoints > 1) && /WebKit/.test(ua) && !/Edge/.test(ua) && !window.MSStream;
25707     _detected.browserLocales = Array.from(new Set(
25708       // remove duplicates
25709       [navigator.language].concat(navigator.languages || []).concat([
25710         // old property for backwards compatibility
25711         navigator.userLanguage
25712       ]).filter(Boolean)
25713     ));
25714     const loc = window.top.location;
25715     let origin = loc.origin;
25716     if (!origin) {
25717       origin = loc.protocol + "//" + loc.hostname + (loc.port ? ":" + loc.port : "");
25718     }
25719     _detected.host = origin + loc.pathname;
25720     return _detected;
25721   }
25722
25723   // modules/util/aes.js
25724   var import_aes_js = __toESM(require_aes_js());
25725   var DEFAULT_128 = [250, 157, 60, 79, 142, 134, 229, 129, 138, 126, 210, 129, 29, 71, 160, 208];
25726   function utilAesEncrypt(text2, key) {
25727     key = key || DEFAULT_128;
25728     const textBytes = import_aes_js.default.utils.utf8.toBytes(text2);
25729     const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key);
25730     const encryptedBytes = aesCtr.encrypt(textBytes);
25731     const encryptedHex = import_aes_js.default.utils.hex.fromBytes(encryptedBytes);
25732     return encryptedHex;
25733   }
25734   function utilAesDecrypt(encryptedHex, key) {
25735     key = key || DEFAULT_128;
25736     const encryptedBytes = import_aes_js.default.utils.hex.toBytes(encryptedHex);
25737     const aesCtr = new import_aes_js.default.ModeOfOperation.ctr(key);
25738     const decryptedBytes = aesCtr.decrypt(encryptedBytes);
25739     const text2 = import_aes_js.default.utils.utf8.fromBytes(decryptedBytes);
25740     return text2;
25741   }
25742
25743   // modules/util/clean_tags.js
25744   function utilCleanTags(tags) {
25745     var out = {};
25746     for (var k in tags) {
25747       if (!k)
25748         continue;
25749       var v = tags[k];
25750       if (v !== void 0) {
25751         out[k] = cleanValue(k, v);
25752       }
25753     }
25754     return out;
25755     function cleanValue(k2, v2) {
25756       function keepSpaces(k3) {
25757         return /_hours|_times|:conditional$/.test(k3);
25758       }
25759       function skip(k3) {
25760         return /^(description|note|fixme)$/.test(k3);
25761       }
25762       if (skip(k2))
25763         return v2;
25764       var cleaned = v2.split(";").map(function(s) {
25765         return s.trim();
25766       }).join(keepSpaces(k2) ? "; " : ";");
25767       if (k2.indexOf("website") !== -1 || k2.indexOf("email") !== -1 || cleaned.indexOf("http") === 0) {
25768         cleaned = cleaned.replace(/[\u200B-\u200F\uFEFF]/g, "");
25769       }
25770       return cleaned;
25771     }
25772   }
25773
25774   // modules/util/get_set_value.js
25775   function utilGetSetValue(selection2, value, shouldUpdate) {
25776     function setValue(value2, shouldUpdate2) {
25777       function valueNull() {
25778         delete this.value;
25779       }
25780       function valueConstant() {
25781         if (shouldUpdate2(this.value, value2)) {
25782           this.value = value2;
25783         }
25784       }
25785       function valueFunction() {
25786         var x = value2.apply(this, arguments);
25787         if (x === null || x === void 0) {
25788           delete this.value;
25789         } else if (shouldUpdate2(this.value, x)) {
25790           this.value = x;
25791         }
25792       }
25793       return value2 === null || value2 === void 0 ? valueNull : typeof value2 === "function" ? valueFunction : valueConstant;
25794     }
25795     function stickyCursor(func) {
25796       return function() {
25797         const cursor = { start: this.selectionStart, end: this.selectionEnd };
25798         func.apply(this, arguments);
25799         this.setSelectionRange(cursor.start, cursor.end);
25800       };
25801     }
25802     if (arguments.length === 1) {
25803       return selection2.property("value");
25804     }
25805     if (shouldUpdate === void 0) {
25806       shouldUpdate = (a, b) => a !== b;
25807     }
25808     return selection2.each(stickyCursor(setValue(value, shouldUpdate)));
25809   }
25810
25811   // modules/util/keybinding.js
25812   function utilKeybinding(namespace) {
25813     var _keybindings = {};
25814     function testBindings(d3_event, isCapturing) {
25815       var didMatch = false;
25816       var bindings = Object.keys(_keybindings).map(function(id2) {
25817         return _keybindings[id2];
25818       });
25819       var i2, binding;
25820       for (i2 = 0; i2 < bindings.length; i2++) {
25821         binding = bindings[i2];
25822         if (!binding.event.modifiers.shiftKey)
25823           continue;
25824         if (!!binding.capture !== isCapturing)
25825           continue;
25826         if (matches(d3_event, binding, true)) {
25827           binding.callback(d3_event);
25828           didMatch = true;
25829           break;
25830         }
25831       }
25832       if (didMatch)
25833         return;
25834       for (i2 = 0; i2 < bindings.length; i2++) {
25835         binding = bindings[i2];
25836         if (binding.event.modifiers.shiftKey)
25837           continue;
25838         if (!!binding.capture !== isCapturing)
25839           continue;
25840         if (matches(d3_event, binding, false)) {
25841           binding.callback(d3_event);
25842           break;
25843         }
25844       }
25845       function matches(d3_event2, binding2, testShift) {
25846         var event = d3_event2;
25847         var isMatch = false;
25848         var tryKeyCode = true;
25849         if (event.key !== void 0) {
25850           tryKeyCode = event.key.charCodeAt(0) > 127;
25851           isMatch = true;
25852           if (binding2.event.key === void 0) {
25853             isMatch = false;
25854           } else if (Array.isArray(binding2.event.key)) {
25855             if (binding2.event.key.map(function(s) {
25856               return s.toLowerCase();
25857             }).indexOf(event.key.toLowerCase()) === -1) {
25858               isMatch = false;
25859             }
25860           } else {
25861             if (event.key.toLowerCase() !== binding2.event.key.toLowerCase()) {
25862               isMatch = false;
25863             }
25864           }
25865         }
25866         if (!isMatch && (tryKeyCode || binding2.event.modifiers.altKey)) {
25867           isMatch = event.keyCode === binding2.event.keyCode;
25868         }
25869         if (!isMatch)
25870           return false;
25871         if (!(event.ctrlKey && event.altKey)) {
25872           if (event.ctrlKey !== binding2.event.modifiers.ctrlKey)
25873             return false;
25874           if (event.altKey !== binding2.event.modifiers.altKey)
25875             return false;
25876         }
25877         if (event.metaKey !== binding2.event.modifiers.metaKey)
25878           return false;
25879         if (testShift && event.shiftKey !== binding2.event.modifiers.shiftKey)
25880           return false;
25881         return true;
25882       }
25883     }
25884     function capture(d3_event) {
25885       testBindings(d3_event, true);
25886     }
25887     function bubble(d3_event) {
25888       var tagName = select_default2(d3_event.target).node().tagName;
25889       if (tagName === "INPUT" || tagName === "SELECT" || tagName === "TEXTAREA") {
25890         return;
25891       }
25892       testBindings(d3_event, false);
25893     }
25894     function keybinding(selection2) {
25895       selection2 = selection2 || select_default2(document);
25896       selection2.on("keydown.capture." + namespace, capture, true);
25897       selection2.on("keydown.bubble." + namespace, bubble, false);
25898       return keybinding;
25899     }
25900     keybinding.unbind = function(selection2) {
25901       _keybindings = [];
25902       selection2 = selection2 || select_default2(document);
25903       selection2.on("keydown.capture." + namespace, null);
25904       selection2.on("keydown.bubble." + namespace, null);
25905       return keybinding;
25906     };
25907     keybinding.clear = function() {
25908       _keybindings = {};
25909       return keybinding;
25910     };
25911     keybinding.off = function(codes, capture2) {
25912       var arr = utilArrayUniq([].concat(codes));
25913       for (var i2 = 0; i2 < arr.length; i2++) {
25914         var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble");
25915         delete _keybindings[id2];
25916       }
25917       return keybinding;
25918     };
25919     keybinding.on = function(codes, callback, capture2) {
25920       if (typeof callback !== "function") {
25921         return keybinding.off(codes, capture2);
25922       }
25923       var arr = utilArrayUniq([].concat(codes));
25924       for (var i2 = 0; i2 < arr.length; i2++) {
25925         var id2 = arr[i2] + (capture2 ? "-capture" : "-bubble");
25926         var binding = {
25927           id: id2,
25928           capture: capture2,
25929           callback,
25930           event: {
25931             key: void 0,
25932             // preferred
25933             keyCode: 0,
25934             // fallback
25935             modifiers: {
25936               shiftKey: false,
25937               ctrlKey: false,
25938               altKey: false,
25939               metaKey: false
25940             }
25941           }
25942         };
25943         if (_keybindings[id2]) {
25944           console.warn('warning: duplicate keybinding for "' + id2 + '"');
25945         }
25946         _keybindings[id2] = binding;
25947         var matches = arr[i2].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
25948         for (var j2 = 0; j2 < matches.length; j2++) {
25949           if (matches[j2] === "++")
25950             matches[j2] = "+";
25951           if (matches[j2] in utilKeybinding.modifierCodes) {
25952             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j2]]];
25953             binding.event.modifiers[prop] = true;
25954           } else {
25955             binding.event.key = utilKeybinding.keys[matches[j2]] || matches[j2];
25956             if (matches[j2] in utilKeybinding.keyCodes) {
25957               binding.event.keyCode = utilKeybinding.keyCodes[matches[j2]];
25958             }
25959           }
25960         }
25961       }
25962       return keybinding;
25963     };
25964     return keybinding;
25965   }
25966   utilKeybinding.modifierCodes = {
25967     // Shift key, ⇧
25968     "\u21E7": 16,
25969     shift: 16,
25970     // CTRL key, on Mac: ⌃
25971     "\u2303": 17,
25972     ctrl: 17,
25973     // ALT key, on Mac: ⌥ (Alt)
25974     "\u2325": 18,
25975     alt: 18,
25976     option: 18,
25977     // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
25978     "\u2318": 91,
25979     meta: 91,
25980     cmd: 91,
25981     "super": 91,
25982     win: 91
25983   };
25984   utilKeybinding.modifierProperties = {
25985     16: "shiftKey",
25986     17: "ctrlKey",
25987     18: "altKey",
25988     91: "metaKey"
25989   };
25990   utilKeybinding.plusKeys = ["plus", "ffplus", "=", "ffequals", "\u2260", "\xB1"];
25991   utilKeybinding.minusKeys = ["_", "-", "ffminus", "dash", "\u2013", "\u2014"];
25992   utilKeybinding.keys = {
25993     // Backspace key, on Mac: ⌫ (Backspace)
25994     "\u232B": "Backspace",
25995     backspace: "Backspace",
25996     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
25997     "\u21E5": "Tab",
25998     "\u21C6": "Tab",
25999     tab: "Tab",
26000     // Return key, ↩
26001     "\u21A9": "Enter",
26002     "\u21B5": "Enter",
26003     "\u23CE": "Enter",
26004     "return": "Enter",
26005     enter: "Enter",
26006     "\u2305": "Enter",
26007     // Pause/Break key
26008     "pause": "Pause",
26009     "pause-break": "Pause",
26010     // Caps Lock key, ⇪
26011     "\u21EA": "CapsLock",
26012     caps: "CapsLock",
26013     "caps-lock": "CapsLock",
26014     // Escape key, on Mac: ⎋, on Windows: Esc
26015     "\u238B": ["Escape", "Esc"],
26016     escape: ["Escape", "Esc"],
26017     esc: ["Escape", "Esc"],
26018     // Space key
26019     space: [" ", "Spacebar"],
26020     // Page-Up key, or pgup, on Mac: ↖
26021     "\u2196": "PageUp",
26022     pgup: "PageUp",
26023     "page-up": "PageUp",
26024     // Page-Down key, or pgdown, on Mac: ↘
26025     "\u2198": "PageDown",
26026     pgdown: "PageDown",
26027     "page-down": "PageDown",
26028     // END key, on Mac: ⇟
26029     "\u21DF": "End",
26030     end: "End",
26031     // HOME key, on Mac: ⇞
26032     "\u21DE": "Home",
26033     home: "Home",
26034     // Insert key, or ins
26035     ins: "Insert",
26036     insert: "Insert",
26037     // Delete key, on Mac: ⌦ (Delete)
26038     "\u2326": ["Delete", "Del"],
26039     del: ["Delete", "Del"],
26040     "delete": ["Delete", "Del"],
26041     // Left Arrow Key, or ←
26042     "\u2190": ["ArrowLeft", "Left"],
26043     left: ["ArrowLeft", "Left"],
26044     "arrow-left": ["ArrowLeft", "Left"],
26045     // Up Arrow Key, or ↑
26046     "\u2191": ["ArrowUp", "Up"],
26047     up: ["ArrowUp", "Up"],
26048     "arrow-up": ["ArrowUp", "Up"],
26049     // Right Arrow Key, or →
26050     "\u2192": ["ArrowRight", "Right"],
26051     right: ["ArrowRight", "Right"],
26052     "arrow-right": ["ArrowRight", "Right"],
26053     // Up Arrow Key, or ↓
26054     "\u2193": ["ArrowDown", "Down"],
26055     down: ["ArrowDown", "Down"],
26056     "arrow-down": ["ArrowDown", "Down"],
26057     // odities, stuff for backward compatibility (browsers and code):
26058     // Num-Multiply, or *
26059     "*": ["*", "Multiply"],
26060     star: ["*", "Multiply"],
26061     asterisk: ["*", "Multiply"],
26062     multiply: ["*", "Multiply"],
26063     // Num-Plus or +
26064     "+": ["+", "Add"],
26065     "plus": ["+", "Add"],
26066     // Num-Subtract, or -
26067     "-": ["-", "Subtract"],
26068     subtract: ["-", "Subtract"],
26069     "dash": ["-", "Subtract"],
26070     // Semicolon
26071     semicolon: ";",
26072     // = or equals
26073     equals: "=",
26074     // Comma, or ,
26075     comma: ",",
26076     // Period, or ., or full-stop
26077     period: ".",
26078     "full-stop": ".",
26079     // Slash, or /, or forward-slash
26080     slash: "/",
26081     "forward-slash": "/",
26082     // Tick, or `, or back-quote
26083     tick: "`",
26084     "back-quote": "`",
26085     // Open bracket, or [
26086     "open-bracket": "[",
26087     // Back slash, or \
26088     "back-slash": "\\",
26089     // Close backet, or ]
26090     "close-bracket": "]",
26091     // Apostrophe, or Quote, or '
26092     quote: "'",
26093     apostrophe: "'",
26094     // NUMPAD 0-9
26095     "num-0": "0",
26096     "num-1": "1",
26097     "num-2": "2",
26098     "num-3": "3",
26099     "num-4": "4",
26100     "num-5": "5",
26101     "num-6": "6",
26102     "num-7": "7",
26103     "num-8": "8",
26104     "num-9": "9",
26105     // F1-F25
26106     f1: "F1",
26107     f2: "F2",
26108     f3: "F3",
26109     f4: "F4",
26110     f5: "F5",
26111     f6: "F6",
26112     f7: "F7",
26113     f8: "F8",
26114     f9: "F9",
26115     f10: "F10",
26116     f11: "F11",
26117     f12: "F12",
26118     f13: "F13",
26119     f14: "F14",
26120     f15: "F15",
26121     f16: "F16",
26122     f17: "F17",
26123     f18: "F18",
26124     f19: "F19",
26125     f20: "F20",
26126     f21: "F21",
26127     f22: "F22",
26128     f23: "F23",
26129     f24: "F24",
26130     f25: "F25"
26131   };
26132   utilKeybinding.keyCodes = {
26133     // Backspace key, on Mac: ⌫ (Backspace)
26134     "\u232B": 8,
26135     backspace: 8,
26136     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
26137     "\u21E5": 9,
26138     "\u21C6": 9,
26139     tab: 9,
26140     // Return key, ↩
26141     "\u21A9": 13,
26142     "\u21B5": 13,
26143     "\u23CE": 13,
26144     "return": 13,
26145     enter: 13,
26146     "\u2305": 13,
26147     // Pause/Break key
26148     "pause": 19,
26149     "pause-break": 19,
26150     // Caps Lock key, ⇪
26151     "\u21EA": 20,
26152     caps: 20,
26153     "caps-lock": 20,
26154     // Escape key, on Mac: ⎋, on Windows: Esc
26155     "\u238B": 27,
26156     escape: 27,
26157     esc: 27,
26158     // Space key
26159     space: 32,
26160     // Page-Up key, or pgup, on Mac: ↖
26161     "\u2196": 33,
26162     pgup: 33,
26163     "page-up": 33,
26164     // Page-Down key, or pgdown, on Mac: ↘
26165     "\u2198": 34,
26166     pgdown: 34,
26167     "page-down": 34,
26168     // END key, on Mac: ⇟
26169     "\u21DF": 35,
26170     end: 35,
26171     // HOME key, on Mac: ⇞
26172     "\u21DE": 36,
26173     home: 36,
26174     // Insert key, or ins
26175     ins: 45,
26176     insert: 45,
26177     // Delete key, on Mac: ⌦ (Delete)
26178     "\u2326": 46,
26179     del: 46,
26180     "delete": 46,
26181     // Left Arrow Key, or ←
26182     "\u2190": 37,
26183     left: 37,
26184     "arrow-left": 37,
26185     // Up Arrow Key, or ↑
26186     "\u2191": 38,
26187     up: 38,
26188     "arrow-up": 38,
26189     // Right Arrow Key, or →
26190     "\u2192": 39,
26191     right: 39,
26192     "arrow-right": 39,
26193     // Up Arrow Key, or ↓
26194     "\u2193": 40,
26195     down: 40,
26196     "arrow-down": 40,
26197     // odities, printing characters that come out wrong:
26198     // Firefox Equals
26199     "ffequals": 61,
26200     // Num-Multiply, or *
26201     "*": 106,
26202     star: 106,
26203     asterisk: 106,
26204     multiply: 106,
26205     // Num-Plus or +
26206     "+": 107,
26207     "plus": 107,
26208     // Num-Subtract, or -
26209     "-": 109,
26210     subtract: 109,
26211     // Vertical Bar / Pipe
26212     "|": 124,
26213     // Firefox Plus
26214     "ffplus": 171,
26215     // Firefox Minus
26216     "ffminus": 173,
26217     // Semicolon
26218     ";": 186,
26219     semicolon: 186,
26220     // = or equals
26221     "=": 187,
26222     "equals": 187,
26223     // Comma, or ,
26224     ",": 188,
26225     comma: 188,
26226     // Dash / Underscore key
26227     "dash": 189,
26228     // Period, or ., or full-stop
26229     ".": 190,
26230     period: 190,
26231     "full-stop": 190,
26232     // Slash, or /, or forward-slash
26233     "/": 191,
26234     slash: 191,
26235     "forward-slash": 191,
26236     // Tick, or `, or back-quote
26237     "`": 192,
26238     tick: 192,
26239     "back-quote": 192,
26240     // Open bracket, or [
26241     "[": 219,
26242     "open-bracket": 219,
26243     // Back slash, or \
26244     "\\": 220,
26245     "back-slash": 220,
26246     // Close backet, or ]
26247     "]": 221,
26248     "close-bracket": 221,
26249     // Apostrophe, or Quote, or '
26250     "'": 222,
26251     quote: 222,
26252     apostrophe: 222
26253   };
26254   var i = 95;
26255   var n = 0;
26256   while (++i < 106) {
26257     utilKeybinding.keyCodes["num-" + n] = i;
26258     ++n;
26259   }
26260   i = 47;
26261   n = 0;
26262   while (++i < 58) {
26263     utilKeybinding.keyCodes[n] = i;
26264     ++n;
26265   }
26266   i = 111;
26267   n = 1;
26268   while (++i < 136) {
26269     utilKeybinding.keyCodes["f" + n] = i;
26270     ++n;
26271   }
26272   i = 64;
26273   while (++i < 91) {
26274     utilKeybinding.keyCodes[String.fromCharCode(i).toLowerCase()] = i;
26275   }
26276
26277   // modules/util/object.js
26278   function utilObjectOmit(obj, omitKeys) {
26279     return Object.keys(obj).reduce(function(result, key) {
26280       if (omitKeys.indexOf(key) === -1) {
26281         result[key] = obj[key];
26282       }
26283       return result;
26284     }, {});
26285   }
26286
26287   // modules/util/rebind.js
26288   function utilRebind(target, source) {
26289     var i2 = 1, n2 = arguments.length, method;
26290     while (++i2 < n2) {
26291       target[method = arguments[i2]] = d3_rebind(target, source, source[method]);
26292     }
26293     return target;
26294   }
26295   function d3_rebind(target, source, method) {
26296     return function() {
26297       var value = method.apply(source, arguments);
26298       return value === source ? target : value;
26299     };
26300   }
26301
26302   // modules/util/session_mutex.js
26303   function utilSessionMutex(name) {
26304     var mutex = {};
26305     var intervalID;
26306     function renew() {
26307       var expires = /* @__PURE__ */ new Date();
26308       expires.setSeconds(expires.getSeconds() + 5);
26309       document.cookie = name + "=1; expires=" + expires.toUTCString() + "; sameSite=strict";
26310     }
26311     mutex.lock = function() {
26312       if (intervalID)
26313         return true;
26314       var cookie = document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + name + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1");
26315       if (cookie)
26316         return false;
26317       renew();
26318       intervalID = window.setInterval(renew, 4e3);
26319       return true;
26320     };
26321     mutex.unlock = function() {
26322       if (!intervalID)
26323         return;
26324       document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; sameSite=strict";
26325       clearInterval(intervalID);
26326       intervalID = null;
26327     };
26328     mutex.locked = function() {
26329       return !!intervalID;
26330     };
26331     return mutex;
26332   }
26333
26334   // modules/util/tiler.js
26335   function utilTiler() {
26336     var _size = [256, 256];
26337     var _scale = 256;
26338     var _tileSize = 256;
26339     var _zoomExtent = [0, 20];
26340     var _translate = [_size[0] / 2, _size[1] / 2];
26341     var _margin = 0;
26342     var _skipNullIsland = false;
26343     function clamp3(num, min3, max3) {
26344       return Math.max(min3, Math.min(num, max3));
26345     }
26346     function nearNullIsland(tile) {
26347       var x = tile[0];
26348       var y = tile[1];
26349       var z = tile[2];
26350       if (z >= 7) {
26351         var center = Math.pow(2, z - 1);
26352         var width = Math.pow(2, z - 6);
26353         var min3 = center - width / 2;
26354         var max3 = center + width / 2 - 1;
26355         return x >= min3 && x <= max3 && y >= min3 && y <= max3;
26356       }
26357       return false;
26358     }
26359     function tiler8() {
26360       var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
26361       var z0 = clamp3(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
26362       var tileMin = 0;
26363       var tileMax = Math.pow(2, z0) - 1;
26364       var log2ts = Math.log(_tileSize) * Math.LOG2E;
26365       var k = Math.pow(2, z - z0 + log2ts);
26366       var origin = [
26367         (_translate[0] - _scale / 2) / k,
26368         (_translate[1] - _scale / 2) / k
26369       ];
26370       var cols = range(
26371         clamp3(Math.floor(-origin[0]) - _margin, tileMin, tileMax + 1),
26372         clamp3(Math.ceil(_size[0] / k - origin[0]) + _margin, tileMin, tileMax + 1)
26373       );
26374       var rows = range(
26375         clamp3(Math.floor(-origin[1]) - _margin, tileMin, tileMax + 1),
26376         clamp3(Math.ceil(_size[1] / k - origin[1]) + _margin, tileMin, tileMax + 1)
26377       );
26378       var tiles = [];
26379       for (var i2 = 0; i2 < rows.length; i2++) {
26380         var y = rows[i2];
26381         for (var j2 = 0; j2 < cols.length; j2++) {
26382           var x = cols[j2];
26383           if (i2 >= _margin && i2 <= rows.length - _margin && j2 >= _margin && j2 <= cols.length - _margin) {
26384             tiles.unshift([x, y, z0]);
26385           } else {
26386             tiles.push([x, y, z0]);
26387           }
26388         }
26389       }
26390       tiles.translate = origin;
26391       tiles.scale = k;
26392       return tiles;
26393     }
26394     tiler8.getTiles = function(projection2) {
26395       var origin = [
26396         projection2.scale() * Math.PI - projection2.translate()[0],
26397         projection2.scale() * Math.PI - projection2.translate()[1]
26398       ];
26399       this.size(projection2.clipExtent()[1]).scale(projection2.scale() * 2 * Math.PI).translate(projection2.translate());
26400       var tiles = tiler8();
26401       var ts = tiles.scale;
26402       return tiles.map(function(tile) {
26403         if (_skipNullIsland && nearNullIsland(tile)) {
26404           return false;
26405         }
26406         var x = tile[0] * ts - origin[0];
26407         var y = tile[1] * ts - origin[1];
26408         return {
26409           id: tile.toString(),
26410           xyz: tile,
26411           extent: geoExtent(
26412             projection2.invert([x, y + ts]),
26413             projection2.invert([x + ts, y])
26414           )
26415         };
26416       }).filter(Boolean);
26417     };
26418     tiler8.getGeoJSON = function(projection2) {
26419       var features = tiler8.getTiles(projection2).map(function(tile) {
26420         return {
26421           type: "Feature",
26422           properties: {
26423             id: tile.id,
26424             name: tile.id
26425           },
26426           geometry: {
26427             type: "Polygon",
26428             coordinates: [tile.extent.polygon()]
26429           }
26430         };
26431       });
26432       return {
26433         type: "FeatureCollection",
26434         features
26435       };
26436     };
26437     tiler8.tileSize = function(val) {
26438       if (!arguments.length)
26439         return _tileSize;
26440       _tileSize = val;
26441       return tiler8;
26442     };
26443     tiler8.zoomExtent = function(val) {
26444       if (!arguments.length)
26445         return _zoomExtent;
26446       _zoomExtent = val;
26447       return tiler8;
26448     };
26449     tiler8.size = function(val) {
26450       if (!arguments.length)
26451         return _size;
26452       _size = val;
26453       return tiler8;
26454     };
26455     tiler8.scale = function(val) {
26456       if (!arguments.length)
26457         return _scale;
26458       _scale = val;
26459       return tiler8;
26460     };
26461     tiler8.translate = function(val) {
26462       if (!arguments.length)
26463         return _translate;
26464       _translate = val;
26465       return tiler8;
26466     };
26467     tiler8.margin = function(val) {
26468       if (!arguments.length)
26469         return _margin;
26470       _margin = +val;
26471       return tiler8;
26472     };
26473     tiler8.skipNullIsland = function(val) {
26474       if (!arguments.length)
26475         return _skipNullIsland;
26476       _skipNullIsland = val;
26477       return tiler8;
26478     };
26479     return tiler8;
26480   }
26481
26482   // modules/util/trigger_event.js
26483   function utilTriggerEvent(target, type2) {
26484     target.each(function() {
26485       var evt = document.createEvent("HTMLEvents");
26486       evt.initEvent(type2, true, true);
26487       this.dispatchEvent(evt);
26488     });
26489   }
26490
26491   // modules/core/localizer.js
26492   var _mainLocalizer = coreLocalizer();
26493   var _t = _mainLocalizer.t;
26494   function coreLocalizer() {
26495     let localizer = {};
26496     let _dataLanguages = {};
26497     let _dataLocales = {};
26498     let _localeStrings = {};
26499     let _localeCode = "en-US";
26500     let _localeCodes = ["en-US", "en"];
26501     let _languageCode = "en";
26502     let _textDirection = "ltr";
26503     let _usesMetric = false;
26504     let _languageNames = {};
26505     let _scriptNames = {};
26506     localizer.localeCode = () => _localeCode;
26507     localizer.localeCodes = () => _localeCodes;
26508     localizer.languageCode = () => _languageCode;
26509     localizer.textDirection = () => _textDirection;
26510     localizer.usesMetric = () => _usesMetric;
26511     localizer.languageNames = () => _languageNames;
26512     localizer.scriptNames = () => _scriptNames;
26513     let _preferredLocaleCodes = [];
26514     localizer.preferredLocaleCodes = function(codes) {
26515       if (!arguments.length)
26516         return _preferredLocaleCodes;
26517       if (typeof codes === "string") {
26518         _preferredLocaleCodes = codes.split(/,|;| /gi).filter(Boolean);
26519       } else {
26520         _preferredLocaleCodes = codes;
26521       }
26522       return localizer;
26523     };
26524     var _loadPromise;
26525     localizer.ensureLoaded = () => {
26526       if (_loadPromise)
26527         return _loadPromise;
26528       let filesToFetch = [
26529         "languages",
26530         // load the list of languages
26531         "locales"
26532         // load the list of supported locales
26533       ];
26534       const localeDirs = {
26535         general: "locales",
26536         tagging: presetsCdnUrl + "dist/translations"
26537       };
26538       let fileMap = _mainFileFetcher.fileMap();
26539       for (let scopeId in localeDirs) {
26540         const key = `locales_index_${scopeId}`;
26541         if (!fileMap[key]) {
26542           fileMap[key] = localeDirs[scopeId] + "/index.min.json";
26543         }
26544         filesToFetch.push(key);
26545       }
26546       return _loadPromise = Promise.all(filesToFetch.map((key) => _mainFileFetcher.get(key))).then((results) => {
26547         _dataLanguages = results[0];
26548         _dataLocales = results[1];
26549         let indexes = results.slice(2);
26550         let requestedLocales = (_preferredLocaleCodes || []).concat(utilDetect().browserLocales).concat(["en"]);
26551         _localeCodes = localesToUseFrom(requestedLocales);
26552         _localeCode = _localeCodes[0];
26553         let loadStringsPromises = [];
26554         indexes.forEach((index, i2) => {
26555           const fullCoverageIndex = _localeCodes.findIndex(function(locale2) {
26556             return index[locale2] && index[locale2].pct === 1;
26557           });
26558           _localeCodes.slice(0, fullCoverageIndex + 1).forEach(function(code) {
26559             let scopeId = Object.keys(localeDirs)[i2];
26560             let directory = Object.values(localeDirs)[i2];
26561             if (index[code])
26562               loadStringsPromises.push(localizer.loadLocale(code, scopeId, directory));
26563           });
26564         });
26565         return Promise.all(loadStringsPromises);
26566       }).then(() => {
26567         updateForCurrentLocale();
26568       }).catch((err) => console.error(err));
26569     };
26570     function localesToUseFrom(requestedLocales) {
26571       let supportedLocales = _dataLocales;
26572       let toUse = [];
26573       for (let i2 in requestedLocales) {
26574         let locale2 = requestedLocales[i2];
26575         if (supportedLocales[locale2])
26576           toUse.push(locale2);
26577         if (locale2.includes("-")) {
26578           let langPart = locale2.split("-")[0];
26579           if (supportedLocales[langPart])
26580             toUse.push(langPart);
26581         }
26582       }
26583       return utilArrayUniq(toUse);
26584     }
26585     function updateForCurrentLocale() {
26586       if (!_localeCode)
26587         return;
26588       _languageCode = _localeCode.split("-")[0];
26589       const currentData = _dataLocales[_localeCode] || _dataLocales[_languageCode];
26590       const hash = utilStringQs(window.location.hash);
26591       if (hash.rtl === "true") {
26592         _textDirection = "rtl";
26593       } else if (hash.rtl === "false") {
26594         _textDirection = "ltr";
26595       } else {
26596         _textDirection = currentData && currentData.rtl ? "rtl" : "ltr";
26597       }
26598       let locale2 = _localeCode;
26599       if (locale2.toLowerCase() === "en-us")
26600         locale2 = "en";
26601       _languageNames = _localeStrings.general[locale2].languageNames || _localeStrings.general[_languageCode].languageNames;
26602       _scriptNames = _localeStrings.general[locale2].scriptNames || _localeStrings.general[_languageCode].scriptNames;
26603       _usesMetric = _localeCode.slice(-3).toLowerCase() !== "-us";
26604     }
26605     localizer.loadLocale = (locale2, scopeId, directory) => {
26606       if (locale2.toLowerCase() === "en-us")
26607         locale2 = "en";
26608       if (_localeStrings[scopeId] && _localeStrings[scopeId][locale2]) {
26609         return Promise.resolve(locale2);
26610       }
26611       let fileMap = _mainFileFetcher.fileMap();
26612       const key = `locale_${scopeId}_${locale2}`;
26613       if (!fileMap[key]) {
26614         fileMap[key] = `${directory}/${locale2}.min.json`;
26615       }
26616       return _mainFileFetcher.get(key).then((d) => {
26617         if (!_localeStrings[scopeId])
26618           _localeStrings[scopeId] = {};
26619         _localeStrings[scopeId][locale2] = d[locale2];
26620         return locale2;
26621       });
26622     };
26623     localizer.pluralRule = function(number3) {
26624       return pluralRule(number3, _localeCode);
26625     };
26626     function pluralRule(number3, localeCode) {
26627       const rules = "Intl" in window && Intl.PluralRules && new Intl.PluralRules(localeCode);
26628       if (rules) {
26629         return rules.select(number3);
26630       }
26631       if (number3 === 1)
26632         return "one";
26633       return "other";
26634     }
26635     localizer.tInfo = function(origStringId, replacements, locale2) {
26636       let stringId = origStringId.trim();
26637       let scopeId = "general";
26638       if (stringId[0] === "_") {
26639         let split = stringId.split(".");
26640         scopeId = split[0].slice(1);
26641         stringId = split.slice(1).join(".");
26642       }
26643       locale2 = locale2 || _localeCode;
26644       let path = stringId.split(".").map((s) => s.replace(/<TX_DOT>/g, ".")).reverse();
26645       let stringsKey = locale2;
26646       if (stringsKey.toLowerCase() === "en-us")
26647         stringsKey = "en";
26648       let result = _localeStrings && _localeStrings[scopeId] && _localeStrings[scopeId][stringsKey];
26649       while (result !== void 0 && path.length) {
26650         result = result[path.pop()];
26651       }
26652       if (result !== void 0) {
26653         if (replacements) {
26654           if (typeof result === "object" && Object.keys(result).length) {
26655             const number3 = Object.values(replacements).find(function(value) {
26656               return typeof value === "number";
26657             });
26658             if (number3 !== void 0) {
26659               const rule = pluralRule(number3, locale2);
26660               if (result[rule]) {
26661                 result = result[rule];
26662               } else {
26663                 result = Object.values(result)[0];
26664               }
26665             }
26666           }
26667           if (typeof result === "string") {
26668             for (let key in replacements) {
26669               let value = replacements[key];
26670               if (typeof value === "number") {
26671                 if (value.toLocaleString) {
26672                   value = value.toLocaleString(locale2, {
26673                     style: "decimal",
26674                     useGrouping: true,
26675                     minimumFractionDigits: 0
26676                   });
26677                 } else {
26678                   value = value.toString();
26679                 }
26680               }
26681               const token = `{${key}}`;
26682               const regex = new RegExp(token, "g");
26683               result = result.replace(regex, value);
26684             }
26685           }
26686         }
26687         if (typeof result === "string") {
26688           return {
26689             text: result,
26690             locale: locale2
26691           };
26692         }
26693       }
26694       let index = _localeCodes.indexOf(locale2);
26695       if (index >= 0 && index < _localeCodes.length - 1) {
26696         let fallback = _localeCodes[index + 1];
26697         return localizer.tInfo(origStringId, replacements, fallback);
26698       }
26699       if (replacements && "default" in replacements) {
26700         return {
26701           text: replacements.default,
26702           locale: null
26703         };
26704       }
26705       const missing = `Missing ${locale2} translation: ${origStringId}`;
26706       if (typeof console !== "undefined")
26707         console.error(missing);
26708       return {
26709         text: missing,
26710         locale: "en"
26711       };
26712     };
26713     localizer.hasTextForStringId = function(stringId) {
26714       return !!localizer.tInfo(stringId, { default: "nothing found" }).locale;
26715     };
26716     localizer.t = function(stringId, replacements, locale2) {
26717       return localizer.tInfo(stringId, replacements, locale2).text;
26718     };
26719     localizer.t.html = function(stringId, replacements, locale2) {
26720       replacements = Object.assign({}, replacements);
26721       for (var k in replacements) {
26722         if (typeof replacements[k] === "string") {
26723           replacements[k] = escape_default(replacements[k]);
26724         }
26725         if (typeof replacements[k] === "object" && typeof replacements[k].html === "string") {
26726           replacements[k] = replacements[k].html;
26727         }
26728       }
26729       const info = localizer.tInfo(stringId, replacements, locale2);
26730       if (info.text) {
26731         return `<span class="localized-text" lang="${info.locale || "und"}">${info.text}</span>`;
26732       } else {
26733         return "";
26734       }
26735     };
26736     localizer.t.append = function(stringId, replacements, locale2) {
26737       const ret = function(selection2) {
26738         const info = localizer.tInfo(stringId, replacements, locale2);
26739         return selection2.append("span").attr("class", "localized-text").attr("lang", info.locale || "und").text((replacements && replacements.prefix || "") + info.text + (replacements && replacements.suffix || ""));
26740       };
26741       ret.stringId = stringId;
26742       return ret;
26743     };
26744     localizer.languageName = (code, options2) => {
26745       if (_languageNames && _languageNames[code]) {
26746         return _languageNames[code];
26747       }
26748       if (options2 && options2.localOnly)
26749         return null;
26750       const langInfo = _dataLanguages[code];
26751       if (langInfo) {
26752         if (langInfo.nativeName) {
26753           return localizer.t("translate.language_and_code", { language: langInfo.nativeName, code });
26754         } else if (langInfo.base && langInfo.script) {
26755           const base = langInfo.base;
26756           if (_languageNames && _languageNames[base]) {
26757             const scriptCode = langInfo.script;
26758             const script = _scriptNames && _scriptNames[scriptCode] || scriptCode;
26759             return localizer.t("translate.language_and_code", { language: _languageNames[base], code: script });
26760           } else if (_dataLanguages[base] && _dataLanguages[base].nativeName) {
26761             return localizer.t("translate.language_and_code", { language: _dataLanguages[base].nativeName, code });
26762           }
26763         }
26764       }
26765       return code;
26766     };
26767     localizer.floatFormatter = (locale2) => {
26768       if (!("Intl" in window && "NumberFormat" in Intl && "formatToParts" in Intl.NumberFormat.prototype)) {
26769         return (number3, fractionDigits) => {
26770           return fractionDigits === void 0 ? number3.toString() : number3.toFixed(fractionDigits);
26771         };
26772       } else {
26773         return (number3, fractionDigits) => number3.toLocaleString(locale2, {
26774           minimumFractionDigits: fractionDigits,
26775           maximumFractionDigits: fractionDigits === void 0 ? 20 : fractionDigits
26776         });
26777       }
26778     };
26779     localizer.floatParser = (locale2) => {
26780       const polyfill = (string) => +string.trim();
26781       if (!("Intl" in window && "NumberFormat" in Intl))
26782         return polyfill;
26783       const format2 = new Intl.NumberFormat(locale2, { maximumFractionDigits: 20 });
26784       if (!("formatToParts" in format2))
26785         return polyfill;
26786       const parts = format2.formatToParts(-12345.6);
26787       const numerals = Array.from({ length: 10 }).map((_, i2) => format2.format(i2));
26788       const index = new Map(numerals.map((d, i2) => [d, i2]));
26789       const literalPart = parts.find((d) => d.type === "literal");
26790       const literal = literalPart && new RegExp(`[${literalPart.value}]`, "g");
26791       const groupPart = parts.find((d) => d.type === "group");
26792       const group = groupPart && new RegExp(`[${groupPart.value}]`, "g");
26793       const decimalPart = parts.find((d) => d.type === "decimal");
26794       const decimal = decimalPart && new RegExp(`[${decimalPart.value}]`);
26795       const numeral = new RegExp(`[${numerals.join("")}]`, "g");
26796       const getIndex = (d) => index.get(d);
26797       return (string) => {
26798         string = string.trim();
26799         if (literal)
26800           string = string.replace(literal, "");
26801         if (group)
26802           string = string.replace(group, "");
26803         if (decimal)
26804           string = string.replace(decimal, ".");
26805         string = string.replace(numeral, getIndex);
26806         return string ? +string : NaN;
26807       };
26808     };
26809     localizer.decimalPlaceCounter = (locale2) => {
26810       var literal, group, decimal;
26811       if ("Intl" in window && "NumberFormat" in Intl) {
26812         const format2 = new Intl.NumberFormat(locale2, { maximumFractionDigits: 20 });
26813         if ("formatToParts" in format2) {
26814           const parts = format2.formatToParts(-12345.6);
26815           const literalPart = parts.find((d) => d.type === "literal");
26816           literal = literalPart && new RegExp(`[${literalPart.value}]`, "g");
26817           const groupPart = parts.find((d) => d.type === "group");
26818           group = groupPart && new RegExp(`[${groupPart.value}]`, "g");
26819           const decimalPart = parts.find((d) => d.type === "decimal");
26820           decimal = decimalPart && new RegExp(`[${decimalPart.value}]`);
26821         }
26822       }
26823       return (string) => {
26824         string = string.trim();
26825         if (literal)
26826           string = string.replace(literal, "");
26827         if (group)
26828           string = string.replace(group, "");
26829         const parts = string.split(decimal || ".");
26830         return parts && parts[1] && parts[1].length || 0;
26831       };
26832     };
26833     return localizer;
26834   }
26835
26836   // modules/presets/collection.js
26837   function presetCollection(collection) {
26838     const MAXRESULTS = 50;
26839     let _this = {};
26840     let _memo = {};
26841     _this.collection = collection;
26842     _this.item = (id2) => {
26843       if (_memo[id2])
26844         return _memo[id2];
26845       const found = _this.collection.find((d) => d.id === id2);
26846       if (found)
26847         _memo[id2] = found;
26848       return found;
26849     };
26850     _this.index = (id2) => _this.collection.findIndex((d) => d.id === id2);
26851     _this.matchGeometry = (geometry) => {
26852       return presetCollection(
26853         _this.collection.filter((d) => d.matchGeometry(geometry))
26854       );
26855     };
26856     _this.matchAllGeometry = (geometries) => {
26857       return presetCollection(
26858         _this.collection.filter((d) => d && d.matchAllGeometry(geometries))
26859       );
26860     };
26861     _this.matchAnyGeometry = (geometries) => {
26862       return presetCollection(
26863         _this.collection.filter((d) => geometries.some((geom) => d.matchGeometry(geom)))
26864       );
26865     };
26866     _this.fallback = (geometry) => {
26867       let id2 = geometry;
26868       if (id2 === "vertex")
26869         id2 = "point";
26870       return _this.item(id2);
26871     };
26872     _this.search = (value, geometry, loc) => {
26873       if (!value)
26874         return _this;
26875       value = value.toLowerCase().trim();
26876       function leading(a) {
26877         const index = a.indexOf(value);
26878         return index === 0 || a[index - 1] === " ";
26879       }
26880       function leadingStrict(a) {
26881         const index = a.indexOf(value);
26882         return index === 0;
26883       }
26884       function sortPresets(nameProp, aliasesProp) {
26885         return function sortNames(a, b) {
26886           let aCompare = a[nameProp]();
26887           let bCompare = b[nameProp]();
26888           if (aliasesProp) {
26889             const findMatchingAlias = (strings) => {
26890               if (strings.some((s) => s === value)) {
26891                 return strings.find((s) => s === value);
26892               } else {
26893                 return strings.filter((s) => s.includes(value)).sort((a2, b2) => a2.length - b2.length)[0];
26894               }
26895             };
26896             aCompare = findMatchingAlias([aCompare].concat(a[aliasesProp]()));
26897             bCompare = findMatchingAlias([bCompare].concat(b[aliasesProp]()));
26898           }
26899           if (value === aCompare)
26900             return -1;
26901           if (value === bCompare)
26902             return 1;
26903           let i2 = b.originalScore - a.originalScore;
26904           if (i2 !== 0)
26905             return i2;
26906           i2 = aCompare.indexOf(value) - bCompare.indexOf(value);
26907           if (i2 !== 0)
26908             return i2;
26909           return aCompare.length - bCompare.length;
26910         };
26911       }
26912       let pool = _this.collection;
26913       if (Array.isArray(loc)) {
26914         const validHere = _sharedLocationManager.locationSetsAt(loc);
26915         pool = pool.filter((a) => !a.locationSetID || validHere[a.locationSetID]);
26916       }
26917       const searchable = pool.filter((a) => a.searchable !== false && a.suggestion !== true);
26918       const suggestions = pool.filter((a) => a.suggestion === true);
26919       const leadingNames = searchable.filter((a) => leading(a.searchName()) || a.searchAliases().some(leading)).sort(sortPresets("searchName", "searchAliases"));
26920       const leadingSuggestions = suggestions.filter((a) => leadingStrict(a.searchName())).sort(sortPresets("searchName"));
26921       const leadingNamesStripped = searchable.filter((a) => leading(a.searchNameStripped()) || a.searchAliasesStripped().some(leading)).sort(sortPresets("searchNameStripped", "searchAliasesStripped"));
26922       const leadingSuggestionsStripped = suggestions.filter((a) => leadingStrict(a.searchNameStripped())).sort(sortPresets("searchNameStripped"));
26923       const leadingTerms = searchable.filter((a) => (a.terms() || []).some(leading));
26924       const leadingSuggestionTerms = suggestions.filter((a) => (a.terms() || []).some(leading));
26925       const leadingTagValues = searchable.filter((a) => Object.values(a.tags || {}).filter((val) => val !== "*").some(leading));
26926       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);
26927       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);
26928       const similarTerms = searchable.filter((a) => {
26929         return (a.terms() || []).some((b) => {
26930           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
26931         });
26932       });
26933       let leadingTagKeyValues = [];
26934       if (value.includes("=")) {
26935         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]))));
26936       }
26937       let results = leadingNames.concat(
26938         leadingSuggestions,
26939         leadingNamesStripped,
26940         leadingSuggestionsStripped,
26941         leadingTerms,
26942         leadingSuggestionTerms,
26943         leadingTagValues,
26944         similarName,
26945         similarSuggestions,
26946         similarTerms,
26947         leadingTagKeyValues
26948       ).slice(0, MAXRESULTS - 1);
26949       if (geometry) {
26950         if (typeof geometry === "string") {
26951           results.push(_this.fallback(geometry));
26952         } else {
26953           geometry.forEach((geom) => results.push(_this.fallback(geom)));
26954         }
26955       }
26956       return presetCollection(utilArrayUniq(results));
26957     };
26958     return _this;
26959   }
26960
26961   // modules/presets/category.js
26962   function presetCategory(categoryID, category, allPresets) {
26963     let _this = Object.assign({}, category);
26964     let _searchName;
26965     let _searchNameStripped;
26966     _this.id = categoryID;
26967     _this.members = presetCollection(
26968       (category.members || []).map((presetID) => allPresets[presetID]).filter(Boolean)
26969     );
26970     _this.geometry = _this.members.collection.reduce((acc, preset) => {
26971       for (let i2 in preset.geometry) {
26972         const geometry = preset.geometry[i2];
26973         if (acc.indexOf(geometry) === -1) {
26974           acc.push(geometry);
26975         }
26976       }
26977       return acc;
26978     }, []);
26979     _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
26980     _this.matchAllGeometry = (geometries) => _this.members.collection.some((preset) => preset.matchAllGeometry(geometries));
26981     _this.matchScore = () => -1;
26982     _this.name = () => _t(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID });
26983     _this.nameLabel = () => _t.append(`_tagging.presets.categories.${categoryID}.name`, { "default": categoryID });
26984     _this.terms = () => [];
26985     _this.searchName = () => {
26986       if (!_searchName) {
26987         _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
26988       }
26989       return _searchName;
26990     };
26991     _this.searchNameStripped = () => {
26992       if (!_searchNameStripped) {
26993         _searchNameStripped = _this.searchName();
26994         if (_searchNameStripped.normalize)
26995           _searchNameStripped = _searchNameStripped.normalize("NFD");
26996         _searchNameStripped = _searchNameStripped.replace(/[\u0300-\u036f]/g, "");
26997       }
26998       return _searchNameStripped;
26999     };
27000     _this.searchAliases = () => [];
27001     _this.searchAliasesStripped = () => [];
27002     return _this;
27003   }
27004
27005   // modules/presets/field.js
27006   function presetField(fieldID, field, allFields) {
27007     allFields = allFields || {};
27008     let _this = Object.assign({}, field);
27009     _this.id = fieldID;
27010     _this.safeid = utilSafeClassName(fieldID);
27011     _this.matchGeometry = (geom) => !_this.geometry || _this.geometry.indexOf(geom) !== -1;
27012     _this.matchAllGeometry = (geometries) => {
27013       return !_this.geometry || geometries.every((geom) => _this.geometry.indexOf(geom) !== -1);
27014     };
27015     _this.t = (scope, options2) => _t(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
27016     _this.t.html = (scope, options2) => _t.html(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
27017     _this.t.append = (scope, options2) => _t.append(`_tagging.presets.fields.${fieldID}.${scope}`, options2);
27018     _this.hasTextForStringId = (scope) => _mainLocalizer.hasTextForStringId(`_tagging.presets.fields.${fieldID}.${scope}`);
27019     _this.resolveReference = (which) => {
27020       const referenceRegex = /^\{(.*)\}$/;
27021       const match = (field[which] || "").match(referenceRegex);
27022       if (match) {
27023         const field2 = allFields[match[1]];
27024         if (field2) {
27025           return field2;
27026         }
27027         console.error(`Unable to resolve referenced field: ${match[1]}`);
27028       }
27029       return _this;
27030     };
27031     _this.title = () => _this.overrideLabel || _this.resolveReference("label").t("label", { "default": fieldID });
27032     _this.label = () => _this.overrideLabel ? (selection2) => selection2.text(_this.overrideLabel) : _this.resolveReference("label").t.append("label", { "default": fieldID });
27033     _this.placeholder = () => _this.resolveReference("placeholder").t("placeholder", { "default": "" });
27034     _this.originalTerms = (_this.terms || []).join();
27035     _this.terms = () => _this.resolveReference("label").t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
27036     _this.increment = _this.type === "number" ? _this.increment || 1 : void 0;
27037     return _this;
27038   }
27039
27040   // modules/presets/preset.js
27041   var import_lodash = __toESM(require_lodash());
27042   function presetPreset(presetID, preset, addable, allFields, allPresets) {
27043     allFields = allFields || {};
27044     allPresets = allPresets || {};
27045     let _this = Object.assign({}, preset);
27046     let _addable = addable || false;
27047     let _searchName;
27048     let _searchNameStripped;
27049     let _searchAliases;
27050     let _searchAliasesStripped;
27051     const referenceRegex = /^\{(.*)\}$/;
27052     _this.id = presetID;
27053     _this.safeid = utilSafeClassName(presetID);
27054     _this.originalTerms = (_this.terms || []).join();
27055     _this.originalName = _this.name || "";
27056     _this.originalAliases = (_this.aliases || []).join("\n");
27057     _this.originalScore = _this.matchScore || 1;
27058     _this.originalReference = _this.reference || {};
27059     _this.originalFields = _this.fields || [];
27060     _this.originalMoreFields = _this.moreFields || [];
27061     _this.fields = (loc) => resolveFields("fields", loc);
27062     _this.moreFields = (loc) => resolveFields("moreFields", loc);
27063     _this.tags = _this.tags || {};
27064     _this.addTags = _this.addTags || _this.tags;
27065     _this.removeTags = _this.removeTags || _this.addTags;
27066     _this.geometry = _this.geometry || [];
27067     _this.matchGeometry = (geom) => _this.geometry.indexOf(geom) >= 0;
27068     _this.matchAllGeometry = (geoms) => geoms.every(_this.matchGeometry);
27069     _this.matchScore = (entityTags) => {
27070       const tags = _this.tags;
27071       let seen = {};
27072       let score = 0;
27073       for (let k in tags) {
27074         seen[k] = true;
27075         if (entityTags[k] === tags[k]) {
27076           score += _this.originalScore;
27077         } else if (tags[k] === "*" && k in entityTags) {
27078           score += _this.originalScore / 2;
27079         } else {
27080           return -1;
27081         }
27082       }
27083       const addTags = _this.addTags;
27084       for (let k in addTags) {
27085         if (!seen[k] && entityTags[k] === addTags[k]) {
27086           score += _this.originalScore;
27087         }
27088       }
27089       if (_this.searchable === false) {
27090         score *= 0.999;
27091       }
27092       return score;
27093     };
27094     _this.t = (scope, options2) => {
27095       const textID = `_tagging.presets.presets.${presetID}.${scope}`;
27096       return _t(textID, options2);
27097     };
27098     _this.t.append = (scope, options2) => {
27099       const textID = `_tagging.presets.presets.${presetID}.${scope}`;
27100       return _t.append(textID, options2);
27101     };
27102     function resolveReference(which) {
27103       const match = (_this[which] || "").match(referenceRegex);
27104       if (match) {
27105         const preset2 = allPresets[match[1]];
27106         if (preset2) {
27107           return preset2;
27108         }
27109         console.error(`Unable to resolve referenced preset: ${match[1]}`);
27110       }
27111       return _this;
27112     }
27113     _this.name = () => {
27114       return resolveReference("originalName").t("name", { "default": _this.originalName || presetID });
27115     };
27116     _this.nameLabel = () => {
27117       return resolveReference("originalName").t.append("name", { "default": _this.originalName || presetID });
27118     };
27119     _this.subtitle = () => {
27120       if (_this.suggestion) {
27121         let path = presetID.split("/");
27122         path.pop();
27123         return _t("_tagging.presets.presets." + path.join("/") + ".name");
27124       }
27125       return null;
27126     };
27127     _this.subtitleLabel = () => {
27128       if (_this.suggestion) {
27129         let path = presetID.split("/");
27130         path.pop();
27131         return _t.append("_tagging.presets.presets." + path.join("/") + ".name");
27132       }
27133       return null;
27134     };
27135     _this.aliases = () => {
27136       return resolveReference("originalName").t("aliases", { "default": _this.originalAliases }).trim().split(/\s*[\r\n]+\s*/);
27137     };
27138     _this.terms = () => {
27139       return resolveReference("originalName").t("terms", { "default": _this.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
27140     };
27141     _this.searchName = () => {
27142       if (!_searchName) {
27143         _searchName = (_this.suggestion ? _this.originalName : _this.name()).toLowerCase();
27144       }
27145       return _searchName;
27146     };
27147     _this.searchNameStripped = () => {
27148       if (!_searchNameStripped) {
27149         _searchNameStripped = stripDiacritics(_this.searchName());
27150       }
27151       return _searchNameStripped;
27152     };
27153     _this.searchAliases = () => {
27154       if (!_searchAliases) {
27155         _searchAliases = _this.aliases().map((alias) => alias.toLowerCase());
27156       }
27157       return _searchAliases;
27158     };
27159     _this.searchAliasesStripped = () => {
27160       if (!_searchAliasesStripped) {
27161         _searchAliasesStripped = _this.searchAliases();
27162         _searchAliasesStripped = _searchAliasesStripped.map(stripDiacritics);
27163       }
27164       return _searchAliasesStripped;
27165     };
27166     _this.isFallback = () => {
27167       const tagCount = Object.keys(_this.tags).length;
27168       return tagCount === 0 || tagCount === 1 && _this.tags.hasOwnProperty("area");
27169     };
27170     _this.addable = function(val) {
27171       if (!arguments.length)
27172         return _addable;
27173       _addable = val;
27174       return _this;
27175     };
27176     _this.reference = () => {
27177       const qid = _this.tags.wikidata || _this.tags["flag:wikidata"] || _this.tags["brand:wikidata"] || _this.tags["network:wikidata"] || _this.tags["operator:wikidata"];
27178       if (qid) {
27179         return { qid };
27180       }
27181       let key = _this.originalReference.key || Object.keys(utilObjectOmit(_this.tags, "name"))[0];
27182       let value = _this.originalReference.value || _this.tags[key];
27183       if (value === "*") {
27184         return { key };
27185       } else {
27186         return { key, value };
27187       }
27188     };
27189     _this.unsetTags = (tags, geometry, ignoringKeys, skipFieldDefaults, loc) => {
27190       let removeTags = ignoringKeys ? utilObjectOmit(_this.removeTags, ignoringKeys) : _this.removeTags;
27191       tags = utilObjectOmit(tags, Object.keys(removeTags));
27192       if (geometry && !skipFieldDefaults) {
27193         _this.fields(loc).forEach((field) => {
27194           if (field.matchGeometry(geometry) && field.key && field.default === tags[field.key] && (!ignoringKeys || ignoringKeys.indexOf(field.key) === -1)) {
27195             delete tags[field.key];
27196           }
27197         });
27198       }
27199       delete tags.area;
27200       return tags;
27201     };
27202     _this.setTags = (tags, geometry, skipFieldDefaults, loc) => {
27203       const addTags = _this.addTags;
27204       tags = Object.assign({}, tags);
27205       for (let k in addTags) {
27206         if (addTags[k] === "*") {
27207           if (_this.tags[k] || !tags[k]) {
27208             tags[k] = "yes";
27209           }
27210         } else {
27211           tags[k] = addTags[k];
27212         }
27213       }
27214       if (!addTags.hasOwnProperty("area")) {
27215         delete tags.area;
27216         if (geometry === "area") {
27217           let needsAreaTag = true;
27218           for (let k in addTags) {
27219             if (_this.geometry.indexOf("line") === -1 && k in osmAreaKeys || k in osmAreaKeysExceptions && addTags[k] in osmAreaKeysExceptions[k]) {
27220               needsAreaTag = false;
27221               break;
27222             }
27223           }
27224           if (needsAreaTag) {
27225             tags.area = "yes";
27226           }
27227         }
27228       }
27229       if (geometry && !skipFieldDefaults) {
27230         _this.fields(loc).forEach((field) => {
27231           if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
27232             tags[field.key] = field.default;
27233           }
27234         });
27235       }
27236       return tags;
27237     };
27238     function resolveFields(which, loc) {
27239       const fieldIDs = which === "fields" ? _this.originalFields : _this.originalMoreFields;
27240       let resolved = [];
27241       fieldIDs.forEach((fieldID) => {
27242         const match = fieldID.match(referenceRegex);
27243         if (match !== null) {
27244           resolved = resolved.concat(inheritFields(allPresets[match[1]], which));
27245         } else if (allFields[fieldID]) {
27246           resolved.push(allFields[fieldID]);
27247         } else {
27248           console.log(`Cannot resolve "${fieldID}" found in ${_this.id}.${which}`);
27249         }
27250       });
27251       if (!resolved.length) {
27252         const endIndex = _this.id.lastIndexOf("/");
27253         const parentID = endIndex && _this.id.substring(0, endIndex);
27254         if (parentID) {
27255           let parent = allPresets[parentID];
27256           if (loc) {
27257             const validHere = _sharedLocationManager.locationSetsAt(loc);
27258             if (parent?.locationSetID && !validHere[parent.locationSetID]) {
27259               const candidateIDs = Object.keys(allPresets).filter((k) => k.startsWith(parentID));
27260               parent = allPresets[candidateIDs.find((candidateID) => {
27261                 const candidate = allPresets[candidateID];
27262                 return validHere[candidate.locationSetID] && (0, import_lodash.isEqual)(candidate.tags, parent.tags);
27263               })];
27264             }
27265           }
27266           resolved = inheritFields(parent, which);
27267         }
27268       }
27269       return utilArrayUniq(resolved);
27270       function inheritFields(parent, which2) {
27271         if (!parent)
27272           return [];
27273         if (which2 === "fields") {
27274           return parent.fields().filter(shouldInherit);
27275         } else if (which2 === "moreFields") {
27276           return parent.moreFields();
27277         } else {
27278           return [];
27279         }
27280       }
27281       function shouldInherit(f2) {
27282         if (f2.key && _this.tags[f2.key] !== void 0 && // inherit anyway if multiple values are allowed or just a checkbox
27283         f2.type !== "multiCombo" && f2.type !== "semiCombo" && f2.type !== "manyCombo" && f2.type !== "check")
27284           return false;
27285         return true;
27286       }
27287     }
27288     function stripDiacritics(s) {
27289       if (s.normalize)
27290         s = s.normalize("NFD");
27291       s = s.replace(/[\u0300-\u036f]/g, "");
27292       return s;
27293     }
27294     return _this;
27295   }
27296
27297   // modules/presets/index.js
27298   var _mainPresetIndex = presetIndex();
27299   function presetIndex() {
27300     const dispatch10 = dispatch_default("favoritePreset", "recentsChange");
27301     const MAXRECENTS = 30;
27302     const POINT = presetPreset("point", { name: "Point", tags: {}, geometry: ["point", "vertex"], matchScore: 0.1 });
27303     const LINE = presetPreset("line", { name: "Line", tags: {}, geometry: ["line"], matchScore: 0.1 });
27304     const AREA = presetPreset("area", { name: "Area", tags: { area: "yes" }, geometry: ["area"], matchScore: 0.1 });
27305     const RELATION = presetPreset("relation", { name: "Relation", tags: {}, geometry: ["relation"], matchScore: 0.1 });
27306     let _this = presetCollection([POINT, LINE, AREA, RELATION]);
27307     let _presets = { point: POINT, line: LINE, area: AREA, relation: RELATION };
27308     let _defaults = {
27309       point: presetCollection([POINT]),
27310       vertex: presetCollection([POINT]),
27311       line: presetCollection([LINE]),
27312       area: presetCollection([AREA]),
27313       relation: presetCollection([RELATION])
27314     };
27315     let _fields = {};
27316     let _categories = {};
27317     let _universal = [];
27318     let _addablePresetIDs = null;
27319     let _recents;
27320     let _favorites;
27321     let _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
27322     let _loadPromise;
27323     _this.ensureLoaded = () => {
27324       if (_loadPromise)
27325         return _loadPromise;
27326       return _loadPromise = Promise.all([
27327         _mainFileFetcher.get("preset_categories"),
27328         _mainFileFetcher.get("preset_defaults"),
27329         _mainFileFetcher.get("preset_presets"),
27330         _mainFileFetcher.get("preset_fields")
27331       ]).then((vals) => {
27332         _this.merge({
27333           categories: vals[0],
27334           defaults: vals[1],
27335           presets: vals[2],
27336           fields: vals[3]
27337         });
27338         osmSetAreaKeys(_this.areaKeys());
27339         osmSetLineTags(_this.lineTags());
27340         osmSetPointTags(_this.pointTags());
27341         osmSetVertexTags(_this.vertexTags());
27342       });
27343     };
27344     _this.merge = (d) => {
27345       let newLocationSets = [];
27346       if (d.fields) {
27347         Object.keys(d.fields).forEach((fieldID) => {
27348           let f2 = d.fields[fieldID];
27349           if (f2) {
27350             f2 = presetField(fieldID, f2, _fields);
27351             if (f2.locationSet)
27352               newLocationSets.push(f2);
27353             _fields[fieldID] = f2;
27354           } else {
27355             delete _fields[fieldID];
27356           }
27357         });
27358       }
27359       if (d.presets) {
27360         Object.keys(d.presets).forEach((presetID) => {
27361           let p = d.presets[presetID];
27362           if (p) {
27363             const isAddable = !_addablePresetIDs || _addablePresetIDs.has(presetID);
27364             p = presetPreset(presetID, p, isAddable, _fields, _presets);
27365             if (p.locationSet)
27366               newLocationSets.push(p);
27367             _presets[presetID] = p;
27368           } else {
27369             const existing = _presets[presetID];
27370             if (existing && !existing.isFallback()) {
27371               delete _presets[presetID];
27372             }
27373           }
27374         });
27375       }
27376       if (d.categories) {
27377         Object.keys(d.categories).forEach((categoryID) => {
27378           let c = d.categories[categoryID];
27379           if (c) {
27380             c = presetCategory(categoryID, c, _presets);
27381             if (c.locationSet)
27382               newLocationSets.push(c);
27383             _categories[categoryID] = c;
27384           } else {
27385             delete _categories[categoryID];
27386           }
27387         });
27388       }
27389       _this.collection = Object.values(_presets).concat(Object.values(_categories));
27390       if (d.defaults) {
27391         Object.keys(d.defaults).forEach((geometry) => {
27392           const def = d.defaults[geometry];
27393           if (Array.isArray(def)) {
27394             _defaults[geometry] = presetCollection(
27395               def.map((id2) => _presets[id2] || _categories[id2]).filter(Boolean)
27396             );
27397           } else {
27398             delete _defaults[geometry];
27399           }
27400         });
27401       }
27402       _universal = Object.values(_fields).filter((field) => field.universal);
27403       _geometryIndex = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
27404       _this.collection.forEach((preset) => {
27405         (preset.geometry || []).forEach((geometry) => {
27406           let g = _geometryIndex[geometry];
27407           for (let key in preset.tags) {
27408             g[key] = g[key] || {};
27409             let value = preset.tags[key];
27410             (g[key][value] = g[key][value] || []).push(preset);
27411           }
27412         });
27413       });
27414       if (d.featureCollection && Array.isArray(d.featureCollection.features)) {
27415         _sharedLocationManager.mergeCustomGeoJSON(d.featureCollection);
27416       }
27417       if (newLocationSets.length) {
27418         _sharedLocationManager.mergeLocationSets(newLocationSets);
27419       }
27420       return _this;
27421     };
27422     _this.match = (entity, resolver) => {
27423       return resolver.transient(entity, "presetMatch", () => {
27424         let geometry = entity.geometry(resolver);
27425         if (geometry === "vertex" && entity.isOnAddressLine(resolver)) {
27426           geometry = "point";
27427         }
27428         const entityExtent = entity.extent(resolver);
27429         return _this.matchTags(entity.tags, geometry, entityExtent.center());
27430       });
27431     };
27432     _this.matchTags = (tags, geometry, loc) => {
27433       const keyIndex = _geometryIndex[geometry];
27434       let bestScore = -1;
27435       let bestMatch;
27436       let matchCandidates = [];
27437       for (let k in tags) {
27438         let indexMatches = [];
27439         let valueIndex = keyIndex[k];
27440         if (!valueIndex)
27441           continue;
27442         let keyValueMatches = valueIndex[tags[k]];
27443         if (keyValueMatches)
27444           indexMatches.push(...keyValueMatches);
27445         let keyStarMatches = valueIndex["*"];
27446         if (keyStarMatches)
27447           indexMatches.push(...keyStarMatches);
27448         if (indexMatches.length === 0)
27449           continue;
27450         for (let i2 = 0; i2 < indexMatches.length; i2++) {
27451           const candidate = indexMatches[i2];
27452           const score = candidate.matchScore(tags);
27453           if (score === -1) {
27454             continue;
27455           }
27456           matchCandidates.push({ score, candidate });
27457           if (score > bestScore) {
27458             bestScore = score;
27459             bestMatch = candidate;
27460           }
27461         }
27462       }
27463       if (bestMatch && bestMatch.locationSetID && bestMatch.locationSetID !== "+[Q2]" && Array.isArray(loc)) {
27464         const validHere = _sharedLocationManager.locationSetsAt(loc);
27465         if (!validHere[bestMatch.locationSetID]) {
27466           matchCandidates.sort((a, b) => a.score < b.score ? 1 : -1);
27467           for (let i2 = 0; i2 < matchCandidates.length; i2++) {
27468             const candidateScore = matchCandidates[i2];
27469             if (!candidateScore.candidate.locationSetID || validHere[candidateScore.candidate.locationSetID]) {
27470               bestMatch = candidateScore.candidate;
27471               bestScore = candidateScore.score;
27472               break;
27473             }
27474           }
27475         }
27476       }
27477       if (!bestMatch || bestMatch.isFallback()) {
27478         for (let k in tags) {
27479           if (/^addr:/.test(k) && keyIndex["addr:*"] && keyIndex["addr:*"]["*"]) {
27480             bestMatch = keyIndex["addr:*"]["*"][0];
27481             break;
27482           }
27483         }
27484       }
27485       return bestMatch || _this.fallback(geometry);
27486     };
27487     _this.allowsVertex = (entity, resolver) => {
27488       if (entity.type !== "node")
27489         return false;
27490       if (Object.keys(entity.tags).length === 0)
27491         return true;
27492       return resolver.transient(entity, "vertexMatch", () => {
27493         if (entity.isOnAddressLine(resolver))
27494           return true;
27495         const geometries = osmNodeGeometriesForTags(entity.tags);
27496         if (geometries.vertex)
27497           return true;
27498         if (geometries.point)
27499           return false;
27500         return true;
27501       });
27502     };
27503     _this.areaKeys = () => {
27504       const ignore = {
27505         barrier: true,
27506         highway: true,
27507         footway: true,
27508         railway: true,
27509         junction: true,
27510         traffic_calming: true,
27511         type: true
27512       };
27513       let areaKeys = {};
27514       const presets = _this.collection.filter((p) => !p.suggestion && !p.replacement);
27515       presets.forEach((p) => {
27516         const keys2 = p.tags && Object.keys(p.tags);
27517         const key = keys2 && keys2.length && keys2[0];
27518         if (!key)
27519           return;
27520         if (ignore[key])
27521           return;
27522         if (p.geometry.indexOf("area") !== -1) {
27523           areaKeys[key] = areaKeys[key] || {};
27524         }
27525       });
27526       presets.forEach((p) => {
27527         let key;
27528         for (key in p.addTags) {
27529           const value = p.addTags[key];
27530           if (key in areaKeys && // probably an area...
27531           p.geometry.indexOf("line") !== -1 && // but sometimes a line
27532           value !== "*") {
27533             areaKeys[key][value] = true;
27534           }
27535         }
27536       });
27537       return areaKeys;
27538     };
27539     _this.lineTags = () => {
27540       return _this.collection.filter((lineTags, d) => {
27541         if (d.suggestion || d.replacement || d.searchable === false)
27542           return lineTags;
27543         const keys2 = d.tags && Object.keys(d.tags);
27544         const key = keys2 && keys2.length && keys2[0];
27545         if (!key)
27546           return lineTags;
27547         if (d.geometry.indexOf("line") !== -1) {
27548           lineTags[key] = lineTags[key] || [];
27549           lineTags[key].push(d.tags);
27550         }
27551         return lineTags;
27552       }, {});
27553     };
27554     _this.pointTags = () => {
27555       return _this.collection.reduce((pointTags, d) => {
27556         if (d.suggestion || d.replacement || d.searchable === false)
27557           return pointTags;
27558         const keys2 = d.tags && Object.keys(d.tags);
27559         const key = keys2 && keys2.length && keys2[0];
27560         if (!key)
27561           return pointTags;
27562         if (d.geometry.indexOf("point") !== -1) {
27563           pointTags[key] = pointTags[key] || {};
27564           pointTags[key][d.tags[key]] = true;
27565         }
27566         return pointTags;
27567       }, {});
27568     };
27569     _this.vertexTags = () => {
27570       return _this.collection.reduce((vertexTags, d) => {
27571         if (d.suggestion || d.replacement || d.searchable === false)
27572           return vertexTags;
27573         const keys2 = d.tags && Object.keys(d.tags);
27574         const key = keys2 && keys2.length && keys2[0];
27575         if (!key)
27576           return vertexTags;
27577         if (d.geometry.indexOf("vertex") !== -1) {
27578           vertexTags[key] = vertexTags[key] || {};
27579           vertexTags[key][d.tags[key]] = true;
27580         }
27581         return vertexTags;
27582       }, {});
27583     };
27584     _this.field = (id2) => _fields[id2];
27585     _this.universal = () => _universal;
27586     _this.defaults = (geometry, n2, startWithRecents, loc, extraPresets) => {
27587       let recents = [];
27588       if (startWithRecents) {
27589         recents = _this.recent().matchGeometry(geometry).collection.slice(0, 4);
27590       }
27591       let defaults2;
27592       if (_addablePresetIDs) {
27593         defaults2 = Array.from(_addablePresetIDs).map(function(id2) {
27594           var preset = _this.item(id2);
27595           if (preset && preset.matchGeometry(geometry))
27596             return preset;
27597           return null;
27598         }).filter(Boolean);
27599       } else {
27600         defaults2 = _defaults[geometry].collection.concat(_this.fallback(geometry));
27601       }
27602       let result = presetCollection(
27603         utilArrayUniq(recents.concat(defaults2).concat(extraPresets || [])).slice(0, n2 - 1)
27604       );
27605       if (Array.isArray(loc)) {
27606         const validHere = _sharedLocationManager.locationSetsAt(loc);
27607         result.collection = result.collection.filter((a) => !a.locationSetID || validHere[a.locationSetID]);
27608       }
27609       return result;
27610     };
27611     _this.addablePresetIDs = function(val) {
27612       if (!arguments.length)
27613         return _addablePresetIDs;
27614       if (Array.isArray(val))
27615         val = new Set(val);
27616       _addablePresetIDs = val;
27617       if (_addablePresetIDs) {
27618         _this.collection.forEach((p) => {
27619           if (p.addable)
27620             p.addable(_addablePresetIDs.has(p.id));
27621         });
27622       } else {
27623         _this.collection.forEach((p) => {
27624           if (p.addable)
27625             p.addable(true);
27626         });
27627       }
27628       return _this;
27629     };
27630     _this.recent = () => {
27631       return presetCollection(
27632         utilArrayUniq(_this.getRecents().map((d) => d.preset).filter((d) => d.searchable !== false))
27633       );
27634     };
27635     function RibbonItem(preset, source) {
27636       let item = {};
27637       item.preset = preset;
27638       item.source = source;
27639       item.isFavorite = () => item.source === "favorite";
27640       item.isRecent = () => item.source === "recent";
27641       item.matches = (preset2) => item.preset.id === preset2.id;
27642       item.minified = () => ({ pID: item.preset.id });
27643       return item;
27644     }
27645     function ribbonItemForMinified(d, source) {
27646       if (d && d.pID) {
27647         const preset = _this.item(d.pID);
27648         if (!preset)
27649           return null;
27650         return RibbonItem(preset, source);
27651       }
27652       return null;
27653     }
27654     _this.getGenericRibbonItems = () => {
27655       return ["point", "line", "area"].map((id2) => RibbonItem(_this.item(id2), "generic"));
27656     };
27657     _this.getAddable = () => {
27658       if (!_addablePresetIDs)
27659         return [];
27660       return _addablePresetIDs.map((id2) => {
27661         const preset = _this.item(id2);
27662         if (preset)
27663           return RibbonItem(preset, "addable");
27664         return null;
27665       }).filter(Boolean);
27666     };
27667     function setRecents(items) {
27668       _recents = items;
27669       const minifiedItems = items.map((d) => d.minified());
27670       corePreferences("preset_recents", JSON.stringify(minifiedItems));
27671       dispatch10.call("recentsChange");
27672     }
27673     _this.getRecents = () => {
27674       if (!_recents) {
27675         _recents = (JSON.parse(corePreferences("preset_recents")) || []).reduce((acc, d) => {
27676           let item = ribbonItemForMinified(d, "recent");
27677           if (item && item.preset.addable())
27678             acc.push(item);
27679           return acc;
27680         }, []);
27681       }
27682       return _recents;
27683     };
27684     _this.addRecent = (preset, besidePreset, after) => {
27685       const recents = _this.getRecents();
27686       const beforeItem = _this.recentMatching(besidePreset);
27687       let toIndex = recents.indexOf(beforeItem);
27688       if (after)
27689         toIndex += 1;
27690       const newItem = RibbonItem(preset, "recent");
27691       recents.splice(toIndex, 0, newItem);
27692       setRecents(recents);
27693     };
27694     _this.removeRecent = (preset) => {
27695       const item = _this.recentMatching(preset);
27696       if (item) {
27697         let items = _this.getRecents();
27698         items.splice(items.indexOf(item), 1);
27699         setRecents(items);
27700       }
27701     };
27702     _this.recentMatching = (preset) => {
27703       const items = _this.getRecents();
27704       for (let i2 in items) {
27705         if (items[i2].matches(preset)) {
27706           return items[i2];
27707         }
27708       }
27709       return null;
27710     };
27711     _this.moveItem = (items, fromIndex, toIndex) => {
27712       if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0 || fromIndex >= items.length || toIndex >= items.length)
27713         return null;
27714       items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
27715       return items;
27716     };
27717     _this.moveRecent = (item, beforeItem) => {
27718       const recents = _this.getRecents();
27719       const fromIndex = recents.indexOf(item);
27720       const toIndex = recents.indexOf(beforeItem);
27721       const items = _this.moveItem(recents, fromIndex, toIndex);
27722       if (items)
27723         setRecents(items);
27724     };
27725     _this.setMostRecent = (preset) => {
27726       if (preset.searchable === false)
27727         return;
27728       let items = _this.getRecents();
27729       let item = _this.recentMatching(preset);
27730       if (item) {
27731         items.splice(items.indexOf(item), 1);
27732       } else {
27733         item = RibbonItem(preset, "recent");
27734       }
27735       while (items.length >= MAXRECENTS) {
27736         items.pop();
27737       }
27738       items.unshift(item);
27739       setRecents(items);
27740     };
27741     function setFavorites(items) {
27742       _favorites = items;
27743       const minifiedItems = items.map((d) => d.minified());
27744       corePreferences("preset_favorites", JSON.stringify(minifiedItems));
27745       dispatch10.call("favoritePreset");
27746     }
27747     _this.addFavorite = (preset, besidePreset, after) => {
27748       const favorites = _this.getFavorites();
27749       const beforeItem = _this.favoriteMatching(besidePreset);
27750       let toIndex = favorites.indexOf(beforeItem);
27751       if (after)
27752         toIndex += 1;
27753       const newItem = RibbonItem(preset, "favorite");
27754       favorites.splice(toIndex, 0, newItem);
27755       setFavorites(favorites);
27756     };
27757     _this.toggleFavorite = (preset) => {
27758       const favs = _this.getFavorites();
27759       const favorite = _this.favoriteMatching(preset);
27760       if (favorite) {
27761         favs.splice(favs.indexOf(favorite), 1);
27762       } else {
27763         if (favs.length === 10) {
27764           favs.pop();
27765         }
27766         favs.push(RibbonItem(preset, "favorite"));
27767       }
27768       setFavorites(favs);
27769     };
27770     _this.removeFavorite = (preset) => {
27771       const item = _this.favoriteMatching(preset);
27772       if (item) {
27773         const items = _this.getFavorites();
27774         items.splice(items.indexOf(item), 1);
27775         setFavorites(items);
27776       }
27777     };
27778     _this.getFavorites = () => {
27779       if (!_favorites) {
27780         let rawFavorites = JSON.parse(corePreferences("preset_favorites"));
27781         if (!rawFavorites) {
27782           rawFavorites = [];
27783           corePreferences("preset_favorites", JSON.stringify(rawFavorites));
27784         }
27785         _favorites = rawFavorites.reduce((output, d) => {
27786           const item = ribbonItemForMinified(d, "favorite");
27787           if (item && item.preset.addable())
27788             output.push(item);
27789           return output;
27790         }, []);
27791       }
27792       return _favorites;
27793     };
27794     _this.favoriteMatching = (preset) => {
27795       const favs = _this.getFavorites();
27796       for (let index in favs) {
27797         if (favs[index].matches(preset)) {
27798           return favs[index];
27799         }
27800       }
27801       return null;
27802     };
27803     return utilRebind(_this, dispatch10, "on");
27804   }
27805
27806   // modules/util/util.js
27807   function utilTagText(entity) {
27808     var obj = entity && entity.tags || {};
27809     return Object.keys(obj).map(function(k) {
27810       return k + "=" + obj[k];
27811     }).join(", ");
27812   }
27813   function utilTotalExtent(array2, graph) {
27814     var extent = geoExtent();
27815     var val, entity;
27816     for (var i2 = 0; i2 < array2.length; i2++) {
27817       val = array2[i2];
27818       entity = typeof val === "string" ? graph.hasEntity(val) : val;
27819       if (entity) {
27820         extent._extend(entity.extent(graph));
27821       }
27822     }
27823     return extent;
27824   }
27825   function utilTagDiff(oldTags, newTags) {
27826     var tagDiff = [];
27827     var keys2 = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
27828     keys2.forEach(function(k) {
27829       var oldVal = oldTags[k];
27830       var newVal = newTags[k];
27831       if ((oldVal || oldVal === "") && (newVal === void 0 || newVal !== oldVal)) {
27832         tagDiff.push({
27833           type: "-",
27834           key: k,
27835           oldVal,
27836           newVal,
27837           display: "- " + k + "=" + oldVal
27838         });
27839       }
27840       if ((newVal || newVal === "") && (oldVal === void 0 || newVal !== oldVal)) {
27841         tagDiff.push({
27842           type: "+",
27843           key: k,
27844           oldVal,
27845           newVal,
27846           display: "+ " + k + "=" + newVal
27847         });
27848       }
27849     });
27850     return tagDiff;
27851   }
27852   function utilEntitySelector(ids) {
27853     return ids.length ? "." + ids.join(",.") : "nothing";
27854   }
27855   function utilEntityOrMemberSelector(ids, graph) {
27856     var seen = new Set(ids);
27857     ids.forEach(collectShallowDescendants);
27858     return utilEntitySelector(Array.from(seen));
27859     function collectShallowDescendants(id2) {
27860       var entity = graph.hasEntity(id2);
27861       if (!entity || entity.type !== "relation")
27862         return;
27863       entity.members.map(function(member) {
27864         return member.id;
27865       }).forEach(function(id3) {
27866         seen.add(id3);
27867       });
27868     }
27869   }
27870   function utilEntityOrDeepMemberSelector(ids, graph) {
27871     return utilEntitySelector(utilEntityAndDeepMemberIDs(ids, graph));
27872   }
27873   function utilEntityAndDeepMemberIDs(ids, graph) {
27874     var seen = /* @__PURE__ */ new Set();
27875     ids.forEach(collectDeepDescendants);
27876     return Array.from(seen);
27877     function collectDeepDescendants(id2) {
27878       if (seen.has(id2))
27879         return;
27880       seen.add(id2);
27881       var entity = graph.hasEntity(id2);
27882       if (!entity || entity.type !== "relation")
27883         return;
27884       entity.members.map(function(member) {
27885         return member.id;
27886       }).forEach(collectDeepDescendants);
27887     }
27888   }
27889   function utilDeepMemberSelector(ids, graph, skipMultipolgonMembers) {
27890     var idsSet = new Set(ids);
27891     var seen = /* @__PURE__ */ new Set();
27892     var returners = /* @__PURE__ */ new Set();
27893     ids.forEach(collectDeepDescendants);
27894     return utilEntitySelector(Array.from(returners));
27895     function collectDeepDescendants(id2) {
27896       if (seen.has(id2))
27897         return;
27898       seen.add(id2);
27899       if (!idsSet.has(id2)) {
27900         returners.add(id2);
27901       }
27902       var entity = graph.hasEntity(id2);
27903       if (!entity || entity.type !== "relation")
27904         return;
27905       if (skipMultipolgonMembers && entity.isMultipolygon())
27906         return;
27907       entity.members.map(function(member) {
27908         return member.id;
27909       }).forEach(collectDeepDescendants);
27910     }
27911   }
27912   function utilHighlightEntities(ids, highlighted, context) {
27913     context.surface().selectAll(utilEntityOrDeepMemberSelector(ids, context.graph())).classed("highlighted", highlighted);
27914   }
27915   function utilGetAllNodes(ids, graph) {
27916     var seen = /* @__PURE__ */ new Set();
27917     var nodes = /* @__PURE__ */ new Set();
27918     ids.forEach(collectNodes);
27919     return Array.from(nodes);
27920     function collectNodes(id2) {
27921       if (seen.has(id2))
27922         return;
27923       seen.add(id2);
27924       var entity = graph.hasEntity(id2);
27925       if (!entity)
27926         return;
27927       if (entity.type === "node") {
27928         nodes.add(entity);
27929       } else if (entity.type === "way") {
27930         entity.nodes.forEach(collectNodes);
27931       } else {
27932         entity.members.map(function(member) {
27933           return member.id;
27934         }).forEach(collectNodes);
27935       }
27936     }
27937   }
27938   function utilDisplayName(entity) {
27939     var localizedNameKey = "name:" + _mainLocalizer.languageCode().toLowerCase();
27940     var name = entity.tags[localizedNameKey] || entity.tags.name || "";
27941     if (name)
27942       return name;
27943     var tags = {
27944       direction: entity.tags.direction,
27945       from: entity.tags.from,
27946       network: entity.tags.cycle_network || entity.tags.network,
27947       ref: entity.tags.ref,
27948       to: entity.tags.to,
27949       via: entity.tags.via
27950     };
27951     var keyComponents = [];
27952     if (tags.network) {
27953       keyComponents.push("network");
27954     }
27955     if (tags.ref) {
27956       keyComponents.push("ref");
27957     }
27958     if (entity.tags.route) {
27959       if (tags.direction) {
27960         keyComponents.push("direction");
27961       } else if (tags.from && tags.to) {
27962         keyComponents.push("from");
27963         keyComponents.push("to");
27964         if (tags.via) {
27965           keyComponents.push("via");
27966         }
27967       }
27968     }
27969     if (keyComponents.length) {
27970       name = _t("inspector.display_name." + keyComponents.join("_"), tags);
27971     }
27972     return name;
27973   }
27974   function utilDisplayNameForPath(entity) {
27975     var name = utilDisplayName(entity);
27976     var isFirefox = utilDetect().browser.toLowerCase().indexOf("firefox") > -1;
27977     var isNewChromium = Number(utilDetect().version.split(".")[0]) >= 96;
27978     if (!isFirefox && !isNewChromium && name && rtlRegex.test(name)) {
27979       name = fixRTLTextForSvg(name);
27980     }
27981     return name;
27982   }
27983   function utilDisplayType(id2) {
27984     return {
27985       n: _t("inspector.node"),
27986       w: _t("inspector.way"),
27987       r: _t("inspector.relation")
27988     }[id2.charAt(0)];
27989   }
27990   function utilDisplayLabel(entity, graphOrGeometry, verbose) {
27991     var result;
27992     var displayName = utilDisplayName(entity);
27993     var preset = typeof graphOrGeometry === "string" ? _mainPresetIndex.matchTags(entity.tags, graphOrGeometry) : _mainPresetIndex.match(entity, graphOrGeometry);
27994     var presetName = preset && (preset.suggestion ? preset.subtitle() : preset.name());
27995     if (verbose) {
27996       result = [presetName, displayName].filter(Boolean).join(" ");
27997     } else {
27998       result = displayName || presetName;
27999     }
28000     return result || utilDisplayType(entity.id);
28001   }
28002   function utilEntityRoot(entityType) {
28003     return {
28004       node: "n",
28005       way: "w",
28006       relation: "r"
28007     }[entityType];
28008   }
28009   function utilCombinedTags(entityIDs, graph) {
28010     var tags = {};
28011     var tagCounts = {};
28012     var allKeys = /* @__PURE__ */ new Set();
28013     var entities = entityIDs.map(function(entityID) {
28014       return graph.hasEntity(entityID);
28015     }).filter(Boolean);
28016     entities.forEach(function(entity) {
28017       var keys2 = Object.keys(entity.tags).filter(Boolean);
28018       keys2.forEach(function(key2) {
28019         allKeys.add(key2);
28020       });
28021     });
28022     entities.forEach(function(entity) {
28023       allKeys.forEach(function(key2) {
28024         var value = entity.tags[key2];
28025         if (!tags.hasOwnProperty(key2)) {
28026           tags[key2] = value;
28027         } else {
28028           if (!Array.isArray(tags[key2])) {
28029             if (tags[key2] !== value) {
28030               tags[key2] = [tags[key2], value];
28031             }
28032           } else {
28033             if (tags[key2].indexOf(value) === -1) {
28034               tags[key2].push(value);
28035             }
28036           }
28037         }
28038         var tagHash = key2 + "=" + value;
28039         if (!tagCounts[tagHash])
28040           tagCounts[tagHash] = 0;
28041         tagCounts[tagHash] += 1;
28042       });
28043     });
28044     for (var key in tags) {
28045       if (!Array.isArray(tags[key]))
28046         continue;
28047       tags[key] = tags[key].sort(function(val12, val2) {
28048         var key2 = key2;
28049         var count2 = tagCounts[key2 + "=" + val2];
28050         var count1 = tagCounts[key2 + "=" + val12];
28051         if (count2 !== count1) {
28052           return count2 - count1;
28053         }
28054         if (val2 && val12) {
28055           return val12.localeCompare(val2);
28056         }
28057         return val12 ? 1 : -1;
28058       });
28059     }
28060     return tags;
28061   }
28062   function utilStringQs(str2) {
28063     var i2 = 0;
28064     while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#"))
28065       i2++;
28066     str2 = str2.slice(i2);
28067     return str2.split("&").reduce(function(obj, pair2) {
28068       var parts = pair2.split("=");
28069       if (parts.length === 2) {
28070         obj[parts[0]] = null === parts[1] ? "" : decodeURIComponent(parts[1]);
28071       }
28072       return obj;
28073     }, {});
28074   }
28075   function utilQsString(obj, noencode) {
28076     function softEncode(s) {
28077       return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
28078     }
28079     return Object.keys(obj).sort().map(function(key) {
28080       return encodeURIComponent(key) + "=" + (noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
28081     }).join("&");
28082   }
28083   function utilPrefixDOMProperty(property) {
28084     var prefixes2 = ["webkit", "ms", "moz", "o"];
28085     var i2 = -1;
28086     var n2 = prefixes2.length;
28087     var s = document.body;
28088     if (property in s)
28089       return property;
28090     property = property.slice(0, 1).toUpperCase() + property.slice(1);
28091     while (++i2 < n2) {
28092       if (prefixes2[i2] + property in s) {
28093         return prefixes2[i2] + property;
28094       }
28095     }
28096     return false;
28097   }
28098   function utilPrefixCSSProperty(property) {
28099     var prefixes2 = ["webkit", "ms", "Moz", "O"];
28100     var i2 = -1;
28101     var n2 = prefixes2.length;
28102     var s = document.body.style;
28103     if (property.toLowerCase() in s) {
28104       return property.toLowerCase();
28105     }
28106     while (++i2 < n2) {
28107       if (prefixes2[i2] + property in s) {
28108         return "-" + prefixes2[i2].toLowerCase() + property.replace(/([A-Z])/g, "-$1").toLowerCase();
28109       }
28110     }
28111     return false;
28112   }
28113   var transformProperty;
28114   function utilSetTransform(el, x, y, scale) {
28115     var prop = transformProperty = transformProperty || utilPrefixCSSProperty("Transform");
28116     var translate = utilDetect().opera ? "translate(" + x + "px," + y + "px)" : "translate3d(" + x + "px," + y + "px,0)";
28117     return el.style(prop, translate + (scale ? " scale(" + scale + ")" : ""));
28118   }
28119   function utilEditDistance(a, b) {
28120     a = (0, import_diacritics.remove)(a.toLowerCase());
28121     b = (0, import_diacritics.remove)(b.toLowerCase());
28122     if (a.length === 0)
28123       return b.length;
28124     if (b.length === 0)
28125       return a.length;
28126     var matrix = [];
28127     var i2, j2;
28128     for (i2 = 0; i2 <= b.length; i2++) {
28129       matrix[i2] = [i2];
28130     }
28131     for (j2 = 0; j2 <= a.length; j2++) {
28132       matrix[0][j2] = j2;
28133     }
28134     for (i2 = 1; i2 <= b.length; i2++) {
28135       for (j2 = 1; j2 <= a.length; j2++) {
28136         if (b.charAt(i2 - 1) === a.charAt(j2 - 1)) {
28137           matrix[i2][j2] = matrix[i2 - 1][j2 - 1];
28138         } else {
28139           matrix[i2][j2] = Math.min(
28140             matrix[i2 - 1][j2 - 1] + 1,
28141             // substitution
28142             Math.min(
28143               matrix[i2][j2 - 1] + 1,
28144               // insertion
28145               matrix[i2 - 1][j2] + 1
28146             )
28147           );
28148         }
28149       }
28150     }
28151     return matrix[b.length][a.length];
28152   }
28153   function utilFastMouse(container) {
28154     var rect = container.getBoundingClientRect();
28155     var rectLeft = rect.left;
28156     var rectTop = rect.top;
28157     var clientLeft = +container.clientLeft;
28158     var clientTop = +container.clientTop;
28159     return function(e) {
28160       return [
28161         e.clientX - rectLeft - clientLeft,
28162         e.clientY - rectTop - clientTop
28163       ];
28164     };
28165   }
28166   function utilAsyncMap(inputs, func, callback) {
28167     var remaining = inputs.length;
28168     var results = [];
28169     var errors = [];
28170     inputs.forEach(function(d, i2) {
28171       func(d, function done(err, data) {
28172         errors[i2] = err;
28173         results[i2] = data;
28174         remaining--;
28175         if (!remaining)
28176           callback(errors, results);
28177       });
28178     });
28179   }
28180   function utilWrap(index, length) {
28181     if (index < 0) {
28182       index += Math.ceil(-index / length) * length;
28183     }
28184     return index % length;
28185   }
28186   function utilFunctor(value) {
28187     if (typeof value === "function")
28188       return value;
28189     return function() {
28190       return value;
28191     };
28192   }
28193   function utilNoAuto(selection2) {
28194     var isText = selection2.size() && selection2.node().tagName.toLowerCase() === "textarea";
28195     return selection2.attr("autocomplete", "new-password").attr("autocorrect", "off").attr("autocapitalize", "off").attr("spellcheck", isText ? "true" : "false");
28196   }
28197   function utilHashcode(str2) {
28198     var hash = 0;
28199     if (str2.length === 0) {
28200       return hash;
28201     }
28202     for (var i2 = 0; i2 < str2.length; i2++) {
28203       var char = str2.charCodeAt(i2);
28204       hash = (hash << 5) - hash + char;
28205       hash = hash & hash;
28206     }
28207     return hash;
28208   }
28209   function utilSafeClassName(str2) {
28210     return str2.toLowerCase().replace(/[^a-z0-9]+/g, "_");
28211   }
28212   function utilUniqueDomId(val) {
28213     return "ideditor-" + utilSafeClassName(val.toString()) + "-" + (/* @__PURE__ */ new Date()).getTime().toString();
28214   }
28215   function utilUnicodeCharsCount(str2) {
28216     return Array.from(str2).length;
28217   }
28218   function utilUnicodeCharsTruncated(str2, limit) {
28219     return Array.from(str2).slice(0, limit).join("");
28220   }
28221   function toNumericID(id2) {
28222     var match = id2.match(/^[cnwr](-?\d+)$/);
28223     if (match) {
28224       return parseInt(match[1], 10);
28225     }
28226     return NaN;
28227   }
28228   function compareNumericIDs(left, right) {
28229     if (isNaN(left) && isNaN(right))
28230       return -1;
28231     if (isNaN(left))
28232       return 1;
28233     if (isNaN(right))
28234       return -1;
28235     if (Math.sign(left) !== Math.sign(right))
28236       return -Math.sign(left);
28237     if (Math.sign(left) < 0)
28238       return Math.sign(right - left);
28239     return Math.sign(left - right);
28240   }
28241   function utilCompareIDs(left, right) {
28242     return compareNumericIDs(toNumericID(left), toNumericID(right));
28243   }
28244   function utilOldestID(ids) {
28245     if (ids.length === 0) {
28246       return void 0;
28247     }
28248     var oldestIDIndex = 0;
28249     var oldestID = toNumericID(ids[0]);
28250     for (var i2 = 1; i2 < ids.length; i2++) {
28251       var num = toNumericID(ids[i2]);
28252       if (compareNumericIDs(oldestID, num) === 1) {
28253         oldestIDIndex = i2;
28254         oldestID = num;
28255       }
28256     }
28257     return ids[oldestIDIndex];
28258   }
28259   function utilCleanOsmString(val, maxChars) {
28260     if (val === void 0 || val === null) {
28261       val = "";
28262     } else {
28263       val = val.toString();
28264     }
28265     val = val.trim();
28266     if (val.normalize)
28267       val = val.normalize("NFC");
28268     return utilUnicodeCharsTruncated(val, maxChars);
28269   }
28270
28271   // modules/osm/entity.js
28272   function osmEntity(attrs) {
28273     if (this instanceof osmEntity)
28274       return;
28275     if (attrs && attrs.type) {
28276       return osmEntity[attrs.type].apply(this, arguments);
28277     } else if (attrs && attrs.id) {
28278       return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
28279     }
28280     return new osmEntity().initialize(arguments);
28281   }
28282   osmEntity.id = function(type2) {
28283     return osmEntity.id.fromOSM(type2, osmEntity.id.next[type2]--);
28284   };
28285   osmEntity.id.next = {
28286     changeset: -1,
28287     node: -1,
28288     way: -1,
28289     relation: -1
28290   };
28291   osmEntity.id.fromOSM = function(type2, id2) {
28292     return type2[0] + id2;
28293   };
28294   osmEntity.id.toOSM = function(id2) {
28295     var match = id2.match(/^[cnwr](-?\d+)$/);
28296     if (match) {
28297       return match[1];
28298     }
28299     return "";
28300   };
28301   osmEntity.id.type = function(id2) {
28302     return { "c": "changeset", "n": "node", "w": "way", "r": "relation" }[id2[0]];
28303   };
28304   osmEntity.key = function(entity) {
28305     return entity.id + "v" + (entity.v || 0);
28306   };
28307   var _deprecatedTagValuesByKey;
28308   osmEntity.deprecatedTagValuesByKey = function(dataDeprecated) {
28309     if (!_deprecatedTagValuesByKey) {
28310       _deprecatedTagValuesByKey = {};
28311       dataDeprecated.forEach(function(d) {
28312         var oldKeys = Object.keys(d.old);
28313         if (oldKeys.length === 1) {
28314           var oldKey = oldKeys[0];
28315           var oldValue = d.old[oldKey];
28316           if (oldValue !== "*") {
28317             if (!_deprecatedTagValuesByKey[oldKey]) {
28318               _deprecatedTagValuesByKey[oldKey] = [oldValue];
28319             } else {
28320               _deprecatedTagValuesByKey[oldKey].push(oldValue);
28321             }
28322           }
28323         }
28324       });
28325     }
28326     return _deprecatedTagValuesByKey;
28327   };
28328   osmEntity.prototype = {
28329     tags: {},
28330     initialize: function(sources) {
28331       for (var i2 = 0; i2 < sources.length; ++i2) {
28332         var source = sources[i2];
28333         for (var prop in source) {
28334           if (Object.prototype.hasOwnProperty.call(source, prop)) {
28335             if (source[prop] === void 0) {
28336               delete this[prop];
28337             } else {
28338               this[prop] = source[prop];
28339             }
28340           }
28341         }
28342       }
28343       if (!this.id && this.type) {
28344         this.id = osmEntity.id(this.type);
28345       }
28346       if (!this.hasOwnProperty("visible")) {
28347         this.visible = true;
28348       }
28349       if (debug) {
28350         Object.freeze(this);
28351         Object.freeze(this.tags);
28352         if (this.loc)
28353           Object.freeze(this.loc);
28354         if (this.nodes)
28355           Object.freeze(this.nodes);
28356         if (this.members)
28357           Object.freeze(this.members);
28358       }
28359       return this;
28360     },
28361     copy: function(resolver, copies) {
28362       if (copies[this.id])
28363         return copies[this.id];
28364       var copy2 = osmEntity(this, { id: void 0, user: void 0, version: void 0 });
28365       copies[this.id] = copy2;
28366       return copy2;
28367     },
28368     osmId: function() {
28369       return osmEntity.id.toOSM(this.id);
28370     },
28371     isNew: function() {
28372       var osmId = osmEntity.id.toOSM(this.id);
28373       return osmId.length === 0 || osmId[0] === "-";
28374     },
28375     update: function(attrs) {
28376       return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
28377     },
28378     mergeTags: function(tags) {
28379       var merged = Object.assign({}, this.tags);
28380       var changed = false;
28381       for (var k in tags) {
28382         var t1 = merged[k];
28383         var t2 = tags[k];
28384         if (!t1) {
28385           changed = true;
28386           merged[k] = t2;
28387         } else if (t1 !== t2) {
28388           changed = true;
28389           merged[k] = utilUnicodeCharsTruncated(
28390             utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(";"),
28391             255
28392             // avoid exceeding character limit; see also context.maxCharsForTagValue()
28393           );
28394         }
28395       }
28396       return changed ? this.update({ tags: merged }) : this;
28397     },
28398     intersects: function(extent, resolver) {
28399       return this.extent(resolver).intersects(extent);
28400     },
28401     hasNonGeometryTags: function() {
28402       return Object.keys(this.tags).some(function(k) {
28403         return k !== "area";
28404       });
28405     },
28406     hasParentRelations: function(resolver) {
28407       return resolver.parentRelations(this).length > 0;
28408     },
28409     hasInterestingTags: function() {
28410       return Object.keys(this.tags).some(osmIsInterestingTag);
28411     },
28412     isHighwayIntersection: function() {
28413       return false;
28414     },
28415     isDegenerate: function() {
28416       return true;
28417     },
28418     deprecatedTags: function(dataDeprecated) {
28419       var tags = this.tags;
28420       if (Object.keys(tags).length === 0)
28421         return [];
28422       var deprecated = [];
28423       dataDeprecated.forEach(function(d) {
28424         var oldKeys = Object.keys(d.old);
28425         if (d.replace) {
28426           var hasExistingValues = Object.keys(d.replace).some(function(replaceKey) {
28427             if (!tags[replaceKey] || d.old[replaceKey])
28428               return false;
28429             var replaceValue = d.replace[replaceKey];
28430             if (replaceValue === "*")
28431               return false;
28432             if (replaceValue === tags[replaceKey])
28433               return false;
28434             return true;
28435           });
28436           if (hasExistingValues)
28437             return;
28438         }
28439         var matchesDeprecatedTags = oldKeys.every(function(oldKey) {
28440           if (!tags[oldKey])
28441             return false;
28442           if (d.old[oldKey] === "*")
28443             return true;
28444           if (d.old[oldKey] === tags[oldKey])
28445             return true;
28446           var vals = tags[oldKey].split(";").filter(Boolean);
28447           if (vals.length === 0) {
28448             return false;
28449           } else if (vals.length > 1) {
28450             return vals.indexOf(d.old[oldKey]) !== -1;
28451           } else {
28452             if (tags[oldKey] === d.old[oldKey]) {
28453               if (d.replace && d.old[oldKey] === d.replace[oldKey]) {
28454                 var replaceKeys = Object.keys(d.replace);
28455                 return !replaceKeys.every(function(replaceKey) {
28456                   return tags[replaceKey] === d.replace[replaceKey];
28457                 });
28458               } else {
28459                 return true;
28460               }
28461             }
28462           }
28463           return false;
28464         });
28465         if (matchesDeprecatedTags) {
28466           deprecated.push(d);
28467         }
28468       });
28469       return deprecated;
28470     }
28471   };
28472
28473   // modules/osm/lanes.js
28474   function osmLanes(entity) {
28475     if (entity.type !== "way")
28476       return null;
28477     if (!entity.tags.highway)
28478       return null;
28479     var tags = entity.tags;
28480     var isOneWay = entity.isOneWay();
28481     var laneCount = getLaneCount(tags, isOneWay);
28482     var maxspeed = parseMaxspeed(tags);
28483     var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
28484     var forward = laneDirections.forward;
28485     var backward = laneDirections.backward;
28486     var bothways = laneDirections.bothways;
28487     var turnLanes = {};
28488     turnLanes.unspecified = parseTurnLanes(tags["turn:lanes"]);
28489     turnLanes.forward = parseTurnLanes(tags["turn:lanes:forward"]);
28490     turnLanes.backward = parseTurnLanes(tags["turn:lanes:backward"]);
28491     var maxspeedLanes = {};
28492     maxspeedLanes.unspecified = parseMaxspeedLanes(tags["maxspeed:lanes"], maxspeed);
28493     maxspeedLanes.forward = parseMaxspeedLanes(tags["maxspeed:lanes:forward"], maxspeed);
28494     maxspeedLanes.backward = parseMaxspeedLanes(tags["maxspeed:lanes:backward"], maxspeed);
28495     var psvLanes = {};
28496     psvLanes.unspecified = parseMiscLanes(tags["psv:lanes"]);
28497     psvLanes.forward = parseMiscLanes(tags["psv:lanes:forward"]);
28498     psvLanes.backward = parseMiscLanes(tags["psv:lanes:backward"]);
28499     var busLanes = {};
28500     busLanes.unspecified = parseMiscLanes(tags["bus:lanes"]);
28501     busLanes.forward = parseMiscLanes(tags["bus:lanes:forward"]);
28502     busLanes.backward = parseMiscLanes(tags["bus:lanes:backward"]);
28503     var taxiLanes = {};
28504     taxiLanes.unspecified = parseMiscLanes(tags["taxi:lanes"]);
28505     taxiLanes.forward = parseMiscLanes(tags["taxi:lanes:forward"]);
28506     taxiLanes.backward = parseMiscLanes(tags["taxi:lanes:backward"]);
28507     var hovLanes = {};
28508     hovLanes.unspecified = parseMiscLanes(tags["hov:lanes"]);
28509     hovLanes.forward = parseMiscLanes(tags["hov:lanes:forward"]);
28510     hovLanes.backward = parseMiscLanes(tags["hov:lanes:backward"]);
28511     var hgvLanes = {};
28512     hgvLanes.unspecified = parseMiscLanes(tags["hgv:lanes"]);
28513     hgvLanes.forward = parseMiscLanes(tags["hgv:lanes:forward"]);
28514     hgvLanes.backward = parseMiscLanes(tags["hgv:lanes:backward"]);
28515     var bicyclewayLanes = {};
28516     bicyclewayLanes.unspecified = parseBicycleWay(tags["bicycleway:lanes"]);
28517     bicyclewayLanes.forward = parseBicycleWay(tags["bicycleway:lanes:forward"]);
28518     bicyclewayLanes.backward = parseBicycleWay(tags["bicycleway:lanes:backward"]);
28519     var lanesObj = {
28520       forward: [],
28521       backward: [],
28522       unspecified: []
28523     };
28524     mapToLanesObj(lanesObj, turnLanes, "turnLane");
28525     mapToLanesObj(lanesObj, maxspeedLanes, "maxspeed");
28526     mapToLanesObj(lanesObj, psvLanes, "psv");
28527     mapToLanesObj(lanesObj, busLanes, "bus");
28528     mapToLanesObj(lanesObj, taxiLanes, "taxi");
28529     mapToLanesObj(lanesObj, hovLanes, "hov");
28530     mapToLanesObj(lanesObj, hgvLanes, "hgv");
28531     mapToLanesObj(lanesObj, bicyclewayLanes, "bicycleway");
28532     return {
28533       metadata: {
28534         count: laneCount,
28535         oneway: isOneWay,
28536         forward,
28537         backward,
28538         bothways,
28539         turnLanes,
28540         maxspeed,
28541         maxspeedLanes,
28542         psvLanes,
28543         busLanes,
28544         taxiLanes,
28545         hovLanes,
28546         hgvLanes,
28547         bicyclewayLanes
28548       },
28549       lanes: lanesObj
28550     };
28551   }
28552   function getLaneCount(tags, isOneWay) {
28553     var count;
28554     if (tags.lanes) {
28555       count = parseInt(tags.lanes, 10);
28556       if (count > 0) {
28557         return count;
28558       }
28559     }
28560     switch (tags.highway) {
28561       case "trunk":
28562       case "motorway":
28563         count = isOneWay ? 2 : 4;
28564         break;
28565       default:
28566         count = isOneWay ? 1 : 2;
28567         break;
28568     }
28569     return count;
28570   }
28571   function parseMaxspeed(tags) {
28572     var maxspeed = tags.maxspeed;
28573     if (!maxspeed)
28574       return;
28575     var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
28576     if (!maxspeedRegex.test(maxspeed))
28577       return;
28578     return parseInt(maxspeed, 10);
28579   }
28580   function parseLaneDirections(tags, isOneWay, laneCount) {
28581     var forward = parseInt(tags["lanes:forward"], 10);
28582     var backward = parseInt(tags["lanes:backward"], 10);
28583     var bothways = parseInt(tags["lanes:both_ways"], 10) > 0 ? 1 : 0;
28584     if (parseInt(tags.oneway, 10) === -1) {
28585       forward = 0;
28586       bothways = 0;
28587       backward = laneCount;
28588     } else if (isOneWay) {
28589       forward = laneCount;
28590       bothways = 0;
28591       backward = 0;
28592     } else if (isNaN(forward) && isNaN(backward)) {
28593       backward = Math.floor((laneCount - bothways) / 2);
28594       forward = laneCount - bothways - backward;
28595     } else if (isNaN(forward)) {
28596       if (backward > laneCount - bothways) {
28597         backward = laneCount - bothways;
28598       }
28599       forward = laneCount - bothways - backward;
28600     } else if (isNaN(backward)) {
28601       if (forward > laneCount - bothways) {
28602         forward = laneCount - bothways;
28603       }
28604       backward = laneCount - bothways - forward;
28605     }
28606     return {
28607       forward,
28608       backward,
28609       bothways
28610     };
28611   }
28612   function parseTurnLanes(tag) {
28613     if (!tag)
28614       return;
28615     var validValues = [
28616       "left",
28617       "slight_left",
28618       "sharp_left",
28619       "through",
28620       "right",
28621       "slight_right",
28622       "sharp_right",
28623       "reverse",
28624       "merge_to_left",
28625       "merge_to_right",
28626       "none"
28627     ];
28628     return tag.split("|").map(function(s) {
28629       if (s === "")
28630         s = "none";
28631       return s.split(";").map(function(d) {
28632         return validValues.indexOf(d) === -1 ? "unknown" : d;
28633       });
28634     });
28635   }
28636   function parseMaxspeedLanes(tag, maxspeed) {
28637     if (!tag)
28638       return;
28639     return tag.split("|").map(function(s) {
28640       if (s === "none")
28641         return s;
28642       var m = parseInt(s, 10);
28643       if (s === "" || m === maxspeed)
28644         return null;
28645       return isNaN(m) ? "unknown" : m;
28646     });
28647   }
28648   function parseMiscLanes(tag) {
28649     if (!tag)
28650       return;
28651     var validValues = [
28652       "yes",
28653       "no",
28654       "designated"
28655     ];
28656     return tag.split("|").map(function(s) {
28657       if (s === "")
28658         s = "no";
28659       return validValues.indexOf(s) === -1 ? "unknown" : s;
28660     });
28661   }
28662   function parseBicycleWay(tag) {
28663     if (!tag)
28664       return;
28665     var validValues = [
28666       "yes",
28667       "no",
28668       "designated",
28669       "lane"
28670     ];
28671     return tag.split("|").map(function(s) {
28672       if (s === "")
28673         s = "no";
28674       return validValues.indexOf(s) === -1 ? "unknown" : s;
28675     });
28676   }
28677   function mapToLanesObj(lanesObj, data, key) {
28678     if (data.forward) {
28679       data.forward.forEach(function(l, i2) {
28680         if (!lanesObj.forward[i2])
28681           lanesObj.forward[i2] = {};
28682         lanesObj.forward[i2][key] = l;
28683       });
28684     }
28685     if (data.backward) {
28686       data.backward.forEach(function(l, i2) {
28687         if (!lanesObj.backward[i2])
28688           lanesObj.backward[i2] = {};
28689         lanesObj.backward[i2][key] = l;
28690       });
28691     }
28692     if (data.unspecified) {
28693       data.unspecified.forEach(function(l, i2) {
28694         if (!lanesObj.unspecified[i2])
28695           lanesObj.unspecified[i2] = {};
28696         lanesObj.unspecified[i2][key] = l;
28697       });
28698     }
28699   }
28700
28701   // modules/osm/way.js
28702   function osmWay() {
28703     if (!(this instanceof osmWay)) {
28704       return new osmWay().initialize(arguments);
28705     } else if (arguments.length) {
28706       this.initialize(arguments);
28707     }
28708   }
28709   osmEntity.way = osmWay;
28710   osmWay.prototype = Object.create(osmEntity.prototype);
28711   Object.assign(osmWay.prototype, {
28712     type: "way",
28713     nodes: [],
28714     copy: function(resolver, copies) {
28715       if (copies[this.id])
28716         return copies[this.id];
28717       var copy2 = osmEntity.prototype.copy.call(this, resolver, copies);
28718       var nodes = this.nodes.map(function(id2) {
28719         return resolver.entity(id2).copy(resolver, copies).id;
28720       });
28721       copy2 = copy2.update({ nodes });
28722       copies[this.id] = copy2;
28723       return copy2;
28724     },
28725     extent: function(resolver) {
28726       return resolver.transient(this, "extent", function() {
28727         var extent = geoExtent();
28728         for (var i2 = 0; i2 < this.nodes.length; i2++) {
28729           var node = resolver.hasEntity(this.nodes[i2]);
28730           if (node) {
28731             extent._extend(node.extent());
28732           }
28733         }
28734         return extent;
28735       });
28736     },
28737     first: function() {
28738       return this.nodes[0];
28739     },
28740     last: function() {
28741       return this.nodes[this.nodes.length - 1];
28742     },
28743     contains: function(node) {
28744       return this.nodes.indexOf(node) >= 0;
28745     },
28746     affix: function(node) {
28747       if (this.nodes[0] === node)
28748         return "prefix";
28749       if (this.nodes[this.nodes.length - 1] === node)
28750         return "suffix";
28751     },
28752     layer: function() {
28753       if (isFinite(this.tags.layer)) {
28754         return Math.max(-10, Math.min(+this.tags.layer, 10));
28755       }
28756       if (this.tags.covered === "yes")
28757         return -1;
28758       if (this.tags.location === "overground")
28759         return 1;
28760       if (this.tags.location === "underground")
28761         return -1;
28762       if (this.tags.location === "underwater")
28763         return -10;
28764       if (this.tags.power === "line")
28765         return 10;
28766       if (this.tags.power === "minor_line")
28767         return 10;
28768       if (this.tags.aerialway)
28769         return 10;
28770       if (this.tags.bridge)
28771         return 1;
28772       if (this.tags.cutting)
28773         return -1;
28774       if (this.tags.tunnel)
28775         return -1;
28776       if (this.tags.waterway)
28777         return -1;
28778       if (this.tags.man_made === "pipeline")
28779         return -10;
28780       if (this.tags.boundary)
28781         return -10;
28782       return 0;
28783     },
28784     // the approximate width of the line based on its tags except its `width` tag
28785     impliedLineWidthMeters: function() {
28786       var averageWidths = {
28787         highway: {
28788           // width is for single lane
28789           motorway: 5,
28790           motorway_link: 5,
28791           trunk: 4.5,
28792           trunk_link: 4.5,
28793           primary: 4,
28794           secondary: 4,
28795           tertiary: 4,
28796           primary_link: 4,
28797           secondary_link: 4,
28798           tertiary_link: 4,
28799           unclassified: 4,
28800           road: 4,
28801           living_street: 4,
28802           bus_guideway: 4,
28803           pedestrian: 4,
28804           residential: 3.5,
28805           service: 3.5,
28806           track: 3,
28807           cycleway: 2.5,
28808           bridleway: 2,
28809           corridor: 2,
28810           steps: 2,
28811           path: 1.5,
28812           footway: 1.5
28813         },
28814         railway: {
28815           // width includes ties and rail bed, not just track gauge
28816           rail: 2.5,
28817           light_rail: 2.5,
28818           tram: 2.5,
28819           subway: 2.5,
28820           monorail: 2.5,
28821           funicular: 2.5,
28822           disused: 2.5,
28823           preserved: 2.5,
28824           miniature: 1.5,
28825           narrow_gauge: 1.5
28826         },
28827         waterway: {
28828           river: 50,
28829           canal: 25,
28830           stream: 5,
28831           tidal_channel: 5,
28832           fish_pass: 2.5,
28833           drain: 2.5,
28834           ditch: 1.5
28835         }
28836       };
28837       for (var key in averageWidths) {
28838         if (this.tags[key] && averageWidths[key][this.tags[key]]) {
28839           var width = averageWidths[key][this.tags[key]];
28840           if (key === "highway") {
28841             var laneCount = this.tags.lanes && parseInt(this.tags.lanes, 10);
28842             if (!laneCount)
28843               laneCount = this.isOneWay() ? 1 : 2;
28844             return width * laneCount;
28845           }
28846           return width;
28847         }
28848       }
28849       return null;
28850     },
28851     isOneWay: function() {
28852       var values = {
28853         "yes": true,
28854         "1": true,
28855         "-1": true,
28856         "reversible": true,
28857         "alternating": true,
28858         "no": false,
28859         "0": false
28860       };
28861       if (values[this.tags.oneway] !== void 0) {
28862         return values[this.tags.oneway];
28863       }
28864       for (var key in this.tags) {
28865         if (key in osmOneWayTags && this.tags[key] in osmOneWayTags[key]) {
28866           return true;
28867         }
28868       }
28869       return false;
28870     },
28871     // Some identifier for tag that implies that this way is "sided",
28872     // i.e. the right side is the 'inside' (e.g. the right side of a
28873     // natural=cliff is lower).
28874     sidednessIdentifier: function() {
28875       for (const realKey in this.tags) {
28876         const value = this.tags[realKey];
28877         const key = osmRemoveLifecyclePrefix(realKey);
28878         if (key in osmRightSideIsInsideTags && value in osmRightSideIsInsideTags[key]) {
28879           if (osmRightSideIsInsideTags[key][value] === true) {
28880             return key;
28881           } else {
28882             return osmRightSideIsInsideTags[key][value];
28883           }
28884         }
28885       }
28886       return null;
28887     },
28888     isSided: function() {
28889       if (this.tags.two_sided === "yes") {
28890         return false;
28891       }
28892       return this.sidednessIdentifier() !== null;
28893     },
28894     lanes: function() {
28895       return osmLanes(this);
28896     },
28897     isClosed: function() {
28898       return this.nodes.length > 1 && this.first() === this.last();
28899     },
28900     isConvex: function(resolver) {
28901       if (!this.isClosed() || this.isDegenerate())
28902         return null;
28903       var nodes = utilArrayUniq(resolver.childNodes(this));
28904       var coords = nodes.map(function(n2) {
28905         return n2.loc;
28906       });
28907       var curr = 0;
28908       var prev = 0;
28909       for (var i2 = 0; i2 < coords.length; i2++) {
28910         var o = coords[(i2 + 1) % coords.length];
28911         var a = coords[i2];
28912         var b = coords[(i2 + 2) % coords.length];
28913         var res = geoVecCross(a, b, o);
28914         curr = res > 0 ? 1 : res < 0 ? -1 : 0;
28915         if (curr === 0) {
28916           continue;
28917         } else if (prev && curr !== prev) {
28918           return false;
28919         }
28920         prev = curr;
28921       }
28922       return true;
28923     },
28924     // returns an object with the tag that implies this is an area, if any
28925     tagSuggestingArea: function() {
28926       return osmTagSuggestingArea(this.tags);
28927     },
28928     isArea: function() {
28929       if (this.tags.area === "yes")
28930         return true;
28931       if (!this.isClosed() || this.tags.area === "no")
28932         return false;
28933       return this.tagSuggestingArea() !== null;
28934     },
28935     isDegenerate: function() {
28936       return new Set(this.nodes).size < (this.isArea() ? 3 : 2);
28937     },
28938     areAdjacent: function(n1, n2) {
28939       for (var i2 = 0; i2 < this.nodes.length; i2++) {
28940         if (this.nodes[i2] === n1) {
28941           if (this.nodes[i2 - 1] === n2)
28942             return true;
28943           if (this.nodes[i2 + 1] === n2)
28944             return true;
28945         }
28946       }
28947       return false;
28948     },
28949     geometry: function(graph) {
28950       return graph.transient(this, "geometry", function() {
28951         return this.isArea() ? "area" : "line";
28952       });
28953     },
28954     // returns an array of objects representing the segments between the nodes in this way
28955     segments: function(graph) {
28956       function segmentExtent(graph2) {
28957         var n1 = graph2.hasEntity(this.nodes[0]);
28958         var n2 = graph2.hasEntity(this.nodes[1]);
28959         return n1 && n2 && geoExtent([
28960           [
28961             Math.min(n1.loc[0], n2.loc[0]),
28962             Math.min(n1.loc[1], n2.loc[1])
28963           ],
28964           [
28965             Math.max(n1.loc[0], n2.loc[0]),
28966             Math.max(n1.loc[1], n2.loc[1])
28967           ]
28968         ]);
28969       }
28970       return graph.transient(this, "segments", function() {
28971         var segments = [];
28972         for (var i2 = 0; i2 < this.nodes.length - 1; i2++) {
28973           segments.push({
28974             id: this.id + "-" + i2,
28975             wayId: this.id,
28976             index: i2,
28977             nodes: [this.nodes[i2], this.nodes[i2 + 1]],
28978             extent: segmentExtent
28979           });
28980         }
28981         return segments;
28982       });
28983     },
28984     // If this way is not closed, append the beginning node to the end of the nodelist to close it.
28985     close: function() {
28986       if (this.isClosed() || !this.nodes.length)
28987         return this;
28988       var nodes = this.nodes.slice();
28989       nodes = nodes.filter(noRepeatNodes);
28990       nodes.push(nodes[0]);
28991       return this.update({ nodes });
28992     },
28993     // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
28994     unclose: function() {
28995       if (!this.isClosed())
28996         return this;
28997       var nodes = this.nodes.slice();
28998       var connector = this.first();
28999       var i2 = nodes.length - 1;
29000       while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
29001         nodes.splice(i2, 1);
29002         i2 = nodes.length - 1;
29003       }
29004       nodes = nodes.filter(noRepeatNodes);
29005       return this.update({ nodes });
29006     },
29007     // Adds a node (id) in front of the node which is currently at position index.
29008     // If index is undefined, the node will be added to the end of the way for linear ways,
29009     //   or just before the final connecting node for circular ways.
29010     // Consecutive duplicates are eliminated including existing ones.
29011     // Circularity is always preserved when adding a node.
29012     addNode: function(id2, index) {
29013       var nodes = this.nodes.slice();
29014       var isClosed = this.isClosed();
29015       var max3 = isClosed ? nodes.length - 1 : nodes.length;
29016       if (index === void 0) {
29017         index = max3;
29018       }
29019       if (index < 0 || index > max3) {
29020         throw new RangeError("index " + index + " out of range 0.." + max3);
29021       }
29022       if (isClosed) {
29023         var connector = this.first();
29024         var i2 = 1;
29025         while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) {
29026           nodes.splice(i2, 1);
29027           if (index > i2)
29028             index--;
29029         }
29030         i2 = nodes.length - 1;
29031         while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
29032           nodes.splice(i2, 1);
29033           if (index > i2)
29034             index--;
29035           i2 = nodes.length - 1;
29036         }
29037       }
29038       nodes.splice(index, 0, id2);
29039       nodes = nodes.filter(noRepeatNodes);
29040       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
29041         nodes.push(nodes[0]);
29042       }
29043       return this.update({ nodes });
29044     },
29045     // Replaces the node which is currently at position index with the given node (id).
29046     // Consecutive duplicates are eliminated including existing ones.
29047     // Circularity is preserved when updating a node.
29048     updateNode: function(id2, index) {
29049       var nodes = this.nodes.slice();
29050       var isClosed = this.isClosed();
29051       var max3 = nodes.length - 1;
29052       if (index === void 0 || index < 0 || index > max3) {
29053         throw new RangeError("index " + index + " out of range 0.." + max3);
29054       }
29055       if (isClosed) {
29056         var connector = this.first();
29057         var i2 = 1;
29058         while (i2 < nodes.length && nodes.length > 2 && nodes[i2] === connector) {
29059           nodes.splice(i2, 1);
29060           if (index > i2)
29061             index--;
29062         }
29063         i2 = nodes.length - 1;
29064         while (i2 > 0 && nodes.length > 1 && nodes[i2] === connector) {
29065           nodes.splice(i2, 1);
29066           if (index === i2)
29067             index = 0;
29068           i2 = nodes.length - 1;
29069         }
29070       }
29071       nodes.splice(index, 1, id2);
29072       nodes = nodes.filter(noRepeatNodes);
29073       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
29074         nodes.push(nodes[0]);
29075       }
29076       return this.update({ nodes });
29077     },
29078     // Replaces each occurrence of node id needle with replacement.
29079     // Consecutive duplicates are eliminated including existing ones.
29080     // Circularity is preserved.
29081     replaceNode: function(needleID, replacementID) {
29082       var nodes = this.nodes.slice();
29083       var isClosed = this.isClosed();
29084       for (var i2 = 0; i2 < nodes.length; i2++) {
29085         if (nodes[i2] === needleID) {
29086           nodes[i2] = replacementID;
29087         }
29088       }
29089       nodes = nodes.filter(noRepeatNodes);
29090       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
29091         nodes.push(nodes[0]);
29092       }
29093       return this.update({ nodes });
29094     },
29095     // Removes each occurrence of node id.
29096     // Consecutive duplicates are eliminated including existing ones.
29097     // Circularity is preserved.
29098     removeNode: function(id2) {
29099       var nodes = this.nodes.slice();
29100       var isClosed = this.isClosed();
29101       nodes = nodes.filter(function(node) {
29102         return node !== id2;
29103       }).filter(noRepeatNodes);
29104       if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
29105         nodes.push(nodes[0]);
29106       }
29107       return this.update({ nodes });
29108     },
29109     asJXON: function(changeset_id) {
29110       var r = {
29111         way: {
29112           "@id": this.osmId(),
29113           "@version": this.version || 0,
29114           nd: this.nodes.map(function(id2) {
29115             return { keyAttributes: { ref: osmEntity.id.toOSM(id2) } };
29116           }, this),
29117           tag: Object.keys(this.tags).map(function(k) {
29118             return { keyAttributes: { k, v: this.tags[k] } };
29119           }, this)
29120         }
29121       };
29122       if (changeset_id) {
29123         r.way["@changeset"] = changeset_id;
29124       }
29125       return r;
29126     },
29127     asGeoJSON: function(resolver) {
29128       return resolver.transient(this, "GeoJSON", function() {
29129         var coordinates = resolver.childNodes(this).map(function(n2) {
29130           return n2.loc;
29131         });
29132         if (this.isArea() && this.isClosed()) {
29133           return {
29134             type: "Polygon",
29135             coordinates: [coordinates]
29136           };
29137         } else {
29138           return {
29139             type: "LineString",
29140             coordinates
29141           };
29142         }
29143       });
29144     },
29145     area: function(resolver) {
29146       return resolver.transient(this, "area", function() {
29147         var nodes = resolver.childNodes(this);
29148         var json = {
29149           type: "Polygon",
29150           coordinates: [nodes.map(function(n2) {
29151             return n2.loc;
29152           })]
29153         };
29154         if (!this.isClosed() && nodes.length) {
29155           json.coordinates[0].push(nodes[0].loc);
29156         }
29157         var area = area_default(json);
29158         if (area > 2 * Math.PI) {
29159           json.coordinates[0] = json.coordinates[0].reverse();
29160           area = area_default(json);
29161         }
29162         return isNaN(area) ? 0 : area;
29163       });
29164     }
29165   });
29166   function noRepeatNodes(node, i2, arr) {
29167     return i2 === 0 || node !== arr[i2 - 1];
29168   }
29169
29170   // modules/osm/multipolygon.js
29171   function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
29172     if (entity.type !== "relation" || !entity.isMultipolygon() || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
29173       return false;
29174     }
29175     var outerMember;
29176     for (var memberIndex in entity.members) {
29177       var member = entity.members[memberIndex];
29178       if (!member.role || member.role === "outer") {
29179         if (outerMember)
29180           return false;
29181         if (member.type !== "way")
29182           return false;
29183         if (!graph.hasEntity(member.id))
29184           return false;
29185         outerMember = graph.entity(member.id);
29186         if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
29187           return false;
29188         }
29189       }
29190     }
29191     return outerMember;
29192   }
29193   function osmIsOldMultipolygonOuterMember(entity, graph) {
29194     if (entity.type !== "way" || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0) {
29195       return false;
29196     }
29197     var parents = graph.parentRelations(entity);
29198     if (parents.length !== 1)
29199       return false;
29200     var parent = parents[0];
29201     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
29202       return false;
29203     }
29204     var members = parent.members, member;
29205     for (var i2 = 0; i2 < members.length; i2++) {
29206       member = members[i2];
29207       if (member.id === entity.id && member.role && member.role !== "outer") {
29208         return false;
29209       }
29210       if (member.id !== entity.id && (!member.role || member.role === "outer")) {
29211         return false;
29212       }
29213     }
29214     return parent;
29215   }
29216   function osmOldMultipolygonOuterMember(entity, graph) {
29217     if (entity.type !== "way")
29218       return false;
29219     var parents = graph.parentRelations(entity);
29220     if (parents.length !== 1)
29221       return false;
29222     var parent = parents[0];
29223     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1) {
29224       return false;
29225     }
29226     var members = parent.members, member, outerMember;
29227     for (var i2 = 0; i2 < members.length; i2++) {
29228       member = members[i2];
29229       if (!member.role || member.role === "outer") {
29230         if (outerMember)
29231           return false;
29232         outerMember = member;
29233       }
29234     }
29235     if (!outerMember)
29236       return false;
29237     var outerEntity = graph.hasEntity(outerMember.id);
29238     if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length) {
29239       return false;
29240     }
29241     return outerEntity;
29242   }
29243   function osmJoinWays(toJoin, graph) {
29244     function resolve(member) {
29245       return graph.childNodes(graph.entity(member.id));
29246     }
29247     function reverse(item2) {
29248       var action = actionReverse(item2.id, { reverseOneway: true });
29249       sequences.actions.push(action);
29250       return item2 instanceof osmWay ? action(graph).entity(item2.id) : item2;
29251     }
29252     toJoin = toJoin.filter(function(member) {
29253       return member.type === "way" && graph.hasEntity(member.id);
29254     });
29255     var i2;
29256     var joinAsMembers = true;
29257     for (i2 = 0; i2 < toJoin.length; i2++) {
29258       if (toJoin[i2] instanceof osmWay) {
29259         joinAsMembers = false;
29260         break;
29261       }
29262     }
29263     var sequences = [];
29264     sequences.actions = [];
29265     while (toJoin.length) {
29266       var item = toJoin.shift();
29267       var currWays = [item];
29268       var currNodes = resolve(item).slice();
29269       while (toJoin.length) {
29270         var start2 = currNodes[0];
29271         var end = currNodes[currNodes.length - 1];
29272         var fn = null;
29273         var nodes = null;
29274         for (i2 = 0; i2 < toJoin.length; i2++) {
29275           item = toJoin[i2];
29276           nodes = resolve(item);
29277           if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end && (nodes[nodes.length - 1] === start2 || nodes[0] === start2)) {
29278             currWays[0] = reverse(currWays[0]);
29279             currNodes.reverse();
29280             start2 = currNodes[0];
29281             end = currNodes[currNodes.length - 1];
29282           }
29283           if (nodes[0] === end) {
29284             fn = currNodes.push;
29285             nodes = nodes.slice(1);
29286             break;
29287           } else if (nodes[nodes.length - 1] === end) {
29288             fn = currNodes.push;
29289             nodes = nodes.slice(0, -1).reverse();
29290             item = reverse(item);
29291             break;
29292           } else if (nodes[nodes.length - 1] === start2) {
29293             fn = currNodes.unshift;
29294             nodes = nodes.slice(0, -1);
29295             break;
29296           } else if (nodes[0] === start2) {
29297             fn = currNodes.unshift;
29298             nodes = nodes.slice(1).reverse();
29299             item = reverse(item);
29300             break;
29301           } else {
29302             fn = nodes = null;
29303           }
29304         }
29305         if (!nodes) {
29306           break;
29307         }
29308         fn.apply(currWays, [item]);
29309         fn.apply(currNodes, nodes);
29310         toJoin.splice(i2, 1);
29311       }
29312       currWays.nodes = currNodes;
29313       sequences.push(currWays);
29314     }
29315     return sequences;
29316   }
29317
29318   // modules/actions/add_member.js
29319   function actionAddMember(relationId, member, memberIndex, insertPair) {
29320     return function action(graph) {
29321       var relation = graph.entity(relationId);
29322       var isPTv2 = /stop|platform/.test(member.role);
29323       if ((isNaN(memberIndex) || insertPair) && member.type === "way" && !isPTv2) {
29324         graph = addWayMember(relation, graph);
29325       } else {
29326         if (isPTv2 && isNaN(memberIndex)) {
29327           memberIndex = 0;
29328         }
29329         graph = graph.replace(relation.addMember(member, memberIndex));
29330       }
29331       return graph;
29332     };
29333     function addWayMember(relation, graph) {
29334       var groups, tempWay, insertPairIsReversed, item, i2, j2, k;
29335       var PTv2members = [];
29336       var members = [];
29337       for (i2 = 0; i2 < relation.members.length; i2++) {
29338         var m = relation.members[i2];
29339         if (/stop|platform/.test(m.role)) {
29340           PTv2members.push(m);
29341         } else {
29342           members.push(m);
29343         }
29344       }
29345       relation = relation.update({ members });
29346       if (insertPair) {
29347         tempWay = osmWay({ id: "wTemp", nodes: insertPair.nodes });
29348         graph = graph.replace(tempWay);
29349         var tempMember = { id: tempWay.id, type: "way", role: member.role };
29350         var tempRelation = relation.replaceMember({ id: insertPair.originalID }, tempMember, true);
29351         groups = utilArrayGroupBy(tempRelation.members, "type");
29352         groups.way = groups.way || [];
29353         var originalWay = graph.entity(insertPair.originalID);
29354         var insertedWay = graph.entity(insertPair.insertedID);
29355         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];
29356       } else {
29357         groups = utilArrayGroupBy(relation.members, "type");
29358         groups.way = groups.way || [];
29359         groups.way.push(member);
29360       }
29361       members = withIndex(groups.way);
29362       var joined = osmJoinWays(members, graph);
29363       for (i2 = 0; i2 < joined.length; i2++) {
29364         var segment = joined[i2];
29365         var nodes = segment.nodes.slice();
29366         var startIndex = segment[0].index;
29367         for (j2 = 0; j2 < members.length; j2++) {
29368           if (members[j2].index === startIndex) {
29369             break;
29370           }
29371         }
29372         for (k = 0; k < segment.length; k++) {
29373           item = segment[k];
29374           var way = graph.entity(item.id);
29375           if (tempWay && item.id === tempWay.id) {
29376             var reverse = nodes[0].id !== insertPair.nodes[0] ^ insertPairIsReversed;
29377             if (reverse) {
29378               item.pair = [
29379                 { id: insertPair.insertedID, type: "way", role: item.role },
29380                 { id: insertPair.originalID, type: "way", role: item.role }
29381               ];
29382             } else {
29383               item.pair = [
29384                 { id: insertPair.originalID, type: "way", role: item.role },
29385                 { id: insertPair.insertedID, type: "way", role: item.role }
29386               ];
29387             }
29388           }
29389           if (k > 0) {
29390             if (j2 + k >= members.length || item.index !== members[j2 + k].index) {
29391               moveMember(members, item.index, j2 + k);
29392             }
29393           }
29394           nodes.splice(0, way.nodes.length - 1);
29395         }
29396       }
29397       if (tempWay) {
29398         graph = graph.remove(tempWay);
29399       }
29400       var wayMembers = [];
29401       for (i2 = 0; i2 < members.length; i2++) {
29402         item = members[i2];
29403         if (item.index === -1)
29404           continue;
29405         if (item.pair) {
29406           wayMembers.push(item.pair[0]);
29407           wayMembers.push(item.pair[1]);
29408         } else {
29409           wayMembers.push(utilObjectOmit(item, ["index"]));
29410         }
29411       }
29412       var newMembers = PTv2members.concat(groups.node || [], wayMembers, groups.relation || []);
29413       return graph.replace(relation.update({ members: newMembers }));
29414       function moveMember(arr, findIndex, toIndex) {
29415         var i3;
29416         for (i3 = 0; i3 < arr.length; i3++) {
29417           if (arr[i3].index === findIndex) {
29418             break;
29419           }
29420         }
29421         var item2 = Object.assign({}, arr[i3]);
29422         arr[i3].index = -1;
29423         item2.index = toIndex;
29424         arr.splice(toIndex, 0, item2);
29425       }
29426       function withIndex(arr) {
29427         var result = new Array(arr.length);
29428         for (var i3 = 0; i3 < arr.length; i3++) {
29429           result[i3] = Object.assign({}, arr[i3]);
29430           result[i3].index = i3;
29431         }
29432         return result;
29433       }
29434     }
29435   }
29436
29437   // modules/actions/add_midpoint.js
29438   function actionAddMidpoint(midpoint, node) {
29439     return function(graph) {
29440       graph = graph.replace(node.move(midpoint.loc));
29441       var parents = utilArrayIntersection(
29442         graph.parentWays(graph.entity(midpoint.edge[0])),
29443         graph.parentWays(graph.entity(midpoint.edge[1]))
29444       );
29445       parents.forEach(function(way) {
29446         for (var i2 = 0; i2 < way.nodes.length - 1; i2++) {
29447           if (geoEdgeEqual([way.nodes[i2], way.nodes[i2 + 1]], midpoint.edge)) {
29448             graph = graph.replace(graph.entity(way.id).addNode(node.id, i2 + 1));
29449             return;
29450           }
29451         }
29452       });
29453       return graph;
29454     };
29455   }
29456
29457   // modules/actions/add_vertex.js
29458   function actionAddVertex(wayId, nodeId, index) {
29459     return function(graph) {
29460       return graph.replace(graph.entity(wayId).addNode(nodeId, index));
29461     };
29462   }
29463
29464   // modules/actions/change_member.js
29465   function actionChangeMember(relationId, member, memberIndex) {
29466     return function(graph) {
29467       return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
29468     };
29469   }
29470
29471   // modules/actions/change_preset.js
29472   function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
29473     return function action(graph) {
29474       var entity = graph.entity(entityID);
29475       var geometry = entity.geometry(graph);
29476       var tags = entity.tags;
29477       const loc = entity.extent(graph).center();
29478       var preserveKeys;
29479       if (newPreset) {
29480         preserveKeys = [];
29481         if (newPreset.addTags) {
29482           preserveKeys = preserveKeys.concat(Object.keys(newPreset.addTags));
29483         }
29484         if (oldPreset && !oldPreset.id.startsWith(newPreset.id)) {
29485           newPreset.fields(loc).concat(newPreset.moreFields(loc)).filter((f2) => f2.matchGeometry(geometry)).map((f2) => f2.key).filter(Boolean).forEach((key) => preserveKeys.push(key));
29486         }
29487       }
29488       if (oldPreset)
29489         tags = oldPreset.unsetTags(tags, geometry, preserveKeys, false, loc);
29490       if (newPreset)
29491         tags = newPreset.setTags(tags, geometry, skipFieldDefaults, loc);
29492       return graph.replace(entity.update({ tags }));
29493     };
29494   }
29495
29496   // modules/actions/change_tags.js
29497   function actionChangeTags(entityId, tags) {
29498     return function(graph) {
29499       var entity = graph.entity(entityId);
29500       return graph.replace(entity.update({ tags }));
29501     };
29502   }
29503
29504   // modules/osm/node.js
29505   var cardinal = {
29506     north: 0,
29507     n: 0,
29508     northnortheast: 22,
29509     nne: 22,
29510     northeast: 45,
29511     ne: 45,
29512     eastnortheast: 67,
29513     ene: 67,
29514     east: 90,
29515     e: 90,
29516     eastsoutheast: 112,
29517     ese: 112,
29518     southeast: 135,
29519     se: 135,
29520     southsoutheast: 157,
29521     sse: 157,
29522     south: 180,
29523     s: 180,
29524     southsouthwest: 202,
29525     ssw: 202,
29526     southwest: 225,
29527     sw: 225,
29528     westsouthwest: 247,
29529     wsw: 247,
29530     west: 270,
29531     w: 270,
29532     westnorthwest: 292,
29533     wnw: 292,
29534     northwest: 315,
29535     nw: 315,
29536     northnorthwest: 337,
29537     nnw: 337
29538   };
29539   function osmNode() {
29540     if (!(this instanceof osmNode)) {
29541       return new osmNode().initialize(arguments);
29542     } else if (arguments.length) {
29543       this.initialize(arguments);
29544     }
29545   }
29546   osmEntity.node = osmNode;
29547   osmNode.prototype = Object.create(osmEntity.prototype);
29548   Object.assign(osmNode.prototype, {
29549     type: "node",
29550     loc: [9999, 9999],
29551     extent: function() {
29552       return new geoExtent(this.loc);
29553     },
29554     geometry: function(graph) {
29555       return graph.transient(this, "geometry", function() {
29556         return graph.isPoi(this) ? "point" : "vertex";
29557       });
29558     },
29559     move: function(loc) {
29560       return this.update({ loc });
29561     },
29562     isDegenerate: function() {
29563       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);
29564     },
29565     // Inspect tags and geometry to determine which direction(s) this node/vertex points
29566     directions: function(resolver, projection2) {
29567       var val;
29568       var i2;
29569       if (this.isHighwayIntersection(resolver) && (this.tags.stop || "").toLowerCase() === "all") {
29570         val = "all";
29571       } else {
29572         val = (this.tags.direction || "").toLowerCase();
29573         var re2 = /:direction$/i;
29574         var keys2 = Object.keys(this.tags);
29575         for (i2 = 0; i2 < keys2.length; i2++) {
29576           if (re2.test(keys2[i2])) {
29577             val = this.tags[keys2[i2]].toLowerCase();
29578             break;
29579           }
29580         }
29581       }
29582       if (val === "")
29583         return [];
29584       var values = val.split(";");
29585       var results = [];
29586       values.forEach(function(v) {
29587         if (cardinal[v] !== void 0) {
29588           v = cardinal[v];
29589         }
29590         if (v !== "" && !isNaN(+v)) {
29591           results.push(+v);
29592           return;
29593         }
29594         var lookBackward = this.tags["traffic_sign:backward"] || v === "backward" || v === "both" || v === "all";
29595         var lookForward = this.tags["traffic_sign:forward"] || v === "forward" || v === "both" || v === "all";
29596         if (!lookForward && !lookBackward)
29597           return;
29598         var nodeIds = {};
29599         resolver.parentWays(this).forEach(function(parent) {
29600           var nodes = parent.nodes;
29601           for (i2 = 0; i2 < nodes.length; i2++) {
29602             if (nodes[i2] === this.id) {
29603               if (lookForward && i2 > 0) {
29604                 nodeIds[nodes[i2 - 1]] = true;
29605               }
29606               if (lookBackward && i2 < nodes.length - 1) {
29607                 nodeIds[nodes[i2 + 1]] = true;
29608               }
29609             }
29610           }
29611         }, this);
29612         Object.keys(nodeIds).forEach(function(nodeId) {
29613           results.push(
29614             geoAngle(this, resolver.entity(nodeId), projection2) * (180 / Math.PI) + 90
29615           );
29616         }, this);
29617       }, this);
29618       return utilArrayUniq(results);
29619     },
29620     isCrossing: function() {
29621       return this.tags.highway === "crossing" || this.tags.railway && this.tags.railway.indexOf("crossing") !== -1;
29622     },
29623     isEndpoint: function(resolver) {
29624       return resolver.transient(this, "isEndpoint", function() {
29625         var id2 = this.id;
29626         return resolver.parentWays(this).filter(function(parent) {
29627           return !parent.isClosed() && !!parent.affix(id2);
29628         }).length > 0;
29629       });
29630     },
29631     isConnected: function(resolver) {
29632       return resolver.transient(this, "isConnected", function() {
29633         var parents = resolver.parentWays(this);
29634         if (parents.length > 1) {
29635           for (var i2 in parents) {
29636             if (parents[i2].geometry(resolver) === "line" && parents[i2].hasInterestingTags())
29637               return true;
29638           }
29639         } else if (parents.length === 1) {
29640           var way = parents[0];
29641           var nodes = way.nodes.slice();
29642           if (way.isClosed()) {
29643             nodes.pop();
29644           }
29645           return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
29646         }
29647         return false;
29648       });
29649     },
29650     parentIntersectionWays: function(resolver) {
29651       return resolver.transient(this, "parentIntersectionWays", function() {
29652         return resolver.parentWays(this).filter(function(parent) {
29653           return (parent.tags.highway || parent.tags.waterway || parent.tags.railway || parent.tags.aeroway) && parent.geometry(resolver) === "line";
29654         });
29655       });
29656     },
29657     isIntersection: function(resolver) {
29658       return this.parentIntersectionWays(resolver).length > 1;
29659     },
29660     isHighwayIntersection: function(resolver) {
29661       return resolver.transient(this, "isHighwayIntersection", function() {
29662         return resolver.parentWays(this).filter(function(parent) {
29663           return parent.tags.highway && parent.geometry(resolver) === "line";
29664         }).length > 1;
29665       });
29666     },
29667     isOnAddressLine: function(resolver) {
29668       return resolver.transient(this, "isOnAddressLine", function() {
29669         return resolver.parentWays(this).filter(function(parent) {
29670           return parent.tags.hasOwnProperty("addr:interpolation") && parent.geometry(resolver) === "line";
29671         }).length > 0;
29672       });
29673     },
29674     asJXON: function(changeset_id) {
29675       var r = {
29676         node: {
29677           "@id": this.osmId(),
29678           "@lon": this.loc[0],
29679           "@lat": this.loc[1],
29680           "@version": this.version || 0,
29681           tag: Object.keys(this.tags).map(function(k) {
29682             return { keyAttributes: { k, v: this.tags[k] } };
29683           }, this)
29684         }
29685       };
29686       if (changeset_id)
29687         r.node["@changeset"] = changeset_id;
29688       return r;
29689     },
29690     asGeoJSON: function() {
29691       return {
29692         type: "Point",
29693         coordinates: this.loc
29694       };
29695     }
29696   });
29697
29698   // modules/actions/circularize.js
29699   function actionCircularize(wayId, projection2, maxAngle) {
29700     maxAngle = (maxAngle || 20) * Math.PI / 180;
29701     var action = function(graph, t) {
29702       if (t === null || !isFinite(t))
29703         t = 1;
29704       t = Math.min(Math.max(+t, 0), 1);
29705       var way = graph.entity(wayId);
29706       var origNodes = {};
29707       graph.childNodes(way).forEach(function(node2) {
29708         if (!origNodes[node2.id])
29709           origNodes[node2.id] = node2;
29710       });
29711       if (!way.isConvex(graph)) {
29712         graph = action.makeConvex(graph);
29713       }
29714       var nodes = utilArrayUniq(graph.childNodes(way));
29715       var keyNodes = nodes.filter(function(n2) {
29716         return graph.parentWays(n2).length !== 1;
29717       });
29718       var points = nodes.map(function(n2) {
29719         return projection2(n2.loc);
29720       });
29721       var keyPoints = keyNodes.map(function(n2) {
29722         return projection2(n2.loc);
29723       });
29724       var centroid = points.length === 2 ? geoVecInterp(points[0], points[1], 0.5) : centroid_default2(points);
29725       var radius = median(points, function(p) {
29726         return geoVecLength(centroid, p);
29727       });
29728       var sign2 = area_default3(points) > 0 ? 1 : -1;
29729       var ids, i2, j2, k;
29730       if (!keyNodes.length) {
29731         keyNodes = [nodes[0]];
29732         keyPoints = [points[0]];
29733       }
29734       if (keyNodes.length === 1) {
29735         var index = nodes.indexOf(keyNodes[0]);
29736         var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
29737         keyNodes.push(nodes[oppositeIndex]);
29738         keyPoints.push(points[oppositeIndex]);
29739       }
29740       for (i2 = 0; i2 < keyPoints.length; i2++) {
29741         var nextKeyNodeIndex = (i2 + 1) % keyNodes.length;
29742         var startNode = keyNodes[i2];
29743         var endNode = keyNodes[nextKeyNodeIndex];
29744         var startNodeIndex = nodes.indexOf(startNode);
29745         var endNodeIndex = nodes.indexOf(endNode);
29746         var numberNewPoints = -1;
29747         var indexRange = endNodeIndex - startNodeIndex;
29748         var nearNodes = {};
29749         var inBetweenNodes = [];
29750         var startAngle, endAngle, totalAngle, eachAngle;
29751         var angle2, loc, node, origNode;
29752         if (indexRange < 0) {
29753           indexRange += nodes.length;
29754         }
29755         var distance = geoVecLength(centroid, keyPoints[i2]) || 1e-4;
29756         keyPoints[i2] = [
29757           centroid[0] + (keyPoints[i2][0] - centroid[0]) / distance * radius,
29758           centroid[1] + (keyPoints[i2][1] - centroid[1]) / distance * radius
29759         ];
29760         loc = projection2.invert(keyPoints[i2]);
29761         node = keyNodes[i2];
29762         origNode = origNodes[node.id];
29763         node = node.move(geoVecInterp(origNode.loc, loc, t));
29764         graph = graph.replace(node);
29765         startAngle = Math.atan2(keyPoints[i2][1] - centroid[1], keyPoints[i2][0] - centroid[0]);
29766         endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
29767         totalAngle = endAngle - startAngle;
29768         if (totalAngle * sign2 > 0) {
29769           totalAngle = -sign2 * (2 * Math.PI - Math.abs(totalAngle));
29770         }
29771         do {
29772           numberNewPoints++;
29773           eachAngle = totalAngle / (indexRange + numberNewPoints);
29774         } while (Math.abs(eachAngle) > maxAngle);
29775         for (j2 = 1; j2 < indexRange; j2++) {
29776           angle2 = startAngle + j2 * eachAngle;
29777           loc = projection2.invert([
29778             centroid[0] + Math.cos(angle2) * radius,
29779             centroid[1] + Math.sin(angle2) * radius
29780           ]);
29781           node = nodes[(j2 + startNodeIndex) % nodes.length];
29782           origNode = origNodes[node.id];
29783           nearNodes[node.id] = angle2;
29784           node = node.move(geoVecInterp(origNode.loc, loc, t));
29785           graph = graph.replace(node);
29786         }
29787         for (j2 = 0; j2 < numberNewPoints; j2++) {
29788           angle2 = startAngle + (indexRange + j2) * eachAngle;
29789           loc = projection2.invert([
29790             centroid[0] + Math.cos(angle2) * radius,
29791             centroid[1] + Math.sin(angle2) * radius
29792           ]);
29793           var min3 = Infinity;
29794           for (var nodeId in nearNodes) {
29795             var nearAngle = nearNodes[nodeId];
29796             var dist = Math.abs(nearAngle - angle2);
29797             if (dist < min3) {
29798               min3 = dist;
29799               origNode = origNodes[nodeId];
29800             }
29801           }
29802           node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
29803           graph = graph.replace(node);
29804           nodes.splice(endNodeIndex + j2, 0, node);
29805           inBetweenNodes.push(node.id);
29806         }
29807         if (indexRange === 1 && inBetweenNodes.length) {
29808           var startIndex1 = way.nodes.lastIndexOf(startNode.id);
29809           var endIndex1 = way.nodes.lastIndexOf(endNode.id);
29810           var wayDirection1 = endIndex1 - startIndex1;
29811           if (wayDirection1 < -1) {
29812             wayDirection1 = 1;
29813           }
29814           var parentWays = graph.parentWays(keyNodes[i2]);
29815           for (j2 = 0; j2 < parentWays.length; j2++) {
29816             var sharedWay = parentWays[j2];
29817             if (sharedWay === way)
29818               continue;
29819             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
29820               var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
29821               var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
29822               var wayDirection2 = endIndex2 - startIndex2;
29823               var insertAt = endIndex2;
29824               if (wayDirection2 < -1) {
29825                 wayDirection2 = 1;
29826               }
29827               if (wayDirection1 !== wayDirection2) {
29828                 inBetweenNodes.reverse();
29829                 insertAt = startIndex2;
29830               }
29831               for (k = 0; k < inBetweenNodes.length; k++) {
29832                 sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
29833               }
29834               graph = graph.replace(sharedWay);
29835             }
29836           }
29837         }
29838       }
29839       ids = nodes.map(function(n2) {
29840         return n2.id;
29841       });
29842       ids.push(ids[0]);
29843       way = way.update({ nodes: ids });
29844       graph = graph.replace(way);
29845       return graph;
29846     };
29847     action.makeConvex = function(graph) {
29848       var way = graph.entity(wayId);
29849       var nodes = utilArrayUniq(graph.childNodes(way));
29850       var points = nodes.map(function(n2) {
29851         return projection2(n2.loc);
29852       });
29853       var sign2 = area_default3(points) > 0 ? 1 : -1;
29854       var hull = hull_default(points);
29855       var i2, j2;
29856       if (sign2 === -1) {
29857         nodes.reverse();
29858         points.reverse();
29859       }
29860       for (i2 = 0; i2 < hull.length - 1; i2++) {
29861         var startIndex = points.indexOf(hull[i2]);
29862         var endIndex = points.indexOf(hull[i2 + 1]);
29863         var indexRange = endIndex - startIndex;
29864         if (indexRange < 0) {
29865           indexRange += nodes.length;
29866         }
29867         for (j2 = 1; j2 < indexRange; j2++) {
29868           var point2 = geoVecInterp(hull[i2], hull[i2 + 1], j2 / indexRange);
29869           var node = nodes[(j2 + startIndex) % nodes.length].move(projection2.invert(point2));
29870           graph = graph.replace(node);
29871         }
29872       }
29873       return graph;
29874     };
29875     action.disabled = function(graph) {
29876       if (!graph.entity(wayId).isClosed()) {
29877         return "not_closed";
29878       }
29879       var way = graph.entity(wayId);
29880       var nodes = utilArrayUniq(graph.childNodes(way));
29881       var points = nodes.map(function(n2) {
29882         return projection2(n2.loc);
29883       });
29884       var hull = hull_default(points);
29885       var epsilonAngle = Math.PI / 180;
29886       if (hull.length !== points.length || hull.length < 3) {
29887         return false;
29888       }
29889       var centroid = centroid_default2(points);
29890       var radius = geoVecLengthSquare(centroid, points[0]);
29891       var i2, actualPoint;
29892       for (i2 = 0; i2 < hull.length; i2++) {
29893         actualPoint = hull[i2];
29894         var actualDist = geoVecLengthSquare(actualPoint, centroid);
29895         var diff = Math.abs(actualDist - radius);
29896         if (diff > 0.05 * radius) {
29897           return false;
29898         }
29899       }
29900       for (i2 = 0; i2 < hull.length; i2++) {
29901         actualPoint = hull[i2];
29902         var nextPoint = hull[(i2 + 1) % hull.length];
29903         var startAngle = Math.atan2(actualPoint[1] - centroid[1], actualPoint[0] - centroid[0]);
29904         var endAngle = Math.atan2(nextPoint[1] - centroid[1], nextPoint[0] - centroid[0]);
29905         var angle2 = endAngle - startAngle;
29906         if (angle2 < 0) {
29907           angle2 = -angle2;
29908         }
29909         if (angle2 > Math.PI) {
29910           angle2 = 2 * Math.PI - angle2;
29911         }
29912         if (angle2 > maxAngle + epsilonAngle) {
29913           return false;
29914         }
29915       }
29916       return "already_circular";
29917     };
29918     action.transitionable = true;
29919     return action;
29920   }
29921
29922   // modules/actions/delete_way.js
29923   function actionDeleteWay(wayID) {
29924     function canDeleteNode(node, graph) {
29925       if (graph.parentWays(node).length || graph.parentRelations(node).length)
29926         return false;
29927       var geometries = osmNodeGeometriesForTags(node.tags);
29928       if (geometries.point)
29929         return false;
29930       if (geometries.vertex)
29931         return true;
29932       return !node.hasInterestingTags();
29933     }
29934     var action = function(graph) {
29935       var way = graph.entity(wayID);
29936       graph.parentRelations(way).forEach(function(parent) {
29937         parent = parent.removeMembersWithID(wayID);
29938         graph = graph.replace(parent);
29939         if (parent.isDegenerate()) {
29940           graph = actionDeleteRelation(parent.id)(graph);
29941         }
29942       });
29943       new Set(way.nodes).forEach(function(nodeID) {
29944         graph = graph.replace(way.removeNode(nodeID));
29945         var node = graph.entity(nodeID);
29946         if (canDeleteNode(node, graph)) {
29947           graph = graph.remove(node);
29948         }
29949       });
29950       return graph.remove(way);
29951     };
29952     return action;
29953   }
29954
29955   // modules/actions/delete_multiple.js
29956   function actionDeleteMultiple(ids) {
29957     var actions = {
29958       way: actionDeleteWay,
29959       node: actionDeleteNode,
29960       relation: actionDeleteRelation
29961     };
29962     var action = function(graph) {
29963       ids.forEach(function(id2) {
29964         if (graph.hasEntity(id2)) {
29965           graph = actions[graph.entity(id2).type](id2)(graph);
29966         }
29967       });
29968       return graph;
29969     };
29970     return action;
29971   }
29972
29973   // modules/actions/delete_relation.js
29974   function actionDeleteRelation(relationID, allowUntaggedMembers) {
29975     function canDeleteEntity(entity, graph) {
29976       return !graph.parentWays(entity).length && !graph.parentRelations(entity).length && (!entity.hasInterestingTags() && !allowUntaggedMembers);
29977     }
29978     var action = function(graph) {
29979       var relation = graph.entity(relationID);
29980       graph.parentRelations(relation).forEach(function(parent) {
29981         parent = parent.removeMembersWithID(relationID);
29982         graph = graph.replace(parent);
29983         if (parent.isDegenerate()) {
29984           graph = actionDeleteRelation(parent.id)(graph);
29985         }
29986       });
29987       var memberIDs = utilArrayUniq(relation.members.map(function(m) {
29988         return m.id;
29989       }));
29990       memberIDs.forEach(function(memberID) {
29991         graph = graph.replace(relation.removeMembersWithID(memberID));
29992         var entity = graph.entity(memberID);
29993         if (canDeleteEntity(entity, graph)) {
29994           graph = actionDeleteMultiple([memberID])(graph);
29995         }
29996       });
29997       return graph.remove(relation);
29998     };
29999     return action;
30000   }
30001
30002   // modules/actions/delete_node.js
30003   function actionDeleteNode(nodeId) {
30004     var action = function(graph) {
30005       var node = graph.entity(nodeId);
30006       graph.parentWays(node).forEach(function(parent) {
30007         parent = parent.removeNode(nodeId);
30008         graph = graph.replace(parent);
30009         if (parent.isDegenerate()) {
30010           graph = actionDeleteWay(parent.id)(graph);
30011         }
30012       });
30013       graph.parentRelations(node).forEach(function(parent) {
30014         parent = parent.removeMembersWithID(nodeId);
30015         graph = graph.replace(parent);
30016         if (parent.isDegenerate()) {
30017           graph = actionDeleteRelation(parent.id)(graph);
30018         }
30019       });
30020       return graph.remove(node);
30021     };
30022     return action;
30023   }
30024
30025   // modules/actions/connect.js
30026   function actionConnect(nodeIDs) {
30027     var action = function(graph) {
30028       var survivor;
30029       var node;
30030       var parents;
30031       var i2, j2;
30032       nodeIDs.reverse();
30033       var interestingIDs = [];
30034       for (i2 = 0; i2 < nodeIDs.length; i2++) {
30035         node = graph.entity(nodeIDs[i2]);
30036         if (node.hasInterestingTags()) {
30037           if (!node.isNew()) {
30038             interestingIDs.push(node.id);
30039           }
30040         }
30041       }
30042       survivor = graph.entity(utilOldestID(interestingIDs.length > 0 ? interestingIDs : nodeIDs));
30043       for (i2 = 0; i2 < nodeIDs.length; i2++) {
30044         node = graph.entity(nodeIDs[i2]);
30045         if (node.id === survivor.id)
30046           continue;
30047         parents = graph.parentWays(node);
30048         for (j2 = 0; j2 < parents.length; j2++) {
30049           graph = graph.replace(parents[j2].replaceNode(node.id, survivor.id));
30050         }
30051         parents = graph.parentRelations(node);
30052         for (j2 = 0; j2 < parents.length; j2++) {
30053           graph = graph.replace(parents[j2].replaceMember(node, survivor));
30054         }
30055         survivor = survivor.mergeTags(node.tags);
30056         graph = actionDeleteNode(node.id)(graph);
30057       }
30058       graph = graph.replace(survivor);
30059       parents = graph.parentWays(survivor);
30060       for (i2 = 0; i2 < parents.length; i2++) {
30061         if (parents[i2].isDegenerate()) {
30062           graph = actionDeleteWay(parents[i2].id)(graph);
30063         }
30064       }
30065       return graph;
30066     };
30067     action.disabled = function(graph) {
30068       var seen = {};
30069       var restrictionIDs = [];
30070       var survivor;
30071       var node, way;
30072       var relations, relation, role;
30073       var i2, j2, k;
30074       survivor = graph.entity(utilOldestID(nodeIDs));
30075       for (i2 = 0; i2 < nodeIDs.length; i2++) {
30076         node = graph.entity(nodeIDs[i2]);
30077         relations = graph.parentRelations(node);
30078         for (j2 = 0; j2 < relations.length; j2++) {
30079           relation = relations[j2];
30080           role = relation.memberById(node.id).role || "";
30081           if (relation.hasFromViaTo()) {
30082             restrictionIDs.push(relation.id);
30083           }
30084           if (seen[relation.id] !== void 0 && seen[relation.id] !== role) {
30085             return "relation";
30086           } else {
30087             seen[relation.id] = role;
30088           }
30089         }
30090       }
30091       for (i2 = 0; i2 < nodeIDs.length; i2++) {
30092         node = graph.entity(nodeIDs[i2]);
30093         var parents = graph.parentWays(node);
30094         for (j2 = 0; j2 < parents.length; j2++) {
30095           var parent = parents[j2];
30096           relations = graph.parentRelations(parent);
30097           for (k = 0; k < relations.length; k++) {
30098             relation = relations[k];
30099             if (relation.hasFromViaTo()) {
30100               restrictionIDs.push(relation.id);
30101             }
30102           }
30103         }
30104       }
30105       restrictionIDs = utilArrayUniq(restrictionIDs);
30106       for (i2 = 0; i2 < restrictionIDs.length; i2++) {
30107         relation = graph.entity(restrictionIDs[i2]);
30108         if (!relation.isComplete(graph))
30109           continue;
30110         var memberWays = relation.members.filter(function(m) {
30111           return m.type === "way";
30112         }).map(function(m) {
30113           return graph.entity(m.id);
30114         });
30115         memberWays = utilArrayUniq(memberWays);
30116         var f2 = relation.memberByRole("from");
30117         var t = relation.memberByRole("to");
30118         var isUturn = f2.id === t.id;
30119         var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
30120         for (j2 = 0; j2 < relation.members.length; j2++) {
30121           collectNodes(relation.members[j2], nodes);
30122         }
30123         nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
30124         nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
30125         var filter2 = keyNodeFilter(nodes.keyfrom, nodes.keyto);
30126         nodes.from = nodes.from.filter(filter2);
30127         nodes.via = nodes.via.filter(filter2);
30128         nodes.to = nodes.to.filter(filter2);
30129         var connectFrom = false;
30130         var connectVia = false;
30131         var connectTo = false;
30132         var connectKeyFrom = false;
30133         var connectKeyTo = false;
30134         for (j2 = 0; j2 < nodeIDs.length; j2++) {
30135           var n2 = nodeIDs[j2];
30136           if (nodes.from.indexOf(n2) !== -1) {
30137             connectFrom = true;
30138           }
30139           if (nodes.via.indexOf(n2) !== -1) {
30140             connectVia = true;
30141           }
30142           if (nodes.to.indexOf(n2) !== -1) {
30143             connectTo = true;
30144           }
30145           if (nodes.keyfrom.indexOf(n2) !== -1) {
30146             connectKeyFrom = true;
30147           }
30148           if (nodes.keyto.indexOf(n2) !== -1) {
30149             connectKeyTo = true;
30150           }
30151         }
30152         if (connectFrom && connectTo && !isUturn) {
30153           return "restriction";
30154         }
30155         if (connectFrom && connectVia) {
30156           return "restriction";
30157         }
30158         if (connectTo && connectVia) {
30159           return "restriction";
30160         }
30161         if (connectKeyFrom || connectKeyTo) {
30162           if (nodeIDs.length !== 2) {
30163             return "restriction";
30164           }
30165           var n0 = null;
30166           var n1 = null;
30167           for (j2 = 0; j2 < memberWays.length; j2++) {
30168             way = memberWays[j2];
30169             if (way.contains(nodeIDs[0])) {
30170               n0 = nodeIDs[0];
30171             }
30172             if (way.contains(nodeIDs[1])) {
30173               n1 = nodeIDs[1];
30174             }
30175           }
30176           if (n0 && n1) {
30177             var ok = false;
30178             for (j2 = 0; j2 < memberWays.length; j2++) {
30179               way = memberWays[j2];
30180               if (way.areAdjacent(n0, n1)) {
30181                 ok = true;
30182                 break;
30183               }
30184             }
30185             if (!ok) {
30186               return "restriction";
30187             }
30188           }
30189         }
30190         for (j2 = 0; j2 < memberWays.length; j2++) {
30191           way = memberWays[j2].update({});
30192           for (k = 0; k < nodeIDs.length; k++) {
30193             if (nodeIDs[k] === survivor.id)
30194               continue;
30195             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
30196               way = way.removeNode(nodeIDs[k]);
30197             } else {
30198               way = way.replaceNode(nodeIDs[k], survivor.id);
30199             }
30200           }
30201           if (way.isDegenerate()) {
30202             return "restriction";
30203           }
30204         }
30205       }
30206       return false;
30207       function hasDuplicates(n3, i3, arr) {
30208         return arr.indexOf(n3) !== arr.lastIndexOf(n3);
30209       }
30210       function keyNodeFilter(froms, tos) {
30211         return function(n3) {
30212           return froms.indexOf(n3) === -1 && tos.indexOf(n3) === -1;
30213         };
30214       }
30215       function collectNodes(member, collection) {
30216         var entity = graph.hasEntity(member.id);
30217         if (!entity)
30218           return;
30219         var role2 = member.role || "";
30220         if (!collection[role2]) {
30221           collection[role2] = [];
30222         }
30223         if (member.type === "node") {
30224           collection[role2].push(member.id);
30225           if (role2 === "via") {
30226             collection.keyfrom.push(member.id);
30227             collection.keyto.push(member.id);
30228           }
30229         } else if (member.type === "way") {
30230           collection[role2].push.apply(collection[role2], entity.nodes);
30231           if (role2 === "from" || role2 === "via") {
30232             collection.keyfrom.push(entity.first());
30233             collection.keyfrom.push(entity.last());
30234           }
30235           if (role2 === "to" || role2 === "via") {
30236             collection.keyto.push(entity.first());
30237             collection.keyto.push(entity.last());
30238           }
30239         }
30240       }
30241     };
30242     return action;
30243   }
30244
30245   // modules/actions/copy_entities.js
30246   function actionCopyEntities(ids, fromGraph) {
30247     var _copies = {};
30248     var action = function(graph) {
30249       ids.forEach(function(id3) {
30250         fromGraph.entity(id3).copy(fromGraph, _copies);
30251       });
30252       for (var id2 in _copies) {
30253         graph = graph.replace(_copies[id2]);
30254       }
30255       return graph;
30256     };
30257     action.copies = function() {
30258       return _copies;
30259     };
30260     return action;
30261   }
30262
30263   // modules/actions/delete_member.js
30264   function actionDeleteMember(relationId, memberIndex) {
30265     return function(graph) {
30266       var relation = graph.entity(relationId).removeMember(memberIndex);
30267       graph = graph.replace(relation);
30268       if (relation.isDegenerate()) {
30269         graph = actionDeleteRelation(relation.id)(graph);
30270       }
30271       return graph;
30272     };
30273   }
30274
30275   // modules/actions/discard_tags.js
30276   function actionDiscardTags(difference, discardTags) {
30277     discardTags = discardTags || {};
30278     return (graph) => {
30279       difference.modified().forEach(checkTags);
30280       difference.created().forEach(checkTags);
30281       return graph;
30282       function checkTags(entity) {
30283         const keys2 = Object.keys(entity.tags);
30284         let didDiscard = false;
30285         let tags = {};
30286         for (let i2 = 0; i2 < keys2.length; i2++) {
30287           const k = keys2[i2];
30288           if (discardTags[k] || !entity.tags[k]) {
30289             didDiscard = true;
30290           } else {
30291             tags[k] = entity.tags[k];
30292           }
30293         }
30294         if (didDiscard) {
30295           graph = graph.replace(entity.update({ tags }));
30296         }
30297       }
30298     };
30299   }
30300
30301   // modules/actions/disconnect.js
30302   function actionDisconnect(nodeId, newNodeId) {
30303     var wayIds;
30304     var disconnectableRelationTypes = {
30305       "associatedStreet": true,
30306       "enforcement": true,
30307       "site": true
30308     };
30309     var action = function(graph) {
30310       var node = graph.entity(nodeId);
30311       var connections = action.connections(graph);
30312       connections.forEach(function(connection) {
30313         var way = graph.entity(connection.wayID);
30314         var newNode = osmNode({ id: newNodeId, loc: node.loc, tags: node.tags });
30315         graph = graph.replace(newNode);
30316         if (connection.index === 0 && way.isArea()) {
30317           graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
30318         } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
30319           graph = graph.replace(way.unclose().addNode(newNode.id));
30320         } else {
30321           graph = graph.replace(way.updateNode(newNode.id, connection.index));
30322         }
30323       });
30324       return graph;
30325     };
30326     action.connections = function(graph) {
30327       var candidates = [];
30328       var keeping = false;
30329       var parentWays = graph.parentWays(graph.entity(nodeId));
30330       var way, waynode;
30331       for (var i2 = 0; i2 < parentWays.length; i2++) {
30332         way = parentWays[i2];
30333         if (wayIds && wayIds.indexOf(way.id) === -1) {
30334           keeping = true;
30335           continue;
30336         }
30337         if (way.isArea() && way.nodes[0] === nodeId) {
30338           candidates.push({ wayID: way.id, index: 0 });
30339         } else {
30340           for (var j2 = 0; j2 < way.nodes.length; j2++) {
30341             waynode = way.nodes[j2];
30342             if (waynode === nodeId) {
30343               if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && j2 === way.nodes.length - 1) {
30344                 continue;
30345               }
30346               candidates.push({ wayID: way.id, index: j2 });
30347             }
30348           }
30349         }
30350       }
30351       return keeping ? candidates : candidates.slice(1);
30352     };
30353     action.disabled = function(graph) {
30354       var connections = action.connections(graph);
30355       if (connections.length === 0)
30356         return "not_connected";
30357       var parentWays = graph.parentWays(graph.entity(nodeId));
30358       var seenRelationIds = {};
30359       var sharedRelation;
30360       parentWays.forEach(function(way) {
30361         var relations = graph.parentRelations(way);
30362         relations.filter((relation) => !disconnectableRelationTypes[relation.tags.type]).forEach(function(relation) {
30363           if (relation.id in seenRelationIds) {
30364             if (wayIds) {
30365               if (wayIds.indexOf(way.id) !== -1 || wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
30366                 sharedRelation = relation;
30367               }
30368             } else {
30369               sharedRelation = relation;
30370             }
30371           } else {
30372             seenRelationIds[relation.id] = way.id;
30373           }
30374         });
30375       });
30376       if (sharedRelation)
30377         return "relation";
30378     };
30379     action.limitWays = function(val) {
30380       if (!arguments.length)
30381         return wayIds;
30382       wayIds = val;
30383       return action;
30384     };
30385     return action;
30386   }
30387
30388   // modules/actions/extract.js
30389   function actionExtract(entityID, projection2) {
30390     var extractedNodeID;
30391     var action = function(graph) {
30392       var entity = graph.entity(entityID);
30393       if (entity.type === "node") {
30394         return extractFromNode(entity, graph);
30395       }
30396       return extractFromWayOrRelation(entity, graph);
30397     };
30398     function extractFromNode(node, graph) {
30399       extractedNodeID = node.id;
30400       var replacement = osmNode({ loc: node.loc });
30401       graph = graph.replace(replacement);
30402       graph = graph.parentWays(node).reduce(function(accGraph, parentWay) {
30403         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
30404       }, graph);
30405       return graph.parentRelations(node).reduce(function(accGraph, parentRel) {
30406         return accGraph.replace(parentRel.replaceMember(node, replacement));
30407       }, graph);
30408     }
30409     function extractFromWayOrRelation(entity, graph) {
30410       var fromGeometry = entity.geometry(graph);
30411       var keysToCopyAndRetain = ["source", "wheelchair"];
30412       var keysToRetain = ["area"];
30413       var buildingKeysToRetain = ["architect", "building", "height", "layer"];
30414       var extractedLoc = path_default(projection2).centroid(entity.asGeoJSON(graph));
30415       extractedLoc = extractedLoc && projection2.invert(extractedLoc);
30416       if (!extractedLoc || !isFinite(extractedLoc[0]) || !isFinite(extractedLoc[1])) {
30417         extractedLoc = entity.extent(graph).center();
30418       }
30419       var indoorAreaValues = {
30420         area: true,
30421         corridor: true,
30422         elevator: true,
30423         level: true,
30424         room: true
30425       };
30426       var isBuilding = entity.tags.building && entity.tags.building !== "no" || entity.tags["building:part"] && entity.tags["building:part"] !== "no";
30427       var isIndoorArea = fromGeometry === "area" && entity.tags.indoor && indoorAreaValues[entity.tags.indoor];
30428       var entityTags = Object.assign({}, entity.tags);
30429       var pointTags = {};
30430       for (var key in entityTags) {
30431         if (entity.type === "relation" && key === "type") {
30432           continue;
30433         }
30434         if (keysToRetain.indexOf(key) !== -1) {
30435           continue;
30436         }
30437         if (isBuilding) {
30438           if (buildingKeysToRetain.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/))
30439             continue;
30440         }
30441         if (isIndoorArea && key === "indoor") {
30442           continue;
30443         }
30444         pointTags[key] = entityTags[key];
30445         if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
30446           continue;
30447         } else if (isIndoorArea && key === "level") {
30448           continue;
30449         }
30450         delete entityTags[key];
30451       }
30452       if (!isBuilding && !isIndoorArea && fromGeometry === "area") {
30453         entityTags.area = "yes";
30454       }
30455       var replacement = osmNode({ loc: extractedLoc, tags: pointTags });
30456       graph = graph.replace(replacement);
30457       extractedNodeID = replacement.id;
30458       return graph.replace(entity.update({ tags: entityTags }));
30459     }
30460     action.getExtractedNodeID = function() {
30461       return extractedNodeID;
30462     };
30463     return action;
30464   }
30465
30466   // modules/actions/join.js
30467   function actionJoin(ids) {
30468     function groupEntitiesByGeometry(graph) {
30469       var entities = ids.map(function(id2) {
30470         return graph.entity(id2);
30471       });
30472       return Object.assign(
30473         { line: [] },
30474         utilArrayGroupBy(entities, function(entity) {
30475           return entity.geometry(graph);
30476         })
30477       );
30478     }
30479     var action = function(graph) {
30480       var ways = ids.map(graph.entity, graph);
30481       var survivorID = utilOldestID(ways.map((way) => way.id));
30482       ways.sort(function(a, b) {
30483         var aSided = a.isSided();
30484         var bSided = b.isSided();
30485         return aSided && !bSided ? -1 : bSided && !aSided ? 1 : 0;
30486       });
30487       var sequences = osmJoinWays(ways, graph);
30488       var joined = sequences[0];
30489       graph = sequences.actions.reduce(function(g, action2) {
30490         return action2(g);
30491       }, graph);
30492       var survivor = graph.entity(survivorID);
30493       survivor = survivor.update({ nodes: joined.nodes.map(function(n2) {
30494         return n2.id;
30495       }) });
30496       graph = graph.replace(survivor);
30497       joined.forEach(function(way) {
30498         if (way.id === survivorID)
30499           return;
30500         graph.parentRelations(way).forEach(function(parent) {
30501           graph = graph.replace(parent.replaceMember(way, survivor));
30502         });
30503         survivor = survivor.mergeTags(way.tags);
30504         graph = graph.replace(survivor);
30505         graph = actionDeleteWay(way.id)(graph);
30506       });
30507       function checkForSimpleMultipolygon() {
30508         if (!survivor.isClosed())
30509           return;
30510         var multipolygons = graph.parentMultipolygons(survivor).filter(function(multipolygon2) {
30511           return multipolygon2.members.length === 1;
30512         });
30513         if (multipolygons.length !== 1)
30514           return;
30515         var multipolygon = multipolygons[0];
30516         for (var key in survivor.tags) {
30517           if (multipolygon.tags[key] && // don't collapse if tags cannot be cleanly merged
30518           multipolygon.tags[key] !== survivor.tags[key])
30519             return;
30520         }
30521         survivor = survivor.mergeTags(multipolygon.tags);
30522         graph = graph.replace(survivor);
30523         graph = actionDeleteRelation(
30524           multipolygon.id,
30525           true
30526           /* allow untagged members */
30527         )(graph);
30528         var tags = Object.assign({}, survivor.tags);
30529         if (survivor.geometry(graph) !== "area") {
30530           tags.area = "yes";
30531         }
30532         delete tags.type;
30533         survivor = survivor.update({ tags });
30534         graph = graph.replace(survivor);
30535       }
30536       checkForSimpleMultipolygon();
30537       return graph;
30538     };
30539     action.resultingWayNodesLength = function(graph) {
30540       return ids.reduce(function(count, id2) {
30541         return count + graph.entity(id2).nodes.length;
30542       }, 0) - ids.length - 1;
30543     };
30544     action.disabled = function(graph) {
30545       var geometries = groupEntitiesByGeometry(graph);
30546       if (ids.length < 2 || ids.length !== geometries.line.length) {
30547         return "not_eligible";
30548       }
30549       var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
30550       if (joined.length > 1) {
30551         return "not_adjacent";
30552       }
30553       var i2;
30554       var sortedParentRelations = function(id2) {
30555         return graph.parentRelations(graph.entity(id2)).filter((rel) => !rel.isRestriction() && !rel.isConnectivity()).sort((a, b) => a.id - b.id);
30556       };
30557       var relsA = sortedParentRelations(ids[0]);
30558       for (i2 = 1; i2 < ids.length; i2++) {
30559         var relsB = sortedParentRelations(ids[i2]);
30560         if (!utilArrayIdentical(relsA, relsB)) {
30561           return "conflicting_relations";
30562         }
30563       }
30564       for (i2 = 0; i2 < ids.length - 1; i2++) {
30565         for (var j2 = i2 + 1; j2 < ids.length; j2++) {
30566           var path1 = graph.childNodes(graph.entity(ids[i2])).map(function(e) {
30567             return e.loc;
30568           });
30569           var path2 = graph.childNodes(graph.entity(ids[j2])).map(function(e) {
30570             return e.loc;
30571           });
30572           var intersections = geoPathIntersections(path1, path2);
30573           var common = utilArrayIntersection(
30574             joined[0].nodes.map(function(n2) {
30575               return n2.loc.toString();
30576             }),
30577             intersections.map(function(n2) {
30578               return n2.toString();
30579             })
30580           );
30581           if (common.length !== intersections.length) {
30582             return "paths_intersect";
30583           }
30584         }
30585       }
30586       var nodeIds = joined[0].nodes.map(function(n2) {
30587         return n2.id;
30588       }).slice(1, -1);
30589       var relation;
30590       var tags = {};
30591       var conflicting = false;
30592       joined[0].forEach(function(way) {
30593         var parents = graph.parentRelations(way);
30594         parents.forEach(function(parent) {
30595           if ((parent.isRestriction() || parent.isConnectivity()) && parent.members.some(function(m) {
30596             return nodeIds.indexOf(m.id) >= 0;
30597           })) {
30598             relation = parent;
30599           }
30600         });
30601         for (var k in way.tags) {
30602           if (!(k in tags)) {
30603             tags[k] = way.tags[k];
30604           } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
30605             conflicting = true;
30606           }
30607         }
30608       });
30609       if (relation) {
30610         return relation.isRestriction() ? "restriction" : "connectivity";
30611       }
30612       if (conflicting) {
30613         return "conflicting_tags";
30614       }
30615     };
30616     return action;
30617   }
30618
30619   // modules/actions/merge.js
30620   function actionMerge(ids) {
30621     function groupEntitiesByGeometry(graph) {
30622       var entities = ids.map(function(id2) {
30623         return graph.entity(id2);
30624       });
30625       return Object.assign(
30626         { point: [], area: [], line: [], relation: [] },
30627         utilArrayGroupBy(entities, function(entity) {
30628           return entity.geometry(graph);
30629         })
30630       );
30631     }
30632     var action = function(graph) {
30633       var geometries = groupEntitiesByGeometry(graph);
30634       var target = geometries.area[0] || geometries.line[0];
30635       var points = geometries.point;
30636       points.forEach(function(point2) {
30637         target = target.mergeTags(point2.tags);
30638         graph = graph.replace(target);
30639         graph.parentRelations(point2).forEach(function(parent) {
30640           graph = graph.replace(parent.replaceMember(point2, target));
30641         });
30642         var nodes = utilArrayUniq(graph.childNodes(target));
30643         var removeNode = point2;
30644         if (!point2.isNew()) {
30645           var inserted = false;
30646           var canBeReplaced = function(node2) {
30647             return !(graph.parentWays(node2).length > 1 || graph.parentRelations(node2).length);
30648           };
30649           var replaceNode = function(node2) {
30650             graph = graph.replace(point2.update({ tags: node2.tags, loc: node2.loc }));
30651             target = target.replaceNode(node2.id, point2.id);
30652             graph = graph.replace(target);
30653             removeNode = node2;
30654             inserted = true;
30655           };
30656           var i2;
30657           var node;
30658           for (i2 = 0; i2 < nodes.length; i2++) {
30659             node = nodes[i2];
30660             if (canBeReplaced(node) && node.isNew()) {
30661               replaceNode(node);
30662               break;
30663             }
30664           }
30665           if (!inserted && point2.hasInterestingTags()) {
30666             for (i2 = 0; i2 < nodes.length; i2++) {
30667               node = nodes[i2];
30668               if (canBeReplaced(node) && !node.hasInterestingTags()) {
30669                 replaceNode(node);
30670                 break;
30671               }
30672             }
30673             if (!inserted) {
30674               for (i2 = 0; i2 < nodes.length; i2++) {
30675                 node = nodes[i2];
30676                 if (canBeReplaced(node) && utilCompareIDs(point2.id, node.id) < 0) {
30677                   replaceNode(node);
30678                   break;
30679                 }
30680               }
30681             }
30682           }
30683         }
30684         graph = graph.remove(removeNode);
30685       });
30686       if (target.tags.area === "yes") {
30687         var tags = Object.assign({}, target.tags);
30688         delete tags.area;
30689         if (osmTagSuggestingArea(tags)) {
30690           target = target.update({ tags });
30691           graph = graph.replace(target);
30692         }
30693       }
30694       return graph;
30695     };
30696     action.disabled = function(graph) {
30697       var geometries = groupEntitiesByGeometry(graph);
30698       if (geometries.point.length === 0 || geometries.area.length + geometries.line.length !== 1 || geometries.relation.length !== 0) {
30699         return "not_eligible";
30700       }
30701     };
30702     return action;
30703   }
30704
30705   // modules/actions/merge_nodes.js
30706   function actionMergeNodes(nodeIDs, loc) {
30707     function chooseLoc(graph) {
30708       if (!nodeIDs.length)
30709         return null;
30710       var sum = [0, 0];
30711       var interestingCount = 0;
30712       var interestingLoc;
30713       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
30714         var node = graph.entity(nodeIDs[i2]);
30715         if (node.hasInterestingTags()) {
30716           interestingLoc = ++interestingCount === 1 ? node.loc : null;
30717         }
30718         sum = geoVecAdd(sum, node.loc);
30719       }
30720       return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
30721     }
30722     var action = function(graph) {
30723       if (nodeIDs.length < 2)
30724         return graph;
30725       var toLoc = loc;
30726       if (!toLoc) {
30727         toLoc = chooseLoc(graph);
30728       }
30729       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
30730         var node = graph.entity(nodeIDs[i2]);
30731         if (node.loc !== toLoc) {
30732           graph = graph.replace(node.move(toLoc));
30733         }
30734       }
30735       return actionConnect(nodeIDs)(graph);
30736     };
30737     action.disabled = function(graph) {
30738       if (nodeIDs.length < 2)
30739         return "not_eligible";
30740       for (var i2 = 0; i2 < nodeIDs.length; i2++) {
30741         var entity = graph.entity(nodeIDs[i2]);
30742         if (entity.type !== "node")
30743           return "not_eligible";
30744       }
30745       return actionConnect(nodeIDs).disabled(graph);
30746     };
30747     return action;
30748   }
30749
30750   // modules/osm/changeset.js
30751   function osmChangeset() {
30752     if (!(this instanceof osmChangeset)) {
30753       return new osmChangeset().initialize(arguments);
30754     } else if (arguments.length) {
30755       this.initialize(arguments);
30756     }
30757   }
30758   osmEntity.changeset = osmChangeset;
30759   osmChangeset.prototype = Object.create(osmEntity.prototype);
30760   Object.assign(osmChangeset.prototype, {
30761     type: "changeset",
30762     extent: function() {
30763       return new geoExtent();
30764     },
30765     geometry: function() {
30766       return "changeset";
30767     },
30768     asJXON: function() {
30769       return {
30770         osm: {
30771           changeset: {
30772             tag: Object.keys(this.tags).map(function(k) {
30773               return { "@k": k, "@v": this.tags[k] };
30774             }, this),
30775             "@version": 0.6,
30776             "@generator": "iD"
30777           }
30778         }
30779       };
30780     },
30781     // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
30782     // XML. Returns a string.
30783     osmChangeJXON: function(changes) {
30784       var changeset_id = this.id;
30785       function nest(x, order) {
30786         var groups = {};
30787         for (var i2 = 0; i2 < x.length; i2++) {
30788           var tagName = Object.keys(x[i2])[0];
30789           if (!groups[tagName])
30790             groups[tagName] = [];
30791           groups[tagName].push(x[i2][tagName]);
30792         }
30793         var ordered = {};
30794         order.forEach(function(o) {
30795           if (groups[o])
30796             ordered[o] = groups[o];
30797         });
30798         return ordered;
30799       }
30800       function sort(changes2) {
30801         function resolve(item) {
30802           return relations.find(function(relation2) {
30803             return item.keyAttributes.type === "relation" && item.keyAttributes.ref === relation2["@id"];
30804           });
30805         }
30806         function isNew(item) {
30807           return !sorted[item["@id"]] && !processing.find(function(proc) {
30808             return proc["@id"] === item["@id"];
30809           });
30810         }
30811         var processing = [];
30812         var sorted = {};
30813         var relations = changes2.relation;
30814         if (!relations)
30815           return changes2;
30816         for (var i2 = 0; i2 < relations.length; i2++) {
30817           var relation = relations[i2];
30818           if (!sorted[relation["@id"]]) {
30819             processing.push(relation);
30820           }
30821           while (processing.length > 0) {
30822             var next = processing[0], deps = next.member.map(resolve).filter(Boolean).filter(isNew);
30823             if (deps.length === 0) {
30824               sorted[next["@id"]] = next;
30825               processing.shift();
30826             } else {
30827               processing = deps.concat(processing);
30828             }
30829           }
30830         }
30831         changes2.relation = Object.values(sorted);
30832         return changes2;
30833       }
30834       function rep2(entity) {
30835         return entity.asJXON(changeset_id);
30836       }
30837       return {
30838         osmChange: {
30839           "@version": 0.6,
30840           "@generator": "iD",
30841           "create": sort(nest(changes.created.map(rep2), ["node", "way", "relation"])),
30842           "modify": nest(changes.modified.map(rep2), ["node", "way", "relation"]),
30843           "delete": Object.assign(nest(changes.deleted.map(rep2), ["relation", "way", "node"]), { "@if-unused": true })
30844         }
30845       };
30846     },
30847     asGeoJSON: function() {
30848       return {};
30849     }
30850   });
30851
30852   // modules/osm/note.js
30853   function osmNote() {
30854     if (!(this instanceof osmNote)) {
30855       return new osmNote().initialize(arguments);
30856     } else if (arguments.length) {
30857       this.initialize(arguments);
30858     }
30859   }
30860   osmNote.id = function() {
30861     return osmNote.id.next--;
30862   };
30863   osmNote.id.next = -1;
30864   Object.assign(osmNote.prototype, {
30865     type: "note",
30866     initialize: function(sources) {
30867       for (var i2 = 0; i2 < sources.length; ++i2) {
30868         var source = sources[i2];
30869         for (var prop in source) {
30870           if (Object.prototype.hasOwnProperty.call(source, prop)) {
30871             if (source[prop] === void 0) {
30872               delete this[prop];
30873             } else {
30874               this[prop] = source[prop];
30875             }
30876           }
30877         }
30878       }
30879       if (!this.id) {
30880         this.id = osmNote.id().toString();
30881       }
30882       return this;
30883     },
30884     extent: function() {
30885       return new geoExtent(this.loc);
30886     },
30887     update: function(attrs) {
30888       return osmNote(this, attrs);
30889     },
30890     isNew: function() {
30891       return this.id < 0;
30892     },
30893     move: function(loc) {
30894       return this.update({ loc });
30895     }
30896   });
30897
30898   // modules/osm/relation.js
30899   function osmRelation() {
30900     if (!(this instanceof osmRelation)) {
30901       return new osmRelation().initialize(arguments);
30902     } else if (arguments.length) {
30903       this.initialize(arguments);
30904     }
30905   }
30906   osmEntity.relation = osmRelation;
30907   osmRelation.prototype = Object.create(osmEntity.prototype);
30908   osmRelation.creationOrder = function(a, b) {
30909     var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
30910     var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
30911     if (aId < 0 || bId < 0)
30912       return aId - bId;
30913     return bId - aId;
30914   };
30915   Object.assign(osmRelation.prototype, {
30916     type: "relation",
30917     members: [],
30918     copy: function(resolver, copies) {
30919       if (copies[this.id])
30920         return copies[this.id];
30921       var copy2 = osmEntity.prototype.copy.call(this, resolver, copies);
30922       var members = this.members.map(function(member) {
30923         return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
30924       });
30925       copy2 = copy2.update({ members });
30926       copies[this.id] = copy2;
30927       return copy2;
30928     },
30929     extent: function(resolver, memo) {
30930       return resolver.transient(this, "extent", function() {
30931         if (memo && memo[this.id])
30932           return geoExtent();
30933         memo = memo || {};
30934         memo[this.id] = true;
30935         var extent = geoExtent();
30936         for (var i2 = 0; i2 < this.members.length; i2++) {
30937           var member = resolver.hasEntity(this.members[i2].id);
30938           if (member) {
30939             extent._extend(member.extent(resolver, memo));
30940           }
30941         }
30942         return extent;
30943       });
30944     },
30945     geometry: function(graph) {
30946       return graph.transient(this, "geometry", function() {
30947         return this.isMultipolygon() ? "area" : "relation";
30948       });
30949     },
30950     isDegenerate: function() {
30951       return this.members.length === 0;
30952     },
30953     // Return an array of members, each extended with an 'index' property whose value
30954     // is the member index.
30955     indexedMembers: function() {
30956       var result = new Array(this.members.length);
30957       for (var i2 = 0; i2 < this.members.length; i2++) {
30958         result[i2] = Object.assign({}, this.members[i2], { index: i2 });
30959       }
30960       return result;
30961     },
30962     // Return the first member with the given role. A copy of the member object
30963     // is returned, extended with an 'index' property whose value is the member index.
30964     memberByRole: function(role) {
30965       for (var i2 = 0; i2 < this.members.length; i2++) {
30966         if (this.members[i2].role === role) {
30967           return Object.assign({}, this.members[i2], { index: i2 });
30968         }
30969       }
30970     },
30971     // Same as memberByRole, but returns all members with the given role
30972     membersByRole: function(role) {
30973       var result = [];
30974       for (var i2 = 0; i2 < this.members.length; i2++) {
30975         if (this.members[i2].role === role) {
30976           result.push(Object.assign({}, this.members[i2], { index: i2 }));
30977         }
30978       }
30979       return result;
30980     },
30981     // Return the first member with the given id. A copy of the member object
30982     // is returned, extended with an 'index' property whose value is the member index.
30983     memberById: function(id2) {
30984       for (var i2 = 0; i2 < this.members.length; i2++) {
30985         if (this.members[i2].id === id2) {
30986           return Object.assign({}, this.members[i2], { index: i2 });
30987         }
30988       }
30989     },
30990     // Return the first member with the given id and role. A copy of the member object
30991     // is returned, extended with an 'index' property whose value is the member index.
30992     memberByIdAndRole: function(id2, role) {
30993       for (var i2 = 0; i2 < this.members.length; i2++) {
30994         if (this.members[i2].id === id2 && this.members[i2].role === role) {
30995           return Object.assign({}, this.members[i2], { index: i2 });
30996         }
30997       }
30998     },
30999     addMember: function(member, index) {
31000       var members = this.members.slice();
31001       members.splice(index === void 0 ? members.length : index, 0, member);
31002       return this.update({ members });
31003     },
31004     updateMember: function(member, index) {
31005       var members = this.members.slice();
31006       members.splice(index, 1, Object.assign({}, members[index], member));
31007       return this.update({ members });
31008     },
31009     removeMember: function(index) {
31010       var members = this.members.slice();
31011       members.splice(index, 1);
31012       return this.update({ members });
31013     },
31014     removeMembersWithID: function(id2) {
31015       var members = this.members.filter(function(m) {
31016         return m.id !== id2;
31017       });
31018       return this.update({ members });
31019     },
31020     moveMember: function(fromIndex, toIndex) {
31021       var members = this.members.slice();
31022       members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
31023       return this.update({ members });
31024     },
31025     // Wherever a member appears with id `needle.id`, replace it with a member
31026     // with id `replacement.id`, type `replacement.type`, and the original role,
31027     // By default, adding a duplicate member (by id and role) is prevented.
31028     // Return an updated relation.
31029     replaceMember: function(needle, replacement, keepDuplicates) {
31030       if (!this.memberById(needle.id))
31031         return this;
31032       var members = [];
31033       for (var i2 = 0; i2 < this.members.length; i2++) {
31034         var member = this.members[i2];
31035         if (member.id !== needle.id) {
31036           members.push(member);
31037         } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
31038           members.push({ id: replacement.id, type: replacement.type, role: member.role });
31039         }
31040       }
31041       return this.update({ members });
31042     },
31043     asJXON: function(changeset_id) {
31044       var r = {
31045         relation: {
31046           "@id": this.osmId(),
31047           "@version": this.version || 0,
31048           member: this.members.map(function(member) {
31049             return {
31050               keyAttributes: {
31051                 type: member.type,
31052                 role: member.role,
31053                 ref: osmEntity.id.toOSM(member.id)
31054               }
31055             };
31056           }, this),
31057           tag: Object.keys(this.tags).map(function(k) {
31058             return { keyAttributes: { k, v: this.tags[k] } };
31059           }, this)
31060         }
31061       };
31062       if (changeset_id) {
31063         r.relation["@changeset"] = changeset_id;
31064       }
31065       return r;
31066     },
31067     asGeoJSON: function(resolver) {
31068       return resolver.transient(this, "GeoJSON", function() {
31069         if (this.isMultipolygon()) {
31070           return {
31071             type: "MultiPolygon",
31072             coordinates: this.multipolygon(resolver)
31073           };
31074         } else {
31075           return {
31076             type: "FeatureCollection",
31077             properties: this.tags,
31078             features: this.members.map(function(member) {
31079               return Object.assign({ role: member.role }, resolver.entity(member.id).asGeoJSON(resolver));
31080             })
31081           };
31082         }
31083       });
31084     },
31085     area: function(resolver) {
31086       return resolver.transient(this, "area", function() {
31087         return area_default(this.asGeoJSON(resolver));
31088       });
31089     },
31090     isMultipolygon: function() {
31091       return this.tags.type === "multipolygon";
31092     },
31093     isComplete: function(resolver) {
31094       for (var i2 = 0; i2 < this.members.length; i2++) {
31095         if (!resolver.hasEntity(this.members[i2].id)) {
31096           return false;
31097         }
31098       }
31099       return true;
31100     },
31101     hasFromViaTo: function() {
31102       return this.members.some(function(m) {
31103         return m.role === "from";
31104       }) && this.members.some(function(m) {
31105         return m.role === "via";
31106       }) && this.members.some(function(m) {
31107         return m.role === "to";
31108       });
31109     },
31110     isRestriction: function() {
31111       return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
31112     },
31113     isValidRestriction: function() {
31114       if (!this.isRestriction())
31115         return false;
31116       var froms = this.members.filter(function(m) {
31117         return m.role === "from";
31118       });
31119       var vias = this.members.filter(function(m) {
31120         return m.role === "via";
31121       });
31122       var tos = this.members.filter(function(m) {
31123         return m.role === "to";
31124       });
31125       if (froms.length !== 1 && this.tags.restriction !== "no_entry")
31126         return false;
31127       if (froms.some(function(m) {
31128         return m.type !== "way";
31129       }))
31130         return false;
31131       if (tos.length !== 1 && this.tags.restriction !== "no_exit")
31132         return false;
31133       if (tos.some(function(m) {
31134         return m.type !== "way";
31135       }))
31136         return false;
31137       if (vias.length === 0)
31138         return false;
31139       if (vias.length > 1 && vias.some(function(m) {
31140         return m.type !== "way";
31141       }))
31142         return false;
31143       return true;
31144     },
31145     isConnectivity: function() {
31146       return !!(this.tags.type && this.tags.type.match(/^connectivity:?/));
31147     },
31148     // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
31149     // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
31150     //
31151     // This corresponds to the structure needed for rendering a multipolygon path using a
31152     // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
31153     //
31154     // In the case of invalid geometries, this function will still return a result which
31155     // includes the nodes of all way members, but some Nds may be unclosed and some inner
31156     // rings not matched with the intended outer ring.
31157     //
31158     multipolygon: function(resolver) {
31159       var outers = this.members.filter(function(m) {
31160         return "outer" === (m.role || "outer");
31161       });
31162       var inners = this.members.filter(function(m) {
31163         return "inner" === m.role;
31164       });
31165       outers = osmJoinWays(outers, resolver);
31166       inners = osmJoinWays(inners, resolver);
31167       var sequenceToLineString = function(sequence) {
31168         if (sequence.nodes.length > 2 && sequence.nodes[0] !== sequence.nodes[sequence.nodes.length - 1]) {
31169           sequence.nodes.push(sequence.nodes[0]);
31170         }
31171         return sequence.nodes.map(function(node) {
31172           return node.loc;
31173         });
31174       };
31175       outers = outers.map(sequenceToLineString);
31176       inners = inners.map(sequenceToLineString);
31177       var result = outers.map(function(o2) {
31178         return [area_default({ type: "Polygon", coordinates: [o2] }) > 2 * Math.PI ? o2.reverse() : o2];
31179       });
31180       function findOuter(inner2) {
31181         var o2, outer;
31182         for (o2 = 0; o2 < outers.length; o2++) {
31183           outer = outers[o2];
31184           if (geoPolygonContainsPolygon(outer, inner2)) {
31185             return o2;
31186           }
31187         }
31188         for (o2 = 0; o2 < outers.length; o2++) {
31189           outer = outers[o2];
31190           if (geoPolygonIntersectsPolygon(outer, inner2, false)) {
31191             return o2;
31192           }
31193         }
31194       }
31195       for (var i2 = 0; i2 < inners.length; i2++) {
31196         var inner = inners[i2];
31197         if (area_default({ type: "Polygon", coordinates: [inner] }) < 2 * Math.PI) {
31198           inner = inner.reverse();
31199         }
31200         var o = findOuter(inners[i2]);
31201         if (o !== void 0) {
31202           result[o].push(inners[i2]);
31203         } else {
31204           result.push([inners[i2]]);
31205         }
31206       }
31207       return result;
31208     }
31209   });
31210
31211   // modules/osm/qa_item.js
31212   var QAItem = class _QAItem {
31213     constructor(loc, service, itemType, id2, props) {
31214       this.loc = loc;
31215       this.service = service.title;
31216       this.itemType = itemType;
31217       this.id = id2 ? id2 : `${_QAItem.id()}`;
31218       this.update(props);
31219       if (service && typeof service.getIcon === "function") {
31220         this.icon = service.getIcon(itemType);
31221       }
31222     }
31223     update(props) {
31224       const { loc, service, itemType, id: id2 } = this;
31225       Object.keys(props).forEach((prop) => this[prop] = props[prop]);
31226       this.loc = loc;
31227       this.service = service;
31228       this.itemType = itemType;
31229       this.id = id2;
31230       return this;
31231     }
31232     // Generic handling for newly created QAItems
31233     static id() {
31234       return this.nextId--;
31235     }
31236   };
31237   QAItem.nextId = -1;
31238
31239   // modules/actions/split.js
31240   function actionSplit(nodeIds, newWayIds) {
31241     if (typeof nodeIds === "string")
31242       nodeIds = [nodeIds];
31243     var _wayIDs;
31244     var _keepHistoryOn = "longest";
31245     var _createdWayIDs = [];
31246     function dist(graph, nA, nB) {
31247       var locA = graph.entity(nA).loc;
31248       var locB = graph.entity(nB).loc;
31249       var epsilon3 = 1e-6;
31250       return locA && locB ? geoSphericalDistance(locA, locB) : epsilon3;
31251     }
31252     function splitArea(nodes, idxA, graph) {
31253       var lengths = new Array(nodes.length);
31254       var length;
31255       var i2;
31256       var best = 0;
31257       var idxB;
31258       function wrap2(index) {
31259         return utilWrap(index, nodes.length);
31260       }
31261       length = 0;
31262       for (i2 = wrap2(idxA + 1); i2 !== idxA; i2 = wrap2(i2 + 1)) {
31263         length += dist(graph, nodes[i2], nodes[wrap2(i2 - 1)]);
31264         lengths[i2] = length;
31265       }
31266       length = 0;
31267       for (i2 = wrap2(idxA - 1); i2 !== idxA; i2 = wrap2(i2 - 1)) {
31268         length += dist(graph, nodes[i2], nodes[wrap2(i2 + 1)]);
31269         if (length < lengths[i2]) {
31270           lengths[i2] = length;
31271         }
31272       }
31273       for (i2 = 0; i2 < nodes.length; i2++) {
31274         var cost = lengths[i2] / dist(graph, nodes[idxA], nodes[i2]);
31275         if (cost > best) {
31276           idxB = i2;
31277           best = cost;
31278         }
31279       }
31280       return idxB;
31281     }
31282     function totalLengthBetweenNodes(graph, nodes) {
31283       var totalLength = 0;
31284       for (var i2 = 0; i2 < nodes.length - 1; i2++) {
31285         totalLength += dist(graph, nodes[i2], nodes[i2 + 1]);
31286       }
31287       return totalLength;
31288     }
31289     function split(graph, nodeId, wayA, newWayId) {
31290       var wayB = osmWay({ id: newWayId, tags: wayA.tags });
31291       var origNodes = wayA.nodes.slice();
31292       var nodesA;
31293       var nodesB;
31294       var isArea = wayA.isArea();
31295       var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
31296       if (wayA.isClosed()) {
31297         var nodes = wayA.nodes.slice(0, -1);
31298         var idxA = nodes.indexOf(nodeId);
31299         var idxB = splitArea(nodes, idxA, graph);
31300         if (idxB < idxA) {
31301           nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
31302           nodesB = nodes.slice(idxB, idxA + 1);
31303         } else {
31304           nodesA = nodes.slice(idxA, idxB + 1);
31305           nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
31306         }
31307       } else {
31308         var idx = wayA.nodes.indexOf(nodeId, 1);
31309         nodesA = wayA.nodes.slice(0, idx + 1);
31310         nodesB = wayA.nodes.slice(idx);
31311       }
31312       var lengthA = totalLengthBetweenNodes(graph, nodesA);
31313       var lengthB = totalLengthBetweenNodes(graph, nodesB);
31314       if (_keepHistoryOn === "longest" && lengthB > lengthA) {
31315         wayA = wayA.update({ nodes: nodesB });
31316         wayB = wayB.update({ nodes: nodesA });
31317         var temp = lengthA;
31318         lengthA = lengthB;
31319         lengthB = temp;
31320       } else {
31321         wayA = wayA.update({ nodes: nodesA });
31322         wayB = wayB.update({ nodes: nodesB });
31323       }
31324       if (wayA.tags.step_count) {
31325         var stepCount = Number(wayA.tags.step_count);
31326         if (stepCount && // ensure a number
31327         isFinite(stepCount) && // ensure positive
31328         stepCount > 0 && // ensure integer
31329         Math.round(stepCount) === stepCount) {
31330           var tagsA = Object.assign({}, wayA.tags);
31331           var tagsB = Object.assign({}, wayB.tags);
31332           var ratioA = lengthA / (lengthA + lengthB);
31333           var countA = Math.round(stepCount * ratioA);
31334           tagsA.step_count = countA.toString();
31335           tagsB.step_count = (stepCount - countA).toString();
31336           wayA = wayA.update({ tags: tagsA });
31337           wayB = wayB.update({ tags: tagsB });
31338         }
31339       }
31340       graph = graph.replace(wayA);
31341       graph = graph.replace(wayB);
31342       graph.parentRelations(wayA).forEach(function(relation) {
31343         var member;
31344         if (relation.hasFromViaTo()) {
31345           var f2 = relation.memberByRole("from");
31346           var v = relation.membersByRole("via");
31347           var t = relation.memberByRole("to");
31348           var i2;
31349           if (f2.id === wayA.id || t.id === wayA.id) {
31350             var keepB = false;
31351             if (v.length === 1 && v[0].type === "node") {
31352               keepB = wayB.contains(v[0].id);
31353             } else {
31354               for (i2 = 0; i2 < v.length; i2++) {
31355                 if (v[i2].type === "way") {
31356                   var wayVia = graph.hasEntity(v[i2].id);
31357                   if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
31358                     keepB = true;
31359                     break;
31360                   }
31361                 }
31362               }
31363             }
31364             if (keepB) {
31365               relation = relation.replaceMember(wayA, wayB);
31366               graph = graph.replace(relation);
31367             }
31368           } else {
31369             for (i2 = 0; i2 < v.length; i2++) {
31370               if (v[i2].type === "way" && v[i2].id === wayA.id) {
31371                 member = {
31372                   id: wayB.id,
31373                   type: "way",
31374                   role: "via"
31375                 };
31376                 graph = actionAddMember(relation.id, member, v[i2].index + 1)(graph);
31377                 break;
31378               }
31379             }
31380           }
31381         } else {
31382           if (relation === isOuter) {
31383             graph = graph.replace(relation.mergeTags(wayA.tags));
31384             graph = graph.replace(wayA.update({ tags: {} }));
31385             graph = graph.replace(wayB.update({ tags: {} }));
31386           }
31387           member = {
31388             id: wayB.id,
31389             type: "way",
31390             role: relation.memberById(wayA.id).role
31391           };
31392           var insertPair = {
31393             originalID: wayA.id,
31394             insertedID: wayB.id,
31395             nodes: origNodes
31396           };
31397           graph = actionAddMember(relation.id, member, void 0, insertPair)(graph);
31398         }
31399       });
31400       if (!isOuter && isArea) {
31401         var multipolygon = osmRelation({
31402           tags: Object.assign({}, wayA.tags, { type: "multipolygon" }),
31403           members: [
31404             { id: wayA.id, role: "outer", type: "way" },
31405             { id: wayB.id, role: "outer", type: "way" }
31406           ]
31407         });
31408         graph = graph.replace(multipolygon);
31409         graph = graph.replace(wayA.update({ tags: {} }));
31410         graph = graph.replace(wayB.update({ tags: {} }));
31411       }
31412       _createdWayIDs.push(wayB.id);
31413       return graph;
31414     }
31415     var action = function(graph) {
31416       _createdWayIDs = [];
31417       var newWayIndex = 0;
31418       for (var i2 = 0; i2 < nodeIds.length; i2++) {
31419         var nodeId = nodeIds[i2];
31420         var candidates = action.waysForNode(nodeId, graph);
31421         for (var j2 = 0; j2 < candidates.length; j2++) {
31422           graph = split(graph, nodeId, candidates[j2], newWayIds && newWayIds[newWayIndex]);
31423           newWayIndex += 1;
31424         }
31425       }
31426       return graph;
31427     };
31428     action.getCreatedWayIDs = function() {
31429       return _createdWayIDs;
31430     };
31431     action.waysForNode = function(nodeId, graph) {
31432       var node = graph.entity(nodeId);
31433       var splittableParents = graph.parentWays(node).filter(isSplittable);
31434       if (!_wayIDs) {
31435         var hasLine = splittableParents.some(function(parent) {
31436           return parent.geometry(graph) === "line";
31437         });
31438         if (hasLine) {
31439           return splittableParents.filter(function(parent) {
31440             return parent.geometry(graph) === "line";
31441           });
31442         }
31443       }
31444       return splittableParents;
31445       function isSplittable(parent) {
31446         if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
31447           return false;
31448         if (parent.isClosed())
31449           return true;
31450         for (var i2 = 1; i2 < parent.nodes.length - 1; i2++) {
31451           if (parent.nodes[i2] === nodeId)
31452             return true;
31453         }
31454         return false;
31455       }
31456     };
31457     action.ways = function(graph) {
31458       return utilArrayUniq([].concat.apply([], nodeIds.map(function(nodeId) {
31459         return action.waysForNode(nodeId, graph);
31460       })));
31461     };
31462     action.disabled = function(graph) {
31463       for (var i2 = 0; i2 < nodeIds.length; i2++) {
31464         var nodeId = nodeIds[i2];
31465         var candidates = action.waysForNode(nodeId, graph);
31466         if (candidates.length === 0 || _wayIDs && _wayIDs.length !== candidates.length) {
31467           return "not_eligible";
31468         }
31469       }
31470     };
31471     action.limitWays = function(val) {
31472       if (!arguments.length)
31473         return _wayIDs;
31474       _wayIDs = val;
31475       return action;
31476     };
31477     action.keepHistoryOn = function(val) {
31478       if (!arguments.length)
31479         return _keepHistoryOn;
31480       _keepHistoryOn = val;
31481       return action;
31482     };
31483     return action;
31484   }
31485
31486   // modules/core/graph.js
31487   function coreGraph(other, mutable) {
31488     if (!(this instanceof coreGraph))
31489       return new coreGraph(other, mutable);
31490     if (other instanceof coreGraph) {
31491       var base = other.base();
31492       this.entities = Object.assign(Object.create(base.entities), other.entities);
31493       this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
31494       this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
31495     } else {
31496       this.entities = /* @__PURE__ */ Object.create({});
31497       this._parentWays = /* @__PURE__ */ Object.create({});
31498       this._parentRels = /* @__PURE__ */ Object.create({});
31499       this.rebase(other || [], [this]);
31500     }
31501     this.transients = {};
31502     this._childNodes = {};
31503     this.frozen = !mutable;
31504   }
31505   coreGraph.prototype = {
31506     hasEntity: function(id2) {
31507       return this.entities[id2];
31508     },
31509     entity: function(id2) {
31510       var entity = this.entities[id2];
31511       if (!entity) {
31512         entity = this.entities.__proto__[id2];
31513       }
31514       if (!entity) {
31515         throw new Error("entity " + id2 + " not found");
31516       }
31517       return entity;
31518     },
31519     geometry: function(id2) {
31520       return this.entity(id2).geometry(this);
31521     },
31522     transient: function(entity, key, fn) {
31523       var id2 = entity.id;
31524       var transients = this.transients[id2] || (this.transients[id2] = {});
31525       if (transients[key] !== void 0) {
31526         return transients[key];
31527       }
31528       transients[key] = fn.call(entity);
31529       return transients[key];
31530     },
31531     parentWays: function(entity) {
31532       var parents = this._parentWays[entity.id];
31533       var result = [];
31534       if (parents) {
31535         parents.forEach(function(id2) {
31536           result.push(this.entity(id2));
31537         }, this);
31538       }
31539       return result;
31540     },
31541     isPoi: function(entity) {
31542       var parents = this._parentWays[entity.id];
31543       return !parents || parents.size === 0;
31544     },
31545     isShared: function(entity) {
31546       var parents = this._parentWays[entity.id];
31547       return parents && parents.size > 1;
31548     },
31549     parentRelations: function(entity) {
31550       var parents = this._parentRels[entity.id];
31551       var result = [];
31552       if (parents) {
31553         parents.forEach(function(id2) {
31554           result.push(this.entity(id2));
31555         }, this);
31556       }
31557       return result;
31558     },
31559     parentMultipolygons: function(entity) {
31560       return this.parentRelations(entity).filter(function(relation) {
31561         return relation.isMultipolygon();
31562       });
31563     },
31564     childNodes: function(entity) {
31565       if (this._childNodes[entity.id])
31566         return this._childNodes[entity.id];
31567       if (!entity.nodes)
31568         return [];
31569       var nodes = [];
31570       for (var i2 = 0; i2 < entity.nodes.length; i2++) {
31571         nodes[i2] = this.entity(entity.nodes[i2]);
31572       }
31573       if (debug)
31574         Object.freeze(nodes);
31575       this._childNodes[entity.id] = nodes;
31576       return this._childNodes[entity.id];
31577     },
31578     base: function() {
31579       return {
31580         "entities": Object.getPrototypeOf(this.entities),
31581         "parentWays": Object.getPrototypeOf(this._parentWays),
31582         "parentRels": Object.getPrototypeOf(this._parentRels)
31583       };
31584     },
31585     // Unlike other graph methods, rebase mutates in place. This is because it
31586     // is used only during the history operation that merges newly downloaded
31587     // data into each state. To external consumers, it should appear as if the
31588     // graph always contained the newly downloaded data.
31589     rebase: function(entities, stack, force) {
31590       var base = this.base();
31591       var i2, j2, k, id2;
31592       for (i2 = 0; i2 < entities.length; i2++) {
31593         var entity = entities[i2];
31594         if (!entity.visible || !force && base.entities[entity.id])
31595           continue;
31596         base.entities[entity.id] = entity;
31597         this._updateCalculated(void 0, entity, base.parentWays, base.parentRels);
31598         if (entity.type === "way") {
31599           for (j2 = 0; j2 < entity.nodes.length; j2++) {
31600             id2 = entity.nodes[j2];
31601             for (k = 1; k < stack.length; k++) {
31602               var ents = stack[k].entities;
31603               if (ents.hasOwnProperty(id2) && ents[id2] === void 0) {
31604                 delete ents[id2];
31605               }
31606             }
31607           }
31608         }
31609       }
31610       for (i2 = 0; i2 < stack.length; i2++) {
31611         stack[i2]._updateRebased();
31612       }
31613     },
31614     _updateRebased: function() {
31615       var base = this.base();
31616       Object.keys(this._parentWays).forEach(function(child) {
31617         if (base.parentWays[child]) {
31618           base.parentWays[child].forEach(function(id2) {
31619             if (!this.entities.hasOwnProperty(id2)) {
31620               this._parentWays[child].add(id2);
31621             }
31622           }, this);
31623         }
31624       }, this);
31625       Object.keys(this._parentRels).forEach(function(child) {
31626         if (base.parentRels[child]) {
31627           base.parentRels[child].forEach(function(id2) {
31628             if (!this.entities.hasOwnProperty(id2)) {
31629               this._parentRels[child].add(id2);
31630             }
31631           }, this);
31632         }
31633       }, this);
31634       this.transients = {};
31635     },
31636     // Updates calculated properties (parentWays, parentRels) for the specified change
31637     _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
31638       parentWays = parentWays || this._parentWays;
31639       parentRels = parentRels || this._parentRels;
31640       var type2 = entity && entity.type || oldentity && oldentity.type;
31641       var removed, added, i2;
31642       if (type2 === "way") {
31643         if (oldentity && entity) {
31644           removed = utilArrayDifference(oldentity.nodes, entity.nodes);
31645           added = utilArrayDifference(entity.nodes, oldentity.nodes);
31646         } else if (oldentity) {
31647           removed = oldentity.nodes;
31648           added = [];
31649         } else if (entity) {
31650           removed = [];
31651           added = entity.nodes;
31652         }
31653         for (i2 = 0; i2 < removed.length; i2++) {
31654           parentWays[removed[i2]] = new Set(parentWays[removed[i2]]);
31655           parentWays[removed[i2]].delete(oldentity.id);
31656         }
31657         for (i2 = 0; i2 < added.length; i2++) {
31658           parentWays[added[i2]] = new Set(parentWays[added[i2]]);
31659           parentWays[added[i2]].add(entity.id);
31660         }
31661       } else if (type2 === "relation") {
31662         var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) {
31663           return m.id;
31664         }) : [];
31665         var entityMemberIDs = entity ? entity.members.map(function(m) {
31666           return m.id;
31667         }) : [];
31668         if (oldentity && entity) {
31669           removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
31670           added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
31671         } else if (oldentity) {
31672           removed = oldentityMemberIDs;
31673           added = [];
31674         } else if (entity) {
31675           removed = [];
31676           added = entityMemberIDs;
31677         }
31678         for (i2 = 0; i2 < removed.length; i2++) {
31679           parentRels[removed[i2]] = new Set(parentRels[removed[i2]]);
31680           parentRels[removed[i2]].delete(oldentity.id);
31681         }
31682         for (i2 = 0; i2 < added.length; i2++) {
31683           parentRels[added[i2]] = new Set(parentRels[added[i2]]);
31684           parentRels[added[i2]].add(entity.id);
31685         }
31686       }
31687     },
31688     replace: function(entity) {
31689       if (this.entities[entity.id] === entity)
31690         return this;
31691       return this.update(function() {
31692         this._updateCalculated(this.entities[entity.id], entity);
31693         this.entities[entity.id] = entity;
31694       });
31695     },
31696     remove: function(entity) {
31697       return this.update(function() {
31698         this._updateCalculated(entity, void 0);
31699         this.entities[entity.id] = void 0;
31700       });
31701     },
31702     revert: function(id2) {
31703       var baseEntity = this.base().entities[id2];
31704       var headEntity = this.entities[id2];
31705       if (headEntity === baseEntity)
31706         return this;
31707       return this.update(function() {
31708         this._updateCalculated(headEntity, baseEntity);
31709         delete this.entities[id2];
31710       });
31711     },
31712     update: function() {
31713       var graph = this.frozen ? coreGraph(this, true) : this;
31714       for (var i2 = 0; i2 < arguments.length; i2++) {
31715         arguments[i2].call(graph, graph);
31716       }
31717       if (this.frozen)
31718         graph.frozen = true;
31719       return graph;
31720     },
31721     // Obliterates any existing entities
31722     load: function(entities) {
31723       var base = this.base();
31724       this.entities = Object.create(base.entities);
31725       for (var i2 in entities) {
31726         this.entities[i2] = entities[i2];
31727         this._updateCalculated(base.entities[i2], this.entities[i2]);
31728       }
31729       return this;
31730     }
31731   };
31732
31733   // modules/osm/intersection.js
31734   function osmTurn(turn) {
31735     if (!(this instanceof osmTurn)) {
31736       return new osmTurn(turn);
31737     }
31738     Object.assign(this, turn);
31739   }
31740   function osmIntersection(graph, startVertexId, maxDistance) {
31741     maxDistance = maxDistance || 30;
31742     var vgraph = coreGraph();
31743     var i2, j2, k;
31744     function memberOfRestriction(entity) {
31745       return graph.parentRelations(entity).some(function(r) {
31746         return r.isRestriction();
31747       });
31748     }
31749     function isRoad(way2) {
31750       if (way2.isArea() || way2.isDegenerate())
31751         return false;
31752       var roads = {
31753         "motorway": true,
31754         "motorway_link": true,
31755         "trunk": true,
31756         "trunk_link": true,
31757         "primary": true,
31758         "primary_link": true,
31759         "secondary": true,
31760         "secondary_link": true,
31761         "tertiary": true,
31762         "tertiary_link": true,
31763         "residential": true,
31764         "unclassified": true,
31765         "living_street": true,
31766         "service": true,
31767         "road": true,
31768         "track": true
31769       };
31770       return roads[way2.tags.highway];
31771     }
31772     var startNode = graph.entity(startVertexId);
31773     var checkVertices = [startNode];
31774     var checkWays;
31775     var vertices = [];
31776     var vertexIds = [];
31777     var vertex;
31778     var ways = [];
31779     var wayIds = [];
31780     var way;
31781     var nodes = [];
31782     var node;
31783     var parents = [];
31784     var parent;
31785     var actions = [];
31786     while (checkVertices.length) {
31787       vertex = checkVertices.pop();
31788       checkWays = graph.parentWays(vertex);
31789       var hasWays = false;
31790       for (i2 = 0; i2 < checkWays.length; i2++) {
31791         way = checkWays[i2];
31792         if (!isRoad(way) && !memberOfRestriction(way))
31793           continue;
31794         ways.push(way);
31795         hasWays = true;
31796         nodes = utilArrayUniq(graph.childNodes(way));
31797         for (j2 = 0; j2 < nodes.length; j2++) {
31798           node = nodes[j2];
31799           if (node === vertex)
31800             continue;
31801           if (vertices.indexOf(node) !== -1)
31802             continue;
31803           if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance)
31804             continue;
31805           var hasParents = false;
31806           parents = graph.parentWays(node);
31807           for (k = 0; k < parents.length; k++) {
31808             parent = parents[k];
31809             if (parent === way)
31810               continue;
31811             if (ways.indexOf(parent) !== -1)
31812               continue;
31813             if (!isRoad(parent))
31814               continue;
31815             hasParents = true;
31816             break;
31817           }
31818           if (hasParents) {
31819             checkVertices.push(node);
31820           }
31821         }
31822       }
31823       if (hasWays) {
31824         vertices.push(vertex);
31825       }
31826     }
31827     vertices = utilArrayUniq(vertices);
31828     ways = utilArrayUniq(ways);
31829     ways.forEach(function(way2) {
31830       graph.childNodes(way2).forEach(function(node2) {
31831         vgraph = vgraph.replace(node2);
31832       });
31833       vgraph = vgraph.replace(way2);
31834       graph.parentRelations(way2).forEach(function(relation) {
31835         if (relation.isRestriction()) {
31836           if (relation.isValidRestriction(graph)) {
31837             vgraph = vgraph.replace(relation);
31838           } else if (relation.isComplete(graph)) {
31839             actions.push(actionDeleteRelation(relation.id));
31840           }
31841         }
31842       });
31843     });
31844     ways.forEach(function(w) {
31845       var way2 = vgraph.entity(w.id);
31846       if (way2.tags.oneway === "-1") {
31847         var action = actionReverse(way2.id, { reverseOneway: true });
31848         actions.push(action);
31849         vgraph = action(vgraph);
31850       }
31851     });
31852     var origCount = osmEntity.id.next.way;
31853     vertices.forEach(function(v) {
31854       var splitAll = actionSplit([v.id]).keepHistoryOn("first");
31855       if (!splitAll.disabled(vgraph)) {
31856         splitAll.ways(vgraph).forEach(function(way2) {
31857           var splitOne = actionSplit([v.id]).limitWays([way2.id]).keepHistoryOn("first");
31858           actions.push(splitOne);
31859           vgraph = splitOne(vgraph);
31860         });
31861       }
31862     });
31863     osmEntity.id.next.way = origCount;
31864     vertexIds = vertices.map(function(v) {
31865       return v.id;
31866     });
31867     vertices = [];
31868     ways = [];
31869     vertexIds.forEach(function(id2) {
31870       var vertex2 = vgraph.entity(id2);
31871       var parents2 = vgraph.parentWays(vertex2);
31872       vertices.push(vertex2);
31873       ways = ways.concat(parents2);
31874     });
31875     vertices = utilArrayUniq(vertices);
31876     ways = utilArrayUniq(ways);
31877     vertexIds = vertices.map(function(v) {
31878       return v.id;
31879     });
31880     wayIds = ways.map(function(w) {
31881       return w.id;
31882     });
31883     function withMetadata(way2, vertexIds2) {
31884       var __oneWay = way2.isOneWay();
31885       var __first = vertexIds2.indexOf(way2.first()) !== -1;
31886       var __last = vertexIds2.indexOf(way2.last()) !== -1;
31887       var __via = __first && __last;
31888       var __from = __first && !__oneWay || __last;
31889       var __to = __first || __last && !__oneWay;
31890       return way2.update({
31891         __first,
31892         __last,
31893         __from,
31894         __via,
31895         __to,
31896         __oneWay
31897       });
31898     }
31899     ways = [];
31900     wayIds.forEach(function(id2) {
31901       var way2 = withMetadata(vgraph.entity(id2), vertexIds);
31902       vgraph = vgraph.replace(way2);
31903       ways.push(way2);
31904     });
31905     var keepGoing;
31906     var removeWayIds = [];
31907     var removeVertexIds = [];
31908     do {
31909       keepGoing = false;
31910       checkVertices = vertexIds.slice();
31911       for (i2 = 0; i2 < checkVertices.length; i2++) {
31912         var vertexId = checkVertices[i2];
31913         vertex = vgraph.hasEntity(vertexId);
31914         if (!vertex) {
31915           if (vertexIds.indexOf(vertexId) !== -1) {
31916             vertexIds.splice(vertexIds.indexOf(vertexId), 1);
31917           }
31918           removeVertexIds.push(vertexId);
31919           continue;
31920         }
31921         parents = vgraph.parentWays(vertex);
31922         if (parents.length < 3) {
31923           if (vertexIds.indexOf(vertexId) !== -1) {
31924             vertexIds.splice(vertexIds.indexOf(vertexId), 1);
31925           }
31926         }
31927         if (parents.length === 2) {
31928           var a = parents[0];
31929           var b = parents[1];
31930           var aIsLeaf = a && !a.__via;
31931           var bIsLeaf = b && !b.__via;
31932           var leaf, survivor;
31933           if (aIsLeaf && !bIsLeaf) {
31934             leaf = a;
31935             survivor = b;
31936           } else if (!aIsLeaf && bIsLeaf) {
31937             leaf = b;
31938             survivor = a;
31939           }
31940           if (leaf && survivor) {
31941             survivor = withMetadata(survivor, vertexIds);
31942             vgraph = vgraph.replace(survivor).remove(leaf);
31943             removeWayIds.push(leaf.id);
31944             keepGoing = true;
31945           }
31946         }
31947         parents = vgraph.parentWays(vertex);
31948         if (parents.length < 2) {
31949           if (vertexIds.indexOf(vertexId) !== -1) {
31950             vertexIds.splice(vertexIds.indexOf(vertexId), 1);
31951           }
31952           removeVertexIds.push(vertexId);
31953           keepGoing = true;
31954         }
31955         if (parents.length < 1) {
31956           vgraph = vgraph.remove(vertex);
31957         }
31958       }
31959     } while (keepGoing);
31960     vertices = vertices.filter(function(vertex2) {
31961       return removeVertexIds.indexOf(vertex2.id) === -1;
31962     }).map(function(vertex2) {
31963       return vgraph.entity(vertex2.id);
31964     });
31965     ways = ways.filter(function(way2) {
31966       return removeWayIds.indexOf(way2.id) === -1;
31967     }).map(function(way2) {
31968       return vgraph.entity(way2.id);
31969     });
31970     var intersection = {
31971       graph: vgraph,
31972       actions,
31973       vertices,
31974       ways
31975     };
31976     intersection.turns = function(fromWayId, maxViaWay) {
31977       if (!fromWayId)
31978         return [];
31979       if (!maxViaWay)
31980         maxViaWay = 0;
31981       var vgraph2 = intersection.graph;
31982       var keyVertexIds = intersection.vertices.map(function(v) {
31983         return v.id;
31984       });
31985       var start2 = vgraph2.entity(fromWayId);
31986       if (!start2 || !(start2.__from || start2.__via))
31987         return [];
31988       var maxPathLength = maxViaWay * 2 + 3;
31989       var turns = [];
31990       step(start2);
31991       return turns;
31992       function step(entity, currPath, currRestrictions, matchedRestriction) {
31993         currPath = (currPath || []).slice();
31994         if (currPath.length >= maxPathLength)
31995           return;
31996         currPath.push(entity.id);
31997         currRestrictions = (currRestrictions || []).slice();
31998         if (entity.type === "node") {
31999           stepNode(entity, currPath, currRestrictions);
32000         } else {
32001           stepWay(entity, currPath, currRestrictions, matchedRestriction);
32002         }
32003       }
32004       function stepNode(entity, currPath, currRestrictions) {
32005         var i3, j3;
32006         var parents2 = vgraph2.parentWays(entity);
32007         var nextWays = [];
32008         for (i3 = 0; i3 < parents2.length; i3++) {
32009           var way2 = parents2[i3];
32010           if (way2.__oneWay && way2.nodes[0] !== entity.id)
32011             continue;
32012           if (currPath.indexOf(way2.id) !== -1 && currPath.length >= 3)
32013             continue;
32014           var restrict = null;
32015           for (j3 = 0; j3 < currRestrictions.length; j3++) {
32016             var restriction = currRestrictions[j3];
32017             var f2 = restriction.memberByRole("from");
32018             var v = restriction.membersByRole("via");
32019             var t = restriction.memberByRole("to");
32020             var isNo = /^no_/.test(restriction.tags.restriction);
32021             var isOnly = /^only_/.test(restriction.tags.restriction);
32022             if (!(isNo || isOnly)) {
32023               continue;
32024             }
32025             var matchesFrom = f2.id === fromWayId;
32026             var matchesViaTo = false;
32027             var isAlongOnlyPath = false;
32028             if (t.id === way2.id) {
32029               if (v.length === 1 && v[0].type === "node") {
32030                 matchesViaTo = v[0].id === entity.id && (matchesFrom && currPath.length === 2 || !matchesFrom && currPath.length > 2);
32031               } else {
32032                 var pathVias = [];
32033                 for (k = 2; k < currPath.length; k += 2) {
32034                   pathVias.push(currPath[k]);
32035                 }
32036                 var restrictionVias = [];
32037                 for (k = 0; k < v.length; k++) {
32038                   if (v[k].type === "way") {
32039                     restrictionVias.push(v[k].id);
32040                   }
32041                 }
32042                 var diff = utilArrayDifference(pathVias, restrictionVias);
32043                 matchesViaTo = !diff.length;
32044               }
32045             } else if (isOnly) {
32046               for (k = 0; k < v.length; k++) {
32047                 if (v[k].type === "way" && v[k].id === way2.id) {
32048                   isAlongOnlyPath = true;
32049                   break;
32050                 }
32051               }
32052             }
32053             if (matchesViaTo) {
32054               if (isOnly) {
32055                 restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, only: true, end: true };
32056               } else {
32057                 restrict = { id: restriction.id, direct: matchesFrom, from: f2.id, no: true, end: true };
32058               }
32059             } else {
32060               if (isAlongOnlyPath) {
32061                 restrict = { id: restriction.id, direct: false, from: f2.id, only: true, end: false };
32062               } else if (isOnly) {
32063                 restrict = { id: restriction.id, direct: false, from: f2.id, no: true, end: true };
32064               }
32065             }
32066             if (restrict && restrict.direct)
32067               break;
32068           }
32069           nextWays.push({ way: way2, restrict });
32070         }
32071         nextWays.forEach(function(nextWay) {
32072           step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
32073         });
32074       }
32075       function stepWay(entity, currPath, currRestrictions, matchedRestriction) {
32076         var i3;
32077         if (currPath.length >= 3) {
32078           var turnPath = currPath.slice();
32079           if (matchedRestriction && matchedRestriction.direct === false) {
32080             for (i3 = 0; i3 < turnPath.length; i3++) {
32081               if (turnPath[i3] === matchedRestriction.from) {
32082                 turnPath = turnPath.slice(i3);
32083                 break;
32084               }
32085             }
32086           }
32087           var turn = pathToTurn(turnPath);
32088           if (turn) {
32089             if (matchedRestriction) {
32090               turn.restrictionID = matchedRestriction.id;
32091               turn.no = matchedRestriction.no;
32092               turn.only = matchedRestriction.only;
32093               turn.direct = matchedRestriction.direct;
32094             }
32095             turns.push(osmTurn(turn));
32096           }
32097           if (currPath[0] === currPath[2])
32098             return;
32099         }
32100         if (matchedRestriction && matchedRestriction.end)
32101           return;
32102         var n1 = vgraph2.entity(entity.first());
32103         var n2 = vgraph2.entity(entity.last());
32104         var dist = geoSphericalDistance(n1.loc, n2.loc);
32105         var nextNodes = [];
32106         if (currPath.length > 1) {
32107           if (dist > maxDistance)
32108             return;
32109           if (!entity.__via)
32110             return;
32111         }
32112         if (!entity.__oneWay && // bidirectional..
32113         keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
32114         currPath.indexOf(n1.id) === -1) {
32115           nextNodes.push(n1);
32116         }
32117         if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
32118         currPath.indexOf(n2.id) === -1) {
32119           nextNodes.push(n2);
32120         }
32121         nextNodes.forEach(function(nextNode) {
32122           var fromRestrictions = vgraph2.parentRelations(entity).filter(function(r) {
32123             if (!r.isRestriction())
32124               return false;
32125             var f2 = r.memberByRole("from");
32126             if (!f2 || f2.id !== entity.id)
32127               return false;
32128             var isOnly = /^only_/.test(r.tags.restriction);
32129             if (!isOnly)
32130               return true;
32131             var isOnlyVia = false;
32132             var v = r.membersByRole("via");
32133             if (v.length === 1 && v[0].type === "node") {
32134               isOnlyVia = v[0].id === nextNode.id;
32135             } else {
32136               for (var i4 = 0; i4 < v.length; i4++) {
32137                 if (v[i4].type !== "way")
32138                   continue;
32139                 var viaWay = vgraph2.entity(v[i4].id);
32140                 if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
32141                   isOnlyVia = true;
32142                   break;
32143                 }
32144               }
32145             }
32146             return isOnlyVia;
32147           });
32148           step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
32149         });
32150       }
32151       function pathToTurn(path) {
32152         if (path.length < 3)
32153           return;
32154         var fromWayId2, fromNodeId, fromVertexId;
32155         var toWayId, toNodeId, toVertexId;
32156         var viaWayIds, viaNodeId, isUturn;
32157         fromWayId2 = path[0];
32158         toWayId = path[path.length - 1];
32159         if (path.length === 3 && fromWayId2 === toWayId) {
32160           var way2 = vgraph2.entity(fromWayId2);
32161           if (way2.__oneWay)
32162             return null;
32163           isUturn = true;
32164           viaNodeId = fromVertexId = toVertexId = path[1];
32165           fromNodeId = toNodeId = adjacentNode(fromWayId2, viaNodeId);
32166         } else {
32167           isUturn = false;
32168           fromVertexId = path[1];
32169           fromNodeId = adjacentNode(fromWayId2, fromVertexId);
32170           toVertexId = path[path.length - 2];
32171           toNodeId = adjacentNode(toWayId, toVertexId);
32172           if (path.length === 3) {
32173             viaNodeId = path[1];
32174           } else {
32175             viaWayIds = path.filter(function(entityId) {
32176               return entityId[0] === "w";
32177             });
32178             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);
32179           }
32180         }
32181         return {
32182           key: path.join("_"),
32183           path,
32184           from: { node: fromNodeId, way: fromWayId2, vertex: fromVertexId },
32185           via: { node: viaNodeId, ways: viaWayIds },
32186           to: { node: toNodeId, way: toWayId, vertex: toVertexId },
32187           u: isUturn
32188         };
32189         function adjacentNode(wayId, affixId) {
32190           var nodes2 = vgraph2.entity(wayId).nodes;
32191           return affixId === nodes2[0] ? nodes2[1] : nodes2[nodes2.length - 2];
32192         }
32193       }
32194     };
32195     return intersection;
32196   }
32197   function osmInferRestriction(graph, turn, projection2) {
32198     var fromWay = graph.entity(turn.from.way);
32199     var fromNode = graph.entity(turn.from.node);
32200     var fromVertex = graph.entity(turn.from.vertex);
32201     var toWay = graph.entity(turn.to.way);
32202     var toNode = graph.entity(turn.to.node);
32203     var toVertex = graph.entity(turn.to.vertex);
32204     var fromOneWay = fromWay.tags.oneway === "yes";
32205     var toOneWay = toWay.tags.oneway === "yes";
32206     var angle2 = (geoAngle(fromVertex, fromNode, projection2) - geoAngle(toVertex, toNode, projection2)) * 180 / Math.PI;
32207     while (angle2 < 0) {
32208       angle2 += 360;
32209     }
32210     if (fromNode === toNode) {
32211       return "no_u_turn";
32212     }
32213     if ((angle2 < 23 || angle2 > 336) && fromOneWay && toOneWay) {
32214       return "no_u_turn";
32215     }
32216     if ((angle2 < 40 || angle2 > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex) {
32217       return "no_u_turn";
32218     }
32219     if (angle2 < 158) {
32220       return "no_right_turn";
32221     }
32222     if (angle2 > 202) {
32223       return "no_left_turn";
32224     }
32225     return "no_straight_on";
32226   }
32227
32228   // modules/actions/merge_polygon.js
32229   function actionMergePolygon(ids, newRelationId) {
32230     function groupEntities(graph) {
32231       var entities = ids.map(function(id2) {
32232         return graph.entity(id2);
32233       });
32234       var geometryGroups = utilArrayGroupBy(entities, function(entity) {
32235         if (entity.type === "way" && entity.isClosed()) {
32236           return "closedWay";
32237         } else if (entity.type === "relation" && entity.isMultipolygon()) {
32238           return "multipolygon";
32239         } else {
32240           return "other";
32241         }
32242       });
32243       return Object.assign(
32244         { closedWay: [], multipolygon: [], other: [] },
32245         geometryGroups
32246       );
32247     }
32248     var action = function(graph) {
32249       var entities = groupEntities(graph);
32250       var polygons = entities.multipolygon.reduce(function(polygons2, m) {
32251         return polygons2.concat(osmJoinWays(m.members, graph));
32252       }, []).concat(entities.closedWay.map(function(d) {
32253         var member = [{ id: d.id }];
32254         member.nodes = graph.childNodes(d);
32255         return member;
32256       }));
32257       var contained = polygons.map(function(w, i2) {
32258         return polygons.map(function(d, n2) {
32259           if (i2 === n2)
32260             return null;
32261           return geoPolygonContainsPolygon(
32262             d.nodes.map(function(n3) {
32263               return n3.loc;
32264             }),
32265             w.nodes.map(function(n3) {
32266               return n3.loc;
32267             })
32268           );
32269         });
32270       });
32271       var members = [];
32272       var outer = true;
32273       while (polygons.length) {
32274         extractUncontained(polygons);
32275         polygons = polygons.filter(isContained);
32276         contained = contained.filter(isContained).map(filterContained);
32277       }
32278       function isContained(d, i2) {
32279         return contained[i2].some(function(val) {
32280           return val;
32281         });
32282       }
32283       function filterContained(d) {
32284         return d.filter(isContained);
32285       }
32286       function extractUncontained(polygons2) {
32287         polygons2.forEach(function(d, i2) {
32288           if (!isContained(d, i2)) {
32289             d.forEach(function(member) {
32290               members.push({
32291                 type: "way",
32292                 id: member.id,
32293                 role: outer ? "outer" : "inner"
32294               });
32295             });
32296           }
32297         });
32298         outer = !outer;
32299       }
32300       var relation;
32301       if (entities.multipolygon.length > 0) {
32302         var oldestID = utilOldestID(entities.multipolygon.map((entity) => entity.id));
32303         relation = entities.multipolygon.find((entity) => entity.id === oldestID);
32304       } else {
32305         relation = osmRelation({ id: newRelationId, tags: { type: "multipolygon" } });
32306       }
32307       entities.multipolygon.forEach(function(m) {
32308         if (m.id !== relation.id) {
32309           relation = relation.mergeTags(m.tags);
32310           graph = graph.remove(m);
32311         }
32312       });
32313       entities.closedWay.forEach(function(way) {
32314         function isThisOuter(m) {
32315           return m.id === way.id && m.role !== "inner";
32316         }
32317         if (members.some(isThisOuter)) {
32318           relation = relation.mergeTags(way.tags);
32319           graph = graph.replace(way.update({ tags: {} }));
32320         }
32321       });
32322       return graph.replace(relation.update({
32323         members,
32324         tags: utilObjectOmit(relation.tags, ["area"])
32325       }));
32326     };
32327     action.disabled = function(graph) {
32328       var entities = groupEntities(graph);
32329       if (entities.other.length > 0 || entities.closedWay.length + entities.multipolygon.length < 2) {
32330         return "not_eligible";
32331       }
32332       if (!entities.multipolygon.every(function(r) {
32333         return r.isComplete(graph);
32334       })) {
32335         return "incomplete_relation";
32336       }
32337       if (!entities.multipolygon.length) {
32338         var sharedMultipolygons = [];
32339         entities.closedWay.forEach(function(way, i2) {
32340           if (i2 === 0) {
32341             sharedMultipolygons = graph.parentMultipolygons(way);
32342           } else {
32343             sharedMultipolygons = utilArrayIntersection(sharedMultipolygons, graph.parentMultipolygons(way));
32344           }
32345         });
32346         sharedMultipolygons = sharedMultipolygons.filter(function(relation) {
32347           return relation.members.length === entities.closedWay.length;
32348         });
32349         if (sharedMultipolygons.length) {
32350           return "not_eligible";
32351         }
32352       } else if (entities.closedWay.some(function(way) {
32353         return utilArrayIntersection(graph.parentMultipolygons(way), entities.multipolygon).length;
32354       })) {
32355         return "not_eligible";
32356       }
32357     };
32358     return action;
32359   }
32360
32361   // modules/actions/merge_remote_changes.js
32362   var import_fast_deep_equal = __toESM(require_fast_deep_equal());
32363
32364   // node_modules/node-diff3/index.mjs
32365   function LCS(buffer1, buffer2) {
32366     let equivalenceClasses = {};
32367     for (let j2 = 0; j2 < buffer2.length; j2++) {
32368       const item = buffer2[j2];
32369       if (equivalenceClasses[item]) {
32370         equivalenceClasses[item].push(j2);
32371       } else {
32372         equivalenceClasses[item] = [j2];
32373       }
32374     }
32375     const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null };
32376     let candidates = [NULLRESULT];
32377     for (let i2 = 0; i2 < buffer1.length; i2++) {
32378       const item = buffer1[i2];
32379       const buffer2indices = equivalenceClasses[item] || [];
32380       let r = 0;
32381       let c = candidates[0];
32382       for (let jx = 0; jx < buffer2indices.length; jx++) {
32383         const j2 = buffer2indices[jx];
32384         let s;
32385         for (s = r; s < candidates.length; s++) {
32386           if (candidates[s].buffer2index < j2 && (s === candidates.length - 1 || candidates[s + 1].buffer2index > j2)) {
32387             break;
32388           }
32389         }
32390         if (s < candidates.length) {
32391           const newCandidate = { buffer1index: i2, buffer2index: j2, chain: candidates[s] };
32392           if (r === candidates.length) {
32393             candidates.push(c);
32394           } else {
32395             candidates[r] = c;
32396           }
32397           r = s + 1;
32398           c = newCandidate;
32399           if (r === candidates.length) {
32400             break;
32401           }
32402         }
32403       }
32404       candidates[r] = c;
32405     }
32406     return candidates[candidates.length - 1];
32407   }
32408   function diffIndices(buffer1, buffer2) {
32409     const lcs = LCS(buffer1, buffer2);
32410     let result = [];
32411     let tail1 = buffer1.length;
32412     let tail2 = buffer2.length;
32413     for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {
32414       const mismatchLength1 = tail1 - candidate.buffer1index - 1;
32415       const mismatchLength2 = tail2 - candidate.buffer2index - 1;
32416       tail1 = candidate.buffer1index;
32417       tail2 = candidate.buffer2index;
32418       if (mismatchLength1 || mismatchLength2) {
32419         result.push({
32420           buffer1: [tail1 + 1, mismatchLength1],
32421           buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),
32422           buffer2: [tail2 + 1, mismatchLength2],
32423           buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)
32424         });
32425       }
32426     }
32427     result.reverse();
32428     return result;
32429   }
32430   function diff3MergeRegions(a, o, b) {
32431     let hunks = [];
32432     function addHunk(h, ab) {
32433       hunks.push({
32434         ab,
32435         oStart: h.buffer1[0],
32436         oLength: h.buffer1[1],
32437         // length of o to remove
32438         abStart: h.buffer2[0],
32439         abLength: h.buffer2[1]
32440         // length of a/b to insert
32441         // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1])
32442       });
32443     }
32444     diffIndices(o, a).forEach((item) => addHunk(item, "a"));
32445     diffIndices(o, b).forEach((item) => addHunk(item, "b"));
32446     hunks.sort((x, y) => x.oStart - y.oStart);
32447     let results = [];
32448     let currOffset = 0;
32449     function advanceTo(endOffset) {
32450       if (endOffset > currOffset) {
32451         results.push({
32452           stable: true,
32453           buffer: "o",
32454           bufferStart: currOffset,
32455           bufferLength: endOffset - currOffset,
32456           bufferContent: o.slice(currOffset, endOffset)
32457         });
32458         currOffset = endOffset;
32459       }
32460     }
32461     while (hunks.length) {
32462       let hunk = hunks.shift();
32463       let regionStart = hunk.oStart;
32464       let regionEnd = hunk.oStart + hunk.oLength;
32465       let regionHunks = [hunk];
32466       advanceTo(regionStart);
32467       while (hunks.length) {
32468         const nextHunk = hunks[0];
32469         const nextHunkStart = nextHunk.oStart;
32470         if (nextHunkStart > regionEnd)
32471           break;
32472         regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);
32473         regionHunks.push(hunks.shift());
32474       }
32475       if (regionHunks.length === 1) {
32476         if (hunk.abLength > 0) {
32477           const buffer = hunk.ab === "a" ? a : b;
32478           results.push({
32479             stable: true,
32480             buffer: hunk.ab,
32481             bufferStart: hunk.abStart,
32482             bufferLength: hunk.abLength,
32483             bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)
32484           });
32485         }
32486       } else {
32487         let bounds = {
32488           a: [a.length, -1, o.length, -1],
32489           b: [b.length, -1, o.length, -1]
32490         };
32491         while (regionHunks.length) {
32492           hunk = regionHunks.shift();
32493           const oStart = hunk.oStart;
32494           const oEnd = oStart + hunk.oLength;
32495           const abStart = hunk.abStart;
32496           const abEnd = abStart + hunk.abLength;
32497           let b2 = bounds[hunk.ab];
32498           b2[0] = Math.min(abStart, b2[0]);
32499           b2[1] = Math.max(abEnd, b2[1]);
32500           b2[2] = Math.min(oStart, b2[2]);
32501           b2[3] = Math.max(oEnd, b2[3]);
32502         }
32503         const aStart = bounds.a[0] + (regionStart - bounds.a[2]);
32504         const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);
32505         const bStart = bounds.b[0] + (regionStart - bounds.b[2]);
32506         const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);
32507         let result = {
32508           stable: false,
32509           aStart,
32510           aLength: aEnd - aStart,
32511           aContent: a.slice(aStart, aEnd),
32512           oStart: regionStart,
32513           oLength: regionEnd - regionStart,
32514           oContent: o.slice(regionStart, regionEnd),
32515           bStart,
32516           bLength: bEnd - bStart,
32517           bContent: b.slice(bStart, bEnd)
32518         };
32519         results.push(result);
32520       }
32521       currOffset = regionEnd;
32522     }
32523     advanceTo(o.length);
32524     return results;
32525   }
32526   function diff3Merge(a, o, b, options2) {
32527     let defaults2 = {
32528       excludeFalseConflicts: true,
32529       stringSeparator: /\s+/
32530     };
32531     options2 = Object.assign(defaults2, options2);
32532     if (typeof a === "string")
32533       a = a.split(options2.stringSeparator);
32534     if (typeof o === "string")
32535       o = o.split(options2.stringSeparator);
32536     if (typeof b === "string")
32537       b = b.split(options2.stringSeparator);
32538     let results = [];
32539     const regions = diff3MergeRegions(a, o, b);
32540     let okBuffer = [];
32541     function flushOk() {
32542       if (okBuffer.length) {
32543         results.push({ ok: okBuffer });
32544       }
32545       okBuffer = [];
32546     }
32547     function isFalseConflict(a2, b2) {
32548       if (a2.length !== b2.length)
32549         return false;
32550       for (let i2 = 0; i2 < a2.length; i2++) {
32551         if (a2[i2] !== b2[i2])
32552           return false;
32553       }
32554       return true;
32555     }
32556     regions.forEach((region) => {
32557       if (region.stable) {
32558         okBuffer.push(...region.bufferContent);
32559       } else {
32560         if (options2.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {
32561           okBuffer.push(...region.aContent);
32562         } else {
32563           flushOk();
32564           results.push({
32565             conflict: {
32566               a: region.aContent,
32567               aIndex: region.aStart,
32568               o: region.oContent,
32569               oIndex: region.oStart,
32570               b: region.bContent,
32571               bIndex: region.bStart
32572             }
32573           });
32574         }
32575       }
32576     });
32577     flushOk();
32578     return results;
32579   }
32580
32581   // modules/actions/merge_remote_changes.js
32582   var import_lodash2 = __toESM(require_lodash());
32583   function actionMergeRemoteChanges(id2, localGraph, remoteGraph, discardTags, formatUser) {
32584     discardTags = discardTags || {};
32585     var _option = "safe";
32586     var _conflicts = [];
32587     function user(d) {
32588       return typeof formatUser === "function" ? formatUser(d) : (0, import_lodash2.escape)(d);
32589     }
32590     function mergeLocation(remote, target) {
32591       function pointEqual(a, b) {
32592         var epsilon3 = 1e-6;
32593         return Math.abs(a[0] - b[0]) < epsilon3 && Math.abs(a[1] - b[1]) < epsilon3;
32594       }
32595       if (_option === "force_local" || pointEqual(target.loc, remote.loc)) {
32596         return target;
32597       }
32598       if (_option === "force_remote") {
32599         return target.update({ loc: remote.loc });
32600       }
32601       _conflicts.push(_t.html("merge_remote_changes.conflict.location", { user: { html: user(remote.user) } }));
32602       return target;
32603     }
32604     function mergeNodes(base, remote, target) {
32605       if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.nodes, remote.nodes)) {
32606         return target;
32607       }
32608       if (_option === "force_remote") {
32609         return target.update({ nodes: remote.nodes });
32610       }
32611       var ccount = _conflicts.length;
32612       var o = base.nodes || [];
32613       var a = target.nodes || [];
32614       var b = remote.nodes || [];
32615       var nodes = [];
32616       var hunks = diff3Merge(a, o, b, { excludeFalseConflicts: true });
32617       for (var i2 = 0; i2 < hunks.length; i2++) {
32618         var hunk = hunks[i2];
32619         if (hunk.ok) {
32620           nodes.push.apply(nodes, hunk.ok);
32621         } else {
32622           var c = hunk.conflict;
32623           if ((0, import_fast_deep_equal.default)(c.o, c.a)) {
32624             nodes.push.apply(nodes, c.b);
32625           } else if ((0, import_fast_deep_equal.default)(c.o, c.b)) {
32626             nodes.push.apply(nodes, c.a);
32627           } else {
32628             _conflicts.push(_t.html("merge_remote_changes.conflict.nodelist", { user: { html: user(remote.user) } }));
32629             break;
32630           }
32631         }
32632       }
32633       return _conflicts.length === ccount ? target.update({ nodes }) : target;
32634     }
32635     function mergeChildren(targetWay, children2, updates, graph) {
32636       function isUsed(node2, targetWay2) {
32637         var hasInterestingParent = graph.parentWays(node2).some(function(way) {
32638           return way.id !== targetWay2.id;
32639         });
32640         return node2.hasInterestingTags() || hasInterestingParent || graph.parentRelations(node2).length > 0;
32641       }
32642       var ccount = _conflicts.length;
32643       for (var i2 = 0; i2 < children2.length; i2++) {
32644         var id3 = children2[i2];
32645         var node = graph.hasEntity(id3);
32646         if (targetWay.nodes.indexOf(id3) === -1) {
32647           if (node && !isUsed(node, targetWay)) {
32648             updates.removeIds.push(id3);
32649           }
32650           continue;
32651         }
32652         var local = localGraph.hasEntity(id3);
32653         var remote = remoteGraph.hasEntity(id3);
32654         var target;
32655         if (_option === "force_remote" && remote && remote.visible) {
32656           updates.replacements.push(remote);
32657         } else if (_option === "force_local" && local) {
32658           target = osmEntity(local);
32659           if (remote) {
32660             target = target.update({ version: remote.version });
32661           }
32662           updates.replacements.push(target);
32663         } else if (_option === "safe" && local && remote && local.version !== remote.version) {
32664           target = osmEntity(local, { version: remote.version });
32665           if (remote.visible) {
32666             target = mergeLocation(remote, target);
32667           } else {
32668             _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } }));
32669           }
32670           if (_conflicts.length !== ccount)
32671             break;
32672           updates.replacements.push(target);
32673         }
32674       }
32675       return targetWay;
32676     }
32677     function updateChildren(updates, graph) {
32678       for (var i2 = 0; i2 < updates.replacements.length; i2++) {
32679         graph = graph.replace(updates.replacements[i2]);
32680       }
32681       if (updates.removeIds.length) {
32682         graph = actionDeleteMultiple(updates.removeIds)(graph);
32683       }
32684       return graph;
32685     }
32686     function mergeMembers(remote, target) {
32687       if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.members, remote.members)) {
32688         return target;
32689       }
32690       if (_option === "force_remote") {
32691         return target.update({ members: remote.members });
32692       }
32693       _conflicts.push(_t.html("merge_remote_changes.conflict.memberlist", { user: { html: user(remote.user) } }));
32694       return target;
32695     }
32696     function mergeTags(base, remote, target) {
32697       if (_option === "force_local" || (0, import_fast_deep_equal.default)(target.tags, remote.tags)) {
32698         return target;
32699       }
32700       if (_option === "force_remote") {
32701         return target.update({ tags: remote.tags });
32702       }
32703       var ccount = _conflicts.length;
32704       var o = base.tags || {};
32705       var a = target.tags || {};
32706       var b = remote.tags || {};
32707       var keys2 = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b)).filter(function(k2) {
32708         return !discardTags[k2];
32709       });
32710       var tags = Object.assign({}, a);
32711       var changed = false;
32712       for (var i2 = 0; i2 < keys2.length; i2++) {
32713         var k = keys2[i2];
32714         if (o[k] !== b[k] && a[k] !== b[k]) {
32715           if (o[k] !== a[k]) {
32716             _conflicts.push(_t.html(
32717               "merge_remote_changes.conflict.tags",
32718               { tag: k, local: a[k], remote: b[k], user: { html: user(remote.user) } }
32719             ));
32720           } else {
32721             if (b.hasOwnProperty(k)) {
32722               tags[k] = b[k];
32723             } else {
32724               delete tags[k];
32725             }
32726             changed = true;
32727           }
32728         }
32729       }
32730       return changed && _conflicts.length === ccount ? target.update({ tags }) : target;
32731     }
32732     var action = function(graph) {
32733       var updates = { replacements: [], removeIds: [] };
32734       var base = graph.base().entities[id2];
32735       var local = localGraph.entity(id2);
32736       var remote = remoteGraph.entity(id2);
32737       var target = osmEntity(local, { version: remote.version });
32738       if (!remote.visible) {
32739         if (_option === "force_remote") {
32740           return actionDeleteMultiple([id2])(graph);
32741         } else if (_option === "force_local") {
32742           if (target.type === "way") {
32743             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
32744             graph = updateChildren(updates, graph);
32745           }
32746           return graph.replace(target);
32747         } else {
32748           _conflicts.push(_t.html("merge_remote_changes.conflict.deleted", { user: { html: user(remote.user) } }));
32749           return graph;
32750         }
32751       }
32752       if (target.type === "node") {
32753         target = mergeLocation(remote, target);
32754       } else if (target.type === "way") {
32755         graph.rebase(remoteGraph.childNodes(remote), [graph], false);
32756         target = mergeNodes(base, remote, target);
32757         target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
32758       } else if (target.type === "relation") {
32759         target = mergeMembers(remote, target);
32760       }
32761       target = mergeTags(base, remote, target);
32762       if (!_conflicts.length) {
32763         graph = updateChildren(updates, graph).replace(target);
32764       }
32765       return graph;
32766     };
32767     action.withOption = function(opt) {
32768       _option = opt;
32769       return action;
32770     };
32771     action.conflicts = function() {
32772       return _conflicts;
32773     };
32774     return action;
32775   }
32776
32777   // modules/actions/move.js
32778   function actionMove(moveIDs, tryDelta, projection2, cache) {
32779     var _delta = tryDelta;
32780     function setupCache(graph) {
32781       function canMove(nodeID) {
32782         if (moveIDs.indexOf(nodeID) !== -1)
32783           return true;
32784         var parents = graph.parentWays(graph.entity(nodeID));
32785         if (parents.length < 3)
32786           return true;
32787         var parentsMoving = parents.every(function(way) {
32788           return cache.moving[way.id];
32789         });
32790         if (!parentsMoving)
32791           delete cache.moving[nodeID];
32792         return parentsMoving;
32793       }
32794       function cacheEntities(ids) {
32795         for (var i2 = 0; i2 < ids.length; i2++) {
32796           var id2 = ids[i2];
32797           if (cache.moving[id2])
32798             continue;
32799           cache.moving[id2] = true;
32800           var entity = graph.hasEntity(id2);
32801           if (!entity)
32802             continue;
32803           if (entity.type === "node") {
32804             cache.nodes.push(id2);
32805             cache.startLoc[id2] = entity.loc;
32806           } else if (entity.type === "way") {
32807             cache.ways.push(id2);
32808             cacheEntities(entity.nodes);
32809           } else {
32810             cacheEntities(entity.members.map(function(member) {
32811               return member.id;
32812             }));
32813           }
32814         }
32815       }
32816       function cacheIntersections(ids) {
32817         function isEndpoint(way2, id3) {
32818           return !way2.isClosed() && !!way2.affix(id3);
32819         }
32820         for (var i2 = 0; i2 < ids.length; i2++) {
32821           var id2 = ids[i2];
32822           var childNodes = graph.childNodes(graph.entity(id2));
32823           for (var j2 = 0; j2 < childNodes.length; j2++) {
32824             var node = childNodes[j2];
32825             var parents = graph.parentWays(node);
32826             if (parents.length !== 2)
32827               continue;
32828             var moved = graph.entity(id2);
32829             var unmoved = null;
32830             for (var k = 0; k < parents.length; k++) {
32831               var way = parents[k];
32832               if (!cache.moving[way.id]) {
32833                 unmoved = way;
32834                 break;
32835               }
32836             }
32837             if (!unmoved)
32838               continue;
32839             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2)
32840               continue;
32841             if (moved.isArea() || unmoved.isArea())
32842               continue;
32843             cache.intersections.push({
32844               nodeId: node.id,
32845               movedId: moved.id,
32846               unmovedId: unmoved.id,
32847               movedIsEP: isEndpoint(moved, node.id),
32848               unmovedIsEP: isEndpoint(unmoved, node.id)
32849             });
32850           }
32851         }
32852       }
32853       if (!cache) {
32854         cache = {};
32855       }
32856       if (!cache.ok) {
32857         cache.moving = {};
32858         cache.intersections = [];
32859         cache.replacedVertex = {};
32860         cache.startLoc = {};
32861         cache.nodes = [];
32862         cache.ways = [];
32863         cacheEntities(moveIDs);
32864         cacheIntersections(cache.ways);
32865         cache.nodes = cache.nodes.filter(canMove);
32866         cache.ok = true;
32867       }
32868     }
32869     function replaceMovedVertex(nodeId, wayId, graph, delta) {
32870       var way = graph.entity(wayId);
32871       var moved = graph.entity(nodeId);
32872       var movedIndex = way.nodes.indexOf(nodeId);
32873       var len, prevIndex, nextIndex;
32874       if (way.isClosed()) {
32875         len = way.nodes.length - 1;
32876         prevIndex = (movedIndex + len - 1) % len;
32877         nextIndex = (movedIndex + len + 1) % len;
32878       } else {
32879         len = way.nodes.length;
32880         prevIndex = movedIndex - 1;
32881         nextIndex = movedIndex + 1;
32882       }
32883       var prev = graph.hasEntity(way.nodes[prevIndex]);
32884       var next = graph.hasEntity(way.nodes[nextIndex]);
32885       if (!prev || !next)
32886         return graph;
32887       var key = wayId + "_" + nodeId;
32888       var orig = cache.replacedVertex[key];
32889       if (!orig) {
32890         orig = osmNode();
32891         cache.replacedVertex[key] = orig;
32892         cache.startLoc[orig.id] = cache.startLoc[nodeId];
32893       }
32894       var start2, end;
32895       if (delta) {
32896         start2 = projection2(cache.startLoc[nodeId]);
32897         end = projection2.invert(geoVecAdd(start2, delta));
32898       } else {
32899         end = cache.startLoc[nodeId];
32900       }
32901       orig = orig.move(end);
32902       var angle2 = Math.abs(geoAngle(orig, prev, projection2) - geoAngle(orig, next, projection2)) * 180 / Math.PI;
32903       if (angle2 > 175 && angle2 < 185)
32904         return graph;
32905       var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection2);
32906       var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection2);
32907       var d1 = geoPathLength(p1);
32908       var d2 = geoPathLength(p2);
32909       var insertAt = d1 <= d2 ? movedIndex : nextIndex;
32910       if (way.isClosed() && insertAt === 0)
32911         insertAt = len;
32912       way = way.addNode(orig.id, insertAt);
32913       return graph.replace(orig).replace(way);
32914     }
32915     function removeDuplicateVertices(wayId, graph) {
32916       var way = graph.entity(wayId);
32917       var epsilon3 = 1e-6;
32918       var prev, curr;
32919       function isInteresting(node, graph2) {
32920         return graph2.parentWays(node).length > 1 || graph2.parentRelations(node).length || node.hasInterestingTags();
32921       }
32922       for (var i2 = 0; i2 < way.nodes.length; i2++) {
32923         curr = graph.entity(way.nodes[i2]);
32924         if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon3)) {
32925           if (!isInteresting(prev, graph)) {
32926             way = way.removeNode(prev.id);
32927             graph = graph.replace(way).remove(prev);
32928           } else if (!isInteresting(curr, graph)) {
32929             way = way.removeNode(curr.id);
32930             graph = graph.replace(way).remove(curr);
32931           }
32932         }
32933         prev = curr;
32934       }
32935       return graph;
32936     }
32937     function unZorroIntersection(intersection, graph) {
32938       var vertex = graph.entity(intersection.nodeId);
32939       var way1 = graph.entity(intersection.movedId);
32940       var way2 = graph.entity(intersection.unmovedId);
32941       var isEP1 = intersection.movedIsEP;
32942       var isEP2 = intersection.unmovedIsEP;
32943       if (isEP1 && isEP2)
32944         return graph;
32945       var nodes1 = graph.childNodes(way1).filter(function(n2) {
32946         return n2 !== vertex;
32947       });
32948       var nodes2 = graph.childNodes(way2).filter(function(n2) {
32949         return n2 !== vertex;
32950       });
32951       if (way1.isClosed() && way1.first() === vertex.id)
32952         nodes1.push(nodes1[0]);
32953       if (way2.isClosed() && way2.first() === vertex.id)
32954         nodes2.push(nodes2[0]);
32955       var edge1 = !isEP1 && geoChooseEdge(nodes1, projection2(vertex.loc), projection2);
32956       var edge2 = !isEP2 && geoChooseEdge(nodes2, projection2(vertex.loc), projection2);
32957       var loc;
32958       if (!isEP1 && !isEP2) {
32959         var epsilon3 = 1e-6, maxIter = 10;
32960         for (var i2 = 0; i2 < maxIter; i2++) {
32961           loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
32962           edge1 = geoChooseEdge(nodes1, projection2(loc), projection2);
32963           edge2 = geoChooseEdge(nodes2, projection2(loc), projection2);
32964           if (Math.abs(edge1.distance - edge2.distance) < epsilon3)
32965             break;
32966         }
32967       } else if (!isEP1) {
32968         loc = edge1.loc;
32969       } else {
32970         loc = edge2.loc;
32971       }
32972       graph = graph.replace(vertex.move(loc));
32973       if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
32974         way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
32975         graph = graph.replace(way1);
32976       }
32977       if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
32978         way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
32979         graph = graph.replace(way2);
32980       }
32981       return graph;
32982     }
32983     function cleanupIntersections(graph) {
32984       for (var i2 = 0; i2 < cache.intersections.length; i2++) {
32985         var obj = cache.intersections[i2];
32986         graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
32987         graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
32988         graph = unZorroIntersection(obj, graph);
32989         graph = removeDuplicateVertices(obj.movedId, graph);
32990         graph = removeDuplicateVertices(obj.unmovedId, graph);
32991       }
32992       return graph;
32993     }
32994     function limitDelta(graph) {
32995       function moveNode(loc) {
32996         return geoVecAdd(projection2(loc), _delta);
32997       }
32998       for (var i2 = 0; i2 < cache.intersections.length; i2++) {
32999         var obj = cache.intersections[i2];
33000         if (obj.movedIsEP && obj.unmovedIsEP)
33001           continue;
33002         if (!obj.movedIsEP)
33003           continue;
33004         var node = graph.entity(obj.nodeId);
33005         var start2 = projection2(node.loc);
33006         var end = geoVecAdd(start2, _delta);
33007         var movedNodes = graph.childNodes(graph.entity(obj.movedId));
33008         var movedPath = movedNodes.map(function(n2) {
33009           return moveNode(n2.loc);
33010         });
33011         var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
33012         var unmovedPath = unmovedNodes.map(function(n2) {
33013           return projection2(n2.loc);
33014         });
33015         var hits = geoPathIntersections(movedPath, unmovedPath);
33016         for (var j2 = 0; i2 < hits.length; i2++) {
33017           if (geoVecEqual(hits[j2], end))
33018             continue;
33019           var edge = geoChooseEdge(unmovedNodes, end, projection2);
33020           _delta = geoVecSubtract(projection2(edge.loc), start2);
33021         }
33022       }
33023     }
33024     var action = function(graph) {
33025       if (_delta[0] === 0 && _delta[1] === 0)
33026         return graph;
33027       setupCache(graph);
33028       if (cache.intersections.length) {
33029         limitDelta(graph);
33030       }
33031       for (var i2 = 0; i2 < cache.nodes.length; i2++) {
33032         var node = graph.entity(cache.nodes[i2]);
33033         var start2 = projection2(node.loc);
33034         var end = geoVecAdd(start2, _delta);
33035         graph = graph.replace(node.move(projection2.invert(end)));
33036       }
33037       if (cache.intersections.length) {
33038         graph = cleanupIntersections(graph);
33039       }
33040       return graph;
33041     };
33042     action.delta = function() {
33043       return _delta;
33044     };
33045     return action;
33046   }
33047
33048   // modules/actions/move_member.js
33049   function actionMoveMember(relationId, fromIndex, toIndex) {
33050     return function(graph) {
33051       return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
33052     };
33053   }
33054
33055   // modules/actions/move_node.js
33056   function actionMoveNode(nodeID, toLoc) {
33057     var action = function(graph, t) {
33058       if (t === null || !isFinite(t))
33059         t = 1;
33060       t = Math.min(Math.max(+t, 0), 1);
33061       var node = graph.entity(nodeID);
33062       return graph.replace(
33063         node.move(geoVecInterp(node.loc, toLoc, t))
33064       );
33065     };
33066     action.transitionable = true;
33067     return action;
33068   }
33069
33070   // modules/actions/noop.js
33071   function actionNoop() {
33072     return function(graph) {
33073       return graph;
33074     };
33075   }
33076
33077   // modules/actions/orthogonalize.js
33078   function actionOrthogonalize(wayID, projection2, vertexID, degThresh, ep) {
33079     var epsilon3 = ep || 1e-4;
33080     var threshold = degThresh || 13;
33081     var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
33082     var upperThreshold = Math.cos(threshold * Math.PI / 180);
33083     var action = function(graph, t) {
33084       if (t === null || !isFinite(t))
33085         t = 1;
33086       t = Math.min(Math.max(+t, 0), 1);
33087       var way = graph.entity(wayID);
33088       way = way.removeNode("");
33089       if (way.tags.nonsquare) {
33090         var tags = Object.assign({}, way.tags);
33091         delete tags.nonsquare;
33092         way = way.update({ tags });
33093       }
33094       graph = graph.replace(way);
33095       var isClosed = way.isClosed();
33096       var nodes = graph.childNodes(way).slice();
33097       if (isClosed)
33098         nodes.pop();
33099       if (vertexID !== void 0) {
33100         nodes = nodeSubset(nodes, vertexID, isClosed);
33101         if (nodes.length !== 3)
33102           return graph;
33103       }
33104       var nodeCount = {};
33105       var points = [];
33106       var corner = { i: 0, dotp: 1 };
33107       var node, point2, loc, score, motions, i2, j2;
33108       for (i2 = 0; i2 < nodes.length; i2++) {
33109         node = nodes[i2];
33110         nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
33111         points.push({ id: node.id, coord: projection2(node.loc) });
33112       }
33113       if (points.length === 3) {
33114         for (i2 = 0; i2 < 1e3; i2++) {
33115           motions = points.map(calcMotion);
33116           points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
33117           score = corner.dotp;
33118           if (score < epsilon3) {
33119             break;
33120           }
33121         }
33122         node = graph.entity(nodes[corner.i].id);
33123         loc = projection2.invert(points[corner.i].coord);
33124         graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
33125       } else {
33126         var straights = [];
33127         var simplified = [];
33128         for (i2 = 0; i2 < points.length; i2++) {
33129           point2 = points[i2];
33130           var dotp = 0;
33131           if (isClosed || i2 > 0 && i2 < points.length - 1) {
33132             var a = points[(i2 - 1 + points.length) % points.length];
33133             var b = points[(i2 + 1) % points.length];
33134             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point2.coord));
33135           }
33136           if (dotp > upperThreshold) {
33137             straights.push(point2);
33138           } else {
33139             simplified.push(point2);
33140           }
33141         }
33142         var bestPoints = clonePoints(simplified);
33143         var originalPoints = clonePoints(simplified);
33144         score = Infinity;
33145         for (i2 = 0; i2 < 1e3; i2++) {
33146           motions = simplified.map(calcMotion);
33147           for (j2 = 0; j2 < motions.length; j2++) {
33148             simplified[j2].coord = geoVecAdd(simplified[j2].coord, motions[j2]);
33149           }
33150           var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon3, threshold);
33151           if (newScore < score) {
33152             bestPoints = clonePoints(simplified);
33153             score = newScore;
33154           }
33155           if (score < epsilon3) {
33156             break;
33157           }
33158         }
33159         var bestCoords = bestPoints.map(function(p) {
33160           return p.coord;
33161         });
33162         if (isClosed)
33163           bestCoords.push(bestCoords[0]);
33164         for (i2 = 0; i2 < bestPoints.length; i2++) {
33165           point2 = bestPoints[i2];
33166           if (!geoVecEqual(originalPoints[i2].coord, point2.coord)) {
33167             node = graph.entity(point2.id);
33168             loc = projection2.invert(point2.coord);
33169             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
33170           }
33171         }
33172         for (i2 = 0; i2 < straights.length; i2++) {
33173           point2 = straights[i2];
33174           if (nodeCount[point2.id] > 1)
33175             continue;
33176           node = graph.entity(point2.id);
33177           if (t === 1 && graph.parentWays(node).length === 1 && graph.parentRelations(node).length === 0 && !node.hasInterestingTags()) {
33178             graph = actionDeleteNode(node.id)(graph);
33179           } else {
33180             var choice = geoVecProject(point2.coord, bestCoords);
33181             if (choice) {
33182               loc = projection2.invert(choice.target);
33183               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
33184             }
33185           }
33186         }
33187       }
33188       return graph;
33189       function clonePoints(array2) {
33190         return array2.map(function(p) {
33191           return { id: p.id, coord: [p.coord[0], p.coord[1]] };
33192         });
33193       }
33194       function calcMotion(point3, i3, array2) {
33195         if (!isClosed && (i3 === 0 || i3 === array2.length - 1))
33196           return [0, 0];
33197         if (nodeCount[array2[i3].id] > 1)
33198           return [0, 0];
33199         var a2 = array2[(i3 - 1 + array2.length) % array2.length].coord;
33200         var origin = point3.coord;
33201         var b2 = array2[(i3 + 1) % array2.length].coord;
33202         var p = geoVecSubtract(a2, origin);
33203         var q = geoVecSubtract(b2, origin);
33204         var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
33205         p = geoVecNormalize(p);
33206         q = geoVecNormalize(q);
33207         var dotp2 = p[0] * q[0] + p[1] * q[1];
33208         var val = Math.abs(dotp2);
33209         if (val < lowerThreshold) {
33210           corner.i = i3;
33211           corner.dotp = val;
33212           var vec = geoVecNormalize(geoVecAdd(p, q));
33213           return geoVecScale(vec, 0.1 * dotp2 * scale);
33214         }
33215         return [0, 0];
33216       }
33217     };
33218     function nodeSubset(nodes, vertexID2, isClosed) {
33219       var first = isClosed ? 0 : 1;
33220       var last = isClosed ? nodes.length : nodes.length - 1;
33221       for (var i2 = first; i2 < last; i2++) {
33222         if (nodes[i2].id === vertexID2) {
33223           return [
33224             nodes[(i2 - 1 + nodes.length) % nodes.length],
33225             nodes[i2],
33226             nodes[(i2 + 1) % nodes.length]
33227           ];
33228         }
33229       }
33230       return [];
33231     }
33232     action.disabled = function(graph) {
33233       var way = graph.entity(wayID);
33234       way = way.removeNode("");
33235       graph = graph.replace(way);
33236       var isClosed = way.isClosed();
33237       var nodes = graph.childNodes(way).slice();
33238       if (isClosed)
33239         nodes.pop();
33240       var allowStraightAngles = false;
33241       if (vertexID !== void 0) {
33242         allowStraightAngles = true;
33243         nodes = nodeSubset(nodes, vertexID, isClosed);
33244         if (nodes.length !== 3)
33245           return "end_vertex";
33246       }
33247       var coords = nodes.map(function(n2) {
33248         return projection2(n2.loc);
33249       });
33250       var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon3, threshold, allowStraightAngles);
33251       if (score === null) {
33252         return "not_squarish";
33253       } else if (score === 0) {
33254         return "square_enough";
33255       } else {
33256         return false;
33257       }
33258     };
33259     action.transitionable = true;
33260     return action;
33261   }
33262
33263   // modules/actions/restrict_turn.js
33264   function actionRestrictTurn(turn, restrictionType, restrictionID) {
33265     return function(graph) {
33266       var fromWay = graph.entity(turn.from.way);
33267       var toWay = graph.entity(turn.to.way);
33268       var viaNode = turn.via.node && graph.entity(turn.via.node);
33269       var viaWays = turn.via.ways && turn.via.ways.map(function(id2) {
33270         return graph.entity(id2);
33271       });
33272       var members = [];
33273       members.push({ id: fromWay.id, type: "way", role: "from" });
33274       if (viaNode) {
33275         members.push({ id: viaNode.id, type: "node", role: "via" });
33276       } else if (viaWays) {
33277         viaWays.forEach(function(viaWay) {
33278           members.push({ id: viaWay.id, type: "way", role: "via" });
33279         });
33280       }
33281       members.push({ id: toWay.id, type: "way", role: "to" });
33282       return graph.replace(osmRelation({
33283         id: restrictionID,
33284         tags: {
33285           type: "restriction",
33286           restriction: restrictionType
33287         },
33288         members
33289       }));
33290     };
33291   }
33292
33293   // modules/actions/revert.js
33294   function actionRevert(id2) {
33295     var action = function(graph) {
33296       var entity = graph.hasEntity(id2), base = graph.base().entities[id2];
33297       if (entity && !base) {
33298         if (entity.type === "node") {
33299           graph.parentWays(entity).forEach(function(parent) {
33300             parent = parent.removeNode(id2);
33301             graph = graph.replace(parent);
33302             if (parent.isDegenerate()) {
33303               graph = actionDeleteWay(parent.id)(graph);
33304             }
33305           });
33306         }
33307         graph.parentRelations(entity).forEach(function(parent) {
33308           parent = parent.removeMembersWithID(id2);
33309           graph = graph.replace(parent);
33310           if (parent.isDegenerate()) {
33311             graph = actionDeleteRelation(parent.id)(graph);
33312           }
33313         });
33314       }
33315       return graph.revert(id2);
33316     };
33317     return action;
33318   }
33319
33320   // modules/actions/rotate.js
33321   function actionRotate(rotateIds, pivot, angle2, projection2) {
33322     var action = function(graph) {
33323       return graph.update(function(graph2) {
33324         utilGetAllNodes(rotateIds, graph2).forEach(function(node) {
33325           var point2 = geoRotate([projection2(node.loc)], angle2, pivot)[0];
33326           graph2 = graph2.replace(node.move(projection2.invert(point2)));
33327         });
33328       });
33329     };
33330     return action;
33331   }
33332
33333   // modules/actions/scale.js
33334   function actionScale(ids, pivotLoc, scaleFactor, projection2) {
33335     return function(graph) {
33336       return graph.update(function(graph2) {
33337         let point2, radial;
33338         utilGetAllNodes(ids, graph2).forEach(function(node) {
33339           point2 = projection2(node.loc);
33340           radial = [
33341             point2[0] - pivotLoc[0],
33342             point2[1] - pivotLoc[1]
33343           ];
33344           point2 = [
33345             pivotLoc[0] + scaleFactor * radial[0],
33346             pivotLoc[1] + scaleFactor * radial[1]
33347           ];
33348           graph2 = graph2.replace(node.move(projection2.invert(point2)));
33349         });
33350       });
33351     };
33352   }
33353
33354   // modules/actions/straighten_nodes.js
33355   function actionStraightenNodes(nodeIDs, projection2) {
33356     function positionAlongWay(a, o, b) {
33357       return geoVecDot(a, b, o) / geoVecDot(b, b, o);
33358     }
33359     function getEndpoints(points) {
33360       var ssr = geoGetSmallestSurroundingRectangle(points);
33361       var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
33362       var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
33363       var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
33364       var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
33365       var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
33366       if (isLong) {
33367         return [p1, q1];
33368       }
33369       return [p2, q2];
33370     }
33371     var action = function(graph, t) {
33372       if (t === null || !isFinite(t))
33373         t = 1;
33374       t = Math.min(Math.max(+t, 0), 1);
33375       var nodes = nodeIDs.map(function(id2) {
33376         return graph.entity(id2);
33377       });
33378       var points = nodes.map(function(n2) {
33379         return projection2(n2.loc);
33380       });
33381       var endpoints = getEndpoints(points);
33382       var startPoint = endpoints[0];
33383       var endPoint = endpoints[1];
33384       for (var i2 = 0; i2 < points.length; i2++) {
33385         var node = nodes[i2];
33386         var point2 = points[i2];
33387         var u = positionAlongWay(point2, startPoint, endPoint);
33388         var point22 = geoVecInterp(startPoint, endPoint, u);
33389         var loc2 = projection2.invert(point22);
33390         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
33391       }
33392       return graph;
33393     };
33394     action.disabled = function(graph) {
33395       var nodes = nodeIDs.map(function(id2) {
33396         return graph.entity(id2);
33397       });
33398       var points = nodes.map(function(n2) {
33399         return projection2(n2.loc);
33400       });
33401       var endpoints = getEndpoints(points);
33402       var startPoint = endpoints[0];
33403       var endPoint = endpoints[1];
33404       var maxDistance = 0;
33405       for (var i2 = 0; i2 < points.length; i2++) {
33406         var point2 = points[i2];
33407         var u = positionAlongWay(point2, startPoint, endPoint);
33408         var p = geoVecInterp(startPoint, endPoint, u);
33409         var dist = geoVecLength(p, point2);
33410         if (!isNaN(dist) && dist > maxDistance) {
33411           maxDistance = dist;
33412         }
33413       }
33414       if (maxDistance < 1e-4) {
33415         return "straight_enough";
33416       }
33417     };
33418     action.transitionable = true;
33419     return action;
33420   }
33421
33422   // modules/actions/straighten_way.js
33423   function actionStraightenWay(selectedIDs, projection2) {
33424     function positionAlongWay(a, o, b) {
33425       return geoVecDot(a, b, o) / geoVecDot(b, b, o);
33426     }
33427     function allNodes(graph) {
33428       var nodes = [];
33429       var startNodes = [];
33430       var endNodes = [];
33431       var remainingWays = [];
33432       var selectedWays = selectedIDs.filter(function(w) {
33433         return graph.entity(w).type === "way";
33434       });
33435       var selectedNodes = selectedIDs.filter(function(n2) {
33436         return graph.entity(n2).type === "node";
33437       });
33438       for (var i2 = 0; i2 < selectedWays.length; i2++) {
33439         var way = graph.entity(selectedWays[i2]);
33440         nodes = way.nodes.slice(0);
33441         remainingWays.push(nodes);
33442         startNodes.push(nodes[0]);
33443         endNodes.push(nodes[nodes.length - 1]);
33444       }
33445       startNodes = startNodes.filter(function(n2) {
33446         return startNodes.indexOf(n2) === startNodes.lastIndexOf(n2);
33447       });
33448       endNodes = endNodes.filter(function(n2) {
33449         return endNodes.indexOf(n2) === endNodes.lastIndexOf(n2);
33450       });
33451       var currNode = utilArrayDifference(startNodes, endNodes).concat(utilArrayDifference(endNodes, startNodes))[0];
33452       var nextWay = [];
33453       nodes = [];
33454       var getNextWay = function(currNode2, remainingWays2) {
33455         return remainingWays2.filter(function(way2) {
33456           return way2[0] === currNode2 || way2[way2.length - 1] === currNode2;
33457         })[0];
33458       };
33459       while (remainingWays.length) {
33460         nextWay = getNextWay(currNode, remainingWays);
33461         remainingWays = utilArrayDifference(remainingWays, [nextWay]);
33462         if (nextWay[0] !== currNode) {
33463           nextWay.reverse();
33464         }
33465         nodes = nodes.concat(nextWay);
33466         currNode = nodes[nodes.length - 1];
33467       }
33468       if (selectedNodes.length === 2) {
33469         var startNodeIdx = nodes.indexOf(selectedNodes[0]);
33470         var endNodeIdx = nodes.indexOf(selectedNodes[1]);
33471         var sortedStartEnd = [startNodeIdx, endNodeIdx];
33472         sortedStartEnd.sort(function(a, b) {
33473           return a - b;
33474         });
33475         nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1] + 1);
33476       }
33477       return nodes.map(function(n2) {
33478         return graph.entity(n2);
33479       });
33480     }
33481     function shouldKeepNode(node, graph) {
33482       return graph.parentWays(node).length > 1 || graph.parentRelations(node).length || node.hasInterestingTags();
33483     }
33484     var action = function(graph, t) {
33485       if (t === null || !isFinite(t))
33486         t = 1;
33487       t = Math.min(Math.max(+t, 0), 1);
33488       var nodes = allNodes(graph);
33489       var points = nodes.map(function(n2) {
33490         return projection2(n2.loc);
33491       });
33492       var startPoint = points[0];
33493       var endPoint = points[points.length - 1];
33494       var toDelete = [];
33495       var i2;
33496       for (i2 = 1; i2 < points.length - 1; i2++) {
33497         var node = nodes[i2];
33498         var point2 = points[i2];
33499         if (t < 1 || shouldKeepNode(node, graph)) {
33500           var u = positionAlongWay(point2, startPoint, endPoint);
33501           var p = geoVecInterp(startPoint, endPoint, u);
33502           var loc2 = projection2.invert(p);
33503           graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
33504         } else {
33505           if (toDelete.indexOf(node) === -1) {
33506             toDelete.push(node);
33507           }
33508         }
33509       }
33510       for (i2 = 0; i2 < toDelete.length; i2++) {
33511         graph = actionDeleteNode(toDelete[i2].id)(graph);
33512       }
33513       return graph;
33514     };
33515     action.disabled = function(graph) {
33516       var nodes = allNodes(graph);
33517       var points = nodes.map(function(n2) {
33518         return projection2(n2.loc);
33519       });
33520       var startPoint = points[0];
33521       var endPoint = points[points.length - 1];
33522       var threshold = 0.2 * geoVecLength(startPoint, endPoint);
33523       var i2;
33524       if (threshold === 0) {
33525         return "too_bendy";
33526       }
33527       var maxDistance = 0;
33528       for (i2 = 1; i2 < points.length - 1; i2++) {
33529         var point2 = points[i2];
33530         var u = positionAlongWay(point2, startPoint, endPoint);
33531         var p = geoVecInterp(startPoint, endPoint, u);
33532         var dist = geoVecLength(p, point2);
33533         if (isNaN(dist) || dist > threshold) {
33534           return "too_bendy";
33535         } else if (dist > maxDistance) {
33536           maxDistance = dist;
33537         }
33538       }
33539       var keepingAllNodes = nodes.every(function(node, i3) {
33540         return i3 === 0 || i3 === nodes.length - 1 || shouldKeepNode(node, graph);
33541       });
33542       if (maxDistance < 1e-4 && // Allow straightening even if already straight in order to remove extraneous nodes
33543       keepingAllNodes) {
33544         return "straight_enough";
33545       }
33546     };
33547     action.transitionable = true;
33548     return action;
33549   }
33550
33551   // modules/actions/unrestrict_turn.js
33552   function actionUnrestrictTurn(turn) {
33553     return function(graph) {
33554       return actionDeleteRelation(turn.restrictionID)(graph);
33555     };
33556   }
33557
33558   // modules/actions/reflect.js
33559   function actionReflect(reflectIds, projection2) {
33560     var _useLongAxis = true;
33561     var action = function(graph, t) {
33562       if (t === null || !isFinite(t))
33563         t = 1;
33564       t = Math.min(Math.max(+t, 0), 1);
33565       var nodes = utilGetAllNodes(reflectIds, graph);
33566       var points = nodes.map(function(n2) {
33567         return projection2(n2.loc);
33568       });
33569       var ssr = geoGetSmallestSurroundingRectangle(points);
33570       var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2];
33571       var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2];
33572       var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2];
33573       var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2];
33574       var p, q;
33575       var isLong = geoVecLength(p1, q1) > geoVecLength(p2, q2);
33576       if (_useLongAxis && isLong || !_useLongAxis && !isLong) {
33577         p = p1;
33578         q = q1;
33579       } else {
33580         p = p2;
33581         q = q2;
33582       }
33583       var dx = q[0] - p[0];
33584       var dy = q[1] - p[1];
33585       var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
33586       var b = 2 * dx * dy / (dx * dx + dy * dy);
33587       for (var i2 = 0; i2 < nodes.length; i2++) {
33588         var node = nodes[i2];
33589         var c = projection2(node.loc);
33590         var c2 = [
33591           a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
33592           b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
33593         ];
33594         var loc2 = projection2.invert(c2);
33595         node = node.move(geoVecInterp(node.loc, loc2, t));
33596         graph = graph.replace(node);
33597       }
33598       return graph;
33599     };
33600     action.useLongAxis = function(val) {
33601       if (!arguments.length)
33602         return _useLongAxis;
33603       _useLongAxis = val;
33604       return action;
33605     };
33606     action.transitionable = true;
33607     return action;
33608   }
33609
33610   // modules/actions/upgrade_tags.js
33611   function actionUpgradeTags(entityId, oldTags, replaceTags) {
33612     return function(graph) {
33613       var entity = graph.entity(entityId);
33614       var tags = Object.assign({}, entity.tags);
33615       var transferValue;
33616       var semiIndex;
33617       for (var oldTagKey in oldTags) {
33618         if (!(oldTagKey in tags))
33619           continue;
33620         if (oldTags[oldTagKey] === "*") {
33621           transferValue = tags[oldTagKey];
33622           delete tags[oldTagKey];
33623         } else if (oldTags[oldTagKey] === tags[oldTagKey]) {
33624           delete tags[oldTagKey];
33625         } else {
33626           var vals = tags[oldTagKey].split(";").filter(Boolean);
33627           var oldIndex = vals.indexOf(oldTags[oldTagKey]);
33628           if (vals.length === 1 || oldIndex === -1) {
33629             delete tags[oldTagKey];
33630           } else {
33631             if (replaceTags && replaceTags[oldTagKey]) {
33632               semiIndex = oldIndex;
33633             }
33634             vals.splice(oldIndex, 1);
33635             tags[oldTagKey] = vals.join(";");
33636           }
33637         }
33638       }
33639       if (replaceTags) {
33640         for (var replaceKey in replaceTags) {
33641           var replaceValue = replaceTags[replaceKey];
33642           if (replaceValue === "*") {
33643             if (tags[replaceKey] && tags[replaceKey] !== "no") {
33644               continue;
33645             } else {
33646               tags[replaceKey] = "yes";
33647             }
33648           } else if (replaceValue === "$1") {
33649             tags[replaceKey] = transferValue;
33650           } else {
33651             if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== void 0) {
33652               var existingVals = tags[replaceKey].split(";").filter(Boolean);
33653               if (existingVals.indexOf(replaceValue) === -1) {
33654                 existingVals.splice(semiIndex, 0, replaceValue);
33655                 tags[replaceKey] = existingVals.join(";");
33656               }
33657             } else {
33658               tags[replaceKey] = replaceValue;
33659             }
33660           }
33661         }
33662       }
33663       return graph.replace(entity.update({ tags }));
33664     };
33665   }
33666
33667   // modules/behavior/edit.js
33668   function behaviorEdit(context) {
33669     function behavior() {
33670       context.map().minzoom(context.minEditableZoom());
33671     }
33672     behavior.off = function() {
33673       context.map().minzoom(0);
33674     };
33675     return behavior;
33676   }
33677
33678   // modules/behavior/hover.js
33679   function behaviorHover(context) {
33680     var dispatch10 = dispatch_default("hover");
33681     var _selection = select_default2(null);
33682     var _newNodeId = null;
33683     var _initialNodeID = null;
33684     var _altDisables;
33685     var _ignoreVertex;
33686     var _targets = [];
33687     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
33688     function keydown(d3_event) {
33689       if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
33690         _selection.selectAll(".hover").classed("hover-suppressed", true).classed("hover", false);
33691         _selection.classed("hover-disabled", true);
33692         dispatch10.call("hover", this, null);
33693       }
33694     }
33695     function keyup(d3_event) {
33696       if (_altDisables && d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
33697         _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false).classed("hover", true);
33698         _selection.classed("hover-disabled", false);
33699         dispatch10.call("hover", this, _targets);
33700       }
33701     }
33702     function behavior(selection2) {
33703       _selection = selection2;
33704       _targets = [];
33705       if (_initialNodeID) {
33706         _newNodeId = _initialNodeID;
33707         _initialNodeID = null;
33708       } else {
33709         _newNodeId = null;
33710       }
33711       _selection.on(_pointerPrefix + "over.hover", pointerover).on(_pointerPrefix + "out.hover", pointerout).on(_pointerPrefix + "down.hover", pointerover);
33712       select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", pointerout, true).on("keydown.hover", keydown).on("keyup.hover", keyup);
33713       function eventTarget(d3_event) {
33714         var datum2 = d3_event.target && d3_event.target.__data__;
33715         if (typeof datum2 !== "object")
33716           return null;
33717         if (!(datum2 instanceof osmEntity) && datum2.properties && datum2.properties.entity instanceof osmEntity) {
33718           return datum2.properties.entity;
33719         }
33720         return datum2;
33721       }
33722       function pointerover(d3_event) {
33723         if (context.mode().id.indexOf("drag") === -1 && (!d3_event.pointerType || d3_event.pointerType === "mouse") && d3_event.buttons)
33724           return;
33725         var target = eventTarget(d3_event);
33726         if (target && _targets.indexOf(target) === -1) {
33727           _targets.push(target);
33728           updateHover(d3_event, _targets);
33729         }
33730       }
33731       function pointerout(d3_event) {
33732         var target = eventTarget(d3_event);
33733         var index = _targets.indexOf(target);
33734         if (index !== -1) {
33735           _targets.splice(index);
33736           updateHover(d3_event, _targets);
33737         }
33738       }
33739       function allowsVertex(d) {
33740         return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
33741       }
33742       function modeAllowsHover(target) {
33743         var mode = context.mode();
33744         if (mode.id === "add-point") {
33745           return mode.preset.matchGeometry("vertex") || target.type !== "way" && target.geometry(context.graph()) !== "vertex";
33746         }
33747         return true;
33748       }
33749       function updateHover(d3_event, targets) {
33750         _selection.selectAll(".hover").classed("hover", false);
33751         _selection.selectAll(".hover-suppressed").classed("hover-suppressed", false);
33752         var mode = context.mode();
33753         if (!_newNodeId && (mode.id === "draw-line" || mode.id === "draw-area")) {
33754           var node = targets.find(function(target) {
33755             return target instanceof osmEntity && target.type === "node";
33756           });
33757           _newNodeId = node && node.id;
33758         }
33759         targets = targets.filter(function(datum3) {
33760           if (datum3 instanceof osmEntity) {
33761             return datum3.id !== _newNodeId && (datum3.type !== "node" || !_ignoreVertex || allowsVertex(datum3)) && modeAllowsHover(datum3);
33762           }
33763           return true;
33764         });
33765         var selector = "";
33766         for (var i2 in targets) {
33767           var datum2 = targets[i2];
33768           if (datum2.__featurehash__) {
33769             selector += ", .data" + datum2.__featurehash__;
33770           } else if (datum2 instanceof QAItem) {
33771             selector += ", ." + datum2.service + ".itemId-" + datum2.id;
33772           } else if (datum2 instanceof osmNote) {
33773             selector += ", .note-" + datum2.id;
33774           } else if (datum2 instanceof osmEntity) {
33775             selector += ", ." + datum2.id;
33776             if (datum2.type === "relation") {
33777               for (var j2 in datum2.members) {
33778                 selector += ", ." + datum2.members[j2].id;
33779               }
33780             }
33781           }
33782         }
33783         var suppressed = _altDisables && d3_event && d3_event.altKey;
33784         if (selector.trim().length) {
33785           selector = selector.slice(1);
33786           _selection.selectAll(selector).classed(suppressed ? "hover-suppressed" : "hover", true);
33787         }
33788         dispatch10.call("hover", this, !suppressed && targets);
33789       }
33790     }
33791     behavior.off = function(selection2) {
33792       selection2.selectAll(".hover").classed("hover", false);
33793       selection2.selectAll(".hover-suppressed").classed("hover-suppressed", false);
33794       selection2.classed("hover-disabled", false);
33795       selection2.on(_pointerPrefix + "over.hover", null).on(_pointerPrefix + "out.hover", null).on(_pointerPrefix + "down.hover", null);
33796       select_default2(window).on(_pointerPrefix + "up.hover pointercancel.hover", null, true).on("keydown.hover", null).on("keyup.hover", null);
33797     };
33798     behavior.altDisables = function(val) {
33799       if (!arguments.length)
33800         return _altDisables;
33801       _altDisables = val;
33802       return behavior;
33803     };
33804     behavior.ignoreVertex = function(val) {
33805       if (!arguments.length)
33806         return _ignoreVertex;
33807       _ignoreVertex = val;
33808       return behavior;
33809     };
33810     behavior.initialNodeID = function(nodeId) {
33811       _initialNodeID = nodeId;
33812       return behavior;
33813     };
33814     return utilRebind(behavior, dispatch10, "on");
33815   }
33816
33817   // modules/behavior/draw.js
33818   var _disableSpace = false;
33819   var _lastSpace = null;
33820   function behaviorDraw(context) {
33821     var dispatch10 = dispatch_default(
33822       "move",
33823       "down",
33824       "downcancel",
33825       "click",
33826       "clickWay",
33827       "clickNode",
33828       "undo",
33829       "cancel",
33830       "finish"
33831     );
33832     var keybinding = utilKeybinding("draw");
33833     var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true).on("hover", context.ui().sidebar.hover);
33834     var _edit = behaviorEdit(context);
33835     var _closeTolerance = 4;
33836     var _tolerance = 12;
33837     var _mouseLeave = false;
33838     var _lastMouse = null;
33839     var _lastPointerUpEvent;
33840     var _downPointer;
33841     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
33842     function datum2(d3_event) {
33843       var mode = context.mode();
33844       var isNote = mode && mode.id.indexOf("note") !== -1;
33845       if (d3_event.altKey || isNote)
33846         return {};
33847       var element;
33848       if (d3_event.type === "keydown") {
33849         element = _lastMouse && _lastMouse.target;
33850       } else {
33851         element = d3_event.target;
33852       }
33853       var d = element.__data__;
33854       return d && d.properties && d.properties.target ? d : {};
33855     }
33856     function pointerdown(d3_event) {
33857       if (_downPointer)
33858         return;
33859       var pointerLocGetter = utilFastMouse(this);
33860       _downPointer = {
33861         id: d3_event.pointerId || "mouse",
33862         pointerLocGetter,
33863         downTime: +/* @__PURE__ */ new Date(),
33864         downLoc: pointerLocGetter(d3_event)
33865       };
33866       dispatch10.call("down", this, d3_event, datum2(d3_event));
33867     }
33868     function pointerup(d3_event) {
33869       if (!_downPointer || _downPointer.id !== (d3_event.pointerId || "mouse"))
33870         return;
33871       var downPointer = _downPointer;
33872       _downPointer = null;
33873       _lastPointerUpEvent = d3_event;
33874       if (downPointer.isCancelled)
33875         return;
33876       var t2 = +/* @__PURE__ */ new Date();
33877       var p2 = downPointer.pointerLocGetter(d3_event);
33878       var dist = geoVecLength(downPointer.downLoc, p2);
33879       if (dist < _closeTolerance || dist < _tolerance && t2 - downPointer.downTime < 500) {
33880         select_default2(window).on("click.draw-block", function() {
33881           d3_event.stopPropagation();
33882         }, true);
33883         context.map().dblclickZoomEnable(false);
33884         window.setTimeout(function() {
33885           context.map().dblclickZoomEnable(true);
33886           select_default2(window).on("click.draw-block", null);
33887         }, 500);
33888         click(d3_event, p2);
33889       }
33890     }
33891     function pointermove(d3_event) {
33892       if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse") && !_downPointer.isCancelled) {
33893         var p2 = _downPointer.pointerLocGetter(d3_event);
33894         var dist = geoVecLength(_downPointer.downLoc, p2);
33895         if (dist >= _closeTolerance) {
33896           _downPointer.isCancelled = true;
33897           dispatch10.call("downcancel", this);
33898         }
33899       }
33900       if (d3_event.pointerType && d3_event.pointerType !== "mouse" || d3_event.buttons || _downPointer)
33901         return;
33902       if (_lastPointerUpEvent && _lastPointerUpEvent.pointerType !== "mouse" && d3_event.timeStamp - _lastPointerUpEvent.timeStamp < 100)
33903         return;
33904       _lastMouse = d3_event;
33905       dispatch10.call("move", this, d3_event, datum2(d3_event));
33906     }
33907     function pointercancel(d3_event) {
33908       if (_downPointer && _downPointer.id === (d3_event.pointerId || "mouse")) {
33909         if (!_downPointer.isCancelled) {
33910           dispatch10.call("downcancel", this);
33911         }
33912         _downPointer = null;
33913       }
33914     }
33915     function mouseenter() {
33916       _mouseLeave = false;
33917     }
33918     function mouseleave() {
33919       _mouseLeave = true;
33920     }
33921     function allowsVertex(d) {
33922       return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
33923     }
33924     function click(d3_event, loc) {
33925       var d = datum2(d3_event);
33926       var target = d && d.properties && d.properties.entity;
33927       var mode = context.mode();
33928       if (target && target.type === "node" && allowsVertex(target)) {
33929         dispatch10.call("clickNode", this, target, d);
33930         return;
33931       } else if (target && target.type === "way" && (mode.id !== "add-point" || mode.preset.matchGeometry("vertex"))) {
33932         var choice = geoChooseEdge(
33933           context.graph().childNodes(target),
33934           loc,
33935           context.projection,
33936           context.activeID()
33937         );
33938         if (choice) {
33939           var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
33940           dispatch10.call("clickWay", this, choice.loc, edge, d);
33941           return;
33942         }
33943       } else if (mode.id !== "add-point" || mode.preset.matchGeometry("point")) {
33944         var locLatLng = context.projection.invert(loc);
33945         dispatch10.call("click", this, locLatLng, d);
33946       }
33947     }
33948     function space(d3_event) {
33949       d3_event.preventDefault();
33950       d3_event.stopPropagation();
33951       var currSpace = context.map().mouse();
33952       if (_disableSpace && _lastSpace) {
33953         var dist = geoVecLength(_lastSpace, currSpace);
33954         if (dist > _tolerance) {
33955           _disableSpace = false;
33956         }
33957       }
33958       if (_disableSpace || _mouseLeave || !_lastMouse)
33959         return;
33960       _lastSpace = currSpace;
33961       _disableSpace = true;
33962       select_default2(window).on("keyup.space-block", function() {
33963         d3_event.preventDefault();
33964         d3_event.stopPropagation();
33965         _disableSpace = false;
33966         select_default2(window).on("keyup.space-block", null);
33967       });
33968       var loc = context.map().mouse() || // or the map center if the mouse has never entered the map
33969       context.projection(context.map().center());
33970       click(d3_event, loc);
33971     }
33972     function backspace(d3_event) {
33973       d3_event.preventDefault();
33974       dispatch10.call("undo");
33975     }
33976     function del(d3_event) {
33977       d3_event.preventDefault();
33978       dispatch10.call("cancel");
33979     }
33980     function ret(d3_event) {
33981       d3_event.preventDefault();
33982       dispatch10.call("finish");
33983     }
33984     function behavior(selection2) {
33985       context.install(_hover);
33986       context.install(_edit);
33987       _downPointer = null;
33988       keybinding.on("\u232B", backspace).on("\u2326", del).on("\u238B", ret).on("\u21A9", ret).on("space", space).on("\u2325space", space);
33989       selection2.on("mouseenter.draw", mouseenter).on("mouseleave.draw", mouseleave).on(_pointerPrefix + "down.draw", pointerdown).on(_pointerPrefix + "move.draw", pointermove);
33990       select_default2(window).on(_pointerPrefix + "up.draw", pointerup, true).on("pointercancel.draw", pointercancel, true);
33991       select_default2(document).call(keybinding);
33992       return behavior;
33993     }
33994     behavior.off = function(selection2) {
33995       context.ui().sidebar.hover.cancel();
33996       context.uninstall(_hover);
33997       context.uninstall(_edit);
33998       selection2.on("mouseenter.draw", null).on("mouseleave.draw", null).on(_pointerPrefix + "down.draw", null).on(_pointerPrefix + "move.draw", null);
33999       select_default2(window).on(_pointerPrefix + "up.draw", null).on("pointercancel.draw", null);
34000       select_default2(document).call(keybinding.unbind);
34001     };
34002     behavior.hover = function() {
34003       return _hover;
34004     };
34005     return utilRebind(behavior, dispatch10, "on");
34006   }
34007
34008   // modules/behavior/breathe.js
34009   var import_fast_deep_equal2 = __toESM(require_fast_deep_equal());
34010
34011   // node_modules/d3-scale/src/init.js
34012   function initRange(domain2, range3) {
34013     switch (arguments.length) {
34014       case 0:
34015         break;
34016       case 1:
34017         this.range(domain2);
34018         break;
34019       default:
34020         this.range(range3).domain(domain2);
34021         break;
34022     }
34023     return this;
34024   }
34025
34026   // node_modules/d3-scale/src/constant.js
34027   function constants(x) {
34028     return function() {
34029       return x;
34030     };
34031   }
34032
34033   // node_modules/d3-scale/src/number.js
34034   function number2(x) {
34035     return +x;
34036   }
34037
34038   // node_modules/d3-scale/src/continuous.js
34039   var unit = [0, 1];
34040   function identity3(x) {
34041     return x;
34042   }
34043   function normalize(a, b) {
34044     return (b -= a = +a) ? function(x) {
34045       return (x - a) / b;
34046     } : constants(isNaN(b) ? NaN : 0.5);
34047   }
34048   function clamper(a, b) {
34049     var t;
34050     if (a > b)
34051       t = a, a = b, b = t;
34052     return function(x) {
34053       return Math.max(a, Math.min(b, x));
34054     };
34055   }
34056   function bimap(domain2, range3, interpolate) {
34057     var d0 = domain2[0], d1 = domain2[1], r0 = range3[0], r1 = range3[1];
34058     if (d1 < d0)
34059       d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
34060     else
34061       d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
34062     return function(x) {
34063       return r0(d0(x));
34064     };
34065   }
34066   function polymap(domain2, range3, interpolate) {
34067     var j2 = Math.min(domain2.length, range3.length) - 1, d = new Array(j2), r = new Array(j2), i2 = -1;
34068     if (domain2[j2] < domain2[0]) {
34069       domain2 = domain2.slice().reverse();
34070       range3 = range3.slice().reverse();
34071     }
34072     while (++i2 < j2) {
34073       d[i2] = normalize(domain2[i2], domain2[i2 + 1]);
34074       r[i2] = interpolate(range3[i2], range3[i2 + 1]);
34075     }
34076     return function(x) {
34077       var i3 = bisect_default(domain2, x, 1, j2) - 1;
34078       return r[i3](d[i3](x));
34079     };
34080   }
34081   function copy(source, target) {
34082     return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
34083   }
34084   function transformer2() {
34085     var domain2 = unit, range3 = unit, interpolate = value_default, transform2, untransform, unknown, clamp3 = identity3, piecewise, output, input;
34086     function rescale() {
34087       var n2 = Math.min(domain2.length, range3.length);
34088       if (clamp3 !== identity3)
34089         clamp3 = clamper(domain2[0], domain2[n2 - 1]);
34090       piecewise = n2 > 2 ? polymap : bimap;
34091       output = input = null;
34092       return scale;
34093     }
34094     function scale(x) {
34095       return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain2.map(transform2), range3, interpolate)))(transform2(clamp3(x)));
34096     }
34097     scale.invert = function(y) {
34098       return clamp3(untransform((input || (input = piecewise(range3, domain2.map(transform2), number_default)))(y)));
34099     };
34100     scale.domain = function(_) {
34101       return arguments.length ? (domain2 = Array.from(_, number2), rescale()) : domain2.slice();
34102     };
34103     scale.range = function(_) {
34104       return arguments.length ? (range3 = Array.from(_), rescale()) : range3.slice();
34105     };
34106     scale.rangeRound = function(_) {
34107       return range3 = Array.from(_), interpolate = round_default, rescale();
34108     };
34109     scale.clamp = function(_) {
34110       return arguments.length ? (clamp3 = _ ? true : identity3, rescale()) : clamp3 !== identity3;
34111     };
34112     scale.interpolate = function(_) {
34113       return arguments.length ? (interpolate = _, rescale()) : interpolate;
34114     };
34115     scale.unknown = function(_) {
34116       return arguments.length ? (unknown = _, scale) : unknown;
34117     };
34118     return function(t, u) {
34119       transform2 = t, untransform = u;
34120       return rescale();
34121     };
34122   }
34123   function continuous() {
34124     return transformer2()(identity3, identity3);
34125   }
34126
34127   // node_modules/d3-format/src/formatDecimal.js
34128   function formatDecimal_default(x) {
34129     return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
34130   }
34131   function formatDecimalParts(x, p) {
34132     if ((i2 = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0)
34133       return null;
34134     var i2, coefficient = x.slice(0, i2);
34135     return [
34136       coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
34137       +x.slice(i2 + 1)
34138     ];
34139   }
34140
34141   // node_modules/d3-format/src/exponent.js
34142   function exponent_default(x) {
34143     return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;
34144   }
34145
34146   // node_modules/d3-format/src/formatGroup.js
34147   function formatGroup_default(grouping, thousands) {
34148     return function(value, width) {
34149       var i2 = value.length, t = [], j2 = 0, g = grouping[0], length = 0;
34150       while (i2 > 0 && g > 0) {
34151         if (length + g + 1 > width)
34152           g = Math.max(1, width - length);
34153         t.push(value.substring(i2 -= g, i2 + g));
34154         if ((length += g + 1) > width)
34155           break;
34156         g = grouping[j2 = (j2 + 1) % grouping.length];
34157       }
34158       return t.reverse().join(thousands);
34159     };
34160   }
34161
34162   // node_modules/d3-format/src/formatNumerals.js
34163   function formatNumerals_default(numerals) {
34164     return function(value) {
34165       return value.replace(/[0-9]/g, function(i2) {
34166         return numerals[+i2];
34167       });
34168     };
34169   }
34170
34171   // node_modules/d3-format/src/formatSpecifier.js
34172   var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
34173   function formatSpecifier(specifier) {
34174     if (!(match = re.exec(specifier)))
34175       throw new Error("invalid format: " + specifier);
34176     var match;
34177     return new FormatSpecifier({
34178       fill: match[1],
34179       align: match[2],
34180       sign: match[3],
34181       symbol: match[4],
34182       zero: match[5],
34183       width: match[6],
34184       comma: match[7],
34185       precision: match[8] && match[8].slice(1),
34186       trim: match[9],
34187       type: match[10]
34188     });
34189   }
34190   formatSpecifier.prototype = FormatSpecifier.prototype;
34191   function FormatSpecifier(specifier) {
34192     this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
34193     this.align = specifier.align === void 0 ? ">" : specifier.align + "";
34194     this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
34195     this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
34196     this.zero = !!specifier.zero;
34197     this.width = specifier.width === void 0 ? void 0 : +specifier.width;
34198     this.comma = !!specifier.comma;
34199     this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
34200     this.trim = !!specifier.trim;
34201     this.type = specifier.type === void 0 ? "" : specifier.type + "";
34202   }
34203   FormatSpecifier.prototype.toString = function() {
34204     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;
34205   };
34206
34207   // node_modules/d3-format/src/formatTrim.js
34208   function formatTrim_default(s) {
34209     out:
34210       for (var n2 = s.length, i2 = 1, i0 = -1, i1; i2 < n2; ++i2) {
34211         switch (s[i2]) {
34212           case ".":
34213             i0 = i1 = i2;
34214             break;
34215           case "0":
34216             if (i0 === 0)
34217               i0 = i2;
34218             i1 = i2;
34219             break;
34220           default:
34221             if (!+s[i2])
34222               break out;
34223             if (i0 > 0)
34224               i0 = 0;
34225             break;
34226         }
34227       }
34228     return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
34229   }
34230
34231   // node_modules/d3-format/src/formatPrefixAuto.js
34232   var prefixExponent;
34233   function formatPrefixAuto_default(x, p) {
34234     var d = formatDecimalParts(x, p);
34235     if (!d)
34236       return x + "";
34237     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;
34238     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];
34239   }
34240
34241   // node_modules/d3-format/src/formatRounded.js
34242   function formatRounded_default(x, p) {
34243     var d = formatDecimalParts(x, p);
34244     if (!d)
34245       return x + "";
34246     var coefficient = d[0], exponent = d[1];
34247     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");
34248   }
34249
34250   // node_modules/d3-format/src/formatTypes.js
34251   var formatTypes_default = {
34252     "%": (x, p) => (x * 100).toFixed(p),
34253     "b": (x) => Math.round(x).toString(2),
34254     "c": (x) => x + "",
34255     "d": formatDecimal_default,
34256     "e": (x, p) => x.toExponential(p),
34257     "f": (x, p) => x.toFixed(p),
34258     "g": (x, p) => x.toPrecision(p),
34259     "o": (x) => Math.round(x).toString(8),
34260     "p": (x, p) => formatRounded_default(x * 100, p),
34261     "r": formatRounded_default,
34262     "s": formatPrefixAuto_default,
34263     "X": (x) => Math.round(x).toString(16).toUpperCase(),
34264     "x": (x) => Math.round(x).toString(16)
34265   };
34266
34267   // node_modules/d3-format/src/identity.js
34268   function identity_default3(x) {
34269     return x;
34270   }
34271
34272   // node_modules/d3-format/src/locale.js
34273   var map = Array.prototype.map;
34274   var prefixes = ["y", "z", "a", "f", "p", "n", "\xB5", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
34275   function locale_default(locale2) {
34276     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 + "";
34277     function newFormat(specifier) {
34278       specifier = formatSpecifier(specifier);
34279       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;
34280       if (type2 === "n")
34281         comma = true, type2 = "g";
34282       else if (!formatTypes_default[type2])
34283         precision2 === void 0 && (precision2 = 12), trim = true, type2 = "g";
34284       if (zero3 || fill === "0" && align === "=")
34285         zero3 = true, fill = "0", align = "=";
34286       var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type2) ? "0" + type2.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type2) ? percent : "";
34287       var formatType = formatTypes_default[type2], maybeSuffix = /[defgprs%]/.test(type2);
34288       precision2 = precision2 === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision2)) : Math.max(0, Math.min(20, precision2));
34289       function format2(value) {
34290         var valuePrefix = prefix, valueSuffix = suffix, i2, n2, c;
34291         if (type2 === "c") {
34292           valueSuffix = formatType(value) + valueSuffix;
34293           value = "";
34294         } else {
34295           value = +value;
34296           var valueNegative = value < 0 || 1 / value < 0;
34297           value = isNaN(value) ? nan : formatType(Math.abs(value), precision2);
34298           if (trim)
34299             value = formatTrim_default(value);
34300           if (valueNegative && +value === 0 && sign2 !== "+")
34301             valueNegative = false;
34302           valuePrefix = (valueNegative ? sign2 === "(" ? sign2 : minus : sign2 === "-" || sign2 === "(" ? "" : sign2) + valuePrefix;
34303           valueSuffix = (type2 === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign2 === "(" ? ")" : "");
34304           if (maybeSuffix) {
34305             i2 = -1, n2 = value.length;
34306             while (++i2 < n2) {
34307               if (c = value.charCodeAt(i2), 48 > c || c > 57) {
34308                 valueSuffix = (c === 46 ? decimal + value.slice(i2 + 1) : value.slice(i2)) + valueSuffix;
34309                 value = value.slice(0, i2);
34310                 break;
34311               }
34312             }
34313           }
34314         }
34315         if (comma && !zero3)
34316           value = group(value, Infinity);
34317         var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
34318         if (comma && zero3)
34319           value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
34320         switch (align) {
34321           case "<":
34322             value = valuePrefix + value + valueSuffix + padding;
34323             break;
34324           case "=":
34325             value = valuePrefix + padding + value + valueSuffix;
34326             break;
34327           case "^":
34328             value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
34329             break;
34330           default:
34331             value = padding + valuePrefix + value + valueSuffix;
34332             break;
34333         }
34334         return numerals(value);
34335       }
34336       format2.toString = function() {
34337         return specifier + "";
34338       };
34339       return format2;
34340     }
34341     function formatPrefix2(specifier, value) {
34342       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];
34343       return function(value2) {
34344         return f2(k * value2) + prefix;
34345       };
34346     }
34347     return {
34348       format: newFormat,
34349       formatPrefix: formatPrefix2
34350     };
34351   }
34352
34353   // node_modules/d3-format/src/defaultLocale.js
34354   var locale;
34355   var format;
34356   var formatPrefix;
34357   defaultLocale({
34358     thousands: ",",
34359     grouping: [3],
34360     currency: ["$", ""]
34361   });
34362   function defaultLocale(definition) {
34363     locale = locale_default(definition);
34364     format = locale.format;
34365     formatPrefix = locale.formatPrefix;
34366     return locale;
34367   }
34368
34369   // node_modules/d3-format/src/precisionFixed.js
34370   function precisionFixed_default(step) {
34371     return Math.max(0, -exponent_default(Math.abs(step)));
34372   }
34373
34374   // node_modules/d3-format/src/precisionPrefix.js
34375   function precisionPrefix_default(step, value) {
34376     return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent_default(value) / 3))) * 3 - exponent_default(Math.abs(step)));
34377   }
34378
34379   // node_modules/d3-format/src/precisionRound.js
34380   function precisionRound_default(step, max3) {
34381     step = Math.abs(step), max3 = Math.abs(max3) - step;
34382     return Math.max(0, exponent_default(max3) - exponent_default(step)) + 1;
34383   }
34384
34385   // node_modules/d3-scale/src/tickFormat.js
34386   function tickFormat(start2, stop, count, specifier) {
34387     var step = tickStep(start2, stop, count), precision2;
34388     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
34389     switch (specifier.type) {
34390       case "s": {
34391         var value = Math.max(Math.abs(start2), Math.abs(stop));
34392         if (specifier.precision == null && !isNaN(precision2 = precisionPrefix_default(step, value)))
34393           specifier.precision = precision2;
34394         return formatPrefix(specifier, value);
34395       }
34396       case "":
34397       case "e":
34398       case "g":
34399       case "p":
34400       case "r": {
34401         if (specifier.precision == null && !isNaN(precision2 = precisionRound_default(step, Math.max(Math.abs(start2), Math.abs(stop)))))
34402           specifier.precision = precision2 - (specifier.type === "e");
34403         break;
34404       }
34405       case "f":
34406       case "%": {
34407         if (specifier.precision == null && !isNaN(precision2 = precisionFixed_default(step)))
34408           specifier.precision = precision2 - (specifier.type === "%") * 2;
34409         break;
34410       }
34411     }
34412     return format(specifier);
34413   }
34414
34415   // node_modules/d3-scale/src/linear.js
34416   function linearish(scale) {
34417     var domain2 = scale.domain;
34418     scale.ticks = function(count) {
34419       var d = domain2();
34420       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
34421     };
34422     scale.tickFormat = function(count, specifier) {
34423       var d = domain2();
34424       return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
34425     };
34426     scale.nice = function(count) {
34427       if (count == null)
34428         count = 10;
34429       var d = domain2();
34430       var i0 = 0;
34431       var i1 = d.length - 1;
34432       var start2 = d[i0];
34433       var stop = d[i1];
34434       var prestep;
34435       var step;
34436       var maxIter = 10;
34437       if (stop < start2) {
34438         step = start2, start2 = stop, stop = step;
34439         step = i0, i0 = i1, i1 = step;
34440       }
34441       while (maxIter-- > 0) {
34442         step = tickIncrement(start2, stop, count);
34443         if (step === prestep) {
34444           d[i0] = start2;
34445           d[i1] = stop;
34446           return domain2(d);
34447         } else if (step > 0) {
34448           start2 = Math.floor(start2 / step) * step;
34449           stop = Math.ceil(stop / step) * step;
34450         } else if (step < 0) {
34451           start2 = Math.ceil(start2 * step) / step;
34452           stop = Math.floor(stop * step) / step;
34453         } else {
34454           break;
34455         }
34456         prestep = step;
34457       }
34458       return scale;
34459     };
34460     return scale;
34461   }
34462   function linear3() {
34463     var scale = continuous();
34464     scale.copy = function() {
34465       return copy(scale, linear3());
34466     };
34467     initRange.apply(scale, arguments);
34468     return linearish(scale);
34469   }
34470
34471   // node_modules/d3-scale/src/quantize.js
34472   function quantize() {
34473     var x05 = 0, x12 = 1, n2 = 1, domain2 = [0.5], range3 = [0, 1], unknown;
34474     function scale(x) {
34475       return x != null && x <= x ? range3[bisect_default(domain2, x, 0, n2)] : unknown;
34476     }
34477     function rescale() {
34478       var i2 = -1;
34479       domain2 = new Array(n2);
34480       while (++i2 < n2)
34481         domain2[i2] = ((i2 + 1) * x12 - (i2 - n2) * x05) / (n2 + 1);
34482       return scale;
34483     }
34484     scale.domain = function(_) {
34485       return arguments.length ? ([x05, x12] = _, x05 = +x05, x12 = +x12, rescale()) : [x05, x12];
34486     };
34487     scale.range = function(_) {
34488       return arguments.length ? (n2 = (range3 = Array.from(_)).length - 1, rescale()) : range3.slice();
34489     };
34490     scale.invertExtent = function(y) {
34491       var i2 = range3.indexOf(y);
34492       return i2 < 0 ? [NaN, NaN] : i2 < 1 ? [x05, domain2[0]] : i2 >= n2 ? [domain2[n2 - 1], x12] : [domain2[i2 - 1], domain2[i2]];
34493     };
34494     scale.unknown = function(_) {
34495       return arguments.length ? (unknown = _, scale) : scale;
34496     };
34497     scale.thresholds = function() {
34498       return domain2.slice();
34499     };
34500     scale.copy = function() {
34501       return quantize().domain([x05, x12]).range(range3).unknown(unknown);
34502     };
34503     return initRange.apply(linearish(scale), arguments);
34504   }
34505
34506   // modules/behavior/breathe.js
34507   function behaviorBreathe() {
34508     var duration = 800;
34509     var steps = 4;
34510     var selector = ".selected.shadow, .selected .shadow";
34511     var _selected = select_default2(null);
34512     var _classed = "";
34513     var _params = {};
34514     var _done = false;
34515     var _timer;
34516     function ratchetyInterpolator(a, b, steps2, units) {
34517       a = Number(a);
34518       b = Number(b);
34519       var sample = quantize().domain([0, 1]).range(quantize_default(number_default(a, b), steps2));
34520       return function(t) {
34521         return String(sample(t)) + (units || "");
34522       };
34523     }
34524     function reset(selection2) {
34525       selection2.style("stroke-opacity", null).style("stroke-width", null).style("fill-opacity", null).style("r", null);
34526     }
34527     function setAnimationParams(transition2, fromTo) {
34528       var toFrom = fromTo === "from" ? "to" : "from";
34529       transition2.styleTween("stroke-opacity", function(d) {
34530         return ratchetyInterpolator(
34531           _params[d.id][toFrom].opacity,
34532           _params[d.id][fromTo].opacity,
34533           steps
34534         );
34535       }).styleTween("stroke-width", function(d) {
34536         return ratchetyInterpolator(
34537           _params[d.id][toFrom].width,
34538           _params[d.id][fromTo].width,
34539           steps,
34540           "px"
34541         );
34542       }).styleTween("fill-opacity", function(d) {
34543         return ratchetyInterpolator(
34544           _params[d.id][toFrom].opacity,
34545           _params[d.id][fromTo].opacity,
34546           steps
34547         );
34548       }).styleTween("r", function(d) {
34549         return ratchetyInterpolator(
34550           _params[d.id][toFrom].width,
34551           _params[d.id][fromTo].width,
34552           steps,
34553           "px"
34554         );
34555       });
34556     }
34557     function calcAnimationParams(selection2) {
34558       selection2.call(reset).each(function(d) {
34559         var s = select_default2(this);
34560         var tag = s.node().tagName;
34561         var p = { "from": {}, "to": {} };
34562         var opacity;
34563         var width;
34564         if (tag === "circle") {
34565           opacity = Number(s.style("fill-opacity") || 0.5);
34566           width = Number(s.style("r") || 15.5);
34567         } else {
34568           opacity = Number(s.style("stroke-opacity") || 0.7);
34569           width = Number(s.style("stroke-width") || 10);
34570         }
34571         p.tag = tag;
34572         p.from.opacity = opacity * 0.6;
34573         p.to.opacity = opacity * 1.25;
34574         p.from.width = width * 0.7;
34575         p.to.width = width * (tag === "circle" ? 1.5 : 1);
34576         _params[d.id] = p;
34577       });
34578     }
34579     function run(surface, fromTo) {
34580       var toFrom = fromTo === "from" ? "to" : "from";
34581       var currSelected = surface.selectAll(selector);
34582       var currClassed = surface.attr("class");
34583       if (_done || currSelected.empty()) {
34584         _selected.call(reset);
34585         _selected = select_default2(null);
34586         return;
34587       }
34588       if (!(0, import_fast_deep_equal2.default)(currSelected.data(), _selected.data()) || currClassed !== _classed) {
34589         _selected.call(reset);
34590         _classed = currClassed;
34591         _selected = currSelected.call(calcAnimationParams);
34592       }
34593       var didCallNextRun = false;
34594       _selected.transition().duration(duration).call(setAnimationParams, fromTo).on("end", function() {
34595         if (!didCallNextRun) {
34596           surface.call(run, toFrom);
34597           didCallNextRun = true;
34598         }
34599         if (!select_default2(this).classed("selected")) {
34600           reset(select_default2(this));
34601         }
34602       });
34603     }
34604     function behavior(surface) {
34605       _done = false;
34606       _timer = timer(function() {
34607         if (surface.selectAll(selector).empty()) {
34608           return false;
34609         }
34610         surface.call(run, "from");
34611         _timer.stop();
34612         return true;
34613       }, 20);
34614     }
34615     behavior.restartIfNeeded = function(surface) {
34616       if (_selected.empty()) {
34617         surface.call(run, "from");
34618         if (_timer) {
34619           _timer.stop();
34620         }
34621       }
34622     };
34623     behavior.off = function() {
34624       _done = true;
34625       if (_timer) {
34626         _timer.stop();
34627       }
34628       _selected.interrupt().call(reset);
34629     };
34630     return behavior;
34631   }
34632
34633   // modules/behavior/operation.js
34634   function behaviorOperation(context) {
34635     var _operation;
34636     function keypress(d3_event) {
34637       if (!context.map().withinEditableZoom())
34638         return;
34639       if (_operation.availableForKeypress && !_operation.availableForKeypress())
34640         return;
34641       d3_event.preventDefault();
34642       var disabled = _operation.disabled();
34643       if (disabled) {
34644         context.ui().flash.duration(4e3).iconName("#iD-operation-" + _operation.id).iconClass("operation disabled").label(_operation.tooltip())();
34645       } else {
34646         context.ui().flash.duration(2e3).iconName("#iD-operation-" + _operation.id).iconClass("operation").label(_operation.annotation() || _operation.title)();
34647         if (_operation.point)
34648           _operation.point(null);
34649         _operation();
34650       }
34651     }
34652     function behavior() {
34653       if (_operation && _operation.available()) {
34654         context.keybinding().on(_operation.keys, keypress);
34655       }
34656       return behavior;
34657     }
34658     behavior.off = function() {
34659       context.keybinding().off(_operation.keys);
34660     };
34661     behavior.which = function(_) {
34662       if (!arguments.length)
34663         return _operation;
34664       _operation = _;
34665       return behavior;
34666     };
34667     return behavior;
34668   }
34669
34670   // modules/operations/circularize.js
34671   function operationCircularize(context, selectedIDs) {
34672     var _extent;
34673     var _actions = selectedIDs.map(getAction).filter(Boolean);
34674     var _amount = _actions.length === 1 ? "single" : "multiple";
34675     var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) {
34676       return n2.loc;
34677     });
34678     function getAction(entityID) {
34679       var entity = context.entity(entityID);
34680       if (entity.type !== "way" || new Set(entity.nodes).size <= 1)
34681         return null;
34682       if (!_extent) {
34683         _extent = entity.extent(context.graph());
34684       } else {
34685         _extent = _extent.extend(entity.extent(context.graph()));
34686       }
34687       return actionCircularize(entityID, context.projection);
34688     }
34689     var operation = function() {
34690       if (!_actions.length)
34691         return;
34692       var combinedAction = function(graph, t) {
34693         _actions.forEach(function(action) {
34694           if (!action.disabled(graph)) {
34695             graph = action(graph, t);
34696           }
34697         });
34698         return graph;
34699       };
34700       combinedAction.transitionable = true;
34701       context.perform(combinedAction, operation.annotation());
34702       window.setTimeout(function() {
34703         context.validator().validate();
34704       }, 300);
34705     };
34706     operation.available = function() {
34707       return _actions.length && selectedIDs.length === _actions.length;
34708     };
34709     operation.disabled = function() {
34710       if (!_actions.length)
34711         return "";
34712       var actionDisableds = _actions.map(function(action) {
34713         return action.disabled(context.graph());
34714       }).filter(Boolean);
34715       if (actionDisableds.length === _actions.length) {
34716         if (new Set(actionDisableds).size > 1) {
34717           return "multiple_blockers";
34718         }
34719         return actionDisableds[0];
34720       } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
34721         return "too_large";
34722       } else if (someMissing()) {
34723         return "not_downloaded";
34724       } else if (selectedIDs.some(context.hasHiddenConnections)) {
34725         return "connected_to_hidden";
34726       }
34727       return false;
34728       function someMissing() {
34729         if (context.inIntro())
34730           return false;
34731         var osm = context.connection();
34732         if (osm) {
34733           var missing = _coords.filter(function(loc) {
34734             return !osm.isDataLoaded(loc);
34735           });
34736           if (missing.length) {
34737             missing.forEach(function(loc) {
34738               context.loadTileAtLoc(loc);
34739             });
34740             return true;
34741           }
34742         }
34743         return false;
34744       }
34745     };
34746     operation.tooltip = function() {
34747       var disable = operation.disabled();
34748       return disable ? _t.append("operations.circularize." + disable + "." + _amount) : _t.append("operations.circularize.description." + _amount);
34749     };
34750     operation.annotation = function() {
34751       return _t("operations.circularize.annotation.feature", { n: _actions.length });
34752     };
34753     operation.id = "circularize";
34754     operation.keys = [_t("operations.circularize.key")];
34755     operation.title = _t.append("operations.circularize.title");
34756     operation.behavior = behaviorOperation(context).which(operation);
34757     return operation;
34758   }
34759
34760   // modules/ui/cmd.js
34761   var uiCmd = function(code) {
34762     var detected = utilDetect();
34763     if (detected.os === "mac") {
34764       return code;
34765     }
34766     if (detected.os === "win") {
34767       if (code === "\u2318\u21E7Z")
34768         return "Ctrl+Y";
34769     }
34770     var result = "", replacements = {
34771       "\u2318": "Ctrl",
34772       "\u21E7": "Shift",
34773       "\u2325": "Alt",
34774       "\u232B": "Backspace",
34775       "\u2326": "Delete"
34776     };
34777     for (var i2 = 0; i2 < code.length; i2++) {
34778       if (code[i2] in replacements) {
34779         result += replacements[code[i2]] + (i2 < code.length - 1 ? "+" : "");
34780       } else {
34781         result += code[i2];
34782       }
34783     }
34784     return result;
34785   };
34786   uiCmd.display = function(code) {
34787     if (code.length !== 1)
34788       return code;
34789     var detected = utilDetect();
34790     var mac = detected.os === "mac";
34791     var replacements = {
34792       "\u2318": mac ? "\u2318 " + _t("shortcuts.key.cmd") : _t("shortcuts.key.ctrl"),
34793       "\u21E7": mac ? "\u21E7 " + _t("shortcuts.key.shift") : _t("shortcuts.key.shift"),
34794       "\u2325": mac ? "\u2325 " + _t("shortcuts.key.option") : _t("shortcuts.key.alt"),
34795       "\u2303": mac ? "\u2303 " + _t("shortcuts.key.ctrl") : _t("shortcuts.key.ctrl"),
34796       "\u232B": mac ? "\u232B " + _t("shortcuts.key.delete") : _t("shortcuts.key.backspace"),
34797       "\u2326": mac ? "\u2326 " + _t("shortcuts.key.del") : _t("shortcuts.key.del"),
34798       "\u2196": mac ? "\u2196 " + _t("shortcuts.key.pgup") : _t("shortcuts.key.pgup"),
34799       "\u2198": mac ? "\u2198 " + _t("shortcuts.key.pgdn") : _t("shortcuts.key.pgdn"),
34800       "\u21DE": mac ? "\u21DE " + _t("shortcuts.key.home") : _t("shortcuts.key.home"),
34801       "\u21DF": mac ? "\u21DF " + _t("shortcuts.key.end") : _t("shortcuts.key.end"),
34802       "\u21B5": mac ? "\u23CE " + _t("shortcuts.key.return") : _t("shortcuts.key.enter"),
34803       "\u238B": mac ? "\u238B " + _t("shortcuts.key.esc") : _t("shortcuts.key.esc"),
34804       "\u2630": mac ? "\u2630 " + _t("shortcuts.key.menu") : _t("shortcuts.key.menu")
34805     };
34806     return replacements[code] || code;
34807   };
34808
34809   // modules/operations/delete.js
34810   function operationDelete(context, selectedIDs) {
34811     var multi = selectedIDs.length === 1 ? "single" : "multiple";
34812     var action = actionDeleteMultiple(selectedIDs);
34813     var nodes = utilGetAllNodes(selectedIDs, context.graph());
34814     var coords = nodes.map(function(n2) {
34815       return n2.loc;
34816     });
34817     var extent = utilTotalExtent(selectedIDs, context.graph());
34818     var operation = function() {
34819       var nextSelectedID;
34820       var nextSelectedLoc;
34821       if (selectedIDs.length === 1) {
34822         var id2 = selectedIDs[0];
34823         var entity = context.entity(id2);
34824         var geometry = entity.geometry(context.graph());
34825         var parents = context.graph().parentWays(entity);
34826         var parent = parents[0];
34827         if (geometry === "vertex") {
34828           var nodes2 = parent.nodes;
34829           var i2 = nodes2.indexOf(id2);
34830           if (i2 === 0) {
34831             i2++;
34832           } else if (i2 === nodes2.length - 1) {
34833             i2--;
34834           } else {
34835             var a = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 - 1]).loc);
34836             var b = geoSphericalDistance(entity.loc, context.entity(nodes2[i2 + 1]).loc);
34837             i2 = a < b ? i2 - 1 : i2 + 1;
34838           }
34839           nextSelectedID = nodes2[i2];
34840           nextSelectedLoc = context.entity(nextSelectedID).loc;
34841         }
34842       }
34843       context.perform(action, operation.annotation());
34844       context.validator().validate();
34845       if (nextSelectedID && nextSelectedLoc) {
34846         if (context.hasEntity(nextSelectedID)) {
34847           context.enter(modeSelect(context, [nextSelectedID]).follow(true));
34848         } else {
34849           context.map().centerEase(nextSelectedLoc);
34850           context.enter(modeBrowse(context));
34851         }
34852       } else {
34853         context.enter(modeBrowse(context));
34854       }
34855     };
34856     operation.available = function() {
34857       return true;
34858     };
34859     operation.disabled = function() {
34860       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
34861         return "too_large";
34862       } else if (someMissing()) {
34863         return "not_downloaded";
34864       } else if (selectedIDs.some(context.hasHiddenConnections)) {
34865         return "connected_to_hidden";
34866       } else if (selectedIDs.some(protectedMember)) {
34867         return "part_of_relation";
34868       } else if (selectedIDs.some(incompleteRelation)) {
34869         return "incomplete_relation";
34870       } else if (selectedIDs.some(hasWikidataTag)) {
34871         return "has_wikidata_tag";
34872       }
34873       return false;
34874       function someMissing() {
34875         if (context.inIntro())
34876           return false;
34877         var osm = context.connection();
34878         if (osm) {
34879           var missing = coords.filter(function(loc) {
34880             return !osm.isDataLoaded(loc);
34881           });
34882           if (missing.length) {
34883             missing.forEach(function(loc) {
34884               context.loadTileAtLoc(loc);
34885             });
34886             return true;
34887           }
34888         }
34889         return false;
34890       }
34891       function hasWikidataTag(id2) {
34892         var entity = context.entity(id2);
34893         return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
34894       }
34895       function incompleteRelation(id2) {
34896         var entity = context.entity(id2);
34897         return entity.type === "relation" && !entity.isComplete(context.graph());
34898       }
34899       function protectedMember(id2) {
34900         var entity = context.entity(id2);
34901         if (entity.type !== "way")
34902           return false;
34903         var parents = context.graph().parentRelations(entity);
34904         for (var i2 = 0; i2 < parents.length; i2++) {
34905           var parent = parents[i2];
34906           var type2 = parent.tags.type;
34907           var role = parent.memberById(id2).role || "outer";
34908           if (type2 === "route" || type2 === "boundary" || type2 === "multipolygon" && role === "outer") {
34909             return true;
34910           }
34911         }
34912         return false;
34913       }
34914     };
34915     operation.tooltip = function() {
34916       var disable = operation.disabled();
34917       return disable ? _t.append("operations.delete." + disable + "." + multi) : _t.append("operations.delete.description." + multi);
34918     };
34919     operation.annotation = function() {
34920       return selectedIDs.length === 1 ? _t("operations.delete.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.delete.annotation.feature", { n: selectedIDs.length });
34921     };
34922     operation.id = "delete";
34923     operation.keys = [uiCmd("\u2318\u232B"), uiCmd("\u2318\u2326"), uiCmd("\u2326")];
34924     operation.title = _t.append("operations.delete.title");
34925     operation.behavior = behaviorOperation(context).which(operation);
34926     return operation;
34927   }
34928
34929   // modules/operations/orthogonalize.js
34930   function operationOrthogonalize(context, selectedIDs) {
34931     var _extent;
34932     var _type;
34933     var _actions = selectedIDs.map(chooseAction).filter(Boolean);
34934     var _amount = _actions.length === 1 ? "single" : "multiple";
34935     var _coords = utilGetAllNodes(selectedIDs, context.graph()).map(function(n2) {
34936       return n2.loc;
34937     });
34938     function chooseAction(entityID) {
34939       var entity = context.entity(entityID);
34940       var geometry = entity.geometry(context.graph());
34941       if (!_extent) {
34942         _extent = entity.extent(context.graph());
34943       } else {
34944         _extent = _extent.extend(entity.extent(context.graph()));
34945       }
34946       if (entity.type === "way" && new Set(entity.nodes).size > 2) {
34947         if (_type && _type !== "feature")
34948           return null;
34949         _type = "feature";
34950         return actionOrthogonalize(entityID, context.projection);
34951       } else if (geometry === "vertex") {
34952         if (_type && _type !== "corner")
34953           return null;
34954         _type = "corner";
34955         var graph = context.graph();
34956         var parents = graph.parentWays(entity);
34957         if (parents.length === 1) {
34958           var way = parents[0];
34959           if (way.nodes.indexOf(entityID) !== -1) {
34960             return actionOrthogonalize(way.id, context.projection, entityID);
34961           }
34962         }
34963       }
34964       return null;
34965     }
34966     var operation = function() {
34967       if (!_actions.length)
34968         return;
34969       var combinedAction = function(graph, t) {
34970         _actions.forEach(function(action) {
34971           if (!action.disabled(graph)) {
34972             graph = action(graph, t);
34973           }
34974         });
34975         return graph;
34976       };
34977       combinedAction.transitionable = true;
34978       context.perform(combinedAction, operation.annotation());
34979       window.setTimeout(function() {
34980         context.validator().validate();
34981       }, 300);
34982     };
34983     operation.available = function() {
34984       return _actions.length && selectedIDs.length === _actions.length;
34985     };
34986     operation.disabled = function() {
34987       if (!_actions.length)
34988         return "";
34989       var actionDisableds = _actions.map(function(action) {
34990         return action.disabled(context.graph());
34991       }).filter(Boolean);
34992       if (actionDisableds.length === _actions.length) {
34993         if (new Set(actionDisableds).size > 1) {
34994           return "multiple_blockers";
34995         }
34996         return actionDisableds[0];
34997       } else if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
34998         return "too_large";
34999       } else if (someMissing()) {
35000         return "not_downloaded";
35001       } else if (selectedIDs.some(context.hasHiddenConnections)) {
35002         return "connected_to_hidden";
35003       }
35004       return false;
35005       function someMissing() {
35006         if (context.inIntro())
35007           return false;
35008         var osm = context.connection();
35009         if (osm) {
35010           var missing = _coords.filter(function(loc) {
35011             return !osm.isDataLoaded(loc);
35012           });
35013           if (missing.length) {
35014             missing.forEach(function(loc) {
35015               context.loadTileAtLoc(loc);
35016             });
35017             return true;
35018           }
35019         }
35020         return false;
35021       }
35022     };
35023     operation.tooltip = function() {
35024       var disable = operation.disabled();
35025       return disable ? _t.append("operations.orthogonalize." + disable + "." + _amount) : _t.append("operations.orthogonalize.description." + _type + "." + _amount);
35026     };
35027     operation.annotation = function() {
35028       return _t("operations.orthogonalize.annotation." + _type, { n: _actions.length });
35029     };
35030     operation.id = "orthogonalize";
35031     operation.keys = [_t("operations.orthogonalize.key")];
35032     operation.title = _t.append("operations.orthogonalize.title");
35033     operation.behavior = behaviorOperation(context).which(operation);
35034     return operation;
35035   }
35036
35037   // modules/operations/reflect.js
35038   function operationReflectShort(context, selectedIDs) {
35039     return operationReflect(context, selectedIDs, "short");
35040   }
35041   function operationReflectLong(context, selectedIDs) {
35042     return operationReflect(context, selectedIDs, "long");
35043   }
35044   function operationReflect(context, selectedIDs, axis) {
35045     axis = axis || "long";
35046     var multi = selectedIDs.length === 1 ? "single" : "multiple";
35047     var nodes = utilGetAllNodes(selectedIDs, context.graph());
35048     var coords = nodes.map(function(n2) {
35049       return n2.loc;
35050     });
35051     var extent = utilTotalExtent(selectedIDs, context.graph());
35052     var operation = function() {
35053       var action = actionReflect(selectedIDs, context.projection).useLongAxis(Boolean(axis === "long"));
35054       context.perform(action, operation.annotation());
35055       window.setTimeout(function() {
35056         context.validator().validate();
35057       }, 300);
35058     };
35059     operation.available = function() {
35060       return nodes.length >= 3;
35061     };
35062     operation.disabled = function() {
35063       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
35064         return "too_large";
35065       } else if (someMissing()) {
35066         return "not_downloaded";
35067       } else if (selectedIDs.some(context.hasHiddenConnections)) {
35068         return "connected_to_hidden";
35069       } else if (selectedIDs.some(incompleteRelation)) {
35070         return "incomplete_relation";
35071       }
35072       return false;
35073       function someMissing() {
35074         if (context.inIntro())
35075           return false;
35076         var osm = context.connection();
35077         if (osm) {
35078           var missing = coords.filter(function(loc) {
35079             return !osm.isDataLoaded(loc);
35080           });
35081           if (missing.length) {
35082             missing.forEach(function(loc) {
35083               context.loadTileAtLoc(loc);
35084             });
35085             return true;
35086           }
35087         }
35088         return false;
35089       }
35090       function incompleteRelation(id2) {
35091         var entity = context.entity(id2);
35092         return entity.type === "relation" && !entity.isComplete(context.graph());
35093       }
35094     };
35095     operation.tooltip = function() {
35096       var disable = operation.disabled();
35097       return disable ? _t.append("operations.reflect." + disable + "." + multi) : _t.append("operations.reflect.description." + axis + "." + multi);
35098     };
35099     operation.annotation = function() {
35100       return _t("operations.reflect.annotation." + axis + ".feature", { n: selectedIDs.length });
35101     };
35102     operation.id = "reflect-" + axis;
35103     operation.keys = [_t("operations.reflect.key." + axis)];
35104     operation.title = _t.append("operations.reflect.title." + axis);
35105     operation.behavior = behaviorOperation(context).which(operation);
35106     return operation;
35107   }
35108
35109   // modules/operations/move.js
35110   function operationMove(context, selectedIDs) {
35111     var multi = selectedIDs.length === 1 ? "single" : "multiple";
35112     var nodes = utilGetAllNodes(selectedIDs, context.graph());
35113     var coords = nodes.map(function(n2) {
35114       return n2.loc;
35115     });
35116     var extent = utilTotalExtent(selectedIDs, context.graph());
35117     var operation = function() {
35118       context.enter(modeMove(context, selectedIDs));
35119     };
35120     operation.available = function() {
35121       return selectedIDs.length > 0;
35122     };
35123     operation.disabled = function() {
35124       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
35125         return "too_large";
35126       } else if (someMissing()) {
35127         return "not_downloaded";
35128       } else if (selectedIDs.some(context.hasHiddenConnections)) {
35129         return "connected_to_hidden";
35130       } else if (selectedIDs.some(incompleteRelation)) {
35131         return "incomplete_relation";
35132       }
35133       return false;
35134       function someMissing() {
35135         if (context.inIntro())
35136           return false;
35137         var osm = context.connection();
35138         if (osm) {
35139           var missing = coords.filter(function(loc) {
35140             return !osm.isDataLoaded(loc);
35141           });
35142           if (missing.length) {
35143             missing.forEach(function(loc) {
35144               context.loadTileAtLoc(loc);
35145             });
35146             return true;
35147           }
35148         }
35149         return false;
35150       }
35151       function incompleteRelation(id2) {
35152         var entity = context.entity(id2);
35153         return entity.type === "relation" && !entity.isComplete(context.graph());
35154       }
35155     };
35156     operation.tooltip = function() {
35157       var disable = operation.disabled();
35158       return disable ? _t.append("operations.move." + disable + "." + multi) : _t.append("operations.move.description." + multi);
35159     };
35160     operation.annotation = function() {
35161       return selectedIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.move.annotation.feature", { n: selectedIDs.length });
35162     };
35163     operation.id = "move";
35164     operation.keys = [_t("operations.move.key")];
35165     operation.title = _t.append("operations.move.title");
35166     operation.behavior = behaviorOperation(context).which(operation);
35167     operation.mouseOnly = true;
35168     return operation;
35169   }
35170
35171   // modules/modes/rotate.js
35172   function modeRotate(context, entityIDs) {
35173     var _tolerancePx = 4;
35174     var mode = {
35175       id: "rotate",
35176       button: "browse"
35177     };
35178     var keybinding = utilKeybinding("rotate");
35179     var behaviors = [
35180       behaviorEdit(context),
35181       operationCircularize(context, entityIDs).behavior,
35182       operationDelete(context, entityIDs).behavior,
35183       operationMove(context, entityIDs).behavior,
35184       operationOrthogonalize(context, entityIDs).behavior,
35185       operationReflectLong(context, entityIDs).behavior,
35186       operationReflectShort(context, entityIDs).behavior
35187     ];
35188     var annotation = entityIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.rotate.annotation.feature", { n: entityIDs.length });
35189     var _prevGraph;
35190     var _prevAngle;
35191     var _prevTransform;
35192     var _pivot;
35193     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
35194     function doRotate(d3_event) {
35195       var fn;
35196       if (context.graph() !== _prevGraph) {
35197         fn = context.perform;
35198       } else {
35199         fn = context.replace;
35200       }
35201       var projection2 = context.projection;
35202       var currTransform = projection2.transform();
35203       if (!_prevTransform || currTransform.k !== _prevTransform.k || currTransform.x !== _prevTransform.x || currTransform.y !== _prevTransform.y) {
35204         var nodes = utilGetAllNodes(entityIDs, context.graph());
35205         var points = nodes.map(function(n2) {
35206           return projection2(n2.loc);
35207         });
35208         _pivot = getPivot(points);
35209         _prevAngle = void 0;
35210       }
35211       var currMouse = context.map().mouse(d3_event);
35212       var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
35213       if (typeof _prevAngle === "undefined")
35214         _prevAngle = currAngle;
35215       var delta = currAngle - _prevAngle;
35216       fn(actionRotate(entityIDs, _pivot, delta, projection2));
35217       _prevTransform = currTransform;
35218       _prevAngle = currAngle;
35219       _prevGraph = context.graph();
35220     }
35221     function getPivot(points) {
35222       var _pivot2;
35223       if (points.length === 1) {
35224         _pivot2 = points[0];
35225       } else if (points.length === 2) {
35226         _pivot2 = geoVecInterp(points[0], points[1], 0.5);
35227       } else {
35228         var polygonHull = hull_default(points);
35229         if (polygonHull.length === 2) {
35230           _pivot2 = geoVecInterp(points[0], points[1], 0.5);
35231         } else {
35232           _pivot2 = centroid_default2(hull_default(points));
35233         }
35234       }
35235       return _pivot2;
35236     }
35237     function finish(d3_event) {
35238       d3_event.stopPropagation();
35239       context.replace(actionNoop(), annotation);
35240       context.enter(modeSelect(context, entityIDs));
35241     }
35242     function cancel() {
35243       if (_prevGraph)
35244         context.pop();
35245       context.enter(modeSelect(context, entityIDs));
35246     }
35247     function undone() {
35248       context.enter(modeBrowse(context));
35249     }
35250     mode.enter = function() {
35251       _prevGraph = null;
35252       context.features().forceVisible(entityIDs);
35253       behaviors.forEach(context.install);
35254       var downEvent;
35255       context.surface().on(_pointerPrefix + "down.modeRotate", function(d3_event) {
35256         downEvent = d3_event;
35257       });
35258       select_default2(window).on(_pointerPrefix + "move.modeRotate", doRotate, true).on(_pointerPrefix + "up.modeRotate", function(d3_event) {
35259         if (!downEvent)
35260           return;
35261         var mapNode = context.container().select(".main-map").node();
35262         var pointGetter = utilFastMouse(mapNode);
35263         var p1 = pointGetter(downEvent);
35264         var p2 = pointGetter(d3_event);
35265         var dist = geoVecLength(p1, p2);
35266         if (dist <= _tolerancePx)
35267           finish(d3_event);
35268         downEvent = null;
35269       }, true);
35270       context.history().on("undone.modeRotate", undone);
35271       keybinding.on("\u238B", cancel).on("\u21A9", finish);
35272       select_default2(document).call(keybinding);
35273     };
35274     mode.exit = function() {
35275       behaviors.forEach(context.uninstall);
35276       context.surface().on(_pointerPrefix + "down.modeRotate", null);
35277       select_default2(window).on(_pointerPrefix + "move.modeRotate", null, true).on(_pointerPrefix + "up.modeRotate", null, true);
35278       context.history().on("undone.modeRotate", null);
35279       select_default2(document).call(keybinding.unbind);
35280       context.features().forceVisible([]);
35281     };
35282     mode.selectedIDs = function() {
35283       if (!arguments.length)
35284         return entityIDs;
35285       return mode;
35286     };
35287     return mode;
35288   }
35289
35290   // modules/operations/rotate.js
35291   function operationRotate(context, selectedIDs) {
35292     var multi = selectedIDs.length === 1 ? "single" : "multiple";
35293     var nodes = utilGetAllNodes(selectedIDs, context.graph());
35294     var coords = nodes.map(function(n2) {
35295       return n2.loc;
35296     });
35297     var extent = utilTotalExtent(selectedIDs, context.graph());
35298     var operation = function() {
35299       context.enter(modeRotate(context, selectedIDs));
35300     };
35301     operation.available = function() {
35302       return nodes.length >= 2;
35303     };
35304     operation.disabled = function() {
35305       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
35306         return "too_large";
35307       } else if (someMissing()) {
35308         return "not_downloaded";
35309       } else if (selectedIDs.some(context.hasHiddenConnections)) {
35310         return "connected_to_hidden";
35311       } else if (selectedIDs.some(incompleteRelation)) {
35312         return "incomplete_relation";
35313       }
35314       return false;
35315       function someMissing() {
35316         if (context.inIntro())
35317           return false;
35318         var osm = context.connection();
35319         if (osm) {
35320           var missing = coords.filter(function(loc) {
35321             return !osm.isDataLoaded(loc);
35322           });
35323           if (missing.length) {
35324             missing.forEach(function(loc) {
35325               context.loadTileAtLoc(loc);
35326             });
35327             return true;
35328           }
35329         }
35330         return false;
35331       }
35332       function incompleteRelation(id2) {
35333         var entity = context.entity(id2);
35334         return entity.type === "relation" && !entity.isComplete(context.graph());
35335       }
35336     };
35337     operation.tooltip = function() {
35338       var disable = operation.disabled();
35339       return disable ? _t.append("operations.rotate." + disable + "." + multi) : _t.append("operations.rotate.description." + multi);
35340     };
35341     operation.annotation = function() {
35342       return selectedIDs.length === 1 ? _t("operations.rotate.annotation." + context.graph().geometry(selectedIDs[0])) : _t("operations.rotate.annotation.feature", { n: selectedIDs.length });
35343     };
35344     operation.id = "rotate";
35345     operation.keys = [_t("operations.rotate.key")];
35346     operation.title = _t.append("operations.rotate.title");
35347     operation.behavior = behaviorOperation(context).which(operation);
35348     operation.mouseOnly = true;
35349     return operation;
35350   }
35351
35352   // modules/modes/move.js
35353   function modeMove(context, entityIDs, baseGraph) {
35354     var _tolerancePx = 4;
35355     var mode = {
35356       id: "move",
35357       button: "browse"
35358     };
35359     var keybinding = utilKeybinding("move");
35360     var behaviors = [
35361       behaviorEdit(context),
35362       operationCircularize(context, entityIDs).behavior,
35363       operationDelete(context, entityIDs).behavior,
35364       operationOrthogonalize(context, entityIDs).behavior,
35365       operationReflectLong(context, entityIDs).behavior,
35366       operationReflectShort(context, entityIDs).behavior,
35367       operationRotate(context, entityIDs).behavior
35368     ];
35369     var annotation = entityIDs.length === 1 ? _t("operations.move.annotation." + context.graph().geometry(entityIDs[0])) : _t("operations.move.annotation.feature", { n: entityIDs.length });
35370     var _prevGraph;
35371     var _cache4;
35372     var _origin;
35373     var _nudgeInterval;
35374     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
35375     function doMove(nudge) {
35376       nudge = nudge || [0, 0];
35377       var fn;
35378       if (_prevGraph !== context.graph()) {
35379         _cache4 = {};
35380         _origin = context.map().mouseCoordinates();
35381         fn = context.perform;
35382       } else {
35383         fn = context.overwrite;
35384       }
35385       var currMouse = context.map().mouse();
35386       var origMouse = context.projection(_origin);
35387       var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
35388       fn(actionMove(entityIDs, delta, context.projection, _cache4));
35389       _prevGraph = context.graph();
35390     }
35391     function startNudge(nudge) {
35392       if (_nudgeInterval)
35393         window.clearInterval(_nudgeInterval);
35394       _nudgeInterval = window.setInterval(function() {
35395         context.map().pan(nudge);
35396         doMove(nudge);
35397       }, 50);
35398     }
35399     function stopNudge() {
35400       if (_nudgeInterval) {
35401         window.clearInterval(_nudgeInterval);
35402         _nudgeInterval = null;
35403       }
35404     }
35405     function move() {
35406       doMove();
35407       var nudge = geoViewportEdge(context.map().mouse(), context.map().dimensions());
35408       if (nudge) {
35409         startNudge(nudge);
35410       } else {
35411         stopNudge();
35412       }
35413     }
35414     function finish(d3_event) {
35415       d3_event.stopPropagation();
35416       context.replace(actionNoop(), annotation);
35417       context.enter(modeSelect(context, entityIDs));
35418       stopNudge();
35419     }
35420     function cancel() {
35421       if (baseGraph) {
35422         while (context.graph() !== baseGraph)
35423           context.pop();
35424         context.enter(modeBrowse(context));
35425       } else {
35426         if (_prevGraph)
35427           context.pop();
35428         context.enter(modeSelect(context, entityIDs));
35429       }
35430       stopNudge();
35431     }
35432     function undone() {
35433       context.enter(modeBrowse(context));
35434     }
35435     mode.enter = function() {
35436       _origin = context.map().mouseCoordinates();
35437       _prevGraph = null;
35438       _cache4 = {};
35439       context.features().forceVisible(entityIDs);
35440       behaviors.forEach(context.install);
35441       var downEvent;
35442       context.surface().on(_pointerPrefix + "down.modeMove", function(d3_event) {
35443         downEvent = d3_event;
35444       });
35445       select_default2(window).on(_pointerPrefix + "move.modeMove", move, true).on(_pointerPrefix + "up.modeMove", function(d3_event) {
35446         if (!downEvent)
35447           return;
35448         var mapNode = context.container().select(".main-map").node();
35449         var pointGetter = utilFastMouse(mapNode);
35450         var p1 = pointGetter(downEvent);
35451         var p2 = pointGetter(d3_event);
35452         var dist = geoVecLength(p1, p2);
35453         if (dist <= _tolerancePx)
35454           finish(d3_event);
35455         downEvent = null;
35456       }, true);
35457       context.history().on("undone.modeMove", undone);
35458       keybinding.on("\u238B", cancel).on("\u21A9", finish);
35459       select_default2(document).call(keybinding);
35460     };
35461     mode.exit = function() {
35462       stopNudge();
35463       behaviors.forEach(function(behavior) {
35464         context.uninstall(behavior);
35465       });
35466       context.surface().on(_pointerPrefix + "down.modeMove", null);
35467       select_default2(window).on(_pointerPrefix + "move.modeMove", null, true).on(_pointerPrefix + "up.modeMove", null, true);
35468       context.history().on("undone.modeMove", null);
35469       select_default2(document).call(keybinding.unbind);
35470       context.features().forceVisible([]);
35471     };
35472     mode.selectedIDs = function() {
35473       if (!arguments.length)
35474         return entityIDs;
35475       return mode;
35476     };
35477     return mode;
35478   }
35479
35480   // modules/behavior/paste.js
35481   function behaviorPaste(context) {
35482     function doPaste(d3_event) {
35483       if (!context.map().withinEditableZoom())
35484         return;
35485       d3_event.preventDefault();
35486       var baseGraph = context.graph();
35487       var mouse = context.map().mouse();
35488       var projection2 = context.projection;
35489       var viewport = geoExtent(projection2.clipExtent()).polygon();
35490       if (!geoPointInPolygon(mouse, viewport))
35491         return;
35492       var oldIDs = context.copyIDs();
35493       if (!oldIDs.length)
35494         return;
35495       var extent = geoExtent();
35496       var oldGraph = context.copyGraph();
35497       var newIDs = [];
35498       var action = actionCopyEntities(oldIDs, oldGraph);
35499       context.perform(action);
35500       var copies = action.copies();
35501       var originals = /* @__PURE__ */ new Set();
35502       Object.values(copies).forEach(function(entity) {
35503         originals.add(entity.id);
35504       });
35505       for (var id2 in copies) {
35506         var oldEntity = oldGraph.entity(id2);
35507         var newEntity = copies[id2];
35508         extent._extend(oldEntity.extent(oldGraph));
35509         var parents = context.graph().parentWays(newEntity);
35510         var parentCopied = parents.some(function(parent) {
35511           return originals.has(parent.id);
35512         });
35513         if (!parentCopied) {
35514           newIDs.push(newEntity.id);
35515         }
35516       }
35517       var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center());
35518       var delta = geoVecSubtract(mouse, copyPoint);
35519       context.perform(actionMove(newIDs, delta, projection2));
35520       context.enter(modeMove(context, newIDs, baseGraph));
35521     }
35522     function behavior() {
35523       context.keybinding().on(uiCmd("\u2318V"), doPaste);
35524       return behavior;
35525     }
35526     behavior.off = function() {
35527       context.keybinding().off(uiCmd("\u2318V"));
35528     };
35529     return behavior;
35530   }
35531
35532   // modules/behavior/drag.js
35533   function behaviorDrag() {
35534     var dispatch10 = dispatch_default("start", "move", "end");
35535     var _tolerancePx = 1;
35536     var _penTolerancePx = 4;
35537     var _origin = null;
35538     var _selector = "";
35539     var _targetNode;
35540     var _targetEntity;
35541     var _surface;
35542     var _pointerId;
35543     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
35544     var d3_event_userSelectProperty = utilPrefixCSSProperty("UserSelect");
35545     var d3_event_userSelectSuppress = function() {
35546       var selection2 = selection_default();
35547       var select = selection2.style(d3_event_userSelectProperty);
35548       selection2.style(d3_event_userSelectProperty, "none");
35549       return function() {
35550         selection2.style(d3_event_userSelectProperty, select);
35551       };
35552     };
35553     function pointerdown(d3_event) {
35554       if (_pointerId)
35555         return;
35556       _pointerId = d3_event.pointerId || "mouse";
35557       _targetNode = this;
35558       var pointerLocGetter = utilFastMouse(_surface || _targetNode.parentNode);
35559       var offset;
35560       var startOrigin = pointerLocGetter(d3_event);
35561       var started = false;
35562       var selectEnable = d3_event_userSelectSuppress();
35563       select_default2(window).on(_pointerPrefix + "move.drag", pointermove).on(_pointerPrefix + "up.drag pointercancel.drag", pointerup, true);
35564       if (_origin) {
35565         offset = _origin.call(_targetNode, _targetEntity);
35566         offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
35567       } else {
35568         offset = [0, 0];
35569       }
35570       d3_event.stopPropagation();
35571       function pointermove(d3_event2) {
35572         if (_pointerId !== (d3_event2.pointerId || "mouse"))
35573           return;
35574         var p = pointerLocGetter(d3_event2);
35575         if (!started) {
35576           var dist = geoVecLength(startOrigin, p);
35577           var tolerance = d3_event2.pointerType === "pen" ? _penTolerancePx : _tolerancePx;
35578           if (dist < tolerance)
35579             return;
35580           started = true;
35581           dispatch10.call("start", this, d3_event2, _targetEntity);
35582         } else {
35583           startOrigin = p;
35584           d3_event2.stopPropagation();
35585           d3_event2.preventDefault();
35586           var dx = p[0] - startOrigin[0];
35587           var dy = p[1] - startOrigin[1];
35588           dispatch10.call("move", this, d3_event2, _targetEntity, [p[0] + offset[0], p[1] + offset[1]], [dx, dy]);
35589         }
35590       }
35591       function pointerup(d3_event2) {
35592         if (_pointerId !== (d3_event2.pointerId || "mouse"))
35593           return;
35594         _pointerId = null;
35595         if (started) {
35596           dispatch10.call("end", this, d3_event2, _targetEntity);
35597           d3_event2.preventDefault();
35598         }
35599         select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null);
35600         selectEnable();
35601       }
35602     }
35603     function behavior(selection2) {
35604       var matchesSelector = utilPrefixDOMProperty("matchesSelector");
35605       var delegate = pointerdown;
35606       if (_selector) {
35607         delegate = function(d3_event) {
35608           var root3 = this;
35609           var target = d3_event.target;
35610           for (; target && target !== root3; target = target.parentNode) {
35611             var datum2 = target.__data__;
35612             _targetEntity = datum2 instanceof osmNote ? datum2 : datum2 && datum2.properties && datum2.properties.entity;
35613             if (_targetEntity && target[matchesSelector](_selector)) {
35614               return pointerdown.call(target, d3_event);
35615             }
35616           }
35617         };
35618       }
35619       selection2.on(_pointerPrefix + "down.drag" + _selector, delegate);
35620     }
35621     behavior.off = function(selection2) {
35622       selection2.on(_pointerPrefix + "down.drag" + _selector, null);
35623     };
35624     behavior.selector = function(_) {
35625       if (!arguments.length)
35626         return _selector;
35627       _selector = _;
35628       return behavior;
35629     };
35630     behavior.origin = function(_) {
35631       if (!arguments.length)
35632         return _origin;
35633       _origin = _;
35634       return behavior;
35635     };
35636     behavior.cancel = function() {
35637       select_default2(window).on(_pointerPrefix + "move.drag", null).on(_pointerPrefix + "up.drag pointercancel.drag", null);
35638       return behavior;
35639     };
35640     behavior.targetNode = function(_) {
35641       if (!arguments.length)
35642         return _targetNode;
35643       _targetNode = _;
35644       return behavior;
35645     };
35646     behavior.targetEntity = function(_) {
35647       if (!arguments.length)
35648         return _targetEntity;
35649       _targetEntity = _;
35650       return behavior;
35651     };
35652     behavior.surface = function(_) {
35653       if (!arguments.length)
35654         return _surface;
35655       _surface = _;
35656       return behavior;
35657     };
35658     return utilRebind(behavior, dispatch10, "on");
35659   }
35660
35661   // modules/modes/drag_node.js
35662   function modeDragNode(context) {
35663     var mode = {
35664       id: "drag-node",
35665       button: "browse"
35666     };
35667     var hover = behaviorHover(context).altDisables(true).on("hover", context.ui().sidebar.hover);
35668     var edit2 = behaviorEdit(context);
35669     var _nudgeInterval;
35670     var _restoreSelectedIDs = [];
35671     var _wasMidpoint = false;
35672     var _isCancelled = false;
35673     var _activeEntity;
35674     var _startLoc;
35675     var _lastLoc;
35676     function startNudge(d3_event, entity, nudge) {
35677       if (_nudgeInterval)
35678         window.clearInterval(_nudgeInterval);
35679       _nudgeInterval = window.setInterval(function() {
35680         context.map().pan(nudge);
35681         doMove(d3_event, entity, nudge);
35682       }, 50);
35683     }
35684     function stopNudge() {
35685       if (_nudgeInterval) {
35686         window.clearInterval(_nudgeInterval);
35687         _nudgeInterval = null;
35688       }
35689     }
35690     function moveAnnotation(entity) {
35691       return _t("operations.move.annotation." + entity.geometry(context.graph()));
35692     }
35693     function connectAnnotation(nodeEntity, targetEntity) {
35694       var nodeGeometry = nodeEntity.geometry(context.graph());
35695       var targetGeometry = targetEntity.geometry(context.graph());
35696       if (nodeGeometry === "vertex" && targetGeometry === "vertex") {
35697         var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
35698         var targetParentWayIDs = context.graph().parentWays(targetEntity);
35699         var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
35700         if (sharedParentWays.length !== 0) {
35701           if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
35702             return _t("operations.connect.annotation.from_vertex.to_adjacent_vertex");
35703           }
35704           return _t("operations.connect.annotation.from_vertex.to_sibling_vertex");
35705         }
35706       }
35707       return _t("operations.connect.annotation.from_" + nodeGeometry + ".to_" + targetGeometry);
35708     }
35709     function shouldSnapToNode(target) {
35710       if (!_activeEntity)
35711         return false;
35712       return _activeEntity.geometry(context.graph()) !== "vertex" || (target.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(target, context.graph()));
35713     }
35714     function origin(entity) {
35715       return context.projection(entity.loc);
35716     }
35717     function keydown(d3_event) {
35718       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
35719         if (context.surface().classed("nope")) {
35720           context.surface().classed("nope-suppressed", true);
35721         }
35722         context.surface().classed("nope", false).classed("nope-disabled", true);
35723       }
35724     }
35725     function keyup(d3_event) {
35726       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
35727         if (context.surface().classed("nope-suppressed")) {
35728           context.surface().classed("nope", true);
35729         }
35730         context.surface().classed("nope-suppressed", false).classed("nope-disabled", false);
35731       }
35732     }
35733     function start2(d3_event, entity) {
35734       _wasMidpoint = entity.type === "midpoint";
35735       var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
35736       _isCancelled = !context.editable() || d3_event.shiftKey || hasHidden;
35737       if (_isCancelled) {
35738         if (hasHidden) {
35739           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("modes.drag_node.connected_to_hidden"))();
35740         }
35741         return drag.cancel();
35742       }
35743       if (_wasMidpoint) {
35744         var midpoint = entity;
35745         entity = osmNode();
35746         context.perform(actionAddMidpoint(midpoint, entity));
35747         entity = context.entity(entity.id);
35748         var vertex = context.surface().selectAll("." + entity.id);
35749         drag.targetNode(vertex.node()).targetEntity(entity);
35750       } else {
35751         context.perform(actionNoop());
35752       }
35753       _activeEntity = entity;
35754       _startLoc = entity.loc;
35755       hover.ignoreVertex(entity.geometry(context.graph()) === "vertex");
35756       context.surface().selectAll("." + _activeEntity.id).classed("active", true);
35757       context.enter(mode);
35758     }
35759     function datum2(d3_event) {
35760       if (!d3_event || d3_event.altKey) {
35761         return {};
35762       } else {
35763         var d = d3_event.target.__data__;
35764         return d && d.properties && d.properties.target ? d : {};
35765       }
35766     }
35767     function doMove(d3_event, entity, nudge) {
35768       nudge = nudge || [0, 0];
35769       var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
35770       var currMouse = geoVecSubtract(currPoint, nudge);
35771       var loc = context.projection.invert(currMouse);
35772       var target, edge;
35773       if (!_nudgeInterval) {
35774         var d = datum2(d3_event);
35775         target = d && d.properties && d.properties.entity;
35776         var targetLoc = target && target.loc;
35777         var targetNodes = d && d.properties && d.properties.nodes;
35778         if (targetLoc) {
35779           if (shouldSnapToNode(target)) {
35780             loc = targetLoc;
35781           }
35782         } else if (targetNodes) {
35783           edge = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, end.id);
35784           if (edge) {
35785             loc = edge.loc;
35786           }
35787         }
35788       }
35789       context.replace(
35790         actionMoveNode(entity.id, loc)
35791       );
35792       var isInvalid = false;
35793       if (target) {
35794         isInvalid = hasRelationConflict(entity, target, edge, context.graph());
35795       }
35796       if (!isInvalid) {
35797         isInvalid = hasInvalidGeometry(entity, context.graph());
35798       }
35799       var nope = context.surface().classed("nope");
35800       if (isInvalid === "relation" || isInvalid === "restriction") {
35801         if (!nope) {
35802           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(
35803             "operations.connect." + isInvalid,
35804             { relation: _mainPresetIndex.item("type/restriction").name() }
35805           ))();
35806         }
35807       } else if (isInvalid) {
35808         var errorID = isInvalid === "line" ? "lines" : "areas";
35809         context.ui().flash.duration(3e3).iconName("#iD-icon-no").label(_t.append("self_intersection.error." + errorID))();
35810       } else {
35811         if (nope) {
35812           context.ui().flash.duration(1).label("")();
35813         }
35814       }
35815       var nopeDisabled = context.surface().classed("nope-disabled");
35816       if (nopeDisabled) {
35817         context.surface().classed("nope", false).classed("nope-suppressed", isInvalid);
35818       } else {
35819         context.surface().classed("nope", isInvalid).classed("nope-suppressed", false);
35820       }
35821       _lastLoc = loc;
35822     }
35823     function hasRelationConflict(entity, target, edge, graph) {
35824       var testGraph = graph.update();
35825       if (edge) {
35826         var midpoint = osmNode();
35827         var action = actionAddMidpoint({
35828           loc: edge.loc,
35829           edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
35830         }, midpoint);
35831         testGraph = action(testGraph);
35832         target = midpoint;
35833       }
35834       var ids = [entity.id, target.id];
35835       return actionConnect(ids).disabled(testGraph);
35836     }
35837     function hasInvalidGeometry(entity, graph) {
35838       var parents = graph.parentWays(entity);
35839       var i2, j2, k;
35840       for (i2 = 0; i2 < parents.length; i2++) {
35841         var parent = parents[i2];
35842         var nodes = [];
35843         var activeIndex = null;
35844         var relations = graph.parentRelations(parent);
35845         for (j2 = 0; j2 < relations.length; j2++) {
35846           if (!relations[j2].isMultipolygon())
35847             continue;
35848           var rings = osmJoinWays(relations[j2].members, graph);
35849           for (k = 0; k < rings.length; k++) {
35850             nodes = rings[k].nodes;
35851             if (nodes.find(function(n2) {
35852               return n2.id === entity.id;
35853             })) {
35854               activeIndex = k;
35855               if (geoHasSelfIntersections(nodes, entity.id)) {
35856                 return "multipolygonMember";
35857               }
35858             }
35859             rings[k].coords = nodes.map(function(n2) {
35860               return n2.loc;
35861             });
35862           }
35863           for (k = 0; k < rings.length; k++) {
35864             if (k === activeIndex)
35865               continue;
35866             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
35867               return "multipolygonRing";
35868             }
35869           }
35870         }
35871         if (activeIndex === null) {
35872           nodes = parent.nodes.map(function(nodeID) {
35873             return graph.entity(nodeID);
35874           });
35875           if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
35876             return parent.geometry(graph);
35877           }
35878         }
35879       }
35880       return false;
35881     }
35882     function move(d3_event, entity, point2) {
35883       if (_isCancelled)
35884         return;
35885       d3_event.stopPropagation();
35886       context.surface().classed("nope-disabled", d3_event.altKey);
35887       _lastLoc = context.projection.invert(point2);
35888       doMove(d3_event, entity);
35889       var nudge = geoViewportEdge(point2, context.map().dimensions());
35890       if (nudge) {
35891         startNudge(d3_event, entity, nudge);
35892       } else {
35893         stopNudge();
35894       }
35895     }
35896     function end(d3_event, entity) {
35897       if (_isCancelled)
35898         return;
35899       var wasPoint = entity.geometry(context.graph()) === "point";
35900       var d = datum2(d3_event);
35901       var nope = d && d.properties && d.properties.nope || context.surface().classed("nope");
35902       var target = d && d.properties && d.properties.entity;
35903       if (nope) {
35904         context.perform(
35905           _actionBounceBack(entity.id, _startLoc)
35906         );
35907       } else if (target && target.type === "way") {
35908         var choice = geoChooseEdge(context.graph().childNodes(target), context.map().mouse(), context.projection, entity.id);
35909         context.replace(
35910           actionAddMidpoint({
35911             loc: choice.loc,
35912             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
35913           }, entity),
35914           connectAnnotation(entity, target)
35915         );
35916       } else if (target && target.type === "node" && shouldSnapToNode(target)) {
35917         context.replace(
35918           actionConnect([target.id, entity.id]),
35919           connectAnnotation(entity, target)
35920         );
35921       } else if (_wasMidpoint) {
35922         context.replace(
35923           actionNoop(),
35924           _t("operations.add.annotation.vertex")
35925         );
35926       } else {
35927         context.replace(
35928           actionNoop(),
35929           moveAnnotation(entity)
35930         );
35931       }
35932       if (wasPoint) {
35933         context.enter(modeSelect(context, [entity.id]));
35934       } else {
35935         var reselection = _restoreSelectedIDs.filter(function(id2) {
35936           return context.graph().hasEntity(id2);
35937         });
35938         if (reselection.length) {
35939           context.enter(modeSelect(context, reselection));
35940         } else {
35941           context.enter(modeBrowse(context));
35942         }
35943       }
35944     }
35945     function _actionBounceBack(nodeID, toLoc) {
35946       var moveNode = actionMoveNode(nodeID, toLoc);
35947       var action = function(graph, t) {
35948         if (t === 1)
35949           context.pop();
35950         return moveNode(graph, t);
35951       };
35952       action.transitionable = true;
35953       return action;
35954     }
35955     function cancel() {
35956       drag.cancel();
35957       context.enter(modeBrowse(context));
35958     }
35959     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);
35960     mode.enter = function() {
35961       context.install(hover);
35962       context.install(edit2);
35963       select_default2(window).on("keydown.dragNode", keydown).on("keyup.dragNode", keyup);
35964       context.history().on("undone.drag-node", cancel);
35965     };
35966     mode.exit = function() {
35967       context.ui().sidebar.hover.cancel();
35968       context.uninstall(hover);
35969       context.uninstall(edit2);
35970       select_default2(window).on("keydown.dragNode", null).on("keyup.dragNode", null);
35971       context.history().on("undone.drag-node", null);
35972       _activeEntity = null;
35973       context.surface().classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false).selectAll(".active").classed("active", false);
35974       stopNudge();
35975     };
35976     mode.selectedIDs = function() {
35977       if (!arguments.length)
35978         return _activeEntity ? [_activeEntity.id] : [];
35979       return mode;
35980     };
35981     mode.activeID = function() {
35982       if (!arguments.length)
35983         return _activeEntity && _activeEntity.id;
35984       return mode;
35985     };
35986     mode.restoreSelectedIDs = function(_) {
35987       if (!arguments.length)
35988         return _restoreSelectedIDs;
35989       _restoreSelectedIDs = _;
35990       return mode;
35991     };
35992     mode.behavior = drag;
35993     return mode;
35994   }
35995
35996   // modules/services/keepRight.js
35997   var import_rbush = __toESM(require_rbush_min());
35998
35999   // node_modules/d3-fetch/src/text.js
36000   function responseText(response) {
36001     if (!response.ok)
36002       throw new Error(response.status + " " + response.statusText);
36003     return response.text();
36004   }
36005   function text_default3(input, init2) {
36006     return fetch(input, init2).then(responseText);
36007   }
36008
36009   // node_modules/d3-fetch/src/json.js
36010   function responseJson(response) {
36011     if (!response.ok)
36012       throw new Error(response.status + " " + response.statusText);
36013     if (response.status === 204 || response.status === 205)
36014       return;
36015     return response.json();
36016   }
36017   function json_default(input, init2) {
36018     return fetch(input, init2).then(responseJson);
36019   }
36020
36021   // node_modules/d3-fetch/src/xml.js
36022   function parser(type2) {
36023     return (input, init2) => text_default3(input, init2).then((text2) => new DOMParser().parseFromString(text2, type2));
36024   }
36025   var xml_default = parser("application/xml");
36026   var html = parser("text/html");
36027   var svg = parser("image/svg+xml");
36028
36029   // modules/services/keepRight.js
36030   var tiler = utilTiler();
36031   var dispatch2 = dispatch_default("loaded");
36032   var _tileZoom = 14;
36033   var _krUrlRoot = "https://www.keepright.at";
36034   var _krData = { errorTypes: {}, localizeStrings: {} };
36035   var _cache;
36036   var _krRuleset = [
36037     // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
36038     30,
36039     40,
36040     50,
36041     60,
36042     70,
36043     90,
36044     100,
36045     110,
36046     120,
36047     130,
36048     150,
36049     160,
36050     170,
36051     180,
36052     190,
36053     191,
36054     192,
36055     193,
36056     194,
36057     195,
36058     196,
36059     197,
36060     198,
36061     200,
36062     201,
36063     202,
36064     203,
36065     204,
36066     205,
36067     206,
36068     207,
36069     208,
36070     210,
36071     220,
36072     230,
36073     231,
36074     232,
36075     270,
36076     280,
36077     281,
36078     282,
36079     283,
36080     284,
36081     285,
36082     290,
36083     291,
36084     292,
36085     293,
36086     294,
36087     295,
36088     296,
36089     297,
36090     298,
36091     300,
36092     310,
36093     311,
36094     312,
36095     313,
36096     320,
36097     350,
36098     360,
36099     370,
36100     380,
36101     390,
36102     400,
36103     401,
36104     402,
36105     410,
36106     411,
36107     412,
36108     413
36109   ];
36110   function abortRequest(controller) {
36111     if (controller) {
36112       controller.abort();
36113     }
36114   }
36115   function abortUnwantedRequests(cache, tiles) {
36116     Object.keys(cache.inflightTile).forEach((k) => {
36117       const wanted = tiles.find((tile) => k === tile.id);
36118       if (!wanted) {
36119         abortRequest(cache.inflightTile[k]);
36120         delete cache.inflightTile[k];
36121       }
36122     });
36123   }
36124   function encodeIssueRtree(d) {
36125     return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
36126   }
36127   function updateRtree(item, replace) {
36128     _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id);
36129     if (replace) {
36130       _cache.rtree.insert(item);
36131     }
36132   }
36133   function tokenReplacements(d) {
36134     if (!(d instanceof QAItem))
36135       return;
36136     const replacements = {};
36137     const issueTemplate = _krData.errorTypes[d.whichType];
36138     if (!issueTemplate) {
36139       console.log("No Template: ", d.whichType);
36140       console.log("  ", d.description);
36141       return;
36142     }
36143     if (!issueTemplate.regex)
36144       return;
36145     const errorRegex = new RegExp(issueTemplate.regex, "i");
36146     const errorMatch = errorRegex.exec(d.description);
36147     if (!errorMatch) {
36148       console.log("Unmatched: ", d.whichType);
36149       console.log("  ", d.description);
36150       console.log("  ", errorRegex);
36151       return;
36152     }
36153     for (let i2 = 1; i2 < errorMatch.length; i2++) {
36154       let capture = errorMatch[i2];
36155       let idType;
36156       idType = "IDs" in issueTemplate ? issueTemplate.IDs[i2 - 1] : "";
36157       if (idType && capture) {
36158         capture = parseError(capture, idType);
36159       } else {
36160         const compare = capture.toLowerCase();
36161         if (_krData.localizeStrings[compare]) {
36162           capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]);
36163         } else {
36164           capture = unescape_default(capture);
36165         }
36166       }
36167       replacements["var" + i2] = capture;
36168     }
36169     return replacements;
36170   }
36171   function parseError(capture, idType) {
36172     const compare = capture.toLowerCase();
36173     if (_krData.localizeStrings[compare]) {
36174       capture = _t("QA.keepRight.error_parts." + _krData.localizeStrings[compare]);
36175     }
36176     switch (idType) {
36177       case "this":
36178         capture = linkErrorObject2(capture);
36179         break;
36180       case "url":
36181         capture = linkURL(capture);
36182         break;
36183       case "n":
36184       case "w":
36185       case "r":
36186         capture = linkEntity2(idType + capture);
36187         break;
36188       case "20":
36189         capture = parse20(capture);
36190         break;
36191       case "211":
36192         capture = parse211(capture);
36193         break;
36194       case "231":
36195         capture = parse231(capture);
36196         break;
36197       case "294":
36198         capture = parse294(capture);
36199         break;
36200       case "370":
36201         capture = parse370(capture);
36202         break;
36203     }
36204     return capture;
36205     function linkErrorObject2(d) {
36206       return { html: `<a class="error_object_link">${d}</a>` };
36207     }
36208     function linkEntity2(d) {
36209       return { html: `<a class="error_entity_link">${d}</a>` };
36210     }
36211     function linkURL(d) {
36212       return { html: `<a class="kr_external_link" target="_blank" href="${d}">${d}</a>` };
36213     }
36214     function parse211(capture2) {
36215       let newList = [];
36216       const items = capture2.split(", ");
36217       items.forEach((item) => {
36218         let id2 = linkEntity2("n" + item.slice(1));
36219         newList.push(id2);
36220       });
36221       return newList.join(", ");
36222     }
36223     function parse231(capture2) {
36224       let newList = [];
36225       const items = capture2.split("),");
36226       items.forEach((item) => {
36227         const match = item.match(/\#(\d+)\((.+)\)?/);
36228         if (match !== null && match.length > 2) {
36229           newList.push(
36230             linkEntity2("w" + match[1]) + " " + _t("QA.keepRight.errorTypes.231.layer", { layer: match[2] })
36231           );
36232         }
36233       });
36234       return newList.join(", ");
36235     }
36236     function parse294(capture2) {
36237       let newList = [];
36238       const items = capture2.split(",");
36239       items.forEach((item) => {
36240         item = item.split(" ");
36241         const role = `"${item[0]}"`;
36242         const idType2 = item[1].slice(0, 1);
36243         let id2 = item[2].slice(1);
36244         id2 = linkEntity2(idType2 + id2);
36245         newList.push(`${role} ${item[1]} ${id2}`);
36246       });
36247       return newList.join(", ");
36248     }
36249     function parse370(capture2) {
36250       if (!capture2)
36251         return "";
36252       const match = capture2.match(/\(including the name (\'.+\')\)/);
36253       if (match && match.length) {
36254         return _t("QA.keepRight.errorTypes.370.including_the_name", { name: match[1] });
36255       }
36256       return "";
36257     }
36258     function parse20(capture2) {
36259       let newList = [];
36260       const items = capture2.split(",");
36261       items.forEach((item) => {
36262         const id2 = linkEntity2("n" + item.slice(1));
36263         newList.push(id2);
36264       });
36265       return newList.join(", ");
36266     }
36267   }
36268   var keepRight_default = {
36269     title: "keepRight",
36270     init() {
36271       _mainFileFetcher.get("keepRight").then((d) => _krData = d);
36272       if (!_cache) {
36273         this.reset();
36274       }
36275       this.event = utilRebind(this, dispatch2, "on");
36276     },
36277     reset() {
36278       if (_cache) {
36279         Object.values(_cache.inflightTile).forEach(abortRequest);
36280       }
36281       _cache = {
36282         data: {},
36283         loadedTile: {},
36284         inflightTile: {},
36285         inflightPost: {},
36286         closed: {},
36287         rtree: new import_rbush.default()
36288       };
36289     },
36290     // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
36291     loadIssues(projection2) {
36292       const options2 = {
36293         format: "geojson",
36294         ch: _krRuleset
36295       };
36296       const tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection2);
36297       abortUnwantedRequests(_cache, tiles);
36298       tiles.forEach((tile) => {
36299         if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id])
36300           return;
36301         const [left, top, right, bottom] = tile.extent.rectangle();
36302         const params = Object.assign({}, options2, { left, bottom, right, top });
36303         const url = `${_krUrlRoot}/export.php?` + utilQsString(params);
36304         const controller = new AbortController();
36305         _cache.inflightTile[tile.id] = controller;
36306         json_default(url, { signal: controller.signal }).then((data) => {
36307           delete _cache.inflightTile[tile.id];
36308           _cache.loadedTile[tile.id] = true;
36309           if (!data || !data.features || !data.features.length) {
36310             throw new Error("No Data");
36311           }
36312           data.features.forEach((feature3) => {
36313             const {
36314               properties: {
36315                 error_type: itemType,
36316                 error_id: id2,
36317                 comment = null,
36318                 object_id: objectId,
36319                 object_type: objectType,
36320                 schema,
36321                 title
36322               }
36323             } = feature3;
36324             let {
36325               geometry: { coordinates: loc },
36326               properties: { description = "" }
36327             } = feature3;
36328             const issueTemplate = _krData.errorTypes[itemType];
36329             const parentIssueType = (Math.floor(itemType / 10) * 10).toString();
36330             const whichType = issueTemplate ? itemType : parentIssueType;
36331             const whichTemplate = _krData.errorTypes[whichType];
36332             switch (whichType) {
36333               case "170":
36334                 description = `This feature has a FIXME tag: ${description}`;
36335                 break;
36336               case "292":
36337               case "293":
36338                 description = description.replace("A turn-", "This turn-");
36339                 break;
36340               case "294":
36341               case "295":
36342               case "296":
36343               case "297":
36344               case "298":
36345                 description = `This turn-restriction~${description}`;
36346                 break;
36347               case "300":
36348                 description = "This highway is missing a maxspeed tag";
36349                 break;
36350               case "411":
36351               case "412":
36352               case "413":
36353                 description = `This feature~${description}`;
36354                 break;
36355             }
36356             let coincident = false;
36357             do {
36358               let delta = coincident ? [1e-5, 0] : [0, 1e-5];
36359               loc = geoVecAdd(loc, delta);
36360               let bbox2 = geoExtent(loc).bbox();
36361               coincident = _cache.rtree.search(bbox2).length;
36362             } while (coincident);
36363             let d = new QAItem(loc, this, itemType, id2, {
36364               comment,
36365               description,
36366               whichType,
36367               parentIssueType,
36368               severity: whichTemplate.severity || "error",
36369               objectId,
36370               objectType,
36371               schema,
36372               title
36373             });
36374             d.replacements = tokenReplacements(d);
36375             _cache.data[id2] = d;
36376             _cache.rtree.insert(encodeIssueRtree(d));
36377           });
36378           dispatch2.call("loaded");
36379         }).catch(() => {
36380           delete _cache.inflightTile[tile.id];
36381           _cache.loadedTile[tile.id] = true;
36382         });
36383       });
36384     },
36385     postUpdate(d, callback) {
36386       if (_cache.inflightPost[d.id]) {
36387         return callback({ message: "Error update already inflight", status: -2 }, d);
36388       }
36389       const params = { schema: d.schema, id: d.id };
36390       if (d.newStatus) {
36391         params.st = d.newStatus;
36392       }
36393       if (d.newComment !== void 0) {
36394         params.co = d.newComment;
36395       }
36396       const url = `${_krUrlRoot}/comment.php?` + utilQsString(params);
36397       const controller = new AbortController();
36398       _cache.inflightPost[d.id] = controller;
36399       json_default(url, { signal: controller.signal }).finally(() => {
36400         delete _cache.inflightPost[d.id];
36401         if (d.newStatus === "ignore") {
36402           this.removeItem(d);
36403         } else if (d.newStatus === "ignore_t") {
36404           this.removeItem(d);
36405           _cache.closed[`${d.schema}:${d.id}`] = true;
36406         } else {
36407           d = this.replaceItem(d.update({
36408             comment: d.newComment,
36409             newComment: void 0,
36410             newState: void 0
36411           }));
36412         }
36413         if (callback)
36414           callback(null, d);
36415       });
36416     },
36417     // Get all cached QAItems covering the viewport
36418     getItems(projection2) {
36419       const viewport = projection2.clipExtent();
36420       const min3 = [viewport[0][0], viewport[1][1]];
36421       const max3 = [viewport[1][0], viewport[0][1]];
36422       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
36423       return _cache.rtree.search(bbox2).map((d) => d.data);
36424     },
36425     // Get a QAItem from cache
36426     // NOTE: Don't change method name until UI v3 is merged
36427     getError(id2) {
36428       return _cache.data[id2];
36429     },
36430     // Replace a single QAItem in the cache
36431     replaceItem(item) {
36432       if (!(item instanceof QAItem) || !item.id)
36433         return;
36434       _cache.data[item.id] = item;
36435       updateRtree(encodeIssueRtree(item), true);
36436       return item;
36437     },
36438     // Remove a single QAItem from the cache
36439     removeItem(item) {
36440       if (!(item instanceof QAItem) || !item.id)
36441         return;
36442       delete _cache.data[item.id];
36443       updateRtree(encodeIssueRtree(item), false);
36444     },
36445     issueURL(item) {
36446       return `${_krUrlRoot}/report_map.php?schema=${item.schema}&error=${item.id}`;
36447     },
36448     // Get an array of issues closed during this session.
36449     // Used to populate `closed:keepright` changeset tag
36450     getClosedIDs() {
36451       return Object.keys(_cache.closed).sort();
36452     }
36453   };
36454
36455   // modules/services/improveOSM.js
36456   var import_rbush2 = __toESM(require_rbush_min());
36457   var tiler2 = utilTiler();
36458   var dispatch3 = dispatch_default("loaded");
36459   var _tileZoom2 = 14;
36460   var _impOsmUrls = {
36461     ow: "https://grab.community.improve-osm.org/directionOfFlowService",
36462     mr: "https://grab.community.improve-osm.org/missingGeoService",
36463     tr: "https://grab.community.improve-osm.org/turnRestrictionService"
36464   };
36465   var _impOsmData = { icons: {} };
36466   var _cache2;
36467   function abortRequest2(i2) {
36468     Object.values(i2).forEach((controller) => {
36469       if (controller) {
36470         controller.abort();
36471       }
36472     });
36473   }
36474   function abortUnwantedRequests2(cache, tiles) {
36475     Object.keys(cache.inflightTile).forEach((k) => {
36476       const wanted = tiles.find((tile) => k === tile.id);
36477       if (!wanted) {
36478         abortRequest2(cache.inflightTile[k]);
36479         delete cache.inflightTile[k];
36480       }
36481     });
36482   }
36483   function encodeIssueRtree2(d) {
36484     return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
36485   }
36486   function updateRtree2(item, replace) {
36487     _cache2.rtree.remove(item, (a, b) => a.data.id === b.data.id);
36488     if (replace) {
36489       _cache2.rtree.insert(item);
36490     }
36491   }
36492   function linkErrorObject(d) {
36493     return { html: `<a class="error_object_link">${d}</a>` };
36494   }
36495   function linkEntity(d) {
36496     return { html: `<a class="error_entity_link">${d}</a>` };
36497   }
36498   function pointAverage(points) {
36499     if (points.length) {
36500       const sum = points.reduce(
36501         (acc, point2) => geoVecAdd(acc, [point2.lon, point2.lat]),
36502         [0, 0]
36503       );
36504       return geoVecScale(sum, 1 / points.length);
36505     } else {
36506       return [0, 0];
36507     }
36508   }
36509   function relativeBearing(p1, p2) {
36510     let angle2 = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
36511     if (angle2 < 0) {
36512       angle2 += 2 * Math.PI;
36513     }
36514     return angle2 * 180 / Math.PI;
36515   }
36516   function cardinalDirection(bearing) {
36517     const dir = 45 * Math.round(bearing / 45);
36518     const compass = {
36519       0: "north",
36520       45: "northeast",
36521       90: "east",
36522       135: "southeast",
36523       180: "south",
36524       225: "southwest",
36525       270: "west",
36526       315: "northwest",
36527       360: "north"
36528     };
36529     return _t(`QA.improveOSM.directions.${compass[dir]}`);
36530   }
36531   function preventCoincident(loc, bumpUp) {
36532     let coincident = false;
36533     do {
36534       let delta = coincident ? [1e-5, 0] : bumpUp ? [0, 1e-5] : [0, 0];
36535       loc = geoVecAdd(loc, delta);
36536       let bbox2 = geoExtent(loc).bbox();
36537       coincident = _cache2.rtree.search(bbox2).length;
36538     } while (coincident);
36539     return loc;
36540   }
36541   var improveOSM_default = {
36542     title: "improveOSM",
36543     init() {
36544       _mainFileFetcher.get("qa_data").then((d) => _impOsmData = d.improveOSM);
36545       if (!_cache2) {
36546         this.reset();
36547       }
36548       this.event = utilRebind(this, dispatch3, "on");
36549     },
36550     reset() {
36551       if (_cache2) {
36552         Object.values(_cache2.inflightTile).forEach(abortRequest2);
36553       }
36554       _cache2 = {
36555         data: {},
36556         loadedTile: {},
36557         inflightTile: {},
36558         inflightPost: {},
36559         closed: {},
36560         rtree: new import_rbush2.default()
36561       };
36562     },
36563     loadIssues(projection2) {
36564       const options2 = {
36565         client: "iD",
36566         status: "OPEN",
36567         zoom: "19"
36568         // Use a high zoom so that clusters aren't returned
36569       };
36570       const tiles = tiler2.zoomExtent([_tileZoom2, _tileZoom2]).getTiles(projection2);
36571       abortUnwantedRequests2(_cache2, tiles);
36572       tiles.forEach((tile) => {
36573         if (_cache2.loadedTile[tile.id] || _cache2.inflightTile[tile.id])
36574           return;
36575         const [east, north, west, south] = tile.extent.rectangle();
36576         const params = Object.assign({}, options2, { east, south, west, north });
36577         const requests = {};
36578         Object.keys(_impOsmUrls).forEach((k) => {
36579           const kParams = Object.assign(
36580             {},
36581             params,
36582             k === "mr" ? { type: "PARKING,ROAD,BOTH,PATH" } : { confidenceLevel: "C1" }
36583           );
36584           const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams);
36585           const controller = new AbortController();
36586           requests[k] = controller;
36587           json_default(url, { signal: controller.signal }).then((data) => {
36588             delete _cache2.inflightTile[tile.id][k];
36589             if (!Object.keys(_cache2.inflightTile[tile.id]).length) {
36590               delete _cache2.inflightTile[tile.id];
36591               _cache2.loadedTile[tile.id] = true;
36592             }
36593             if (data.roadSegments) {
36594               data.roadSegments.forEach((feature3) => {
36595                 const { points, wayId, fromNodeId, toNodeId } = feature3;
36596                 const itemId = `${wayId}${fromNodeId}${toNodeId}`;
36597                 let mid = points.length / 2;
36598                 let loc;
36599                 if (mid % 1 === 0) {
36600                   loc = pointAverage([points[mid - 1], points[mid]]);
36601                 } else {
36602                   mid = points[Math.floor(mid)];
36603                   loc = [mid.lon, mid.lat];
36604                 }
36605                 loc = preventCoincident(loc, false);
36606                 let d = new QAItem(loc, this, k, itemId, {
36607                   issueKey: k,
36608                   // used as a category
36609                   identifier: {
36610                     // used to post changes
36611                     wayId,
36612                     fromNodeId,
36613                     toNodeId
36614                   },
36615                   objectId: wayId,
36616                   objectType: "way"
36617                 });
36618                 d.replacements = {
36619                   percentage: feature3.percentOfTrips,
36620                   num_trips: feature3.numberOfTrips,
36621                   highway: linkErrorObject(_t("QA.keepRight.error_parts.highway")),
36622                   from_node: linkEntity("n" + feature3.fromNodeId),
36623                   to_node: linkEntity("n" + feature3.toNodeId)
36624                 };
36625                 _cache2.data[d.id] = d;
36626                 _cache2.rtree.insert(encodeIssueRtree2(d));
36627               });
36628             }
36629             if (data.tiles) {
36630               data.tiles.forEach((feature3) => {
36631                 const { type: type2, x, y, numberOfTrips } = feature3;
36632                 const geoType = type2.toLowerCase();
36633                 const itemId = `${geoType}${x}${y}${numberOfTrips}`;
36634                 let loc = pointAverage(feature3.points);
36635                 loc = preventCoincident(loc, false);
36636                 let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, {
36637                   issueKey: k,
36638                   identifier: { x, y }
36639                 });
36640                 d.replacements = {
36641                   num_trips: numberOfTrips,
36642                   geometry_type: _t(`QA.improveOSM.geometry_types.${geoType}`)
36643                 };
36644                 if (numberOfTrips === -1) {
36645                   d.desc = _t("QA.improveOSM.error_types.mr.description_alt", d.replacements);
36646                 }
36647                 _cache2.data[d.id] = d;
36648                 _cache2.rtree.insert(encodeIssueRtree2(d));
36649               });
36650             }
36651             if (data.entities) {
36652               data.entities.forEach((feature3) => {
36653                 const { point: point2, id: id2, segments, numberOfPasses, turnType } = feature3;
36654                 const itemId = `${id2.replace(/[,:+#]/g, "_")}`;
36655                 const loc = preventCoincident([point2.lon, point2.lat], true);
36656                 const ids = id2.split(",");
36657                 const from_way = ids[0];
36658                 const via_node = ids[3];
36659                 const to_way = ids[2].split(":")[1];
36660                 let d = new QAItem(loc, this, k, itemId, {
36661                   issueKey: k,
36662                   identifier: id2,
36663                   objectId: via_node,
36664                   objectType: "node"
36665                 });
36666                 const [p1, p2] = segments[0].points;
36667                 const dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
36668                 d.replacements = {
36669                   num_passed: numberOfPasses,
36670                   num_trips: segments[0].numberOfTrips,
36671                   turn_restriction: turnType.toLowerCase(),
36672                   from_way: linkEntity("w" + from_way),
36673                   to_way: linkEntity("w" + to_way),
36674                   travel_direction: dir_of_travel,
36675                   junction: linkErrorObject(_t("QA.keepRight.error_parts.this_node"))
36676                 };
36677                 _cache2.data[d.id] = d;
36678                 _cache2.rtree.insert(encodeIssueRtree2(d));
36679                 dispatch3.call("loaded");
36680               });
36681             }
36682           }).catch(() => {
36683             delete _cache2.inflightTile[tile.id][k];
36684             if (!Object.keys(_cache2.inflightTile[tile.id]).length) {
36685               delete _cache2.inflightTile[tile.id];
36686               _cache2.loadedTile[tile.id] = true;
36687             }
36688           });
36689         });
36690         _cache2.inflightTile[tile.id] = requests;
36691       });
36692     },
36693     getComments(item) {
36694       if (item.comments) {
36695         return Promise.resolve(item);
36696       }
36697       const key = item.issueKey;
36698       let qParams = {};
36699       if (key === "ow") {
36700         qParams = item.identifier;
36701       } else if (key === "mr") {
36702         qParams.tileX = item.identifier.x;
36703         qParams.tileY = item.identifier.y;
36704       } else if (key === "tr") {
36705         qParams.targetId = item.identifier;
36706       }
36707       const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams);
36708       const cacheComments = (data) => {
36709         item.comments = data.comments ? data.comments.reverse() : [];
36710         this.replaceItem(item);
36711       };
36712       return json_default(url).then(cacheComments).then(() => item);
36713     },
36714     postUpdate(d, callback) {
36715       if (!osm_default.authenticated()) {
36716         return callback({ message: "Not Authenticated", status: -3 }, d);
36717       }
36718       if (_cache2.inflightPost[d.id]) {
36719         return callback({ message: "Error update already inflight", status: -2 }, d);
36720       }
36721       osm_default.userDetails(sendPayload.bind(this));
36722       function sendPayload(err, user) {
36723         if (err) {
36724           return callback(err, d);
36725         }
36726         const key = d.issueKey;
36727         const url = `${_impOsmUrls[key]}/comment`;
36728         const payload = {
36729           username: user.display_name,
36730           targetIds: [d.identifier]
36731         };
36732         if (d.newStatus) {
36733           payload.status = d.newStatus;
36734           payload.text = "status changed";
36735         }
36736         if (d.newComment) {
36737           payload.text = d.newComment;
36738         }
36739         const controller = new AbortController();
36740         _cache2.inflightPost[d.id] = controller;
36741         const options2 = {
36742           method: "POST",
36743           signal: controller.signal,
36744           body: JSON.stringify(payload)
36745         };
36746         json_default(url, options2).then(() => {
36747           delete _cache2.inflightPost[d.id];
36748           if (!d.newStatus) {
36749             const now3 = /* @__PURE__ */ new Date();
36750             let comments = d.comments ? d.comments : [];
36751             comments.push({
36752               username: payload.username,
36753               text: payload.text,
36754               timestamp: now3.getTime() / 1e3
36755             });
36756             this.replaceItem(d.update({
36757               comments,
36758               newComment: void 0
36759             }));
36760           } else {
36761             this.removeItem(d);
36762             if (d.newStatus === "SOLVED") {
36763               if (!(d.issueKey in _cache2.closed)) {
36764                 _cache2.closed[d.issueKey] = 0;
36765               }
36766               _cache2.closed[d.issueKey] += 1;
36767             }
36768           }
36769           if (callback)
36770             callback(null, d);
36771         }).catch((err2) => {
36772           delete _cache2.inflightPost[d.id];
36773           if (callback)
36774             callback(err2.message);
36775         });
36776       }
36777     },
36778     // Get all cached QAItems covering the viewport
36779     getItems(projection2) {
36780       const viewport = projection2.clipExtent();
36781       const min3 = [viewport[0][0], viewport[1][1]];
36782       const max3 = [viewport[1][0], viewport[0][1]];
36783       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
36784       return _cache2.rtree.search(bbox2).map((d) => d.data);
36785     },
36786     // Get a QAItem from cache
36787     // NOTE: Don't change method name until UI v3 is merged
36788     getError(id2) {
36789       return _cache2.data[id2];
36790     },
36791     // get the name of the icon to display for this item
36792     getIcon(itemType) {
36793       return _impOsmData.icons[itemType];
36794     },
36795     // Replace a single QAItem in the cache
36796     replaceItem(issue) {
36797       if (!(issue instanceof QAItem) || !issue.id)
36798         return;
36799       _cache2.data[issue.id] = issue;
36800       updateRtree2(encodeIssueRtree2(issue), true);
36801       return issue;
36802     },
36803     // Remove a single QAItem from the cache
36804     removeItem(issue) {
36805       if (!(issue instanceof QAItem) || !issue.id)
36806         return;
36807       delete _cache2.data[issue.id];
36808       updateRtree2(encodeIssueRtree2(issue), false);
36809     },
36810     // Used to populate `closed:improveosm:*` changeset tags
36811     getClosedCounts() {
36812       return _cache2.closed;
36813     }
36814   };
36815
36816   // modules/services/osmose.js
36817   var import_rbush3 = __toESM(require_rbush_min());
36818
36819   // node_modules/marked/lib/marked.esm.js
36820   function getDefaults() {
36821     return {
36822       async: false,
36823       baseUrl: null,
36824       breaks: false,
36825       extensions: null,
36826       gfm: true,
36827       headerIds: true,
36828       headerPrefix: "",
36829       highlight: null,
36830       hooks: null,
36831       langPrefix: "language-",
36832       mangle: true,
36833       pedantic: false,
36834       renderer: null,
36835       sanitize: false,
36836       sanitizer: null,
36837       silent: false,
36838       smartypants: false,
36839       tokenizer: null,
36840       walkTokens: null,
36841       xhtml: false
36842     };
36843   }
36844   var defaults = getDefaults();
36845   function changeDefaults(newDefaults) {
36846     defaults = newDefaults;
36847   }
36848   var escapeTest = /[&<>"']/;
36849   var escapeReplace = new RegExp(escapeTest.source, "g");
36850   var escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
36851   var escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, "g");
36852   var escapeReplacements = {
36853     "&": "&amp;",
36854     "<": "&lt;",
36855     ">": "&gt;",
36856     '"': "&quot;",
36857     "'": "&#39;"
36858   };
36859   var getEscapeReplacement = (ch) => escapeReplacements[ch];
36860   function escape4(html2, encode) {
36861     if (encode) {
36862       if (escapeTest.test(html2)) {
36863         return html2.replace(escapeReplace, getEscapeReplacement);
36864       }
36865     } else {
36866       if (escapeTestNoEncode.test(html2)) {
36867         return html2.replace(escapeReplaceNoEncode, getEscapeReplacement);
36868       }
36869     }
36870     return html2;
36871   }
36872   var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
36873   function unescape3(html2) {
36874     return html2.replace(unescapeTest, (_, n2) => {
36875       n2 = n2.toLowerCase();
36876       if (n2 === "colon")
36877         return ":";
36878       if (n2.charAt(0) === "#") {
36879         return n2.charAt(1) === "x" ? String.fromCharCode(parseInt(n2.substring(2), 16)) : String.fromCharCode(+n2.substring(1));
36880       }
36881       return "";
36882     });
36883   }
36884   var caret = /(^|[^\[])\^/g;
36885   function edit(regex, opt) {
36886     regex = typeof regex === "string" ? regex : regex.source;
36887     opt = opt || "";
36888     const obj = {
36889       replace: (name, val) => {
36890         val = val.source || val;
36891         val = val.replace(caret, "$1");
36892         regex = regex.replace(name, val);
36893         return obj;
36894       },
36895       getRegex: () => {
36896         return new RegExp(regex, opt);
36897       }
36898     };
36899     return obj;
36900   }
36901   var nonWordAndColonTest = /[^\w:]/g;
36902   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
36903   function cleanUrl(sanitize, base, href) {
36904     if (sanitize) {
36905       let prot;
36906       try {
36907         prot = decodeURIComponent(unescape3(href)).replace(nonWordAndColonTest, "").toLowerCase();
36908       } catch (e) {
36909         return null;
36910       }
36911       if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) {
36912         return null;
36913       }
36914     }
36915     if (base && !originIndependentUrl.test(href)) {
36916       href = resolveUrl(base, href);
36917     }
36918     try {
36919       href = encodeURI(href).replace(/%25/g, "%");
36920     } catch (e) {
36921       return null;
36922     }
36923     return href;
36924   }
36925   var baseUrls = {};
36926   var justDomain = /^[^:]+:\/*[^/]*$/;
36927   var protocol = /^([^:]+:)[\s\S]*$/;
36928   var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
36929   function resolveUrl(base, href) {
36930     if (!baseUrls[" " + base]) {
36931       if (justDomain.test(base)) {
36932         baseUrls[" " + base] = base + "/";
36933       } else {
36934         baseUrls[" " + base] = rtrim(base, "/", true);
36935       }
36936     }
36937     base = baseUrls[" " + base];
36938     const relativeBase = base.indexOf(":") === -1;
36939     if (href.substring(0, 2) === "//") {
36940       if (relativeBase) {
36941         return href;
36942       }
36943       return base.replace(protocol, "$1") + href;
36944     } else if (href.charAt(0) === "/") {
36945       if (relativeBase) {
36946         return href;
36947       }
36948       return base.replace(domain, "$1") + href;
36949     } else {
36950       return base + href;
36951     }
36952   }
36953   var noopTest = { exec: function noopTest2() {
36954   } };
36955   function splitCells(tableRow, count) {
36956     const row = tableRow.replace(/\|/g, (match, offset, str2) => {
36957       let escaped = false, curr = offset;
36958       while (--curr >= 0 && str2[curr] === "\\")
36959         escaped = !escaped;
36960       if (escaped) {
36961         return "|";
36962       } else {
36963         return " |";
36964       }
36965     }), cells = row.split(/ \|/);
36966     let i2 = 0;
36967     if (!cells[0].trim()) {
36968       cells.shift();
36969     }
36970     if (cells.length > 0 && !cells[cells.length - 1].trim()) {
36971       cells.pop();
36972     }
36973     if (cells.length > count) {
36974       cells.splice(count);
36975     } else {
36976       while (cells.length < count)
36977         cells.push("");
36978     }
36979     for (; i2 < cells.length; i2++) {
36980       cells[i2] = cells[i2].trim().replace(/\\\|/g, "|");
36981     }
36982     return cells;
36983   }
36984   function rtrim(str2, c, invert) {
36985     const l = str2.length;
36986     if (l === 0) {
36987       return "";
36988     }
36989     let suffLen = 0;
36990     while (suffLen < l) {
36991       const currChar = str2.charAt(l - suffLen - 1);
36992       if (currChar === c && !invert) {
36993         suffLen++;
36994       } else if (currChar !== c && invert) {
36995         suffLen++;
36996       } else {
36997         break;
36998       }
36999     }
37000     return str2.slice(0, l - suffLen);
37001   }
37002   function findClosingBracket(str2, b) {
37003     if (str2.indexOf(b[1]) === -1) {
37004       return -1;
37005     }
37006     const l = str2.length;
37007     let level = 0, i2 = 0;
37008     for (; i2 < l; i2++) {
37009       if (str2[i2] === "\\") {
37010         i2++;
37011       } else if (str2[i2] === b[0]) {
37012         level++;
37013       } else if (str2[i2] === b[1]) {
37014         level--;
37015         if (level < 0) {
37016           return i2;
37017         }
37018       }
37019     }
37020     return -1;
37021   }
37022   function checkDeprecations(opt, callback) {
37023     if (!opt || opt.silent) {
37024       return;
37025     }
37026     if (callback) {
37027       console.warn("marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async");
37028     }
37029     if (opt.sanitize || opt.sanitizer) {
37030       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");
37031     }
37032     if (opt.highlight || opt.langPrefix !== "language-") {
37033       console.warn("marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight.");
37034     }
37035     if (opt.mangle) {
37036       console.warn("marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.");
37037     }
37038     if (opt.baseUrl) {
37039       console.warn("marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url.");
37040     }
37041     if (opt.smartypants) {
37042       console.warn("marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants.");
37043     }
37044     if (opt.xhtml) {
37045       console.warn("marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml.");
37046     }
37047     if (opt.headerIds || opt.headerPrefix) {
37048       console.warn("marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install  https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.");
37049     }
37050   }
37051   function outputLink(cap, link2, raw, lexer2) {
37052     const href = link2.href;
37053     const title = link2.title ? escape4(link2.title) : null;
37054     const text2 = cap[1].replace(/\\([\[\]])/g, "$1");
37055     if (cap[0].charAt(0) !== "!") {
37056       lexer2.state.inLink = true;
37057       const token = {
37058         type: "link",
37059         raw,
37060         href,
37061         title,
37062         text: text2,
37063         tokens: lexer2.inlineTokens(text2)
37064       };
37065       lexer2.state.inLink = false;
37066       return token;
37067     }
37068     return {
37069       type: "image",
37070       raw,
37071       href,
37072       title,
37073       text: escape4(text2)
37074     };
37075   }
37076   function indentCodeCompensation(raw, text2) {
37077     const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
37078     if (matchIndentToCode === null) {
37079       return text2;
37080     }
37081     const indentToCode = matchIndentToCode[1];
37082     return text2.split("\n").map((node) => {
37083       const matchIndentInNode = node.match(/^\s+/);
37084       if (matchIndentInNode === null) {
37085         return node;
37086       }
37087       const [indentInNode] = matchIndentInNode;
37088       if (indentInNode.length >= indentToCode.length) {
37089         return node.slice(indentToCode.length);
37090       }
37091       return node;
37092     }).join("\n");
37093   }
37094   var Tokenizer = class {
37095     constructor(options2) {
37096       this.options = options2 || defaults;
37097     }
37098     space(src) {
37099       const cap = this.rules.block.newline.exec(src);
37100       if (cap && cap[0].length > 0) {
37101         return {
37102           type: "space",
37103           raw: cap[0]
37104         };
37105       }
37106     }
37107     code(src) {
37108       const cap = this.rules.block.code.exec(src);
37109       if (cap) {
37110         const text2 = cap[0].replace(/^ {1,4}/gm, "");
37111         return {
37112           type: "code",
37113           raw: cap[0],
37114           codeBlockStyle: "indented",
37115           text: !this.options.pedantic ? rtrim(text2, "\n") : text2
37116         };
37117       }
37118     }
37119     fences(src) {
37120       const cap = this.rules.block.fences.exec(src);
37121       if (cap) {
37122         const raw = cap[0];
37123         const text2 = indentCodeCompensation(raw, cap[3] || "");
37124         return {
37125           type: "code",
37126           raw,
37127           lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, "$1") : cap[2],
37128           text: text2
37129         };
37130       }
37131     }
37132     heading(src) {
37133       const cap = this.rules.block.heading.exec(src);
37134       if (cap) {
37135         let text2 = cap[2].trim();
37136         if (/#$/.test(text2)) {
37137           const trimmed = rtrim(text2, "#");
37138           if (this.options.pedantic) {
37139             text2 = trimmed.trim();
37140           } else if (!trimmed || / $/.test(trimmed)) {
37141             text2 = trimmed.trim();
37142           }
37143         }
37144         return {
37145           type: "heading",
37146           raw: cap[0],
37147           depth: cap[1].length,
37148           text: text2,
37149           tokens: this.lexer.inline(text2)
37150         };
37151       }
37152     }
37153     hr(src) {
37154       const cap = this.rules.block.hr.exec(src);
37155       if (cap) {
37156         return {
37157           type: "hr",
37158           raw: cap[0]
37159         };
37160       }
37161     }
37162     blockquote(src) {
37163       const cap = this.rules.block.blockquote.exec(src);
37164       if (cap) {
37165         const text2 = cap[0].replace(/^ *>[ \t]?/gm, "");
37166         const top = this.lexer.state.top;
37167         this.lexer.state.top = true;
37168         const tokens = this.lexer.blockTokens(text2);
37169         this.lexer.state.top = top;
37170         return {
37171           type: "blockquote",
37172           raw: cap[0],
37173           tokens,
37174           text: text2
37175         };
37176       }
37177     }
37178     list(src) {
37179       let cap = this.rules.block.list.exec(src);
37180       if (cap) {
37181         let raw, istask, ischecked, indent2, i2, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;
37182         let bull = cap[1].trim();
37183         const isordered = bull.length > 1;
37184         const list = {
37185           type: "list",
37186           raw: "",
37187           ordered: isordered,
37188           start: isordered ? +bull.slice(0, -1) : "",
37189           loose: false,
37190           items: []
37191         };
37192         bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
37193         if (this.options.pedantic) {
37194           bull = isordered ? bull : "[*+-]";
37195         }
37196         const itemRegex = new RegExp(`^( {0,3}${bull})((?:[      ][^\\n]*)?(?:\\n|$))`);
37197         while (src) {
37198           endEarly = false;
37199           if (!(cap = itemRegex.exec(src))) {
37200             break;
37201           }
37202           if (this.rules.block.hr.test(src)) {
37203             break;
37204           }
37205           raw = cap[0];
37206           src = src.substring(raw.length);
37207           line = cap[2].split("\n", 1)[0].replace(/^\t+/, (t) => " ".repeat(3 * t.length));
37208           nextLine = src.split("\n", 1)[0];
37209           if (this.options.pedantic) {
37210             indent2 = 2;
37211             itemContents = line.trimLeft();
37212           } else {
37213             indent2 = cap[2].search(/[^ ]/);
37214             indent2 = indent2 > 4 ? 1 : indent2;
37215             itemContents = line.slice(indent2);
37216             indent2 += cap[1].length;
37217           }
37218           blankLine = false;
37219           if (!line && /^ *$/.test(nextLine)) {
37220             raw += nextLine + "\n";
37221             src = src.substring(nextLine.length + 1);
37222             endEarly = true;
37223           }
37224           if (!endEarly) {
37225             const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[    ][^\\n]*)?(?:\\n|$))`);
37226             const hrRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
37227             const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}(?:\`\`\`|~~~)`);
37228             const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent2 - 1)}}#`);
37229             while (src) {
37230               rawLine = src.split("\n", 1)[0];
37231               nextLine = rawLine;
37232               if (this.options.pedantic) {
37233                 nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, "  ");
37234               }
37235               if (fencesBeginRegex.test(nextLine)) {
37236                 break;
37237               }
37238               if (headingBeginRegex.test(nextLine)) {
37239                 break;
37240               }
37241               if (nextBulletRegex.test(nextLine)) {
37242                 break;
37243               }
37244               if (hrRegex.test(src)) {
37245                 break;
37246               }
37247               if (nextLine.search(/[^ ]/) >= indent2 || !nextLine.trim()) {
37248                 itemContents += "\n" + nextLine.slice(indent2);
37249               } else {
37250                 if (blankLine) {
37251                   break;
37252                 }
37253                 if (line.search(/[^ ]/) >= 4) {
37254                   break;
37255                 }
37256                 if (fencesBeginRegex.test(line)) {
37257                   break;
37258                 }
37259                 if (headingBeginRegex.test(line)) {
37260                   break;
37261                 }
37262                 if (hrRegex.test(line)) {
37263                   break;
37264                 }
37265                 itemContents += "\n" + nextLine;
37266               }
37267               if (!blankLine && !nextLine.trim()) {
37268                 blankLine = true;
37269               }
37270               raw += rawLine + "\n";
37271               src = src.substring(rawLine.length + 1);
37272               line = nextLine.slice(indent2);
37273             }
37274           }
37275           if (!list.loose) {
37276             if (endsWithBlankLine) {
37277               list.loose = true;
37278             } else if (/\n *\n *$/.test(raw)) {
37279               endsWithBlankLine = true;
37280             }
37281           }
37282           if (this.options.gfm) {
37283             istask = /^\[[ xX]\] /.exec(itemContents);
37284             if (istask) {
37285               ischecked = istask[0] !== "[ ] ";
37286               itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
37287             }
37288           }
37289           list.items.push({
37290             type: "list_item",
37291             raw,
37292             task: !!istask,
37293             checked: ischecked,
37294             loose: false,
37295             text: itemContents
37296           });
37297           list.raw += raw;
37298         }
37299         list.items[list.items.length - 1].raw = raw.trimRight();
37300         list.items[list.items.length - 1].text = itemContents.trimRight();
37301         list.raw = list.raw.trimRight();
37302         const l = list.items.length;
37303         for (i2 = 0; i2 < l; i2++) {
37304           this.lexer.state.top = false;
37305           list.items[i2].tokens = this.lexer.blockTokens(list.items[i2].text, []);
37306           if (!list.loose) {
37307             const spacers = list.items[i2].tokens.filter((t) => t.type === "space");
37308             const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => /\n.*\n/.test(t.raw));
37309             list.loose = hasMultipleLineBreaks;
37310           }
37311         }
37312         if (list.loose) {
37313           for (i2 = 0; i2 < l; i2++) {
37314             list.items[i2].loose = true;
37315           }
37316         }
37317         return list;
37318       }
37319     }
37320     html(src) {
37321       const cap = this.rules.block.html.exec(src);
37322       if (cap) {
37323         const token = {
37324           type: "html",
37325           block: true,
37326           raw: cap[0],
37327           pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"),
37328           text: cap[0]
37329         };
37330         if (this.options.sanitize) {
37331           const text2 = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]);
37332           token.type = "paragraph";
37333           token.text = text2;
37334           token.tokens = this.lexer.inline(text2);
37335         }
37336         return token;
37337       }
37338     }
37339     def(src) {
37340       const cap = this.rules.block.def.exec(src);
37341       if (cap) {
37342         const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
37343         const href = cap[2] ? cap[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline._escapes, "$1") : "";
37344         const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, "$1") : cap[3];
37345         return {
37346           type: "def",
37347           tag,
37348           raw: cap[0],
37349           href,
37350           title
37351         };
37352       }
37353     }
37354     table(src) {
37355       const cap = this.rules.block.table.exec(src);
37356       if (cap) {
37357         const item = {
37358           type: "table",
37359           header: splitCells(cap[1]).map((c) => {
37360             return { text: c };
37361           }),
37362           align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
37363           rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : []
37364         };
37365         if (item.header.length === item.align.length) {
37366           item.raw = cap[0];
37367           let l = item.align.length;
37368           let i2, j2, k, row;
37369           for (i2 = 0; i2 < l; i2++) {
37370             if (/^ *-+: *$/.test(item.align[i2])) {
37371               item.align[i2] = "right";
37372             } else if (/^ *:-+: *$/.test(item.align[i2])) {
37373               item.align[i2] = "center";
37374             } else if (/^ *:-+ *$/.test(item.align[i2])) {
37375               item.align[i2] = "left";
37376             } else {
37377               item.align[i2] = null;
37378             }
37379           }
37380           l = item.rows.length;
37381           for (i2 = 0; i2 < l; i2++) {
37382             item.rows[i2] = splitCells(item.rows[i2], item.header.length).map((c) => {
37383               return { text: c };
37384             });
37385           }
37386           l = item.header.length;
37387           for (j2 = 0; j2 < l; j2++) {
37388             item.header[j2].tokens = this.lexer.inline(item.header[j2].text);
37389           }
37390           l = item.rows.length;
37391           for (j2 = 0; j2 < l; j2++) {
37392             row = item.rows[j2];
37393             for (k = 0; k < row.length; k++) {
37394               row[k].tokens = this.lexer.inline(row[k].text);
37395             }
37396           }
37397           return item;
37398         }
37399       }
37400     }
37401     lheading(src) {
37402       const cap = this.rules.block.lheading.exec(src);
37403       if (cap) {
37404         return {
37405           type: "heading",
37406           raw: cap[0],
37407           depth: cap[2].charAt(0) === "=" ? 1 : 2,
37408           text: cap[1],
37409           tokens: this.lexer.inline(cap[1])
37410         };
37411       }
37412     }
37413     paragraph(src) {
37414       const cap = this.rules.block.paragraph.exec(src);
37415       if (cap) {
37416         const text2 = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
37417         return {
37418           type: "paragraph",
37419           raw: cap[0],
37420           text: text2,
37421           tokens: this.lexer.inline(text2)
37422         };
37423       }
37424     }
37425     text(src) {
37426       const cap = this.rules.block.text.exec(src);
37427       if (cap) {
37428         return {
37429           type: "text",
37430           raw: cap[0],
37431           text: cap[0],
37432           tokens: this.lexer.inline(cap[0])
37433         };
37434       }
37435     }
37436     escape(src) {
37437       const cap = this.rules.inline.escape.exec(src);
37438       if (cap) {
37439         return {
37440           type: "escape",
37441           raw: cap[0],
37442           text: escape4(cap[1])
37443         };
37444       }
37445     }
37446     tag(src) {
37447       const cap = this.rules.inline.tag.exec(src);
37448       if (cap) {
37449         if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
37450           this.lexer.state.inLink = true;
37451         } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
37452           this.lexer.state.inLink = false;
37453         }
37454         if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
37455           this.lexer.state.inRawBlock = true;
37456         } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
37457           this.lexer.state.inRawBlock = false;
37458         }
37459         return {
37460           type: this.options.sanitize ? "text" : "html",
37461           raw: cap[0],
37462           inLink: this.lexer.state.inLink,
37463           inRawBlock: this.lexer.state.inRawBlock,
37464           block: false,
37465           text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0]
37466         };
37467       }
37468     }
37469     link(src) {
37470       const cap = this.rules.inline.link.exec(src);
37471       if (cap) {
37472         const trimmedUrl = cap[2].trim();
37473         if (!this.options.pedantic && /^</.test(trimmedUrl)) {
37474           if (!/>$/.test(trimmedUrl)) {
37475             return;
37476           }
37477           const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
37478           if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
37479             return;
37480           }
37481         } else {
37482           const lastParenIndex = findClosingBracket(cap[2], "()");
37483           if (lastParenIndex > -1) {
37484             const start2 = cap[0].indexOf("!") === 0 ? 5 : 4;
37485             const linkLen = start2 + cap[1].length + lastParenIndex;
37486             cap[2] = cap[2].substring(0, lastParenIndex);
37487             cap[0] = cap[0].substring(0, linkLen).trim();
37488             cap[3] = "";
37489           }
37490         }
37491         let href = cap[2];
37492         let title = "";
37493         if (this.options.pedantic) {
37494           const link2 = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
37495           if (link2) {
37496             href = link2[1];
37497             title = link2[3];
37498           }
37499         } else {
37500           title = cap[3] ? cap[3].slice(1, -1) : "";
37501         }
37502         href = href.trim();
37503         if (/^</.test(href)) {
37504           if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
37505             href = href.slice(1);
37506           } else {
37507             href = href.slice(1, -1);
37508           }
37509         }
37510         return outputLink(cap, {
37511           href: href ? href.replace(this.rules.inline._escapes, "$1") : href,
37512           title: title ? title.replace(this.rules.inline._escapes, "$1") : title
37513         }, cap[0], this.lexer);
37514       }
37515     }
37516     reflink(src, links) {
37517       let cap;
37518       if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
37519         let link2 = (cap[2] || cap[1]).replace(/\s+/g, " ");
37520         link2 = links[link2.toLowerCase()];
37521         if (!link2) {
37522           const text2 = cap[0].charAt(0);
37523           return {
37524             type: "text",
37525             raw: text2,
37526             text: text2
37527           };
37528         }
37529         return outputLink(cap, link2, cap[0], this.lexer);
37530       }
37531     }
37532     emStrong(src, maskedSrc, prevChar = "") {
37533       let match = this.rules.inline.emStrong.lDelim.exec(src);
37534       if (!match)
37535         return;
37536       if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
37537         return;
37538       const nextChar = match[1] || match[2] || "";
37539       if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
37540         const lLength = match[0].length - 1;
37541         let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
37542         const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
37543         endReg.lastIndex = 0;
37544         maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
37545         while ((match = endReg.exec(maskedSrc)) != null) {
37546           rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
37547           if (!rDelim)
37548             continue;
37549           rLength = rDelim.length;
37550           if (match[3] || match[4]) {
37551             delimTotal += rLength;
37552             continue;
37553           } else if (match[5] || match[6]) {
37554             if (lLength % 3 && !((lLength + rLength) % 3)) {
37555               midDelimTotal += rLength;
37556               continue;
37557             }
37558           }
37559           delimTotal -= rLength;
37560           if (delimTotal > 0)
37561             continue;
37562           rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
37563           const raw = src.slice(0, lLength + match.index + rLength + 1);
37564           if (Math.min(lLength, rLength) % 2) {
37565             const text3 = raw.slice(1, -1);
37566             return {
37567               type: "em",
37568               raw,
37569               text: text3,
37570               tokens: this.lexer.inlineTokens(text3)
37571             };
37572           }
37573           const text2 = raw.slice(2, -2);
37574           return {
37575             type: "strong",
37576             raw,
37577             text: text2,
37578             tokens: this.lexer.inlineTokens(text2)
37579           };
37580         }
37581       }
37582     }
37583     codespan(src) {
37584       const cap = this.rules.inline.code.exec(src);
37585       if (cap) {
37586         let text2 = cap[2].replace(/\n/g, " ");
37587         const hasNonSpaceChars = /[^ ]/.test(text2);
37588         const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2);
37589         if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
37590           text2 = text2.substring(1, text2.length - 1);
37591         }
37592         text2 = escape4(text2, true);
37593         return {
37594           type: "codespan",
37595           raw: cap[0],
37596           text: text2
37597         };
37598       }
37599     }
37600     br(src) {
37601       const cap = this.rules.inline.br.exec(src);
37602       if (cap) {
37603         return {
37604           type: "br",
37605           raw: cap[0]
37606         };
37607       }
37608     }
37609     del(src) {
37610       const cap = this.rules.inline.del.exec(src);
37611       if (cap) {
37612         return {
37613           type: "del",
37614           raw: cap[0],
37615           text: cap[2],
37616           tokens: this.lexer.inlineTokens(cap[2])
37617         };
37618       }
37619     }
37620     autolink(src, mangle2) {
37621       const cap = this.rules.inline.autolink.exec(src);
37622       if (cap) {
37623         let text2, href;
37624         if (cap[2] === "@") {
37625           text2 = escape4(this.options.mangle ? mangle2(cap[1]) : cap[1]);
37626           href = "mailto:" + text2;
37627         } else {
37628           text2 = escape4(cap[1]);
37629           href = text2;
37630         }
37631         return {
37632           type: "link",
37633           raw: cap[0],
37634           text: text2,
37635           href,
37636           tokens: [
37637             {
37638               type: "text",
37639               raw: text2,
37640               text: text2
37641             }
37642           ]
37643         };
37644       }
37645     }
37646     url(src, mangle2) {
37647       let cap;
37648       if (cap = this.rules.inline.url.exec(src)) {
37649         let text2, href;
37650         if (cap[2] === "@") {
37651           text2 = escape4(this.options.mangle ? mangle2(cap[0]) : cap[0]);
37652           href = "mailto:" + text2;
37653         } else {
37654           let prevCapZero;
37655           do {
37656             prevCapZero = cap[0];
37657             cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
37658           } while (prevCapZero !== cap[0]);
37659           text2 = escape4(cap[0]);
37660           if (cap[1] === "www.") {
37661             href = "http://" + cap[0];
37662           } else {
37663             href = cap[0];
37664           }
37665         }
37666         return {
37667           type: "link",
37668           raw: cap[0],
37669           text: text2,
37670           href,
37671           tokens: [
37672             {
37673               type: "text",
37674               raw: text2,
37675               text: text2
37676             }
37677           ]
37678         };
37679       }
37680     }
37681     inlineText(src, smartypants2) {
37682       const cap = this.rules.inline.text.exec(src);
37683       if (cap) {
37684         let text2;
37685         if (this.lexer.state.inRawBlock) {
37686           text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape4(cap[0]) : cap[0];
37687         } else {
37688           text2 = escape4(this.options.smartypants ? smartypants2(cap[0]) : cap[0]);
37689         }
37690         return {
37691           type: "text",
37692           raw: cap[0],
37693           text: text2
37694         };
37695       }
37696     }
37697   };
37698   var block = {
37699     newline: /^(?: *(?:\n|$))+/,
37700     code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
37701     fences: /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
37702     hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
37703     heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
37704     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
37705     list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
37706     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|$))",
37707     def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
37708     table: noopTest,
37709     lheading: /^((?:(?!^bull ).|\n(?!\n|bull ))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
37710     // regex template, placeholders will be replaced according to different paragraph
37711     // interruption rules of commonmark and the original markdown spec:
37712     _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
37713     text: /^[^\n]+/
37714   };
37715   block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
37716   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
37717   block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex();
37718   block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
37719   block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex();
37720   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();
37721   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";
37722   block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
37723   block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
37724   block.lheading = edit(block.lheading).replace(/bull/g, block.bullet).getRegex();
37725   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();
37726   block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex();
37727   block.normal = { ...block };
37728   block.gfm = {
37729     ...block.normal,
37730     table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
37731     // Cells
37732   };
37733   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();
37734   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();
37735   block.pedantic = {
37736     ...block.normal,
37737     html: edit(
37738       `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
37739     ).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(),
37740     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
37741     heading: /^(#{1,6})(.*)(?:\n+|$)/,
37742     fences: noopTest,
37743     // fences not supported
37744     lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
37745     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()
37746   };
37747   var inline = {
37748     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
37749     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
37750     url: noopTest,
37751     tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
37752     // CDATA section
37753     link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
37754     reflink: /^!?\[(label)\]\[(ref)\]/,
37755     nolink: /^!?\[(ref)\](?:\[\])?/,
37756     reflinkSearch: "reflink|nolink(?!\\()",
37757     emStrong: {
37758       lDelim: /^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,
37759       //         (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.
37760       //         | Skip orphan inside strong      | Consume to delim | (1) #***              | (2) a***#, a***                    | (3) #***a, ***a                  | (4) ***#                 | (5) #***#                         | (6) a***a
37761       rDelimAst: /^[^_*]*?__[^_*]*?\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\*)[punct](\*+)(?=[\s]|$)|[^punct\s](\*+)(?!\*)(?=[punct\s]|$)|(?!\*)[punct\s](\*+)(?=[^punct\s])|[\s](\*+)(?!\*)(?=[punct])|(?!\*)[punct](\*+)(?!\*)(?=[punct])|[^punct\s](\*+)(?=[^punct\s])/,
37762       rDelimUnd: /^[^_*]*?\*\*[^_*]*?_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\s]|$)|[^punct\s](_+)(?!_)(?=[punct\s]|$)|(?!_)[punct\s](_+)(?=[^punct\s])|[\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/
37763       // ^- Not allowed for _
37764     },
37765     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
37766     br: /^( {2,}|\\)\n(?!\s*$)/,
37767     del: noopTest,
37768     text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
37769     punctuation: /^((?![*_])[\spunctuation])/
37770   };
37771   inline._punctuation = "\\p{P}$+<=>`^|~";
37772   inline.punctuation = edit(inline.punctuation, "u").replace(/punctuation/g, inline._punctuation).getRegex();
37773   inline.blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;
37774   inline.anyPunctuation = /\\[punct]/g;
37775   inline._escapes = /\\([punct])/g;
37776   inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex();
37777   inline.emStrong.lDelim = edit(inline.emStrong.lDelim, "u").replace(/punct/g, inline._punctuation).getRegex();
37778   inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "gu").replace(/punct/g, inline._punctuation).getRegex();
37779   inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "gu").replace(/punct/g, inline._punctuation).getRegex();
37780   inline.anyPunctuation = edit(inline.anyPunctuation, "gu").replace(/punct/g, inline._punctuation).getRegex();
37781   inline._escapes = edit(inline._escapes, "gu").replace(/punct/g, inline._punctuation).getRegex();
37782   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
37783   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])?)+(?![-_])/;
37784   inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex();
37785   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
37786   inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex();
37787   inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
37788   inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
37789   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
37790   inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex();
37791   inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex();
37792   inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex();
37793   inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex();
37794   inline.normal = { ...inline };
37795   inline.pedantic = {
37796     ...inline.normal,
37797     strong: {
37798       start: /^__|\*\*/,
37799       middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
37800       endAst: /\*\*(?!\*)/g,
37801       endUnd: /__(?!_)/g
37802     },
37803     em: {
37804       start: /^_|\*/,
37805       middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
37806       endAst: /\*(?!\*)/g,
37807       endUnd: /_(?!_)/g
37808     },
37809     link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(),
37810     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex()
37811   };
37812   inline.gfm = {
37813     ...inline.normal,
37814     escape: edit(inline.escape).replace("])", "~|])").getRegex(),
37815     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
37816     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
37817     _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
37818     del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
37819     text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
37820   };
37821   inline.gfm.url = edit(inline.gfm.url, "i").replace("email", inline.gfm._extended_email).getRegex();
37822   inline.breaks = {
37823     ...inline.gfm,
37824     br: edit(inline.br).replace("{2,}", "*").getRegex(),
37825     text: edit(inline.gfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
37826   };
37827   function smartypants(text2) {
37828     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");
37829   }
37830   function mangle(text2) {
37831     let out = "", i2, ch;
37832     const l = text2.length;
37833     for (i2 = 0; i2 < l; i2++) {
37834       ch = text2.charCodeAt(i2);
37835       if (Math.random() > 0.5) {
37836         ch = "x" + ch.toString(16);
37837       }
37838       out += "&#" + ch + ";";
37839     }
37840     return out;
37841   }
37842   var Lexer = class _Lexer {
37843     constructor(options2) {
37844       this.tokens = [];
37845       this.tokens.links = /* @__PURE__ */ Object.create(null);
37846       this.options = options2 || defaults;
37847       this.options.tokenizer = this.options.tokenizer || new Tokenizer();
37848       this.tokenizer = this.options.tokenizer;
37849       this.tokenizer.options = this.options;
37850       this.tokenizer.lexer = this;
37851       this.inlineQueue = [];
37852       this.state = {
37853         inLink: false,
37854         inRawBlock: false,
37855         top: true
37856       };
37857       const rules = {
37858         block: block.normal,
37859         inline: inline.normal
37860       };
37861       if (this.options.pedantic) {
37862         rules.block = block.pedantic;
37863         rules.inline = inline.pedantic;
37864       } else if (this.options.gfm) {
37865         rules.block = block.gfm;
37866         if (this.options.breaks) {
37867           rules.inline = inline.breaks;
37868         } else {
37869           rules.inline = inline.gfm;
37870         }
37871       }
37872       this.tokenizer.rules = rules;
37873     }
37874     /**
37875      * Expose Rules
37876      */
37877     static get rules() {
37878       return {
37879         block,
37880         inline
37881       };
37882     }
37883     /**
37884      * Static Lex Method
37885      */
37886     static lex(src, options2) {
37887       const lexer2 = new _Lexer(options2);
37888       return lexer2.lex(src);
37889     }
37890     /**
37891      * Static Lex Inline Method
37892      */
37893     static lexInline(src, options2) {
37894       const lexer2 = new _Lexer(options2);
37895       return lexer2.inlineTokens(src);
37896     }
37897     /**
37898      * Preprocessing
37899      */
37900     lex(src) {
37901       src = src.replace(/\r\n|\r/g, "\n");
37902       this.blockTokens(src, this.tokens);
37903       let next;
37904       while (next = this.inlineQueue.shift()) {
37905         this.inlineTokens(next.src, next.tokens);
37906       }
37907       return this.tokens;
37908     }
37909     /**
37910      * Lexing
37911      */
37912     blockTokens(src, tokens = []) {
37913       if (this.options.pedantic) {
37914         src = src.replace(/\t/g, "    ").replace(/^ +$/gm, "");
37915       } else {
37916         src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
37917           return leading + "    ".repeat(tabs.length);
37918         });
37919       }
37920       let token, lastToken, cutSrc, lastParagraphClipped;
37921       while (src) {
37922         if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => {
37923           if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
37924             src = src.substring(token.raw.length);
37925             tokens.push(token);
37926             return true;
37927           }
37928           return false;
37929         })) {
37930           continue;
37931         }
37932         if (token = this.tokenizer.space(src)) {
37933           src = src.substring(token.raw.length);
37934           if (token.raw.length === 1 && tokens.length > 0) {
37935             tokens[tokens.length - 1].raw += "\n";
37936           } else {
37937             tokens.push(token);
37938           }
37939           continue;
37940         }
37941         if (token = this.tokenizer.code(src)) {
37942           src = src.substring(token.raw.length);
37943           lastToken = tokens[tokens.length - 1];
37944           if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
37945             lastToken.raw += "\n" + token.raw;
37946             lastToken.text += "\n" + token.text;
37947             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
37948           } else {
37949             tokens.push(token);
37950           }
37951           continue;
37952         }
37953         if (token = this.tokenizer.fences(src)) {
37954           src = src.substring(token.raw.length);
37955           tokens.push(token);
37956           continue;
37957         }
37958         if (token = this.tokenizer.heading(src)) {
37959           src = src.substring(token.raw.length);
37960           tokens.push(token);
37961           continue;
37962         }
37963         if (token = this.tokenizer.hr(src)) {
37964           src = src.substring(token.raw.length);
37965           tokens.push(token);
37966           continue;
37967         }
37968         if (token = this.tokenizer.blockquote(src)) {
37969           src = src.substring(token.raw.length);
37970           tokens.push(token);
37971           continue;
37972         }
37973         if (token = this.tokenizer.list(src)) {
37974           src = src.substring(token.raw.length);
37975           tokens.push(token);
37976           continue;
37977         }
37978         if (token = this.tokenizer.html(src)) {
37979           src = src.substring(token.raw.length);
37980           tokens.push(token);
37981           continue;
37982         }
37983         if (token = this.tokenizer.def(src)) {
37984           src = src.substring(token.raw.length);
37985           lastToken = tokens[tokens.length - 1];
37986           if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
37987             lastToken.raw += "\n" + token.raw;
37988             lastToken.text += "\n" + token.raw;
37989             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
37990           } else if (!this.tokens.links[token.tag]) {
37991             this.tokens.links[token.tag] = {
37992               href: token.href,
37993               title: token.title
37994             };
37995           }
37996           continue;
37997         }
37998         if (token = this.tokenizer.table(src)) {
37999           src = src.substring(token.raw.length);
38000           tokens.push(token);
38001           continue;
38002         }
38003         if (token = this.tokenizer.lheading(src)) {
38004           src = src.substring(token.raw.length);
38005           tokens.push(token);
38006           continue;
38007         }
38008         cutSrc = src;
38009         if (this.options.extensions && this.options.extensions.startBlock) {
38010           let startIndex = Infinity;
38011           const tempSrc = src.slice(1);
38012           let tempStart;
38013           this.options.extensions.startBlock.forEach(function(getStartIndex) {
38014             tempStart = getStartIndex.call({ lexer: this }, tempSrc);
38015             if (typeof tempStart === "number" && tempStart >= 0) {
38016               startIndex = Math.min(startIndex, tempStart);
38017             }
38018           });
38019           if (startIndex < Infinity && startIndex >= 0) {
38020             cutSrc = src.substring(0, startIndex + 1);
38021           }
38022         }
38023         if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
38024           lastToken = tokens[tokens.length - 1];
38025           if (lastParagraphClipped && lastToken.type === "paragraph") {
38026             lastToken.raw += "\n" + token.raw;
38027             lastToken.text += "\n" + token.text;
38028             this.inlineQueue.pop();
38029             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
38030           } else {
38031             tokens.push(token);
38032           }
38033           lastParagraphClipped = cutSrc.length !== src.length;
38034           src = src.substring(token.raw.length);
38035           continue;
38036         }
38037         if (token = this.tokenizer.text(src)) {
38038           src = src.substring(token.raw.length);
38039           lastToken = tokens[tokens.length - 1];
38040           if (lastToken && lastToken.type === "text") {
38041             lastToken.raw += "\n" + token.raw;
38042             lastToken.text += "\n" + token.text;
38043             this.inlineQueue.pop();
38044             this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
38045           } else {
38046             tokens.push(token);
38047           }
38048           continue;
38049         }
38050         if (src) {
38051           const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
38052           if (this.options.silent) {
38053             console.error(errMsg);
38054             break;
38055           } else {
38056             throw new Error(errMsg);
38057           }
38058         }
38059       }
38060       this.state.top = true;
38061       return tokens;
38062     }
38063     inline(src, tokens = []) {
38064       this.inlineQueue.push({ src, tokens });
38065       return tokens;
38066     }
38067     /**
38068      * Lexing/Compiling
38069      */
38070     inlineTokens(src, tokens = []) {
38071       let token, lastToken, cutSrc;
38072       let maskedSrc = src;
38073       let match;
38074       let keepPrevChar, prevChar;
38075       if (this.tokens.links) {
38076         const links = Object.keys(this.tokens.links);
38077         if (links.length > 0) {
38078           while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
38079             if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
38080               maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
38081             }
38082           }
38083         }
38084       }
38085       while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
38086         maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
38087       }
38088       while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
38089         maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
38090       }
38091       while (src) {
38092         if (!keepPrevChar) {
38093           prevChar = "";
38094         }
38095         keepPrevChar = false;
38096         if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => {
38097           if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
38098             src = src.substring(token.raw.length);
38099             tokens.push(token);
38100             return true;
38101           }
38102           return false;
38103         })) {
38104           continue;
38105         }
38106         if (token = this.tokenizer.escape(src)) {
38107           src = src.substring(token.raw.length);
38108           tokens.push(token);
38109           continue;
38110         }
38111         if (token = this.tokenizer.tag(src)) {
38112           src = src.substring(token.raw.length);
38113           lastToken = tokens[tokens.length - 1];
38114           if (lastToken && token.type === "text" && lastToken.type === "text") {
38115             lastToken.raw += token.raw;
38116             lastToken.text += token.text;
38117           } else {
38118             tokens.push(token);
38119           }
38120           continue;
38121         }
38122         if (token = this.tokenizer.link(src)) {
38123           src = src.substring(token.raw.length);
38124           tokens.push(token);
38125           continue;
38126         }
38127         if (token = this.tokenizer.reflink(src, this.tokens.links)) {
38128           src = src.substring(token.raw.length);
38129           lastToken = tokens[tokens.length - 1];
38130           if (lastToken && token.type === "text" && lastToken.type === "text") {
38131             lastToken.raw += token.raw;
38132             lastToken.text += token.text;
38133           } else {
38134             tokens.push(token);
38135           }
38136           continue;
38137         }
38138         if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
38139           src = src.substring(token.raw.length);
38140           tokens.push(token);
38141           continue;
38142         }
38143         if (token = this.tokenizer.codespan(src)) {
38144           src = src.substring(token.raw.length);
38145           tokens.push(token);
38146           continue;
38147         }
38148         if (token = this.tokenizer.br(src)) {
38149           src = src.substring(token.raw.length);
38150           tokens.push(token);
38151           continue;
38152         }
38153         if (token = this.tokenizer.del(src)) {
38154           src = src.substring(token.raw.length);
38155           tokens.push(token);
38156           continue;
38157         }
38158         if (token = this.tokenizer.autolink(src, mangle)) {
38159           src = src.substring(token.raw.length);
38160           tokens.push(token);
38161           continue;
38162         }
38163         if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) {
38164           src = src.substring(token.raw.length);
38165           tokens.push(token);
38166           continue;
38167         }
38168         cutSrc = src;
38169         if (this.options.extensions && this.options.extensions.startInline) {
38170           let startIndex = Infinity;
38171           const tempSrc = src.slice(1);
38172           let tempStart;
38173           this.options.extensions.startInline.forEach(function(getStartIndex) {
38174             tempStart = getStartIndex.call({ lexer: this }, tempSrc);
38175             if (typeof tempStart === "number" && tempStart >= 0) {
38176               startIndex = Math.min(startIndex, tempStart);
38177             }
38178           });
38179           if (startIndex < Infinity && startIndex >= 0) {
38180             cutSrc = src.substring(0, startIndex + 1);
38181           }
38182         }
38183         if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
38184           src = src.substring(token.raw.length);
38185           if (token.raw.slice(-1) !== "_") {
38186             prevChar = token.raw.slice(-1);
38187           }
38188           keepPrevChar = true;
38189           lastToken = tokens[tokens.length - 1];
38190           if (lastToken && lastToken.type === "text") {
38191             lastToken.raw += token.raw;
38192             lastToken.text += token.text;
38193           } else {
38194             tokens.push(token);
38195           }
38196           continue;
38197         }
38198         if (src) {
38199           const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
38200           if (this.options.silent) {
38201             console.error(errMsg);
38202             break;
38203           } else {
38204             throw new Error(errMsg);
38205           }
38206         }
38207       }
38208       return tokens;
38209     }
38210   };
38211   var Renderer = class {
38212     constructor(options2) {
38213       this.options = options2 || defaults;
38214     }
38215     code(code, infostring, escaped) {
38216       const lang = (infostring || "").match(/\S*/)[0];
38217       if (this.options.highlight) {
38218         const out = this.options.highlight(code, lang);
38219         if (out != null && out !== code) {
38220           escaped = true;
38221           code = out;
38222         }
38223       }
38224       code = code.replace(/\n$/, "") + "\n";
38225       if (!lang) {
38226         return "<pre><code>" + (escaped ? code : escape4(code, true)) + "</code></pre>\n";
38227       }
38228       return '<pre><code class="' + this.options.langPrefix + escape4(lang) + '">' + (escaped ? code : escape4(code, true)) + "</code></pre>\n";
38229     }
38230     /**
38231      * @param {string} quote
38232      */
38233     blockquote(quote2) {
38234       return `<blockquote>
38235 ${quote2}</blockquote>
38236 `;
38237     }
38238     html(html2, block2) {
38239       return html2;
38240     }
38241     /**
38242      * @param {string} text
38243      * @param {string} level
38244      * @param {string} raw
38245      * @param {any} slugger
38246      */
38247     heading(text2, level, raw, slugger) {
38248       if (this.options.headerIds) {
38249         const id2 = this.options.headerPrefix + slugger.slug(raw);
38250         return `<h${level} id="${id2}">${text2}</h${level}>
38251 `;
38252       }
38253       return `<h${level}>${text2}</h${level}>
38254 `;
38255     }
38256     hr() {
38257       return this.options.xhtml ? "<hr/>\n" : "<hr>\n";
38258     }
38259     list(body, ordered, start2) {
38260       const type2 = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : "";
38261       return "<" + type2 + startatt + ">\n" + body + "</" + type2 + ">\n";
38262     }
38263     /**
38264      * @param {string} text
38265      */
38266     listitem(text2) {
38267       return `<li>${text2}</li>
38268 `;
38269     }
38270     checkbox(checked) {
38271       return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox"' + (this.options.xhtml ? " /" : "") + "> ";
38272     }
38273     /**
38274      * @param {string} text
38275      */
38276     paragraph(text2) {
38277       return `<p>${text2}</p>
38278 `;
38279     }
38280     /**
38281      * @param {string} header
38282      * @param {string} body
38283      */
38284     table(header, body) {
38285       if (body)
38286         body = `<tbody>${body}</tbody>`;
38287       return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
38288     }
38289     /**
38290      * @param {string} content
38291      */
38292     tablerow(content) {
38293       return `<tr>
38294 ${content}</tr>
38295 `;
38296     }
38297     tablecell(content, flags) {
38298       const type2 = flags.header ? "th" : "td";
38299       const tag = flags.align ? `<${type2} align="${flags.align}">` : `<${type2}>`;
38300       return tag + content + `</${type2}>
38301 `;
38302     }
38303     /**
38304      * span level renderer
38305      * @param {string} text
38306      */
38307     strong(text2) {
38308       return `<strong>${text2}</strong>`;
38309     }
38310     /**
38311      * @param {string} text
38312      */
38313     em(text2) {
38314       return `<em>${text2}</em>`;
38315     }
38316     /**
38317      * @param {string} text
38318      */
38319     codespan(text2) {
38320       return `<code>${text2}</code>`;
38321     }
38322     br() {
38323       return this.options.xhtml ? "<br/>" : "<br>";
38324     }
38325     /**
38326      * @param {string} text
38327      */
38328     del(text2) {
38329       return `<del>${text2}</del>`;
38330     }
38331     /**
38332      * @param {string} href
38333      * @param {string} title
38334      * @param {string} text
38335      */
38336     link(href, title, text2) {
38337       href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
38338       if (href === null) {
38339         return text2;
38340       }
38341       let out = '<a href="' + href + '"';
38342       if (title) {
38343         out += ' title="' + title + '"';
38344       }
38345       out += ">" + text2 + "</a>";
38346       return out;
38347     }
38348     /**
38349      * @param {string} href
38350      * @param {string} title
38351      * @param {string} text
38352      */
38353     image(href, title, text2) {
38354       href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
38355       if (href === null) {
38356         return text2;
38357       }
38358       let out = `<img src="${href}" alt="${text2}"`;
38359       if (title) {
38360         out += ` title="${title}"`;
38361       }
38362       out += this.options.xhtml ? "/>" : ">";
38363       return out;
38364     }
38365     text(text2) {
38366       return text2;
38367     }
38368   };
38369   var TextRenderer = class {
38370     // no need for block level renderers
38371     strong(text2) {
38372       return text2;
38373     }
38374     em(text2) {
38375       return text2;
38376     }
38377     codespan(text2) {
38378       return text2;
38379     }
38380     del(text2) {
38381       return text2;
38382     }
38383     html(text2) {
38384       return text2;
38385     }
38386     text(text2) {
38387       return text2;
38388     }
38389     link(href, title, text2) {
38390       return "" + text2;
38391     }
38392     image(href, title, text2) {
38393       return "" + text2;
38394     }
38395     br() {
38396       return "";
38397     }
38398   };
38399   var Slugger = class {
38400     constructor() {
38401       this.seen = {};
38402     }
38403     /**
38404      * @param {string} value
38405      */
38406     serialize(value) {
38407       return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-");
38408     }
38409     /**
38410      * Finds the next safe (unique) slug to use
38411      * @param {string} originalSlug
38412      * @param {boolean} isDryRun
38413      */
38414     getNextSafeSlug(originalSlug, isDryRun) {
38415       let slug = originalSlug;
38416       let occurenceAccumulator = 0;
38417       if (this.seen.hasOwnProperty(slug)) {
38418         occurenceAccumulator = this.seen[originalSlug];
38419         do {
38420           occurenceAccumulator++;
38421           slug = originalSlug + "-" + occurenceAccumulator;
38422         } while (this.seen.hasOwnProperty(slug));
38423       }
38424       if (!isDryRun) {
38425         this.seen[originalSlug] = occurenceAccumulator;
38426         this.seen[slug] = 0;
38427       }
38428       return slug;
38429     }
38430     /**
38431      * Convert string to unique id
38432      * @param {object} [options]
38433      * @param {boolean} [options.dryrun] Generates the next unique slug without
38434      * updating the internal accumulator.
38435      */
38436     slug(value, options2 = {}) {
38437       const slug = this.serialize(value);
38438       return this.getNextSafeSlug(slug, options2.dryrun);
38439     }
38440   };
38441   var Parser = class _Parser {
38442     constructor(options2) {
38443       this.options = options2 || defaults;
38444       this.options.renderer = this.options.renderer || new Renderer();
38445       this.renderer = this.options.renderer;
38446       this.renderer.options = this.options;
38447       this.textRenderer = new TextRenderer();
38448       this.slugger = new Slugger();
38449     }
38450     /**
38451      * Static Parse Method
38452      */
38453     static parse(tokens, options2) {
38454       const parser3 = new _Parser(options2);
38455       return parser3.parse(tokens);
38456     }
38457     /**
38458      * Static Parse Inline Method
38459      */
38460     static parseInline(tokens, options2) {
38461       const parser3 = new _Parser(options2);
38462       return parser3.parseInline(tokens);
38463     }
38464     /**
38465      * Parse Loop
38466      */
38467     parse(tokens, top = true) {
38468       let out = "", i2, j2, k, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret;
38469       const l = tokens.length;
38470       for (i2 = 0; i2 < l; i2++) {
38471         token = tokens[i2];
38472         if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
38473           ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
38474           if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) {
38475             out += ret || "";
38476             continue;
38477           }
38478         }
38479         switch (token.type) {
38480           case "space": {
38481             continue;
38482           }
38483           case "hr": {
38484             out += this.renderer.hr();
38485             continue;
38486           }
38487           case "heading": {
38488             out += this.renderer.heading(
38489               this.parseInline(token.tokens),
38490               token.depth,
38491               unescape3(this.parseInline(token.tokens, this.textRenderer)),
38492               this.slugger
38493             );
38494             continue;
38495           }
38496           case "code": {
38497             out += this.renderer.code(
38498               token.text,
38499               token.lang,
38500               token.escaped
38501             );
38502             continue;
38503           }
38504           case "table": {
38505             header = "";
38506             cell = "";
38507             l2 = token.header.length;
38508             for (j2 = 0; j2 < l2; j2++) {
38509               cell += this.renderer.tablecell(
38510                 this.parseInline(token.header[j2].tokens),
38511                 { header: true, align: token.align[j2] }
38512               );
38513             }
38514             header += this.renderer.tablerow(cell);
38515             body = "";
38516             l2 = token.rows.length;
38517             for (j2 = 0; j2 < l2; j2++) {
38518               row = token.rows[j2];
38519               cell = "";
38520               l3 = row.length;
38521               for (k = 0; k < l3; k++) {
38522                 cell += this.renderer.tablecell(
38523                   this.parseInline(row[k].tokens),
38524                   { header: false, align: token.align[k] }
38525                 );
38526               }
38527               body += this.renderer.tablerow(cell);
38528             }
38529             out += this.renderer.table(header, body);
38530             continue;
38531           }
38532           case "blockquote": {
38533             body = this.parse(token.tokens);
38534             out += this.renderer.blockquote(body);
38535             continue;
38536           }
38537           case "list": {
38538             ordered = token.ordered;
38539             start2 = token.start;
38540             loose = token.loose;
38541             l2 = token.items.length;
38542             body = "";
38543             for (j2 = 0; j2 < l2; j2++) {
38544               item = token.items[j2];
38545               checked = item.checked;
38546               task = item.task;
38547               itemBody = "";
38548               if (item.task) {
38549                 checkbox = this.renderer.checkbox(checked);
38550                 if (loose) {
38551                   if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
38552                     item.tokens[0].text = checkbox + " " + item.tokens[0].text;
38553                     if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
38554                       item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
38555                     }
38556                   } else {
38557                     item.tokens.unshift({
38558                       type: "text",
38559                       text: checkbox
38560                     });
38561                   }
38562                 } else {
38563                   itemBody += checkbox;
38564                 }
38565               }
38566               itemBody += this.parse(item.tokens, loose);
38567               body += this.renderer.listitem(itemBody, task, checked);
38568             }
38569             out += this.renderer.list(body, ordered, start2);
38570             continue;
38571           }
38572           case "html": {
38573             out += this.renderer.html(token.text, token.block);
38574             continue;
38575           }
38576           case "paragraph": {
38577             out += this.renderer.paragraph(this.parseInline(token.tokens));
38578             continue;
38579           }
38580           case "text": {
38581             body = token.tokens ? this.parseInline(token.tokens) : token.text;
38582             while (i2 + 1 < l && tokens[i2 + 1].type === "text") {
38583               token = tokens[++i2];
38584               body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text);
38585             }
38586             out += top ? this.renderer.paragraph(body) : body;
38587             continue;
38588           }
38589           default: {
38590             const errMsg = 'Token with "' + token.type + '" type was not found.';
38591             if (this.options.silent) {
38592               console.error(errMsg);
38593               return;
38594             } else {
38595               throw new Error(errMsg);
38596             }
38597           }
38598         }
38599       }
38600       return out;
38601     }
38602     /**
38603      * Parse Inline Tokens
38604      */
38605     parseInline(tokens, renderer) {
38606       renderer = renderer || this.renderer;
38607       let out = "", i2, token, ret;
38608       const l = tokens.length;
38609       for (i2 = 0; i2 < l; i2++) {
38610         token = tokens[i2];
38611         if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
38612           ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
38613           if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) {
38614             out += ret || "";
38615             continue;
38616           }
38617         }
38618         switch (token.type) {
38619           case "escape": {
38620             out += renderer.text(token.text);
38621             break;
38622           }
38623           case "html": {
38624             out += renderer.html(token.text);
38625             break;
38626           }
38627           case "link": {
38628             out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
38629             break;
38630           }
38631           case "image": {
38632             out += renderer.image(token.href, token.title, token.text);
38633             break;
38634           }
38635           case "strong": {
38636             out += renderer.strong(this.parseInline(token.tokens, renderer));
38637             break;
38638           }
38639           case "em": {
38640             out += renderer.em(this.parseInline(token.tokens, renderer));
38641             break;
38642           }
38643           case "codespan": {
38644             out += renderer.codespan(token.text);
38645             break;
38646           }
38647           case "br": {
38648             out += renderer.br();
38649             break;
38650           }
38651           case "del": {
38652             out += renderer.del(this.parseInline(token.tokens, renderer));
38653             break;
38654           }
38655           case "text": {
38656             out += renderer.text(token.text);
38657             break;
38658           }
38659           default: {
38660             const errMsg = 'Token with "' + token.type + '" type was not found.';
38661             if (this.options.silent) {
38662               console.error(errMsg);
38663               return;
38664             } else {
38665               throw new Error(errMsg);
38666             }
38667           }
38668         }
38669       }
38670       return out;
38671     }
38672   };
38673   var Hooks = class {
38674     constructor(options2) {
38675       this.options = options2 || defaults;
38676     }
38677     static passThroughHooks = /* @__PURE__ */ new Set([
38678       "preprocess",
38679       "postprocess"
38680     ]);
38681     /**
38682      * Process markdown before marked
38683      */
38684     preprocess(markdown) {
38685       return markdown;
38686     }
38687     /**
38688      * Process HTML after marked is finished
38689      */
38690     postprocess(html2) {
38691       return html2;
38692     }
38693   };
38694   var Marked = class {
38695     defaults = getDefaults();
38696     options = this.setOptions;
38697     parse = this.#parseMarkdown(Lexer.lex, Parser.parse);
38698     parseInline = this.#parseMarkdown(Lexer.lexInline, Parser.parseInline);
38699     Parser = Parser;
38700     parser = Parser.parse;
38701     Renderer = Renderer;
38702     TextRenderer = TextRenderer;
38703     Lexer = Lexer;
38704     lexer = Lexer.lex;
38705     Tokenizer = Tokenizer;
38706     Slugger = Slugger;
38707     Hooks = Hooks;
38708     constructor(...args) {
38709       this.use(...args);
38710     }
38711     walkTokens(tokens, callback) {
38712       let values = [];
38713       for (const token of tokens) {
38714         values = values.concat(callback.call(this, token));
38715         switch (token.type) {
38716           case "table": {
38717             for (const cell of token.header) {
38718               values = values.concat(this.walkTokens(cell.tokens, callback));
38719             }
38720             for (const row of token.rows) {
38721               for (const cell of row) {
38722                 values = values.concat(this.walkTokens(cell.tokens, callback));
38723               }
38724             }
38725             break;
38726           }
38727           case "list": {
38728             values = values.concat(this.walkTokens(token.items, callback));
38729             break;
38730           }
38731           default: {
38732             if (this.defaults.extensions && this.defaults.extensions.childTokens && this.defaults.extensions.childTokens[token.type]) {
38733               this.defaults.extensions.childTokens[token.type].forEach((childTokens) => {
38734                 values = values.concat(this.walkTokens(token[childTokens], callback));
38735               });
38736             } else if (token.tokens) {
38737               values = values.concat(this.walkTokens(token.tokens, callback));
38738             }
38739           }
38740         }
38741       }
38742       return values;
38743     }
38744     use(...args) {
38745       const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };
38746       args.forEach((pack) => {
38747         const opts = { ...pack };
38748         opts.async = this.defaults.async || opts.async || false;
38749         if (pack.extensions) {
38750           pack.extensions.forEach((ext) => {
38751             if (!ext.name) {
38752               throw new Error("extension name required");
38753             }
38754             if (ext.renderer) {
38755               const prevRenderer = extensions.renderers[ext.name];
38756               if (prevRenderer) {
38757                 extensions.renderers[ext.name] = function(...args2) {
38758                   let ret = ext.renderer.apply(this, args2);
38759                   if (ret === false) {
38760                     ret = prevRenderer.apply(this, args2);
38761                   }
38762                   return ret;
38763                 };
38764               } else {
38765                 extensions.renderers[ext.name] = ext.renderer;
38766               }
38767             }
38768             if (ext.tokenizer) {
38769               if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
38770                 throw new Error("extension level must be 'block' or 'inline'");
38771               }
38772               if (extensions[ext.level]) {
38773                 extensions[ext.level].unshift(ext.tokenizer);
38774               } else {
38775                 extensions[ext.level] = [ext.tokenizer];
38776               }
38777               if (ext.start) {
38778                 if (ext.level === "block") {
38779                   if (extensions.startBlock) {
38780                     extensions.startBlock.push(ext.start);
38781                   } else {
38782                     extensions.startBlock = [ext.start];
38783                   }
38784                 } else if (ext.level === "inline") {
38785                   if (extensions.startInline) {
38786                     extensions.startInline.push(ext.start);
38787                   } else {
38788                     extensions.startInline = [ext.start];
38789                   }
38790                 }
38791               }
38792             }
38793             if (ext.childTokens) {
38794               extensions.childTokens[ext.name] = ext.childTokens;
38795             }
38796           });
38797           opts.extensions = extensions;
38798         }
38799         if (pack.renderer) {
38800           const renderer = this.defaults.renderer || new Renderer(this.defaults);
38801           for (const prop in pack.renderer) {
38802             const prevRenderer = renderer[prop];
38803             renderer[prop] = (...args2) => {
38804               let ret = pack.renderer[prop].apply(renderer, args2);
38805               if (ret === false) {
38806                 ret = prevRenderer.apply(renderer, args2);
38807               }
38808               return ret;
38809             };
38810           }
38811           opts.renderer = renderer;
38812         }
38813         if (pack.tokenizer) {
38814           const tokenizer = this.defaults.tokenizer || new Tokenizer(this.defaults);
38815           for (const prop in pack.tokenizer) {
38816             const prevTokenizer = tokenizer[prop];
38817             tokenizer[prop] = (...args2) => {
38818               let ret = pack.tokenizer[prop].apply(tokenizer, args2);
38819               if (ret === false) {
38820                 ret = prevTokenizer.apply(tokenizer, args2);
38821               }
38822               return ret;
38823             };
38824           }
38825           opts.tokenizer = tokenizer;
38826         }
38827         if (pack.hooks) {
38828           const hooks = this.defaults.hooks || new Hooks();
38829           for (const prop in pack.hooks) {
38830             const prevHook = hooks[prop];
38831             if (Hooks.passThroughHooks.has(prop)) {
38832               hooks[prop] = (arg) => {
38833                 if (this.defaults.async) {
38834                   return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then((ret2) => {
38835                     return prevHook.call(hooks, ret2);
38836                   });
38837                 }
38838                 const ret = pack.hooks[prop].call(hooks, arg);
38839                 return prevHook.call(hooks, ret);
38840               };
38841             } else {
38842               hooks[prop] = (...args2) => {
38843                 let ret = pack.hooks[prop].apply(hooks, args2);
38844                 if (ret === false) {
38845                   ret = prevHook.apply(hooks, args2);
38846                 }
38847                 return ret;
38848               };
38849             }
38850           }
38851           opts.hooks = hooks;
38852         }
38853         if (pack.walkTokens) {
38854           const walkTokens2 = this.defaults.walkTokens;
38855           opts.walkTokens = function(token) {
38856             let values = [];
38857             values.push(pack.walkTokens.call(this, token));
38858             if (walkTokens2) {
38859               values = values.concat(walkTokens2.call(this, token));
38860             }
38861             return values;
38862           };
38863         }
38864         this.defaults = { ...this.defaults, ...opts };
38865       });
38866       return this;
38867     }
38868     setOptions(opt) {
38869       this.defaults = { ...this.defaults, ...opt };
38870       return this;
38871     }
38872     #parseMarkdown(lexer2, parser3) {
38873       return (src, opt, callback) => {
38874         if (typeof opt === "function") {
38875           callback = opt;
38876           opt = null;
38877         }
38878         const origOpt = { ...opt };
38879         opt = { ...this.defaults, ...origOpt };
38880         const throwError = this.#onError(opt.silent, opt.async, callback);
38881         if (typeof src === "undefined" || src === null) {
38882           return throwError(new Error("marked(): input parameter is undefined or null"));
38883         }
38884         if (typeof src !== "string") {
38885           return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"));
38886         }
38887         checkDeprecations(opt, callback);
38888         if (opt.hooks) {
38889           opt.hooks.options = opt;
38890         }
38891         if (callback) {
38892           const highlight = opt.highlight;
38893           let tokens;
38894           try {
38895             if (opt.hooks) {
38896               src = opt.hooks.preprocess(src);
38897             }
38898             tokens = lexer2(src, opt);
38899           } catch (e) {
38900             return throwError(e);
38901           }
38902           const done = (err) => {
38903             let out;
38904             if (!err) {
38905               try {
38906                 if (opt.walkTokens) {
38907                   this.walkTokens(tokens, opt.walkTokens);
38908                 }
38909                 out = parser3(tokens, opt);
38910                 if (opt.hooks) {
38911                   out = opt.hooks.postprocess(out);
38912                 }
38913               } catch (e) {
38914                 err = e;
38915               }
38916             }
38917             opt.highlight = highlight;
38918             return err ? throwError(err) : callback(null, out);
38919           };
38920           if (!highlight || highlight.length < 3) {
38921             return done();
38922           }
38923           delete opt.highlight;
38924           if (!tokens.length)
38925             return done();
38926           let pending = 0;
38927           this.walkTokens(tokens, (token) => {
38928             if (token.type === "code") {
38929               pending++;
38930               setTimeout(() => {
38931                 highlight(token.text, token.lang, (err, code) => {
38932                   if (err) {
38933                     return done(err);
38934                   }
38935                   if (code != null && code !== token.text) {
38936                     token.text = code;
38937                     token.escaped = true;
38938                   }
38939                   pending--;
38940                   if (pending === 0) {
38941                     done();
38942                   }
38943                 });
38944               }, 0);
38945             }
38946           });
38947           if (pending === 0) {
38948             done();
38949           }
38950           return;
38951         }
38952         if (opt.async) {
38953           return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser3(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError);
38954         }
38955         try {
38956           if (opt.hooks) {
38957             src = opt.hooks.preprocess(src);
38958           }
38959           const tokens = lexer2(src, opt);
38960           if (opt.walkTokens) {
38961             this.walkTokens(tokens, opt.walkTokens);
38962           }
38963           let html2 = parser3(tokens, opt);
38964           if (opt.hooks) {
38965             html2 = opt.hooks.postprocess(html2);
38966           }
38967           return html2;
38968         } catch (e) {
38969           return throwError(e);
38970         }
38971       };
38972     }
38973     #onError(silent, async, callback) {
38974       return (e) => {
38975         e.message += "\nPlease report this to https://github.com/markedjs/marked.";
38976         if (silent) {
38977           const msg = "<p>An error occurred:</p><pre>" + escape4(e.message + "", true) + "</pre>";
38978           if (async) {
38979             return Promise.resolve(msg);
38980           }
38981           if (callback) {
38982             callback(null, msg);
38983             return;
38984           }
38985           return msg;
38986         }
38987         if (async) {
38988           return Promise.reject(e);
38989         }
38990         if (callback) {
38991           callback(e);
38992           return;
38993         }
38994         throw e;
38995       };
38996     }
38997   };
38998   var markedInstance = new Marked(defaults);
38999   function marked(src, opt, callback) {
39000     return markedInstance.parse(src, opt, callback);
39001   }
39002   marked.options = marked.setOptions = function(opt) {
39003     markedInstance.setOptions(opt);
39004     marked.defaults = markedInstance.defaults;
39005     changeDefaults(marked.defaults);
39006     return marked;
39007   };
39008   marked.getDefaults = getDefaults;
39009   marked.defaults = defaults;
39010   marked.use = function(...args) {
39011     markedInstance.use(...args);
39012     marked.defaults = markedInstance.defaults;
39013     changeDefaults(marked.defaults);
39014     return marked;
39015   };
39016   marked.walkTokens = function(tokens, callback) {
39017     return markedInstance.walkTokens(tokens, callback);
39018   };
39019   marked.parseInline = markedInstance.parseInline;
39020   marked.Parser = Parser;
39021   marked.parser = Parser.parse;
39022   marked.Renderer = Renderer;
39023   marked.TextRenderer = TextRenderer;
39024   marked.Lexer = Lexer;
39025   marked.lexer = Lexer.lex;
39026   marked.Tokenizer = Tokenizer;
39027   marked.Slugger = Slugger;
39028   marked.Hooks = Hooks;
39029   marked.parse = marked;
39030   var options = marked.options;
39031   var setOptions = marked.setOptions;
39032   var use = marked.use;
39033   var walkTokens = marked.walkTokens;
39034   var parseInline = marked.parseInline;
39035   var parser2 = Parser.parse;
39036   var lexer = Lexer.lex;
39037
39038   // modules/services/osmose.js
39039   var tiler3 = utilTiler();
39040   var dispatch4 = dispatch_default("loaded");
39041   var _tileZoom3 = 14;
39042   var _osmoseUrlRoot = "https://osmose.openstreetmap.fr/api/0.3";
39043   var _osmoseData = { icons: {}, items: [] };
39044   var _cache3;
39045   function abortRequest3(controller) {
39046     if (controller) {
39047       controller.abort();
39048     }
39049   }
39050   function abortUnwantedRequests3(cache, tiles) {
39051     Object.keys(cache.inflightTile).forEach((k) => {
39052       let wanted = tiles.find((tile) => k === tile.id);
39053       if (!wanted) {
39054         abortRequest3(cache.inflightTile[k]);
39055         delete cache.inflightTile[k];
39056       }
39057     });
39058   }
39059   function encodeIssueRtree3(d) {
39060     return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39061   }
39062   function updateRtree3(item, replace) {
39063     _cache3.rtree.remove(item, (a, b) => a.data.id === b.data.id);
39064     if (replace) {
39065       _cache3.rtree.insert(item);
39066     }
39067   }
39068   function preventCoincident2(loc) {
39069     let coincident = false;
39070     do {
39071       let delta = coincident ? [1e-5, 0] : [0, 1e-5];
39072       loc = geoVecAdd(loc, delta);
39073       let bbox2 = geoExtent(loc).bbox();
39074       coincident = _cache3.rtree.search(bbox2).length;
39075     } while (coincident);
39076     return loc;
39077   }
39078   var osmose_default = {
39079     title: "osmose",
39080     init() {
39081       _mainFileFetcher.get("qa_data").then((d) => {
39082         _osmoseData = d.osmose;
39083         _osmoseData.items = Object.keys(d.osmose.icons).map((s) => s.split("-")[0]).reduce((unique, item) => unique.indexOf(item) !== -1 ? unique : [...unique, item], []);
39084       });
39085       if (!_cache3) {
39086         this.reset();
39087       }
39088       this.event = utilRebind(this, dispatch4, "on");
39089     },
39090     reset() {
39091       let _strings = {};
39092       let _colors = {};
39093       if (_cache3) {
39094         Object.values(_cache3.inflightTile).forEach(abortRequest3);
39095         _strings = _cache3.strings;
39096         _colors = _cache3.colors;
39097       }
39098       _cache3 = {
39099         data: {},
39100         loadedTile: {},
39101         inflightTile: {},
39102         inflightPost: {},
39103         closed: {},
39104         rtree: new import_rbush3.default(),
39105         strings: _strings,
39106         colors: _colors
39107       };
39108     },
39109     loadIssues(projection2) {
39110       let params = {
39111         // Tiles return a maximum # of issues
39112         // So we want to filter our request for only types iD supports
39113         item: _osmoseData.items
39114       };
39115       let tiles = tiler3.zoomExtent([_tileZoom3, _tileZoom3]).getTiles(projection2);
39116       abortUnwantedRequests3(_cache3, tiles);
39117       tiles.forEach((tile) => {
39118         if (_cache3.loadedTile[tile.id] || _cache3.inflightTile[tile.id])
39119           return;
39120         let [x, y, z] = tile.xyz;
39121         let url = `${_osmoseUrlRoot}/issues/${z}/${x}/${y}.geojson?` + utilQsString(params);
39122         let controller = new AbortController();
39123         _cache3.inflightTile[tile.id] = controller;
39124         json_default(url, { signal: controller.signal }).then((data) => {
39125           delete _cache3.inflightTile[tile.id];
39126           _cache3.loadedTile[tile.id] = true;
39127           if (data.features) {
39128             data.features.forEach((issue) => {
39129               const { item, class: cl, uuid: id2 } = issue.properties;
39130               const itemType = `${item}-${cl}`;
39131               if (itemType in _osmoseData.icons) {
39132                 let loc = issue.geometry.coordinates;
39133                 loc = preventCoincident2(loc);
39134                 let d = new QAItem(loc, this, itemType, id2, { item });
39135                 if (item === 8300 || item === 8360) {
39136                   d.elems = [];
39137                 }
39138                 _cache3.data[d.id] = d;
39139                 _cache3.rtree.insert(encodeIssueRtree3(d));
39140               }
39141             });
39142           }
39143           dispatch4.call("loaded");
39144         }).catch(() => {
39145           delete _cache3.inflightTile[tile.id];
39146           _cache3.loadedTile[tile.id] = true;
39147         });
39148       });
39149     },
39150     loadIssueDetail(issue) {
39151       if (issue.elems !== void 0) {
39152         return Promise.resolve(issue);
39153       }
39154       const url = `${_osmoseUrlRoot}/issue/${issue.id}?langs=${_mainLocalizer.localeCode()}`;
39155       const cacheDetails = (data) => {
39156         issue.elems = data.elems.map((e) => e.type.substring(0, 1) + e.id);
39157         issue.detail = data.subtitle ? marked(data.subtitle.auto) : "";
39158         this.replaceItem(issue);
39159       };
39160       return json_default(url).then(cacheDetails).then(() => issue);
39161     },
39162     loadStrings(locale2 = _mainLocalizer.localeCode()) {
39163       const items = Object.keys(_osmoseData.icons);
39164       if (locale2 in _cache3.strings && Object.keys(_cache3.strings[locale2]).length === items.length) {
39165         return Promise.resolve(_cache3.strings[locale2]);
39166       }
39167       if (!(locale2 in _cache3.strings)) {
39168         _cache3.strings[locale2] = {};
39169       }
39170       const allRequests = items.map((itemType) => {
39171         if (itemType in _cache3.strings[locale2])
39172           return null;
39173         const cacheData = (data) => {
39174           const [cat = { items: [] }] = data.categories;
39175           const [item2 = { class: [] }] = cat.items;
39176           const [cl2 = null] = item2.class;
39177           if (!cl2) {
39178             console.log(`Osmose strings request (${itemType}) had unexpected data`);
39179             return;
39180           }
39181           const { item: itemInt, color: color2 } = item2;
39182           if (/^#[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}/.test(color2)) {
39183             _cache3.colors[itemInt] = color2;
39184           }
39185           const { title, detail, fix, trap } = cl2;
39186           let issueStrings = {};
39187           if (title)
39188             issueStrings.title = title.auto;
39189           if (detail)
39190             issueStrings.detail = marked(detail.auto);
39191           if (trap)
39192             issueStrings.trap = marked(trap.auto);
39193           if (fix)
39194             issueStrings.fix = marked(fix.auto);
39195           _cache3.strings[locale2][itemType] = issueStrings;
39196         };
39197         const [item, cl] = itemType.split("-");
39198         const url = `${_osmoseUrlRoot}/items/${item}/class/${cl}?langs=${locale2}`;
39199         return json_default(url).then(cacheData);
39200       }).filter(Boolean);
39201       return Promise.all(allRequests).then(() => _cache3.strings[locale2]);
39202     },
39203     getStrings(itemType, locale2 = _mainLocalizer.localeCode()) {
39204       return locale2 in _cache3.strings ? _cache3.strings[locale2][itemType] : {};
39205     },
39206     getColor(itemType) {
39207       return itemType in _cache3.colors ? _cache3.colors[itemType] : "#FFFFFF";
39208     },
39209     postUpdate(issue, callback) {
39210       if (_cache3.inflightPost[issue.id]) {
39211         return callback({ message: "Issue update already inflight", status: -2 }, issue);
39212       }
39213       const url = `${_osmoseUrlRoot}/issue/${issue.id}/${issue.newStatus}`;
39214       const controller = new AbortController();
39215       const after = () => {
39216         delete _cache3.inflightPost[issue.id];
39217         this.removeItem(issue);
39218         if (issue.newStatus === "done") {
39219           if (!(issue.item in _cache3.closed)) {
39220             _cache3.closed[issue.item] = 0;
39221           }
39222           _cache3.closed[issue.item] += 1;
39223         }
39224         if (callback)
39225           callback(null, issue);
39226       };
39227       _cache3.inflightPost[issue.id] = controller;
39228       fetch(url, { signal: controller.signal }).then(after).catch((err) => {
39229         delete _cache3.inflightPost[issue.id];
39230         if (callback)
39231           callback(err.message);
39232       });
39233     },
39234     // Get all cached QAItems covering the viewport
39235     getItems(projection2) {
39236       const viewport = projection2.clipExtent();
39237       const min3 = [viewport[0][0], viewport[1][1]];
39238       const max3 = [viewport[1][0], viewport[0][1]];
39239       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
39240       return _cache3.rtree.search(bbox2).map((d) => d.data);
39241     },
39242     // Get a QAItem from cache
39243     // NOTE: Don't change method name until UI v3 is merged
39244     getError(id2) {
39245       return _cache3.data[id2];
39246     },
39247     // get the name of the icon to display for this item
39248     getIcon(itemType) {
39249       return _osmoseData.icons[itemType];
39250     },
39251     // Replace a single QAItem in the cache
39252     replaceItem(item) {
39253       if (!(item instanceof QAItem) || !item.id)
39254         return;
39255       _cache3.data[item.id] = item;
39256       updateRtree3(encodeIssueRtree3(item), true);
39257       return item;
39258     },
39259     // Remove a single QAItem from the cache
39260     removeItem(item) {
39261       if (!(item instanceof QAItem) || !item.id)
39262         return;
39263       delete _cache3.data[item.id];
39264       updateRtree3(encodeIssueRtree3(item), false);
39265     },
39266     // Used to populate `closed:osmose:*` changeset tags
39267     getClosedCounts() {
39268       return _cache3.closed;
39269     },
39270     itemURL(item) {
39271       return `https://osmose.openstreetmap.fr/en/error/${item.id}`;
39272     }
39273   };
39274
39275   // modules/services/mapillary.js
39276   var import_pbf = __toESM(require_pbf());
39277   var import_rbush4 = __toESM(require_rbush_min());
39278   var import_vector_tile = __toESM(require_vector_tile());
39279   var accessToken = "MLY|4100327730013843|5bb78b81720791946a9a7b956c57b7cf";
39280   var apiUrl = "https://graph.mapillary.com/";
39281   var baseTileUrl = "https://tiles.mapillary.com/maps/vtp";
39282   var mapFeatureTileUrl = `${baseTileUrl}/mly_map_feature_point/2/{z}/{x}/{y}?access_token=${accessToken}`;
39283   var tileUrl = `${baseTileUrl}/mly1_public/2/{z}/{x}/{y}?access_token=${accessToken}`;
39284   var trafficSignTileUrl = `${baseTileUrl}/mly_map_feature_traffic_sign/2/{z}/{x}/{y}?access_token=${accessToken}`;
39285   var viewercss = "mapillary-js/mapillary.css";
39286   var viewerjs = "mapillary-js/mapillary.js";
39287   var minZoom = 14;
39288   var dispatch5 = dispatch_default("change", "loadedImages", "loadedSigns", "loadedMapFeatures", "bearingChanged", "imageChanged");
39289   var _loadViewerPromise;
39290   var _mlyActiveImage;
39291   var _mlyCache;
39292   var _mlyFallback = false;
39293   var _mlyHighlightedDetection;
39294   var _mlyShowFeatureDetections = false;
39295   var _mlyShowSignDetections = false;
39296   var _mlyViewer;
39297   var _mlyViewerFilter = ["all"];
39298   function loadTiles(which, url, maxZoom2, projection2) {
39299     const tiler8 = utilTiler().zoomExtent([minZoom, maxZoom2]).skipNullIsland(true);
39300     const tiles = tiler8.getTiles(projection2);
39301     tiles.forEach(function(tile) {
39302       loadTile(which, url, tile);
39303     });
39304   }
39305   function loadTile(which, url, tile) {
39306     const cache = _mlyCache.requests;
39307     const tileId = `${tile.id}-${which}`;
39308     if (cache.loaded[tileId] || cache.inflight[tileId])
39309       return;
39310     const controller = new AbortController();
39311     cache.inflight[tileId] = controller;
39312     const requestUrl = url.replace("{x}", tile.xyz[0]).replace("{y}", tile.xyz[1]).replace("{z}", tile.xyz[2]);
39313     fetch(requestUrl, { signal: controller.signal }).then(function(response) {
39314       if (!response.ok) {
39315         throw new Error(response.status + " " + response.statusText);
39316       }
39317       cache.loaded[tileId] = true;
39318       delete cache.inflight[tileId];
39319       return response.arrayBuffer();
39320     }).then(function(data) {
39321       if (!data) {
39322         throw new Error("No Data");
39323       }
39324       loadTileDataToCache(data, tile, which);
39325       if (which === "images") {
39326         dispatch5.call("loadedImages");
39327       } else if (which === "signs") {
39328         dispatch5.call("loadedSigns");
39329       } else if (which === "points") {
39330         dispatch5.call("loadedMapFeatures");
39331       }
39332     }).catch(function() {
39333       cache.loaded[tileId] = true;
39334       delete cache.inflight[tileId];
39335     });
39336   }
39337   function loadTileDataToCache(data, tile, which) {
39338     const vectorTile = new import_vector_tile.VectorTile(new import_pbf.default(data));
39339     let features, cache, layer, i2, feature3, loc, d;
39340     if (vectorTile.layers.hasOwnProperty("image")) {
39341       features = [];
39342       cache = _mlyCache.images;
39343       layer = vectorTile.layers.image;
39344       for (i2 = 0; i2 < layer.length; i2++) {
39345         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
39346         loc = feature3.geometry.coordinates;
39347         d = {
39348           loc,
39349           captured_at: feature3.properties.captured_at,
39350           ca: feature3.properties.compass_angle,
39351           id: feature3.properties.id,
39352           is_pano: feature3.properties.is_pano,
39353           sequence_id: feature3.properties.sequence_id
39354         };
39355         cache.forImageId[d.id] = d;
39356         features.push({
39357           minX: loc[0],
39358           minY: loc[1],
39359           maxX: loc[0],
39360           maxY: loc[1],
39361           data: d
39362         });
39363       }
39364       if (cache.rtree) {
39365         cache.rtree.load(features);
39366       }
39367     }
39368     if (vectorTile.layers.hasOwnProperty("sequence")) {
39369       features = [];
39370       cache = _mlyCache.sequences;
39371       layer = vectorTile.layers.sequence;
39372       for (i2 = 0; i2 < layer.length; i2++) {
39373         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
39374         if (cache.lineString[feature3.properties.id]) {
39375           cache.lineString[feature3.properties.id].push(feature3);
39376         } else {
39377           cache.lineString[feature3.properties.id] = [feature3];
39378         }
39379       }
39380     }
39381     if (vectorTile.layers.hasOwnProperty("point")) {
39382       features = [];
39383       cache = _mlyCache[which];
39384       layer = vectorTile.layers.point;
39385       for (i2 = 0; i2 < layer.length; i2++) {
39386         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
39387         loc = feature3.geometry.coordinates;
39388         d = {
39389           loc,
39390           id: feature3.properties.id,
39391           first_seen_at: feature3.properties.first_seen_at,
39392           last_seen_at: feature3.properties.last_seen_at,
39393           value: feature3.properties.value
39394         };
39395         features.push({
39396           minX: loc[0],
39397           minY: loc[1],
39398           maxX: loc[0],
39399           maxY: loc[1],
39400           data: d
39401         });
39402       }
39403       if (cache.rtree) {
39404         cache.rtree.load(features);
39405       }
39406     }
39407     if (vectorTile.layers.hasOwnProperty("traffic_sign")) {
39408       features = [];
39409       cache = _mlyCache[which];
39410       layer = vectorTile.layers.traffic_sign;
39411       for (i2 = 0; i2 < layer.length; i2++) {
39412         feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
39413         loc = feature3.geometry.coordinates;
39414         d = {
39415           loc,
39416           id: feature3.properties.id,
39417           first_seen_at: feature3.properties.first_seen_at,
39418           last_seen_at: feature3.properties.last_seen_at,
39419           value: feature3.properties.value
39420         };
39421         features.push({
39422           minX: loc[0],
39423           minY: loc[1],
39424           maxX: loc[0],
39425           maxY: loc[1],
39426           data: d
39427         });
39428       }
39429       if (cache.rtree) {
39430         cache.rtree.load(features);
39431       }
39432     }
39433   }
39434   function loadData(url) {
39435     return fetch(url).then(function(response) {
39436       if (!response.ok) {
39437         throw new Error(response.status + " " + response.statusText);
39438       }
39439       return response.json();
39440     }).then(function(result) {
39441       if (!result) {
39442         return [];
39443       }
39444       return result.data || [];
39445     });
39446   }
39447   function partitionViewport(projection2) {
39448     const z = geoScaleToZoom(projection2.scale());
39449     const z2 = Math.ceil(z * 2) / 2 + 2.5;
39450     const tiler8 = utilTiler().zoomExtent([z2, z2]);
39451     return tiler8.getTiles(projection2).map(function(tile) {
39452       return tile.extent;
39453     });
39454   }
39455   function searchLimited(limit, projection2, rtree) {
39456     limit = limit || 5;
39457     return partitionViewport(projection2).reduce(function(result, extent) {
39458       const found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) {
39459         return d.data;
39460       });
39461       return found.length ? result.concat(found) : result;
39462     }, []);
39463   }
39464   var mapillary_default = {
39465     // Initialize Mapillary
39466     init: function() {
39467       if (!_mlyCache) {
39468         this.reset();
39469       }
39470       this.event = utilRebind(this, dispatch5, "on");
39471     },
39472     // Reset cache and state
39473     reset: function() {
39474       if (_mlyCache) {
39475         Object.values(_mlyCache.requests.inflight).forEach(function(request3) {
39476           request3.abort();
39477         });
39478       }
39479       _mlyCache = {
39480         images: { rtree: new import_rbush4.default(), forImageId: {} },
39481         image_detections: { forImageId: {} },
39482         signs: { rtree: new import_rbush4.default() },
39483         points: { rtree: new import_rbush4.default() },
39484         sequences: { rtree: new import_rbush4.default(), lineString: {} },
39485         requests: { loaded: {}, inflight: {} }
39486       };
39487       _mlyActiveImage = null;
39488     },
39489     // Get visible images
39490     images: function(projection2) {
39491       const limit = 5;
39492       return searchLimited(limit, projection2, _mlyCache.images.rtree);
39493     },
39494     // Get visible traffic signs
39495     signs: function(projection2) {
39496       const limit = 5;
39497       return searchLimited(limit, projection2, _mlyCache.signs.rtree);
39498     },
39499     // Get visible map (point) features
39500     mapFeatures: function(projection2) {
39501       const limit = 5;
39502       return searchLimited(limit, projection2, _mlyCache.points.rtree);
39503     },
39504     // Get cached image by id
39505     cachedImage: function(imageId) {
39506       return _mlyCache.images.forImageId[imageId];
39507     },
39508     // Get visible sequences
39509     sequences: function(projection2) {
39510       const viewport = projection2.clipExtent();
39511       const min3 = [viewport[0][0], viewport[1][1]];
39512       const max3 = [viewport[1][0], viewport[0][1]];
39513       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
39514       const sequenceIds = {};
39515       let lineStrings = [];
39516       _mlyCache.images.rtree.search(bbox2).forEach(function(d) {
39517         if (d.data.sequence_id) {
39518           sequenceIds[d.data.sequence_id] = true;
39519         }
39520       });
39521       Object.keys(sequenceIds).forEach(function(sequenceId) {
39522         if (_mlyCache.sequences.lineString[sequenceId]) {
39523           lineStrings = lineStrings.concat(_mlyCache.sequences.lineString[sequenceId]);
39524         }
39525       });
39526       return lineStrings;
39527     },
39528     // Load images in the visible area
39529     loadImages: function(projection2) {
39530       loadTiles("images", tileUrl, 14, projection2);
39531     },
39532     // Load traffic signs in the visible area
39533     loadSigns: function(projection2) {
39534       loadTiles("signs", trafficSignTileUrl, 14, projection2);
39535     },
39536     // Load map (point) features in the visible area
39537     loadMapFeatures: function(projection2) {
39538       loadTiles("points", mapFeatureTileUrl, 14, projection2);
39539     },
39540     // Return a promise that resolves when the image viewer (Mapillary JS) library has finished loading
39541     ensureViewerLoaded: function(context) {
39542       if (_loadViewerPromise)
39543         return _loadViewerPromise;
39544       const wrap2 = context.container().select(".photoviewer").selectAll(".mly-wrapper").data([0]);
39545       wrap2.enter().append("div").attr("id", "ideditor-mly").attr("class", "photo-wrapper mly-wrapper").classed("hide", true);
39546       const that = this;
39547       _loadViewerPromise = new Promise((resolve, reject) => {
39548         let loadedCount = 0;
39549         function loaded() {
39550           loadedCount += 1;
39551           if (loadedCount === 2)
39552             resolve();
39553         }
39554         const head = select_default2("head");
39555         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() {
39556           reject();
39557         });
39558         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() {
39559           reject();
39560         });
39561       }).catch(function() {
39562         _loadViewerPromise = null;
39563       }).then(function() {
39564         that.initViewer(context);
39565       });
39566       return _loadViewerPromise;
39567     },
39568     // Load traffic sign image sprites
39569     loadSignResources: function(context) {
39570       context.ui().svgDefs.addSprites(
39571         ["mapillary-sprite"],
39572         false
39573         /* don't override colors */
39574       );
39575       return this;
39576     },
39577     // Load map (point) feature image sprites
39578     loadObjectResources: function(context) {
39579       context.ui().svgDefs.addSprites(
39580         ["mapillary-object-sprite"],
39581         false
39582         /* don't override colors */
39583       );
39584       return this;
39585     },
39586     // Remove previous detections in image viewer
39587     resetTags: function() {
39588       if (_mlyViewer && !_mlyFallback) {
39589         _mlyViewer.getComponent("tag").removeAll();
39590       }
39591     },
39592     // Show map feature detections in image viewer
39593     showFeatureDetections: function(value) {
39594       _mlyShowFeatureDetections = value;
39595       if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
39596         this.resetTags();
39597       }
39598     },
39599     // Show traffic sign detections in image viewer
39600     showSignDetections: function(value) {
39601       _mlyShowSignDetections = value;
39602       if (!_mlyShowFeatureDetections && !_mlyShowSignDetections) {
39603         this.resetTags();
39604       }
39605     },
39606     // Apply filter to image viewer
39607     filterViewer: function(context) {
39608       const showsPano = context.photos().showsPanoramic();
39609       const showsFlat = context.photos().showsFlat();
39610       const fromDate = context.photos().fromDate();
39611       const toDate = context.photos().toDate();
39612       const filter2 = ["all"];
39613       if (!showsPano)
39614         filter2.push(["!=", "cameraType", "spherical"]);
39615       if (!showsFlat && showsPano)
39616         filter2.push(["==", "pano", true]);
39617       if (fromDate) {
39618         filter2.push([">=", "capturedAt", new Date(fromDate).getTime()]);
39619       }
39620       if (toDate) {
39621         filter2.push([">=", "capturedAt", new Date(toDate).getTime()]);
39622       }
39623       if (_mlyViewer) {
39624         _mlyViewer.setFilter(filter2);
39625       }
39626       _mlyViewerFilter = filter2;
39627       return filter2;
39628     },
39629     // Make the image viewer visible
39630     showViewer: function(context) {
39631       const wrap2 = context.container().select(".photoviewer").classed("hide", false);
39632       const isHidden = wrap2.selectAll(".photo-wrapper.mly-wrapper.hide").size();
39633       if (isHidden && _mlyViewer) {
39634         wrap2.selectAll(".photo-wrapper:not(.mly-wrapper)").classed("hide", true);
39635         wrap2.selectAll(".photo-wrapper.mly-wrapper").classed("hide", false);
39636         _mlyViewer.resize();
39637       }
39638       return this;
39639     },
39640     // Hide the image viewer and resets map markers
39641     hideViewer: function(context) {
39642       _mlyActiveImage = null;
39643       if (!_mlyFallback && _mlyViewer) {
39644         _mlyViewer.getComponent("sequence").stop();
39645       }
39646       const viewer = context.container().select(".photoviewer");
39647       if (!viewer.empty())
39648         viewer.datum(null);
39649       viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
39650       this.updateUrlImage(null);
39651       dispatch5.call("imageChanged");
39652       dispatch5.call("loadedMapFeatures");
39653       dispatch5.call("loadedSigns");
39654       return this.setStyles(context, null);
39655     },
39656     // Update the URL with current image id
39657     updateUrlImage: function(imageId) {
39658       if (!window.mocha) {
39659         const hash = utilStringQs(window.location.hash);
39660         if (imageId) {
39661           hash.photo = "mapillary/" + imageId;
39662         } else {
39663           delete hash.photo;
39664         }
39665         window.location.replace("#" + utilQsString(hash, true));
39666       }
39667     },
39668     // Highlight the detection in the viewer that is related to the clicked map feature
39669     highlightDetection: function(detection) {
39670       if (detection) {
39671         _mlyHighlightedDetection = detection.id;
39672       }
39673       return this;
39674     },
39675     // Initialize image viewer (Mapillar JS)
39676     initViewer: function(context) {
39677       const that = this;
39678       if (!window.mapillary)
39679         return;
39680       const opts = {
39681         accessToken,
39682         component: {
39683           cover: false,
39684           keyboard: false,
39685           tag: true
39686         },
39687         container: "ideditor-mly"
39688       };
39689       if (!mapillary.isSupported() && mapillary.isFallbackSupported()) {
39690         _mlyFallback = true;
39691         opts.component = {
39692           cover: false,
39693           direction: false,
39694           imagePlane: false,
39695           keyboard: false,
39696           mouse: false,
39697           sequence: false,
39698           tag: false,
39699           image: true,
39700           // fallback
39701           navigation: true
39702           // fallback
39703         };
39704       }
39705       _mlyViewer = new mapillary.Viewer(opts);
39706       _mlyViewer.on("image", imageChanged);
39707       _mlyViewer.on("bearing", bearingChanged);
39708       if (_mlyViewerFilter) {
39709         _mlyViewer.setFilter(_mlyViewerFilter);
39710       }
39711       context.ui().photoviewer.on("resize.mapillary", function() {
39712         if (_mlyViewer)
39713           _mlyViewer.resize();
39714       });
39715       function imageChanged(node) {
39716         that.resetTags();
39717         const image = node.image;
39718         that.setActiveImage(image);
39719         that.setStyles(context, null);
39720         const loc = [image.originalLngLat.lng, image.originalLngLat.lat];
39721         context.map().centerEase(loc);
39722         that.updateUrlImage(image.id);
39723         if (_mlyShowFeatureDetections || _mlyShowSignDetections) {
39724           that.updateDetections(image.id, `${apiUrl}/${image.id}/detections?access_token=${accessToken}&fields=id,image,geometry,value`);
39725         }
39726         dispatch5.call("imageChanged");
39727       }
39728       function bearingChanged(e) {
39729         dispatch5.call("bearingChanged", void 0, e);
39730       }
39731     },
39732     // Move to an image
39733     selectImage: function(context, imageId) {
39734       if (_mlyViewer && imageId) {
39735         _mlyViewer.moveTo(imageId).catch(function(e) {
39736           console.error("mly3", e);
39737         });
39738       }
39739       return this;
39740     },
39741     // Return the currently displayed image
39742     getActiveImage: function() {
39743       return _mlyActiveImage;
39744     },
39745     // Return a list of detection objects for the given id
39746     getDetections: function(id2) {
39747       return loadData(`${apiUrl}/${id2}/detections?access_token=${accessToken}&fields=id,value,image`);
39748     },
39749     // Set the currently visible image
39750     setActiveImage: function(image) {
39751       if (image) {
39752         _mlyActiveImage = {
39753           ca: image.originalCompassAngle,
39754           id: image.id,
39755           loc: [image.originalLngLat.lng, image.originalLngLat.lat],
39756           is_pano: image.cameraType === "spherical",
39757           sequence_id: image.sequenceId
39758         };
39759       } else {
39760         _mlyActiveImage = null;
39761       }
39762     },
39763     // Update the currently highlighted sequence and selected bubble.
39764     setStyles: function(context, hovered) {
39765       const hoveredImageId = hovered && hovered.id;
39766       const hoveredSequenceId = hovered && hovered.sequence_id;
39767       const selectedSequenceId = _mlyActiveImage && _mlyActiveImage.sequence_id;
39768       context.container().selectAll(".layer-mapillary .viewfield-group").classed("highlighted", function(d) {
39769         return d.sequence_id === selectedSequenceId || d.id === hoveredImageId;
39770       }).classed("hovered", function(d) {
39771         return d.id === hoveredImageId;
39772       });
39773       context.container().selectAll(".layer-mapillary .sequence").classed("highlighted", function(d) {
39774         return d.properties.id === hoveredSequenceId;
39775       }).classed("currentView", function(d) {
39776         return d.properties.id === selectedSequenceId;
39777       });
39778       return this;
39779     },
39780     // Get detections for the current image and shows them in the image viewer
39781     updateDetections: function(imageId, url) {
39782       if (!_mlyViewer || _mlyFallback)
39783         return;
39784       if (!imageId)
39785         return;
39786       const cache = _mlyCache.image_detections;
39787       if (cache.forImageId[imageId]) {
39788         showDetections(_mlyCache.image_detections.forImageId[imageId]);
39789       } else {
39790         loadData(url).then((detections) => {
39791           detections.forEach(function(detection) {
39792             if (!cache.forImageId[imageId]) {
39793               cache.forImageId[imageId] = [];
39794             }
39795             cache.forImageId[imageId].push({
39796               geometry: detection.geometry,
39797               id: detection.id,
39798               image_id: imageId,
39799               value: detection.value
39800             });
39801           });
39802           showDetections(_mlyCache.image_detections.forImageId[imageId] || []);
39803         });
39804       }
39805       function showDetections(detections) {
39806         const tagComponent = _mlyViewer.getComponent("tag");
39807         detections.forEach(function(data) {
39808           const tag = makeTag(data);
39809           if (tag) {
39810             tagComponent.add([tag]);
39811           }
39812         });
39813       }
39814       function makeTag(data) {
39815         const valueParts = data.value.split("--");
39816         if (!valueParts.length)
39817           return;
39818         let tag;
39819         let text2;
39820         let color2 = 16777215;
39821         if (_mlyHighlightedDetection === data.id) {
39822           color2 = 16776960;
39823           text2 = valueParts[1];
39824           if (text2 === "flat" || text2 === "discrete" || text2 === "sign") {
39825             text2 = valueParts[2];
39826           }
39827           text2 = text2.replace(/-/g, " ");
39828           text2 = text2.charAt(0).toUpperCase() + text2.slice(1);
39829           _mlyHighlightedDetection = null;
39830         }
39831         var decodedGeometry = window.atob(data.geometry);
39832         var uintArray = new Uint8Array(decodedGeometry.length);
39833         for (var i2 = 0; i2 < decodedGeometry.length; i2++) {
39834           uintArray[i2] = decodedGeometry.charCodeAt(i2);
39835         }
39836         const tile = new import_vector_tile.VectorTile(new import_pbf.default(uintArray.buffer));
39837         const layer = tile.layers["mpy-or"];
39838         const geometries = layer.feature(0).loadGeometry();
39839         const polygon2 = geometries.map((ring) => ring.map((point2) => [point2.x / layer.extent, point2.y / layer.extent]));
39840         tag = new mapillary.OutlineTag(
39841           data.id,
39842           new mapillary.PolygonGeometry(polygon2[0]),
39843           {
39844             text: text2,
39845             textColor: color2,
39846             lineColor: color2,
39847             lineWidth: 2,
39848             fillColor: color2,
39849             fillOpacity: 0.3
39850           }
39851         );
39852         return tag;
39853       }
39854     },
39855     // Return the current cache
39856     cache: function() {
39857       return _mlyCache;
39858     }
39859   };
39860
39861   // modules/core/validation/models.js
39862   function validationIssue(attrs) {
39863     this.type = attrs.type;
39864     this.subtype = attrs.subtype;
39865     this.severity = attrs.severity;
39866     this.message = attrs.message;
39867     this.reference = attrs.reference;
39868     this.entityIds = attrs.entityIds;
39869     this.loc = attrs.loc;
39870     this.data = attrs.data;
39871     this.dynamicFixes = attrs.dynamicFixes;
39872     this.hash = attrs.hash;
39873     this.id = generateID.apply(this);
39874     this.key = generateKey.apply(this);
39875     this.autoFix = null;
39876     function generateID() {
39877       var parts = [this.type];
39878       if (this.hash) {
39879         parts.push(this.hash);
39880       }
39881       if (this.subtype) {
39882         parts.push(this.subtype);
39883       }
39884       if (this.entityIds) {
39885         var entityKeys = this.entityIds.slice().sort();
39886         parts.push.apply(parts, entityKeys);
39887       }
39888       return parts.join(":");
39889     }
39890     function generateKey() {
39891       return this.id + ":" + Date.now().toString();
39892     }
39893     this.extent = function(resolver) {
39894       if (this.loc) {
39895         return geoExtent(this.loc);
39896       }
39897       if (this.entityIds && this.entityIds.length) {
39898         return this.entityIds.reduce(function(extent, entityId) {
39899           return extent.extend(resolver.entity(entityId).extent(resolver));
39900         }, geoExtent());
39901       }
39902       return null;
39903     };
39904     this.fixes = function(context) {
39905       var fixes = this.dynamicFixes ? this.dynamicFixes(context) : [];
39906       var issue = this;
39907       if (issue.severity === "warning") {
39908         fixes.push(new validationIssueFix({
39909           title: _t.append("issues.fix.ignore_issue.title"),
39910           icon: "iD-icon-close",
39911           onClick: function() {
39912             context.validator().ignoreIssue(this.issue.id);
39913           }
39914         }));
39915       }
39916       fixes.forEach(function(fix) {
39917         fix.id = fix.title.stringId;
39918         fix.issue = issue;
39919         if (fix.autoArgs) {
39920           issue.autoFix = fix;
39921         }
39922       });
39923       return fixes;
39924     };
39925   }
39926   function validationIssueFix(attrs) {
39927     this.title = attrs.title;
39928     this.onClick = attrs.onClick;
39929     this.disabledReason = attrs.disabledReason;
39930     this.icon = attrs.icon;
39931     this.entityIds = attrs.entityIds || [];
39932     this.autoArgs = attrs.autoArgs;
39933     this.issue = null;
39934   }
39935
39936   // modules/services/maprules.js
39937   var buildRuleChecks = function() {
39938     return {
39939       equals: function(equals) {
39940         return function(tags) {
39941           return Object.keys(equals).every(function(k) {
39942             return equals[k] === tags[k];
39943           });
39944         };
39945       },
39946       notEquals: function(notEquals) {
39947         return function(tags) {
39948           return Object.keys(notEquals).some(function(k) {
39949             return notEquals[k] !== tags[k];
39950           });
39951         };
39952       },
39953       absence: function(absence) {
39954         return function(tags) {
39955           return Object.keys(tags).indexOf(absence) === -1;
39956         };
39957       },
39958       presence: function(presence) {
39959         return function(tags) {
39960           return Object.keys(tags).indexOf(presence) > -1;
39961         };
39962       },
39963       greaterThan: function(greaterThan) {
39964         var key = Object.keys(greaterThan)[0];
39965         var value = greaterThan[key];
39966         return function(tags) {
39967           return tags[key] > value;
39968         };
39969       },
39970       greaterThanEqual: function(greaterThanEqual) {
39971         var key = Object.keys(greaterThanEqual)[0];
39972         var value = greaterThanEqual[key];
39973         return function(tags) {
39974           return tags[key] >= value;
39975         };
39976       },
39977       lessThan: function(lessThan) {
39978         var key = Object.keys(lessThan)[0];
39979         var value = lessThan[key];
39980         return function(tags) {
39981           return tags[key] < value;
39982         };
39983       },
39984       lessThanEqual: function(lessThanEqual) {
39985         var key = Object.keys(lessThanEqual)[0];
39986         var value = lessThanEqual[key];
39987         return function(tags) {
39988           return tags[key] <= value;
39989         };
39990       },
39991       positiveRegex: function(positiveRegex) {
39992         var tagKey = Object.keys(positiveRegex)[0];
39993         var expression = positiveRegex[tagKey].join("|");
39994         var regex = new RegExp(expression);
39995         return function(tags) {
39996           return regex.test(tags[tagKey]);
39997         };
39998       },
39999       negativeRegex: function(negativeRegex) {
40000         var tagKey = Object.keys(negativeRegex)[0];
40001         var expression = negativeRegex[tagKey].join("|");
40002         var regex = new RegExp(expression);
40003         return function(tags) {
40004           return !regex.test(tags[tagKey]);
40005         };
40006       }
40007     };
40008   };
40009   var buildLineKeys = function() {
40010     return {
40011       highway: {
40012         rest_area: true,
40013         services: true
40014       },
40015       railway: {
40016         roundhouse: true,
40017         station: true,
40018         traverser: true,
40019         turntable: true,
40020         wash: true
40021       }
40022     };
40023   };
40024   var maprules_default = {
40025     init: function() {
40026       this._ruleChecks = buildRuleChecks();
40027       this._validationRules = [];
40028       this._areaKeys = osmAreaKeys;
40029       this._lineKeys = buildLineKeys();
40030     },
40031     // list of rules only relevant to tag checks...
40032     filterRuleChecks: function(selector) {
40033       var _ruleChecks = this._ruleChecks;
40034       return Object.keys(selector).reduce(function(rules, key) {
40035         if (["geometry", "error", "warning"].indexOf(key) === -1) {
40036           rules.push(_ruleChecks[key](selector[key]));
40037         }
40038         return rules;
40039       }, []);
40040     },
40041     // builds tagMap from mapcss-parse selector object...
40042     buildTagMap: function(selector) {
40043       var getRegexValues = function(regexes) {
40044         return regexes.map(function(regex) {
40045           return regex.replace(/\$|\^/g, "");
40046         });
40047       };
40048       var tagMap = Object.keys(selector).reduce(function(expectedTags, key) {
40049         var values;
40050         var isRegex = /regex/gi.test(key);
40051         var isEqual4 = /equals/gi.test(key);
40052         if (isRegex || isEqual4) {
40053           Object.keys(selector[key]).forEach(function(selectorKey) {
40054             values = isEqual4 ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
40055             if (expectedTags.hasOwnProperty(selectorKey)) {
40056               values = values.concat(expectedTags[selectorKey]);
40057             }
40058             expectedTags[selectorKey] = values;
40059           });
40060         } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
40061           var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
40062           values = [selector[key][tagKey]];
40063           if (expectedTags.hasOwnProperty(tagKey)) {
40064             values = values.concat(expectedTags[tagKey]);
40065           }
40066           expectedTags[tagKey] = values;
40067         }
40068         return expectedTags;
40069       }, {});
40070       return tagMap;
40071     },
40072     // inspired by osmWay#isArea()
40073     inferGeometry: function(tagMap) {
40074       var _lineKeys = this._lineKeys;
40075       var _areaKeys = this._areaKeys;
40076       var keyValueDoesNotImplyArea = function(key2) {
40077         return utilArrayIntersection(tagMap[key2], Object.keys(_areaKeys[key2])).length > 0;
40078       };
40079       var keyValueImpliesLine = function(key2) {
40080         return utilArrayIntersection(tagMap[key2], Object.keys(_lineKeys[key2])).length > 0;
40081       };
40082       if (tagMap.hasOwnProperty("area")) {
40083         if (tagMap.area.indexOf("yes") > -1) {
40084           return "area";
40085         }
40086         if (tagMap.area.indexOf("no") > -1) {
40087           return "line";
40088         }
40089       }
40090       for (var key in tagMap) {
40091         if (key in _areaKeys && !keyValueDoesNotImplyArea(key)) {
40092           return "area";
40093         }
40094         if (key in _lineKeys && keyValueImpliesLine(key)) {
40095           return "area";
40096         }
40097       }
40098       return "line";
40099     },
40100     // adds from mapcss-parse selector check...
40101     addRule: function(selector) {
40102       var rule = {
40103         // checks relevant to mapcss-selector
40104         checks: this.filterRuleChecks(selector),
40105         // true if all conditions for a tag error are true..
40106         matches: function(entity) {
40107           return this.checks.every(function(check) {
40108             return check(entity.tags);
40109           });
40110         },
40111         // borrowed from Way#isArea()
40112         inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
40113         geometryMatches: function(entity, graph) {
40114           if (entity.type === "node" || entity.type === "relation") {
40115             return selector.geometry === entity.type;
40116           } else if (entity.type === "way") {
40117             return this.inferredGeometry === entity.geometry(graph);
40118           }
40119         },
40120         // when geometries match and tag matches are present, return a warning...
40121         findIssues: function(entity, graph, issues) {
40122           if (this.geometryMatches(entity, graph) && this.matches(entity)) {
40123             var severity = Object.keys(selector).indexOf("error") > -1 ? "error" : "warning";
40124             var message = selector[severity];
40125             issues.push(new validationIssue({
40126               type: "maprules",
40127               severity,
40128               message: function() {
40129                 return message;
40130               },
40131               entityIds: [entity.id]
40132             }));
40133           }
40134         }
40135       };
40136       this._validationRules.push(rule);
40137     },
40138     clearRules: function() {
40139       this._validationRules = [];
40140     },
40141     // returns validationRules...
40142     validationRules: function() {
40143       return this._validationRules;
40144     },
40145     // returns ruleChecks
40146     ruleChecks: function() {
40147       return this._ruleChecks;
40148     }
40149   };
40150
40151   // modules/services/nominatim.js
40152   var import_rbush7 = __toESM(require_rbush_min());
40153
40154   // modules/core/difference.js
40155   var import_fast_deep_equal3 = __toESM(require_fast_deep_equal());
40156   function coreDifference(base, head) {
40157     var _changes = {};
40158     var _didChange = {};
40159     var _diff = {};
40160     function checkEntityID(id2) {
40161       var h = head.entities[id2];
40162       var b = base.entities[id2];
40163       if (h === b)
40164         return;
40165       if (_changes[id2])
40166         return;
40167       if (!h && b) {
40168         _changes[id2] = { base: b, head: h };
40169         _didChange.deletion = true;
40170         return;
40171       }
40172       if (h && !b) {
40173         _changes[id2] = { base: b, head: h };
40174         _didChange.addition = true;
40175         return;
40176       }
40177       if (h && b) {
40178         if (h.members && b.members && !(0, import_fast_deep_equal3.default)(h.members, b.members)) {
40179           _changes[id2] = { base: b, head: h };
40180           _didChange.geometry = true;
40181           _didChange.properties = true;
40182           return;
40183         }
40184         if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
40185           _changes[id2] = { base: b, head: h };
40186           _didChange.geometry = true;
40187         }
40188         if (h.nodes && b.nodes && !(0, import_fast_deep_equal3.default)(h.nodes, b.nodes)) {
40189           _changes[id2] = { base: b, head: h };
40190           _didChange.geometry = true;
40191         }
40192         if (h.tags && b.tags && !(0, import_fast_deep_equal3.default)(h.tags, b.tags)) {
40193           _changes[id2] = { base: b, head: h };
40194           _didChange.properties = true;
40195         }
40196       }
40197     }
40198     function load() {
40199       var ids = utilArrayUniq(Object.keys(head.entities).concat(Object.keys(base.entities)));
40200       for (var i2 = 0; i2 < ids.length; i2++) {
40201         checkEntityID(ids[i2]);
40202       }
40203     }
40204     load();
40205     _diff.length = function length() {
40206       return Object.keys(_changes).length;
40207     };
40208     _diff.changes = function changes() {
40209       return _changes;
40210     };
40211     _diff.didChange = _didChange;
40212     _diff.extantIDs = function extantIDs(includeRelMembers) {
40213       var result = /* @__PURE__ */ new Set();
40214       Object.keys(_changes).forEach(function(id2) {
40215         if (_changes[id2].head) {
40216           result.add(id2);
40217         }
40218         var h = _changes[id2].head;
40219         var b = _changes[id2].base;
40220         var entity = h || b;
40221         if (includeRelMembers && entity.type === "relation") {
40222           var mh = h ? h.members.map(function(m) {
40223             return m.id;
40224           }) : [];
40225           var mb = b ? b.members.map(function(m) {
40226             return m.id;
40227           }) : [];
40228           utilArrayUnion(mh, mb).forEach(function(memberID) {
40229             if (head.hasEntity(memberID)) {
40230               result.add(memberID);
40231             }
40232           });
40233         }
40234       });
40235       return Array.from(result);
40236     };
40237     _diff.modified = function modified() {
40238       var result = [];
40239       Object.values(_changes).forEach(function(change) {
40240         if (change.base && change.head) {
40241           result.push(change.head);
40242         }
40243       });
40244       return result;
40245     };
40246     _diff.created = function created() {
40247       var result = [];
40248       Object.values(_changes).forEach(function(change) {
40249         if (!change.base && change.head) {
40250           result.push(change.head);
40251         }
40252       });
40253       return result;
40254     };
40255     _diff.deleted = function deleted() {
40256       var result = [];
40257       Object.values(_changes).forEach(function(change) {
40258         if (change.base && !change.head) {
40259           result.push(change.base);
40260         }
40261       });
40262       return result;
40263     };
40264     _diff.summary = function summary() {
40265       var relevant = {};
40266       var keys2 = Object.keys(_changes);
40267       for (var i2 = 0; i2 < keys2.length; i2++) {
40268         var change = _changes[keys2[i2]];
40269         if (change.head && change.head.geometry(head) !== "vertex") {
40270           addEntity(change.head, head, change.base ? "modified" : "created");
40271         } else if (change.base && change.base.geometry(base) !== "vertex") {
40272           addEntity(change.base, base, "deleted");
40273         } else if (change.base && change.head) {
40274           var moved = !(0, import_fast_deep_equal3.default)(change.base.loc, change.head.loc);
40275           var retagged = !(0, import_fast_deep_equal3.default)(change.base.tags, change.head.tags);
40276           if (moved) {
40277             addParents(change.head);
40278           }
40279           if (retagged || moved && change.head.hasInterestingTags()) {
40280             addEntity(change.head, head, "modified");
40281           }
40282         } else if (change.head && change.head.hasInterestingTags()) {
40283           addEntity(change.head, head, "created");
40284         } else if (change.base && change.base.hasInterestingTags()) {
40285           addEntity(change.base, base, "deleted");
40286         }
40287       }
40288       return Object.values(relevant);
40289       function addEntity(entity, graph, changeType) {
40290         relevant[entity.id] = {
40291           entity,
40292           graph,
40293           changeType
40294         };
40295       }
40296       function addParents(entity) {
40297         var parents = head.parentWays(entity);
40298         for (var j2 = parents.length - 1; j2 >= 0; j2--) {
40299           var parent = parents[j2];
40300           if (!(parent.id in relevant)) {
40301             addEntity(parent, head, "modified");
40302           }
40303         }
40304       }
40305     };
40306     _diff.complete = function complete(extent) {
40307       var result = {};
40308       var id2, change;
40309       for (id2 in _changes) {
40310         change = _changes[id2];
40311         var h = change.head;
40312         var b = change.base;
40313         var entity = h || b;
40314         var i2;
40315         if (extent && (!h || !h.intersects(extent, head)) && (!b || !b.intersects(extent, base))) {
40316           continue;
40317         }
40318         result[id2] = h;
40319         if (entity.type === "way") {
40320           var nh = h ? h.nodes : [];
40321           var nb = b ? b.nodes : [];
40322           var diff;
40323           diff = utilArrayDifference(nh, nb);
40324           for (i2 = 0; i2 < diff.length; i2++) {
40325             result[diff[i2]] = head.hasEntity(diff[i2]);
40326           }
40327           diff = utilArrayDifference(nb, nh);
40328           for (i2 = 0; i2 < diff.length; i2++) {
40329             result[diff[i2]] = head.hasEntity(diff[i2]);
40330           }
40331         }
40332         if (entity.type === "relation" && entity.isMultipolygon()) {
40333           var mh = h ? h.members.map(function(m) {
40334             return m.id;
40335           }) : [];
40336           var mb = b ? b.members.map(function(m) {
40337             return m.id;
40338           }) : [];
40339           var ids = utilArrayUnion(mh, mb);
40340           for (i2 = 0; i2 < ids.length; i2++) {
40341             var member = head.hasEntity(ids[i2]);
40342             if (!member)
40343               continue;
40344             if (extent && !member.intersects(extent, head))
40345               continue;
40346             result[ids[i2]] = member;
40347           }
40348         }
40349         addParents(head.parentWays(entity), result);
40350         addParents(head.parentRelations(entity), result);
40351       }
40352       return result;
40353       function addParents(parents, result2) {
40354         for (var i3 = 0; i3 < parents.length; i3++) {
40355           var parent = parents[i3];
40356           if (parent.id in result2)
40357             continue;
40358           result2[parent.id] = parent;
40359           addParents(head.parentRelations(parent), result2);
40360         }
40361       }
40362     };
40363     return _diff;
40364   }
40365
40366   // modules/core/tree.js
40367   var import_rbush5 = __toESM(require_rbush_min());
40368   function coreTree(head) {
40369     var _rtree = new import_rbush5.default();
40370     var _bboxes = {};
40371     var _segmentsRTree = new import_rbush5.default();
40372     var _segmentsBBoxes = {};
40373     var _segmentsByWayId = {};
40374     var tree = {};
40375     function entityBBox(entity) {
40376       var bbox2 = entity.extent(head).bbox();
40377       bbox2.id = entity.id;
40378       _bboxes[entity.id] = bbox2;
40379       return bbox2;
40380     }
40381     function segmentBBox(segment) {
40382       var extent = segment.extent(head);
40383       if (!extent)
40384         return null;
40385       var bbox2 = extent.bbox();
40386       bbox2.segment = segment;
40387       _segmentsBBoxes[segment.id] = bbox2;
40388       return bbox2;
40389     }
40390     function removeEntity(entity) {
40391       _rtree.remove(_bboxes[entity.id]);
40392       delete _bboxes[entity.id];
40393       if (_segmentsByWayId[entity.id]) {
40394         _segmentsByWayId[entity.id].forEach(function(segment) {
40395           _segmentsRTree.remove(_segmentsBBoxes[segment.id]);
40396           delete _segmentsBBoxes[segment.id];
40397         });
40398         delete _segmentsByWayId[entity.id];
40399       }
40400     }
40401     function loadEntities(entities) {
40402       _rtree.load(entities.map(entityBBox));
40403       var segments = [];
40404       entities.forEach(function(entity) {
40405         if (entity.segments) {
40406           var entitySegments = entity.segments(head);
40407           _segmentsByWayId[entity.id] = entitySegments;
40408           segments = segments.concat(entitySegments);
40409         }
40410       });
40411       if (segments.length)
40412         _segmentsRTree.load(segments.map(segmentBBox).filter(Boolean));
40413     }
40414     function updateParents(entity, insertions, memo) {
40415       head.parentWays(entity).forEach(function(way) {
40416         if (_bboxes[way.id]) {
40417           removeEntity(way);
40418           insertions[way.id] = way;
40419         }
40420         updateParents(way, insertions, memo);
40421       });
40422       head.parentRelations(entity).forEach(function(relation) {
40423         if (memo[entity.id])
40424           return;
40425         memo[entity.id] = true;
40426         if (_bboxes[relation.id]) {
40427           removeEntity(relation);
40428           insertions[relation.id] = relation;
40429         }
40430         updateParents(relation, insertions, memo);
40431       });
40432     }
40433     tree.rebase = function(entities, force) {
40434       var insertions = {};
40435       for (var i2 = 0; i2 < entities.length; i2++) {
40436         var entity = entities[i2];
40437         if (!entity.visible)
40438           continue;
40439         if (head.entities.hasOwnProperty(entity.id) || _bboxes[entity.id]) {
40440           if (!force) {
40441             continue;
40442           } else if (_bboxes[entity.id]) {
40443             removeEntity(entity);
40444           }
40445         }
40446         insertions[entity.id] = entity;
40447         updateParents(entity, insertions, {});
40448       }
40449       loadEntities(Object.values(insertions));
40450       return tree;
40451     };
40452     function updateToGraph(graph) {
40453       if (graph === head)
40454         return;
40455       var diff = coreDifference(head, graph);
40456       head = graph;
40457       var changed = diff.didChange;
40458       if (!changed.addition && !changed.deletion && !changed.geometry)
40459         return;
40460       var insertions = {};
40461       if (changed.deletion) {
40462         diff.deleted().forEach(function(entity) {
40463           removeEntity(entity);
40464         });
40465       }
40466       if (changed.geometry) {
40467         diff.modified().forEach(function(entity) {
40468           removeEntity(entity);
40469           insertions[entity.id] = entity;
40470           updateParents(entity, insertions, {});
40471         });
40472       }
40473       if (changed.addition) {
40474         diff.created().forEach(function(entity) {
40475           insertions[entity.id] = entity;
40476         });
40477       }
40478       loadEntities(Object.values(insertions));
40479     }
40480     tree.intersects = function(extent, graph) {
40481       updateToGraph(graph);
40482       return _rtree.search(extent.bbox()).map(function(bbox2) {
40483         return graph.entity(bbox2.id);
40484       });
40485     };
40486     tree.waySegments = function(extent, graph) {
40487       updateToGraph(graph);
40488       return _segmentsRTree.search(extent.bbox()).map(function(bbox2) {
40489         return bbox2.segment;
40490       });
40491     };
40492     return tree;
40493   }
40494
40495   // modules/svg/icon.js
40496   function svgIcon(name, svgklass, useklass) {
40497     return function drawIcon(selection2) {
40498       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);
40499     };
40500   }
40501
40502   // modules/ui/modal.js
40503   function uiModal(selection2, blocking) {
40504     let keybinding = utilKeybinding("modal");
40505     let previous = selection2.select("div.modal");
40506     let animate = previous.empty();
40507     previous.transition().duration(200).style("opacity", 0).remove();
40508     let shaded = selection2.append("div").attr("class", "shaded").style("opacity", 0);
40509     shaded.close = () => {
40510       shaded.transition().duration(200).style("opacity", 0).remove();
40511       modal.transition().duration(200).style("top", "0px");
40512       select_default2(document).call(keybinding.unbind);
40513     };
40514     let modal = shaded.append("div").attr("class", "modal fillL");
40515     modal.append("input").attr("class", "keytrap keytrap-first").on("focus.keytrap", moveFocusToLast);
40516     if (!blocking) {
40517       shaded.on("click.remove-modal", (d3_event) => {
40518         if (d3_event.target === this) {
40519           shaded.close();
40520         }
40521       });
40522       modal.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", shaded.close).call(svgIcon("#iD-icon-close"));
40523       keybinding.on("\u232B", shaded.close).on("\u238B", shaded.close);
40524       select_default2(document).call(keybinding);
40525     }
40526     modal.append("div").attr("class", "content");
40527     modal.append("input").attr("class", "keytrap keytrap-last").on("focus.keytrap", moveFocusToFirst);
40528     if (animate) {
40529       shaded.transition().style("opacity", 1);
40530     } else {
40531       shaded.style("opacity", 1);
40532     }
40533     return shaded;
40534     function moveFocusToFirst() {
40535       let node = modal.select("a, button, input:not(.keytrap), select, textarea").node();
40536       if (node) {
40537         node.focus();
40538       } else {
40539         select_default2(this).node().blur();
40540       }
40541     }
40542     function moveFocusToLast() {
40543       let nodes = modal.selectAll("a, button, input:not(.keytrap), select, textarea").nodes();
40544       if (nodes.length) {
40545         nodes[nodes.length - 1].focus();
40546       } else {
40547         select_default2(this).node().blur();
40548       }
40549     }
40550   }
40551
40552   // modules/ui/loading.js
40553   function uiLoading(context) {
40554     let _modalSelection = select_default2(null);
40555     let _message = "";
40556     let _blocking = false;
40557     let loading = (selection2) => {
40558       _modalSelection = uiModal(selection2, _blocking);
40559       let loadertext = _modalSelection.select(".content").classed("loading-modal", true).append("div").attr("class", "modal-section fillL");
40560       loadertext.append("img").attr("class", "loader").attr("src", context.imagePath("loader-white.gif"));
40561       loadertext.append("h3").html(_message);
40562       _modalSelection.select("button.close").attr("class", "hide");
40563       return loading;
40564     };
40565     loading.message = function(val) {
40566       if (!arguments.length)
40567         return _message;
40568       _message = val;
40569       return loading;
40570     };
40571     loading.blocking = function(val) {
40572       if (!arguments.length)
40573         return _blocking;
40574       _blocking = val;
40575       return loading;
40576     };
40577     loading.close = () => {
40578       _modalSelection.remove();
40579     };
40580     loading.isShown = () => {
40581       return _modalSelection && !_modalSelection.empty() && _modalSelection.node().parentNode;
40582     };
40583     return loading;
40584   }
40585
40586   // modules/core/history.js
40587   function coreHistory(context) {
40588     var dispatch10 = dispatch_default("reset", "change", "merge", "restore", "undone", "redone", "storage_error");
40589     var lock = utilSessionMutex("lock");
40590     var _hasUnresolvedRestorableChanges = lock.lock() && !!corePreferences(getKey("saved_history"));
40591     var duration = 150;
40592     var _imageryUsed = [];
40593     var _photoOverlaysUsed = [];
40594     var _checkpoints = {};
40595     var _pausedGraph;
40596     var _stack;
40597     var _index;
40598     var _tree;
40599     function _act(actions, t) {
40600       actions = Array.prototype.slice.call(actions);
40601       var annotation;
40602       if (typeof actions[actions.length - 1] !== "function") {
40603         annotation = actions.pop();
40604       }
40605       var graph = _stack[_index].graph;
40606       for (var i2 = 0; i2 < actions.length; i2++) {
40607         graph = actions[i2](graph, t);
40608       }
40609       return {
40610         graph,
40611         annotation,
40612         imageryUsed: _imageryUsed,
40613         photoOverlaysUsed: _photoOverlaysUsed,
40614         transform: context.projection.transform(),
40615         selectedIDs: context.selectedIDs()
40616       };
40617     }
40618     function _perform(args, t) {
40619       var previous = _stack[_index].graph;
40620       _stack = _stack.slice(0, _index + 1);
40621       var actionResult = _act(args, t);
40622       _stack.push(actionResult);
40623       _index++;
40624       return change(previous);
40625     }
40626     function _replace(args, t) {
40627       var previous = _stack[_index].graph;
40628       var actionResult = _act(args, t);
40629       _stack[_index] = actionResult;
40630       return change(previous);
40631     }
40632     function _overwrite(args, t) {
40633       var previous = _stack[_index].graph;
40634       if (_index > 0) {
40635         _index--;
40636         _stack.pop();
40637       }
40638       _stack = _stack.slice(0, _index + 1);
40639       var actionResult = _act(args, t);
40640       _stack.push(actionResult);
40641       _index++;
40642       return change(previous);
40643     }
40644     function change(previous) {
40645       var difference = coreDifference(previous, history.graph());
40646       if (!_pausedGraph) {
40647         dispatch10.call("change", this, difference);
40648       }
40649       return difference;
40650     }
40651     function getKey(n2) {
40652       return "iD_" + window.location.origin + "_" + n2;
40653     }
40654     var history = {
40655       graph: function() {
40656         return _stack[_index].graph;
40657       },
40658       tree: function() {
40659         return _tree;
40660       },
40661       base: function() {
40662         return _stack[0].graph;
40663       },
40664       merge: function(entities) {
40665         var stack = _stack.map(function(state) {
40666           return state.graph;
40667         });
40668         _stack[0].graph.rebase(entities, stack, false);
40669         _tree.rebase(entities, false);
40670         dispatch10.call("merge", this, entities);
40671       },
40672       perform: function() {
40673         select_default2(document).interrupt("history.perform");
40674         var transitionable = false;
40675         var action0 = arguments[0];
40676         if (arguments.length === 1 || arguments.length === 2 && typeof arguments[1] !== "function") {
40677           transitionable = !!action0.transitionable;
40678         }
40679         if (transitionable) {
40680           var origArguments = arguments;
40681           select_default2(document).transition("history.perform").duration(duration).ease(linear2).tween("history.tween", function() {
40682             return function(t) {
40683               if (t < 1)
40684                 _overwrite([action0], t);
40685             };
40686           }).on("start", function() {
40687             _perform([action0], 0);
40688           }).on("end interrupt", function() {
40689             _overwrite(origArguments, 1);
40690           });
40691         } else {
40692           return _perform(arguments);
40693         }
40694       },
40695       replace: function() {
40696         select_default2(document).interrupt("history.perform");
40697         return _replace(arguments, 1);
40698       },
40699       // Same as calling pop and then perform
40700       overwrite: function() {
40701         select_default2(document).interrupt("history.perform");
40702         return _overwrite(arguments, 1);
40703       },
40704       pop: function(n2) {
40705         select_default2(document).interrupt("history.perform");
40706         var previous = _stack[_index].graph;
40707         if (isNaN(+n2) || +n2 < 0) {
40708           n2 = 1;
40709         }
40710         while (n2-- > 0 && _index > 0) {
40711           _index--;
40712           _stack.pop();
40713         }
40714         return change(previous);
40715       },
40716       // Back to the previous annotated state or _index = 0.
40717       undo: function() {
40718         select_default2(document).interrupt("history.perform");
40719         var previousStack = _stack[_index];
40720         var previous = previousStack.graph;
40721         while (_index > 0) {
40722           _index--;
40723           if (_stack[_index].annotation)
40724             break;
40725         }
40726         dispatch10.call("undone", this, _stack[_index], previousStack);
40727         return change(previous);
40728       },
40729       // Forward to the next annotated state.
40730       redo: function() {
40731         select_default2(document).interrupt("history.perform");
40732         var previousStack = _stack[_index];
40733         var previous = previousStack.graph;
40734         var tryIndex = _index;
40735         while (tryIndex < _stack.length - 1) {
40736           tryIndex++;
40737           if (_stack[tryIndex].annotation) {
40738             _index = tryIndex;
40739             dispatch10.call("redone", this, _stack[_index], previousStack);
40740             break;
40741           }
40742         }
40743         return change(previous);
40744       },
40745       pauseChangeDispatch: function() {
40746         if (!_pausedGraph) {
40747           _pausedGraph = _stack[_index].graph;
40748         }
40749       },
40750       resumeChangeDispatch: function() {
40751         if (_pausedGraph) {
40752           var previous = _pausedGraph;
40753           _pausedGraph = null;
40754           return change(previous);
40755         }
40756       },
40757       undoAnnotation: function() {
40758         var i2 = _index;
40759         while (i2 >= 0) {
40760           if (_stack[i2].annotation)
40761             return _stack[i2].annotation;
40762           i2--;
40763         }
40764       },
40765       redoAnnotation: function() {
40766         var i2 = _index + 1;
40767         while (i2 <= _stack.length - 1) {
40768           if (_stack[i2].annotation)
40769             return _stack[i2].annotation;
40770           i2++;
40771         }
40772       },
40773       // Returns the entities from the active graph with bounding boxes
40774       // overlapping the given `extent`.
40775       intersects: function(extent) {
40776         return _tree.intersects(extent, _stack[_index].graph);
40777       },
40778       difference: function() {
40779         var base = _stack[0].graph;
40780         var head = _stack[_index].graph;
40781         return coreDifference(base, head);
40782       },
40783       changes: function(action) {
40784         var base = _stack[0].graph;
40785         var head = _stack[_index].graph;
40786         if (action) {
40787           head = action(head);
40788         }
40789         var difference = coreDifference(base, head);
40790         return {
40791           modified: difference.modified(),
40792           created: difference.created(),
40793           deleted: difference.deleted()
40794         };
40795       },
40796       hasChanges: function() {
40797         return this.difference().length() > 0;
40798       },
40799       imageryUsed: function(sources) {
40800         if (sources) {
40801           _imageryUsed = sources;
40802           return history;
40803         } else {
40804           var s = /* @__PURE__ */ new Set();
40805           _stack.slice(1, _index + 1).forEach(function(state) {
40806             state.imageryUsed.forEach(function(source) {
40807               if (source !== "Custom") {
40808                 s.add(source);
40809               }
40810             });
40811           });
40812           return Array.from(s);
40813         }
40814       },
40815       photoOverlaysUsed: function(sources) {
40816         if (sources) {
40817           _photoOverlaysUsed = sources;
40818           return history;
40819         } else {
40820           var s = /* @__PURE__ */ new Set();
40821           _stack.slice(1, _index + 1).forEach(function(state) {
40822             if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
40823               state.photoOverlaysUsed.forEach(function(photoOverlay) {
40824                 s.add(photoOverlay);
40825               });
40826             }
40827           });
40828           return Array.from(s);
40829         }
40830       },
40831       // save the current history state
40832       checkpoint: function(key) {
40833         _checkpoints[key] = {
40834           stack: _stack,
40835           index: _index
40836         };
40837         return history;
40838       },
40839       // restore history state to a given checkpoint or reset completely
40840       reset: function(key) {
40841         if (key !== void 0 && _checkpoints.hasOwnProperty(key)) {
40842           _stack = _checkpoints[key].stack;
40843           _index = _checkpoints[key].index;
40844         } else {
40845           _stack = [{ graph: coreGraph() }];
40846           _index = 0;
40847           _tree = coreTree(_stack[0].graph);
40848           _checkpoints = {};
40849         }
40850         dispatch10.call("reset");
40851         dispatch10.call("change");
40852         return history;
40853       },
40854       // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
40855       //
40856       // To use it:
40857       //  1. Start the walkthrough.
40858       //  2. Get to a "free editing" tutorial step
40859       //  3. Make your edits to the walkthrough map
40860       //  4. In your browser dev console run:
40861       //        `id.history().toIntroGraph()`
40862       //  5. This outputs stringified JSON to the browser console
40863       //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
40864       toIntroGraph: function() {
40865         var nextID = { n: 0, r: 0, w: 0 };
40866         var permIDs = {};
40867         var graph = this.graph();
40868         var baseEntities = {};
40869         Object.values(graph.base().entities).forEach(function(entity) {
40870           var copy2 = copyIntroEntity(entity);
40871           baseEntities[copy2.id] = copy2;
40872         });
40873         Object.keys(graph.entities).forEach(function(id2) {
40874           var entity = graph.entities[id2];
40875           if (entity) {
40876             var copy2 = copyIntroEntity(entity);
40877             baseEntities[copy2.id] = copy2;
40878           } else {
40879             delete baseEntities[id2];
40880           }
40881         });
40882         Object.values(baseEntities).forEach(function(entity) {
40883           if (Array.isArray(entity.nodes)) {
40884             entity.nodes = entity.nodes.map(function(node) {
40885               return permIDs[node] || node;
40886             });
40887           }
40888           if (Array.isArray(entity.members)) {
40889             entity.members = entity.members.map(function(member) {
40890               member.id = permIDs[member.id] || member.id;
40891               return member;
40892             });
40893           }
40894         });
40895         return JSON.stringify({ dataIntroGraph: baseEntities });
40896         function copyIntroEntity(source) {
40897           var copy2 = utilObjectOmit(source, ["type", "user", "v", "version", "visible"]);
40898           if (copy2.tags && !Object.keys(copy2.tags)) {
40899             delete copy2.tags;
40900           }
40901           if (Array.isArray(copy2.loc)) {
40902             copy2.loc[0] = +copy2.loc[0].toFixed(6);
40903             copy2.loc[1] = +copy2.loc[1].toFixed(6);
40904           }
40905           var match = source.id.match(/([nrw])-\d*/);
40906           if (match !== null) {
40907             var nrw = match[1];
40908             var permID;
40909             do {
40910               permID = nrw + ++nextID[nrw];
40911             } while (baseEntities.hasOwnProperty(permID));
40912             copy2.id = permIDs[source.id] = permID;
40913           }
40914           return copy2;
40915         }
40916       },
40917       toJSON: function() {
40918         if (!this.hasChanges())
40919           return;
40920         var allEntities = {};
40921         var baseEntities = {};
40922         var base = _stack[0];
40923         var s = _stack.map(function(i2) {
40924           var modified = [];
40925           var deleted = [];
40926           Object.keys(i2.graph.entities).forEach(function(id2) {
40927             var entity = i2.graph.entities[id2];
40928             if (entity) {
40929               var key = osmEntity.key(entity);
40930               allEntities[key] = entity;
40931               modified.push(key);
40932             } else {
40933               deleted.push(id2);
40934             }
40935             if (id2 in base.graph.entities) {
40936               baseEntities[id2] = base.graph.entities[id2];
40937             }
40938             if (entity && entity.nodes) {
40939               entity.nodes.forEach(function(nodeID) {
40940                 if (nodeID in base.graph.entities) {
40941                   baseEntities[nodeID] = base.graph.entities[nodeID];
40942                 }
40943               });
40944             }
40945             var baseParents = base.graph._parentWays[id2];
40946             if (baseParents) {
40947               baseParents.forEach(function(parentID) {
40948                 if (parentID in base.graph.entities) {
40949                   baseEntities[parentID] = base.graph.entities[parentID];
40950                 }
40951               });
40952             }
40953           });
40954           var x = {};
40955           if (modified.length)
40956             x.modified = modified;
40957           if (deleted.length)
40958             x.deleted = deleted;
40959           if (i2.imageryUsed)
40960             x.imageryUsed = i2.imageryUsed;
40961           if (i2.photoOverlaysUsed)
40962             x.photoOverlaysUsed = i2.photoOverlaysUsed;
40963           if (i2.annotation)
40964             x.annotation = i2.annotation;
40965           if (i2.transform)
40966             x.transform = i2.transform;
40967           if (i2.selectedIDs)
40968             x.selectedIDs = i2.selectedIDs;
40969           return x;
40970         });
40971         return JSON.stringify({
40972           version: 3,
40973           entities: Object.values(allEntities),
40974           baseEntities: Object.values(baseEntities),
40975           stack: s,
40976           nextIDs: osmEntity.id.next,
40977           index: _index,
40978           // note the time the changes were saved
40979           timestamp: (/* @__PURE__ */ new Date()).getTime()
40980         });
40981       },
40982       fromJSON: function(json, loadChildNodes) {
40983         var h = JSON.parse(json);
40984         var loadComplete = true;
40985         osmEntity.id.next = h.nextIDs;
40986         _index = h.index;
40987         if (h.version === 2 || h.version === 3) {
40988           var allEntities = {};
40989           h.entities.forEach(function(entity) {
40990             allEntities[osmEntity.key(entity)] = osmEntity(entity);
40991           });
40992           if (h.version === 3) {
40993             var baseEntities = h.baseEntities.map(function(d) {
40994               return osmEntity(d);
40995             });
40996             var stack = _stack.map(function(state) {
40997               return state.graph;
40998             });
40999             _stack[0].graph.rebase(baseEntities, stack, true);
41000             _tree.rebase(baseEntities, true);
41001             if (loadChildNodes) {
41002               var osm = context.connection();
41003               var baseWays = baseEntities.filter(function(e) {
41004                 return e.type === "way";
41005               });
41006               var nodeIDs = baseWays.reduce(function(acc, way) {
41007                 return utilArrayUnion(acc, way.nodes);
41008               }, []);
41009               var missing = nodeIDs.filter(function(n2) {
41010                 return !_stack[0].graph.hasEntity(n2);
41011               });
41012               if (missing.length && osm) {
41013                 loadComplete = false;
41014                 context.map().redrawEnable(false);
41015                 var loading = uiLoading(context).blocking(true);
41016                 context.container().call(loading);
41017                 var childNodesLoaded = function(err, result) {
41018                   if (!err) {
41019                     var visibleGroups = utilArrayGroupBy(result.data, "visible");
41020                     var visibles = visibleGroups.true || [];
41021                     var invisibles = visibleGroups.false || [];
41022                     if (visibles.length) {
41023                       var visibleIDs = visibles.map(function(entity) {
41024                         return entity.id;
41025                       });
41026                       var stack2 = _stack.map(function(state) {
41027                         return state.graph;
41028                       });
41029                       missing = utilArrayDifference(missing, visibleIDs);
41030                       _stack[0].graph.rebase(visibles, stack2, true);
41031                       _tree.rebase(visibles, true);
41032                     }
41033                     invisibles.forEach(function(entity) {
41034                       osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
41035                     });
41036                   }
41037                   if (err || !missing.length) {
41038                     loading.close();
41039                     context.map().redrawEnable(true);
41040                     dispatch10.call("change");
41041                     dispatch10.call("restore", this);
41042                   }
41043                 };
41044                 osm.loadMultiple(missing, childNodesLoaded);
41045               }
41046             }
41047           }
41048           _stack = h.stack.map(function(d) {
41049             var entities = {}, entity;
41050             if (d.modified) {
41051               d.modified.forEach(function(key) {
41052                 entity = allEntities[key];
41053                 entities[entity.id] = entity;
41054               });
41055             }
41056             if (d.deleted) {
41057               d.deleted.forEach(function(id2) {
41058                 entities[id2] = void 0;
41059               });
41060             }
41061             return {
41062               graph: coreGraph(_stack[0].graph).load(entities),
41063               annotation: d.annotation,
41064               imageryUsed: d.imageryUsed,
41065               photoOverlaysUsed: d.photoOverlaysUsed,
41066               transform: d.transform,
41067               selectedIDs: d.selectedIDs
41068             };
41069           });
41070         } else {
41071           _stack = h.stack.map(function(d) {
41072             var entities = {};
41073             for (var i2 in d.entities) {
41074               var entity = d.entities[i2];
41075               entities[i2] = entity === "undefined" ? void 0 : osmEntity(entity);
41076             }
41077             d.graph = coreGraph(_stack[0].graph).load(entities);
41078             return d;
41079           });
41080         }
41081         var transform2 = _stack[_index].transform;
41082         if (transform2) {
41083           context.map().transformEase(transform2, 0);
41084         }
41085         if (loadComplete) {
41086           dispatch10.call("change");
41087           dispatch10.call("restore", this);
41088         }
41089         return history;
41090       },
41091       lock: function() {
41092         return lock.lock();
41093       },
41094       unlock: function() {
41095         lock.unlock();
41096       },
41097       save: function() {
41098         if (lock.locked() && // don't overwrite existing, unresolved changes
41099         !_hasUnresolvedRestorableChanges) {
41100           const success = corePreferences(getKey("saved_history"), history.toJSON() || null);
41101           if (!success)
41102             dispatch10.call("storage_error");
41103         }
41104         return history;
41105       },
41106       // delete the history version saved in localStorage
41107       clearSaved: function() {
41108         context.debouncedSave.cancel();
41109         if (lock.locked()) {
41110           _hasUnresolvedRestorableChanges = false;
41111           corePreferences(getKey("saved_history"), null);
41112           corePreferences("comment", null);
41113           corePreferences("hashtags", null);
41114           corePreferences("source", null);
41115         }
41116         return history;
41117       },
41118       savedHistoryJSON: function() {
41119         return corePreferences(getKey("saved_history"));
41120       },
41121       hasRestorableChanges: function() {
41122         return _hasUnresolvedRestorableChanges;
41123       },
41124       // load history from a version stored in localStorage
41125       restore: function() {
41126         if (lock.locked()) {
41127           _hasUnresolvedRestorableChanges = false;
41128           var json = this.savedHistoryJSON();
41129           if (json)
41130             history.fromJSON(json, true);
41131         }
41132       },
41133       _getKey: getKey
41134     };
41135     history.reset();
41136     return utilRebind(history, dispatch10, "on");
41137   }
41138
41139   // modules/validations/index.js
41140   var validations_exports = {};
41141   __export(validations_exports, {
41142     validationAlmostJunction: () => validationAlmostJunction,
41143     validationCloseNodes: () => validationCloseNodes,
41144     validationCrossingWays: () => validationCrossingWays,
41145     validationDisconnectedWay: () => validationDisconnectedWay,
41146     validationFormatting: () => validationFormatting,
41147     validationHelpRequest: () => validationHelpRequest,
41148     validationImpossibleOneway: () => validationImpossibleOneway,
41149     validationIncompatibleSource: () => validationIncompatibleSource,
41150     validationMaprules: () => validationMaprules,
41151     validationMismatchedGeometry: () => validationMismatchedGeometry,
41152     validationMissingRole: () => validationMissingRole,
41153     validationMissingTag: () => validationMissingTag,
41154     validationOutdatedTags: () => validationOutdatedTags,
41155     validationPrivateData: () => validationPrivateData,
41156     validationSuspiciousName: () => validationSuspiciousName,
41157     validationUnsquareWay: () => validationUnsquareWay
41158   });
41159
41160   // modules/validations/almost_junction.js
41161   function validationAlmostJunction(context) {
41162     const type2 = "almost_junction";
41163     const EXTEND_TH_METERS = 5;
41164     const WELD_TH_METERS = 0.75;
41165     const CLOSE_NODE_TH = EXTEND_TH_METERS - WELD_TH_METERS;
41166     const SIG_ANGLE_TH = Math.atan(WELD_TH_METERS / EXTEND_TH_METERS);
41167     function isHighway(entity) {
41168       return entity.type === "way" && osmRoutableHighwayTagValues[entity.tags.highway];
41169     }
41170     function isTaggedAsNotContinuing(node) {
41171       return node.tags.noexit === "yes" || node.tags.amenity === "parking_entrance" || node.tags.entrance && node.tags.entrance !== "no";
41172     }
41173     const validation = function checkAlmostJunction(entity, graph) {
41174       if (!isHighway(entity))
41175         return [];
41176       if (entity.isDegenerate())
41177         return [];
41178       const tree = context.history().tree();
41179       const extendableNodeInfos = findConnectableEndNodesByExtension(entity);
41180       let issues = [];
41181       extendableNodeInfos.forEach((extendableNodeInfo) => {
41182         issues.push(new validationIssue({
41183           type: type2,
41184           subtype: "highway-highway",
41185           severity: "warning",
41186           message: function(context2) {
41187             const entity1 = context2.hasEntity(this.entityIds[0]);
41188             if (this.entityIds[0] === this.entityIds[2]) {
41189               return entity1 ? _t.append("issues.almost_junction.self.message", {
41190                 feature: utilDisplayLabel(entity1, context2.graph())
41191               }) : "";
41192             } else {
41193               const entity2 = context2.hasEntity(this.entityIds[2]);
41194               return entity1 && entity2 ? _t.append("issues.almost_junction.message", {
41195                 feature: utilDisplayLabel(entity1, context2.graph()),
41196                 feature2: utilDisplayLabel(entity2, context2.graph())
41197               }) : "";
41198             }
41199           },
41200           reference: showReference,
41201           entityIds: [
41202             entity.id,
41203             extendableNodeInfo.node.id,
41204             extendableNodeInfo.wid
41205           ],
41206           loc: extendableNodeInfo.node.loc,
41207           hash: JSON.stringify(extendableNodeInfo.node.loc),
41208           data: {
41209             midId: extendableNodeInfo.mid.id,
41210             edge: extendableNodeInfo.edge,
41211             cross_loc: extendableNodeInfo.cross_loc
41212           },
41213           dynamicFixes: makeFixes
41214         }));
41215       });
41216       return issues;
41217       function makeFixes(context2) {
41218         let fixes = [new validationIssueFix({
41219           icon: "iD-icon-abutment",
41220           title: _t.append("issues.fix.connect_features.title"),
41221           onClick: function(context3) {
41222             const annotation = _t("issues.fix.connect_almost_junction.annotation");
41223             const [, endNodeId, crossWayId] = this.issue.entityIds;
41224             const midNode = context3.entity(this.issue.data.midId);
41225             const endNode = context3.entity(endNodeId);
41226             const crossWay = context3.entity(crossWayId);
41227             const nearEndNodes = findNearbyEndNodes(endNode, crossWay);
41228             if (nearEndNodes.length > 0) {
41229               const collinear = findSmallJoinAngle(midNode, endNode, nearEndNodes);
41230               if (collinear) {
41231                 context3.perform(
41232                   actionMergeNodes([collinear.id, endNode.id], collinear.loc),
41233                   annotation
41234                 );
41235                 return;
41236               }
41237             }
41238             const targetEdge = this.issue.data.edge;
41239             const crossLoc = this.issue.data.cross_loc;
41240             const edgeNodes = [context3.entity(targetEdge[0]), context3.entity(targetEdge[1])];
41241             const closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
41242             if (closestNodeInfo.distance < WELD_TH_METERS) {
41243               context3.perform(
41244                 actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
41245                 annotation
41246               );
41247             } else {
41248               context3.perform(
41249                 actionAddMidpoint({ loc: crossLoc, edge: targetEdge }, endNode),
41250                 annotation
41251               );
41252             }
41253           }
41254         })];
41255         const node = context2.hasEntity(this.entityIds[1]);
41256         if (node && !node.hasInterestingTags()) {
41257           fixes.push(new validationIssueFix({
41258             icon: "maki-barrier",
41259             title: _t.append("issues.fix.tag_as_disconnected.title"),
41260             onClick: function(context3) {
41261               const nodeID = this.issue.entityIds[1];
41262               const tags = Object.assign({}, context3.entity(nodeID).tags);
41263               tags.noexit = "yes";
41264               context3.perform(
41265                 actionChangeTags(nodeID, tags),
41266                 _t("issues.fix.tag_as_disconnected.annotation")
41267               );
41268             }
41269           }));
41270         }
41271         return fixes;
41272       }
41273       function showReference(selection2) {
41274         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.almost_junction.highway-highway.reference"));
41275       }
41276       function isExtendableCandidate(node, way) {
41277         const osm = services.osm;
41278         if (osm && !osm.isDataLoaded(node.loc)) {
41279           return false;
41280         }
41281         if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
41282           return false;
41283         }
41284         let occurrences = 0;
41285         for (const index in way.nodes) {
41286           if (way.nodes[index] === node.id) {
41287             occurrences += 1;
41288             if (occurrences > 1) {
41289               return false;
41290             }
41291           }
41292         }
41293         return true;
41294       }
41295       function findConnectableEndNodesByExtension(way) {
41296         let results = [];
41297         if (way.isClosed())
41298           return results;
41299         let testNodes;
41300         const indices = [0, way.nodes.length - 1];
41301         indices.forEach((nodeIndex) => {
41302           const nodeID = way.nodes[nodeIndex];
41303           const node = graph.entity(nodeID);
41304           if (!isExtendableCandidate(node, way))
41305             return;
41306           const connectionInfo = canConnectByExtend(way, nodeIndex);
41307           if (!connectionInfo)
41308             return;
41309           testNodes = graph.childNodes(way).slice();
41310           testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
41311           if (geoHasSelfIntersections(testNodes, nodeID))
41312             return;
41313           results.push(connectionInfo);
41314         });
41315         return results;
41316       }
41317       function findNearbyEndNodes(node, way) {
41318         return [
41319           way.nodes[0],
41320           way.nodes[way.nodes.length - 1]
41321         ].map((d) => graph.entity(d)).filter((d) => {
41322           return d.id !== node.id && geoSphericalDistance(node.loc, d.loc) <= CLOSE_NODE_TH;
41323         });
41324       }
41325       function findSmallJoinAngle(midNode, tipNode, endNodes) {
41326         let joinTo;
41327         let minAngle = Infinity;
41328         endNodes.forEach((endNode) => {
41329           const a1 = geoAngle(midNode, tipNode, context.projection) + Math.PI;
41330           const a2 = geoAngle(midNode, endNode, context.projection) + Math.PI;
41331           const diff = Math.max(a1, a2) - Math.min(a1, a2);
41332           if (diff < minAngle) {
41333             joinTo = endNode;
41334             minAngle = diff;
41335           }
41336         });
41337         if (minAngle <= SIG_ANGLE_TH)
41338           return joinTo;
41339         return null;
41340       }
41341       function hasTag(tags, key) {
41342         return tags[key] !== void 0 && tags[key] !== "no";
41343       }
41344       function canConnectWays(way, way2) {
41345         if (way.id === way2.id)
41346           return true;
41347         if ((hasTag(way.tags, "bridge") || hasTag(way2.tags, "bridge")) && !(hasTag(way.tags, "bridge") && hasTag(way2.tags, "bridge")))
41348           return false;
41349         if ((hasTag(way.tags, "tunnel") || hasTag(way2.tags, "tunnel")) && !(hasTag(way.tags, "tunnel") && hasTag(way2.tags, "tunnel")))
41350           return false;
41351         const layer1 = way.tags.layer || "0", layer2 = way2.tags.layer || "0";
41352         if (layer1 !== layer2)
41353           return false;
41354         const level1 = way.tags.level || "0", level2 = way2.tags.level || "0";
41355         if (level1 !== level2)
41356           return false;
41357         return true;
41358       }
41359       function canConnectByExtend(way, endNodeIdx) {
41360         const tipNid = way.nodes[endNodeIdx];
41361         const midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];
41362         const tipNode = graph.entity(tipNid);
41363         const midNode = graph.entity(midNid);
41364         const lon = tipNode.loc[0];
41365         const lat = tipNode.loc[1];
41366         const lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
41367         const lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
41368         const queryExtent = geoExtent([
41369           [lon - lon_range, lat - lat_range],
41370           [lon + lon_range, lat + lat_range]
41371         ]);
41372         const edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
41373         const t = EXTEND_TH_METERS / edgeLen + 1;
41374         const extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
41375         const segmentInfos = tree.waySegments(queryExtent, graph);
41376         for (let i2 = 0; i2 < segmentInfos.length; i2++) {
41377           let segmentInfo = segmentInfos[i2];
41378           let way2 = graph.entity(segmentInfo.wayId);
41379           if (!isHighway(way2))
41380             continue;
41381           if (!canConnectWays(way, way2))
41382             continue;
41383           let nAid = segmentInfo.nodes[0], nBid = segmentInfo.nodes[1];
41384           if (nAid === tipNid || nBid === tipNid)
41385             continue;
41386           let nA = graph.entity(nAid), nB = graph.entity(nBid);
41387           let crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
41388           if (crossLoc) {
41389             return {
41390               mid: midNode,
41391               node: tipNode,
41392               wid: way2.id,
41393               edge: [nA.id, nB.id],
41394               cross_loc: crossLoc
41395             };
41396           }
41397         }
41398         return null;
41399       }
41400     };
41401     validation.type = type2;
41402     return validation;
41403   }
41404
41405   // modules/validations/close_nodes.js
41406   function validationCloseNodes(context) {
41407     var type2 = "close_nodes";
41408     var pointThresholdMeters = 0.2;
41409     var validation = function(entity, graph) {
41410       if (entity.type === "node") {
41411         return getIssuesForNode(entity);
41412       } else if (entity.type === "way") {
41413         return getIssuesForWay(entity);
41414       }
41415       return [];
41416       function getIssuesForNode(node) {
41417         var parentWays = graph.parentWays(node);
41418         if (parentWays.length) {
41419           return getIssuesForVertex(node, parentWays);
41420         } else {
41421           return getIssuesForDetachedPoint(node);
41422         }
41423       }
41424       function wayTypeFor(way) {
41425         if (way.tags.boundary && way.tags.boundary !== "no")
41426           return "boundary";
41427         if (way.tags.indoor && way.tags.indoor !== "no")
41428           return "indoor";
41429         if (way.tags.building && way.tags.building !== "no" || way.tags["building:part"] && way.tags["building:part"] !== "no")
41430           return "building";
41431         if (osmPathHighwayTagValues[way.tags.highway])
41432           return "path";
41433         var parentRelations = graph.parentRelations(way);
41434         for (var i2 in parentRelations) {
41435           var relation = parentRelations[i2];
41436           if (relation.tags.type === "boundary")
41437             return "boundary";
41438           if (relation.isMultipolygon()) {
41439             if (relation.tags.indoor && relation.tags.indoor !== "no")
41440               return "indoor";
41441             if (relation.tags.building && relation.tags.building !== "no" || relation.tags["building:part"] && relation.tags["building:part"] !== "no")
41442               return "building";
41443           }
41444         }
41445         return "other";
41446       }
41447       function shouldCheckWay(way) {
41448         if (way.nodes.length <= 2 || way.isClosed() && way.nodes.length <= 4)
41449           return false;
41450         var bbox2 = way.extent(graph).bbox();
41451         var hypotenuseMeters = geoSphericalDistance([bbox2.minX, bbox2.minY], [bbox2.maxX, bbox2.maxY]);
41452         if (hypotenuseMeters < 1.5)
41453           return false;
41454         return true;
41455       }
41456       function getIssuesForWay(way) {
41457         if (!shouldCheckWay(way))
41458           return [];
41459         var issues = [], nodes = graph.childNodes(way);
41460         for (var i2 = 0; i2 < nodes.length - 1; i2++) {
41461           var node1 = nodes[i2];
41462           var node2 = nodes[i2 + 1];
41463           var issue = getWayIssueIfAny(node1, node2, way);
41464           if (issue)
41465             issues.push(issue);
41466         }
41467         return issues;
41468       }
41469       function getIssuesForVertex(node, parentWays) {
41470         var issues = [];
41471         function checkForCloseness(node1, node2, way) {
41472           var issue = getWayIssueIfAny(node1, node2, way);
41473           if (issue)
41474             issues.push(issue);
41475         }
41476         for (var i2 = 0; i2 < parentWays.length; i2++) {
41477           var parentWay = parentWays[i2];
41478           if (!shouldCheckWay(parentWay))
41479             continue;
41480           var lastIndex = parentWay.nodes.length - 1;
41481           for (var j2 = 0; j2 < parentWay.nodes.length; j2++) {
41482             if (j2 !== 0) {
41483               if (parentWay.nodes[j2 - 1] === node.id) {
41484                 checkForCloseness(node, graph.entity(parentWay.nodes[j2]), parentWay);
41485               }
41486             }
41487             if (j2 !== lastIndex) {
41488               if (parentWay.nodes[j2 + 1] === node.id) {
41489                 checkForCloseness(graph.entity(parentWay.nodes[j2]), node, parentWay);
41490               }
41491             }
41492           }
41493         }
41494         return issues;
41495       }
41496       function thresholdMetersForWay(way) {
41497         if (!shouldCheckWay(way))
41498           return 0;
41499         var wayType = wayTypeFor(way);
41500         if (wayType === "boundary")
41501           return 0;
41502         if (wayType === "indoor")
41503           return 0.01;
41504         if (wayType === "building")
41505           return 0.05;
41506         if (wayType === "path")
41507           return 0.1;
41508         return 0.2;
41509       }
41510       function getIssuesForDetachedPoint(node) {
41511         var issues = [];
41512         var lon = node.loc[0];
41513         var lat = node.loc[1];
41514         var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
41515         var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
41516         var queryExtent = geoExtent([
41517           [lon - lon_range, lat - lat_range],
41518           [lon + lon_range, lat + lat_range]
41519         ]);
41520         var intersected = context.history().tree().intersects(queryExtent, graph);
41521         for (var j2 = 0; j2 < intersected.length; j2++) {
41522           var nearby = intersected[j2];
41523           if (nearby.id === node.id)
41524             continue;
41525           if (nearby.type !== "node" || nearby.geometry(graph) !== "point")
41526             continue;
41527           if (nearby.loc === node.loc || geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
41528             if ("memorial:type" in node.tags && "memorial:type" in nearby.tags && node.tags["memorial:type"] === "stolperstein" && nearby.tags["memorial:type"] === "stolperstein")
41529               continue;
41530             if ("memorial" in node.tags && "memorial" in nearby.tags && node.tags.memorial === "stolperstein" && nearby.tags.memorial === "stolperstein")
41531               continue;
41532             var zAxisKeys = { layer: true, level: true, "addr:housenumber": true, "addr:unit": true };
41533             var zAxisDifferentiates = false;
41534             for (var key in zAxisKeys) {
41535               var nodeValue = node.tags[key] || "0";
41536               var nearbyValue = nearby.tags[key] || "0";
41537               if (nodeValue !== nearbyValue) {
41538                 zAxisDifferentiates = true;
41539                 break;
41540               }
41541             }
41542             if (zAxisDifferentiates)
41543               continue;
41544             issues.push(new validationIssue({
41545               type: type2,
41546               subtype: "detached",
41547               severity: "warning",
41548               message: function(context2) {
41549                 var entity2 = context2.hasEntity(this.entityIds[0]), entity22 = context2.hasEntity(this.entityIds[1]);
41550                 return entity2 && entity22 ? _t.append("issues.close_nodes.detached.message", {
41551                   feature: utilDisplayLabel(entity2, context2.graph()),
41552                   feature2: utilDisplayLabel(entity22, context2.graph())
41553                 }) : "";
41554               },
41555               reference: showReference,
41556               entityIds: [node.id, nearby.id],
41557               dynamicFixes: function() {
41558                 return [
41559                   new validationIssueFix({
41560                     icon: "iD-operation-disconnect",
41561                     title: _t.append("issues.fix.move_points_apart.title")
41562                   }),
41563                   new validationIssueFix({
41564                     icon: "iD-icon-layers",
41565                     title: _t.append("issues.fix.use_different_layers_or_levels.title")
41566                   })
41567                 ];
41568               }
41569             }));
41570           }
41571         }
41572         return issues;
41573         function showReference(selection2) {
41574           var referenceText = _t("issues.close_nodes.detached.reference");
41575           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").html(referenceText);
41576         }
41577       }
41578       function getWayIssueIfAny(node1, node2, way) {
41579         if (node1.id === node2.id || node1.hasInterestingTags() && node2.hasInterestingTags()) {
41580           return null;
41581         }
41582         if (node1.loc !== node2.loc) {
41583           var parentWays1 = graph.parentWays(node1);
41584           var parentWays2 = new Set(graph.parentWays(node2));
41585           var sharedWays = parentWays1.filter(function(parentWay) {
41586             return parentWays2.has(parentWay);
41587           });
41588           var thresholds = sharedWays.map(function(parentWay) {
41589             return thresholdMetersForWay(parentWay);
41590           });
41591           var threshold = Math.min(...thresholds);
41592           var distance = geoSphericalDistance(node1.loc, node2.loc);
41593           if (distance > threshold)
41594             return null;
41595         }
41596         return new validationIssue({
41597           type: type2,
41598           subtype: "vertices",
41599           severity: "warning",
41600           message: function(context2) {
41601             var entity2 = context2.hasEntity(this.entityIds[0]);
41602             return entity2 ? _t.append("issues.close_nodes.message", { way: utilDisplayLabel(entity2, context2.graph()) }) : "";
41603           },
41604           reference: showReference,
41605           entityIds: [way.id, node1.id, node2.id],
41606           loc: node1.loc,
41607           dynamicFixes: function() {
41608             return [
41609               new validationIssueFix({
41610                 icon: "iD-icon-plus",
41611                 title: _t.append("issues.fix.merge_points.title"),
41612                 onClick: function(context2) {
41613                   var entityIds = this.issue.entityIds;
41614                   var action = actionMergeNodes([entityIds[1], entityIds[2]]);
41615                   context2.perform(action, _t("issues.fix.merge_close_vertices.annotation"));
41616                 }
41617               }),
41618               new validationIssueFix({
41619                 icon: "iD-operation-disconnect",
41620                 title: _t.append("issues.fix.move_points_apart.title")
41621               })
41622             ];
41623           }
41624         });
41625         function showReference(selection2) {
41626           var referenceText = _t("issues.close_nodes.reference");
41627           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").html(referenceText);
41628         }
41629       }
41630     };
41631     validation.type = type2;
41632     return validation;
41633   }
41634
41635   // modules/validations/crossing_ways.js
41636   var import_lodash3 = __toESM(require_lodash());
41637   function validationCrossingWays(context) {
41638     var type2 = "crossing_ways";
41639     function getFeatureWithFeatureTypeTagsForWay(way, graph) {
41640       if (getFeatureType(way, graph) === null) {
41641         var parentRels = graph.parentRelations(way);
41642         for (var i2 = 0; i2 < parentRels.length; i2++) {
41643           var rel = parentRels[i2];
41644           if (getFeatureType(rel, graph) !== null) {
41645             return rel;
41646           }
41647         }
41648       }
41649       return way;
41650     }
41651     function hasTag(tags, key) {
41652       return tags[key] !== void 0 && tags[key] !== "no";
41653     }
41654     function taggedAsIndoor(tags) {
41655       return hasTag(tags, "indoor") || hasTag(tags, "level") || tags.highway === "corridor";
41656     }
41657     function allowsBridge(featureType) {
41658       return featureType === "highway" || featureType === "railway" || featureType === "waterway";
41659     }
41660     function allowsTunnel(featureType) {
41661       return featureType === "highway" || featureType === "railway" || featureType === "waterway";
41662     }
41663     var ignoredBuildings = {
41664       demolished: true,
41665       dismantled: true,
41666       proposed: true,
41667       razed: true
41668     };
41669     function getFeatureType(entity, graph) {
41670       var geometry = entity.geometry(graph);
41671       if (geometry !== "line" && geometry !== "area")
41672         return null;
41673       var tags = entity.tags;
41674       if (hasTag(tags, "building") && !ignoredBuildings[tags.building])
41675         return "building";
41676       if (hasTag(tags, "highway") && osmRoutableHighwayTagValues[tags.highway])
41677         return "highway";
41678       if (geometry !== "line")
41679         return null;
41680       if (hasTag(tags, "railway") && osmRailwayTrackTagValues[tags.railway])
41681         return "railway";
41682       if (hasTag(tags, "waterway") && osmFlowingWaterwayTagValues[tags.waterway])
41683         return "waterway";
41684       return null;
41685     }
41686     function isLegitCrossing(tags1, featureType1, tags2, featureType2) {
41687       var level1 = tags1.level || "0";
41688       var level2 = tags2.level || "0";
41689       if (taggedAsIndoor(tags1) && taggedAsIndoor(tags2) && level1 !== level2) {
41690         return true;
41691       }
41692       var layer1 = tags1.layer || "0";
41693       var layer2 = tags2.layer || "0";
41694       if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
41695         if (hasTag(tags1, "bridge") && !hasTag(tags2, "bridge"))
41696           return true;
41697         if (!hasTag(tags1, "bridge") && hasTag(tags2, "bridge"))
41698           return true;
41699         if (hasTag(tags1, "bridge") && hasTag(tags2, "bridge") && layer1 !== layer2)
41700           return true;
41701       } else if (allowsBridge(featureType1) && hasTag(tags1, "bridge"))
41702         return true;
41703       else if (allowsBridge(featureType2) && hasTag(tags2, "bridge"))
41704         return true;
41705       if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
41706         if (hasTag(tags1, "tunnel") && !hasTag(tags2, "tunnel"))
41707           return true;
41708         if (!hasTag(tags1, "tunnel") && hasTag(tags2, "tunnel"))
41709           return true;
41710         if (hasTag(tags1, "tunnel") && hasTag(tags2, "tunnel") && layer1 !== layer2)
41711           return true;
41712       } else if (allowsTunnel(featureType1) && hasTag(tags1, "tunnel"))
41713         return true;
41714       else if (allowsTunnel(featureType2) && hasTag(tags2, "tunnel"))
41715         return true;
41716       if (featureType1 === "waterway" && featureType2 === "highway" && tags2.man_made === "pier")
41717         return true;
41718       if (featureType2 === "waterway" && featureType1 === "highway" && tags1.man_made === "pier")
41719         return true;
41720       if (featureType1 === "building" || featureType2 === "building" || taggedAsIndoor(tags1) || taggedAsIndoor(tags2)) {
41721         if (layer1 !== layer2)
41722           return true;
41723       }
41724       return false;
41725     }
41726     var highwaysDisallowingFords = {
41727       motorway: true,
41728       motorway_link: true,
41729       trunk: true,
41730       trunk_link: true,
41731       primary: true,
41732       primary_link: true,
41733       secondary: true,
41734       secondary_link: true
41735     };
41736     function tagsForConnectionNodeIfAllowed(entity1, entity2, graph, lessLikelyTags) {
41737       var featureType1 = getFeatureType(entity1, graph);
41738       var featureType2 = getFeatureType(entity2, graph);
41739       var geometry1 = entity1.geometry(graph);
41740       var geometry2 = entity2.geometry(graph);
41741       var bothLines = geometry1 === "line" && geometry2 === "line";
41742       if (featureType1 === featureType2) {
41743         if (featureType1 === "highway") {
41744           var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
41745           var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
41746           if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
41747             var roadFeature = entity1IsPath ? entity2 : entity1;
41748             var pathFeature = entity1IsPath ? entity1 : entity2;
41749             if (roadFeature.tags.highway === "track") {
41750               return {};
41751             }
41752             if (!lessLikelyTags && roadFeature.tags.highway === "service" && pathFeature.tags.highway === "footway" && pathFeature.tags.footway === "sidewalk") {
41753               return {};
41754             }
41755             if (["marked", "unmarked", "traffic_signals", "uncontrolled"].indexOf(pathFeature.tags.crossing) !== -1) {
41756               return bothLines ? { highway: "crossing", crossing: pathFeature.tags.crossing } : {};
41757             }
41758             return bothLines ? { highway: "crossing" } : {};
41759           }
41760           return {};
41761         }
41762         if (featureType1 === "waterway")
41763           return {};
41764         if (featureType1 === "railway")
41765           return {};
41766       } else {
41767         var featureTypes = [featureType1, featureType2];
41768         if (featureTypes.indexOf("highway") !== -1) {
41769           if (featureTypes.indexOf("railway") !== -1) {
41770             if (!bothLines)
41771               return {};
41772             var isTram = entity1.tags.railway === "tram" || entity2.tags.railway === "tram";
41773             if (osmPathHighwayTagValues[entity1.tags.highway] || osmPathHighwayTagValues[entity2.tags.highway]) {
41774               if (isTram)
41775                 return { railway: "tram_crossing" };
41776               return { railway: "crossing" };
41777             } else {
41778               if (isTram)
41779                 return { railway: "tram_level_crossing" };
41780               return { railway: "level_crossing" };
41781             }
41782           }
41783           if (featureTypes.indexOf("waterway") !== -1) {
41784             if (hasTag(entity1.tags, "tunnel") && hasTag(entity2.tags, "tunnel"))
41785               return null;
41786             if (hasTag(entity1.tags, "bridge") && hasTag(entity2.tags, "bridge"))
41787               return null;
41788             if (highwaysDisallowingFords[entity1.tags.highway] || highwaysDisallowingFords[entity2.tags.highway]) {
41789               return null;
41790             }
41791             return bothLines ? { ford: "yes" } : {};
41792           }
41793         }
41794       }
41795       return null;
41796     }
41797     function findCrossingsByWay(way1, graph, tree) {
41798       var edgeCrossInfos = [];
41799       if (way1.type !== "way")
41800         return edgeCrossInfos;
41801       var taggedFeature1 = getFeatureWithFeatureTypeTagsForWay(way1, graph);
41802       var way1FeatureType = getFeatureType(taggedFeature1, graph);
41803       if (way1FeatureType === null)
41804         return edgeCrossInfos;
41805       var checkedSingleCrossingWays = {};
41806       var i2, j2;
41807       var extent;
41808       var n1, n2, nA, nB, nAId, nBId;
41809       var segment1, segment2;
41810       var oneOnly;
41811       var segmentInfos, segment2Info, way2, taggedFeature2, way2FeatureType;
41812       var way1Nodes = graph.childNodes(way1);
41813       var comparedWays = {};
41814       for (i2 = 0; i2 < way1Nodes.length - 1; i2++) {
41815         n1 = way1Nodes[i2];
41816         n2 = way1Nodes[i2 + 1];
41817         extent = geoExtent([
41818           [
41819             Math.min(n1.loc[0], n2.loc[0]),
41820             Math.min(n1.loc[1], n2.loc[1])
41821           ],
41822           [
41823             Math.max(n1.loc[0], n2.loc[0]),
41824             Math.max(n1.loc[1], n2.loc[1])
41825           ]
41826         ]);
41827         segmentInfos = tree.waySegments(extent, graph);
41828         for (j2 = 0; j2 < segmentInfos.length; j2++) {
41829           segment2Info = segmentInfos[j2];
41830           if (segment2Info.wayId === way1.id)
41831             continue;
41832           if (checkedSingleCrossingWays[segment2Info.wayId])
41833             continue;
41834           comparedWays[segment2Info.wayId] = true;
41835           way2 = graph.hasEntity(segment2Info.wayId);
41836           if (!way2)
41837             continue;
41838           taggedFeature2 = getFeatureWithFeatureTypeTagsForWay(way2, graph);
41839           way2FeatureType = getFeatureType(taggedFeature2, graph);
41840           if (way2FeatureType === null || isLegitCrossing(taggedFeature1.tags, way1FeatureType, taggedFeature2.tags, way2FeatureType)) {
41841             continue;
41842           }
41843           oneOnly = way1FeatureType === "building" || way2FeatureType === "building";
41844           nAId = segment2Info.nodes[0];
41845           nBId = segment2Info.nodes[1];
41846           if (nAId === n1.id || nAId === n2.id || nBId === n1.id || nBId === n2.id) {
41847             continue;
41848           }
41849           nA = graph.hasEntity(nAId);
41850           if (!nA)
41851             continue;
41852           nB = graph.hasEntity(nBId);
41853           if (!nB)
41854             continue;
41855           segment1 = [n1.loc, n2.loc];
41856           segment2 = [nA.loc, nB.loc];
41857           var point2 = geoLineIntersection(segment1, segment2);
41858           if (point2) {
41859             edgeCrossInfos.push({
41860               wayInfos: [
41861                 {
41862                   way: way1,
41863                   featureType: way1FeatureType,
41864                   edge: [n1.id, n2.id]
41865                 },
41866                 {
41867                   way: way2,
41868                   featureType: way2FeatureType,
41869                   edge: [nA.id, nB.id]
41870                 }
41871               ],
41872               crossPoint: point2
41873             });
41874             if (oneOnly) {
41875               checkedSingleCrossingWays[way2.id] = true;
41876               break;
41877             }
41878           }
41879         }
41880       }
41881       return edgeCrossInfos;
41882     }
41883     function waysToCheck(entity, graph) {
41884       var featureType = getFeatureType(entity, graph);
41885       if (!featureType)
41886         return [];
41887       if (entity.type === "way") {
41888         return [entity];
41889       } else if (entity.type === "relation") {
41890         return entity.members.reduce(function(array2, member) {
41891           if (member.type === "way" && // only look at geometry ways
41892           (!member.role || member.role === "outer" || member.role === "inner")) {
41893             var entity2 = graph.hasEntity(member.id);
41894             if (entity2 && array2.indexOf(entity2) === -1) {
41895               array2.push(entity2);
41896             }
41897           }
41898           return array2;
41899         }, []);
41900       }
41901       return [];
41902     }
41903     var validation = function checkCrossingWays(entity, graph) {
41904       var tree = context.history().tree();
41905       var ways = waysToCheck(entity, graph);
41906       var issues = [];
41907       var wayIndex, crossingIndex, crossings;
41908       for (wayIndex in ways) {
41909         crossings = findCrossingsByWay(ways[wayIndex], graph, tree);
41910         for (crossingIndex in crossings) {
41911           issues.push(createIssue(crossings[crossingIndex], graph));
41912         }
41913       }
41914       return issues;
41915     };
41916     function createIssue(crossing, graph) {
41917       crossing.wayInfos.sort(function(way1Info, way2Info) {
41918         var type1 = way1Info.featureType;
41919         var type22 = way2Info.featureType;
41920         if (type1 === type22) {
41921           return utilDisplayLabel(way1Info.way, graph) > utilDisplayLabel(way2Info.way, graph);
41922         } else if (type1 === "waterway") {
41923           return true;
41924         } else if (type22 === "waterway") {
41925           return false;
41926         }
41927         return type1 < type22;
41928       });
41929       var entities = crossing.wayInfos.map(function(wayInfo) {
41930         return getFeatureWithFeatureTypeTagsForWay(wayInfo.way, graph);
41931       });
41932       var edges = [crossing.wayInfos[0].edge, crossing.wayInfos[1].edge];
41933       var featureTypes = [crossing.wayInfos[0].featureType, crossing.wayInfos[1].featureType];
41934       var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph);
41935       var featureType1 = crossing.wayInfos[0].featureType;
41936       var featureType2 = crossing.wayInfos[1].featureType;
41937       var isCrossingIndoors = taggedAsIndoor(entities[0].tags) && taggedAsIndoor(entities[1].tags);
41938       var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, "tunnel") && allowsTunnel(featureType2) && hasTag(entities[1].tags, "tunnel");
41939       var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, "bridge") && allowsBridge(featureType2) && hasTag(entities[1].tags, "bridge");
41940       var subtype = [featureType1, featureType2].sort().join("-");
41941       var crossingTypeID = subtype;
41942       if (isCrossingIndoors) {
41943         crossingTypeID = "indoor-indoor";
41944       } else if (isCrossingTunnels) {
41945         crossingTypeID = "tunnel-tunnel";
41946       } else if (isCrossingBridges) {
41947         crossingTypeID = "bridge-bridge";
41948       }
41949       if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
41950         crossingTypeID += "_connectable";
41951       }
41952       var uniqueID = crossing.crossPoint[0].toFixed(4) + "," + crossing.crossPoint[1].toFixed(4);
41953       return new validationIssue({
41954         type: type2,
41955         subtype,
41956         severity: "warning",
41957         message: function(context2) {
41958           var graph2 = context2.graph();
41959           var entity1 = graph2.hasEntity(this.entityIds[0]), entity2 = graph2.hasEntity(this.entityIds[1]);
41960           return entity1 && entity2 ? _t.append("issues.crossing_ways.message", {
41961             feature: utilDisplayLabel(entity1, graph2),
41962             feature2: utilDisplayLabel(entity2, graph2)
41963           }) : "";
41964         },
41965         reference: showReference,
41966         entityIds: entities.map(function(entity) {
41967           return entity.id;
41968         }),
41969         data: {
41970           edges,
41971           featureTypes,
41972           connectionTags
41973         },
41974         hash: uniqueID,
41975         loc: crossing.crossPoint,
41976         dynamicFixes: function(context2) {
41977           var mode = context2.mode();
41978           if (!mode || mode.id !== "select" || mode.selectedIDs().length !== 1)
41979             return [];
41980           var selectedIndex = this.entityIds[0] === mode.selectedIDs()[0] ? 0 : 1;
41981           var selectedFeatureType = this.data.featureTypes[selectedIndex];
41982           var otherFeatureType = this.data.featureTypes[selectedIndex === 0 ? 1 : 0];
41983           var fixes = [];
41984           if (connectionTags) {
41985             fixes.push(makeConnectWaysFix(this.data.connectionTags));
41986             let lessLikelyConnectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1], graph, true);
41987             if (lessLikelyConnectionTags && !(0, import_lodash3.isEqual)(connectionTags, lessLikelyConnectionTags)) {
41988               fixes.push(makeConnectWaysFix(lessLikelyConnectionTags));
41989             }
41990           }
41991           if (isCrossingIndoors) {
41992             fixes.push(new validationIssueFix({
41993               icon: "iD-icon-layers",
41994               title: _t.append("issues.fix.use_different_levels.title")
41995             }));
41996           } else if (isCrossingTunnels || isCrossingBridges || featureType1 === "building" || featureType2 === "building") {
41997             fixes.push(makeChangeLayerFix("higher"));
41998             fixes.push(makeChangeLayerFix("lower"));
41999           } else if (context2.graph().geometry(this.entityIds[0]) === "line" && context2.graph().geometry(this.entityIds[1]) === "line") {
42000             if (allowsBridge(selectedFeatureType) && selectedFeatureType !== "waterway") {
42001               fixes.push(makeAddBridgeOrTunnelFix("add_a_bridge", "temaki-bridge", "bridge"));
42002             }
42003             var skipTunnelFix = otherFeatureType === "waterway" && selectedFeatureType !== "waterway";
42004             if (allowsTunnel(selectedFeatureType) && !skipTunnelFix) {
42005               fixes.push(makeAddBridgeOrTunnelFix("add_a_tunnel", "temaki-tunnel", "tunnel"));
42006             }
42007           }
42008           fixes.push(new validationIssueFix({
42009             icon: "iD-operation-move",
42010             title: _t.append("issues.fix.reposition_features.title")
42011           }));
42012           return fixes;
42013         }
42014       });
42015       function showReference(selection2) {
42016         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.crossing_ways." + crossingTypeID + ".reference"));
42017       }
42018     }
42019     function makeAddBridgeOrTunnelFix(fixTitleID, iconName, bridgeOrTunnel) {
42020       return new validationIssueFix({
42021         icon: iconName,
42022         title: _t.append("issues.fix." + fixTitleID + ".title"),
42023         onClick: function(context2) {
42024           var mode = context2.mode();
42025           if (!mode || mode.id !== "select")
42026             return;
42027           var selectedIDs = mode.selectedIDs();
42028           if (selectedIDs.length !== 1)
42029             return;
42030           var selectedWayID = selectedIDs[0];
42031           if (!context2.hasEntity(selectedWayID))
42032             return;
42033           var resultWayIDs = [selectedWayID];
42034           var edge, crossedEdge, crossedWayID;
42035           if (this.issue.entityIds[0] === selectedWayID) {
42036             edge = this.issue.data.edges[0];
42037             crossedEdge = this.issue.data.edges[1];
42038             crossedWayID = this.issue.entityIds[1];
42039           } else {
42040             edge = this.issue.data.edges[1];
42041             crossedEdge = this.issue.data.edges[0];
42042             crossedWayID = this.issue.entityIds[0];
42043           }
42044           var crossingLoc = this.issue.loc;
42045           var projection2 = context2.projection;
42046           var action = function actionAddStructure(graph) {
42047             var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
42048             var crossedWay = graph.hasEntity(crossedWayID);
42049             var structLengthMeters = crossedWay && isFinite(crossedWay.tags.width) && Number(crossedWay.tags.width);
42050             if (!structLengthMeters) {
42051               structLengthMeters = crossedWay && crossedWay.impliedLineWidthMeters();
42052             }
42053             if (structLengthMeters) {
42054               if (getFeatureType(crossedWay, graph) === "railway") {
42055                 structLengthMeters *= 2;
42056               }
42057             } else {
42058               structLengthMeters = 8;
42059             }
42060             var a1 = geoAngle(edgeNodes[0], edgeNodes[1], projection2) + Math.PI;
42061             var a2 = geoAngle(graph.entity(crossedEdge[0]), graph.entity(crossedEdge[1]), projection2) + Math.PI;
42062             var crossingAngle = Math.max(a1, a2) - Math.min(a1, a2);
42063             if (crossingAngle > Math.PI)
42064               crossingAngle -= Math.PI;
42065             structLengthMeters = structLengthMeters / 2 / Math.sin(crossingAngle) * 2;
42066             structLengthMeters += 4;
42067             structLengthMeters = Math.min(Math.max(structLengthMeters, 4), 50);
42068             function geomToProj(geoPoint) {
42069               return [
42070                 geoLonToMeters(geoPoint[0], geoPoint[1]),
42071                 geoLatToMeters(geoPoint[1])
42072               ];
42073             }
42074             function projToGeom(projPoint) {
42075               var lat = geoMetersToLat(projPoint[1]);
42076               return [
42077                 geoMetersToLon(projPoint[0], lat),
42078                 lat
42079               ];
42080             }
42081             var projEdgeNode1 = geomToProj(edgeNodes[0].loc);
42082             var projEdgeNode2 = geomToProj(edgeNodes[1].loc);
42083             var projectedAngle = geoVecAngle(projEdgeNode1, projEdgeNode2);
42084             var projectedCrossingLoc = geomToProj(crossingLoc);
42085             var linearToSphericalMetersRatio = geoVecLength(projEdgeNode1, projEdgeNode2) / geoSphericalDistance(edgeNodes[0].loc, edgeNodes[1].loc);
42086             function locSphericalDistanceFromCrossingLoc(angle2, distanceMeters) {
42087               var lengthSphericalMeters = distanceMeters * linearToSphericalMetersRatio;
42088               return projToGeom([
42089                 projectedCrossingLoc[0] + Math.cos(angle2) * lengthSphericalMeters,
42090                 projectedCrossingLoc[1] + Math.sin(angle2) * lengthSphericalMeters
42091               ]);
42092             }
42093             var endpointLocGetter1 = function(lengthMeters) {
42094               return locSphericalDistanceFromCrossingLoc(projectedAngle, lengthMeters);
42095             };
42096             var endpointLocGetter2 = function(lengthMeters) {
42097               return locSphericalDistanceFromCrossingLoc(projectedAngle + Math.PI, lengthMeters);
42098             };
42099             var minEdgeLengthMeters = 0.55;
42100             function determineEndpoint(edge2, endNode, locGetter) {
42101               var newNode;
42102               var idealLengthMeters = structLengthMeters / 2;
42103               var crossingToEdgeEndDistance = geoSphericalDistance(crossingLoc, endNode.loc);
42104               if (crossingToEdgeEndDistance - idealLengthMeters > minEdgeLengthMeters) {
42105                 var idealNodeLoc = locGetter(idealLengthMeters);
42106                 newNode = osmNode();
42107                 graph = actionAddMidpoint({ loc: idealNodeLoc, edge: edge2 }, newNode)(graph);
42108               } else {
42109                 var edgeCount = 0;
42110                 endNode.parentIntersectionWays(graph).forEach(function(way) {
42111                   way.nodes.forEach(function(nodeID) {
42112                     if (nodeID === endNode.id) {
42113                       if (endNode.id === way.first() && endNode.id !== way.last() || endNode.id === way.last() && endNode.id !== way.first()) {
42114                         edgeCount += 1;
42115                       } else {
42116                         edgeCount += 2;
42117                       }
42118                     }
42119                   });
42120                 });
42121                 if (edgeCount >= 3) {
42122                   var insetLength = crossingToEdgeEndDistance - minEdgeLengthMeters;
42123                   if (insetLength > minEdgeLengthMeters) {
42124                     var insetNodeLoc = locGetter(insetLength);
42125                     newNode = osmNode();
42126                     graph = actionAddMidpoint({ loc: insetNodeLoc, edge: edge2 }, newNode)(graph);
42127                   }
42128                 }
42129               }
42130               if (!newNode)
42131                 newNode = endNode;
42132               var splitAction = actionSplit([newNode.id]).limitWays(resultWayIDs);
42133               graph = splitAction(graph);
42134               if (splitAction.getCreatedWayIDs().length) {
42135                 resultWayIDs.push(splitAction.getCreatedWayIDs()[0]);
42136               }
42137               return newNode;
42138             }
42139             var structEndNode1 = determineEndpoint(edge, edgeNodes[1], endpointLocGetter1);
42140             var structEndNode2 = determineEndpoint([edgeNodes[0].id, structEndNode1.id], edgeNodes[0], endpointLocGetter2);
42141             var structureWay = resultWayIDs.map(function(id2) {
42142               return graph.entity(id2);
42143             }).find(function(way) {
42144               return way.nodes.indexOf(structEndNode1.id) !== -1 && way.nodes.indexOf(structEndNode2.id) !== -1;
42145             });
42146             var tags = Object.assign({}, structureWay.tags);
42147             if (bridgeOrTunnel === "bridge") {
42148               tags.bridge = "yes";
42149               tags.layer = "1";
42150             } else {
42151               var tunnelValue = "yes";
42152               if (getFeatureType(structureWay, graph) === "waterway") {
42153                 tunnelValue = "culvert";
42154               }
42155               tags.tunnel = tunnelValue;
42156               tags.layer = "-1";
42157             }
42158             graph = actionChangeTags(structureWay.id, tags)(graph);
42159             return graph;
42160           };
42161           context2.perform(action, _t("issues.fix." + fixTitleID + ".annotation"));
42162           context2.enter(modeSelect(context2, resultWayIDs));
42163         }
42164       });
42165     }
42166     function makeConnectWaysFix(connectionTags) {
42167       var fixTitleID = "connect_features";
42168       var fixIcon = "iD-icon-crossing";
42169       if (connectionTags.highway === "crossing") {
42170         fixTitleID = "connect_using_crossing";
42171         fixIcon = "temaki-pedestrian";
42172       }
42173       if (connectionTags.ford) {
42174         fixTitleID = "connect_using_ford";
42175         fixIcon = "roentgen-ford";
42176       }
42177       const fix = new validationIssueFix({
42178         icon: fixIcon,
42179         title: _t.append("issues.fix." + fixTitleID + ".title"),
42180         onClick: function(context2) {
42181           var loc = this.issue.loc;
42182           var edges = this.issue.data.edges;
42183           context2.perform(
42184             function actionConnectCrossingWays(graph) {
42185               var node = osmNode({ loc, tags: connectionTags });
42186               graph = graph.replace(node);
42187               var nodesToMerge = [node.id];
42188               var mergeThresholdInMeters = 0.75;
42189               edges.forEach(function(edge) {
42190                 var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
42191                 var nearby = geoSphericalClosestNode(edgeNodes, loc);
42192                 if ((!nearby.node.hasInterestingTags() || nearby.node.isCrossing()) && nearby.distance < mergeThresholdInMeters) {
42193                   nodesToMerge.push(nearby.node.id);
42194                 } else {
42195                   graph = actionAddMidpoint({ loc, edge }, node)(graph);
42196                 }
42197               });
42198               if (nodesToMerge.length > 1) {
42199                 graph = actionMergeNodes(nodesToMerge, loc)(graph);
42200               }
42201               return graph;
42202             },
42203             _t("issues.fix.connect_crossing_features.annotation")
42204           );
42205         }
42206       });
42207       fix._connectionTags = connectionTags;
42208       return fix;
42209     }
42210     function makeChangeLayerFix(higherOrLower) {
42211       return new validationIssueFix({
42212         icon: "iD-icon-" + (higherOrLower === "higher" ? "up" : "down"),
42213         title: _t.append("issues.fix.tag_this_as_" + higherOrLower + ".title"),
42214         onClick: function(context2) {
42215           var mode = context2.mode();
42216           if (!mode || mode.id !== "select")
42217             return;
42218           var selectedIDs = mode.selectedIDs();
42219           if (selectedIDs.length !== 1)
42220             return;
42221           var selectedID = selectedIDs[0];
42222           if (!this.issue.entityIds.some(function(entityId) {
42223             return entityId === selectedID;
42224           }))
42225             return;
42226           var entity = context2.hasEntity(selectedID);
42227           if (!entity)
42228             return;
42229           var tags = Object.assign({}, entity.tags);
42230           var layer = tags.layer && Number(tags.layer);
42231           if (layer && !isNaN(layer)) {
42232             if (higherOrLower === "higher") {
42233               layer += 1;
42234             } else {
42235               layer -= 1;
42236             }
42237           } else {
42238             if (higherOrLower === "higher") {
42239               layer = 1;
42240             } else {
42241               layer = -1;
42242             }
42243           }
42244           tags.layer = layer.toString();
42245           context2.perform(
42246             actionChangeTags(entity.id, tags),
42247             _t("operations.change_tags.annotation")
42248           );
42249         }
42250       });
42251     }
42252     validation.type = type2;
42253     return validation;
42254   }
42255
42256   // modules/behavior/draw_way.js
42257   function behaviorDrawWay(context, wayID, mode, startGraph) {
42258     const keybinding = utilKeybinding("drawWay");
42259     var dispatch10 = dispatch_default("rejectedSelfIntersection");
42260     var behavior = behaviorDraw(context);
42261     var _nodeIndex;
42262     var _origWay;
42263     var _wayGeometry;
42264     var _headNodeID;
42265     var _annotation;
42266     var _pointerHasMoved = false;
42267     var _drawNode;
42268     var _didResolveTempEdit = false;
42269     function createDrawNode(loc) {
42270       _drawNode = osmNode({ loc });
42271       context.pauseChangeDispatch();
42272       context.replace(function actionAddDrawNode(graph) {
42273         var way = graph.entity(wayID);
42274         return graph.replace(_drawNode).replace(way.addNode(_drawNode.id, _nodeIndex));
42275       }, _annotation);
42276       context.resumeChangeDispatch();
42277       setActiveElements();
42278     }
42279     function removeDrawNode() {
42280       context.pauseChangeDispatch();
42281       context.replace(
42282         function actionDeleteDrawNode(graph) {
42283           var way = graph.entity(wayID);
42284           return graph.replace(way.removeNode(_drawNode.id)).remove(_drawNode);
42285         },
42286         _annotation
42287       );
42288       _drawNode = void 0;
42289       context.resumeChangeDispatch();
42290     }
42291     function keydown(d3_event) {
42292       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
42293         if (context.surface().classed("nope")) {
42294           context.surface().classed("nope-suppressed", true);
42295         }
42296         context.surface().classed("nope", false).classed("nope-disabled", true);
42297       }
42298     }
42299     function keyup(d3_event) {
42300       if (d3_event.keyCode === utilKeybinding.modifierCodes.alt) {
42301         if (context.surface().classed("nope-suppressed")) {
42302           context.surface().classed("nope", true);
42303         }
42304         context.surface().classed("nope-suppressed", false).classed("nope-disabled", false);
42305       }
42306     }
42307     function allowsVertex(d) {
42308       return d.geometry(context.graph()) === "vertex" || _mainPresetIndex.allowsVertex(d, context.graph());
42309     }
42310     function move(d3_event, datum2) {
42311       var loc = context.map().mouseCoordinates();
42312       if (!_drawNode)
42313         createDrawNode(loc);
42314       context.surface().classed("nope-disabled", d3_event.altKey);
42315       var targetLoc = datum2 && datum2.properties && datum2.properties.entity && allowsVertex(datum2.properties.entity) && datum2.properties.entity.loc;
42316       var targetNodes = datum2 && datum2.properties && datum2.properties.nodes;
42317       if (targetLoc) {
42318         loc = targetLoc;
42319       } else if (targetNodes) {
42320         var choice = geoChooseEdge(targetNodes, context.map().mouse(), context.projection, _drawNode.id);
42321         if (choice) {
42322           loc = choice.loc;
42323         }
42324       }
42325       context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
42326       _drawNode = context.entity(_drawNode.id);
42327       checkGeometry(
42328         true
42329         /* includeDrawNode */
42330       );
42331     }
42332     function checkGeometry(includeDrawNode) {
42333       var nopeDisabled = context.surface().classed("nope-disabled");
42334       var isInvalid = isInvalidGeometry(includeDrawNode);
42335       if (nopeDisabled) {
42336         context.surface().classed("nope", false).classed("nope-suppressed", isInvalid);
42337       } else {
42338         context.surface().classed("nope", isInvalid).classed("nope-suppressed", false);
42339       }
42340     }
42341     function isInvalidGeometry(includeDrawNode) {
42342       var testNode = _drawNode;
42343       var parentWay = context.graph().entity(wayID);
42344       var nodes = context.graph().childNodes(parentWay).slice();
42345       if (includeDrawNode) {
42346         if (parentWay.isClosed()) {
42347           nodes.pop();
42348         }
42349       } else {
42350         if (parentWay.isClosed()) {
42351           if (nodes.length < 3)
42352             return false;
42353           if (_drawNode)
42354             nodes.splice(-2, 1);
42355           testNode = nodes[nodes.length - 2];
42356         } else {
42357           return false;
42358         }
42359       }
42360       return testNode && geoHasSelfIntersections(nodes, testNode.id);
42361     }
42362     function undone() {
42363       _didResolveTempEdit = true;
42364       context.pauseChangeDispatch();
42365       var nextMode;
42366       if (context.graph() === startGraph) {
42367         nextMode = modeSelect(context, [wayID]);
42368       } else {
42369         context.pop(1);
42370         nextMode = mode;
42371       }
42372       context.perform(actionNoop());
42373       context.pop(1);
42374       context.resumeChangeDispatch();
42375       context.enter(nextMode);
42376     }
42377     function setActiveElements() {
42378       if (!_drawNode)
42379         return;
42380       context.surface().selectAll("." + _drawNode.id).classed("active", true);
42381     }
42382     function resetToStartGraph() {
42383       while (context.graph() !== startGraph) {
42384         context.pop();
42385       }
42386     }
42387     var drawWay = function(surface) {
42388       _drawNode = void 0;
42389       _didResolveTempEdit = false;
42390       _origWay = context.entity(wayID);
42391       if (typeof _nodeIndex === "number") {
42392         _headNodeID = _origWay.nodes[_nodeIndex];
42393       } else if (_origWay.isClosed()) {
42394         _headNodeID = _origWay.nodes[_origWay.nodes.length - 2];
42395       } else {
42396         _headNodeID = _origWay.nodes[_origWay.nodes.length - 1];
42397       }
42398       _wayGeometry = _origWay.geometry(context.graph());
42399       _annotation = _t(
42400         (_origWay.nodes.length === (_origWay.isClosed() ? 2 : 1) ? "operations.start.annotation." : "operations.continue.annotation.") + _wayGeometry
42401       );
42402       _pointerHasMoved = false;
42403       context.pauseChangeDispatch();
42404       context.perform(actionNoop(), _annotation);
42405       context.resumeChangeDispatch();
42406       behavior.hover().initialNodeID(_headNodeID);
42407       behavior.on("move", function() {
42408         _pointerHasMoved = true;
42409         move.apply(this, arguments);
42410       }).on("down", function() {
42411         move.apply(this, arguments);
42412       }).on("downcancel", function() {
42413         if (_drawNode)
42414           removeDrawNode();
42415       }).on("click", drawWay.add).on("clickWay", drawWay.addWay).on("clickNode", drawWay.addNode).on("undo", context.undo).on("cancel", drawWay.cancel).on("finish", drawWay.finish);
42416       select_default2(window).on("keydown.drawWay", keydown).on("keyup.drawWay", keyup);
42417       context.map().dblclickZoomEnable(false).on("drawn.draw", setActiveElements);
42418       setActiveElements();
42419       surface.call(behavior);
42420       context.history().on("undone.draw", undone);
42421     };
42422     drawWay.off = function(surface) {
42423       if (!_didResolveTempEdit) {
42424         context.pauseChangeDispatch();
42425         resetToStartGraph();
42426         context.resumeChangeDispatch();
42427       }
42428       _drawNode = void 0;
42429       _nodeIndex = void 0;
42430       context.map().on("drawn.draw", null);
42431       surface.call(behavior.off).selectAll(".active").classed("active", false);
42432       surface.classed("nope", false).classed("nope-suppressed", false).classed("nope-disabled", false);
42433       select_default2(window).on("keydown.drawWay", null).on("keyup.drawWay", null);
42434       context.history().on("undone.draw", null);
42435     };
42436     function attemptAdd(d, loc, doAdd) {
42437       if (_drawNode) {
42438         context.replace(actionMoveNode(_drawNode.id, loc), _annotation);
42439         _drawNode = context.entity(_drawNode.id);
42440       } else {
42441         createDrawNode(loc);
42442       }
42443       checkGeometry(
42444         true
42445         /* includeDrawNode */
42446       );
42447       if (d && d.properties && d.properties.nope || context.surface().classed("nope")) {
42448         if (!_pointerHasMoved) {
42449           removeDrawNode();
42450         }
42451         dispatch10.call("rejectedSelfIntersection", this);
42452         return;
42453       }
42454       context.pauseChangeDispatch();
42455       doAdd();
42456       _didResolveTempEdit = true;
42457       context.resumeChangeDispatch();
42458       context.enter(mode);
42459     }
42460     drawWay.add = function(loc, d) {
42461       attemptAdd(d, loc, function() {
42462       });
42463     };
42464     drawWay.addWay = function(loc, edge, d) {
42465       attemptAdd(d, loc, function() {
42466         context.replace(
42467           actionAddMidpoint({ loc, edge }, _drawNode),
42468           _annotation
42469         );
42470       });
42471     };
42472     drawWay.addNode = function(node, d) {
42473       if (node.id === _headNodeID || // or the first node when drawing an area
42474       _origWay.isClosed() && node.id === _origWay.first()) {
42475         drawWay.finish();
42476         return;
42477       }
42478       attemptAdd(d, node.loc, function() {
42479         context.replace(
42480           function actionReplaceDrawNode(graph) {
42481             graph = graph.replace(graph.entity(wayID).removeNode(_drawNode.id)).remove(_drawNode);
42482             return graph.replace(graph.entity(wayID).addNode(node.id, _nodeIndex));
42483           },
42484           _annotation
42485         );
42486       });
42487     };
42488     function getFeatureType(ways) {
42489       if (ways.every((way) => way.isClosed()))
42490         return "area";
42491       if (ways.every((way) => !way.isClosed()))
42492         return "line";
42493       return "generic";
42494     }
42495     function followMode() {
42496       if (_didResolveTempEdit)
42497         return;
42498       try {
42499         const isDrawingArea = _origWay.nodes[0] === _origWay.nodes.slice(-1)[0];
42500         const [secondLastNodeId, lastNodeId] = _origWay.nodes.slice(isDrawingArea ? -3 : -2);
42501         const historyGraph = context.history().graph();
42502         if (!lastNodeId || !secondLastNodeId || !historyGraph.hasEntity(lastNodeId) || !historyGraph.hasEntity(secondLastNodeId)) {
42503           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("operations.follow.error.needs_more_initial_nodes"))();
42504           return;
42505         }
42506         const lastNodesParents = historyGraph.parentWays(historyGraph.entity(lastNodeId)).filter((w) => w.id !== wayID);
42507         const secondLastNodesParents = historyGraph.parentWays(historyGraph.entity(secondLastNodeId)).filter((w) => w.id !== wayID);
42508         const featureType = getFeatureType(lastNodesParents);
42509         if (lastNodesParents.length !== 1 || secondLastNodesParents.length === 0) {
42510           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(`operations.follow.error.intersection_of_multiple_ways.${featureType}`))();
42511           return;
42512         }
42513         if (!secondLastNodesParents.some((n2) => n2.id === lastNodesParents[0].id)) {
42514           context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append(`operations.follow.error.intersection_of_different_ways.${featureType}`))();
42515           return;
42516         }
42517         const way = lastNodesParents[0];
42518         const indexOfLast = way.nodes.indexOf(lastNodeId);
42519         const indexOfSecondLast = way.nodes.indexOf(secondLastNodeId);
42520         const isDescendingPastZero = indexOfLast === way.nodes.length - 2 && indexOfSecondLast === 0;
42521         let nextNodeIndex = indexOfLast + (indexOfLast > indexOfSecondLast && !isDescendingPastZero ? 1 : -1);
42522         if (nextNodeIndex === -1)
42523           nextNodeIndex = indexOfSecondLast === 1 ? way.nodes.length - 2 : 1;
42524         const nextNode = historyGraph.entity(way.nodes[nextNodeIndex]);
42525         drawWay.addNode(nextNode, {
42526           geometry: { type: "Point", coordinates: nextNode.loc },
42527           id: nextNode.id,
42528           properties: { target: true, entity: nextNode }
42529         });
42530       } catch (ex) {
42531         context.ui().flash.duration(4e3).iconName("#iD-icon-no").label(_t.append("operations.follow.error.unknown"))();
42532       }
42533     }
42534     keybinding.on(_t("operations.follow.key"), followMode);
42535     select_default2(document).call(keybinding);
42536     drawWay.finish = function() {
42537       checkGeometry(
42538         false
42539         /* includeDrawNode */
42540       );
42541       if (context.surface().classed("nope")) {
42542         dispatch10.call("rejectedSelfIntersection", this);
42543         return;
42544       }
42545       context.pauseChangeDispatch();
42546       context.pop(1);
42547       _didResolveTempEdit = true;
42548       context.resumeChangeDispatch();
42549       var way = context.hasEntity(wayID);
42550       if (!way || way.isDegenerate()) {
42551         drawWay.cancel();
42552         return;
42553       }
42554       window.setTimeout(function() {
42555         context.map().dblclickZoomEnable(true);
42556       }, 1e3);
42557       var isNewFeature = !mode.isContinuing;
42558       context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
42559     };
42560     drawWay.cancel = function() {
42561       context.pauseChangeDispatch();
42562       resetToStartGraph();
42563       context.resumeChangeDispatch();
42564       window.setTimeout(function() {
42565         context.map().dblclickZoomEnable(true);
42566       }, 1e3);
42567       context.surface().classed("nope", false).classed("nope-disabled", false).classed("nope-suppressed", false);
42568       context.enter(modeBrowse(context));
42569     };
42570     drawWay.nodeIndex = function(val) {
42571       if (!arguments.length)
42572         return _nodeIndex;
42573       _nodeIndex = val;
42574       return drawWay;
42575     };
42576     drawWay.activeID = function() {
42577       if (!arguments.length)
42578         return _drawNode && _drawNode.id;
42579       return drawWay;
42580     };
42581     return utilRebind(drawWay, dispatch10, "on");
42582   }
42583
42584   // modules/modes/draw_line.js
42585   function modeDrawLine(context, wayID, startGraph, button, affix, continuing) {
42586     var mode = {
42587       button,
42588       id: "draw-line"
42589     };
42590     var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on("rejectedSelfIntersection.modeDrawLine", function() {
42591       context.ui().flash.iconName("#iD-icon-no").label(_t.append("self_intersection.error.lines"))();
42592     });
42593     mode.wayID = wayID;
42594     mode.isContinuing = continuing;
42595     mode.enter = function() {
42596       behavior.nodeIndex(affix === "prefix" ? 0 : void 0);
42597       context.install(behavior);
42598     };
42599     mode.exit = function() {
42600       context.uninstall(behavior);
42601     };
42602     mode.selectedIDs = function() {
42603       return [wayID];
42604     };
42605     mode.activeID = function() {
42606       return behavior && behavior.activeID() || [];
42607     };
42608     return mode;
42609   }
42610
42611   // modules/validations/disconnected_way.js
42612   function validationDisconnectedWay() {
42613     var type2 = "disconnected_way";
42614     function isTaggedAsHighway(entity) {
42615       return osmRoutableHighwayTagValues[entity.tags.highway];
42616     }
42617     var validation = function checkDisconnectedWay(entity, graph) {
42618       var routingIslandWays = routingIslandForEntity(entity);
42619       if (!routingIslandWays)
42620         return [];
42621       return [new validationIssue({
42622         type: type2,
42623         subtype: "highway",
42624         severity: "warning",
42625         message: function(context) {
42626           var entity2 = this.entityIds.length && context.hasEntity(this.entityIds[0]);
42627           var label = entity2 && utilDisplayLabel(entity2, context.graph());
42628           return _t.append("issues.disconnected_way.routable.message", { count: this.entityIds.length, highway: label });
42629         },
42630         reference: showReference,
42631         entityIds: Array.from(routingIslandWays).map(function(way) {
42632           return way.id;
42633         }),
42634         dynamicFixes: makeFixes
42635       })];
42636       function makeFixes(context) {
42637         var fixes = [];
42638         var singleEntity = this.entityIds.length === 1 && context.hasEntity(this.entityIds[0]);
42639         if (singleEntity) {
42640           if (singleEntity.type === "way" && !singleEntity.isClosed()) {
42641             var textDirection = _mainLocalizer.textDirection();
42642             var startFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.first(), "start");
42643             if (startFix)
42644               fixes.push(startFix);
42645             var endFix = makeContinueDrawingFixIfAllowed(textDirection, singleEntity.last(), "end");
42646             if (endFix)
42647               fixes.push(endFix);
42648           }
42649           if (!fixes.length) {
42650             fixes.push(new validationIssueFix({
42651               title: _t.append("issues.fix.connect_feature.title")
42652             }));
42653           }
42654           fixes.push(new validationIssueFix({
42655             icon: "iD-operation-delete",
42656             title: _t.append("issues.fix.delete_feature.title"),
42657             entityIds: [singleEntity.id],
42658             onClick: function(context2) {
42659               var id2 = this.issue.entityIds[0];
42660               var operation = operationDelete(context2, [id2]);
42661               if (!operation.disabled()) {
42662                 operation();
42663               }
42664             }
42665           }));
42666         } else {
42667           fixes.push(new validationIssueFix({
42668             title: _t.append("issues.fix.connect_features.title")
42669           }));
42670         }
42671         return fixes;
42672       }
42673       function showReference(selection2) {
42674         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.disconnected_way.routable.reference"));
42675       }
42676       function routingIslandForEntity(entity2) {
42677         var routingIsland = /* @__PURE__ */ new Set();
42678         var waysToCheck = [];
42679         function queueParentWays(node) {
42680           graph.parentWays(node).forEach(function(parentWay) {
42681             if (!routingIsland.has(parentWay) && // only check each feature once
42682             isRoutableWay(parentWay, false)) {
42683               routingIsland.add(parentWay);
42684               waysToCheck.push(parentWay);
42685             }
42686           });
42687         }
42688         if (entity2.type === "way" && isRoutableWay(entity2, true)) {
42689           routingIsland.add(entity2);
42690           waysToCheck.push(entity2);
42691         } else if (entity2.type === "node" && isRoutableNode(entity2)) {
42692           routingIsland.add(entity2);
42693           queueParentWays(entity2);
42694         } else {
42695           return null;
42696         }
42697         while (waysToCheck.length) {
42698           var wayToCheck = waysToCheck.pop();
42699           var childNodes = graph.childNodes(wayToCheck);
42700           for (var i2 in childNodes) {
42701             var vertex = childNodes[i2];
42702             if (isConnectedVertex(vertex)) {
42703               return null;
42704             }
42705             if (isRoutableNode(vertex)) {
42706               routingIsland.add(vertex);
42707             }
42708             queueParentWays(vertex);
42709           }
42710         }
42711         return routingIsland;
42712       }
42713       function isConnectedVertex(vertex) {
42714         var osm = services.osm;
42715         if (osm && !osm.isDataLoaded(vertex.loc))
42716           return true;
42717         if (vertex.tags.entrance && vertex.tags.entrance !== "no")
42718           return true;
42719         if (vertex.tags.amenity === "parking_entrance")
42720           return true;
42721         return false;
42722       }
42723       function isRoutableNode(node) {
42724         if (node.tags.highway === "elevator")
42725           return true;
42726         return false;
42727       }
42728       function isRoutableWay(way, ignoreInnerWays) {
42729         if (isTaggedAsHighway(way) || way.tags.route === "ferry")
42730           return true;
42731         return graph.parentRelations(way).some(function(parentRelation) {
42732           if (parentRelation.tags.type === "route" && parentRelation.tags.route === "ferry")
42733             return true;
42734           if (parentRelation.isMultipolygon() && isTaggedAsHighway(parentRelation) && (!ignoreInnerWays || parentRelation.memberById(way.id).role !== "inner"))
42735             return true;
42736           return false;
42737         });
42738       }
42739       function makeContinueDrawingFixIfAllowed(textDirection, vertexID, whichEnd) {
42740         var vertex = graph.hasEntity(vertexID);
42741         if (!vertex || vertex.tags.noexit === "yes")
42742           return null;
42743         var useLeftContinue = whichEnd === "start" && textDirection === "ltr" || whichEnd === "end" && textDirection === "rtl";
42744         return new validationIssueFix({
42745           icon: "iD-operation-continue" + (useLeftContinue ? "-left" : ""),
42746           title: _t.append("issues.fix.continue_from_" + whichEnd + ".title"),
42747           entityIds: [vertexID],
42748           onClick: function(context) {
42749             var wayId = this.issue.entityIds[0];
42750             var way = context.hasEntity(wayId);
42751             var vertexId = this.entityIds[0];
42752             var vertex2 = context.hasEntity(vertexId);
42753             if (!way || !vertex2)
42754               return;
42755             var map2 = context.map();
42756             if (!context.editable() || !map2.trimmedExtent().contains(vertex2.loc)) {
42757               map2.zoomToEase(vertex2);
42758             }
42759             context.enter(
42760               modeDrawLine(context, wayId, context.graph(), "line", way.affix(vertexId), true)
42761             );
42762           }
42763         });
42764       }
42765     };
42766     validation.type = type2;
42767     return validation;
42768   }
42769
42770   // modules/validations/invalid_format.js
42771   function validationFormatting() {
42772     var type2 = "invalid_format";
42773     var validation = function(entity) {
42774       var issues = [];
42775       function isValidEmail(email) {
42776         var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i;
42777         return !email || valid_email.test(email);
42778       }
42779       function showReferenceEmail(selection2) {
42780         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.invalid_format.email.reference"));
42781       }
42782       if (entity.tags.email) {
42783         var emails = entity.tags.email.split(";").map(function(s) {
42784           return s.trim();
42785         }).filter(function(x) {
42786           return !isValidEmail(x);
42787         });
42788         if (emails.length) {
42789           issues.push(new validationIssue({
42790             type: type2,
42791             subtype: "email",
42792             severity: "warning",
42793             message: function(context) {
42794               var entity2 = context.hasEntity(this.entityIds[0]);
42795               return entity2 ? _t.append(
42796                 "issues.invalid_format.email.message" + this.data,
42797                 { feature: utilDisplayLabel(entity2, context.graph()), email: emails.join(", ") }
42798               ) : "";
42799             },
42800             reference: showReferenceEmail,
42801             entityIds: [entity.id],
42802             hash: emails.join(),
42803             data: emails.length > 1 ? "_multi" : ""
42804           }));
42805         }
42806       }
42807       return issues;
42808     };
42809     validation.type = type2;
42810     return validation;
42811   }
42812
42813   // modules/validations/help_request.js
42814   function validationHelpRequest(context) {
42815     var type2 = "help_request";
42816     var validation = function checkFixmeTag(entity) {
42817       if (!entity.tags.fixme)
42818         return [];
42819       if (entity.version === void 0)
42820         return [];
42821       if (entity.v !== void 0) {
42822         var baseEntity = context.history().base().hasEntity(entity.id);
42823         if (!baseEntity || !baseEntity.tags.fixme)
42824           return [];
42825       }
42826       return [new validationIssue({
42827         type: type2,
42828         subtype: "fixme_tag",
42829         severity: "warning",
42830         message: function(context2) {
42831           var entity2 = context2.hasEntity(this.entityIds[0]);
42832           return entity2 ? _t.append("issues.fixme_tag.message", {
42833             feature: utilDisplayLabel(
42834               entity2,
42835               context2.graph(),
42836               true
42837               /* verbose */
42838             )
42839           }) : "";
42840         },
42841         dynamicFixes: function() {
42842           return [
42843             new validationIssueFix({
42844               title: _t.append("issues.fix.address_the_concern.title")
42845             })
42846           ];
42847         },
42848         reference: showReference,
42849         entityIds: [entity.id]
42850       })];
42851       function showReference(selection2) {
42852         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.fixme_tag.reference"));
42853       }
42854     };
42855     validation.type = type2;
42856     return validation;
42857   }
42858
42859   // modules/validations/impossible_oneway.js
42860   function validationImpossibleOneway() {
42861     var type2 = "impossible_oneway";
42862     var validation = function checkImpossibleOneway(entity, graph) {
42863       if (entity.type !== "way" || entity.geometry(graph) !== "line")
42864         return [];
42865       if (entity.isClosed())
42866         return [];
42867       if (!typeForWay(entity))
42868         return [];
42869       if (!isOneway(entity))
42870         return [];
42871       var firstIssues = issuesForNode(entity, entity.first());
42872       var lastIssues = issuesForNode(entity, entity.last());
42873       return firstIssues.concat(lastIssues);
42874       function typeForWay(way) {
42875         if (way.geometry(graph) !== "line")
42876           return null;
42877         if (osmRoutableHighwayTagValues[way.tags.highway])
42878           return "highway";
42879         if (osmFlowingWaterwayTagValues[way.tags.waterway])
42880           return "waterway";
42881         return null;
42882       }
42883       function isOneway(way) {
42884         if (way.tags.oneway === "yes")
42885           return true;
42886         if (way.tags.oneway)
42887           return false;
42888         for (var key in way.tags) {
42889           if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
42890             return true;
42891           }
42892         }
42893         return false;
42894       }
42895       function nodeOccursMoreThanOnce(way, nodeID) {
42896         var occurrences = 0;
42897         for (var index in way.nodes) {
42898           if (way.nodes[index] === nodeID) {
42899             occurrences += 1;
42900             if (occurrences > 1)
42901               return true;
42902           }
42903         }
42904         return false;
42905       }
42906       function isConnectedViaOtherTypes(way, node) {
42907         var wayType = typeForWay(way);
42908         if (wayType === "highway") {
42909           if (node.tags.entrance && node.tags.entrance !== "no")
42910             return true;
42911           if (node.tags.amenity === "parking_entrance")
42912             return true;
42913         } else if (wayType === "waterway") {
42914           if (node.id === way.first()) {
42915             if (node.tags.natural === "spring")
42916               return true;
42917           } else {
42918             if (node.tags.manhole === "drain")
42919               return true;
42920           }
42921         }
42922         return graph.parentWays(node).some(function(parentWay) {
42923           if (parentWay.id === way.id)
42924             return false;
42925           if (wayType === "highway") {
42926             if (parentWay.geometry(graph) === "area" && osmRoutableHighwayTagValues[parentWay.tags.highway])
42927               return true;
42928             if (parentWay.tags.route === "ferry")
42929               return true;
42930             return graph.parentRelations(parentWay).some(function(parentRelation) {
42931               if (parentRelation.tags.type === "route" && parentRelation.tags.route === "ferry")
42932                 return true;
42933               return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
42934             });
42935           } else if (wayType === "waterway") {
42936             if (parentWay.tags.natural === "water" || parentWay.tags.natural === "coastline")
42937               return true;
42938           }
42939           return false;
42940         });
42941       }
42942       function issuesForNode(way, nodeID) {
42943         var isFirst = nodeID === way.first();
42944         var wayType = typeForWay(way);
42945         if (nodeOccursMoreThanOnce(way, nodeID))
42946           return [];
42947         var osm = services.osm;
42948         if (!osm)
42949           return [];
42950         var node = graph.hasEntity(nodeID);
42951         if (!node || !osm.isDataLoaded(node.loc))
42952           return [];
42953         if (isConnectedViaOtherTypes(way, node))
42954           return [];
42955         var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
42956           if (parentWay.id === way.id)
42957             return false;
42958           return typeForWay(parentWay) === wayType;
42959         });
42960         if (wayType === "waterway" && attachedWaysOfSameType.length === 0)
42961           return [];
42962         var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
42963           return isOneway(attachedWay);
42964         });
42965         if (attachedOneways.length < attachedWaysOfSameType.length)
42966           return [];
42967         if (attachedOneways.length) {
42968           var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
42969             if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID)
42970               return true;
42971             if (nodeOccursMoreThanOnce(attachedOneway, nodeID))
42972               return true;
42973             return false;
42974           });
42975           if (connectedEndpointsOkay)
42976             return [];
42977         }
42978         var placement = isFirst ? "start" : "end", messageID = wayType + ".", referenceID = wayType + ".";
42979         if (wayType === "waterway") {
42980           messageID += "connected." + placement;
42981           referenceID += "connected";
42982         } else {
42983           messageID += placement;
42984           referenceID += placement;
42985         }
42986         return [new validationIssue({
42987           type: type2,
42988           subtype: wayType,
42989           severity: "warning",
42990           message: function(context) {
42991             var entity2 = context.hasEntity(this.entityIds[0]);
42992             return entity2 ? _t.append("issues.impossible_oneway." + messageID + ".message", {
42993               feature: utilDisplayLabel(entity2, context.graph())
42994             }) : "";
42995           },
42996           reference: getReference(referenceID),
42997           entityIds: [way.id, node.id],
42998           dynamicFixes: function() {
42999             var fixes = [];
43000             if (attachedOneways.length) {
43001               fixes.push(new validationIssueFix({
43002                 icon: "iD-operation-reverse",
43003                 title: _t.append("issues.fix.reverse_feature.title"),
43004                 entityIds: [way.id],
43005                 onClick: function(context) {
43006                   var id2 = this.issue.entityIds[0];
43007                   context.perform(actionReverse(id2), _t("operations.reverse.annotation.line", { n: 1 }));
43008                 }
43009               }));
43010             }
43011             if (node.tags.noexit !== "yes") {
43012               var textDirection = _mainLocalizer.textDirection();
43013               var useLeftContinue = isFirst && textDirection === "ltr" || !isFirst && textDirection === "rtl";
43014               fixes.push(new validationIssueFix({
43015                 icon: "iD-operation-continue" + (useLeftContinue ? "-left" : ""),
43016                 title: _t.append("issues.fix.continue_from_" + (isFirst ? "start" : "end") + ".title"),
43017                 onClick: function(context) {
43018                   var entityID = this.issue.entityIds[0];
43019                   var vertexID = this.issue.entityIds[1];
43020                   var way2 = context.entity(entityID);
43021                   var vertex = context.entity(vertexID);
43022                   continueDrawing(way2, vertex, context);
43023                 }
43024               }));
43025             }
43026             return fixes;
43027           },
43028           loc: node.loc
43029         })];
43030         function getReference(referenceID2) {
43031           return function showReference(selection2) {
43032             selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.impossible_oneway." + referenceID2 + ".reference"));
43033           };
43034         }
43035       }
43036     };
43037     function continueDrawing(way, vertex, context) {
43038       var map2 = context.map();
43039       if (!context.editable() || !map2.trimmedExtent().contains(vertex.loc)) {
43040         map2.zoomToEase(vertex);
43041       }
43042       context.enter(
43043         modeDrawLine(context, way.id, context.graph(), "line", way.affix(vertex.id), true)
43044       );
43045     }
43046     validation.type = type2;
43047     return validation;
43048   }
43049
43050   // modules/validations/incompatible_source.js
43051   function validationIncompatibleSource() {
43052     const type2 = "incompatible_source";
43053     const incompatibleRules = [
43054       {
43055         id: "amap",
43056         regex: /(^amap$|^amap\.com|autonavi|mapabc|高德)/i
43057       },
43058       {
43059         id: "baidu",
43060         regex: /(baidu|mapbar|百度)/i
43061       },
43062       {
43063         id: "google",
43064         regex: /google/i,
43065         exceptRegex: /((books|drive)\.google|google\s?(books|drive|plus))|(esri\/Google_Africa_Buildings)/i
43066       }
43067     ];
43068     const validation = function checkIncompatibleSource(entity) {
43069       const entitySources = entity.tags && entity.tags.source && entity.tags.source.split(";");
43070       if (!entitySources)
43071         return [];
43072       const entityID = entity.id;
43073       return entitySources.map((source) => {
43074         const matchRule = incompatibleRules.find((rule) => {
43075           if (!rule.regex.test(source))
43076             return false;
43077           if (rule.exceptRegex && rule.exceptRegex.test(source))
43078             return false;
43079           return true;
43080         });
43081         if (!matchRule)
43082           return null;
43083         return new validationIssue({
43084           type: type2,
43085           severity: "warning",
43086           message: (context) => {
43087             const entity2 = context.hasEntity(entityID);
43088             return entity2 ? _t.append("issues.incompatible_source.feature.message", {
43089               feature: utilDisplayLabel(
43090                 entity2,
43091                 context.graph(),
43092                 true
43093                 /* verbose */
43094               ),
43095               value: source
43096             }) : "";
43097           },
43098           reference: getReference(matchRule.id),
43099           entityIds: [entityID],
43100           hash: source,
43101           dynamicFixes: () => {
43102             return [
43103               new validationIssueFix({ title: _t.append("issues.fix.remove_proprietary_data.title") })
43104             ];
43105           }
43106         });
43107       }).filter(Boolean);
43108       function getReference(id2) {
43109         return function showReference(selection2) {
43110           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append(`issues.incompatible_source.reference.${id2}`));
43111         };
43112       }
43113     };
43114     validation.type = type2;
43115     return validation;
43116   }
43117
43118   // modules/validations/maprules.js
43119   function validationMaprules() {
43120     var type2 = "maprules";
43121     var validation = function checkMaprules(entity, graph) {
43122       if (!services.maprules)
43123         return [];
43124       var rules = services.maprules.validationRules();
43125       var issues = [];
43126       for (var i2 = 0; i2 < rules.length; i2++) {
43127         var rule = rules[i2];
43128         rule.findIssues(entity, graph, issues);
43129       }
43130       return issues;
43131     };
43132     validation.type = type2;
43133     return validation;
43134   }
43135
43136   // modules/validations/mismatched_geometry.js
43137   var import_fast_deep_equal4 = __toESM(require_fast_deep_equal());
43138   function validationMismatchedGeometry() {
43139     var type2 = "mismatched_geometry";
43140     function tagSuggestingLineIsArea(entity) {
43141       if (entity.type !== "way" || entity.isClosed())
43142         return null;
43143       var tagSuggestingArea = entity.tagSuggestingArea();
43144       if (!tagSuggestingArea) {
43145         return null;
43146       }
43147       var asLine = _mainPresetIndex.matchTags(tagSuggestingArea, "line");
43148       var asArea = _mainPresetIndex.matchTags(tagSuggestingArea, "area");
43149       if (asLine && asArea && asLine === asArea) {
43150         return null;
43151       }
43152       return tagSuggestingArea;
43153     }
43154     function makeConnectEndpointsFixOnClick(way, graph) {
43155       if (way.nodes.length < 3)
43156         return null;
43157       var nodes = graph.childNodes(way), testNodes;
43158       var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length - 1].loc);
43159       if (firstToLastDistanceMeters < 0.75) {
43160         testNodes = nodes.slice();
43161         testNodes.pop();
43162         testNodes.push(testNodes[0]);
43163         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
43164           return function(context) {
43165             var way2 = context.entity(this.issue.entityIds[0]);
43166             context.perform(
43167               actionMergeNodes([way2.nodes[0], way2.nodes[way2.nodes.length - 1]], nodes[0].loc),
43168               _t("issues.fix.connect_endpoints.annotation")
43169             );
43170           };
43171         }
43172       }
43173       testNodes = nodes.slice();
43174       testNodes.push(testNodes[0]);
43175       if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
43176         return function(context) {
43177           var wayId = this.issue.entityIds[0];
43178           var way2 = context.entity(wayId);
43179           var nodeId = way2.nodes[0];
43180           var index = way2.nodes.length;
43181           context.perform(
43182             actionAddVertex(wayId, nodeId, index),
43183             _t("issues.fix.connect_endpoints.annotation")
43184           );
43185         };
43186       }
43187     }
43188     function lineTaggedAsAreaIssue(entity) {
43189       var tagSuggestingArea = tagSuggestingLineIsArea(entity);
43190       if (!tagSuggestingArea)
43191         return null;
43192       var validAsLine = false;
43193       var presetAsLine = _mainPresetIndex.matchTags(entity.tags, "line");
43194       if (presetAsLine) {
43195         validAsLine = true;
43196         var key = Object.keys(tagSuggestingArea)[0];
43197         if (presetAsLine.tags[key] && presetAsLine.tags[key] === "*") {
43198           validAsLine = false;
43199         }
43200         if (Object.keys(presetAsLine.tags).length === 0) {
43201           validAsLine = false;
43202         }
43203       }
43204       return new validationIssue({
43205         type: type2,
43206         subtype: "area_as_line",
43207         severity: "warning",
43208         message: function(context) {
43209           var entity2 = context.hasEntity(this.entityIds[0]);
43210           return entity2 ? _t.append("issues.tag_suggests_area.message", {
43211             feature: utilDisplayLabel(
43212               entity2,
43213               "area",
43214               true
43215               /* verbose */
43216             ),
43217             tag: utilTagText({ tags: tagSuggestingArea })
43218           }) : "";
43219         },
43220         reference: showReference,
43221         entityIds: [entity.id],
43222         hash: JSON.stringify(tagSuggestingArea),
43223         dynamicFixes: function(context) {
43224           var fixes = [];
43225           var entity2 = context.entity(this.entityIds[0]);
43226           var connectEndsOnClick = makeConnectEndpointsFixOnClick(entity2, context.graph());
43227           if (!validAsLine) {
43228             fixes.push(new validationIssueFix({
43229               title: _t.append("issues.fix.connect_endpoints.title"),
43230               onClick: connectEndsOnClick
43231             }));
43232           }
43233           fixes.push(new validationIssueFix({
43234             icon: "iD-operation-delete",
43235             title: _t.append("issues.fix.remove_tag.title"),
43236             onClick: function(context2) {
43237               var entityId = this.issue.entityIds[0];
43238               var entity3 = context2.entity(entityId);
43239               var tags = Object.assign({}, entity3.tags);
43240               for (var key2 in tagSuggestingArea) {
43241                 delete tags[key2];
43242               }
43243               context2.perform(
43244                 actionChangeTags(entityId, tags),
43245                 _t("issues.fix.remove_tag.annotation")
43246               );
43247             }
43248           }));
43249           return fixes;
43250         }
43251       });
43252       function showReference(selection2) {
43253         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.tag_suggests_area.reference"));
43254       }
43255     }
43256     function vertexPointIssue(entity, graph) {
43257       if (entity.type !== "node")
43258         return null;
43259       if (Object.keys(entity.tags).length === 0)
43260         return null;
43261       if (entity.isOnAddressLine(graph))
43262         return null;
43263       var geometry = entity.geometry(graph);
43264       var allowedGeometries = osmNodeGeometriesForTags(entity.tags);
43265       if (geometry === "point" && !allowedGeometries.point && allowedGeometries.vertex) {
43266         return new validationIssue({
43267           type: type2,
43268           subtype: "vertex_as_point",
43269           severity: "warning",
43270           message: function(context) {
43271             var entity2 = context.hasEntity(this.entityIds[0]);
43272             return entity2 ? _t.append("issues.vertex_as_point.message", {
43273               feature: utilDisplayLabel(
43274                 entity2,
43275                 "vertex",
43276                 true
43277                 /* verbose */
43278               )
43279             }) : "";
43280           },
43281           reference: function showReference(selection2) {
43282             selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.vertex_as_point.reference"));
43283           },
43284           entityIds: [entity.id]
43285         });
43286       } else if (geometry === "vertex" && !allowedGeometries.vertex && allowedGeometries.point) {
43287         return new validationIssue({
43288           type: type2,
43289           subtype: "point_as_vertex",
43290           severity: "warning",
43291           message: function(context) {
43292             var entity2 = context.hasEntity(this.entityIds[0]);
43293             return entity2 ? _t.append("issues.point_as_vertex.message", {
43294               feature: utilDisplayLabel(
43295                 entity2,
43296                 "point",
43297                 true
43298                 /* verbose */
43299               )
43300             }) : "";
43301           },
43302           reference: function showReference(selection2) {
43303             selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.point_as_vertex.reference"));
43304           },
43305           entityIds: [entity.id],
43306           dynamicFixes: extractPointDynamicFixes
43307         });
43308       }
43309       return null;
43310     }
43311     function otherMismatchIssue(entity, graph) {
43312       if (!entity.hasInterestingTags())
43313         return null;
43314       if (entity.type !== "node" && entity.type !== "way")
43315         return null;
43316       if (entity.type === "node" && entity.isOnAddressLine(graph))
43317         return null;
43318       var sourceGeom = entity.geometry(graph);
43319       var targetGeoms = entity.type === "way" ? ["point", "vertex"] : ["line", "area"];
43320       if (sourceGeom === "area")
43321         targetGeoms.unshift("line");
43322       var asSource = _mainPresetIndex.match(entity, graph);
43323       var targetGeom = targetGeoms.find((nodeGeom) => {
43324         var asTarget = _mainPresetIndex.matchTags(entity.tags, nodeGeom);
43325         if (!asSource || !asTarget || asSource === asTarget || // sometimes there are two presets with the same tags for different geometries
43326         (0, import_fast_deep_equal4.default)(asSource.tags, asTarget.tags))
43327           return false;
43328         if (asTarget.isFallback())
43329           return false;
43330         var primaryKey = Object.keys(asTarget.tags)[0];
43331         if (primaryKey === "building")
43332           return false;
43333         if (asTarget.tags[primaryKey] === "*")
43334           return false;
43335         return asSource.isFallback() || asSource.tags[primaryKey] === "*";
43336       });
43337       if (!targetGeom)
43338         return null;
43339       var subtype = targetGeom + "_as_" + sourceGeom;
43340       if (targetGeom === "vertex")
43341         targetGeom = "point";
43342       if (sourceGeom === "vertex")
43343         sourceGeom = "point";
43344       var referenceId = targetGeom + "_as_" + sourceGeom;
43345       var dynamicFixes;
43346       if (targetGeom === "point") {
43347         dynamicFixes = extractPointDynamicFixes;
43348       } else if (sourceGeom === "area" && targetGeom === "line") {
43349         dynamicFixes = lineToAreaDynamicFixes;
43350       }
43351       return new validationIssue({
43352         type: type2,
43353         subtype,
43354         severity: "warning",
43355         message: function(context) {
43356           var entity2 = context.hasEntity(this.entityIds[0]);
43357           return entity2 ? _t.append("issues." + referenceId + ".message", {
43358             feature: utilDisplayLabel(
43359               entity2,
43360               targetGeom,
43361               true
43362               /* verbose */
43363             )
43364           }) : "";
43365         },
43366         reference: function showReference(selection2) {
43367           selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.mismatched_geometry.reference"));
43368         },
43369         entityIds: [entity.id],
43370         dynamicFixes
43371       });
43372     }
43373     function lineToAreaDynamicFixes(context) {
43374       var convertOnClick;
43375       var entityId = this.entityIds[0];
43376       var entity = context.entity(entityId);
43377       var tags = Object.assign({}, entity.tags);
43378       delete tags.area;
43379       if (!osmTagSuggestingArea(tags)) {
43380         convertOnClick = function(context2) {
43381           var entityId2 = this.issue.entityIds[0];
43382           var entity2 = context2.entity(entityId2);
43383           var tags2 = Object.assign({}, entity2.tags);
43384           if (tags2.area) {
43385             delete tags2.area;
43386           }
43387           context2.perform(
43388             actionChangeTags(entityId2, tags2),
43389             _t("issues.fix.convert_to_line.annotation")
43390           );
43391         };
43392       }
43393       return [
43394         new validationIssueFix({
43395           icon: "iD-icon-line",
43396           title: _t.append("issues.fix.convert_to_line.title"),
43397           onClick: convertOnClick
43398         })
43399       ];
43400     }
43401     function extractPointDynamicFixes(context) {
43402       var entityId = this.entityIds[0];
43403       var extractOnClick = null;
43404       if (!context.hasHiddenConnections(entityId)) {
43405         extractOnClick = function(context2) {
43406           var entityId2 = this.issue.entityIds[0];
43407           var action = actionExtract(entityId2, context2.projection);
43408           context2.perform(
43409             action,
43410             _t("operations.extract.annotation", { n: 1 })
43411           );
43412           context2.enter(modeSelect(context2, [action.getExtractedNodeID()]));
43413         };
43414       }
43415       return [
43416         new validationIssueFix({
43417           icon: "iD-operation-extract",
43418           title: _t.append("issues.fix.extract_point.title"),
43419           onClick: extractOnClick
43420         })
43421       ];
43422     }
43423     function unclosedMultipolygonPartIssues(entity, graph) {
43424       if (entity.type !== "relation" || !entity.isMultipolygon() || entity.isDegenerate() || // cannot determine issues for incompletely-downloaded relations
43425       !entity.isComplete(graph))
43426         return [];
43427       var sequences = osmJoinWays(entity.members, graph);
43428       var issues = [];
43429       for (var i2 in sequences) {
43430         var sequence = sequences[i2];
43431         if (!sequence.nodes)
43432           continue;
43433         var firstNode = sequence.nodes[0];
43434         var lastNode = sequence.nodes[sequence.nodes.length - 1];
43435         if (firstNode === lastNode)
43436           continue;
43437         var issue = new validationIssue({
43438           type: type2,
43439           subtype: "unclosed_multipolygon_part",
43440           severity: "warning",
43441           message: function(context) {
43442             var entity2 = context.hasEntity(this.entityIds[0]);
43443             return entity2 ? _t.append("issues.unclosed_multipolygon_part.message", {
43444               feature: utilDisplayLabel(
43445                 entity2,
43446                 context.graph(),
43447                 true
43448                 /* verbose */
43449               )
43450             }) : "";
43451           },
43452           reference: showReference,
43453           loc: sequence.nodes[0].loc,
43454           entityIds: [entity.id],
43455           hash: sequence.map(function(way) {
43456             return way.id;
43457           }).join()
43458         });
43459         issues.push(issue);
43460       }
43461       return issues;
43462       function showReference(selection2) {
43463         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unclosed_multipolygon_part.reference"));
43464       }
43465     }
43466     var validation = function checkMismatchedGeometry(entity, graph) {
43467       var vertexPoint = vertexPointIssue(entity, graph);
43468       if (vertexPoint)
43469         return [vertexPoint];
43470       var lineAsArea = lineTaggedAsAreaIssue(entity);
43471       if (lineAsArea)
43472         return [lineAsArea];
43473       var mismatch = otherMismatchIssue(entity, graph);
43474       if (mismatch)
43475         return [mismatch];
43476       return unclosedMultipolygonPartIssues(entity, graph);
43477     };
43478     validation.type = type2;
43479     return validation;
43480   }
43481
43482   // modules/validations/missing_role.js
43483   function validationMissingRole() {
43484     var type2 = "missing_role";
43485     var validation = function checkMissingRole(entity, graph) {
43486       var issues = [];
43487       if (entity.type === "way") {
43488         graph.parentRelations(entity).forEach(function(relation) {
43489           if (!relation.isMultipolygon())
43490             return;
43491           var member = relation.memberById(entity.id);
43492           if (member && isMissingRole(member)) {
43493             issues.push(makeIssue(entity, relation, member));
43494           }
43495         });
43496       } else if (entity.type === "relation" && entity.isMultipolygon()) {
43497         entity.indexedMembers().forEach(function(member) {
43498           var way = graph.hasEntity(member.id);
43499           if (way && isMissingRole(member)) {
43500             issues.push(makeIssue(way, entity, member));
43501           }
43502         });
43503       }
43504       return issues;
43505     };
43506     function isMissingRole(member) {
43507       return !member.role || !member.role.trim().length;
43508     }
43509     function makeIssue(way, relation, member) {
43510       return new validationIssue({
43511         type: type2,
43512         severity: "warning",
43513         message: function(context) {
43514           var member2 = context.hasEntity(this.entityIds[1]), relation2 = context.hasEntity(this.entityIds[0]);
43515           return member2 && relation2 ? _t.append("issues.missing_role.message", {
43516             member: utilDisplayLabel(member2, context.graph()),
43517             relation: utilDisplayLabel(relation2, context.graph())
43518           }) : "";
43519         },
43520         reference: showReference,
43521         entityIds: [relation.id, way.id],
43522         data: {
43523           member
43524         },
43525         hash: member.index.toString(),
43526         dynamicFixes: function() {
43527           return [
43528             makeAddRoleFix("inner"),
43529             makeAddRoleFix("outer"),
43530             new validationIssueFix({
43531               icon: "iD-operation-delete",
43532               title: _t.append("issues.fix.remove_from_relation.title"),
43533               onClick: function(context) {
43534                 context.perform(
43535                   actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
43536                   _t("operations.delete_member.annotation", {
43537                     n: 1
43538                   })
43539                 );
43540               }
43541             })
43542           ];
43543         }
43544       });
43545       function showReference(selection2) {
43546         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.missing_role.multipolygon.reference"));
43547       }
43548     }
43549     function makeAddRoleFix(role) {
43550       return new validationIssueFix({
43551         title: _t.append("issues.fix.set_as_" + role + ".title"),
43552         onClick: function(context) {
43553           var oldMember = this.issue.data.member;
43554           var member = { id: this.issue.entityIds[1], type: oldMember.type, role };
43555           context.perform(
43556             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
43557             _t("operations.change_role.annotation", {
43558               n: 1
43559             })
43560           );
43561         }
43562       });
43563     }
43564     validation.type = type2;
43565     return validation;
43566   }
43567
43568   // modules/validations/missing_tag.js
43569   function validationMissingTag(context) {
43570     var type2 = "missing_tag";
43571     function hasDescriptiveTags(entity, graph) {
43572       var onlyAttributeKeys = ["description", "name", "note", "start_date"];
43573       var entityDescriptiveKeys = Object.keys(entity.tags).filter(function(k) {
43574         if (k === "area" || !osmIsInterestingTag(k))
43575           return false;
43576         return !onlyAttributeKeys.some(function(attributeKey) {
43577           return k === attributeKey || k.indexOf(attributeKey + ":") === 0;
43578         });
43579       });
43580       if (entity.type === "relation" && entityDescriptiveKeys.length === 1 && entity.tags.type === "multipolygon") {
43581         return osmOldMultipolygonOuterMemberOfRelation(entity, graph);
43582       }
43583       return entityDescriptiveKeys.length > 0;
43584     }
43585     function isUnknownRoad(entity) {
43586       return entity.type === "way" && entity.tags.highway === "road";
43587     }
43588     function isUntypedRelation(entity) {
43589       return entity.type === "relation" && !entity.tags.type;
43590     }
43591     var validation = function checkMissingTag(entity, graph) {
43592       var subtype;
43593       var osm = context.connection();
43594       var isUnloadedNode = entity.type === "node" && osm && !osm.isDataLoaded(entity.loc);
43595       if (!isUnloadedNode && // allow untagged nodes that are part of ways
43596       entity.geometry(graph) !== "vertex" && // allow untagged entities that are part of relations
43597       !entity.hasParentRelations(graph)) {
43598         if (Object.keys(entity.tags).length === 0) {
43599           subtype = "any";
43600         } else if (!hasDescriptiveTags(entity, graph)) {
43601           subtype = "descriptive";
43602         } else if (isUntypedRelation(entity)) {
43603           subtype = "relation_type";
43604         }
43605       }
43606       if (!subtype && isUnknownRoad(entity)) {
43607         subtype = "highway_classification";
43608       }
43609       if (!subtype)
43610         return [];
43611       var messageID = subtype === "highway_classification" ? "unknown_road" : "missing_tag." + subtype;
43612       var referenceID = subtype === "highway_classification" ? "unknown_road" : "missing_tag";
43613       var canDelete = entity.version === void 0 || entity.v !== void 0;
43614       var severity = canDelete && subtype !== "highway_classification" ? "error" : "warning";
43615       return [new validationIssue({
43616         type: type2,
43617         subtype,
43618         severity,
43619         message: function(context2) {
43620           var entity2 = context2.hasEntity(this.entityIds[0]);
43621           return entity2 ? _t.append("issues." + messageID + ".message", {
43622             feature: utilDisplayLabel(entity2, context2.graph())
43623           }) : "";
43624         },
43625         reference: showReference,
43626         entityIds: [entity.id],
43627         dynamicFixes: function(context2) {
43628           var fixes = [];
43629           var selectFixType = subtype === "highway_classification" ? "select_road_type" : "select_preset";
43630           fixes.push(new validationIssueFix({
43631             icon: "iD-icon-search",
43632             title: _t.append("issues.fix." + selectFixType + ".title"),
43633             onClick: function(context3) {
43634               context3.ui().sidebar.showPresetList();
43635             }
43636           }));
43637           var deleteOnClick;
43638           var id2 = this.entityIds[0];
43639           var operation = operationDelete(context2, [id2]);
43640           var disabledReasonID = operation.disabled();
43641           if (!disabledReasonID) {
43642             deleteOnClick = function(context3) {
43643               var id3 = this.issue.entityIds[0];
43644               var operation2 = operationDelete(context3, [id3]);
43645               if (!operation2.disabled()) {
43646                 operation2();
43647               }
43648             };
43649           }
43650           fixes.push(
43651             new validationIssueFix({
43652               icon: "iD-operation-delete",
43653               title: _t.append("issues.fix.delete_feature.title"),
43654               disabledReason: disabledReasonID ? _t("operations.delete." + disabledReasonID + ".single") : void 0,
43655               onClick: deleteOnClick
43656             })
43657           );
43658           return fixes;
43659         }
43660       })];
43661       function showReference(selection2) {
43662         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues." + referenceID + ".reference"));
43663       }
43664     };
43665     validation.type = type2;
43666     return validation;
43667   }
43668
43669   // modules/validations/outdated_tags.js
43670   function validationOutdatedTags() {
43671     const type2 = "outdated_tags";
43672     let _waitingForDeprecated = true;
43673     let _dataDeprecated;
43674     _mainFileFetcher.get("deprecated").then((d) => _dataDeprecated = d).catch(() => {
43675     }).finally(() => _waitingForDeprecated = false);
43676     function oldTagIssues(entity, graph) {
43677       if (!entity.hasInterestingTags())
43678         return [];
43679       let preset = _mainPresetIndex.match(entity, graph);
43680       if (!preset)
43681         return [];
43682       const oldTags = Object.assign({}, entity.tags);
43683       let subtype = "deprecated_tags";
43684       if (preset.replacement) {
43685         const newPreset = _mainPresetIndex.item(preset.replacement);
43686         graph = actionChangePreset(
43687           entity.id,
43688           preset,
43689           newPreset,
43690           true
43691           /* skip field defaults */
43692         )(graph);
43693         entity = graph.entity(entity.id);
43694         preset = newPreset;
43695       }
43696       if (_dataDeprecated) {
43697         const deprecatedTags = entity.deprecatedTags(_dataDeprecated);
43698         if (deprecatedTags.length) {
43699           deprecatedTags.forEach((tag) => {
43700             graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
43701           });
43702           entity = graph.entity(entity.id);
43703         }
43704       }
43705       let newTags = Object.assign({}, entity.tags);
43706       if (preset.tags !== preset.addTags) {
43707         Object.keys(preset.addTags).forEach((k) => {
43708           if (!newTags[k]) {
43709             if (preset.addTags[k] === "*") {
43710               newTags[k] = "yes";
43711             } else {
43712               newTags[k] = preset.addTags[k];
43713             }
43714           }
43715         });
43716       }
43717       const nsi = services.nsi;
43718       let waitingForNsi = false;
43719       let nsiResult;
43720       if (nsi) {
43721         waitingForNsi = nsi.status() === "loading";
43722         if (!waitingForNsi) {
43723           const loc = entity.extent(graph).center();
43724           nsiResult = nsi.upgradeTags(newTags, loc);
43725           if (nsiResult) {
43726             newTags = nsiResult.newTags;
43727             subtype = "noncanonical_brand";
43728           }
43729         }
43730       }
43731       let issues = [];
43732       issues.provisional = _waitingForDeprecated || waitingForNsi;
43733       const tagDiff = utilTagDiff(oldTags, newTags);
43734       if (!tagDiff.length)
43735         return issues;
43736       const isOnlyAddingTags = tagDiff.every((d) => d.type === "+");
43737       let prefix = "";
43738       if (nsiResult) {
43739         prefix = "noncanonical_brand.";
43740       } else if (subtype === "deprecated_tags" && isOnlyAddingTags) {
43741         subtype = "incomplete_tags";
43742         prefix = "incomplete.";
43743       }
43744       let autoArgs = subtype !== "noncanonical_brand" ? [doUpgrade, _t("issues.fix.upgrade_tags.annotation")] : null;
43745       issues.push(new validationIssue({
43746         type: type2,
43747         subtype,
43748         severity: "warning",
43749         message: showMessage,
43750         reference: showReference,
43751         entityIds: [entity.id],
43752         hash: utilHashcode(JSON.stringify(tagDiff)),
43753         dynamicFixes: () => {
43754           let fixes = [
43755             new validationIssueFix({
43756               autoArgs,
43757               title: _t.append("issues.fix.upgrade_tags.title"),
43758               onClick: (context) => {
43759                 context.perform(doUpgrade, _t("issues.fix.upgrade_tags.annotation"));
43760               }
43761             })
43762           ];
43763           const item = nsiResult && nsiResult.matched;
43764           if (item) {
43765             fixes.push(
43766               new validationIssueFix({
43767                 title: _t.append("issues.fix.tag_as_not.title", { name: item.displayName }),
43768                 onClick: (context) => {
43769                   context.perform(addNotTag, _t("issues.fix.tag_as_not.annotation"));
43770                 }
43771               })
43772             );
43773           }
43774           return fixes;
43775         }
43776       }));
43777       return issues;
43778       function doUpgrade(graph2) {
43779         const currEntity = graph2.hasEntity(entity.id);
43780         if (!currEntity)
43781           return graph2;
43782         let newTags2 = Object.assign({}, currEntity.tags);
43783         tagDiff.forEach((diff) => {
43784           if (diff.type === "-") {
43785             delete newTags2[diff.key];
43786           } else if (diff.type === "+") {
43787             newTags2[diff.key] = diff.newVal;
43788           }
43789         });
43790         return actionChangeTags(currEntity.id, newTags2)(graph2);
43791       }
43792       function addNotTag(graph2) {
43793         const currEntity = graph2.hasEntity(entity.id);
43794         if (!currEntity)
43795           return graph2;
43796         const item = nsiResult && nsiResult.matched;
43797         if (!item)
43798           return graph2;
43799         let newTags2 = Object.assign({}, currEntity.tags);
43800         const wd = item.mainTag;
43801         const notwd = `not:${wd}`;
43802         const qid = item.tags[wd];
43803         newTags2[notwd] = qid;
43804         if (newTags2[wd] === qid) {
43805           const wp = item.mainTag.replace("wikidata", "wikipedia");
43806           delete newTags2[wd];
43807           delete newTags2[wp];
43808         }
43809         return actionChangeTags(currEntity.id, newTags2)(graph2);
43810       }
43811       function showMessage(context) {
43812         const currEntity = context.hasEntity(entity.id);
43813         if (!currEntity)
43814           return "";
43815         let messageID = `issues.outdated_tags.${prefix}message`;
43816         if (subtype === "noncanonical_brand" && isOnlyAddingTags) {
43817           messageID += "_incomplete";
43818         }
43819         return _t.append(messageID, {
43820           feature: utilDisplayLabel(
43821             currEntity,
43822             context.graph(),
43823             true
43824             /* verbose */
43825           )
43826         });
43827       }
43828       function showReference(selection2) {
43829         let enter = selection2.selectAll(".issue-reference").data([0]).enter();
43830         enter.append("div").attr("class", "issue-reference").call(_t.append(`issues.outdated_tags.${prefix}reference`));
43831         enter.append("strong").call(_t.append("issues.suggested"));
43832         enter.append("table").attr("class", "tagDiff-table").selectAll(".tagDiff-row").data(tagDiff).enter().append("tr").attr("class", "tagDiff-row").append("td").attr("class", (d) => {
43833           let klass = d.type === "+" ? "add" : "remove";
43834           return `tagDiff-cell tagDiff-cell-${klass}`;
43835         }).html((d) => d.display);
43836       }
43837     }
43838     function oldMultipolygonIssues(entity, graph) {
43839       let multipolygon, outerWay;
43840       if (entity.type === "relation") {
43841         outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
43842         multipolygon = entity;
43843       } else if (entity.type === "way") {
43844         multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
43845         outerWay = entity;
43846       } else {
43847         return [];
43848       }
43849       if (!multipolygon || !outerWay)
43850         return [];
43851       return [new validationIssue({
43852         type: type2,
43853         subtype: "old_multipolygon",
43854         severity: "warning",
43855         message: showMessage,
43856         reference: showReference,
43857         entityIds: [outerWay.id, multipolygon.id],
43858         dynamicFixes: () => {
43859           return [
43860             new validationIssueFix({
43861               autoArgs: [doUpgrade, _t("issues.fix.move_tags.annotation")],
43862               title: _t.append("issues.fix.move_tags.title"),
43863               onClick: (context) => {
43864                 context.perform(doUpgrade, _t("issues.fix.move_tags.annotation"));
43865               }
43866             })
43867           ];
43868         }
43869       })];
43870       function doUpgrade(graph2) {
43871         let currMultipolygon = graph2.hasEntity(multipolygon.id);
43872         let currOuterWay = graph2.hasEntity(outerWay.id);
43873         if (!currMultipolygon || !currOuterWay)
43874           return graph2;
43875         currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
43876         graph2 = graph2.replace(currMultipolygon);
43877         return actionChangeTags(currOuterWay.id, {})(graph2);
43878       }
43879       function showMessage(context) {
43880         let currMultipolygon = context.hasEntity(multipolygon.id);
43881         if (!currMultipolygon)
43882           return "";
43883         return _t.append(
43884           "issues.old_multipolygon.message",
43885           { multipolygon: utilDisplayLabel(
43886             currMultipolygon,
43887             context.graph(),
43888             true
43889             /* verbose */
43890           ) }
43891         );
43892       }
43893       function showReference(selection2) {
43894         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.old_multipolygon.reference"));
43895       }
43896     }
43897     let validation = function checkOutdatedTags(entity, graph) {
43898       let issues = oldMultipolygonIssues(entity, graph);
43899       if (!issues.length)
43900         issues = oldTagIssues(entity, graph);
43901       return issues;
43902     };
43903     validation.type = type2;
43904     return validation;
43905   }
43906
43907   // modules/validations/private_data.js
43908   function validationPrivateData() {
43909     var type2 = "private_data";
43910     var privateBuildingValues = {
43911       detached: true,
43912       farm: true,
43913       house: true,
43914       houseboat: true,
43915       residential: true,
43916       semidetached_house: true,
43917       static_caravan: true
43918     };
43919     var publicKeys = {
43920       amenity: true,
43921       craft: true,
43922       historic: true,
43923       leisure: true,
43924       office: true,
43925       shop: true,
43926       tourism: true
43927     };
43928     var personalTags = {
43929       "contact:email": true,
43930       "contact:fax": true,
43931       "contact:phone": true,
43932       email: true,
43933       fax: true,
43934       phone: true
43935     };
43936     var validation = function checkPrivateData(entity) {
43937       var tags = entity.tags;
43938       if (!tags.building || !privateBuildingValues[tags.building])
43939         return [];
43940       var keepTags = {};
43941       for (var k in tags) {
43942         if (publicKeys[k])
43943           return [];
43944         if (!personalTags[k]) {
43945           keepTags[k] = tags[k];
43946         }
43947       }
43948       var tagDiff = utilTagDiff(tags, keepTags);
43949       if (!tagDiff.length)
43950         return [];
43951       var fixID = tagDiff.length === 1 ? "remove_tag" : "remove_tags";
43952       return [new validationIssue({
43953         type: type2,
43954         severity: "warning",
43955         message: showMessage,
43956         reference: showReference,
43957         entityIds: [entity.id],
43958         dynamicFixes: function() {
43959           return [
43960             new validationIssueFix({
43961               icon: "iD-operation-delete",
43962               title: _t.append("issues.fix." + fixID + ".title"),
43963               onClick: function(context) {
43964                 context.perform(doUpgrade, _t("issues.fix.remove_tag.annotation"));
43965               }
43966             })
43967           ];
43968         }
43969       })];
43970       function doUpgrade(graph) {
43971         var currEntity = graph.hasEntity(entity.id);
43972         if (!currEntity)
43973           return graph;
43974         var newTags = Object.assign({}, currEntity.tags);
43975         tagDiff.forEach(function(diff) {
43976           if (diff.type === "-") {
43977             delete newTags[diff.key];
43978           } else if (diff.type === "+") {
43979             newTags[diff.key] = diff.newVal;
43980           }
43981         });
43982         return actionChangeTags(currEntity.id, newTags)(graph);
43983       }
43984       function showMessage(context) {
43985         var currEntity = context.hasEntity(this.entityIds[0]);
43986         if (!currEntity)
43987           return "";
43988         return _t.append(
43989           "issues.private_data.contact.message",
43990           { feature: utilDisplayLabel(currEntity, context.graph()) }
43991         );
43992       }
43993       function showReference(selection2) {
43994         var enter = selection2.selectAll(".issue-reference").data([0]).enter();
43995         enter.append("div").attr("class", "issue-reference").call(_t.append("issues.private_data.reference"));
43996         enter.append("strong").call(_t.append("issues.suggested"));
43997         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) {
43998           var klass = d.type === "+" ? "add" : "remove";
43999           return "tagDiff-cell tagDiff-cell-" + klass;
44000         }).html(function(d) {
44001           return d.display;
44002         });
44003       }
44004     };
44005     validation.type = type2;
44006     return validation;
44007   }
44008
44009   // modules/validations/suspicious_name.js
44010   function validationSuspiciousName() {
44011     const type2 = "suspicious_name";
44012     const keysToTestForGenericValues = [
44013       "aerialway",
44014       "aeroway",
44015       "amenity",
44016       "building",
44017       "craft",
44018       "highway",
44019       "leisure",
44020       "railway",
44021       "man_made",
44022       "office",
44023       "shop",
44024       "tourism",
44025       "waterway"
44026     ];
44027     let _waitingForNsi = false;
44028     function isGenericMatchInNsi(tags) {
44029       const nsi = services.nsi;
44030       if (nsi) {
44031         _waitingForNsi = nsi.status() === "loading";
44032         if (!_waitingForNsi) {
44033           return nsi.isGenericName(tags);
44034         }
44035       }
44036       return false;
44037     }
44038     function nameMatchesRawTag(lowercaseName, tags) {
44039       for (let i2 = 0; i2 < keysToTestForGenericValues.length; i2++) {
44040         let key = keysToTestForGenericValues[i2];
44041         let val = tags[key];
44042         if (val) {
44043           val = val.toLowerCase();
44044           if (key === lowercaseName || val === lowercaseName || key.replace(/\_/g, " ") === lowercaseName || val.replace(/\_/g, " ") === lowercaseName) {
44045             return true;
44046           }
44047         }
44048       }
44049       return false;
44050     }
44051     function isGenericName(name, tags) {
44052       name = name.toLowerCase();
44053       return nameMatchesRawTag(name, tags) || isGenericMatchInNsi(tags);
44054     }
44055     function makeGenericNameIssue(entityId, nameKey, genericName, langCode) {
44056       return new validationIssue({
44057         type: type2,
44058         subtype: "generic_name",
44059         severity: "warning",
44060         message: function(context) {
44061           let entity = context.hasEntity(this.entityIds[0]);
44062           if (!entity)
44063             return "";
44064           let preset = _mainPresetIndex.match(entity, context.graph());
44065           let langName = langCode && _mainLocalizer.languageName(langCode);
44066           return _t.append(
44067             "issues.generic_name.message" + (langName ? "_language" : ""),
44068             { feature: preset.name(), name: genericName, language: langName }
44069           );
44070         },
44071         reference: showReference,
44072         entityIds: [entityId],
44073         hash: `${nameKey}=${genericName}`,
44074         dynamicFixes: function() {
44075           return [
44076             new validationIssueFix({
44077               icon: "iD-operation-delete",
44078               title: _t.append("issues.fix.remove_the_name.title"),
44079               onClick: function(context) {
44080                 let entityId2 = this.issue.entityIds[0];
44081                 let entity = context.entity(entityId2);
44082                 let tags = Object.assign({}, entity.tags);
44083                 delete tags[nameKey];
44084                 context.perform(
44085                   actionChangeTags(entityId2, tags),
44086                   _t("issues.fix.remove_generic_name.annotation")
44087                 );
44088               }
44089             })
44090           ];
44091         }
44092       });
44093       function showReference(selection2) {
44094         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.generic_name.reference"));
44095       }
44096     }
44097     function makeIncorrectNameIssue(entityId, nameKey, incorrectName, langCode) {
44098       return new validationIssue({
44099         type: type2,
44100         subtype: "not_name",
44101         severity: "warning",
44102         message: function(context) {
44103           const entity = context.hasEntity(this.entityIds[0]);
44104           if (!entity)
44105             return "";
44106           const preset = _mainPresetIndex.match(entity, context.graph());
44107           const langName = langCode && _mainLocalizer.languageName(langCode);
44108           return _t.append(
44109             "issues.incorrect_name.message" + (langName ? "_language" : ""),
44110             { feature: preset.name(), name: incorrectName, language: langName }
44111           );
44112         },
44113         reference: showReference,
44114         entityIds: [entityId],
44115         hash: `${nameKey}=${incorrectName}`,
44116         dynamicFixes: function() {
44117           return [
44118             new validationIssueFix({
44119               icon: "iD-operation-delete",
44120               title: _t.append("issues.fix.remove_the_name.title"),
44121               onClick: function(context) {
44122                 const entityId2 = this.issue.entityIds[0];
44123                 const entity = context.entity(entityId2);
44124                 let tags = Object.assign({}, entity.tags);
44125                 delete tags[nameKey];
44126                 context.perform(
44127                   actionChangeTags(entityId2, tags),
44128                   _t("issues.fix.remove_mistaken_name.annotation")
44129                 );
44130               }
44131             })
44132           ];
44133         }
44134       });
44135       function showReference(selection2) {
44136         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.generic_name.reference"));
44137       }
44138     }
44139     let validation = function checkGenericName(entity) {
44140       const tags = entity.tags;
44141       const hasWikidata = !!tags.wikidata || !!tags["brand:wikidata"] || !!tags["operator:wikidata"];
44142       if (hasWikidata)
44143         return [];
44144       let issues = [];
44145       const notNames2 = (tags["not:name"] || "").split(";");
44146       for (let key in tags) {
44147         const m = key.match(/^name(?:(?::)([a-zA-Z_-]+))?$/);
44148         if (!m)
44149           continue;
44150         const langCode = m.length >= 2 ? m[1] : null;
44151         const value = tags[key];
44152         if (notNames2.length) {
44153           for (let i2 in notNames2) {
44154             const notName = notNames2[i2];
44155             if (notName && value === notName) {
44156               issues.push(makeIncorrectNameIssue(entity.id, key, value, langCode));
44157               continue;
44158             }
44159           }
44160         }
44161         if (isGenericName(value, tags)) {
44162           issues.provisional = _waitingForNsi;
44163           issues.push(makeGenericNameIssue(entity.id, key, value, langCode));
44164         }
44165       }
44166       return issues;
44167     };
44168     validation.type = type2;
44169     return validation;
44170   }
44171
44172   // modules/validations/unsquare_way.js
44173   function validationUnsquareWay(context) {
44174     var type2 = "unsquare_way";
44175     var DEFAULT_DEG_THRESHOLD = 5;
44176     var epsilon3 = 0.05;
44177     var nodeThreshold = 10;
44178     function isBuilding(entity, graph) {
44179       if (entity.type !== "way" || entity.geometry(graph) !== "area")
44180         return false;
44181       return entity.tags.building && entity.tags.building !== "no";
44182     }
44183     var validation = function checkUnsquareWay(entity, graph) {
44184       if (!isBuilding(entity, graph))
44185         return [];
44186       if (entity.tags.nonsquare === "yes")
44187         return [];
44188       var isClosed = entity.isClosed();
44189       if (!isClosed)
44190         return [];
44191       var nodes = graph.childNodes(entity).slice();
44192       if (nodes.length > nodeThreshold + 1)
44193         return [];
44194       var osm = services.osm;
44195       if (!osm || nodes.some(function(node) {
44196         return !osm.isDataLoaded(node.loc);
44197       }))
44198         return [];
44199       var hasConnectedSquarableWays = nodes.some(function(node) {
44200         return graph.parentWays(node).some(function(way) {
44201           if (way.id === entity.id)
44202             return false;
44203           if (isBuilding(way, graph))
44204             return true;
44205           return graph.parentRelations(way).some(function(parentRelation) {
44206             return parentRelation.isMultipolygon() && parentRelation.tags.building && parentRelation.tags.building !== "no";
44207           });
44208         });
44209       });
44210       if (hasConnectedSquarableWays)
44211         return [];
44212       var storedDegreeThreshold = corePreferences("validate-square-degrees");
44213       var degreeThreshold = isFinite(storedDegreeThreshold) ? Number(storedDegreeThreshold) : DEFAULT_DEG_THRESHOLD;
44214       var points = nodes.map(function(node) {
44215         return context.projection(node.loc);
44216       });
44217       if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon3, degreeThreshold, true))
44218         return [];
44219       var autoArgs;
44220       if (!entity.tags.wikidata) {
44221         var autoAction = actionOrthogonalize(entity.id, context.projection, void 0, degreeThreshold);
44222         autoAction.transitionable = false;
44223         autoArgs = [autoAction, _t("operations.orthogonalize.annotation.feature", { n: 1 })];
44224       }
44225       return [new validationIssue({
44226         type: type2,
44227         subtype: "building",
44228         severity: "warning",
44229         message: function(context2) {
44230           var entity2 = context2.hasEntity(this.entityIds[0]);
44231           return entity2 ? _t.append("issues.unsquare_way.message", {
44232             feature: utilDisplayLabel(entity2, context2.graph())
44233           }) : "";
44234         },
44235         reference: showReference,
44236         entityIds: [entity.id],
44237         hash: degreeThreshold,
44238         dynamicFixes: function() {
44239           return [
44240             new validationIssueFix({
44241               icon: "iD-operation-orthogonalize",
44242               title: _t.append("issues.fix.square_feature.title"),
44243               autoArgs,
44244               onClick: function(context2, completionHandler) {
44245                 var entityId = this.issue.entityIds[0];
44246                 context2.perform(
44247                   actionOrthogonalize(entityId, context2.projection, void 0, degreeThreshold),
44248                   _t("operations.orthogonalize.annotation.feature", { n: 1 })
44249                 );
44250                 window.setTimeout(function() {
44251                   completionHandler();
44252                 }, 175);
44253               }
44254             })
44255             /*
44256             new validationIssueFix({
44257                 title: t.append('issues.fix.tag_as_unsquare.title'),
44258                 onClick: function(context) {
44259                     var entityId = this.issue.entityIds[0];
44260                     var entity = context.entity(entityId);
44261                     var tags = Object.assign({}, entity.tags);  // shallow copy
44262                     tags.nonsquare = 'yes';
44263                     context.perform(
44264                         actionChangeTags(entityId, tags),
44265                         t('issues.fix.tag_as_unsquare.annotation')
44266                     );
44267                 }
44268             })
44269             */
44270           ];
44271         }
44272       })];
44273       function showReference(selection2) {
44274         selection2.selectAll(".issue-reference").data([0]).enter().append("div").attr("class", "issue-reference").call(_t.append("issues.unsquare_way.buildings.reference"));
44275       }
44276     };
44277     validation.type = type2;
44278     return validation;
44279   }
44280
44281   // modules/core/validator.js
44282   function coreValidator(context) {
44283     let dispatch10 = dispatch_default("validated", "focusedIssue");
44284     let validator = utilRebind({}, dispatch10, "on");
44285     let _rules = {};
44286     let _disabledRules = {};
44287     let _ignoredIssueIDs = /* @__PURE__ */ new Set();
44288     let _resolvedIssueIDs = /* @__PURE__ */ new Set();
44289     let _baseCache = validationCache("base");
44290     let _headCache = validationCache("head");
44291     let _completeDiff = {};
44292     let _headIsCurrent = false;
44293     let _deferredRIC = {};
44294     let _deferredST = /* @__PURE__ */ new Set();
44295     let _headPromise;
44296     const RETRY = 5e3;
44297     const _errorOverrides = parseHashParam(context.initialHashParams.validationError);
44298     const _warningOverrides = parseHashParam(context.initialHashParams.validationWarning);
44299     const _disableOverrides = parseHashParam(context.initialHashParams.validationDisable);
44300     function parseHashParam(param) {
44301       let result = [];
44302       let rules = (param || "").split(",");
44303       rules.forEach((rule) => {
44304         rule = rule.trim();
44305         const parts = rule.split("/", 2);
44306         const type2 = parts[0];
44307         const subtype = parts[1] || "*";
44308         if (!type2 || !subtype)
44309           return;
44310         result.push({ type: makeRegExp(type2), subtype: makeRegExp(subtype) });
44311       });
44312       return result;
44313       function makeRegExp(str2) {
44314         const escaped = str2.replace(/[-\/\\^$+?.()|[\]{}]/g, "\\$&").replace(/\*/g, ".*");
44315         return new RegExp("^" + escaped + "$");
44316       }
44317     }
44318     validator.init = () => {
44319       Object.values(validations_exports).forEach((validation) => {
44320         if (typeof validation !== "function")
44321           return;
44322         const fn = validation(context);
44323         const key = fn.type;
44324         _rules[key] = fn;
44325       });
44326       let disabledRules = corePreferences("validate-disabledRules");
44327       if (disabledRules) {
44328         disabledRules.split(",").forEach((k) => _disabledRules[k] = true);
44329       }
44330     };
44331     function reset(resetIgnored) {
44332       _baseCache.queue = [];
44333       _headCache.queue = [];
44334       Object.keys(_deferredRIC).forEach((key) => {
44335         window.cancelIdleCallback(key);
44336         _deferredRIC[key]();
44337       });
44338       _deferredRIC = {};
44339       _deferredST.forEach(window.clearTimeout);
44340       _deferredST.clear();
44341       if (resetIgnored)
44342         _ignoredIssueIDs.clear();
44343       _resolvedIssueIDs.clear();
44344       _baseCache = validationCache("base");
44345       _headCache = validationCache("head");
44346       _completeDiff = {};
44347       _headIsCurrent = false;
44348     }
44349     validator.reset = () => {
44350       reset(true);
44351     };
44352     validator.resetIgnoredIssues = () => {
44353       _ignoredIssueIDs.clear();
44354       dispatch10.call("validated");
44355     };
44356     validator.revalidateUnsquare = () => {
44357       revalidateUnsquare(_headCache);
44358       revalidateUnsquare(_baseCache);
44359       dispatch10.call("validated");
44360     };
44361     function revalidateUnsquare(cache) {
44362       const checkUnsquareWay = _rules.unsquare_way;
44363       if (!cache.graph || typeof checkUnsquareWay !== "function")
44364         return;
44365       cache.uncacheIssuesOfType("unsquare_way");
44366       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");
44367       buildings.forEach((entity) => {
44368         const detected = checkUnsquareWay(entity, cache.graph);
44369         if (!detected.length)
44370           return;
44371         cache.cacheIssues(detected);
44372       });
44373     }
44374     validator.getIssues = (options2) => {
44375       const opts = Object.assign({ what: "all", where: "all", includeIgnored: false, includeDisabledRules: false }, options2);
44376       const view = context.map().extent();
44377       let seen = /* @__PURE__ */ new Set();
44378       let results = [];
44379       if (_headCache.graph && _headCache.graph !== _baseCache.graph) {
44380         Object.values(_headCache.issuesByIssueID).forEach((issue) => {
44381           const userModified = (issue.entityIds || []).some((id2) => _completeDiff.hasOwnProperty(id2));
44382           if (opts.what === "edited" && !userModified)
44383             return;
44384           if (!filter2(issue))
44385             return;
44386           seen.add(issue.id);
44387           results.push(issue);
44388         });
44389       }
44390       if (opts.what === "all") {
44391         Object.values(_baseCache.issuesByIssueID).forEach((issue) => {
44392           if (!filter2(issue))
44393             return;
44394           seen.add(issue.id);
44395           results.push(issue);
44396         });
44397       }
44398       return results;
44399       function filter2(issue) {
44400         if (!issue)
44401           return false;
44402         if (seen.has(issue.id))
44403           return false;
44404         if (_resolvedIssueIDs.has(issue.id))
44405           return false;
44406         if (opts.includeDisabledRules === "only" && !_disabledRules[issue.type])
44407           return false;
44408         if (!opts.includeDisabledRules && _disabledRules[issue.type])
44409           return false;
44410         if (opts.includeIgnored === "only" && !_ignoredIssueIDs.has(issue.id))
44411           return false;
44412         if (!opts.includeIgnored && _ignoredIssueIDs.has(issue.id))
44413           return false;
44414         if ((issue.entityIds || []).some((id2) => !context.hasEntity(id2)))
44415           return false;
44416         if (opts.where === "visible") {
44417           const extent = issue.extent(context.graph());
44418           if (!view.intersects(extent))
44419             return false;
44420         }
44421         return true;
44422       }
44423     };
44424     validator.getResolvedIssues = () => {
44425       return Array.from(_resolvedIssueIDs).map((issueID) => _baseCache.issuesByIssueID[issueID]).filter(Boolean);
44426     };
44427     validator.focusIssue = (issue) => {
44428       const graph = context.graph();
44429       let selectID;
44430       let focusCenter;
44431       const issueExtent = issue.extent(graph);
44432       if (issueExtent) {
44433         focusCenter = issueExtent.center();
44434       }
44435       if (issue.entityIds && issue.entityIds.length) {
44436         selectID = issue.entityIds[0];
44437         if (selectID && selectID.charAt(0) === "r") {
44438           const ids = utilEntityAndDeepMemberIDs([selectID], graph);
44439           let nodeID = ids.find((id2) => id2.charAt(0) === "n" && graph.hasEntity(id2));
44440           if (!nodeID) {
44441             const wayID = ids.find((id2) => id2.charAt(0) === "w" && graph.hasEntity(id2));
44442             if (wayID) {
44443               nodeID = graph.entity(wayID).first();
44444             }
44445           }
44446           if (nodeID) {
44447             focusCenter = graph.entity(nodeID).loc;
44448           }
44449         }
44450       }
44451       if (focusCenter) {
44452         const setZoom = Math.max(context.map().zoom(), 19);
44453         context.map().unobscuredCenterZoomEase(focusCenter, setZoom);
44454       }
44455       if (selectID) {
44456         window.setTimeout(() => {
44457           context.enter(modeSelect(context, [selectID]));
44458           dispatch10.call("focusedIssue", this, issue);
44459         }, 250);
44460       }
44461     };
44462     validator.getIssuesBySeverity = (options2) => {
44463       let groups = utilArrayGroupBy(validator.getIssues(options2), "severity");
44464       groups.error = groups.error || [];
44465       groups.warning = groups.warning || [];
44466       return groups;
44467     };
44468     validator.getSharedEntityIssues = (entityIDs, options2) => {
44469       const orderedIssueTypes = [
44470         // Show some issue types in a particular order:
44471         "missing_tag",
44472         "missing_role",
44473         // - missing data first
44474         "outdated_tags",
44475         "mismatched_geometry",
44476         // - identity issues
44477         "crossing_ways",
44478         "almost_junction",
44479         // - geometry issues where fixing them might solve connectivity issues
44480         "disconnected_way",
44481         "impossible_oneway"
44482         // - finally connectivity issues
44483       ];
44484       const allIssues = validator.getIssues(options2);
44485       const forEntityIDs = new Set(entityIDs);
44486       return allIssues.filter((issue) => (issue.entityIds || []).some((entityID) => forEntityIDs.has(entityID))).sort((issue1, issue2) => {
44487         if (issue1.type === issue2.type) {
44488           return issue1.id < issue2.id ? -1 : 1;
44489         }
44490         const index1 = orderedIssueTypes.indexOf(issue1.type);
44491         const index2 = orderedIssueTypes.indexOf(issue2.type);
44492         if (index1 !== -1 && index2 !== -1) {
44493           return index1 - index2;
44494         } else if (index1 === -1 && index2 === -1) {
44495           return issue1.type < issue2.type ? -1 : 1;
44496         } else {
44497           return index1 !== -1 ? -1 : 1;
44498         }
44499       });
44500     };
44501     validator.getEntityIssues = (entityID, options2) => {
44502       return validator.getSharedEntityIssues([entityID], options2);
44503     };
44504     validator.getRuleKeys = () => {
44505       return Object.keys(_rules);
44506     };
44507     validator.isRuleEnabled = (key) => {
44508       return !_disabledRules[key];
44509     };
44510     validator.toggleRule = (key) => {
44511       if (_disabledRules[key]) {
44512         delete _disabledRules[key];
44513       } else {
44514         _disabledRules[key] = true;
44515       }
44516       corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(","));
44517       validator.validate();
44518     };
44519     validator.disableRules = (keys2) => {
44520       _disabledRules = {};
44521       keys2.forEach((k) => _disabledRules[k] = true);
44522       corePreferences("validate-disabledRules", Object.keys(_disabledRules).join(","));
44523       validator.validate();
44524     };
44525     validator.ignoreIssue = (issueID) => {
44526       _ignoredIssueIDs.add(issueID);
44527     };
44528     validator.validate = () => {
44529       const baseGraph = context.history().base();
44530       if (!_headCache.graph)
44531         _headCache.graph = baseGraph;
44532       if (!_baseCache.graph)
44533         _baseCache.graph = baseGraph;
44534       const prevGraph = _headCache.graph;
44535       const currGraph = context.graph();
44536       if (currGraph === prevGraph) {
44537         _headIsCurrent = true;
44538         dispatch10.call("validated");
44539         return Promise.resolve();
44540       }
44541       if (_headPromise) {
44542         _headIsCurrent = false;
44543         return _headPromise;
44544       }
44545       _headCache.graph = currGraph;
44546       _completeDiff = context.history().difference().complete();
44547       const incrementalDiff = coreDifference(prevGraph, currGraph);
44548       let entityIDs = Object.keys(incrementalDiff.complete());
44549       entityIDs = _headCache.withAllRelatedEntities(entityIDs);
44550       if (!entityIDs.size) {
44551         dispatch10.call("validated");
44552         return Promise.resolve();
44553       }
44554       _headPromise = validateEntitiesAsync(entityIDs, _headCache).then(() => updateResolvedIssues(entityIDs)).then(() => dispatch10.call("validated")).catch(() => {
44555       }).then(() => {
44556         _headPromise = null;
44557         if (!_headIsCurrent) {
44558           validator.validate();
44559         }
44560       });
44561       return _headPromise;
44562     };
44563     context.history().on("restore.validator", validator.validate).on("undone.validator", validator.validate).on("redone.validator", validator.validate).on("reset.validator", () => {
44564       reset(false);
44565       validator.validate();
44566     });
44567     context.on("exit.validator", validator.validate);
44568     context.history().on("merge.validator", (entities) => {
44569       if (!entities)
44570         return;
44571       const baseGraph = context.history().base();
44572       if (!_headCache.graph)
44573         _headCache.graph = baseGraph;
44574       if (!_baseCache.graph)
44575         _baseCache.graph = baseGraph;
44576       let entityIDs = entities.map((entity) => entity.id);
44577       entityIDs = _baseCache.withAllRelatedEntities(entityIDs);
44578       validateEntitiesAsync(entityIDs, _baseCache);
44579     });
44580     function validateEntity(entity, graph) {
44581       let result = { issues: [], provisional: false };
44582       Object.keys(_rules).forEach(runValidation);
44583       return result;
44584       function runValidation(key) {
44585         const fn = _rules[key];
44586         if (typeof fn !== "function") {
44587           console.error("no such validation rule = " + key);
44588           return;
44589         }
44590         let detected = fn(entity, graph);
44591         if (detected.provisional) {
44592           result.provisional = true;
44593         }
44594         detected = detected.filter(applySeverityOverrides);
44595         result.issues = result.issues.concat(detected);
44596         function applySeverityOverrides(issue) {
44597           const type2 = issue.type;
44598           const subtype = issue.subtype || "";
44599           let i2;
44600           for (i2 = 0; i2 < _errorOverrides.length; i2++) {
44601             if (_errorOverrides[i2].type.test(type2) && _errorOverrides[i2].subtype.test(subtype)) {
44602               issue.severity = "error";
44603               return true;
44604             }
44605           }
44606           for (i2 = 0; i2 < _warningOverrides.length; i2++) {
44607             if (_warningOverrides[i2].type.test(type2) && _warningOverrides[i2].subtype.test(subtype)) {
44608               issue.severity = "warning";
44609               return true;
44610             }
44611           }
44612           for (i2 = 0; i2 < _disableOverrides.length; i2++) {
44613             if (_disableOverrides[i2].type.test(type2) && _disableOverrides[i2].subtype.test(subtype)) {
44614               return false;
44615             }
44616           }
44617           return true;
44618         }
44619       }
44620     }
44621     function updateResolvedIssues(entityIDs) {
44622       entityIDs.forEach((entityID) => {
44623         const baseIssues = _baseCache.issuesByEntityID[entityID];
44624         if (!baseIssues)
44625           return;
44626         baseIssues.forEach((issueID) => {
44627           const issue = _baseCache.issuesByIssueID[issueID];
44628           const userModified = (issue.entityIds || []).some((id2) => _completeDiff.hasOwnProperty(id2));
44629           if (userModified && !_headCache.issuesByIssueID[issueID]) {
44630             _resolvedIssueIDs.add(issueID);
44631           } else {
44632             _resolvedIssueIDs.delete(issueID);
44633           }
44634         });
44635       });
44636     }
44637     function validateEntitiesAsync(entityIDs, cache) {
44638       const jobs = Array.from(entityIDs).map((entityID) => {
44639         if (cache.queuedEntityIDs.has(entityID))
44640           return null;
44641         cache.queuedEntityIDs.add(entityID);
44642         cache.uncacheEntityID(entityID);
44643         return () => {
44644           cache.queuedEntityIDs.delete(entityID);
44645           const graph = cache.graph;
44646           if (!graph)
44647             return;
44648           const entity = graph.hasEntity(entityID);
44649           if (!entity)
44650             return;
44651           const result = validateEntity(entity, graph);
44652           if (result.provisional) {
44653             cache.provisionalEntityIDs.add(entityID);
44654           }
44655           cache.cacheIssues(result.issues);
44656         };
44657       }).filter(Boolean);
44658       cache.queue = cache.queue.concat(utilArrayChunk(jobs, 100));
44659       if (cache.queuePromise)
44660         return cache.queuePromise;
44661       cache.queuePromise = processQueue(cache).then(() => revalidateProvisionalEntities(cache)).catch(() => {
44662       }).finally(() => cache.queuePromise = null);
44663       return cache.queuePromise;
44664     }
44665     function revalidateProvisionalEntities(cache) {
44666       if (!cache.provisionalEntityIDs.size)
44667         return;
44668       const handle = window.setTimeout(() => {
44669         _deferredST.delete(handle);
44670         if (!cache.provisionalEntityIDs.size)
44671           return;
44672         validateEntitiesAsync(Array.from(cache.provisionalEntityIDs), cache);
44673       }, RETRY);
44674       _deferredST.add(handle);
44675     }
44676     function processQueue(cache) {
44677       if (!cache.queue.length)
44678         return Promise.resolve();
44679       const chunk = cache.queue.pop();
44680       return new Promise((resolvePromise, rejectPromise) => {
44681         const handle = window.requestIdleCallback(() => {
44682           delete _deferredRIC[handle];
44683           chunk.forEach((job) => job());
44684           resolvePromise();
44685         });
44686         _deferredRIC[handle] = rejectPromise;
44687       }).then(() => {
44688         if (cache.queue.length % 25 === 0)
44689           dispatch10.call("validated");
44690       }).then(() => processQueue(cache));
44691     }
44692     return validator;
44693   }
44694   function validationCache(which) {
44695     let cache = {
44696       which,
44697       graph: null,
44698       queue: [],
44699       queuePromise: null,
44700       queuedEntityIDs: /* @__PURE__ */ new Set(),
44701       provisionalEntityIDs: /* @__PURE__ */ new Set(),
44702       issuesByIssueID: {},
44703       // issue.id -> issue
44704       issuesByEntityID: {}
44705       // entity.id -> Set(issue.id)
44706     };
44707     cache.cacheIssue = (issue) => {
44708       (issue.entityIds || []).forEach((entityID) => {
44709         if (!cache.issuesByEntityID[entityID]) {
44710           cache.issuesByEntityID[entityID] = /* @__PURE__ */ new Set();
44711         }
44712         cache.issuesByEntityID[entityID].add(issue.id);
44713       });
44714       cache.issuesByIssueID[issue.id] = issue;
44715     };
44716     cache.uncacheIssue = (issue) => {
44717       (issue.entityIds || []).forEach((entityID) => {
44718         if (cache.issuesByEntityID[entityID]) {
44719           cache.issuesByEntityID[entityID].delete(issue.id);
44720         }
44721       });
44722       delete cache.issuesByIssueID[issue.id];
44723     };
44724     cache.cacheIssues = (issues) => {
44725       issues.forEach(cache.cacheIssue);
44726     };
44727     cache.uncacheIssues = (issues) => {
44728       issues.forEach(cache.uncacheIssue);
44729     };
44730     cache.uncacheIssuesOfType = (type2) => {
44731       const issuesOfType = Object.values(cache.issuesByIssueID).filter((issue) => issue.type === type2);
44732       cache.uncacheIssues(issuesOfType);
44733     };
44734     cache.uncacheEntityID = (entityID) => {
44735       const entityIssueIDs = cache.issuesByEntityID[entityID];
44736       if (entityIssueIDs) {
44737         entityIssueIDs.forEach((issueID) => {
44738           const issue = cache.issuesByIssueID[issueID];
44739           if (issue) {
44740             cache.uncacheIssue(issue);
44741           } else {
44742             delete cache.issuesByIssueID[issueID];
44743           }
44744         });
44745       }
44746       delete cache.issuesByEntityID[entityID];
44747       cache.provisionalEntityIDs.delete(entityID);
44748     };
44749     cache.withAllRelatedEntities = (entityIDs) => {
44750       let result = /* @__PURE__ */ new Set();
44751       (entityIDs || []).forEach((entityID) => {
44752         result.add(entityID);
44753         const entityIssueIDs = cache.issuesByEntityID[entityID];
44754         if (entityIssueIDs) {
44755           entityIssueIDs.forEach((issueID) => {
44756             const issue = cache.issuesByIssueID[issueID];
44757             if (issue) {
44758               (issue.entityIds || []).forEach((relatedID) => result.add(relatedID));
44759             } else {
44760               delete cache.issuesByIssueID[issueID];
44761             }
44762           });
44763         }
44764       });
44765       return result;
44766     };
44767     return cache;
44768   }
44769
44770   // modules/core/uploader.js
44771   function coreUploader(context) {
44772     var dispatch10 = dispatch_default(
44773       // Start and end events are dispatched exactly once each per legitimate outside call to `save`
44774       "saveStarted",
44775       // dispatched as soon as a call to `save` has been deemed legitimate
44776       "saveEnded",
44777       // dispatched after the result event has been dispatched
44778       "willAttemptUpload",
44779       // dispatched before the actual upload call occurs, if it will
44780       "progressChanged",
44781       // Each save results in one of these outcomes:
44782       "resultNoChanges",
44783       // upload wasn't attempted since there were no edits
44784       "resultErrors",
44785       // upload failed due to errors
44786       "resultConflicts",
44787       // upload failed due to data conflicts
44788       "resultSuccess"
44789       // upload completed without errors
44790     );
44791     var _isSaving = false;
44792     var _conflicts = [];
44793     var _errors = [];
44794     var _origChanges;
44795     var _discardTags = {};
44796     _mainFileFetcher.get("discarded").then(function(d) {
44797       _discardTags = d;
44798     }).catch(function() {
44799     });
44800     var uploader = utilRebind({}, dispatch10, "on");
44801     uploader.isSaving = function() {
44802       return _isSaving;
44803     };
44804     uploader.save = function(changeset, tryAgain, checkConflicts) {
44805       if (_isSaving && !tryAgain) {
44806         return;
44807       }
44808       var osm = context.connection();
44809       if (!osm)
44810         return;
44811       if (!osm.authenticated()) {
44812         osm.authenticate(function(err) {
44813           if (!err) {
44814             uploader.save(changeset, tryAgain, checkConflicts);
44815           }
44816         });
44817         return;
44818       }
44819       if (!_isSaving) {
44820         _isSaving = true;
44821         dispatch10.call("saveStarted", this);
44822       }
44823       var history = context.history();
44824       _conflicts = [];
44825       _errors = [];
44826       _origChanges = history.changes(actionDiscardTags(history.difference(), _discardTags));
44827       if (!tryAgain) {
44828         history.perform(actionNoop());
44829       }
44830       if (!checkConflicts) {
44831         upload(changeset);
44832       } else {
44833         performFullConflictCheck(changeset);
44834       }
44835     };
44836     function performFullConflictCheck(changeset) {
44837       var osm = context.connection();
44838       if (!osm)
44839         return;
44840       var history = context.history();
44841       var localGraph = context.graph();
44842       var remoteGraph = coreGraph(history.base(), true);
44843       var summary = history.difference().summary();
44844       var _toCheck = [];
44845       for (var i2 = 0; i2 < summary.length; i2++) {
44846         var item = summary[i2];
44847         if (item.changeType === "modified") {
44848           _toCheck.push(item.entity.id);
44849         }
44850       }
44851       var _toLoad = withChildNodes(_toCheck, localGraph);
44852       var _loaded = {};
44853       var _toLoadCount = 0;
44854       var _toLoadTotal = _toLoad.length;
44855       if (_toCheck.length) {
44856         dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal);
44857         _toLoad.forEach(function(id2) {
44858           _loaded[id2] = false;
44859         });
44860         osm.loadMultiple(_toLoad, loaded);
44861       } else {
44862         upload(changeset);
44863       }
44864       return;
44865       function withChildNodes(ids, graph) {
44866         var s = new Set(ids);
44867         ids.forEach(function(id2) {
44868           var entity = graph.entity(id2);
44869           if (entity.type !== "way")
44870             return;
44871           graph.childNodes(entity).forEach(function(child) {
44872             if (child.version !== void 0) {
44873               s.add(child.id);
44874             }
44875           });
44876         });
44877         return Array.from(s);
44878       }
44879       function loaded(err, result) {
44880         if (_errors.length)
44881           return;
44882         if (err) {
44883           _errors.push({
44884             msg: err.message || err.responseText,
44885             details: [_t("save.status_code", { code: err.status })]
44886           });
44887           didResultInErrors();
44888         } else {
44889           var loadMore = [];
44890           result.data.forEach(function(entity) {
44891             remoteGraph.replace(entity);
44892             _loaded[entity.id] = true;
44893             _toLoad = _toLoad.filter(function(val) {
44894               return val !== entity.id;
44895             });
44896             if (!entity.visible)
44897               return;
44898             var i3, id2;
44899             if (entity.type === "way") {
44900               for (i3 = 0; i3 < entity.nodes.length; i3++) {
44901                 id2 = entity.nodes[i3];
44902                 if (_loaded[id2] === void 0) {
44903                   _loaded[id2] = false;
44904                   loadMore.push(id2);
44905                 }
44906               }
44907             } else if (entity.type === "relation" && entity.isMultipolygon()) {
44908               for (i3 = 0; i3 < entity.members.length; i3++) {
44909                 id2 = entity.members[i3].id;
44910                 if (_loaded[id2] === void 0) {
44911                   _loaded[id2] = false;
44912                   loadMore.push(id2);
44913                 }
44914               }
44915             }
44916           });
44917           _toLoadCount += result.data.length;
44918           _toLoadTotal += loadMore.length;
44919           dispatch10.call("progressChanged", this, _toLoadCount, _toLoadTotal);
44920           if (loadMore.length) {
44921             _toLoad.push.apply(_toLoad, loadMore);
44922             osm.loadMultiple(loadMore, loaded);
44923           }
44924           if (!_toLoad.length) {
44925             detectConflicts();
44926             upload(changeset);
44927           }
44928         }
44929       }
44930       function detectConflicts() {
44931         function choice(id2, text2, action) {
44932           return {
44933             id: id2,
44934             text: text2,
44935             action: function() {
44936               history.replace(action);
44937             }
44938           };
44939         }
44940         function formatUser(d) {
44941           return '<a href="' + osm.userURL(d) + '" target="_blank">' + escape_default(d) + "</a>";
44942         }
44943         function entityName(entity) {
44944           return utilDisplayName(entity) || utilDisplayType(entity.id) + " " + entity.id;
44945         }
44946         function sameVersions(local, remote) {
44947           if (local.version !== remote.version)
44948             return false;
44949           if (local.type === "way") {
44950             var children2 = utilArrayUnion(local.nodes, remote.nodes);
44951             for (var i3 = 0; i3 < children2.length; i3++) {
44952               var a = localGraph.hasEntity(children2[i3]);
44953               var b = remoteGraph.hasEntity(children2[i3]);
44954               if (a && b && a.version !== b.version)
44955                 return false;
44956             }
44957           }
44958           return true;
44959         }
44960         _toCheck.forEach(function(id2) {
44961           var local = localGraph.entity(id2);
44962           var remote = remoteGraph.entity(id2);
44963           if (sameVersions(local, remote))
44964             return;
44965           var merge2 = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags, formatUser);
44966           history.replace(merge2);
44967           var mergeConflicts = merge2.conflicts();
44968           if (!mergeConflicts.length)
44969             return;
44970           var forceLocal = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_local");
44971           var forceRemote = actionMergeRemoteChanges(id2, localGraph, remoteGraph, _discardTags).withOption("force_remote");
44972           var keepMine = _t("save.conflict." + (remote.visible ? "keep_local" : "restore"));
44973           var keepTheirs = _t("save.conflict." + (remote.visible ? "keep_remote" : "delete"));
44974           _conflicts.push({
44975             id: id2,
44976             name: entityName(local),
44977             details: mergeConflicts,
44978             chosen: 1,
44979             choices: [
44980               choice(id2, keepMine, forceLocal),
44981               choice(id2, keepTheirs, forceRemote)
44982             ]
44983           });
44984         });
44985       }
44986     }
44987     function upload(changeset) {
44988       var osm = context.connection();
44989       if (!osm) {
44990         _errors.push({ msg: "No OSM Service" });
44991       }
44992       if (_conflicts.length) {
44993         didResultInConflicts(changeset);
44994       } else if (_errors.length) {
44995         didResultInErrors();
44996       } else {
44997         var history = context.history();
44998         var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
44999         if (changes.modified.length || changes.created.length || changes.deleted.length) {
45000           dispatch10.call("willAttemptUpload", this);
45001           osm.putChangeset(changeset, changes, uploadCallback);
45002         } else {
45003           didResultInNoChanges();
45004         }
45005       }
45006     }
45007     function uploadCallback(err, changeset) {
45008       if (err) {
45009         if (err.status === 409) {
45010           uploader.save(changeset, true, true);
45011         } else {
45012           _errors.push({
45013             msg: err.message || err.responseText,
45014             details: [_t("save.status_code", { code: err.status })]
45015           });
45016           didResultInErrors();
45017         }
45018       } else {
45019         didResultInSuccess(changeset);
45020       }
45021     }
45022     function didResultInNoChanges() {
45023       dispatch10.call("resultNoChanges", this);
45024       endSave();
45025       context.flush();
45026     }
45027     function didResultInErrors() {
45028       context.history().pop();
45029       dispatch10.call("resultErrors", this, _errors);
45030       endSave();
45031     }
45032     function didResultInConflicts(changeset) {
45033       _conflicts.sort(function(a, b) {
45034         return b.id.localeCompare(a.id);
45035       });
45036       dispatch10.call("resultConflicts", this, changeset, _conflicts, _origChanges);
45037       endSave();
45038     }
45039     function didResultInSuccess(changeset) {
45040       context.history().clearSaved();
45041       dispatch10.call("resultSuccess", this, changeset);
45042       window.setTimeout(function() {
45043         endSave();
45044         context.flush();
45045       }, 2500);
45046     }
45047     function endSave() {
45048       _isSaving = false;
45049       dispatch10.call("saveEnded", this);
45050     }
45051     uploader.cancelConflictResolution = function() {
45052       context.history().pop();
45053     };
45054     uploader.processResolvedConflicts = function(changeset) {
45055       var history = context.history();
45056       for (var i2 = 0; i2 < _conflicts.length; i2++) {
45057         if (_conflicts[i2].chosen === 1) {
45058           var entity = context.hasEntity(_conflicts[i2].id);
45059           if (entity && entity.type === "way") {
45060             var children2 = utilArrayUniq(entity.nodes);
45061             for (var j2 = 0; j2 < children2.length; j2++) {
45062               history.replace(actionRevert(children2[j2]));
45063             }
45064           }
45065           history.replace(actionRevert(_conflicts[i2].id));
45066         }
45067       }
45068       uploader.save(changeset, true, false);
45069     };
45070     uploader.reset = function() {
45071     };
45072     return uploader;
45073   }
45074
45075   // modules/renderer/background_source.js
45076   var import_lodash4 = __toESM(require_lodash());
45077
45078   // modules/util/IntervalTasksQueue.js
45079   var IntervalTasksQueue = class {
45080     /**
45081      * Interval in milliseconds inside which only 1 task can execute.
45082      * e.g. if interval is 200ms, and 5 async tasks are unqueued,
45083      * they will complete in ~1s if not cleared
45084      * @param {number} intervalInMs
45085      */
45086     constructor(intervalInMs) {
45087       this.intervalInMs = intervalInMs;
45088       this.pendingHandles = [];
45089       this.time = 0;
45090     }
45091     enqueue(task) {
45092       let taskTimeout = this.time;
45093       this.time += this.intervalInMs;
45094       this.pendingHandles.push(setTimeout(() => {
45095         this.time -= this.intervalInMs;
45096         task();
45097       }, taskTimeout));
45098     }
45099     clear() {
45100       this.pendingHandles.forEach((timeoutHandle) => {
45101         clearTimeout(timeoutHandle);
45102       });
45103       this.pendingHandles = [];
45104       this.time = 0;
45105     }
45106   };
45107
45108   // modules/renderer/background_source.js
45109   var isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
45110   window.matchMedia(`
45111         (-webkit-min-device-pixel-ratio: 2), /* Safari */
45112         (min-resolution: 2dppx),             /* standard */
45113         (min-resolution: 192dpi)             /* fallback */
45114     `).addListener(function() {
45115     isRetina = window.devicePixelRatio && window.devicePixelRatio >= 2;
45116   });
45117   function localeDateString(s) {
45118     if (!s)
45119       return null;
45120     var options2 = { day: "numeric", month: "short", year: "numeric" };
45121     var d = new Date(s);
45122     if (isNaN(d.getTime()))
45123       return null;
45124     return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
45125   }
45126   function vintageRange(vintage) {
45127     var s;
45128     if (vintage.start || vintage.end) {
45129       s = vintage.start || "?";
45130       if (vintage.start !== vintage.end) {
45131         s += " - " + (vintage.end || "?");
45132       }
45133     }
45134     return s;
45135   }
45136   function rendererBackgroundSource(data) {
45137     var source = Object.assign({}, data);
45138     var _offset = [0, 0];
45139     var _name = source.name;
45140     var _description = source.description;
45141     var _best = !!source.best;
45142     var _template = source.encrypted ? utilAesDecrypt(source.template) : source.template;
45143     source.tileSize = data.tileSize || 256;
45144     source.zoomExtent = data.zoomExtent || [0, 22];
45145     source.overzoom = data.overzoom !== false;
45146     source.offset = function(val) {
45147       if (!arguments.length)
45148         return _offset;
45149       _offset = val;
45150       return source;
45151     };
45152     source.nudge = function(val, zoomlevel) {
45153       _offset[0] += val[0] / Math.pow(2, zoomlevel);
45154       _offset[1] += val[1] / Math.pow(2, zoomlevel);
45155       return source;
45156     };
45157     source.name = function() {
45158       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
45159       return _t("imagery." + id_safe + ".name", { default: (0, import_lodash4.escape)(_name) });
45160     };
45161     source.label = function() {
45162       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
45163       return _t.append("imagery." + id_safe + ".name", { default: (0, import_lodash4.escape)(_name) });
45164     };
45165     source.hasDescription = function() {
45166       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
45167       var descriptionText = _mainLocalizer.tInfo("imagery." + id_safe + ".description", { default: (0, import_lodash4.escape)(_description) }).text;
45168       return descriptionText !== "";
45169     };
45170     source.description = function() {
45171       var id_safe = source.id.replace(/\./g, "<TX_DOT>");
45172       return _t.append("imagery." + id_safe + ".description", { default: (0, import_lodash4.escape)(_description) });
45173     };
45174     source.best = function() {
45175       return _best;
45176     };
45177     source.area = function() {
45178       if (!data.polygon)
45179         return Number.MAX_VALUE;
45180       var area = area_default({ type: "MultiPolygon", coordinates: [data.polygon] });
45181       return isNaN(area) ? 0 : area;
45182     };
45183     source.imageryUsed = function() {
45184       return _name || source.id;
45185     };
45186     source.template = function(val) {
45187       if (!arguments.length)
45188         return _template;
45189       if (source.id === "custom" || source.id === "Bing") {
45190         _template = val;
45191       }
45192       return source;
45193     };
45194     source.url = function(coord2) {
45195       var result = _template.replace(/#[\s\S]*/u, "");
45196       if (result === "")
45197         return result;
45198       if (!source.type || source.id === "custom") {
45199         if (/SERVICE=WMS|\{(proj|wkid|bbox)\}/.test(result)) {
45200           source.type = "wms";
45201           source.projection = "EPSG:3857";
45202         } else if (/\{(x|y)\}/.test(result)) {
45203           source.type = "tms";
45204         } else if (/\{u\}/.test(result)) {
45205           source.type = "bing";
45206         }
45207       }
45208       if (source.type === "wms") {
45209         var tileToProjectedCoords = function(x, y, z) {
45210           var zoomSize = Math.pow(2, z);
45211           var lon = x / zoomSize * Math.PI * 2 - Math.PI;
45212           var lat = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / zoomSize)));
45213           switch (source.projection) {
45214             case "EPSG:4326":
45215               return {
45216                 x: lon * 180 / Math.PI,
45217                 y: lat * 180 / Math.PI
45218               };
45219             default:
45220               var mercCoords = mercatorRaw(lon, lat);
45221               return {
45222                 x: 2003750834e-2 / Math.PI * mercCoords[0],
45223                 y: 2003750834e-2 / Math.PI * mercCoords[1]
45224               };
45225           }
45226         };
45227         var tileSize = source.tileSize;
45228         var projection2 = source.projection;
45229         var minXmaxY = tileToProjectedCoords(coord2[0], coord2[1], coord2[2]);
45230         var maxXminY = tileToProjectedCoords(coord2[0] + 1, coord2[1] + 1, coord2[2]);
45231         result = result.replace(/\{(\w+)\}/g, function(token, key) {
45232           switch (key) {
45233             case "width":
45234             case "height":
45235               return tileSize;
45236             case "proj":
45237               return projection2;
45238             case "wkid":
45239               return projection2.replace(/^EPSG:/, "");
45240             case "bbox":
45241               if (projection2 === "EPSG:4326" && // The CRS parameter implies version 1.3 (prior versions use SRS)
45242               /VERSION=1.3|CRS={proj}/.test(source.template().toUpperCase())) {
45243                 return maxXminY.y + "," + minXmaxY.x + "," + minXmaxY.y + "," + maxXminY.x;
45244               } else {
45245                 return minXmaxY.x + "," + maxXminY.y + "," + maxXminY.x + "," + minXmaxY.y;
45246               }
45247             case "w":
45248               return minXmaxY.x;
45249             case "s":
45250               return maxXminY.y;
45251             case "n":
45252               return maxXminY.x;
45253             case "e":
45254               return minXmaxY.y;
45255             default:
45256               return token;
45257           }
45258         });
45259       } else if (source.type === "tms") {
45260         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" : "");
45261       } else if (source.type === "bing") {
45262         result = result.replace("{u}", function() {
45263           var u = "";
45264           for (var zoom = coord2[2]; zoom > 0; zoom--) {
45265             var b = 0;
45266             var mask = 1 << zoom - 1;
45267             if ((coord2[0] & mask) !== 0)
45268               b++;
45269             if ((coord2[1] & mask) !== 0)
45270               b += 2;
45271             u += b.toString();
45272           }
45273           return u;
45274         });
45275       }
45276       result = result.replace(/\{switch:([^}]+)\}/, function(s, r) {
45277         var subdomains = r.split(",");
45278         return subdomains[(coord2[0] + coord2[1]) % subdomains.length];
45279       });
45280       return result;
45281     };
45282     source.validZoom = function(z) {
45283       return source.zoomExtent[0] <= z && (source.overzoom || source.zoomExtent[1] > z);
45284     };
45285     source.isLocatorOverlay = function() {
45286       return source.id === "mapbox_locator_overlay";
45287     };
45288     source.isHidden = function() {
45289       return source.id === "DigitalGlobe-Premium-vintage" || source.id === "DigitalGlobe-Standard-vintage";
45290     };
45291     source.copyrightNotices = function() {
45292     };
45293     source.getMetadata = function(center, tileCoord, callback) {
45294       var vintage = {
45295         start: localeDateString(source.startDate),
45296         end: localeDateString(source.endDate)
45297       };
45298       vintage.range = vintageRange(vintage);
45299       var metadata = { vintage };
45300       callback(null, metadata);
45301     };
45302     return source;
45303   }
45304   rendererBackgroundSource.Bing = function(data, dispatch10) {
45305     data.template = "https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=1&pr=odbl&n=z";
45306     var bing = rendererBackgroundSource(data);
45307     var key = utilAesDecrypt("5c875730b09c6b422433e807e1ff060b6536c791dbfffcffc4c6b18a1bdba1f14593d151adb50e19e1be1ab19aef813bf135d0f103475e5c724dec94389e45d0");
45308     const strictParam = "n";
45309     var url = "https://dev.virtualearth.net/REST/v1/Imagery/Metadata/AerialOSM?include=ImageryProviders&uriScheme=https&key=" + key;
45310     var cache = {};
45311     var inflight = {};
45312     var providers = [];
45313     var taskQueue = new IntervalTasksQueue(250);
45314     var metadataLastZoom = -1;
45315     json_default(url).then(function(json) {
45316       let imageryResource = json.resourceSets[0].resources[0];
45317       let template = imageryResource.imageUrl;
45318       let subDomains = imageryResource.imageUrlSubdomains;
45319       let subDomainNumbers = subDomains.map((subDomain) => {
45320         return subDomain.substring(1);
45321       }).join(",");
45322       template = template.replace("{subdomain}", `t{switch:${subDomainNumbers}}`).replace("{quadkey}", "{u}");
45323       if (!new URLSearchParams(template).has(strictParam)) {
45324         template += `&${strictParam}=z`;
45325       }
45326       bing.template(template);
45327       providers = imageryResource.imageryProviders.map(function(provider) {
45328         return {
45329           attribution: provider.attribution,
45330           areas: provider.coverageAreas.map(function(area) {
45331             return {
45332               zoom: [area.zoomMin, area.zoomMax],
45333               extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
45334             };
45335           })
45336         };
45337       });
45338       dispatch10.call("change");
45339     }).catch(function() {
45340     });
45341     bing.copyrightNotices = function(zoom, extent) {
45342       zoom = Math.min(zoom, 21);
45343       return providers.filter(function(provider) {
45344         return provider.areas.some(function(area) {
45345           return extent.intersects(area.extent) && area.zoom[0] <= zoom && area.zoom[1] >= zoom;
45346         });
45347       }).map(function(provider) {
45348         return provider.attribution;
45349       }).join(", ");
45350     };
45351     bing.getMetadata = function(center, tileCoord, callback) {
45352       var tileID = tileCoord.slice(0, 3).join("/");
45353       var zoom = Math.min(tileCoord[2], 21);
45354       var centerPoint = center[1] + "," + center[0];
45355       var url2 = "https://dev.virtualearth.net/REST/v1/Imagery/BasicMetadata/AerialOSM/" + centerPoint + "?zl=" + zoom + "&key=" + key;
45356       if (inflight[tileID])
45357         return;
45358       if (!cache[tileID]) {
45359         cache[tileID] = {};
45360       }
45361       if (cache[tileID] && cache[tileID].metadata) {
45362         return callback(null, cache[tileID].metadata);
45363       }
45364       inflight[tileID] = true;
45365       if (metadataLastZoom !== tileCoord[2]) {
45366         metadataLastZoom = tileCoord[2];
45367         taskQueue.clear();
45368       }
45369       taskQueue.enqueue(() => {
45370         json_default(url2).then(function(result) {
45371           delete inflight[tileID];
45372           if (!result) {
45373             throw new Error("Unknown Error");
45374           }
45375           var vintage = {
45376             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
45377             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
45378           };
45379           vintage.range = vintageRange(vintage);
45380           var metadata = { vintage };
45381           cache[tileID].metadata = metadata;
45382           if (callback)
45383             callback(null, metadata);
45384         }).catch(function(err) {
45385           delete inflight[tileID];
45386           if (callback)
45387             callback(err.message);
45388         });
45389       });
45390     };
45391     bing.terms_url = "https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details";
45392     return bing;
45393   };
45394   rendererBackgroundSource.Esri = function(data) {
45395     if (data.template.match(/blankTile/) === null) {
45396       data.template = data.template + "?blankTile=false";
45397     }
45398     var esri = rendererBackgroundSource(data);
45399     var cache = {};
45400     var inflight = {};
45401     var _prevCenter;
45402     esri.fetchTilemap = function(center) {
45403       if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5e3)
45404         return;
45405       _prevCenter = center;
45406       var z = 20;
45407       var dummyUrl = esri.url([1, 2, 3]);
45408       var x = Math.floor((center[0] + 180) / 360 * Math.pow(2, z));
45409       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));
45410       var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, "tilemap") + "/" + z + "/" + y + "/" + x + "/8/8";
45411       json_default(tilemapUrl).then(function(tilemap) {
45412         if (!tilemap) {
45413           throw new Error("Unknown Error");
45414         }
45415         var hasTiles = true;
45416         for (var i2 = 0; i2 < tilemap.data.length; i2++) {
45417           if (!tilemap.data[i2]) {
45418             hasTiles = false;
45419             break;
45420           }
45421         }
45422         esri.zoomExtent[1] = hasTiles ? 22 : 19;
45423       }).catch(function() {
45424       });
45425     };
45426     esri.getMetadata = function(center, tileCoord, callback) {
45427       if (esri.id !== "EsriWorldImagery") {
45428         return callback(null, {});
45429       }
45430       var tileID = tileCoord.slice(0, 3).join("/");
45431       var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
45432       var centerPoint = center[0] + "," + center[1];
45433       var unknown = _t("info_panels.background.unknown");
45434       var vintage = {};
45435       var metadata = {};
45436       if (inflight[tileID])
45437         return;
45438       var url = "https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/4/query";
45439       url += "?returnGeometry=false&geometry=" + centerPoint + "&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json";
45440       if (!cache[tileID]) {
45441         cache[tileID] = {};
45442       }
45443       if (cache[tileID] && cache[tileID].metadata) {
45444         return callback(null, cache[tileID].metadata);
45445       }
45446       inflight[tileID] = true;
45447       json_default(url).then(function(result) {
45448         delete inflight[tileID];
45449         result = result.features.map((f2) => f2.attributes).filter((a) => a.MinMapLevel <= zoom && a.MaxMapLevel >= zoom)[0];
45450         if (!result) {
45451           throw new Error("Unknown Error");
45452         } else if (result.features && result.features.length < 1) {
45453           throw new Error("No Results");
45454         } else if (result.error && result.error.message) {
45455           throw new Error(result.error.message);
45456         }
45457         var captureDate = localeDateString(result.SRC_DATE2);
45458         vintage = {
45459           start: captureDate,
45460           end: captureDate,
45461           range: captureDate
45462         };
45463         metadata = {
45464           vintage,
45465           source: clean2(result.NICE_NAME),
45466           description: clean2(result.NICE_DESC),
45467           resolution: clean2(+Number(result.SRC_RES).toFixed(4)),
45468           accuracy: clean2(+Number(result.SRC_ACC).toFixed(4))
45469         };
45470         if (isFinite(metadata.resolution)) {
45471           metadata.resolution += " m";
45472         }
45473         if (isFinite(metadata.accuracy)) {
45474           metadata.accuracy += " m";
45475         }
45476         cache[tileID].metadata = metadata;
45477         if (callback)
45478           callback(null, metadata);
45479       }).catch(function(err) {
45480         delete inflight[tileID];
45481         if (callback)
45482           callback(err.message);
45483       });
45484       function clean2(val) {
45485         return String(val).trim() || unknown;
45486       }
45487     };
45488     return esri;
45489   };
45490   rendererBackgroundSource.None = function() {
45491     var source = rendererBackgroundSource({ id: "none", template: "" });
45492     source.name = function() {
45493       return _t("background.none");
45494     };
45495     source.label = function() {
45496       return _t.append("background.none");
45497     };
45498     source.imageryUsed = function() {
45499       return null;
45500     };
45501     source.area = function() {
45502       return -1;
45503     };
45504     return source;
45505   };
45506   rendererBackgroundSource.Custom = function(template) {
45507     var source = rendererBackgroundSource({ id: "custom", template });
45508     source.name = function() {
45509       return _t("background.custom");
45510     };
45511     source.label = function() {
45512       return _t.append("background.custom");
45513     };
45514     source.imageryUsed = function() {
45515       var cleaned = source.template();
45516       if (cleaned.indexOf("?") !== -1) {
45517         var parts = cleaned.split("?", 2);
45518         var qs = utilStringQs(parts[1]);
45519         ["access_token", "connectId", "token"].forEach(function(param) {
45520           if (qs[param]) {
45521             qs[param] = "{apikey}";
45522           }
45523         });
45524         cleaned = parts[0] + "?" + utilQsString(qs, true);
45525       }
45526       cleaned = cleaned.replace(/token\/(\w+)/, "token/{apikey}").replace(/key=(\w+)/, "key={apikey}");
45527       return "Custom (" + cleaned + " )";
45528     };
45529     source.area = function() {
45530       return -2;
45531     };
45532     return source;
45533   };
45534
45535   // node_modules/@turf/helpers/dist/es/index.js
45536   var earthRadius = 63710088e-1;
45537   var factors = {
45538     centimeters: earthRadius * 100,
45539     centimetres: earthRadius * 100,
45540     degrees: earthRadius / 111325,
45541     feet: earthRadius * 3.28084,
45542     inches: earthRadius * 39.37,
45543     kilometers: earthRadius / 1e3,
45544     kilometres: earthRadius / 1e3,
45545     meters: earthRadius,
45546     metres: earthRadius,
45547     miles: earthRadius / 1609.344,
45548     millimeters: earthRadius * 1e3,
45549     millimetres: earthRadius * 1e3,
45550     nauticalmiles: earthRadius / 1852,
45551     radians: 1,
45552     yards: earthRadius * 1.0936
45553   };
45554   var unitsFactors = {
45555     centimeters: 100,
45556     centimetres: 100,
45557     degrees: 1 / 111325,
45558     feet: 3.28084,
45559     inches: 39.37,
45560     kilometers: 1 / 1e3,
45561     kilometres: 1 / 1e3,
45562     meters: 1,
45563     metres: 1,
45564     miles: 1 / 1609.344,
45565     millimeters: 1e3,
45566     millimetres: 1e3,
45567     nauticalmiles: 1 / 1852,
45568     radians: 1 / earthRadius,
45569     yards: 1.0936133
45570   };
45571   function feature2(geom, properties, options2) {
45572     if (options2 === void 0) {
45573       options2 = {};
45574     }
45575     var feat = { type: "Feature" };
45576     if (options2.id === 0 || options2.id) {
45577       feat.id = options2.id;
45578     }
45579     if (options2.bbox) {
45580       feat.bbox = options2.bbox;
45581     }
45582     feat.properties = properties || {};
45583     feat.geometry = geom;
45584     return feat;
45585   }
45586   function polygon(coordinates, properties, options2) {
45587     if (options2 === void 0) {
45588       options2 = {};
45589     }
45590     for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
45591       var ring = coordinates_1[_i];
45592       if (ring.length < 4) {
45593         throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
45594       }
45595       for (var j2 = 0; j2 < ring[ring.length - 1].length; j2++) {
45596         if (ring[ring.length - 1][j2] !== ring[0][j2]) {
45597           throw new Error("First and last Position are not equivalent.");
45598         }
45599       }
45600     }
45601     var geom = {
45602       type: "Polygon",
45603       coordinates
45604     };
45605     return feature2(geom, properties, options2);
45606   }
45607   function lineString(coordinates, properties, options2) {
45608     if (options2 === void 0) {
45609       options2 = {};
45610     }
45611     if (coordinates.length < 2) {
45612       throw new Error("coordinates must be an array of two or more positions");
45613     }
45614     var geom = {
45615       type: "LineString",
45616       coordinates
45617     };
45618     return feature2(geom, properties, options2);
45619   }
45620   function multiLineString(coordinates, properties, options2) {
45621     if (options2 === void 0) {
45622       options2 = {};
45623     }
45624     var geom = {
45625       type: "MultiLineString",
45626       coordinates
45627     };
45628     return feature2(geom, properties, options2);
45629   }
45630   function multiPolygon(coordinates, properties, options2) {
45631     if (options2 === void 0) {
45632       options2 = {};
45633     }
45634     var geom = {
45635       type: "MultiPolygon",
45636       coordinates
45637     };
45638     return feature2(geom, properties, options2);
45639   }
45640
45641   // node_modules/@turf/invariant/dist/es/index.js
45642   function getGeom(geojson) {
45643     if (geojson.type === "Feature") {
45644       return geojson.geometry;
45645     }
45646     return geojson;
45647   }
45648
45649   // node_modules/@turf/bbox-clip/dist/es/lib/lineclip.js
45650   function lineclip(points, bbox2, result) {
45651     var len = points.length, codeA = bitCode(points[0], bbox2), part = [], i2, codeB, lastCode;
45652     var a;
45653     var b;
45654     if (!result)
45655       result = [];
45656     for (i2 = 1; i2 < len; i2++) {
45657       a = points[i2 - 1];
45658       b = points[i2];
45659       codeB = lastCode = bitCode(b, bbox2);
45660       while (true) {
45661         if (!(codeA | codeB)) {
45662           part.push(a);
45663           if (codeB !== lastCode) {
45664             part.push(b);
45665             if (i2 < len - 1) {
45666               result.push(part);
45667               part = [];
45668             }
45669           } else if (i2 === len - 1) {
45670             part.push(b);
45671           }
45672           break;
45673         } else if (codeA & codeB) {
45674           break;
45675         } else if (codeA) {
45676           a = intersect(a, b, codeA, bbox2);
45677           codeA = bitCode(a, bbox2);
45678         } else {
45679           b = intersect(a, b, codeB, bbox2);
45680           codeB = bitCode(b, bbox2);
45681         }
45682       }
45683       codeA = lastCode;
45684     }
45685     if (part.length)
45686       result.push(part);
45687     return result;
45688   }
45689   function polygonclip(points, bbox2) {
45690     var result, edge, prev, prevInside, i2, p, inside;
45691     for (edge = 1; edge <= 8; edge *= 2) {
45692       result = [];
45693       prev = points[points.length - 1];
45694       prevInside = !(bitCode(prev, bbox2) & edge);
45695       for (i2 = 0; i2 < points.length; i2++) {
45696         p = points[i2];
45697         inside = !(bitCode(p, bbox2) & edge);
45698         if (inside !== prevInside)
45699           result.push(intersect(prev, p, edge, bbox2));
45700         if (inside)
45701           result.push(p);
45702         prev = p;
45703         prevInside = inside;
45704       }
45705       points = result;
45706       if (!points.length)
45707         break;
45708     }
45709     return result;
45710   }
45711   function intersect(a, b, edge, bbox2) {
45712     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;
45713   }
45714   function bitCode(p, bbox2) {
45715     var code = 0;
45716     if (p[0] < bbox2[0])
45717       code |= 1;
45718     else if (p[0] > bbox2[2])
45719       code |= 2;
45720     if (p[1] < bbox2[1])
45721       code |= 4;
45722     else if (p[1] > bbox2[3])
45723       code |= 8;
45724     return code;
45725   }
45726
45727   // node_modules/@turf/bbox-clip/dist/es/index.js
45728   function bboxClip(feature3, bbox2) {
45729     var geom = getGeom(feature3);
45730     var type2 = geom.type;
45731     var properties = feature3.type === "Feature" ? feature3.properties : {};
45732     var coords = geom.coordinates;
45733     switch (type2) {
45734       case "LineString":
45735       case "MultiLineString": {
45736         var lines_1 = [];
45737         if (type2 === "LineString") {
45738           coords = [coords];
45739         }
45740         coords.forEach(function(line) {
45741           lineclip(line, bbox2, lines_1);
45742         });
45743         if (lines_1.length === 1) {
45744           return lineString(lines_1[0], properties);
45745         }
45746         return multiLineString(lines_1, properties);
45747       }
45748       case "Polygon":
45749         return polygon(clipPolygon(coords, bbox2), properties);
45750       case "MultiPolygon":
45751         return multiPolygon(coords.map(function(poly) {
45752           return clipPolygon(poly, bbox2);
45753         }), properties);
45754       default:
45755         throw new Error("geometry " + type2 + " not supported");
45756     }
45757   }
45758   function clipPolygon(rings, bbox2) {
45759     var outRings = [];
45760     for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
45761       var ring = rings_1[_i];
45762       var clipped = polygonclip(ring, bbox2);
45763       if (clipped.length > 0) {
45764         if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
45765           clipped.push(clipped[0]);
45766         }
45767         if (clipped.length >= 4) {
45768           outRings.push(clipped);
45769         }
45770       }
45771     }
45772     return outRings;
45773   }
45774
45775   // node_modules/@turf/meta/dist/es/index.js
45776   function coordEach(geojson, callback, excludeWrapCoord) {
45777     if (geojson === null)
45778       return;
45779     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;
45780     for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
45781       geometryMaybeCollection = isFeatureCollection ? geojson.features[featureIndex].geometry : isFeature ? geojson.geometry : geojson;
45782       isGeometryCollection = geometryMaybeCollection ? geometryMaybeCollection.type === "GeometryCollection" : false;
45783       stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
45784       for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
45785         var multiFeatureIndex = 0;
45786         var geometryIndex = 0;
45787         geometry = isGeometryCollection ? geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
45788         if (geometry === null)
45789           continue;
45790         coords = geometry.coordinates;
45791         var geomType = geometry.type;
45792         wrapShrink = excludeWrapCoord && (geomType === "Polygon" || geomType === "MultiPolygon") ? 1 : 0;
45793         switch (geomType) {
45794           case null:
45795             break;
45796           case "Point":
45797             if (callback(
45798               coords,
45799               coordIndex,
45800               featureIndex,
45801               multiFeatureIndex,
45802               geometryIndex
45803             ) === false)
45804               return false;
45805             coordIndex++;
45806             multiFeatureIndex++;
45807             break;
45808           case "LineString":
45809           case "MultiPoint":
45810             for (j2 = 0; j2 < coords.length; j2++) {
45811               if (callback(
45812                 coords[j2],
45813                 coordIndex,
45814                 featureIndex,
45815                 multiFeatureIndex,
45816                 geometryIndex
45817               ) === false)
45818                 return false;
45819               coordIndex++;
45820               if (geomType === "MultiPoint")
45821                 multiFeatureIndex++;
45822             }
45823             if (geomType === "LineString")
45824               multiFeatureIndex++;
45825             break;
45826           case "Polygon":
45827           case "MultiLineString":
45828             for (j2 = 0; j2 < coords.length; j2++) {
45829               for (k = 0; k < coords[j2].length - wrapShrink; k++) {
45830                 if (callback(
45831                   coords[j2][k],
45832                   coordIndex,
45833                   featureIndex,
45834                   multiFeatureIndex,
45835                   geometryIndex
45836                 ) === false)
45837                   return false;
45838                 coordIndex++;
45839               }
45840               if (geomType === "MultiLineString")
45841                 multiFeatureIndex++;
45842               if (geomType === "Polygon")
45843                 geometryIndex++;
45844             }
45845             if (geomType === "Polygon")
45846               multiFeatureIndex++;
45847             break;
45848           case "MultiPolygon":
45849             for (j2 = 0; j2 < coords.length; j2++) {
45850               geometryIndex = 0;
45851               for (k = 0; k < coords[j2].length; k++) {
45852                 for (l = 0; l < coords[j2][k].length - wrapShrink; l++) {
45853                   if (callback(
45854                     coords[j2][k][l],
45855                     coordIndex,
45856                     featureIndex,
45857                     multiFeatureIndex,
45858                     geometryIndex
45859                   ) === false)
45860                     return false;
45861                   coordIndex++;
45862                 }
45863                 geometryIndex++;
45864               }
45865               multiFeatureIndex++;
45866             }
45867             break;
45868           case "GeometryCollection":
45869             for (j2 = 0; j2 < geometry.geometries.length; j2++)
45870               if (coordEach(geometry.geometries[j2], callback, excludeWrapCoord) === false)
45871                 return false;
45872             break;
45873           default:
45874             throw new Error("Unknown Geometry Type");
45875         }
45876       }
45877     }
45878   }
45879
45880   // node_modules/@turf/bbox/dist/es/index.js
45881   function bbox(geojson) {
45882     var result = [Infinity, Infinity, -Infinity, -Infinity];
45883     coordEach(geojson, function(coord2) {
45884       if (result[0] > coord2[0]) {
45885         result[0] = coord2[0];
45886       }
45887       if (result[1] > coord2[1]) {
45888         result[1] = coord2[1];
45889       }
45890       if (result[2] < coord2[0]) {
45891         result[2] = coord2[0];
45892       }
45893       if (result[3] < coord2[1]) {
45894         result[3] = coord2[1];
45895       }
45896     });
45897     return result;
45898   }
45899   bbox["default"] = bbox;
45900   var es_default = bbox;
45901
45902   // modules/renderer/background.js
45903   var import_which_polygon3 = __toESM(require_which_polygon());
45904
45905   // modules/renderer/tile_layer.js
45906   function rendererTileLayer(context) {
45907     var transformProp = utilPrefixCSSProperty("Transform");
45908     var tiler8 = utilTiler();
45909     var _tileSize = 256;
45910     var _projection;
45911     var _cache4 = {};
45912     var _tileOrigin;
45913     var _zoom;
45914     var _source;
45915     function tileSizeAtZoom(d, z) {
45916       var EPSILON = 2e-3;
45917       return _tileSize * Math.pow(2, z - d[2]) / _tileSize + EPSILON;
45918     }
45919     function atZoom(t, distance) {
45920       var power = Math.pow(2, distance);
45921       return [
45922         Math.floor(t[0] * power),
45923         Math.floor(t[1] * power),
45924         t[2] + distance
45925       ];
45926     }
45927     function lookUp(d) {
45928       for (var up = -1; up > -d[2]; up--) {
45929         var tile = atZoom(d, up);
45930         if (_cache4[_source.url(tile)] !== false) {
45931           return tile;
45932         }
45933       }
45934     }
45935     function uniqueBy(a, n2) {
45936       var o = [];
45937       var seen = {};
45938       for (var i2 = 0; i2 < a.length; i2++) {
45939         if (seen[a[i2][n2]] === void 0) {
45940           o.push(a[i2]);
45941           seen[a[i2][n2]] = true;
45942         }
45943       }
45944       return o;
45945     }
45946     function addSource(d) {
45947       d.push(_source.url(d));
45948       return d;
45949     }
45950     function background(selection2) {
45951       _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
45952       var pixelOffset;
45953       if (_source) {
45954         pixelOffset = [
45955           _source.offset()[0] * Math.pow(2, _zoom),
45956           _source.offset()[1] * Math.pow(2, _zoom)
45957         ];
45958       } else {
45959         pixelOffset = [0, 0];
45960       }
45961       var translate = [
45962         _projection.translate()[0] + pixelOffset[0],
45963         _projection.translate()[1] + pixelOffset[1]
45964       ];
45965       tiler8.scale(_projection.scale() * 2 * Math.PI).translate(translate);
45966       _tileOrigin = [
45967         _projection.scale() * Math.PI - translate[0],
45968         _projection.scale() * Math.PI - translate[1]
45969       ];
45970       render(selection2);
45971     }
45972     function render(selection2) {
45973       if (!_source)
45974         return;
45975       var requests = [];
45976       var showDebug = context.getDebug("tile") && !_source.overlay;
45977       if (_source.validZoom(_zoom)) {
45978         tiler8.skipNullIsland(!!_source.overlay);
45979         tiler8().forEach(function(d) {
45980           addSource(d);
45981           if (d[3] === "")
45982             return;
45983           if (typeof d[3] !== "string")
45984             return;
45985           requests.push(d);
45986           if (_cache4[d[3]] === false && lookUp(d)) {
45987             requests.push(addSource(lookUp(d)));
45988           }
45989         });
45990         requests = uniqueBy(requests, 3).filter(function(r) {
45991           return _cache4[r[3]] !== false;
45992         });
45993       }
45994       function load(d3_event, d) {
45995         _cache4[d[3]] = true;
45996         select_default2(this).on("error", null).on("load", null).classed("tile-loaded", true);
45997         render(selection2);
45998       }
45999       function error(d3_event, d) {
46000         _cache4[d[3]] = false;
46001         select_default2(this).on("error", null).on("load", null).remove();
46002         render(selection2);
46003       }
46004       function imageTransform(d) {
46005         var ts = _tileSize * Math.pow(2, _zoom - d[2]);
46006         var scale = tileSizeAtZoom(d, _zoom);
46007         return "translate(" + (d[0] * ts - _tileOrigin[0]) + "px," + (d[1] * ts - _tileOrigin[1]) + "px) scale(" + scale + "," + scale + ")";
46008       }
46009       function tileCenter(d) {
46010         var ts = _tileSize * Math.pow(2, _zoom - d[2]);
46011         return [
46012           d[0] * ts - _tileOrigin[0] + ts / 2,
46013           d[1] * ts - _tileOrigin[1] + ts / 2
46014         ];
46015       }
46016       function debugTransform(d) {
46017         var coord2 = tileCenter(d);
46018         return "translate(" + coord2[0] + "px," + coord2[1] + "px)";
46019       }
46020       var dims = tiler8.size();
46021       var mapCenter = [dims[0] / 2, dims[1] / 2];
46022       var minDist = Math.max(dims[0], dims[1]);
46023       var nearCenter;
46024       requests.forEach(function(d) {
46025         var c = tileCenter(d);
46026         var dist = geoVecLength(c, mapCenter);
46027         if (dist < minDist) {
46028           minDist = dist;
46029           nearCenter = d;
46030         }
46031       });
46032       var image = selection2.selectAll("img").data(requests, function(d) {
46033         return d[3];
46034       });
46035       image.exit().style(transformProp, imageTransform).classed("tile-removing", true).classed("tile-center", false).each(function() {
46036         var tile = select_default2(this);
46037         window.setTimeout(function() {
46038           if (tile.classed("tile-removing")) {
46039             tile.remove();
46040           }
46041         }, 300);
46042       });
46043       image.enter().append("img").attr("class", "tile").attr("alt", "").attr("draggable", "false").style("width", _tileSize + "px").style("height", _tileSize + "px").attr("src", function(d) {
46044         return d[3];
46045       }).on("error", error).on("load", load).merge(image).style(transformProp, imageTransform).classed("tile-debug", showDebug).classed("tile-removing", false).classed("tile-center", function(d) {
46046         return d === nearCenter;
46047       });
46048       var debug2 = selection2.selectAll(".tile-label-debug").data(showDebug ? requests : [], function(d) {
46049         return d[3];
46050       });
46051       debug2.exit().remove();
46052       if (showDebug) {
46053         var debugEnter = debug2.enter().append("div").attr("class", "tile-label-debug");
46054         debugEnter.append("div").attr("class", "tile-label-debug-coord");
46055         debugEnter.append("div").attr("class", "tile-label-debug-vintage");
46056         debug2 = debug2.merge(debugEnter);
46057         debug2.style(transformProp, debugTransform);
46058         debug2.selectAll(".tile-label-debug-coord").text(function(d) {
46059           return d[2] + " / " + d[0] + " / " + d[1];
46060         });
46061         debug2.selectAll(".tile-label-debug-vintage").each(function(d) {
46062           var span = select_default2(this);
46063           var center = context.projection.invert(tileCenter(d));
46064           _source.getMetadata(center, d, function(err, result) {
46065             if (result && result.vintage && result.vintage.range) {
46066               span.text(result.vintage.range);
46067             } else {
46068               span.text("");
46069               span.call(_t.append("info_panels.background.vintage"));
46070               span.append("span").text(": ");
46071               span.call(_t.append("info_panels.background.unknown"));
46072             }
46073           });
46074         });
46075       }
46076     }
46077     background.projection = function(val) {
46078       if (!arguments.length)
46079         return _projection;
46080       _projection = val;
46081       return background;
46082     };
46083     background.dimensions = function(val) {
46084       if (!arguments.length)
46085         return tiler8.size();
46086       tiler8.size(val);
46087       return background;
46088     };
46089     background.source = function(val) {
46090       if (!arguments.length)
46091         return _source;
46092       _source = val;
46093       _tileSize = _source.tileSize;
46094       _cache4 = {};
46095       tiler8.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
46096       return background;
46097     };
46098     return background;
46099   }
46100
46101   // modules/renderer/background.js
46102   var _imageryIndex = null;
46103   function rendererBackground(context) {
46104     const dispatch10 = dispatch_default("change");
46105     const baseLayer = rendererTileLayer(context).projection(context.projection);
46106     let _checkedBlocklists = [];
46107     let _isValid = true;
46108     let _overlayLayers = [];
46109     let _brightness = 1;
46110     let _contrast = 1;
46111     let _saturation = 1;
46112     let _sharpness = 1;
46113     function ensureImageryIndex() {
46114       return _mainFileFetcher.get("imagery").then((sources) => {
46115         if (_imageryIndex)
46116           return _imageryIndex;
46117         _imageryIndex = {
46118           imagery: sources,
46119           features: {}
46120         };
46121         const features = sources.map((source) => {
46122           if (!source.polygon)
46123             return null;
46124           const rings = source.polygon.map((ring) => [ring]);
46125           const feature3 = {
46126             type: "Feature",
46127             properties: { id: source.id },
46128             geometry: { type: "MultiPolygon", coordinates: rings }
46129           };
46130           _imageryIndex.features[source.id] = feature3;
46131           return feature3;
46132         }).filter(Boolean);
46133         _imageryIndex.query = (0, import_which_polygon3.default)({ type: "FeatureCollection", features });
46134         _imageryIndex.backgrounds = sources.map((source) => {
46135           if (source.type === "bing") {
46136             return rendererBackgroundSource.Bing(source, dispatch10);
46137           } else if (/^EsriWorldImagery/.test(source.id)) {
46138             return rendererBackgroundSource.Esri(source);
46139           } else {
46140             return rendererBackgroundSource(source);
46141           }
46142         });
46143         _imageryIndex.backgrounds.unshift(rendererBackgroundSource.None());
46144         let template = corePreferences("background-custom-template") || "";
46145         const custom = rendererBackgroundSource.Custom(template);
46146         _imageryIndex.backgrounds.unshift(custom);
46147         return _imageryIndex;
46148       });
46149     }
46150     function background(selection2) {
46151       const currSource = baseLayer.source();
46152       if (context.map().zoom() > 18) {
46153         if (currSource && /^EsriWorldImagery/.test(currSource.id)) {
46154           const center = context.map().center();
46155           currSource.fetchTilemap(center);
46156         }
46157       }
46158       const sources = background.sources(context.map().extent());
46159       const wasValid = _isValid;
46160       _isValid = !!sources.filter((d) => d === currSource).length;
46161       if (wasValid !== _isValid) {
46162         background.updateImagery();
46163       }
46164       let baseFilter = "";
46165       if (_brightness !== 1) {
46166         baseFilter += ` brightness(${_brightness})`;
46167       }
46168       if (_contrast !== 1) {
46169         baseFilter += ` contrast(${_contrast})`;
46170       }
46171       if (_saturation !== 1) {
46172         baseFilter += ` saturate(${_saturation})`;
46173       }
46174       if (_sharpness < 1) {
46175         const blur = number_default(0.5, 5)(1 - _sharpness);
46176         baseFilter += ` blur(${blur}px)`;
46177       }
46178       let base = selection2.selectAll(".layer-background").data([0]);
46179       base = base.enter().insert("div", ".layer-data").attr("class", "layer layer-background").merge(base);
46180       base.style("filter", baseFilter || null);
46181       let imagery = base.selectAll(".layer-imagery").data([0]);
46182       imagery.enter().append("div").attr("class", "layer layer-imagery").merge(imagery).call(baseLayer);
46183       let maskFilter = "";
46184       let mixBlendMode = "";
46185       if (_sharpness > 1) {
46186         mixBlendMode = "overlay";
46187         maskFilter = "saturate(0) blur(3px) invert(1)";
46188         let contrast = _sharpness - 1;
46189         maskFilter += ` contrast(${contrast})`;
46190         let brightness = number_default(1, 0.85)(_sharpness - 1);
46191         maskFilter += ` brightness(${brightness})`;
46192       }
46193       let mask = base.selectAll(".layer-unsharp-mask").data(_sharpness > 1 ? [0] : []);
46194       mask.exit().remove();
46195       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);
46196       let overlays = selection2.selectAll(".layer-overlay").data(_overlayLayers, (d) => d.source().name());
46197       overlays.exit().remove();
46198       overlays.enter().insert("div", ".layer-data").attr("class", "layer layer-overlay").merge(overlays).each((layer, i2, nodes) => select_default2(nodes[i2]).call(layer));
46199     }
46200     background.updateImagery = function() {
46201       let currSource = baseLayer.source();
46202       if (context.inIntro() || !currSource)
46203         return;
46204       let o = _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).map((d) => d.source().id).join(",");
46205       const meters = geoOffsetToMeters(currSource.offset());
46206       const EPSILON = 0.01;
46207       const x = +meters[0].toFixed(2);
46208       const y = +meters[1].toFixed(2);
46209       let hash = utilStringQs(window.location.hash);
46210       let id2 = currSource.id;
46211       if (id2 === "custom") {
46212         id2 = `custom:${currSource.template()}`;
46213       }
46214       if (id2) {
46215         hash.background = id2;
46216       } else {
46217         delete hash.background;
46218       }
46219       if (o) {
46220         hash.overlays = o;
46221       } else {
46222         delete hash.overlays;
46223       }
46224       if (Math.abs(x) > EPSILON || Math.abs(y) > EPSILON) {
46225         hash.offset = `${x},${y}`;
46226       } else {
46227         delete hash.offset;
46228       }
46229       if (!window.mocha) {
46230         window.location.replace("#" + utilQsString(hash, true));
46231       }
46232       let imageryUsed = [];
46233       let photoOverlaysUsed = [];
46234       const currUsed = currSource.imageryUsed();
46235       if (currUsed && _isValid) {
46236         imageryUsed.push(currUsed);
46237       }
46238       _overlayLayers.filter((d) => !d.source().isLocatorOverlay() && !d.source().isHidden()).forEach((d) => imageryUsed.push(d.source().imageryUsed()));
46239       const dataLayer = context.layers().layer("data");
46240       if (dataLayer && dataLayer.enabled() && dataLayer.hasData()) {
46241         imageryUsed.push(dataLayer.getSrc());
46242       }
46243       const photoOverlayLayers = {
46244         streetside: "Bing Streetside",
46245         mapillary: "Mapillary Images",
46246         "mapillary-map-features": "Mapillary Map Features",
46247         "mapillary-signs": "Mapillary Signs",
46248         kartaview: "KartaView Images"
46249       };
46250       for (let layerID in photoOverlayLayers) {
46251         const layer = context.layers().layer(layerID);
46252         if (layer && layer.enabled()) {
46253           photoOverlaysUsed.push(layerID);
46254           imageryUsed.push(photoOverlayLayers[layerID]);
46255         }
46256       }
46257       context.history().imageryUsed(imageryUsed);
46258       context.history().photoOverlaysUsed(photoOverlaysUsed);
46259     };
46260     background.sources = (extent, zoom, includeCurrent) => {
46261       if (!_imageryIndex)
46262         return [];
46263       let visible = {};
46264       (_imageryIndex.query.bbox(extent.rectangle(), true) || []).forEach((d) => visible[d.id] = true);
46265       const currSource = baseLayer.source();
46266       const osm = context.connection();
46267       const blocklists = osm && osm.imageryBlocklists() || [];
46268       const blocklistChanged = blocklists.length !== _checkedBlocklists.length || blocklists.some((regex, index) => String(regex) !== _checkedBlocklists[index]);
46269       if (blocklistChanged) {
46270         _imageryIndex.backgrounds.forEach((source) => {
46271           source.isBlocked = blocklists.some((regex) => regex.test(source.template()));
46272         });
46273         _checkedBlocklists = blocklists.map((regex) => String(regex));
46274       }
46275       return _imageryIndex.backgrounds.filter((source) => {
46276         if (includeCurrent && currSource === source)
46277           return true;
46278         if (source.isBlocked)
46279           return false;
46280         if (!source.polygon)
46281           return true;
46282         if (zoom && zoom < 6)
46283           return false;
46284         return visible[source.id];
46285       });
46286     };
46287     background.dimensions = (val) => {
46288       if (!val)
46289         return;
46290       baseLayer.dimensions(val);
46291       _overlayLayers.forEach((layer) => layer.dimensions(val));
46292     };
46293     background.baseLayerSource = function(d) {
46294       if (!arguments.length)
46295         return baseLayer.source();
46296       const osm = context.connection();
46297       if (!osm)
46298         return background;
46299       const blocklists = osm.imageryBlocklists();
46300       const template = d.template();
46301       let fail = false;
46302       let tested = 0;
46303       let regex;
46304       for (let i2 = 0; i2 < blocklists.length; i2++) {
46305         regex = blocklists[i2];
46306         fail = regex.test(template);
46307         tested++;
46308         if (fail)
46309           break;
46310       }
46311       if (!tested) {
46312         regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
46313         fail = regex.test(template);
46314       }
46315       baseLayer.source(!fail ? d : background.findSource("none"));
46316       dispatch10.call("change");
46317       background.updateImagery();
46318       return background;
46319     };
46320     background.findSource = (id2) => {
46321       if (!id2 || !_imageryIndex)
46322         return null;
46323       return _imageryIndex.backgrounds.find((d) => d.id && d.id === id2);
46324     };
46325     background.bing = () => {
46326       background.baseLayerSource(background.findSource("Bing"));
46327     };
46328     background.showsLayer = (d) => {
46329       const currSource = baseLayer.source();
46330       if (!d || !currSource)
46331         return false;
46332       return d.id === currSource.id || _overlayLayers.some((layer) => d.id === layer.source().id);
46333     };
46334     background.overlayLayerSources = () => {
46335       return _overlayLayers.map((layer) => layer.source());
46336     };
46337     background.toggleOverlayLayer = (d) => {
46338       let layer;
46339       for (let i2 = 0; i2 < _overlayLayers.length; i2++) {
46340         layer = _overlayLayers[i2];
46341         if (layer.source() === d) {
46342           _overlayLayers.splice(i2, 1);
46343           dispatch10.call("change");
46344           background.updateImagery();
46345           return;
46346         }
46347       }
46348       layer = rendererTileLayer(context).source(d).projection(context.projection).dimensions(
46349         baseLayer.dimensions()
46350       );
46351       _overlayLayers.push(layer);
46352       dispatch10.call("change");
46353       background.updateImagery();
46354     };
46355     background.nudge = (d, zoom) => {
46356       const currSource = baseLayer.source();
46357       if (currSource) {
46358         currSource.nudge(d, zoom);
46359         dispatch10.call("change");
46360         background.updateImagery();
46361       }
46362       return background;
46363     };
46364     background.offset = function(d) {
46365       const currSource = baseLayer.source();
46366       if (!arguments.length) {
46367         return currSource && currSource.offset() || [0, 0];
46368       }
46369       if (currSource) {
46370         currSource.offset(d);
46371         dispatch10.call("change");
46372         background.updateImagery();
46373       }
46374       return background;
46375     };
46376     background.brightness = function(d) {
46377       if (!arguments.length)
46378         return _brightness;
46379       _brightness = d;
46380       if (context.mode())
46381         dispatch10.call("change");
46382       return background;
46383     };
46384     background.contrast = function(d) {
46385       if (!arguments.length)
46386         return _contrast;
46387       _contrast = d;
46388       if (context.mode())
46389         dispatch10.call("change");
46390       return background;
46391     };
46392     background.saturation = function(d) {
46393       if (!arguments.length)
46394         return _saturation;
46395       _saturation = d;
46396       if (context.mode())
46397         dispatch10.call("change");
46398       return background;
46399     };
46400     background.sharpness = function(d) {
46401       if (!arguments.length)
46402         return _sharpness;
46403       _sharpness = d;
46404       if (context.mode())
46405         dispatch10.call("change");
46406       return background;
46407     };
46408     let _loadPromise;
46409     background.ensureLoaded = () => {
46410       if (_loadPromise)
46411         return _loadPromise;
46412       return _loadPromise = ensureImageryIndex();
46413     };
46414     background.init = () => {
46415       const loadPromise = background.ensureLoaded();
46416       const hash = utilStringQs(window.location.hash);
46417       const requestedBackground = hash.background || hash.layer;
46418       const lastUsedBackground = corePreferences("background-last-used");
46419       return loadPromise.then((imageryIndex) => {
46420         const extent = context.map().extent();
46421         const validBackgrounds = background.sources(extent).filter((d) => d.id !== "none" && d.id !== "custom");
46422         const first = validBackgrounds.length && validBackgrounds[0];
46423         const isLastUsedValid = !!validBackgrounds.find((d) => d.id && d.id === lastUsedBackground);
46424         let best;
46425         if (!requestedBackground && extent) {
46426           const viewArea = extent.area();
46427           best = validBackgrounds.find((s) => {
46428             if (!s.best() || s.overlay)
46429               return false;
46430             let bbox2 = es_default(bboxClip(
46431               { type: "MultiPolygon", coordinates: [s.polygon || [extent.polygon()]] },
46432               extent.rectangle()
46433             ));
46434             let area = geoExtent(bbox2.slice(0, 2), bbox2.slice(2, 4)).area();
46435             return area / viewArea > 0.5;
46436           });
46437         }
46438         if (requestedBackground && requestedBackground.indexOf("custom:") === 0) {
46439           const template = requestedBackground.replace(/^custom:/, "");
46440           const custom = background.findSource("custom");
46441           background.baseLayerSource(custom.template(template));
46442           corePreferences("background-custom-template", template);
46443         } else {
46444           background.baseLayerSource(
46445             background.findSource(requestedBackground) || best || isLastUsedValid && background.findSource(lastUsedBackground) || background.findSource("Bing") || first || background.findSource("none")
46446           );
46447         }
46448         const locator = imageryIndex.backgrounds.find((d) => d.overlay && d.default);
46449         if (locator) {
46450           background.toggleOverlayLayer(locator);
46451         }
46452         const overlays = (hash.overlays || "").split(",");
46453         overlays.forEach((overlay) => {
46454           overlay = background.findSource(overlay);
46455           if (overlay) {
46456             background.toggleOverlayLayer(overlay);
46457           }
46458         });
46459         if (hash.gpx) {
46460           const gpx2 = context.layers().layer("data");
46461           if (gpx2) {
46462             gpx2.url(hash.gpx, ".gpx");
46463           }
46464         }
46465         if (hash.offset) {
46466           const offset = hash.offset.replace(/;/g, ",").split(",").map((n2) => !isNaN(n2) && n2);
46467           if (offset.length === 2) {
46468             background.offset(geoMetersToOffset(offset));
46469           }
46470         }
46471       }).catch((err) => {
46472         console.error(err);
46473       });
46474     };
46475     return utilRebind(background, dispatch10, "on");
46476   }
46477
46478   // modules/renderer/features.js
46479   function rendererFeatures(context) {
46480     var dispatch10 = dispatch_default("change", "redraw");
46481     var features = utilRebind({}, dispatch10, "on");
46482     var _deferred2 = /* @__PURE__ */ new Set();
46483     var traffic_roads = {
46484       "motorway": true,
46485       "motorway_link": true,
46486       "trunk": true,
46487       "trunk_link": true,
46488       "primary": true,
46489       "primary_link": true,
46490       "secondary": true,
46491       "secondary_link": true,
46492       "tertiary": true,
46493       "tertiary_link": true,
46494       "residential": true,
46495       "unclassified": true,
46496       "living_street": true,
46497       "busway": true
46498     };
46499     var service_roads = {
46500       "service": true,
46501       "road": true,
46502       "track": true
46503     };
46504     var paths = {
46505       "path": true,
46506       "footway": true,
46507       "cycleway": true,
46508       "bridleway": true,
46509       "steps": true,
46510       "pedestrian": true
46511     };
46512     var _cullFactor = 1;
46513     var _cache4 = {};
46514     var _rules = {};
46515     var _stats = {};
46516     var _keys = [];
46517     var _hidden = [];
46518     var _forceVisible = {};
46519     function update() {
46520       if (!window.mocha) {
46521         var hash = utilStringQs(window.location.hash);
46522         var disabled = features.disabled();
46523         if (disabled.length) {
46524           hash.disable_features = disabled.join(",");
46525         } else {
46526           delete hash.disable_features;
46527         }
46528         window.location.replace("#" + utilQsString(hash, true));
46529         corePreferences("disabled-features", disabled.join(","));
46530       }
46531       _hidden = features.hidden();
46532       dispatch10.call("change");
46533       dispatch10.call("redraw");
46534     }
46535     function defineRule(k, filter2, max3) {
46536       var isEnabled = true;
46537       _keys.push(k);
46538       _rules[k] = {
46539         filter: filter2,
46540         enabled: isEnabled,
46541         // whether the user wants it enabled..
46542         count: 0,
46543         currentMax: max3 || Infinity,
46544         defaultMax: max3 || Infinity,
46545         enable: function() {
46546           this.enabled = true;
46547           this.currentMax = this.defaultMax;
46548         },
46549         disable: function() {
46550           this.enabled = false;
46551           this.currentMax = 0;
46552         },
46553         hidden: function() {
46554           return this.count === 0 && !this.enabled || this.count > this.currentMax * _cullFactor;
46555         },
46556         autoHidden: function() {
46557           return this.hidden() && this.currentMax > 0;
46558         }
46559       };
46560     }
46561     defineRule("points", function isPoint(tags, geometry) {
46562       return geometry === "point";
46563     }, 200);
46564     defineRule("traffic_roads", function isTrafficRoad(tags) {
46565       return traffic_roads[tags.highway];
46566     });
46567     defineRule("service_roads", function isServiceRoad(tags) {
46568       return service_roads[tags.highway];
46569     });
46570     defineRule("paths", function isPath(tags) {
46571       return paths[tags.highway];
46572     });
46573     defineRule("buildings", function isBuilding(tags) {
46574       return !!tags.building && tags.building !== "no" || tags.parking === "multi-storey" || tags.parking === "sheds" || tags.parking === "carports" || tags.parking === "garage_boxes";
46575     }, 250);
46576     defineRule("building_parts", function isBuildingPart(tags) {
46577       return tags["building:part"];
46578     });
46579     defineRule("indoor", function isIndoor(tags) {
46580       return tags.indoor;
46581     });
46582     defineRule("landuse", function isLanduse(tags, geometry) {
46583       return geometry === "area" && !_rules.buildings.filter(tags) && !_rules.building_parts.filter(tags) && !_rules.indoor.filter(tags) && !_rules.water.filter(tags) && !_rules.pistes.filter(tags);
46584     });
46585     defineRule("boundaries", function isBoundary(tags, geometry) {
46586       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);
46587     });
46588     defineRule("water", function isWater(tags) {
46589       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";
46590     });
46591     defineRule("rail", function isRail(tags) {
46592       return (!!tags.railway || tags.landuse === "railway") && !(traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]);
46593     });
46594     defineRule("pistes", function isPiste(tags) {
46595       return tags["piste:type"];
46596     });
46597     defineRule("aerialways", function isPiste(tags) {
46598       return tags.aerialway && tags.aerialway !== "yes" && tags.aerialway !== "station";
46599     });
46600     defineRule("power", function isPower(tags) {
46601       return !!tags.power;
46602     });
46603     defineRule("past_future", function isPastFuture(tags) {
46604       if (traffic_roads[tags.highway] || service_roads[tags.highway] || paths[tags.highway]) {
46605         return false;
46606       }
46607       var strings = Object.keys(tags);
46608       for (var i2 = 0; i2 < strings.length; i2++) {
46609         var s = strings[i2];
46610         if (osmLifecyclePrefixes[s] || osmLifecyclePrefixes[tags[s]])
46611           return true;
46612       }
46613       return false;
46614     });
46615     defineRule("others", function isOther(tags, geometry) {
46616       return geometry === "line" || geometry === "area";
46617     });
46618     features.features = function() {
46619       return _rules;
46620     };
46621     features.keys = function() {
46622       return _keys;
46623     };
46624     features.enabled = function(k) {
46625       if (!arguments.length) {
46626         return _keys.filter(function(k2) {
46627           return _rules[k2].enabled;
46628         });
46629       }
46630       return _rules[k] && _rules[k].enabled;
46631     };
46632     features.disabled = function(k) {
46633       if (!arguments.length) {
46634         return _keys.filter(function(k2) {
46635           return !_rules[k2].enabled;
46636         });
46637       }
46638       return _rules[k] && !_rules[k].enabled;
46639     };
46640     features.hidden = function(k) {
46641       if (!arguments.length) {
46642         return _keys.filter(function(k2) {
46643           return _rules[k2].hidden();
46644         });
46645       }
46646       return _rules[k] && _rules[k].hidden();
46647     };
46648     features.autoHidden = function(k) {
46649       if (!arguments.length) {
46650         return _keys.filter(function(k2) {
46651           return _rules[k2].autoHidden();
46652         });
46653       }
46654       return _rules[k] && _rules[k].autoHidden();
46655     };
46656     features.enable = function(k) {
46657       if (_rules[k] && !_rules[k].enabled) {
46658         _rules[k].enable();
46659         update();
46660       }
46661     };
46662     features.enableAll = function() {
46663       var didEnable = false;
46664       for (var k in _rules) {
46665         if (!_rules[k].enabled) {
46666           didEnable = true;
46667           _rules[k].enable();
46668         }
46669       }
46670       if (didEnable)
46671         update();
46672     };
46673     features.disable = function(k) {
46674       if (_rules[k] && _rules[k].enabled) {
46675         _rules[k].disable();
46676         update();
46677       }
46678     };
46679     features.disableAll = function() {
46680       var didDisable = false;
46681       for (var k in _rules) {
46682         if (_rules[k].enabled) {
46683           didDisable = true;
46684           _rules[k].disable();
46685         }
46686       }
46687       if (didDisable)
46688         update();
46689     };
46690     features.toggle = function(k) {
46691       if (_rules[k]) {
46692         (function(f2) {
46693           return f2.enabled ? f2.disable() : f2.enable();
46694         })(_rules[k]);
46695         update();
46696       }
46697     };
46698     features.resetStats = function() {
46699       for (var i2 = 0; i2 < _keys.length; i2++) {
46700         _rules[_keys[i2]].count = 0;
46701       }
46702       dispatch10.call("change");
46703     };
46704     features.gatherStats = function(d, resolver, dimensions) {
46705       var needsRedraw = false;
46706       var types = utilArrayGroupBy(d, "type");
46707       var entities = [].concat(types.relation || [], types.way || [], types.node || []);
46708       var currHidden, geometry, matches, i2, j2;
46709       for (i2 = 0; i2 < _keys.length; i2++) {
46710         _rules[_keys[i2]].count = 0;
46711       }
46712       _cullFactor = dimensions[0] * dimensions[1] / 1e6;
46713       for (i2 = 0; i2 < entities.length; i2++) {
46714         geometry = entities[i2].geometry(resolver);
46715         matches = Object.keys(features.getMatches(entities[i2], resolver, geometry));
46716         for (j2 = 0; j2 < matches.length; j2++) {
46717           _rules[matches[j2]].count++;
46718         }
46719       }
46720       currHidden = features.hidden();
46721       if (currHidden !== _hidden) {
46722         _hidden = currHidden;
46723         needsRedraw = true;
46724         dispatch10.call("change");
46725       }
46726       return needsRedraw;
46727     };
46728     features.stats = function() {
46729       for (var i2 = 0; i2 < _keys.length; i2++) {
46730         _stats[_keys[i2]] = _rules[_keys[i2]].count;
46731       }
46732       return _stats;
46733     };
46734     features.clear = function(d) {
46735       for (var i2 = 0; i2 < d.length; i2++) {
46736         features.clearEntity(d[i2]);
46737       }
46738     };
46739     features.clearEntity = function(entity) {
46740       delete _cache4[osmEntity.key(entity)];
46741     };
46742     features.reset = function() {
46743       Array.from(_deferred2).forEach(function(handle) {
46744         window.cancelIdleCallback(handle);
46745         _deferred2.delete(handle);
46746       });
46747       _cache4 = {};
46748     };
46749     function relationShouldBeChecked(relation) {
46750       return relation.tags.type === "boundary";
46751     }
46752     features.getMatches = function(entity, resolver, geometry) {
46753       if (geometry === "vertex" || geometry === "relation" && !relationShouldBeChecked(entity))
46754         return {};
46755       var ent = osmEntity.key(entity);
46756       if (!_cache4[ent]) {
46757         _cache4[ent] = {};
46758       }
46759       if (!_cache4[ent].matches) {
46760         var matches = {};
46761         var hasMatch = false;
46762         for (var i2 = 0; i2 < _keys.length; i2++) {
46763           if (_keys[i2] === "others") {
46764             if (hasMatch)
46765               continue;
46766             if (entity.type === "way") {
46767               var parents = features.getParents(entity, resolver, geometry);
46768               if (parents.length === 1 && parents[0].isMultipolygon() || // 2b. or belongs only to boundary relations
46769               parents.length > 0 && parents.every(function(parent) {
46770                 return parent.tags.type === "boundary";
46771               })) {
46772                 var pkey = osmEntity.key(parents[0]);
46773                 if (_cache4[pkey] && _cache4[pkey].matches) {
46774                   matches = Object.assign({}, _cache4[pkey].matches);
46775                   continue;
46776                 }
46777               }
46778             }
46779           }
46780           if (_rules[_keys[i2]].filter(entity.tags, geometry)) {
46781             matches[_keys[i2]] = hasMatch = true;
46782           }
46783         }
46784         _cache4[ent].matches = matches;
46785       }
46786       return _cache4[ent].matches;
46787     };
46788     features.getParents = function(entity, resolver, geometry) {
46789       if (geometry === "point")
46790         return [];
46791       var ent = osmEntity.key(entity);
46792       if (!_cache4[ent]) {
46793         _cache4[ent] = {};
46794       }
46795       if (!_cache4[ent].parents) {
46796         var parents = [];
46797         if (geometry === "vertex") {
46798           parents = resolver.parentWays(entity);
46799         } else {
46800           parents = resolver.parentRelations(entity);
46801         }
46802         _cache4[ent].parents = parents;
46803       }
46804       return _cache4[ent].parents;
46805     };
46806     features.isHiddenPreset = function(preset, geometry) {
46807       if (!_hidden.length)
46808         return false;
46809       if (!preset.tags)
46810         return false;
46811       var test = preset.setTags({}, geometry);
46812       for (var key in _rules) {
46813         if (_rules[key].filter(test, geometry)) {
46814           if (_hidden.indexOf(key) !== -1) {
46815             return key;
46816           }
46817           return false;
46818         }
46819       }
46820       return false;
46821     };
46822     features.isHiddenFeature = function(entity, resolver, geometry) {
46823       if (!_hidden.length)
46824         return false;
46825       if (!entity.version)
46826         return false;
46827       if (_forceVisible[entity.id])
46828         return false;
46829       var matches = Object.keys(features.getMatches(entity, resolver, geometry));
46830       return matches.length && matches.every(function(k) {
46831         return features.hidden(k);
46832       });
46833     };
46834     features.isHiddenChild = function(entity, resolver, geometry) {
46835       if (!_hidden.length)
46836         return false;
46837       if (!entity.version || geometry === "point")
46838         return false;
46839       if (_forceVisible[entity.id])
46840         return false;
46841       var parents = features.getParents(entity, resolver, geometry);
46842       if (!parents.length)
46843         return false;
46844       for (var i2 = 0; i2 < parents.length; i2++) {
46845         if (!features.isHidden(parents[i2], resolver, parents[i2].geometry(resolver))) {
46846           return false;
46847         }
46848       }
46849       return true;
46850     };
46851     features.hasHiddenConnections = function(entity, resolver) {
46852       if (!_hidden.length)
46853         return false;
46854       var childNodes, connections;
46855       if (entity.type === "midpoint") {
46856         childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
46857         connections = [];
46858       } else {
46859         childNodes = entity.nodes ? resolver.childNodes(entity) : [];
46860         connections = features.getParents(entity, resolver, entity.geometry(resolver));
46861       }
46862       connections = childNodes.reduce(function(result, e) {
46863         return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
46864       }, connections);
46865       return connections.some(function(e) {
46866         return features.isHidden(e, resolver, e.geometry(resolver));
46867       });
46868     };
46869     features.isHidden = function(entity, resolver, geometry) {
46870       if (!_hidden.length)
46871         return false;
46872       if (!entity.version)
46873         return false;
46874       var fn = geometry === "vertex" ? features.isHiddenChild : features.isHiddenFeature;
46875       return fn(entity, resolver, geometry);
46876     };
46877     features.filter = function(d, resolver) {
46878       if (!_hidden.length)
46879         return d;
46880       var result = [];
46881       for (var i2 = 0; i2 < d.length; i2++) {
46882         var entity = d[i2];
46883         if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
46884           result.push(entity);
46885         }
46886       }
46887       return result;
46888     };
46889     features.forceVisible = function(entityIDs) {
46890       if (!arguments.length)
46891         return Object.keys(_forceVisible);
46892       _forceVisible = {};
46893       for (var i2 = 0; i2 < entityIDs.length; i2++) {
46894         _forceVisible[entityIDs[i2]] = true;
46895         var entity = context.hasEntity(entityIDs[i2]);
46896         if (entity && entity.type === "relation") {
46897           for (var j2 in entity.members) {
46898             _forceVisible[entity.members[j2].id] = true;
46899           }
46900         }
46901       }
46902       return features;
46903     };
46904     features.init = function() {
46905       var storage = corePreferences("disabled-features");
46906       if (storage) {
46907         var storageDisabled = storage.replace(/;/g, ",").split(",");
46908         storageDisabled.forEach(features.disable);
46909       }
46910       var hash = utilStringQs(window.location.hash);
46911       if (hash.disable_features) {
46912         var hashDisabled = hash.disable_features.replace(/;/g, ",").split(",");
46913         hashDisabled.forEach(features.disable);
46914       }
46915     };
46916     context.history().on("merge.features", function(newEntities) {
46917       if (!newEntities)
46918         return;
46919       var handle = window.requestIdleCallback(function() {
46920         var graph = context.graph();
46921         var types = utilArrayGroupBy(newEntities, "type");
46922         var entities = [].concat(types.relation || [], types.way || [], types.node || []);
46923         for (var i2 = 0; i2 < entities.length; i2++) {
46924           var geometry = entities[i2].geometry(graph);
46925           features.getMatches(entities[i2], graph, geometry);
46926         }
46927       });
46928       _deferred2.add(handle);
46929     });
46930     return features;
46931   }
46932
46933   // modules/svg/areas.js
46934   var import_fast_deep_equal5 = __toESM(require_fast_deep_equal());
46935
46936   // modules/svg/helpers.js
46937   function svgPassiveVertex(node, graph, activeID) {
46938     if (!activeID)
46939       return 1;
46940     if (activeID === node.id)
46941       return 0;
46942     var parents = graph.parentWays(node);
46943     var i2, j2, nodes, isClosed, ix1, ix2, ix3, ix4, max3;
46944     for (i2 = 0; i2 < parents.length; i2++) {
46945       nodes = parents[i2].nodes;
46946       isClosed = parents[i2].isClosed();
46947       for (j2 = 0; j2 < nodes.length; j2++) {
46948         if (nodes[j2] === node.id) {
46949           ix1 = j2 - 2;
46950           ix2 = j2 - 1;
46951           ix3 = j2 + 1;
46952           ix4 = j2 + 2;
46953           if (isClosed) {
46954             max3 = nodes.length - 1;
46955             if (ix1 < 0)
46956               ix1 = max3 + ix1;
46957             if (ix2 < 0)
46958               ix2 = max3 + ix2;
46959             if (ix3 > max3)
46960               ix3 = ix3 - max3;
46961             if (ix4 > max3)
46962               ix4 = ix4 - max3;
46963           }
46964           if (nodes[ix1] === activeID)
46965             return 0;
46966           else if (nodes[ix2] === activeID)
46967             return 2;
46968           else if (nodes[ix3] === activeID)
46969             return 2;
46970           else if (nodes[ix4] === activeID)
46971             return 0;
46972           else if (isClosed && nodes.indexOf(activeID) !== -1)
46973             return 0;
46974         }
46975       }
46976     }
46977     return 1;
46978   }
46979   function svgMarkerSegments(projection2, graph, dt, shouldReverse, bothDirections) {
46980     return function(entity) {
46981       var i2 = 0;
46982       var offset = dt;
46983       var segments = [];
46984       var clip = identity_default2().clipExtent(projection2.clipExtent()).stream;
46985       var coordinates = graph.childNodes(entity).map(function(n2) {
46986         return n2.loc;
46987       });
46988       var a, b;
46989       if (shouldReverse(entity)) {
46990         coordinates.reverse();
46991       }
46992       stream_default({
46993         type: "LineString",
46994         coordinates
46995       }, projection2.stream(clip({
46996         lineStart: function() {
46997         },
46998         lineEnd: function() {
46999           a = null;
47000         },
47001         point: function(x, y) {
47002           b = [x, y];
47003           if (a) {
47004             var span = geoVecLength(a, b) - offset;
47005             if (span >= 0) {
47006               var heading = geoVecAngle(a, b);
47007               var dx = dt * Math.cos(heading);
47008               var dy = dt * Math.sin(heading);
47009               var p = [
47010                 a[0] + offset * Math.cos(heading),
47011                 a[1] + offset * Math.sin(heading)
47012               ];
47013               var coord2 = [a, p];
47014               for (span -= dt; span >= 0; span -= dt) {
47015                 p = geoVecAdd(p, [dx, dy]);
47016                 coord2.push(p);
47017               }
47018               coord2.push(b);
47019               var segment = "";
47020               var j2;
47021               for (j2 = 0; j2 < coord2.length; j2++) {
47022                 segment += (j2 === 0 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1];
47023               }
47024               segments.push({ id: entity.id, index: i2++, d: segment });
47025               if (bothDirections(entity)) {
47026                 segment = "";
47027                 for (j2 = coord2.length - 1; j2 >= 0; j2--) {
47028                   segment += (j2 === coord2.length - 1 ? "M" : "L") + coord2[j2][0] + "," + coord2[j2][1];
47029                 }
47030                 segments.push({ id: entity.id, index: i2++, d: segment });
47031               }
47032             }
47033             offset = -span;
47034           }
47035           a = b;
47036         }
47037       })));
47038       return segments;
47039     };
47040   }
47041   function svgPath(projection2, graph, isArea) {
47042     var cache = {};
47043     var padding = isArea ? 65 : 5;
47044     var viewport = projection2.clipExtent();
47045     var paddedExtent = [
47046       [viewport[0][0] - padding, viewport[0][1] - padding],
47047       [viewport[1][0] + padding, viewport[1][1] + padding]
47048     ];
47049     var clip = identity_default2().clipExtent(paddedExtent).stream;
47050     var project = projection2.stream;
47051     var path = path_default().projection({ stream: function(output) {
47052       return project(clip(output));
47053     } });
47054     var svgpath = function(entity) {
47055       if (entity.id in cache) {
47056         return cache[entity.id];
47057       } else {
47058         return cache[entity.id] = path(entity.asGeoJSON(graph));
47059       }
47060     };
47061     svgpath.geojson = function(d) {
47062       if (d.__featurehash__ !== void 0) {
47063         if (d.__featurehash__ in cache) {
47064           return cache[d.__featurehash__];
47065         } else {
47066           return cache[d.__featurehash__] = path(d);
47067         }
47068       } else {
47069         return path(d);
47070       }
47071     };
47072     return svgpath;
47073   }
47074   function svgPointTransform(projection2) {
47075     var svgpoint = function(entity) {
47076       var pt = projection2(entity.loc);
47077       return "translate(" + pt[0] + "," + pt[1] + ")";
47078     };
47079     svgpoint.geojson = function(d) {
47080       return svgpoint(d.properties.entity);
47081     };
47082     return svgpoint;
47083   }
47084   function svgRelationMemberTags(graph) {
47085     return function(entity) {
47086       var tags = entity.tags;
47087       var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
47088       graph.parentRelations(entity).forEach(function(relation) {
47089         var type2 = relation.tags.type;
47090         if (type2 === "multipolygon" && shouldCopyMultipolygonTags || type2 === "boundary") {
47091           tags = Object.assign({}, relation.tags, tags);
47092         }
47093       });
47094       return tags;
47095     };
47096   }
47097   function svgSegmentWay(way, graph, activeID) {
47098     if (activeID === void 0) {
47099       return graph.transient(way, "waySegments", getWaySegments);
47100     } else {
47101       return getWaySegments();
47102     }
47103     function getWaySegments() {
47104       var isActiveWay = way.nodes.indexOf(activeID) !== -1;
47105       var features = { passive: [], active: [] };
47106       var start2 = {};
47107       var end = {};
47108       var node, type2;
47109       for (var i2 = 0; i2 < way.nodes.length; i2++) {
47110         node = graph.entity(way.nodes[i2]);
47111         type2 = svgPassiveVertex(node, graph, activeID);
47112         end = { node, type: type2 };
47113         if (start2.type !== void 0) {
47114           if (start2.node.id === activeID || end.node.id === activeID) {
47115           } else if (isActiveWay && (start2.type === 2 || end.type === 2)) {
47116             pushActive(start2, end, i2);
47117           } else if (start2.type === 0 && end.type === 0) {
47118             pushActive(start2, end, i2);
47119           } else {
47120             pushPassive(start2, end, i2);
47121           }
47122         }
47123         start2 = end;
47124       }
47125       return features;
47126       function pushActive(start3, end2, index) {
47127         features.active.push({
47128           type: "Feature",
47129           id: way.id + "-" + index + "-nope",
47130           properties: {
47131             nope: true,
47132             target: true,
47133             entity: way,
47134             nodes: [start3.node, end2.node],
47135             index
47136           },
47137           geometry: {
47138             type: "LineString",
47139             coordinates: [start3.node.loc, end2.node.loc]
47140           }
47141         });
47142       }
47143       function pushPassive(start3, end2, index) {
47144         features.passive.push({
47145           type: "Feature",
47146           id: way.id + "-" + index,
47147           properties: {
47148             target: true,
47149             entity: way,
47150             nodes: [start3.node, end2.node],
47151             index
47152           },
47153           geometry: {
47154             type: "LineString",
47155             coordinates: [start3.node.loc, end2.node.loc]
47156           }
47157         });
47158       }
47159     }
47160   }
47161
47162   // modules/svg/tag_classes.js
47163   function svgTagClasses() {
47164     var primaries = [
47165       "building",
47166       "highway",
47167       "railway",
47168       "waterway",
47169       "aeroway",
47170       "aerialway",
47171       "piste:type",
47172       "boundary",
47173       "power",
47174       "amenity",
47175       "natural",
47176       "landuse",
47177       "leisure",
47178       "military",
47179       "place",
47180       "man_made",
47181       "route",
47182       "attraction",
47183       "building:part",
47184       "indoor"
47185     ];
47186     var statuses = Object.keys(osmLifecyclePrefixes);
47187     var secondaries = [
47188       "oneway",
47189       "bridge",
47190       "tunnel",
47191       "embankment",
47192       "cutting",
47193       "barrier",
47194       "surface",
47195       "tracktype",
47196       "footway",
47197       "crossing",
47198       "service",
47199       "sport",
47200       "public_transport",
47201       "location",
47202       "parking",
47203       "golf",
47204       "type",
47205       "leisure",
47206       "man_made",
47207       "indoor",
47208       "construction",
47209       "proposed"
47210     ];
47211     var _tags = function(entity) {
47212       return entity.tags;
47213     };
47214     var tagClasses = function(selection2) {
47215       selection2.each(function tagClassesEach(entity) {
47216         var value = this.className;
47217         if (value.baseVal !== void 0) {
47218           value = value.baseVal;
47219         }
47220         var t = _tags(entity);
47221         var computed = tagClasses.getClassesString(t, value);
47222         if (computed !== value) {
47223           select_default2(this).attr("class", computed);
47224         }
47225       });
47226     };
47227     tagClasses.getClassesString = function(t, value) {
47228       var primary, status;
47229       var i2, j2, k, v;
47230       var overrideGeometry;
47231       if (/\bstroke\b/.test(value)) {
47232         if (!!t.barrier && t.barrier !== "no") {
47233           overrideGeometry = "line";
47234         }
47235       }
47236       var classes = value.trim().split(/\s+/).filter(function(klass) {
47237         return klass.length && !/^tag-/.test(klass);
47238       }).map(function(klass) {
47239         return klass === "line" || klass === "area" ? overrideGeometry || klass : klass;
47240       });
47241       for (i2 = 0; i2 < primaries.length; i2++) {
47242         k = primaries[i2];
47243         v = t[k];
47244         if (!v || v === "no")
47245           continue;
47246         if (k === "piste:type") {
47247           k = "piste";
47248         } else if (k === "building:part") {
47249           k = "building_part";
47250         }
47251         primary = k;
47252         if (statuses.indexOf(v) !== -1) {
47253           status = v;
47254           classes.push("tag-" + k);
47255         } else {
47256           classes.push("tag-" + k);
47257           classes.push("tag-" + k + "-" + v);
47258         }
47259         break;
47260       }
47261       if (!primary) {
47262         for (i2 = 0; i2 < statuses.length; i2++) {
47263           for (j2 = 0; j2 < primaries.length; j2++) {
47264             k = statuses[i2] + ":" + primaries[j2];
47265             v = t[k];
47266             if (!v || v === "no")
47267               continue;
47268             status = statuses[i2];
47269             break;
47270           }
47271         }
47272       }
47273       if (!status) {
47274         for (i2 = 0; i2 < statuses.length; i2++) {
47275           k = statuses[i2];
47276           v = t[k];
47277           if (!v || v === "no")
47278             continue;
47279           if (v === "yes") {
47280             status = k;
47281           } else if (primary && primary === v) {
47282             status = k;
47283           } else if (!primary && primaries.indexOf(v) !== -1) {
47284             status = k;
47285             primary = v;
47286             classes.push("tag-" + v);
47287           }
47288           if (status)
47289             break;
47290         }
47291       }
47292       if (status) {
47293         classes.push("tag-status");
47294         classes.push("tag-status-" + status);
47295       }
47296       for (i2 = 0; i2 < secondaries.length; i2++) {
47297         k = secondaries[i2];
47298         v = t[k];
47299         if (!v || v === "no" || k === primary)
47300           continue;
47301         classes.push("tag-" + k);
47302         classes.push("tag-" + k + "-" + v);
47303       }
47304       if (primary === "highway" && !osmPathHighwayTagValues[t.highway] || primary === "aeroway") {
47305         var surface = t.highway === "track" ? "unpaved" : "paved";
47306         for (k in t) {
47307           v = t[k];
47308           if (k in osmPavedTags) {
47309             surface = osmPavedTags[k][v] ? "paved" : "unpaved";
47310           }
47311           if (k in osmSemipavedTags && !!osmSemipavedTags[k][v]) {
47312             surface = "semipaved";
47313           }
47314         }
47315         classes.push("tag-" + surface);
47316       }
47317       var qid = t.wikidata || t["flag:wikidata"] || t["brand:wikidata"] || t["network:wikidata"] || t["operator:wikidata"];
47318       if (qid) {
47319         classes.push("tag-wikidata");
47320       }
47321       return classes.filter((klass) => /^[-_a-z0-9]+$/.test(klass)).join(" ").trim();
47322     };
47323     tagClasses.tags = function(val) {
47324       if (!arguments.length)
47325         return _tags;
47326       _tags = val;
47327       return tagClasses;
47328     };
47329     return tagClasses;
47330   }
47331
47332   // modules/svg/tag_pattern.js
47333   var patterns = {
47334     // tag - pattern name
47335     // -or-
47336     // tag - value - pattern name
47337     // -or-
47338     // tag - value - rules (optional tag-values, pattern name)
47339     // (matches earlier rules first, so fallback should be last entry)
47340     amenity: {
47341       grave_yard: "cemetery",
47342       fountain: "water_standing"
47343     },
47344     landuse: {
47345       cemetery: [
47346         { religion: "christian", pattern: "cemetery_christian" },
47347         { religion: "buddhist", pattern: "cemetery_buddhist" },
47348         { religion: "muslim", pattern: "cemetery_muslim" },
47349         { religion: "jewish", pattern: "cemetery_jewish" },
47350         { pattern: "cemetery" }
47351       ],
47352       construction: "construction",
47353       farmland: "farmland",
47354       farmyard: "farmyard",
47355       forest: [
47356         { leaf_type: "broadleaved", pattern: "forest_broadleaved" },
47357         { leaf_type: "needleleaved", pattern: "forest_needleleaved" },
47358         { leaf_type: "leafless", pattern: "forest_leafless" },
47359         { pattern: "forest" }
47360         // same as 'leaf_type:mixed'
47361       ],
47362       grave_yard: "cemetery",
47363       grass: "grass",
47364       landfill: "landfill",
47365       meadow: "meadow",
47366       military: "construction",
47367       orchard: "orchard",
47368       quarry: "quarry",
47369       vineyard: "vineyard"
47370     },
47371     leisure: {
47372       horse_riding: "farmyard"
47373     },
47374     natural: {
47375       beach: "beach",
47376       grassland: "grass",
47377       sand: "beach",
47378       scrub: "scrub",
47379       water: [
47380         { water: "pond", pattern: "pond" },
47381         { water: "reservoir", pattern: "water_standing" },
47382         { pattern: "waves" }
47383       ],
47384       wetland: [
47385         { wetland: "marsh", pattern: "wetland_marsh" },
47386         { wetland: "swamp", pattern: "wetland_swamp" },
47387         { wetland: "bog", pattern: "wetland_bog" },
47388         { wetland: "reedbed", pattern: "wetland_reedbed" },
47389         { pattern: "wetland" }
47390       ],
47391       wood: [
47392         { leaf_type: "broadleaved", pattern: "forest_broadleaved" },
47393         { leaf_type: "needleleaved", pattern: "forest_needleleaved" },
47394         { leaf_type: "leafless", pattern: "forest_leafless" },
47395         { pattern: "forest" }
47396         // same as 'leaf_type:mixed'
47397       ]
47398     },
47399     golf: {
47400       green: "golf_green",
47401       tee: "grass",
47402       fairway: "grass",
47403       rough: "scrub"
47404     },
47405     surface: {
47406       grass: "grass",
47407       sand: "beach"
47408     }
47409   };
47410   function svgTagPattern(tags) {
47411     if (tags.building && tags.building !== "no") {
47412       return null;
47413     }
47414     for (var tag in patterns) {
47415       var entityValue = tags[tag];
47416       if (!entityValue)
47417         continue;
47418       if (typeof patterns[tag] === "string") {
47419         return "pattern-" + patterns[tag];
47420       } else {
47421         var values = patterns[tag];
47422         for (var value in values) {
47423           if (entityValue !== value)
47424             continue;
47425           var rules = values[value];
47426           if (typeof rules === "string") {
47427             return "pattern-" + rules;
47428           }
47429           for (var ruleKey in rules) {
47430             var rule = rules[ruleKey];
47431             var pass = true;
47432             for (var criterion in rule) {
47433               if (criterion !== "pattern") {
47434                 var v = tags[criterion];
47435                 if (!v || v !== rule[criterion]) {
47436                   pass = false;
47437                   break;
47438                 }
47439               }
47440             }
47441             if (pass) {
47442               return "pattern-" + rule.pattern;
47443             }
47444           }
47445         }
47446       }
47447     }
47448     return null;
47449   }
47450
47451   // modules/svg/areas.js
47452   function svgAreas(projection2, context) {
47453     function getPatternStyle(tags) {
47454       var imageID = svgTagPattern(tags);
47455       if (imageID) {
47456         return 'url("#ideditor-' + imageID + '")';
47457       }
47458       return "";
47459     }
47460     function drawTargets(selection2, graph, entities, filter2) {
47461       var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
47462       var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
47463       var getPath = svgPath(projection2).geojson;
47464       var activeID = context.activeID();
47465       var base = context.history().base();
47466       var data = { targets: [], nopes: [] };
47467       entities.forEach(function(way) {
47468         var features = svgSegmentWay(way, graph, activeID);
47469         data.targets.push.apply(data.targets, features.passive);
47470         data.nopes.push.apply(data.nopes, features.active);
47471       });
47472       var targetData = data.targets.filter(getPath);
47473       var targets = selection2.selectAll(".area.target-allowed").filter(function(d) {
47474         return filter2(d.properties.entity);
47475       }).data(targetData, function key(d) {
47476         return d.id;
47477       });
47478       targets.exit().remove();
47479       var segmentWasEdited = function(d) {
47480         var wayID = d.properties.entity.id;
47481         if (!base.entities[wayID] || !(0, import_fast_deep_equal5.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
47482           return false;
47483         }
47484         return d.properties.nodes.some(function(n2) {
47485           return !base.entities[n2.id] || !(0, import_fast_deep_equal5.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc);
47486         });
47487       };
47488       targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) {
47489         return "way area target target-allowed " + targetClass + d.id;
47490       }).classed("segment-edited", segmentWasEdited);
47491       var nopeData = data.nopes.filter(getPath);
47492       var nopes = selection2.selectAll(".area.target-nope").filter(function(d) {
47493         return filter2(d.properties.entity);
47494       }).data(nopeData, function key(d) {
47495         return d.id;
47496       });
47497       nopes.exit().remove();
47498       nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) {
47499         return "way area target target-nope " + nopeClass + d.id;
47500       }).classed("segment-edited", segmentWasEdited);
47501     }
47502     function drawAreas(selection2, graph, entities, filter2) {
47503       var path = svgPath(projection2, graph, true);
47504       var areas = {};
47505       var multipolygon;
47506       var base = context.history().base();
47507       for (var i2 = 0; i2 < entities.length; i2++) {
47508         var entity = entities[i2];
47509         if (entity.geometry(graph) !== "area")
47510           continue;
47511         multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
47512         if (multipolygon) {
47513           areas[multipolygon.id] = {
47514             entity: multipolygon.mergeTags(entity.tags),
47515             area: Math.abs(entity.area(graph))
47516           };
47517         } else if (!areas[entity.id]) {
47518           areas[entity.id] = {
47519             entity,
47520             area: Math.abs(entity.area(graph))
47521           };
47522         }
47523       }
47524       var fills = Object.values(areas).filter(function hasPath(a) {
47525         return path(a.entity);
47526       });
47527       fills.sort(function areaSort(a, b) {
47528         return b.area - a.area;
47529       });
47530       fills = fills.map(function(a) {
47531         return a.entity;
47532       });
47533       var strokes = fills.filter(function(area) {
47534         return area.type === "way";
47535       });
47536       var data = {
47537         clip: fills,
47538         shadow: strokes,
47539         stroke: strokes,
47540         fill: fills
47541       };
47542       var clipPaths = context.surface().selectAll("defs").selectAll(".clipPath-osm").filter(filter2).data(data.clip, osmEntity.key);
47543       clipPaths.exit().remove();
47544       var clipPathsEnter = clipPaths.enter().append("clipPath").attr("class", "clipPath-osm").attr("id", function(entity2) {
47545         return "ideditor-" + entity2.id + "-clippath";
47546       });
47547       clipPathsEnter.append("path");
47548       clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", path);
47549       var drawLayer = selection2.selectAll(".layer-osm.areas");
47550       var touchLayer = selection2.selectAll(".layer-touch.areas");
47551       var areagroup = drawLayer.selectAll("g.areagroup").data(["fill", "shadow", "stroke"]);
47552       areagroup = areagroup.enter().append("g").attr("class", function(d) {
47553         return "areagroup area-" + d;
47554       }).merge(areagroup);
47555       var paths = areagroup.selectAll("path").filter(filter2).data(function(layer) {
47556         return data[layer];
47557       }, osmEntity.key);
47558       paths.exit().remove();
47559       var fillpaths = selection2.selectAll(".area-fill path.area").nodes();
47560       var bisect = bisector(function(node) {
47561         return -node.__data__.area(graph);
47562       }).left;
47563       function sortedByArea(entity2) {
47564         if (this._parent.__data__ === "fill") {
47565           return fillpaths[bisect(fillpaths, -entity2.area(graph))];
47566         }
47567       }
47568       paths = paths.enter().insert("path", sortedByArea).merge(paths).each(function(entity2) {
47569         var layer = this.parentNode.__data__;
47570         this.setAttribute("class", entity2.type + " area " + layer + " " + entity2.id);
47571         if (layer === "fill") {
47572           this.setAttribute("clip-path", "url(#ideditor-" + entity2.id + "-clippath)");
47573           this.style.fill = this.style.stroke = getPatternStyle(entity2.tags);
47574         }
47575       }).classed("added", function(d) {
47576         return !base.entities[d.id];
47577       }).classed("geometry-edited", function(d) {
47578         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);
47579       }).classed("retagged", function(d) {
47580         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);
47581       }).call(svgTagClasses()).attr("d", path);
47582       touchLayer.call(drawTargets, graph, data.stroke, filter2);
47583     }
47584     return drawAreas;
47585   }
47586
47587   // modules/svg/data.js
47588   var import_fast_json_stable_stringify = __toESM(require_fast_json_stable_stringify());
47589
47590   // node_modules/@tmcw/togeojson/dist/togeojson.es.mjs
47591   function $(element, tagName) {
47592     return Array.from(element.getElementsByTagName(tagName));
47593   }
47594   function normalizeId(id2) {
47595     return id2[0] === "#" ? id2 : `#${id2}`;
47596   }
47597   function $ns(element, tagName, ns) {
47598     return Array.from(element.getElementsByTagNameNS(ns, tagName));
47599   }
47600   function nodeVal(node) {
47601     node?.normalize();
47602     return node && node.textContent || "";
47603   }
47604   function get1(node, tagName, callback) {
47605     const n2 = node.getElementsByTagName(tagName);
47606     const result = n2.length ? n2[0] : null;
47607     if (result && callback)
47608       callback(result);
47609     return result;
47610   }
47611   function get3(node, tagName, callback) {
47612     const properties = {};
47613     if (!node)
47614       return properties;
47615     const n2 = node.getElementsByTagName(tagName);
47616     const result = n2.length ? n2[0] : null;
47617     if (result && callback) {
47618       return callback(result, properties);
47619     }
47620     return properties;
47621   }
47622   function val1(node, tagName, callback) {
47623     const val = nodeVal(get1(node, tagName));
47624     if (val && callback)
47625       return callback(val) || {};
47626     return {};
47627   }
47628   function $num(node, tagName, callback) {
47629     const val = parseFloat(nodeVal(get1(node, tagName)));
47630     if (isNaN(val))
47631       return void 0;
47632     if (val && callback)
47633       return callback(val) || {};
47634     return {};
47635   }
47636   function num1(node, tagName, callback) {
47637     const val = parseFloat(nodeVal(get1(node, tagName)));
47638     if (isNaN(val))
47639       return void 0;
47640     if (callback)
47641       callback(val);
47642     return val;
47643   }
47644   function getMulti(node, propertyNames) {
47645     const properties = {};
47646     for (const property of propertyNames) {
47647       val1(node, property, (val) => {
47648         properties[property] = val;
47649       });
47650     }
47651     return properties;
47652   }
47653   function isElement(node) {
47654     return node?.nodeType === 1;
47655   }
47656   function getLineStyle(node) {
47657     return get3(node, "line", (lineStyle) => {
47658       const val = Object.assign({}, val1(lineStyle, "color", (color2) => {
47659         return { stroke: `#${color2}` };
47660       }), $num(lineStyle, "opacity", (opacity) => {
47661         return { "stroke-opacity": opacity };
47662       }), $num(lineStyle, "width", (width) => {
47663         return { "stroke-width": width * 96 / 25.4 };
47664       }));
47665       return val;
47666     });
47667   }
47668   function getExtensions(node) {
47669     let values = [];
47670     if (node === null)
47671       return values;
47672     for (const child of Array.from(node.childNodes)) {
47673       if (!isElement(child))
47674         continue;
47675       const name = abbreviateName(child.nodeName);
47676       if (name === "gpxtpx:TrackPointExtension") {
47677         values = values.concat(getExtensions(child));
47678       } else {
47679         const val = nodeVal(child);
47680         values.push([name, parseNumeric(val)]);
47681       }
47682     }
47683     return values;
47684   }
47685   function abbreviateName(name) {
47686     return ["heart", "gpxtpx:hr", "hr"].includes(name) ? "heart" : name;
47687   }
47688   function parseNumeric(val) {
47689     const num = parseFloat(val);
47690     return isNaN(num) ? val : num;
47691   }
47692   function coordPair$1(node) {
47693     const ll = [
47694       parseFloat(node.getAttribute("lon") || ""),
47695       parseFloat(node.getAttribute("lat") || "")
47696     ];
47697     if (isNaN(ll[0]) || isNaN(ll[1])) {
47698       return null;
47699     }
47700     num1(node, "ele", (val) => {
47701       ll.push(val);
47702     });
47703     const time = get1(node, "time");
47704     return {
47705       coordinates: ll,
47706       time: time ? nodeVal(time) : null,
47707       extendedValues: getExtensions(get1(node, "extensions"))
47708     };
47709   }
47710   function extractProperties(node) {
47711     const properties = getMulti(node, [
47712       "name",
47713       "cmt",
47714       "desc",
47715       "type",
47716       "time",
47717       "keywords"
47718     ]);
47719     const extensions = Array.from(node.getElementsByTagNameNS("http://www.garmin.com/xmlschemas/GpxExtensions/v3", "*"));
47720     for (const child of extensions) {
47721       if (child.parentNode?.parentNode === node) {
47722         properties[child.tagName.replace(":", "_")] = nodeVal(child);
47723       }
47724     }
47725     const links = $(node, "link");
47726     if (links.length) {
47727       properties.links = links.map((link2) => Object.assign({ href: link2.getAttribute("href") }, getMulti(link2, ["text", "type"])));
47728     }
47729     return properties;
47730   }
47731   function getPoints$1(node, pointname) {
47732     const pts = $(node, pointname);
47733     const line = [];
47734     const times = [];
47735     const extendedValues = {};
47736     for (let i2 = 0; i2 < pts.length; i2++) {
47737       const c = coordPair$1(pts[i2]);
47738       if (!c) {
47739         continue;
47740       }
47741       line.push(c.coordinates);
47742       if (c.time)
47743         times.push(c.time);
47744       for (const [name, val] of c.extendedValues) {
47745         const plural = name === "heart" ? name : name.replace("gpxtpx:", "") + "s";
47746         if (!extendedValues[plural]) {
47747           extendedValues[plural] = Array(pts.length).fill(null);
47748         }
47749         extendedValues[plural][i2] = val;
47750       }
47751     }
47752     if (line.length < 2)
47753       return;
47754     return {
47755       line,
47756       times,
47757       extendedValues
47758     };
47759   }
47760   function getRoute(node) {
47761     const line = getPoints$1(node, "rtept");
47762     if (!line)
47763       return;
47764     return {
47765       type: "Feature",
47766       properties: Object.assign({ _gpxType: "rte" }, extractProperties(node), getLineStyle(get1(node, "extensions"))),
47767       geometry: {
47768         type: "LineString",
47769         coordinates: line.line
47770       }
47771     };
47772   }
47773   function getTrack(node) {
47774     const segments = $(node, "trkseg");
47775     const track = [];
47776     const times = [];
47777     const extractedLines = [];
47778     for (const segment of segments) {
47779       const line = getPoints$1(segment, "trkpt");
47780       if (line) {
47781         extractedLines.push(line);
47782         if (line.times && line.times.length)
47783           times.push(line.times);
47784       }
47785     }
47786     if (extractedLines.length === 0)
47787       return null;
47788     const multi = extractedLines.length > 1;
47789     const properties = Object.assign({ _gpxType: "trk" }, extractProperties(node), getLineStyle(get1(node, "extensions")), times.length ? {
47790       coordinateProperties: {
47791         times: multi ? times : times[0]
47792       }
47793     } : {});
47794     for (const line of extractedLines) {
47795       track.push(line.line);
47796       if (!properties.coordinateProperties) {
47797         properties.coordinateProperties = {};
47798       }
47799       const props = properties.coordinateProperties;
47800       const entries = Object.entries(line.extendedValues);
47801       for (let i2 = 0; i2 < entries.length; i2++) {
47802         const [name, val] = entries[i2];
47803         if (multi) {
47804           if (!props[name]) {
47805             props[name] = extractedLines.map((line2) => new Array(line2.line.length).fill(null));
47806           }
47807           props[name][i2] = val;
47808         } else {
47809           props[name] = val;
47810         }
47811       }
47812     }
47813     return {
47814       type: "Feature",
47815       properties,
47816       geometry: multi ? {
47817         type: "MultiLineString",
47818         coordinates: track
47819       } : {
47820         type: "LineString",
47821         coordinates: track[0]
47822       }
47823     };
47824   }
47825   function getPoint(node) {
47826     const properties = Object.assign(extractProperties(node), getMulti(node, ["sym"]));
47827     const pair2 = coordPair$1(node);
47828     if (!pair2)
47829       return null;
47830     return {
47831       type: "Feature",
47832       properties,
47833       geometry: {
47834         type: "Point",
47835         coordinates: pair2.coordinates
47836       }
47837     };
47838   }
47839   function* gpxGen(node) {
47840     for (const track of $(node, "trk")) {
47841       const feature3 = getTrack(track);
47842       if (feature3)
47843         yield feature3;
47844     }
47845     for (const route of $(node, "rte")) {
47846       const feature3 = getRoute(route);
47847       if (feature3)
47848         yield feature3;
47849     }
47850     for (const waypoint of $(node, "wpt")) {
47851       const point2 = getPoint(waypoint);
47852       if (point2)
47853         yield point2;
47854     }
47855   }
47856   function gpx(node) {
47857     return {
47858       type: "FeatureCollection",
47859       features: Array.from(gpxGen(node))
47860     };
47861   }
47862   function fixColor(v, prefix) {
47863     const properties = {};
47864     const colorProp = prefix == "stroke" || prefix === "fill" ? prefix : prefix + "-color";
47865     if (v[0] === "#") {
47866       v = v.substring(1);
47867     }
47868     if (v.length === 6 || v.length === 3) {
47869       properties[colorProp] = "#" + v;
47870     } else if (v.length === 8) {
47871       properties[prefix + "-opacity"] = parseInt(v.substring(0, 2), 16) / 255;
47872       properties[colorProp] = "#" + v.substring(6, 8) + v.substring(4, 6) + v.substring(2, 4);
47873     }
47874     return properties;
47875   }
47876   function numericProperty(node, source, target) {
47877     const properties = {};
47878     num1(node, source, (val) => {
47879       properties[target] = val;
47880     });
47881     return properties;
47882   }
47883   function getColor(node, output) {
47884     return get3(node, "color", (elem) => fixColor(nodeVal(elem), output));
47885   }
47886   function extractIconHref(node) {
47887     return get3(node, "Icon", (icon2, properties) => {
47888       val1(icon2, "href", (href) => {
47889         properties.icon = href;
47890       });
47891       return properties;
47892     });
47893   }
47894   function extractIcon(node) {
47895     return get3(node, "IconStyle", (iconStyle) => {
47896       return Object.assign(getColor(iconStyle, "icon"), numericProperty(iconStyle, "scale", "icon-scale"), numericProperty(iconStyle, "heading", "icon-heading"), get3(iconStyle, "hotSpot", (hotspot) => {
47897         const left = parseFloat(hotspot.getAttribute("x") || "");
47898         const top = parseFloat(hotspot.getAttribute("y") || "");
47899         const xunits = hotspot.getAttribute("xunits") || "";
47900         const yunits = hotspot.getAttribute("yunits") || "";
47901         if (!isNaN(left) && !isNaN(top))
47902           return {
47903             "icon-offset": [left, top],
47904             "icon-offset-units": [xunits, yunits]
47905           };
47906         return {};
47907       }), extractIconHref(iconStyle));
47908     });
47909   }
47910   function extractLabel(node) {
47911     return get3(node, "LabelStyle", (labelStyle) => {
47912       return Object.assign(getColor(labelStyle, "label"), numericProperty(labelStyle, "scale", "label-scale"));
47913     });
47914   }
47915   function extractLine(node) {
47916     return get3(node, "LineStyle", (lineStyle) => {
47917       return Object.assign(getColor(lineStyle, "stroke"), numericProperty(lineStyle, "width", "stroke-width"));
47918     });
47919   }
47920   function extractPoly(node) {
47921     return get3(node, "PolyStyle", (polyStyle, properties) => {
47922       return Object.assign(properties, get3(polyStyle, "color", (elem) => fixColor(nodeVal(elem), "fill")), val1(polyStyle, "fill", (fill) => {
47923         if (fill === "0")
47924           return { "fill-opacity": 0 };
47925       }), val1(polyStyle, "outline", (outline) => {
47926         if (outline === "0")
47927           return { "stroke-opacity": 0 };
47928       }));
47929     });
47930   }
47931   function extractStyle(node) {
47932     return Object.assign({}, extractPoly(node), extractLine(node), extractLabel(node), extractIcon(node));
47933   }
47934   var toNumber2 = (x) => Number(x);
47935   var typeConverters = {
47936     string: (x) => x,
47937     int: toNumber2,
47938     uint: toNumber2,
47939     short: toNumber2,
47940     ushort: toNumber2,
47941     float: toNumber2,
47942     double: toNumber2,
47943     bool: (x) => Boolean(x)
47944   };
47945   function extractExtendedData(node, schema) {
47946     return get3(node, "ExtendedData", (extendedData, properties) => {
47947       for (const data of $(extendedData, "Data")) {
47948         properties[data.getAttribute("name") || ""] = nodeVal(get1(data, "value"));
47949       }
47950       for (const simpleData of $(extendedData, "SimpleData")) {
47951         const name = simpleData.getAttribute("name") || "";
47952         const typeConverter = schema[name] || typeConverters.string;
47953         properties[name] = typeConverter(nodeVal(simpleData));
47954       }
47955       return properties;
47956     });
47957   }
47958   function getMaybeHTMLDescription(node) {
47959     const descriptionNode = get1(node, "description");
47960     for (const c of Array.from(descriptionNode?.childNodes || [])) {
47961       if (c.nodeType === 4) {
47962         return {
47963           description: {
47964             "@type": "html",
47965             value: nodeVal(c)
47966           }
47967         };
47968       }
47969     }
47970     return {};
47971   }
47972   function extractTimeSpan(node) {
47973     return get3(node, "TimeSpan", (timeSpan) => {
47974       return {
47975         timespan: {
47976           begin: nodeVal(get1(timeSpan, "begin")),
47977           end: nodeVal(get1(timeSpan, "end"))
47978         }
47979       };
47980     });
47981   }
47982   function extractTimeStamp(node) {
47983     return get3(node, "TimeStamp", (timeStamp) => {
47984       return { timestamp: nodeVal(get1(timeStamp, "when")) };
47985     });
47986   }
47987   function extractCascadedStyle(node, styleMap) {
47988     return val1(node, "styleUrl", (styleUrl) => {
47989       styleUrl = normalizeId(styleUrl);
47990       if (styleMap[styleUrl]) {
47991         return Object.assign({ styleUrl }, styleMap[styleUrl]);
47992       }
47993       return { styleUrl };
47994     });
47995   }
47996   var removeSpace = /\s*/g;
47997   var trimSpace = /^\s*|\s*$/g;
47998   var splitSpace = /\s+/;
47999   function coord1(value) {
48000     return value.replace(removeSpace, "").split(",").map(parseFloat).filter((num) => !isNaN(num)).slice(0, 3);
48001   }
48002   function coord(value) {
48003     return value.replace(trimSpace, "").split(splitSpace).map(coord1).filter((coord2) => {
48004       return coord2.length >= 2;
48005     });
48006   }
48007   function gxCoords(node) {
48008     let elems = $(node, "coord");
48009     if (elems.length === 0) {
48010       elems = $ns(node, "coord", "*");
48011     }
48012     const coordinates = elems.map((elem) => {
48013       return nodeVal(elem).split(" ").map(parseFloat);
48014     });
48015     if (coordinates.length === 0) {
48016       return null;
48017     }
48018     return {
48019       geometry: coordinates.length > 2 ? {
48020         type: "LineString",
48021         coordinates
48022       } : {
48023         type: "Point",
48024         coordinates: coordinates[0]
48025       },
48026       times: $(node, "when").map((elem) => nodeVal(elem))
48027     };
48028   }
48029   function fixRing(ring) {
48030     if (ring.length === 0)
48031       return ring;
48032     const first = ring[0];
48033     const last = ring[ring.length - 1];
48034     let equal = true;
48035     for (let i2 = 0; i2 < Math.max(first.length, last.length); i2++) {
48036       if (first[i2] !== last[i2]) {
48037         equal = false;
48038         break;
48039       }
48040     }
48041     if (!equal) {
48042       return ring.concat([ring[0]]);
48043     }
48044     return ring;
48045   }
48046   function getCoordinates(node) {
48047     return nodeVal(get1(node, "coordinates"));
48048   }
48049   function getGeometry(node) {
48050     let geometries = [];
48051     let coordTimes = [];
48052     for (let i2 = 0; i2 < node.childNodes.length; i2++) {
48053       const child = node.childNodes.item(i2);
48054       if (isElement(child)) {
48055         switch (child.tagName) {
48056           case "MultiGeometry":
48057           case "MultiTrack":
48058           case "gx:MultiTrack": {
48059             const childGeometries = getGeometry(child);
48060             geometries = geometries.concat(childGeometries.geometries);
48061             coordTimes = coordTimes.concat(childGeometries.coordTimes);
48062             break;
48063           }
48064           case "Point": {
48065             const coordinates = coord1(getCoordinates(child));
48066             if (coordinates.length >= 2) {
48067               geometries.push({
48068                 type: "Point",
48069                 coordinates
48070               });
48071             }
48072             break;
48073           }
48074           case "LinearRing":
48075           case "LineString": {
48076             const coordinates = coord(getCoordinates(child));
48077             if (coordinates.length >= 2) {
48078               geometries.push({
48079                 type: "LineString",
48080                 coordinates
48081               });
48082             }
48083             break;
48084           }
48085           case "Polygon": {
48086             const coords = [];
48087             for (const linearRing of $(child, "LinearRing")) {
48088               const ring = fixRing(coord(getCoordinates(linearRing)));
48089               if (ring.length >= 4) {
48090                 coords.push(ring);
48091               }
48092             }
48093             if (coords.length) {
48094               geometries.push({
48095                 type: "Polygon",
48096                 coordinates: coords
48097               });
48098             }
48099             break;
48100           }
48101           case "Track":
48102           case "gx:Track": {
48103             const gx = gxCoords(child);
48104             if (!gx)
48105               break;
48106             const { times, geometry } = gx;
48107             geometries.push(geometry);
48108             if (times.length)
48109               coordTimes.push(times);
48110             break;
48111           }
48112         }
48113       }
48114     }
48115     return {
48116       geometries,
48117       coordTimes
48118     };
48119   }
48120   function geometryListToGeometry(geometries) {
48121     return geometries.length === 0 ? null : geometries.length === 1 ? geometries[0] : {
48122       type: "GeometryCollection",
48123       geometries
48124     };
48125   }
48126   function getPlacemark(node, styleMap, schema) {
48127     const { coordTimes, geometries } = getGeometry(node);
48128     const feature3 = {
48129       type: "Feature",
48130       geometry: geometryListToGeometry(geometries),
48131       properties: Object.assign(getMulti(node, [
48132         "name",
48133         "address",
48134         "visibility",
48135         "open",
48136         "phoneNumber",
48137         "description"
48138       ]), getMaybeHTMLDescription(node), extractCascadedStyle(node, styleMap), extractStyle(node), extractExtendedData(node, schema), extractTimeSpan(node), extractTimeStamp(node), coordTimes.length ? {
48139         coordinateProperties: {
48140           times: coordTimes.length === 1 ? coordTimes[0] : coordTimes
48141         }
48142       } : {})
48143     };
48144     if (feature3.properties?.visibility !== void 0) {
48145       feature3.properties.visibility = feature3.properties.visibility !== "0";
48146     }
48147     const id2 = node.getAttribute("id");
48148     if (id2 !== null && id2 !== "")
48149       feature3.id = id2;
48150     return feature3;
48151   }
48152   function getGroundOverlayBox(node) {
48153     const latLonQuad = get1(node, "gx:LatLonQuad");
48154     if (latLonQuad) {
48155       const ring = fixRing(coord(getCoordinates(node)));
48156       return {
48157         type: "Polygon",
48158         coordinates: [ring]
48159       };
48160     }
48161     return getLatLonBox(node);
48162   }
48163   var DEGREES_TO_RADIANS = Math.PI / 180;
48164   function rotateBox(bbox2, coordinates, rotation) {
48165     const center = [(bbox2[0] + bbox2[2]) / 2, (bbox2[1] + bbox2[3]) / 2];
48166     return [
48167       coordinates[0].map((coordinate) => {
48168         const dy = coordinate[1] - center[1];
48169         const dx = coordinate[0] - center[0];
48170         const distance = Math.sqrt(Math.pow(dy, 2) + Math.pow(dx, 2));
48171         const angle2 = Math.atan2(dy, dx) - rotation * DEGREES_TO_RADIANS;
48172         return [
48173           center[0] + Math.cos(angle2) * distance,
48174           center[1] + Math.sin(angle2) * distance
48175         ];
48176       })
48177     ];
48178   }
48179   function getLatLonBox(node) {
48180     const latLonBox = get1(node, "LatLonBox");
48181     if (latLonBox) {
48182       const north = num1(latLonBox, "north");
48183       const west = num1(latLonBox, "west");
48184       const east = num1(latLonBox, "east");
48185       const south = num1(latLonBox, "south");
48186       const rotation = num1(latLonBox, "rotation");
48187       if (typeof north === "number" && typeof south === "number" && typeof west === "number" && typeof east === "number") {
48188         const bbox2 = [west, south, east, north];
48189         let coordinates = [
48190           [
48191             [west, north],
48192             [east, north],
48193             [east, south],
48194             [west, south],
48195             [west, north]
48196             // top left (again)
48197           ]
48198         ];
48199         if (typeof rotation === "number") {
48200           coordinates = rotateBox(bbox2, coordinates, rotation);
48201         }
48202         return {
48203           type: "Polygon",
48204           coordinates
48205         };
48206       }
48207     }
48208     return null;
48209   }
48210   function getGroundOverlay(node, styleMap, schema) {
48211     const geometry = getGroundOverlayBox(node);
48212     const feature3 = {
48213       type: "Feature",
48214       geometry,
48215       properties: Object.assign(
48216         /**
48217          * Related to
48218          * https://gist.github.com/tmcw/037a1cb6660d74a392e9da7446540f46
48219          */
48220         { "@geometry-type": "groundoverlay" },
48221         getMulti(node, [
48222           "name",
48223           "address",
48224           "visibility",
48225           "open",
48226           "phoneNumber",
48227           "description"
48228         ]),
48229         getMaybeHTMLDescription(node),
48230         extractCascadedStyle(node, styleMap),
48231         extractStyle(node),
48232         extractIconHref(node),
48233         extractExtendedData(node, schema),
48234         extractTimeSpan(node),
48235         extractTimeStamp(node)
48236       )
48237     };
48238     if (feature3.properties?.visibility !== void 0) {
48239       feature3.properties.visibility = feature3.properties.visibility !== "0";
48240     }
48241     const id2 = node.getAttribute("id");
48242     if (id2 !== null && id2 !== "")
48243       feature3.id = id2;
48244     return feature3;
48245   }
48246   function getStyleId(style) {
48247     let id2 = style.getAttribute("id");
48248     const parentNode = style.parentNode;
48249     if (!id2 && isElement(parentNode) && parentNode.localName === "CascadingStyle") {
48250       id2 = parentNode.getAttribute("kml:id") || parentNode.getAttribute("id");
48251     }
48252     return normalizeId(id2 || "");
48253   }
48254   function buildStyleMap(node) {
48255     const styleMap = {};
48256     for (const style of $(node, "Style")) {
48257       styleMap[getStyleId(style)] = extractStyle(style);
48258     }
48259     for (const map2 of $(node, "StyleMap")) {
48260       const id2 = normalizeId(map2.getAttribute("id") || "");
48261       val1(map2, "styleUrl", (styleUrl) => {
48262         styleUrl = normalizeId(styleUrl);
48263         if (styleMap[styleUrl]) {
48264           styleMap[id2] = styleMap[styleUrl];
48265         }
48266       });
48267     }
48268     return styleMap;
48269   }
48270   function buildSchema(node) {
48271     const schema = {};
48272     for (const field of $(node, "SimpleField")) {
48273       schema[field.getAttribute("name") || ""] = typeConverters[field.getAttribute("type") || ""] || typeConverters["string"];
48274     }
48275     return schema;
48276   }
48277   function* kmlGen(node) {
48278     const styleMap = buildStyleMap(node);
48279     const schema = buildSchema(node);
48280     for (const placemark of $(node, "Placemark")) {
48281       const feature3 = getPlacemark(placemark, styleMap, schema);
48282       if (feature3)
48283         yield feature3;
48284     }
48285     for (const groundOverlay of $(node, "GroundOverlay")) {
48286       const feature3 = getGroundOverlay(groundOverlay, styleMap, schema);
48287       if (feature3)
48288         yield feature3;
48289     }
48290   }
48291   function kml(node) {
48292     return {
48293       type: "FeatureCollection",
48294       features: Array.from(kmlGen(node))
48295     };
48296   }
48297
48298   // modules/svg/data.js
48299   var _initialized = false;
48300   var _enabled = false;
48301   var _geojson;
48302   function svgData(projection2, context, dispatch10) {
48303     var throttledRedraw = throttle_default(function() {
48304       dispatch10.call("change");
48305     }, 1e3);
48306     var _showLabels = true;
48307     var detected = utilDetect();
48308     var layer = select_default2(null);
48309     var _vtService;
48310     var _fileList;
48311     var _template;
48312     var _src;
48313     function init2() {
48314       if (_initialized)
48315         return;
48316       _geojson = {};
48317       _enabled = true;
48318       function over(d3_event) {
48319         d3_event.stopPropagation();
48320         d3_event.preventDefault();
48321         d3_event.dataTransfer.dropEffect = "copy";
48322       }
48323       context.container().attr("dropzone", "copy").on("drop.svgData", function(d3_event) {
48324         d3_event.stopPropagation();
48325         d3_event.preventDefault();
48326         if (!detected.filedrop)
48327           return;
48328         drawData.fileList(d3_event.dataTransfer.files);
48329       }).on("dragenter.svgData", over).on("dragexit.svgData", over).on("dragover.svgData", over);
48330       _initialized = true;
48331     }
48332     function getService() {
48333       if (services.vectorTile && !_vtService) {
48334         _vtService = services.vectorTile;
48335         _vtService.event.on("loadedData", throttledRedraw);
48336       } else if (!services.vectorTile && _vtService) {
48337         _vtService = null;
48338       }
48339       return _vtService;
48340     }
48341     function showLayer() {
48342       layerOn();
48343       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
48344         dispatch10.call("change");
48345       });
48346     }
48347     function hideLayer() {
48348       throttledRedraw.cancel();
48349       layer.transition().duration(250).style("opacity", 0).on("end", layerOff);
48350     }
48351     function layerOn() {
48352       layer.style("display", "block");
48353     }
48354     function layerOff() {
48355       layer.selectAll(".viewfield-group").remove();
48356       layer.style("display", "none");
48357     }
48358     function ensureIDs(gj) {
48359       if (!gj)
48360         return null;
48361       if (gj.type === "FeatureCollection") {
48362         for (var i2 = 0; i2 < gj.features.length; i2++) {
48363           ensureFeatureID(gj.features[i2]);
48364         }
48365       } else {
48366         ensureFeatureID(gj);
48367       }
48368       return gj;
48369     }
48370     function ensureFeatureID(feature3) {
48371       if (!feature3)
48372         return;
48373       feature3.__featurehash__ = utilHashcode((0, import_fast_json_stable_stringify.default)(feature3));
48374       return feature3;
48375     }
48376     function getFeatures(gj) {
48377       if (!gj)
48378         return [];
48379       if (gj.type === "FeatureCollection") {
48380         return gj.features;
48381       } else {
48382         return [gj];
48383       }
48384     }
48385     function featureKey(d) {
48386       return d.__featurehash__;
48387     }
48388     function isPolygon(d) {
48389       return d.geometry.type === "Polygon" || d.geometry.type === "MultiPolygon";
48390     }
48391     function clipPathID(d) {
48392       return "ideditor-data-" + d.__featurehash__ + "-clippath";
48393     }
48394     function featureClasses(d) {
48395       return [
48396         "data" + d.__featurehash__,
48397         d.geometry.type,
48398         isPolygon(d) ? "area" : "",
48399         d.__layerID__ || ""
48400       ].filter(Boolean).join(" ");
48401     }
48402     function drawData(selection2) {
48403       var vtService = getService();
48404       var getPath = svgPath(projection2).geojson;
48405       var getAreaPath = svgPath(projection2, null, true).geojson;
48406       var hasData = drawData.hasData();
48407       layer = selection2.selectAll(".layer-mapdata").data(_enabled && hasData ? [0] : []);
48408       layer.exit().remove();
48409       layer = layer.enter().append("g").attr("class", "layer-mapdata").merge(layer);
48410       var surface = context.surface();
48411       if (!surface || surface.empty())
48412         return;
48413       var geoData, polygonData;
48414       if (_template && vtService) {
48415         var sourceID = _template;
48416         vtService.loadTiles(sourceID, _template, projection2);
48417         geoData = vtService.data(sourceID, projection2);
48418       } else {
48419         geoData = getFeatures(_geojson);
48420       }
48421       geoData = geoData.filter(getPath);
48422       polygonData = geoData.filter(isPolygon);
48423       var clipPaths = surface.selectAll("defs").selectAll(".clipPath-data").data(polygonData, featureKey);
48424       clipPaths.exit().remove();
48425       var clipPathsEnter = clipPaths.enter().append("clipPath").attr("class", "clipPath-data").attr("id", clipPathID);
48426       clipPathsEnter.append("path");
48427       clipPaths.merge(clipPathsEnter).selectAll("path").attr("d", getAreaPath);
48428       var datagroups = layer.selectAll("g.datagroup").data(["fill", "shadow", "stroke"]);
48429       datagroups = datagroups.enter().append("g").attr("class", function(d) {
48430         return "datagroup datagroup-" + d;
48431       }).merge(datagroups);
48432       var pathData = {
48433         fill: polygonData,
48434         shadow: geoData,
48435         stroke: geoData
48436       };
48437       var paths = datagroups.selectAll("path").data(function(layer2) {
48438         return pathData[layer2];
48439       }, featureKey);
48440       paths.exit().remove();
48441       paths = paths.enter().append("path").attr("class", function(d) {
48442         var datagroup = this.parentNode.__data__;
48443         return "pathdata " + datagroup + " " + featureClasses(d);
48444       }).attr("clip-path", function(d) {
48445         var datagroup = this.parentNode.__data__;
48446         return datagroup === "fill" ? "url(#" + clipPathID(d) + ")" : null;
48447       }).merge(paths).attr("d", function(d) {
48448         var datagroup = this.parentNode.__data__;
48449         return datagroup === "fill" ? getAreaPath(d) : getPath(d);
48450       });
48451       layer.call(drawLabels, "label-halo", geoData).call(drawLabels, "label", geoData);
48452       function drawLabels(selection3, textClass, data) {
48453         var labelPath = path_default(projection2);
48454         var labelData = data.filter(function(d) {
48455           return _showLabels && d.properties && (d.properties.desc || d.properties.name);
48456         });
48457         var labels = selection3.selectAll("text." + textClass).data(labelData, featureKey);
48458         labels.exit().remove();
48459         labels = labels.enter().append("text").attr("class", function(d) {
48460           return textClass + " " + featureClasses(d);
48461         }).merge(labels).text(function(d) {
48462           return d.properties.desc || d.properties.name;
48463         }).attr("x", function(d) {
48464           var centroid = labelPath.centroid(d);
48465           return centroid[0] + 11;
48466         }).attr("y", function(d) {
48467           var centroid = labelPath.centroid(d);
48468           return centroid[1];
48469         });
48470       }
48471     }
48472     function getExtension(fileName) {
48473       if (!fileName)
48474         return;
48475       var re2 = /\.(gpx|kml|(geo)?json)$/i;
48476       var match = fileName.toLowerCase().match(re2);
48477       return match && match.length && match[0];
48478     }
48479     function xmlToDom(textdata) {
48480       return new DOMParser().parseFromString(textdata, "text/xml");
48481     }
48482     function stringifyGeojsonProperties(feature3) {
48483       const properties = feature3.properties;
48484       for (const key in properties) {
48485         const property = properties[key];
48486         if (typeof property === "number" || typeof property === "boolean" || Array.isArray(property)) {
48487           properties[key] = property.toString();
48488         } else if (property === null) {
48489           properties[key] = "null";
48490         } else if (typeof property === "object") {
48491           properties[key] = JSON.stringify(property);
48492         }
48493       }
48494     }
48495     drawData.setFile = function(extension, data) {
48496       _template = null;
48497       _fileList = null;
48498       _geojson = null;
48499       _src = null;
48500       var gj;
48501       switch (extension) {
48502         case ".gpx":
48503           gj = gpx(xmlToDom(data));
48504           break;
48505         case ".kml":
48506           gj = kml(xmlToDom(data));
48507           break;
48508         case ".geojson":
48509         case ".json":
48510           gj = JSON.parse(data);
48511           if (gj.type === "FeatureCollection") {
48512             gj.features.forEach(stringifyGeojsonProperties);
48513           } else if (gj.type === "Feature") {
48514             stringifyGeojsonProperties(gj);
48515           }
48516           break;
48517       }
48518       gj = gj || {};
48519       if (Object.keys(gj).length) {
48520         _geojson = ensureIDs(gj);
48521         _src = extension + " data file";
48522         this.fitZoom();
48523       }
48524       dispatch10.call("change");
48525       return this;
48526     };
48527     drawData.showLabels = function(val) {
48528       if (!arguments.length)
48529         return _showLabels;
48530       _showLabels = val;
48531       return this;
48532     };
48533     drawData.enabled = function(val) {
48534       if (!arguments.length)
48535         return _enabled;
48536       _enabled = val;
48537       if (_enabled) {
48538         showLayer();
48539       } else {
48540         hideLayer();
48541       }
48542       dispatch10.call("change");
48543       return this;
48544     };
48545     drawData.hasData = function() {
48546       var gj = _geojson || {};
48547       return !!(_template || Object.keys(gj).length);
48548     };
48549     drawData.template = function(val, src) {
48550       if (!arguments.length)
48551         return _template;
48552       var osm = context.connection();
48553       if (osm) {
48554         var blocklists = osm.imageryBlocklists();
48555         var fail = false;
48556         var tested = 0;
48557         var regex;
48558         for (var i2 = 0; i2 < blocklists.length; i2++) {
48559           regex = blocklists[i2];
48560           fail = regex.test(val);
48561           tested++;
48562           if (fail)
48563             break;
48564         }
48565         if (!tested) {
48566           regex = /.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/;
48567           fail = regex.test(val);
48568         }
48569       }
48570       _template = val;
48571       _fileList = null;
48572       _geojson = null;
48573       _src = src || "vectortile:" + val.split(/[?#]/)[0];
48574       dispatch10.call("change");
48575       return this;
48576     };
48577     drawData.geojson = function(gj, src) {
48578       if (!arguments.length)
48579         return _geojson;
48580       _template = null;
48581       _fileList = null;
48582       _geojson = null;
48583       _src = null;
48584       gj = gj || {};
48585       if (Object.keys(gj).length) {
48586         _geojson = ensureIDs(gj);
48587         _src = src || "unknown.geojson";
48588       }
48589       dispatch10.call("change");
48590       return this;
48591     };
48592     drawData.fileList = function(fileList) {
48593       if (!arguments.length)
48594         return _fileList;
48595       _template = null;
48596       _fileList = fileList;
48597       _geojson = null;
48598       _src = null;
48599       if (!fileList || !fileList.length)
48600         return this;
48601       var f2 = fileList[0];
48602       var extension = getExtension(f2.name);
48603       var reader = new FileReader();
48604       reader.onload = function() {
48605         return function(e) {
48606           drawData.setFile(extension, e.target.result);
48607         };
48608       }(f2);
48609       reader.readAsText(f2);
48610       return this;
48611     };
48612     drawData.url = function(url, defaultExtension) {
48613       _template = null;
48614       _fileList = null;
48615       _geojson = null;
48616       _src = null;
48617       var testUrl = url.split(/[?#]/)[0];
48618       var extension = getExtension(testUrl) || defaultExtension;
48619       if (extension) {
48620         _template = null;
48621         text_default3(url).then(function(data) {
48622           drawData.setFile(extension, data);
48623         }).catch(function() {
48624         });
48625       } else {
48626         drawData.template(url);
48627       }
48628       return this;
48629     };
48630     drawData.getSrc = function() {
48631       return _src || "";
48632     };
48633     drawData.fitZoom = function() {
48634       var features = getFeatures(_geojson);
48635       if (!features.length)
48636         return;
48637       var map2 = context.map();
48638       var viewport = map2.trimmedExtent().polygon();
48639       var coords = features.reduce(function(coords2, feature3) {
48640         var geom = feature3.geometry;
48641         if (!geom)
48642           return coords2;
48643         var c = geom.coordinates;
48644         switch (geom.type) {
48645           case "Point":
48646             c = [c];
48647           case "MultiPoint":
48648           case "LineString":
48649             break;
48650           case "MultiPolygon":
48651             c = utilArrayFlatten(c);
48652           case "Polygon":
48653           case "MultiLineString":
48654             c = utilArrayFlatten(c);
48655             break;
48656         }
48657         return utilArrayUnion(coords2, c);
48658       }, []);
48659       if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
48660         var extent = geoExtent(bounds_default({ type: "LineString", coordinates: coords }));
48661         map2.centerZoom(extent.center(), map2.trimmedExtentZoom(extent));
48662       }
48663       return this;
48664     };
48665     init2();
48666     return drawData;
48667   }
48668
48669   // modules/svg/debug.js
48670   function svgDebug(projection2, context) {
48671     function drawDebug(selection2) {
48672       const showTile = context.getDebug("tile");
48673       const showCollision = context.getDebug("collision");
48674       const showImagery = context.getDebug("imagery");
48675       const showTouchTargets = context.getDebug("target");
48676       const showDownloaded = context.getDebug("downloaded");
48677       let debugData = [];
48678       if (showTile) {
48679         debugData.push({ class: "red", label: "tile" });
48680       }
48681       if (showCollision) {
48682         debugData.push({ class: "yellow", label: "collision" });
48683       }
48684       if (showImagery) {
48685         debugData.push({ class: "orange", label: "imagery" });
48686       }
48687       if (showTouchTargets) {
48688         debugData.push({ class: "pink", label: "touchTargets" });
48689       }
48690       if (showDownloaded) {
48691         debugData.push({ class: "purple", label: "downloaded" });
48692       }
48693       let legend = context.container().select(".main-content").selectAll(".debug-legend").data(debugData.length ? [0] : []);
48694       legend.exit().remove();
48695       legend = legend.enter().append("div").attr("class", "fillD debug-legend").merge(legend);
48696       let legendItems = legend.selectAll(".debug-legend-item").data(debugData, (d) => d.label);
48697       legendItems.exit().remove();
48698       legendItems.enter().append("span").attr("class", (d) => `debug-legend-item ${d.class}`).text((d) => d.label);
48699       let layer = selection2.selectAll(".layer-debug").data(showImagery || showDownloaded ? [0] : []);
48700       layer.exit().remove();
48701       layer = layer.enter().append("g").attr("class", "layer-debug").merge(layer);
48702       const extent = context.map().extent();
48703       _mainFileFetcher.get("imagery").then((d) => {
48704         const hits = showImagery && d.query.bbox(extent.rectangle(), true) || [];
48705         const features = hits.map((d2) => d2.features[d2.id]);
48706         let imagery = layer.selectAll("path.debug-imagery").data(features);
48707         imagery.exit().remove();
48708         imagery.enter().append("path").attr("class", "debug-imagery debug orange");
48709       }).catch(() => {
48710       });
48711       const osm = context.connection();
48712       let dataDownloaded = [];
48713       if (osm && showDownloaded) {
48714         const rtree = osm.caches("get").tile.rtree;
48715         dataDownloaded = rtree.all().map((bbox2) => {
48716           return {
48717             type: "Feature",
48718             properties: { id: bbox2.id },
48719             geometry: {
48720               type: "Polygon",
48721               coordinates: [[
48722                 [bbox2.minX, bbox2.minY],
48723                 [bbox2.minX, bbox2.maxY],
48724                 [bbox2.maxX, bbox2.maxY],
48725                 [bbox2.maxX, bbox2.minY],
48726                 [bbox2.minX, bbox2.minY]
48727               ]]
48728             }
48729           };
48730         });
48731       }
48732       let downloaded = layer.selectAll("path.debug-downloaded").data(showDownloaded ? dataDownloaded : []);
48733       downloaded.exit().remove();
48734       downloaded.enter().append("path").attr("class", "debug-downloaded debug purple");
48735       layer.selectAll("path").attr("d", svgPath(projection2).geojson);
48736     }
48737     drawDebug.enabled = function() {
48738       if (!arguments.length) {
48739         return context.getDebug("tile") || context.getDebug("collision") || context.getDebug("imagery") || context.getDebug("target") || context.getDebug("downloaded");
48740       } else {
48741         return this;
48742       }
48743     };
48744     return drawDebug;
48745   }
48746
48747   // modules/svg/defs.js
48748   function svgDefs(context) {
48749     var _defsSelection = select_default2(null);
48750     var _spritesheetIds = [
48751       "iD-sprite",
48752       "maki-sprite",
48753       "temaki-sprite",
48754       "fa-sprite",
48755       "roentgen-sprite",
48756       "community-sprite"
48757     ];
48758     function drawDefs(selection2) {
48759       _defsSelection = selection2.append("defs");
48760       _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");
48761       function addSidedMarker(name, color2, offset) {
48762         _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);
48763       }
48764       addSidedMarker("natural", "rgb(170, 170, 170)", 0);
48765       addSidedMarker("coastline", "#77dede", 1);
48766       addSidedMarker("waterway", "#77dede", 1);
48767       addSidedMarker("barrier", "#ddd", 1);
48768       addSidedMarker("man_made", "#fff", 0);
48769       _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");
48770       _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");
48771       var patterns2 = _defsSelection.selectAll("pattern").data([
48772         // pattern name, pattern image name
48773         ["beach", "dots"],
48774         ["construction", "construction"],
48775         ["cemetery", "cemetery"],
48776         ["cemetery_christian", "cemetery_christian"],
48777         ["cemetery_buddhist", "cemetery_buddhist"],
48778         ["cemetery_muslim", "cemetery_muslim"],
48779         ["cemetery_jewish", "cemetery_jewish"],
48780         ["farmland", "farmland"],
48781         ["farmyard", "farmyard"],
48782         ["forest", "forest"],
48783         ["forest_broadleaved", "forest_broadleaved"],
48784         ["forest_needleleaved", "forest_needleleaved"],
48785         ["forest_leafless", "forest_leafless"],
48786         ["golf_green", "grass"],
48787         ["grass", "grass"],
48788         ["landfill", "landfill"],
48789         ["meadow", "grass"],
48790         ["orchard", "orchard"],
48791         ["pond", "pond"],
48792         ["quarry", "quarry"],
48793         ["scrub", "bushes"],
48794         ["vineyard", "vineyard"],
48795         ["water_standing", "lines"],
48796         ["waves", "waves"],
48797         ["wetland", "wetland"],
48798         ["wetland_marsh", "wetland_marsh"],
48799         ["wetland_swamp", "wetland_swamp"],
48800         ["wetland_bog", "wetland_bog"],
48801         ["wetland_reedbed", "wetland_reedbed"]
48802       ]).enter().append("pattern").attr("id", function(d) {
48803         return "ideditor-pattern-" + d[0];
48804       }).attr("width", 32).attr("height", 32).attr("patternUnits", "userSpaceOnUse");
48805       patterns2.append("rect").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("class", function(d) {
48806         return "pattern-color-" + d[0];
48807       });
48808       patterns2.append("image").attr("x", 0).attr("y", 0).attr("width", 32).attr("height", 32).attr("xlink:href", function(d) {
48809         return context.imagePath("pattern/" + d[1] + ".png");
48810       });
48811       _defsSelection.selectAll("clipPath").data([12, 18, 20, 32, 45]).enter().append("clipPath").attr("id", function(d) {
48812         return "ideditor-clip-square-" + d;
48813       }).append("rect").attr("x", 0).attr("y", 0).attr("width", function(d) {
48814         return d;
48815       }).attr("height", function(d) {
48816         return d;
48817       });
48818       addSprites(_spritesheetIds, true);
48819     }
48820     function addSprites(ids, overrideColors) {
48821       _spritesheetIds = utilArrayUniq(_spritesheetIds.concat(ids));
48822       var spritesheets = _defsSelection.selectAll(".spritesheet").data(_spritesheetIds);
48823       spritesheets.enter().append("g").attr("class", function(d) {
48824         return "spritesheet spritesheet-" + d;
48825       }).each(function(d) {
48826         var url = context.imagePath(d + ".svg");
48827         var node = select_default2(this).node();
48828         svg(url).then(function(svg2) {
48829           node.appendChild(
48830             select_default2(svg2.documentElement).attr("id", "ideditor-" + d).node()
48831           );
48832           if (overrideColors && d !== "iD-sprite") {
48833             select_default2(node).selectAll("path").attr("fill", "currentColor");
48834           }
48835         }).catch(function() {
48836         });
48837       });
48838       spritesheets.exit().remove();
48839     }
48840     drawDefs.addSprites = addSprites;
48841     return drawDefs;
48842   }
48843
48844   // modules/svg/keepRight.js
48845   var _layerEnabled = false;
48846   var _qaService;
48847   function svgKeepRight(projection2, context, dispatch10) {
48848     const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
48849     const minZoom3 = 12;
48850     let touchLayer = select_default2(null);
48851     let drawLayer = select_default2(null);
48852     let layerVisible = false;
48853     function markerPath(selection2, klass) {
48854       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");
48855     }
48856     function getService() {
48857       if (services.keepRight && !_qaService) {
48858         _qaService = services.keepRight;
48859         _qaService.on("loaded", throttledRedraw);
48860       } else if (!services.keepRight && _qaService) {
48861         _qaService = null;
48862       }
48863       return _qaService;
48864     }
48865     function editOn() {
48866       if (!layerVisible) {
48867         layerVisible = true;
48868         drawLayer.style("display", "block");
48869       }
48870     }
48871     function editOff() {
48872       if (layerVisible) {
48873         layerVisible = false;
48874         drawLayer.style("display", "none");
48875         drawLayer.selectAll(".qaItem.keepRight").remove();
48876         touchLayer.selectAll(".qaItem.keepRight").remove();
48877       }
48878     }
48879     function layerOn() {
48880       editOn();
48881       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
48882     }
48883     function layerOff() {
48884       throttledRedraw.cancel();
48885       drawLayer.interrupt();
48886       touchLayer.selectAll(".qaItem.keepRight").remove();
48887       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
48888         editOff();
48889         dispatch10.call("change");
48890       });
48891     }
48892     function updateMarkers() {
48893       if (!layerVisible || !_layerEnabled)
48894         return;
48895       const service = getService();
48896       const selectedID = context.selectedErrorID();
48897       const data = service ? service.getItems(projection2) : [];
48898       const getTransform = svgPointTransform(projection2);
48899       const markers = drawLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id);
48900       markers.exit().remove();
48901       const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.parentIssueType}`);
48902       markersEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
48903       markersEnter.append("path").call(markerPath, "shadow");
48904       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");
48905       markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
48906       if (touchLayer.empty())
48907         return;
48908       const fillClass = context.getDebug("target") ? "pink " : "nocolor ";
48909       const targets = touchLayer.selectAll(".qaItem.keepRight").data(data, (d) => d.id);
48910       targets.exit().remove();
48911       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);
48912       function sortY(a, b) {
48913         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];
48914       }
48915     }
48916     function drawKeepRight(selection2) {
48917       const service = getService();
48918       const surface = context.surface();
48919       if (surface && !surface.empty()) {
48920         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
48921       }
48922       drawLayer = selection2.selectAll(".layer-keepRight").data(service ? [0] : []);
48923       drawLayer.exit().remove();
48924       drawLayer = drawLayer.enter().append("g").attr("class", "layer-keepRight").style("display", _layerEnabled ? "block" : "none").merge(drawLayer);
48925       if (_layerEnabled) {
48926         if (service && ~~context.map().zoom() >= minZoom3) {
48927           editOn();
48928           service.loadIssues(projection2);
48929           updateMarkers();
48930         } else {
48931           editOff();
48932         }
48933       }
48934     }
48935     drawKeepRight.enabled = function(val) {
48936       if (!arguments.length)
48937         return _layerEnabled;
48938       _layerEnabled = val;
48939       if (_layerEnabled) {
48940         layerOn();
48941       } else {
48942         layerOff();
48943         if (context.selectedErrorID()) {
48944           context.enter(modeBrowse(context));
48945         }
48946       }
48947       dispatch10.call("change");
48948       return this;
48949     };
48950     drawKeepRight.supported = () => !!getService();
48951     return drawKeepRight;
48952   }
48953
48954   // modules/svg/geolocate.js
48955   function svgGeolocate(projection2) {
48956     var layer = select_default2(null);
48957     var _position;
48958     function init2() {
48959       if (svgGeolocate.initialized)
48960         return;
48961       svgGeolocate.enabled = false;
48962       svgGeolocate.initialized = true;
48963     }
48964     function showLayer() {
48965       layer.style("display", "block");
48966     }
48967     function hideLayer() {
48968       layer.transition().duration(250).style("opacity", 0);
48969     }
48970     function layerOn() {
48971       layer.style("opacity", 0).transition().duration(250).style("opacity", 1);
48972     }
48973     function layerOff() {
48974       layer.style("display", "none");
48975     }
48976     function transform2(d) {
48977       return svgPointTransform(projection2)(d);
48978     }
48979     function accuracy(accuracy2, loc) {
48980       var degreesRadius = geoMetersToLat(accuracy2), tangentLoc = [loc[0], loc[1] + degreesRadius], projectedTangent = projection2(tangentLoc), projectedLoc = projection2([loc[0], loc[1]]);
48981       return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
48982     }
48983     function update() {
48984       var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
48985       var groups = layer.selectAll(".geolocations").selectAll(".geolocation").data([geolocation]);
48986       groups.exit().remove();
48987       var pointsEnter = groups.enter().append("g").attr("class", "geolocation");
48988       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");
48989       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");
48990       groups.merge(pointsEnter).attr("transform", transform2);
48991       layer.select(".geolocate-radius").attr("r", accuracy(_position.coords.accuracy, geolocation.loc));
48992     }
48993     function drawLocation(selection2) {
48994       var enabled = svgGeolocate.enabled;
48995       layer = selection2.selectAll(".layer-geolocate").data([0]);
48996       layer.exit().remove();
48997       var layerEnter = layer.enter().append("g").attr("class", "layer-geolocate").style("display", enabled ? "block" : "none");
48998       layerEnter.append("g").attr("class", "geolocations");
48999       layer = layerEnter.merge(layer);
49000       if (enabled) {
49001         update();
49002       } else {
49003         layerOff();
49004       }
49005     }
49006     drawLocation.enabled = function(position, enabled) {
49007       if (!arguments.length)
49008         return svgGeolocate.enabled;
49009       _position = position;
49010       svgGeolocate.enabled = enabled;
49011       if (svgGeolocate.enabled) {
49012         showLayer();
49013         layerOn();
49014       } else {
49015         hideLayer();
49016       }
49017       return this;
49018     };
49019     init2();
49020     return drawLocation;
49021   }
49022
49023   // modules/svg/labels.js
49024   var import_rbush6 = __toESM(require_rbush_min());
49025   function svgLabels(projection2, context) {
49026     var path = path_default(projection2);
49027     var detected = utilDetect();
49028     var baselineHack = detected.ie || detected.browser.toLowerCase() === "edge" || detected.browser.toLowerCase() === "firefox" && detected.version >= 70;
49029     var _rdrawn = new import_rbush6.default();
49030     var _rskipped = new import_rbush6.default();
49031     var _textWidthCache = {};
49032     var _entitybboxes = {};
49033     var labelStack = [
49034       ["line", "aeroway", "*", 12],
49035       ["line", "highway", "motorway", 12],
49036       ["line", "highway", "trunk", 12],
49037       ["line", "highway", "primary", 12],
49038       ["line", "highway", "secondary", 12],
49039       ["line", "highway", "tertiary", 12],
49040       ["line", "highway", "*", 12],
49041       ["line", "railway", "*", 12],
49042       ["line", "waterway", "*", 12],
49043       ["area", "aeroway", "*", 12],
49044       ["area", "amenity", "*", 12],
49045       ["area", "building", "*", 12],
49046       ["area", "historic", "*", 12],
49047       ["area", "leisure", "*", 12],
49048       ["area", "man_made", "*", 12],
49049       ["area", "natural", "*", 12],
49050       ["area", "shop", "*", 12],
49051       ["area", "tourism", "*", 12],
49052       ["area", "camp_site", "*", 12],
49053       ["point", "aeroway", "*", 10],
49054       ["point", "amenity", "*", 10],
49055       ["point", "building", "*", 10],
49056       ["point", "historic", "*", 10],
49057       ["point", "leisure", "*", 10],
49058       ["point", "man_made", "*", 10],
49059       ["point", "natural", "*", 10],
49060       ["point", "shop", "*", 10],
49061       ["point", "tourism", "*", 10],
49062       ["point", "camp_site", "*", 10],
49063       ["line", "ref", "*", 12],
49064       ["area", "ref", "*", 12],
49065       ["point", "ref", "*", 10],
49066       ["line", "name", "*", 12],
49067       ["area", "name", "*", 12],
49068       ["point", "name", "*", 10]
49069     ];
49070     function shouldSkipIcon(preset) {
49071       var noIcons = ["building", "landuse", "natural"];
49072       return noIcons.some(function(s) {
49073         return preset.id.indexOf(s) >= 0;
49074       });
49075     }
49076     function get4(array2, prop) {
49077       return function(d, i2) {
49078         return array2[i2][prop];
49079       };
49080     }
49081     function textWidth(text2, size, elem) {
49082       var c = _textWidthCache[size];
49083       if (!c)
49084         c = _textWidthCache[size] = {};
49085       if (c[text2]) {
49086         return c[text2];
49087       } else if (elem) {
49088         c[text2] = elem.getComputedTextLength();
49089         return c[text2];
49090       } else {
49091         var str2 = encodeURIComponent(text2).match(/%[CDEFcdef]/g);
49092         if (str2 === null) {
49093           return size / 3 * 2 * text2.length;
49094         } else {
49095           return size / 3 * (2 * text2.length + str2.length);
49096         }
49097       }
49098     }
49099     function drawLinePaths(selection2, entities, filter2, classes, labels) {
49100       var paths = selection2.selectAll("path").filter(filter2).data(entities, osmEntity.key);
49101       paths.exit().remove();
49102       paths.enter().append("path").style("stroke-width", get4(labels, "font-size")).attr("id", function(d) {
49103         return "ideditor-labelpath-" + d.id;
49104       }).attr("class", classes).merge(paths).attr("d", get4(labels, "lineString"));
49105     }
49106     function drawLineLabels(selection2, entities, filter2, classes, labels) {
49107       var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key);
49108       texts.exit().remove();
49109       texts.enter().append("text").attr("class", function(d, i2) {
49110         return classes + " " + labels[i2].classes + " " + d.id;
49111       }).attr("dy", baselineHack ? "0.35em" : null).append("textPath").attr("class", "textpath");
49112       selection2.selectAll("text." + classes).selectAll(".textpath").filter(filter2).data(entities, osmEntity.key).attr("startOffset", "50%").attr("xlink:href", function(d) {
49113         return "#ideditor-labelpath-" + d.id;
49114       }).text(utilDisplayNameForPath);
49115     }
49116     function drawPointLabels(selection2, entities, filter2, classes, labels) {
49117       var texts = selection2.selectAll("text." + classes).filter(filter2).data(entities, osmEntity.key);
49118       texts.exit().remove();
49119       texts.enter().append("text").attr("class", function(d, i2) {
49120         return classes + " " + labels[i2].classes + " " + d.id;
49121       }).merge(texts).attr("x", get4(labels, "x")).attr("y", get4(labels, "y")).style("text-anchor", get4(labels, "textAnchor")).text(utilDisplayName).each(function(d, i2) {
49122         textWidth(utilDisplayName(d), labels[i2].height, this);
49123       });
49124     }
49125     function drawAreaLabels(selection2, entities, filter2, classes, labels) {
49126       entities = entities.filter(hasText);
49127       labels = labels.filter(hasText);
49128       drawPointLabels(selection2, entities, filter2, classes, labels);
49129       function hasText(d, i2) {
49130         return labels[i2].hasOwnProperty("x") && labels[i2].hasOwnProperty("y");
49131       }
49132     }
49133     function drawAreaIcons(selection2, entities, filter2, classes, labels) {
49134       var icons = selection2.selectAll("use." + classes).filter(filter2).data(entities, osmEntity.key);
49135       icons.exit().remove();
49136       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) {
49137         var preset = _mainPresetIndex.match(d, context.graph());
49138         var picon = preset && preset.icon;
49139         return picon ? "#" + picon : "";
49140       });
49141     }
49142     function drawCollisionBoxes(selection2, rtree, which) {
49143       var classes = "debug " + which + " " + (which === "debug-skipped" ? "orange" : "yellow");
49144       var gj = [];
49145       if (context.getDebug("collision")) {
49146         gj = rtree.all().map(function(d) {
49147           return { type: "Polygon", coordinates: [[
49148             [d.minX, d.minY],
49149             [d.maxX, d.minY],
49150             [d.maxX, d.maxY],
49151             [d.minX, d.maxY],
49152             [d.minX, d.minY]
49153           ]] };
49154         });
49155       }
49156       var boxes = selection2.selectAll("." + which).data(gj);
49157       boxes.exit().remove();
49158       boxes.enter().append("path").attr("class", classes).merge(boxes).attr("d", path_default());
49159     }
49160     function drawLabels(selection2, graph, entities, filter2, dimensions, fullRedraw) {
49161       var wireframe = context.surface().classed("fill-wireframe");
49162       var zoom = geoScaleToZoom(projection2.scale());
49163       var labelable = [];
49164       var renderNodeAs = {};
49165       var i2, j2, k, entity, geometry;
49166       for (i2 = 0; i2 < labelStack.length; i2++) {
49167         labelable.push([]);
49168       }
49169       if (fullRedraw) {
49170         _rdrawn.clear();
49171         _rskipped.clear();
49172         _entitybboxes = {};
49173       } else {
49174         for (i2 = 0; i2 < entities.length; i2++) {
49175           entity = entities[i2];
49176           var toRemove = [].concat(_entitybboxes[entity.id] || []).concat(_entitybboxes[entity.id + "I"] || []);
49177           for (j2 = 0; j2 < toRemove.length; j2++) {
49178             _rdrawn.remove(toRemove[j2]);
49179             _rskipped.remove(toRemove[j2]);
49180           }
49181         }
49182       }
49183       for (i2 = 0; i2 < entities.length; i2++) {
49184         entity = entities[i2];
49185         geometry = entity.geometry(graph);
49186         if (geometry === "point" || geometry === "vertex" && isInterestingVertex(entity)) {
49187           var hasDirections = entity.directions(graph, projection2).length;
49188           var markerPadding;
49189           if (!wireframe && geometry === "point" && !(zoom >= 18 && hasDirections)) {
49190             renderNodeAs[entity.id] = "point";
49191             markerPadding = 20;
49192           } else {
49193             renderNodeAs[entity.id] = "vertex";
49194             markerPadding = 0;
49195           }
49196           var coord2 = projection2(entity.loc);
49197           var nodePadding = 10;
49198           var bbox2 = {
49199             minX: coord2[0] - nodePadding,
49200             minY: coord2[1] - nodePadding - markerPadding,
49201             maxX: coord2[0] + nodePadding,
49202             maxY: coord2[1] + nodePadding
49203           };
49204           doInsert(bbox2, entity.id + "P");
49205         }
49206         if (geometry === "vertex") {
49207           geometry = "point";
49208         }
49209         var preset = geometry === "area" && _mainPresetIndex.match(entity, graph);
49210         var icon2 = preset && !shouldSkipIcon(preset) && preset.icon;
49211         if (!icon2 && !utilDisplayName(entity))
49212           continue;
49213         for (k = 0; k < labelStack.length; k++) {
49214           var matchGeom = labelStack[k][0];
49215           var matchKey = labelStack[k][1];
49216           var matchVal = labelStack[k][2];
49217           var hasVal = entity.tags[matchKey];
49218           if (geometry === matchGeom && hasVal && (matchVal === "*" || matchVal === hasVal)) {
49219             labelable[k].push(entity);
49220             break;
49221           }
49222         }
49223       }
49224       var positions = {
49225         point: [],
49226         line: [],
49227         area: []
49228       };
49229       var labelled = {
49230         point: [],
49231         line: [],
49232         area: []
49233       };
49234       for (k = 0; k < labelable.length; k++) {
49235         var fontSize = labelStack[k][3];
49236         for (i2 = 0; i2 < labelable[k].length; i2++) {
49237           entity = labelable[k][i2];
49238           geometry = entity.geometry(graph);
49239           var getName = geometry === "line" ? utilDisplayNameForPath : utilDisplayName;
49240           var name = getName(entity);
49241           var width = name && textWidth(name, fontSize);
49242           var p = null;
49243           if (geometry === "point" || geometry === "vertex") {
49244             if (wireframe)
49245               continue;
49246             var renderAs = renderNodeAs[entity.id];
49247             if (renderAs === "vertex" && zoom < 17)
49248               continue;
49249             p = getPointLabel(entity, width, fontSize, renderAs);
49250           } else if (geometry === "line") {
49251             p = getLineLabel(entity, width, fontSize);
49252           } else if (geometry === "area") {
49253             p = getAreaLabel(entity, width, fontSize);
49254           }
49255           if (p) {
49256             if (geometry === "vertex") {
49257               geometry = "point";
49258             }
49259             p.classes = geometry + " tag-" + labelStack[k][1];
49260             positions[geometry].push(p);
49261             labelled[geometry].push(entity);
49262           }
49263         }
49264       }
49265       function isInterestingVertex(entity2) {
49266         var selectedIDs = context.selectedIDs();
49267         return entity2.hasInterestingTags() || entity2.isEndpoint(graph) || entity2.isConnected(graph) || selectedIDs.indexOf(entity2.id) !== -1 || graph.parentWays(entity2).some(function(parent) {
49268           return selectedIDs.indexOf(parent.id) !== -1;
49269         });
49270       }
49271       function getPointLabel(entity2, width2, height, geometry2) {
49272         var y = geometry2 === "point" ? -12 : 0;
49273         var pointOffsets = {
49274           ltr: [15, y, "start"],
49275           rtl: [-15, y, "end"]
49276         };
49277         var textDirection = _mainLocalizer.textDirection();
49278         var coord3 = projection2(entity2.loc);
49279         var textPadding = 2;
49280         var offset = pointOffsets[textDirection];
49281         var p2 = {
49282           height,
49283           width: width2,
49284           x: coord3[0] + offset[0],
49285           y: coord3[1] + offset[1],
49286           textAnchor: offset[2]
49287         };
49288         var bbox3;
49289         if (textDirection === "rtl") {
49290           bbox3 = {
49291             minX: p2.x - width2 - textPadding,
49292             minY: p2.y - height / 2 - textPadding,
49293             maxX: p2.x + textPadding,
49294             maxY: p2.y + height / 2 + textPadding
49295           };
49296         } else {
49297           bbox3 = {
49298             minX: p2.x - textPadding,
49299             minY: p2.y - height / 2 - textPadding,
49300             maxX: p2.x + width2 + textPadding,
49301             maxY: p2.y + height / 2 + textPadding
49302           };
49303         }
49304         if (tryInsert([bbox3], entity2.id, true)) {
49305           return p2;
49306         }
49307       }
49308       function getLineLabel(entity2, width2, height) {
49309         var viewport = geoExtent(context.projection.clipExtent()).polygon();
49310         var points = graph.childNodes(entity2).map(function(node) {
49311           return projection2(node.loc);
49312         });
49313         var length = geoPathLength(points);
49314         if (length < width2 + 20)
49315           return;
49316         var lineOffsets = [
49317           50,
49318           45,
49319           55,
49320           40,
49321           60,
49322           35,
49323           65,
49324           30,
49325           70,
49326           25,
49327           75,
49328           20,
49329           80,
49330           15,
49331           95,
49332           10,
49333           90,
49334           5,
49335           95
49336         ];
49337         var padding = 3;
49338         for (var i3 = 0; i3 < lineOffsets.length; i3++) {
49339           var offset = lineOffsets[i3];
49340           var middle = offset / 100 * length;
49341           var start2 = middle - width2 / 2;
49342           if (start2 < 0 || start2 + width2 > length)
49343             continue;
49344           var sub = subpath(points, start2, start2 + width2);
49345           if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
49346             continue;
49347           }
49348           var isReverse = reverse(sub);
49349           if (isReverse) {
49350             sub = sub.reverse();
49351           }
49352           var bboxes = [];
49353           var boxsize = (height + 2) / 2;
49354           for (var j3 = 0; j3 < sub.length - 1; j3++) {
49355             var a = sub[j3];
49356             var b = sub[j3 + 1];
49357             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
49358             for (var box = 0; box < num; box++) {
49359               var p2 = geoVecInterp(a, b, box / num);
49360               var x05 = p2[0] - boxsize - padding;
49361               var y05 = p2[1] - boxsize - padding;
49362               var x12 = p2[0] + boxsize + padding;
49363               var y12 = p2[1] + boxsize + padding;
49364               bboxes.push({
49365                 minX: Math.min(x05, x12),
49366                 minY: Math.min(y05, y12),
49367                 maxX: Math.max(x05, x12),
49368                 maxY: Math.max(y05, y12)
49369               });
49370             }
49371           }
49372           if (tryInsert(bboxes, entity2.id, false)) {
49373             return {
49374               "font-size": height + 2,
49375               lineString: lineString2(sub),
49376               startOffset: offset + "%"
49377             };
49378           }
49379         }
49380         function reverse(p3) {
49381           var angle2 = Math.atan2(p3[1][1] - p3[0][1], p3[1][0] - p3[0][0]);
49382           return !(p3[0][0] < p3[p3.length - 1][0] && angle2 < Math.PI / 2 && angle2 > -Math.PI / 2);
49383         }
49384         function lineString2(points2) {
49385           return "M" + points2.join("L");
49386         }
49387         function subpath(points2, from, to) {
49388           var sofar = 0;
49389           var start3, end, i0, i1;
49390           for (var i4 = 0; i4 < points2.length - 1; i4++) {
49391             var a2 = points2[i4];
49392             var b2 = points2[i4 + 1];
49393             var current = geoVecLength(a2, b2);
49394             var portion;
49395             if (!start3 && sofar + current >= from) {
49396               portion = (from - sofar) / current;
49397               start3 = [
49398                 a2[0] + portion * (b2[0] - a2[0]),
49399                 a2[1] + portion * (b2[1] - a2[1])
49400               ];
49401               i0 = i4 + 1;
49402             }
49403             if (!end && sofar + current >= to) {
49404               portion = (to - sofar) / current;
49405               end = [
49406                 a2[0] + portion * (b2[0] - a2[0]),
49407                 a2[1] + portion * (b2[1] - a2[1])
49408               ];
49409               i1 = i4 + 1;
49410             }
49411             sofar += current;
49412           }
49413           var result = points2.slice(i0, i1);
49414           result.unshift(start3);
49415           result.push(end);
49416           return result;
49417         }
49418       }
49419       function getAreaLabel(entity2, width2, height) {
49420         var centroid = path.centroid(entity2.asGeoJSON(graph));
49421         var extent = entity2.extent(graph);
49422         var areaWidth = projection2(extent[1])[0] - projection2(extent[0])[0];
49423         if (isNaN(centroid[0]) || areaWidth < 20)
49424           return;
49425         var preset2 = _mainPresetIndex.match(entity2, context.graph());
49426         var picon = preset2 && preset2.icon;
49427         var iconSize = 17;
49428         var padding = 2;
49429         var p2 = {};
49430         if (picon) {
49431           if (addIcon()) {
49432             addLabel(iconSize + padding);
49433             return p2;
49434           }
49435         } else {
49436           if (addLabel(0)) {
49437             return p2;
49438           }
49439         }
49440         function addIcon() {
49441           var iconX = centroid[0] - iconSize / 2;
49442           var iconY = centroid[1] - iconSize / 2;
49443           var bbox3 = {
49444             minX: iconX,
49445             minY: iconY,
49446             maxX: iconX + iconSize,
49447             maxY: iconY + iconSize
49448           };
49449           if (tryInsert([bbox3], entity2.id + "I", true)) {
49450             p2.transform = "translate(" + iconX + "," + iconY + ")";
49451             return true;
49452           }
49453           return false;
49454         }
49455         function addLabel(yOffset) {
49456           if (width2 && areaWidth >= width2 + 20) {
49457             var labelX = centroid[0];
49458             var labelY = centroid[1] + yOffset;
49459             var bbox3 = {
49460               minX: labelX - width2 / 2 - padding,
49461               minY: labelY - height / 2 - padding,
49462               maxX: labelX + width2 / 2 + padding,
49463               maxY: labelY + height / 2 + padding
49464             };
49465             if (tryInsert([bbox3], entity2.id, true)) {
49466               p2.x = labelX;
49467               p2.y = labelY;
49468               p2.textAnchor = "middle";
49469               p2.height = height;
49470               return true;
49471             }
49472           }
49473           return false;
49474         }
49475       }
49476       function doInsert(bbox3, id2) {
49477         bbox3.id = id2;
49478         var oldbox = _entitybboxes[id2];
49479         if (oldbox) {
49480           _rdrawn.remove(oldbox);
49481         }
49482         _entitybboxes[id2] = bbox3;
49483         _rdrawn.insert(bbox3);
49484       }
49485       function tryInsert(bboxes, id2, saveSkipped) {
49486         var skipped = false;
49487         for (var i3 = 0; i3 < bboxes.length; i3++) {
49488           var bbox3 = bboxes[i3];
49489           bbox3.id = id2;
49490           if (bbox3.minX < 0 || bbox3.minY < 0 || bbox3.maxX > dimensions[0] || bbox3.maxY > dimensions[1]) {
49491             skipped = true;
49492             break;
49493           }
49494           if (_rdrawn.collides(bbox3)) {
49495             skipped = true;
49496             break;
49497           }
49498         }
49499         _entitybboxes[id2] = bboxes;
49500         if (skipped) {
49501           if (saveSkipped) {
49502             _rskipped.load(bboxes);
49503           }
49504         } else {
49505           _rdrawn.load(bboxes);
49506         }
49507         return !skipped;
49508       }
49509       var layer = selection2.selectAll(".layer-osm.labels");
49510       layer.selectAll(".labels-group").data(["halo", "label", "debug"]).enter().append("g").attr("class", function(d) {
49511         return "labels-group " + d;
49512       });
49513       var halo = layer.selectAll(".labels-group.halo");
49514       var label = layer.selectAll(".labels-group.label");
49515       var debug2 = layer.selectAll(".labels-group.debug");
49516       drawPointLabels(label, labelled.point, filter2, "pointlabel", positions.point);
49517       drawPointLabels(halo, labelled.point, filter2, "pointlabel-halo", positions.point);
49518       drawLinePaths(layer, labelled.line, filter2, "", positions.line);
49519       drawLineLabels(label, labelled.line, filter2, "linelabel", positions.line);
49520       drawLineLabels(halo, labelled.line, filter2, "linelabel-halo", positions.line);
49521       drawAreaLabels(label, labelled.area, filter2, "arealabel", positions.area);
49522       drawAreaLabels(halo, labelled.area, filter2, "arealabel-halo", positions.area);
49523       drawAreaIcons(label, labelled.area, filter2, "areaicon", positions.area);
49524       drawAreaIcons(halo, labelled.area, filter2, "areaicon-halo", positions.area);
49525       drawCollisionBoxes(debug2, _rskipped, "debug-skipped");
49526       drawCollisionBoxes(debug2, _rdrawn, "debug-drawn");
49527       layer.call(filterLabels);
49528     }
49529     function filterLabels(selection2) {
49530       var drawLayer = selection2.selectAll(".layer-osm.labels");
49531       var layers = drawLayer.selectAll(".labels-group.halo, .labels-group.label");
49532       layers.selectAll(".nolabel").classed("nolabel", false);
49533       var mouse = context.map().mouse();
49534       var graph = context.graph();
49535       var selectedIDs = context.selectedIDs();
49536       var ids = [];
49537       var pad2, bbox2;
49538       if (mouse) {
49539         pad2 = 20;
49540         bbox2 = { minX: mouse[0] - pad2, minY: mouse[1] - pad2, maxX: mouse[0] + pad2, maxY: mouse[1] + pad2 };
49541         var nearMouse = _rdrawn.search(bbox2).map(function(entity2) {
49542           return entity2.id;
49543         });
49544         ids.push.apply(ids, nearMouse);
49545       }
49546       for (var i2 = 0; i2 < selectedIDs.length; i2++) {
49547         var entity = graph.hasEntity(selectedIDs[i2]);
49548         if (entity && entity.type === "node") {
49549           ids.push(selectedIDs[i2]);
49550         }
49551       }
49552       layers.selectAll(utilEntitySelector(ids)).classed("nolabel", true);
49553       var debug2 = selection2.selectAll(".labels-group.debug");
49554       var gj = [];
49555       if (context.getDebug("collision")) {
49556         gj = bbox2 ? [{
49557           type: "Polygon",
49558           coordinates: [[
49559             [bbox2.minX, bbox2.minY],
49560             [bbox2.maxX, bbox2.minY],
49561             [bbox2.maxX, bbox2.maxY],
49562             [bbox2.minX, bbox2.maxY],
49563             [bbox2.minX, bbox2.minY]
49564           ]]
49565         }] : [];
49566       }
49567       var box = debug2.selectAll(".debug-mouse").data(gj);
49568       box.exit().remove();
49569       box.enter().append("path").attr("class", "debug debug-mouse yellow").merge(box).attr("d", path_default());
49570     }
49571     var throttleFilterLabels = throttle_default(filterLabels, 100);
49572     drawLabels.observe = function(selection2) {
49573       var listener = function() {
49574         throttleFilterLabels(selection2);
49575       };
49576       selection2.on("mousemove.hidelabels", listener);
49577       context.on("enter.hidelabels", listener);
49578     };
49579     drawLabels.off = function(selection2) {
49580       throttleFilterLabels.cancel();
49581       selection2.on("mousemove.hidelabels", null);
49582       context.on("enter.hidelabels", null);
49583     };
49584     return drawLabels;
49585   }
49586
49587   // modules/svg/improveOSM.js
49588   var _layerEnabled2 = false;
49589   var _qaService2;
49590   function svgImproveOSM(projection2, context, dispatch10) {
49591     const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
49592     const minZoom3 = 12;
49593     let touchLayer = select_default2(null);
49594     let drawLayer = select_default2(null);
49595     let layerVisible = false;
49596     function markerPath(selection2, klass) {
49597       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");
49598     }
49599     function getService() {
49600       if (services.improveOSM && !_qaService2) {
49601         _qaService2 = services.improveOSM;
49602         _qaService2.on("loaded", throttledRedraw);
49603       } else if (!services.improveOSM && _qaService2) {
49604         _qaService2 = null;
49605       }
49606       return _qaService2;
49607     }
49608     function editOn() {
49609       if (!layerVisible) {
49610         layerVisible = true;
49611         drawLayer.style("display", "block");
49612       }
49613     }
49614     function editOff() {
49615       if (layerVisible) {
49616         layerVisible = false;
49617         drawLayer.style("display", "none");
49618         drawLayer.selectAll(".qaItem.improveOSM").remove();
49619         touchLayer.selectAll(".qaItem.improveOSM").remove();
49620       }
49621     }
49622     function layerOn() {
49623       editOn();
49624       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
49625     }
49626     function layerOff() {
49627       throttledRedraw.cancel();
49628       drawLayer.interrupt();
49629       touchLayer.selectAll(".qaItem.improveOSM").remove();
49630       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
49631         editOff();
49632         dispatch10.call("change");
49633       });
49634     }
49635     function updateMarkers() {
49636       if (!layerVisible || !_layerEnabled2)
49637         return;
49638       const service = getService();
49639       const selectedID = context.selectedErrorID();
49640       const data = service ? service.getItems(projection2) : [];
49641       const getTransform = svgPointTransform(projection2);
49642       const markers = drawLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id);
49643       markers.exit().remove();
49644       const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
49645       markersEnter.append("polygon").call(markerPath, "shadow");
49646       markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke");
49647       markersEnter.append("polygon").attr("fill", "currentColor").call(markerPath, "qaItem-fill");
49648       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 : "");
49649       markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
49650       if (touchLayer.empty())
49651         return;
49652       const fillClass = context.getDebug("target") ? "pink " : "nocolor ";
49653       const targets = touchLayer.selectAll(".qaItem.improveOSM").data(data, (d) => d.id);
49654       targets.exit().remove();
49655       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);
49656       function sortY(a, b) {
49657         return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
49658       }
49659     }
49660     function drawImproveOSM(selection2) {
49661       const service = getService();
49662       const surface = context.surface();
49663       if (surface && !surface.empty()) {
49664         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
49665       }
49666       drawLayer = selection2.selectAll(".layer-improveOSM").data(service ? [0] : []);
49667       drawLayer.exit().remove();
49668       drawLayer = drawLayer.enter().append("g").attr("class", "layer-improveOSM").style("display", _layerEnabled2 ? "block" : "none").merge(drawLayer);
49669       if (_layerEnabled2) {
49670         if (service && ~~context.map().zoom() >= minZoom3) {
49671           editOn();
49672           service.loadIssues(projection2);
49673           updateMarkers();
49674         } else {
49675           editOff();
49676         }
49677       }
49678     }
49679     drawImproveOSM.enabled = function(val) {
49680       if (!arguments.length)
49681         return _layerEnabled2;
49682       _layerEnabled2 = val;
49683       if (_layerEnabled2) {
49684         layerOn();
49685       } else {
49686         layerOff();
49687         if (context.selectedErrorID()) {
49688           context.enter(modeBrowse(context));
49689         }
49690       }
49691       dispatch10.call("change");
49692       return this;
49693     };
49694     drawImproveOSM.supported = () => !!getService();
49695     return drawImproveOSM;
49696   }
49697
49698   // modules/svg/osmose.js
49699   var _layerEnabled3 = false;
49700   var _qaService3;
49701   function svgOsmose(projection2, context, dispatch10) {
49702     const throttledRedraw = throttle_default(() => dispatch10.call("change"), 1e3);
49703     const minZoom3 = 12;
49704     let touchLayer = select_default2(null);
49705     let drawLayer = select_default2(null);
49706     let layerVisible = false;
49707     function markerPath(selection2, klass) {
49708       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");
49709     }
49710     function getService() {
49711       if (services.osmose && !_qaService3) {
49712         _qaService3 = services.osmose;
49713         _qaService3.on("loaded", throttledRedraw);
49714       } else if (!services.osmose && _qaService3) {
49715         _qaService3 = null;
49716       }
49717       return _qaService3;
49718     }
49719     function editOn() {
49720       if (!layerVisible) {
49721         layerVisible = true;
49722         drawLayer.style("display", "block");
49723       }
49724     }
49725     function editOff() {
49726       if (layerVisible) {
49727         layerVisible = false;
49728         drawLayer.style("display", "none");
49729         drawLayer.selectAll(".qaItem.osmose").remove();
49730         touchLayer.selectAll(".qaItem.osmose").remove();
49731       }
49732     }
49733     function layerOn() {
49734       editOn();
49735       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", () => dispatch10.call("change"));
49736     }
49737     function layerOff() {
49738       throttledRedraw.cancel();
49739       drawLayer.interrupt();
49740       touchLayer.selectAll(".qaItem.osmose").remove();
49741       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", () => {
49742         editOff();
49743         dispatch10.call("change");
49744       });
49745     }
49746     function updateMarkers() {
49747       if (!layerVisible || !_layerEnabled3)
49748         return;
49749       const service = getService();
49750       const selectedID = context.selectedErrorID();
49751       const data = service ? service.getItems(projection2) : [];
49752       const getTransform = svgPointTransform(projection2);
49753       const markers = drawLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id);
49754       markers.exit().remove();
49755       const markersEnter = markers.enter().append("g").attr("class", (d) => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`);
49756       markersEnter.append("polygon").call(markerPath, "shadow");
49757       markersEnter.append("ellipse").attr("cx", 0).attr("cy", 0).attr("rx", 4.5).attr("ry", 2).attr("class", "stroke");
49758       markersEnter.append("polygon").attr("fill", (d) => service.getColor(d.item)).call(markerPath, "qaItem-fill");
49759       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 : "");
49760       markers.merge(markersEnter).sort(sortY).classed("selected", (d) => d.id === selectedID).attr("transform", getTransform);
49761       if (touchLayer.empty())
49762         return;
49763       const fillClass = context.getDebug("target") ? "pink" : "nocolor";
49764       const targets = touchLayer.selectAll(".qaItem.osmose").data(data, (d) => d.id);
49765       targets.exit().remove();
49766       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);
49767       function sortY(a, b) {
49768         return a.id === selectedID ? 1 : b.id === selectedID ? -1 : b.loc[1] - a.loc[1];
49769       }
49770     }
49771     function drawOsmose(selection2) {
49772       const service = getService();
49773       const surface = context.surface();
49774       if (surface && !surface.empty()) {
49775         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
49776       }
49777       drawLayer = selection2.selectAll(".layer-osmose").data(service ? [0] : []);
49778       drawLayer.exit().remove();
49779       drawLayer = drawLayer.enter().append("g").attr("class", "layer-osmose").style("display", _layerEnabled3 ? "block" : "none").merge(drawLayer);
49780       if (_layerEnabled3) {
49781         if (service && ~~context.map().zoom() >= minZoom3) {
49782           editOn();
49783           service.loadIssues(projection2);
49784           updateMarkers();
49785         } else {
49786           editOff();
49787         }
49788       }
49789     }
49790     drawOsmose.enabled = function(val) {
49791       if (!arguments.length)
49792         return _layerEnabled3;
49793       _layerEnabled3 = val;
49794       if (_layerEnabled3) {
49795         getService().loadStrings().then(layerOn).catch((err) => {
49796           console.log(err);
49797         });
49798       } else {
49799         layerOff();
49800         if (context.selectedErrorID()) {
49801           context.enter(modeBrowse(context));
49802         }
49803       }
49804       dispatch10.call("change");
49805       return this;
49806     };
49807     drawOsmose.supported = () => !!getService();
49808     return drawOsmose;
49809   }
49810
49811   // modules/svg/streetside.js
49812   function svgStreetside(projection2, context, dispatch10) {
49813     var throttledRedraw = throttle_default(function() {
49814       dispatch10.call("change");
49815     }, 1e3);
49816     var minZoom3 = 14;
49817     var minMarkerZoom = 16;
49818     var minViewfieldZoom = 18;
49819     var layer = select_default2(null);
49820     var _viewerYaw = 0;
49821     var _selectedSequence = null;
49822     var _streetside;
49823     function init2() {
49824       if (svgStreetside.initialized)
49825         return;
49826       svgStreetside.enabled = false;
49827       svgStreetside.initialized = true;
49828     }
49829     function getService() {
49830       if (services.streetside && !_streetside) {
49831         _streetside = services.streetside;
49832         _streetside.event.on("viewerChanged.svgStreetside", viewerChanged).on("loadedImages.svgStreetside", throttledRedraw);
49833       } else if (!services.streetside && _streetside) {
49834         _streetside = null;
49835       }
49836       return _streetside;
49837     }
49838     function showLayer() {
49839       var service = getService();
49840       if (!service)
49841         return;
49842       editOn();
49843       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
49844         dispatch10.call("change");
49845       });
49846     }
49847     function hideLayer() {
49848       throttledRedraw.cancel();
49849       layer.transition().duration(250).style("opacity", 0).on("end", editOff);
49850     }
49851     function editOn() {
49852       layer.style("display", "block");
49853     }
49854     function editOff() {
49855       layer.selectAll(".viewfield-group").remove();
49856       layer.style("display", "none");
49857     }
49858     function click(d3_event, d) {
49859       var service = getService();
49860       if (!service)
49861         return;
49862       if (d.sequenceKey !== _selectedSequence) {
49863         _viewerYaw = 0;
49864       }
49865       _selectedSequence = d.sequenceKey;
49866       service.ensureViewerLoaded(context).then(function() {
49867         service.selectImage(context, d.key).yaw(_viewerYaw).showViewer(context);
49868       });
49869       context.map().centerEase(d.loc);
49870     }
49871     function mouseover(d3_event, d) {
49872       var service = getService();
49873       if (service)
49874         service.setStyles(context, d);
49875     }
49876     function mouseout() {
49877       var service = getService();
49878       if (service)
49879         service.setStyles(context, null);
49880     }
49881     function transform2(d) {
49882       var t = svgPointTransform(projection2)(d);
49883       var rot = d.ca + _viewerYaw;
49884       if (rot) {
49885         t += " rotate(" + Math.floor(rot) + ",0,0)";
49886       }
49887       return t;
49888     }
49889     function viewerChanged() {
49890       var service = getService();
49891       if (!service)
49892         return;
49893       var viewer = service.viewer();
49894       if (!viewer)
49895         return;
49896       _viewerYaw = viewer.getYaw();
49897       if (context.map().isTransformed())
49898         return;
49899       layer.selectAll(".viewfield-group.currentView").attr("transform", transform2);
49900     }
49901     function filterBubbles(bubbles) {
49902       var fromDate = context.photos().fromDate();
49903       var toDate = context.photos().toDate();
49904       var usernames = context.photos().usernames();
49905       if (fromDate) {
49906         var fromTimestamp = new Date(fromDate).getTime();
49907         bubbles = bubbles.filter(function(bubble) {
49908           return new Date(bubble.captured_at).getTime() >= fromTimestamp;
49909         });
49910       }
49911       if (toDate) {
49912         var toTimestamp = new Date(toDate).getTime();
49913         bubbles = bubbles.filter(function(bubble) {
49914           return new Date(bubble.captured_at).getTime() <= toTimestamp;
49915         });
49916       }
49917       if (usernames) {
49918         bubbles = bubbles.filter(function(bubble) {
49919           return usernames.indexOf(bubble.captured_by) !== -1;
49920         });
49921       }
49922       return bubbles;
49923     }
49924     function filterSequences(sequences) {
49925       var fromDate = context.photos().fromDate();
49926       var toDate = context.photos().toDate();
49927       var usernames = context.photos().usernames();
49928       if (fromDate) {
49929         var fromTimestamp = new Date(fromDate).getTime();
49930         sequences = sequences.filter(function(sequences2) {
49931           return new Date(sequences2.properties.captured_at).getTime() >= fromTimestamp;
49932         });
49933       }
49934       if (toDate) {
49935         var toTimestamp = new Date(toDate).getTime();
49936         sequences = sequences.filter(function(sequences2) {
49937           return new Date(sequences2.properties.captured_at).getTime() <= toTimestamp;
49938         });
49939       }
49940       if (usernames) {
49941         sequences = sequences.filter(function(sequences2) {
49942           return usernames.indexOf(sequences2.properties.captured_by) !== -1;
49943         });
49944       }
49945       return sequences;
49946     }
49947     function update() {
49948       var viewer = context.container().select(".photoviewer");
49949       var selected = viewer.empty() ? void 0 : viewer.datum();
49950       var z = ~~context.map().zoom();
49951       var showMarkers = z >= minMarkerZoom;
49952       var showViewfields = z >= minViewfieldZoom;
49953       var service = getService();
49954       var sequences = [];
49955       var bubbles = [];
49956       if (context.photos().showsPanoramic()) {
49957         sequences = service ? service.sequences(projection2) : [];
49958         bubbles = service && showMarkers ? service.bubbles(projection2) : [];
49959         sequences = filterSequences(sequences);
49960         bubbles = filterBubbles(bubbles);
49961       }
49962       var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
49963         return d.properties.key;
49964       });
49965       traces.exit().remove();
49966       traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
49967       var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(bubbles, function(d) {
49968         return d.key + (d.sequenceKey ? "v1" : "v0");
49969       });
49970       groups.exit().remove();
49971       var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
49972       groupsEnter.append("g").attr("class", "viewfield-scale");
49973       var markers = groups.merge(groupsEnter).sort(function(a, b) {
49974         return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
49975       }).attr("transform", transform2).select(".viewfield-scale");
49976       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
49977       var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
49978       viewfields.exit().remove();
49979       viewfields.enter().insert("path", "circle").attr("class", "viewfield").attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath);
49980       function viewfieldPath() {
49981         var d = this.parentNode.__data__;
49982         if (d.pano) {
49983           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
49984         } else {
49985           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
49986         }
49987       }
49988     }
49989     function drawImages(selection2) {
49990       var enabled = svgStreetside.enabled;
49991       var service = getService();
49992       layer = selection2.selectAll(".layer-streetside-images").data(service ? [0] : []);
49993       layer.exit().remove();
49994       var layerEnter = layer.enter().append("g").attr("class", "layer-streetside-images").style("display", enabled ? "block" : "none");
49995       layerEnter.append("g").attr("class", "sequences");
49996       layerEnter.append("g").attr("class", "markers");
49997       layer = layerEnter.merge(layer);
49998       if (enabled) {
49999         if (service && ~~context.map().zoom() >= minZoom3) {
50000           editOn();
50001           update();
50002           service.loadBubbles(projection2);
50003         } else {
50004           editOff();
50005         }
50006       }
50007     }
50008     drawImages.enabled = function(_) {
50009       if (!arguments.length)
50010         return svgStreetside.enabled;
50011       svgStreetside.enabled = _;
50012       if (svgStreetside.enabled) {
50013         showLayer();
50014         context.photos().on("change.streetside", update);
50015       } else {
50016         hideLayer();
50017         context.photos().on("change.streetside", null);
50018       }
50019       dispatch10.call("change");
50020       return this;
50021     };
50022     drawImages.supported = function() {
50023       return !!getService();
50024     };
50025     init2();
50026     return drawImages;
50027   }
50028
50029   // modules/svg/mapillary_images.js
50030   function svgMapillaryImages(projection2, context, dispatch10) {
50031     const throttledRedraw = throttle_default(function() {
50032       dispatch10.call("change");
50033     }, 1e3);
50034     const minZoom3 = 12;
50035     const minMarkerZoom = 16;
50036     const minViewfieldZoom = 18;
50037     let layer = select_default2(null);
50038     let _mapillary;
50039     function init2() {
50040       if (svgMapillaryImages.initialized)
50041         return;
50042       svgMapillaryImages.enabled = false;
50043       svgMapillaryImages.initialized = true;
50044     }
50045     function getService() {
50046       if (services.mapillary && !_mapillary) {
50047         _mapillary = services.mapillary;
50048         _mapillary.event.on("loadedImages", throttledRedraw);
50049       } else if (!services.mapillary && _mapillary) {
50050         _mapillary = null;
50051       }
50052       return _mapillary;
50053     }
50054     function showLayer() {
50055       const service = getService();
50056       if (!service)
50057         return;
50058       editOn();
50059       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
50060         dispatch10.call("change");
50061       });
50062     }
50063     function hideLayer() {
50064       throttledRedraw.cancel();
50065       layer.transition().duration(250).style("opacity", 0).on("end", editOff);
50066     }
50067     function editOn() {
50068       layer.style("display", "block");
50069     }
50070     function editOff() {
50071       layer.selectAll(".viewfield-group").remove();
50072       layer.style("display", "none");
50073     }
50074     function click(d3_event, image) {
50075       const service = getService();
50076       if (!service)
50077         return;
50078       service.ensureViewerLoaded(context).then(function() {
50079         service.selectImage(context, image.id).showViewer(context);
50080       });
50081       context.map().centerEase(image.loc);
50082     }
50083     function mouseover(d3_event, image) {
50084       const service = getService();
50085       if (service)
50086         service.setStyles(context, image);
50087     }
50088     function mouseout() {
50089       const service = getService();
50090       if (service)
50091         service.setStyles(context, null);
50092     }
50093     function transform2(d) {
50094       let t = svgPointTransform(projection2)(d);
50095       if (d.ca) {
50096         t += " rotate(" + Math.floor(d.ca) + ",0,0)";
50097       }
50098       return t;
50099     }
50100     function filterImages(images) {
50101       const showsPano = context.photos().showsPanoramic();
50102       const showsFlat = context.photos().showsFlat();
50103       const fromDate = context.photos().fromDate();
50104       const toDate = context.photos().toDate();
50105       if (!showsPano || !showsFlat) {
50106         images = images.filter(function(image) {
50107           if (image.is_pano)
50108             return showsPano;
50109           return showsFlat;
50110         });
50111       }
50112       if (fromDate) {
50113         images = images.filter(function(image) {
50114           return new Date(image.captured_at).getTime() >= new Date(fromDate).getTime();
50115         });
50116       }
50117       if (toDate) {
50118         images = images.filter(function(image) {
50119           return new Date(image.captured_at).getTime() <= new Date(toDate).getTime();
50120         });
50121       }
50122       return images;
50123     }
50124     function filterSequences(sequences) {
50125       const showsPano = context.photos().showsPanoramic();
50126       const showsFlat = context.photos().showsFlat();
50127       const fromDate = context.photos().fromDate();
50128       const toDate = context.photos().toDate();
50129       if (!showsPano || !showsFlat) {
50130         sequences = sequences.filter(function(sequence) {
50131           if (sequence.properties.hasOwnProperty("is_pano")) {
50132             if (sequence.properties.is_pano)
50133               return showsPano;
50134             return showsFlat;
50135           }
50136           return false;
50137         });
50138       }
50139       if (fromDate) {
50140         sequences = sequences.filter(function(sequence) {
50141           return new Date(sequence.properties.captured_at).getTime() >= new Date(fromDate).getTime().toString();
50142         });
50143       }
50144       if (toDate) {
50145         sequences = sequences.filter(function(sequence) {
50146           return new Date(sequence.properties.captured_at).getTime() <= new Date(toDate).getTime().toString();
50147         });
50148       }
50149       return sequences;
50150     }
50151     function update() {
50152       const z = ~~context.map().zoom();
50153       const showMarkers = z >= minMarkerZoom;
50154       const showViewfields = z >= minViewfieldZoom;
50155       const service = getService();
50156       let sequences = service ? service.sequences(projection2) : [];
50157       let images = service && showMarkers ? service.images(projection2) : [];
50158       images = filterImages(images);
50159       sequences = filterSequences(sequences, service);
50160       service.filterViewer(context);
50161       let traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
50162         return d.properties.id;
50163       });
50164       traces.exit().remove();
50165       traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
50166       const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) {
50167         return d.id;
50168       });
50169       groups.exit().remove();
50170       const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
50171       groupsEnter.append("g").attr("class", "viewfield-scale");
50172       const markers = groups.merge(groupsEnter).sort(function(a, b) {
50173         return b.loc[1] - a.loc[1];
50174       }).attr("transform", transform2).select(".viewfield-scale");
50175       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
50176       const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
50177       viewfields.exit().remove();
50178       viewfields.enter().insert("path", "circle").attr("class", "viewfield").classed("pano", function() {
50179         return this.parentNode.__data__.is_pano;
50180       }).attr("transform", "scale(1.5,1.5),translate(-8, -13)").attr("d", viewfieldPath);
50181       function viewfieldPath() {
50182         if (this.parentNode.__data__.is_pano) {
50183           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
50184         } else {
50185           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
50186         }
50187       }
50188     }
50189     function drawImages(selection2) {
50190       const enabled = svgMapillaryImages.enabled;
50191       const service = getService();
50192       layer = selection2.selectAll(".layer-mapillary").data(service ? [0] : []);
50193       layer.exit().remove();
50194       const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary").style("display", enabled ? "block" : "none");
50195       layerEnter.append("g").attr("class", "sequences");
50196       layerEnter.append("g").attr("class", "markers");
50197       layer = layerEnter.merge(layer);
50198       if (enabled) {
50199         if (service && ~~context.map().zoom() >= minZoom3) {
50200           editOn();
50201           update();
50202           service.loadImages(projection2);
50203         } else {
50204           editOff();
50205         }
50206       }
50207     }
50208     drawImages.enabled = function(_) {
50209       if (!arguments.length)
50210         return svgMapillaryImages.enabled;
50211       svgMapillaryImages.enabled = _;
50212       if (svgMapillaryImages.enabled) {
50213         showLayer();
50214         context.photos().on("change.mapillary_images", update);
50215       } else {
50216         hideLayer();
50217         context.photos().on("change.mapillary_images", null);
50218       }
50219       dispatch10.call("change");
50220       return this;
50221     };
50222     drawImages.supported = function() {
50223       return !!getService();
50224     };
50225     init2();
50226     return drawImages;
50227   }
50228
50229   // modules/svg/mapillary_position.js
50230   function svgMapillaryPosition(projection2, context) {
50231     const throttledRedraw = throttle_default(function() {
50232       update();
50233     }, 1e3);
50234     const minZoom3 = 12;
50235     const minViewfieldZoom = 18;
50236     let layer = select_default2(null);
50237     let _mapillary;
50238     let viewerCompassAngle;
50239     function init2() {
50240       if (svgMapillaryPosition.initialized)
50241         return;
50242       svgMapillaryPosition.initialized = true;
50243     }
50244     function getService() {
50245       if (services.mapillary && !_mapillary) {
50246         _mapillary = services.mapillary;
50247         _mapillary.event.on("imageChanged", throttledRedraw);
50248         _mapillary.event.on("bearingChanged", function(e) {
50249           viewerCompassAngle = e.bearing;
50250           if (context.map().isTransformed())
50251             return;
50252           layer.selectAll(".viewfield-group.currentView").filter(function(d) {
50253             return d.is_pano;
50254           }).attr("transform", transform2);
50255         });
50256       } else if (!services.mapillary && _mapillary) {
50257         _mapillary = null;
50258       }
50259       return _mapillary;
50260     }
50261     function editOn() {
50262       layer.style("display", "block");
50263     }
50264     function editOff() {
50265       layer.selectAll(".viewfield-group").remove();
50266       layer.style("display", "none");
50267     }
50268     function transform2(d) {
50269       let t = svgPointTransform(projection2)(d);
50270       if (d.is_pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
50271         t += " rotate(" + Math.floor(viewerCompassAngle) + ",0,0)";
50272       } else if (d.ca) {
50273         t += " rotate(" + Math.floor(d.ca) + ",0,0)";
50274       }
50275       return t;
50276     }
50277     function update() {
50278       const z = ~~context.map().zoom();
50279       const showViewfields = z >= minViewfieldZoom;
50280       const service = getService();
50281       const image = service && service.getActiveImage();
50282       const groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(image ? [image] : [], function(d) {
50283         return d.id;
50284       });
50285       groups.exit().remove();
50286       const groupsEnter = groups.enter().append("g").attr("class", "viewfield-group currentView highlighted");
50287       groupsEnter.append("g").attr("class", "viewfield-scale");
50288       const markers = groups.merge(groupsEnter).attr("transform", transform2).select(".viewfield-scale");
50289       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
50290       const viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
50291       viewfields.exit().remove();
50292       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");
50293     }
50294     function drawImages(selection2) {
50295       const service = getService();
50296       layer = selection2.selectAll(".layer-mapillary-position").data(service ? [0] : []);
50297       layer.exit().remove();
50298       const layerEnter = layer.enter().append("g").attr("class", "layer-mapillary-position");
50299       layerEnter.append("g").attr("class", "markers");
50300       layer = layerEnter.merge(layer);
50301       if (service && ~~context.map().zoom() >= minZoom3) {
50302         editOn();
50303         update();
50304       } else {
50305         editOff();
50306       }
50307     }
50308     drawImages.enabled = function() {
50309       update();
50310       return this;
50311     };
50312     drawImages.supported = function() {
50313       return !!getService();
50314     };
50315     init2();
50316     return drawImages;
50317   }
50318
50319   // modules/svg/mapillary_signs.js
50320   function svgMapillarySigns(projection2, context, dispatch10) {
50321     const throttledRedraw = throttle_default(function() {
50322       dispatch10.call("change");
50323     }, 1e3);
50324     const minZoom3 = 12;
50325     let layer = select_default2(null);
50326     let _mapillary;
50327     function init2() {
50328       if (svgMapillarySigns.initialized)
50329         return;
50330       svgMapillarySigns.enabled = false;
50331       svgMapillarySigns.initialized = true;
50332     }
50333     function getService() {
50334       if (services.mapillary && !_mapillary) {
50335         _mapillary = services.mapillary;
50336         _mapillary.event.on("loadedSigns", throttledRedraw);
50337       } else if (!services.mapillary && _mapillary) {
50338         _mapillary = null;
50339       }
50340       return _mapillary;
50341     }
50342     function showLayer() {
50343       const service = getService();
50344       if (!service)
50345         return;
50346       service.loadSignResources(context);
50347       editOn();
50348     }
50349     function hideLayer() {
50350       throttledRedraw.cancel();
50351       editOff();
50352     }
50353     function editOn() {
50354       layer.style("display", "block");
50355     }
50356     function editOff() {
50357       layer.selectAll(".icon-sign").remove();
50358       layer.style("display", "none");
50359     }
50360     function click(d3_event, d) {
50361       const service = getService();
50362       if (!service)
50363         return;
50364       context.map().centerEase(d.loc);
50365       const selectedImageId = service.getActiveImage() && service.getActiveImage().id;
50366       service.getDetections(d.id).then((detections) => {
50367         if (detections.length) {
50368           const imageId = detections[0].image.id;
50369           if (imageId === selectedImageId) {
50370             service.highlightDetection(detections[0]).selectImage(context, imageId);
50371           } else {
50372             service.ensureViewerLoaded(context).then(function() {
50373               service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
50374             });
50375           }
50376         }
50377       });
50378     }
50379     function filterData(detectedFeatures) {
50380       var fromDate = context.photos().fromDate();
50381       var toDate = context.photos().toDate();
50382       if (fromDate) {
50383         var fromTimestamp = new Date(fromDate).getTime();
50384         detectedFeatures = detectedFeatures.filter(function(feature3) {
50385           return new Date(feature3.last_seen_at).getTime() >= fromTimestamp;
50386         });
50387       }
50388       if (toDate) {
50389         var toTimestamp = new Date(toDate).getTime();
50390         detectedFeatures = detectedFeatures.filter(function(feature3) {
50391           return new Date(feature3.first_seen_at).getTime() <= toTimestamp;
50392         });
50393       }
50394       return detectedFeatures;
50395     }
50396     function update() {
50397       const service = getService();
50398       let data = service ? service.signs(projection2) : [];
50399       data = filterData(data);
50400       const transform2 = svgPointTransform(projection2);
50401       const signs = layer.selectAll(".icon-sign").data(data, function(d) {
50402         return d.id;
50403       });
50404       signs.exit().remove();
50405       const enter = signs.enter().append("g").attr("class", "icon-sign icon-detected").on("click", click);
50406       enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) {
50407         return "#" + d.value;
50408       });
50409       enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px");
50410       signs.merge(enter).attr("transform", transform2);
50411     }
50412     function drawSigns(selection2) {
50413       const enabled = svgMapillarySigns.enabled;
50414       const service = getService();
50415       layer = selection2.selectAll(".layer-mapillary-signs").data(service ? [0] : []);
50416       layer.exit().remove();
50417       layer = layer.enter().append("g").attr("class", "layer-mapillary-signs layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer);
50418       if (enabled) {
50419         if (service && ~~context.map().zoom() >= minZoom3) {
50420           editOn();
50421           update();
50422           service.loadSigns(projection2);
50423           service.showSignDetections(true);
50424         } else {
50425           editOff();
50426         }
50427       } else if (service) {
50428         service.showSignDetections(false);
50429       }
50430     }
50431     drawSigns.enabled = function(_) {
50432       if (!arguments.length)
50433         return svgMapillarySigns.enabled;
50434       svgMapillarySigns.enabled = _;
50435       if (svgMapillarySigns.enabled) {
50436         showLayer();
50437         context.photos().on("change.mapillary_signs", update);
50438       } else {
50439         hideLayer();
50440         context.photos().on("change.mapillary_signs", null);
50441       }
50442       dispatch10.call("change");
50443       return this;
50444     };
50445     drawSigns.supported = function() {
50446       return !!getService();
50447     };
50448     init2();
50449     return drawSigns;
50450   }
50451
50452   // modules/svg/mapillary_map_features.js
50453   function svgMapillaryMapFeatures(projection2, context, dispatch10) {
50454     const throttledRedraw = throttle_default(function() {
50455       dispatch10.call("change");
50456     }, 1e3);
50457     const minZoom3 = 12;
50458     let layer = select_default2(null);
50459     let _mapillary;
50460     function init2() {
50461       if (svgMapillaryMapFeatures.initialized)
50462         return;
50463       svgMapillaryMapFeatures.enabled = false;
50464       svgMapillaryMapFeatures.initialized = true;
50465     }
50466     function getService() {
50467       if (services.mapillary && !_mapillary) {
50468         _mapillary = services.mapillary;
50469         _mapillary.event.on("loadedMapFeatures", throttledRedraw);
50470       } else if (!services.mapillary && _mapillary) {
50471         _mapillary = null;
50472       }
50473       return _mapillary;
50474     }
50475     function showLayer() {
50476       const service = getService();
50477       if (!service)
50478         return;
50479       service.loadObjectResources(context);
50480       editOn();
50481     }
50482     function hideLayer() {
50483       throttledRedraw.cancel();
50484       editOff();
50485     }
50486     function editOn() {
50487       layer.style("display", "block");
50488     }
50489     function editOff() {
50490       layer.selectAll(".icon-map-feature").remove();
50491       layer.style("display", "none");
50492     }
50493     function click(d3_event, d) {
50494       const service = getService();
50495       if (!service)
50496         return;
50497       context.map().centerEase(d.loc);
50498       const selectedImageId = service.getActiveImage() && service.getActiveImage().id;
50499       service.getDetections(d.id).then((detections) => {
50500         if (detections.length) {
50501           const imageId = detections[0].image.id;
50502           if (imageId === selectedImageId) {
50503             service.highlightDetection(detections[0]).selectImage(context, imageId);
50504           } else {
50505             service.ensureViewerLoaded(context).then(function() {
50506               service.highlightDetection(detections[0]).selectImage(context, imageId).showViewer(context);
50507             });
50508           }
50509         }
50510       });
50511     }
50512     function filterData(detectedFeatures) {
50513       const fromDate = context.photos().fromDate();
50514       const toDate = context.photos().toDate();
50515       if (fromDate) {
50516         detectedFeatures = detectedFeatures.filter(function(feature3) {
50517           return new Date(feature3.last_seen_at).getTime() >= new Date(fromDate).getTime();
50518         });
50519       }
50520       if (toDate) {
50521         detectedFeatures = detectedFeatures.filter(function(feature3) {
50522           return new Date(feature3.first_seen_at).getTime() <= new Date(toDate).getTime();
50523         });
50524       }
50525       return detectedFeatures;
50526     }
50527     function update() {
50528       const service = getService();
50529       let data = service ? service.mapFeatures(projection2) : [];
50530       data = filterData(data);
50531       const transform2 = svgPointTransform(projection2);
50532       const mapFeatures = layer.selectAll(".icon-map-feature").data(data, function(d) {
50533         return d.id;
50534       });
50535       mapFeatures.exit().remove();
50536       const enter = mapFeatures.enter().append("g").attr("class", "icon-map-feature icon-detected").on("click", click);
50537       enter.append("title").text(function(d) {
50538         var id2 = d.value.replace(/--/g, ".").replace(/-/g, "_");
50539         return _t("mapillary_map_features." + id2);
50540       });
50541       enter.append("use").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px").attr("xlink:href", function(d) {
50542         if (d.value === "object--billboard") {
50543           return "#object--sign--advertisement";
50544         }
50545         return "#" + d.value;
50546       });
50547       enter.append("rect").attr("width", "24px").attr("height", "24px").attr("x", "-12px").attr("y", "-12px");
50548       mapFeatures.merge(enter).attr("transform", transform2);
50549     }
50550     function drawMapFeatures(selection2) {
50551       const enabled = svgMapillaryMapFeatures.enabled;
50552       const service = getService();
50553       layer = selection2.selectAll(".layer-mapillary-map-features").data(service ? [0] : []);
50554       layer.exit().remove();
50555       layer = layer.enter().append("g").attr("class", "layer-mapillary-map-features layer-mapillary-detections").style("display", enabled ? "block" : "none").merge(layer);
50556       if (enabled) {
50557         if (service && ~~context.map().zoom() >= minZoom3) {
50558           editOn();
50559           update();
50560           service.loadMapFeatures(projection2);
50561           service.showFeatureDetections(true);
50562         } else {
50563           editOff();
50564         }
50565       } else if (service) {
50566         service.showFeatureDetections(false);
50567       }
50568     }
50569     drawMapFeatures.enabled = function(_) {
50570       if (!arguments.length)
50571         return svgMapillaryMapFeatures.enabled;
50572       svgMapillaryMapFeatures.enabled = _;
50573       if (svgMapillaryMapFeatures.enabled) {
50574         showLayer();
50575         context.photos().on("change.mapillary_map_features", update);
50576       } else {
50577         hideLayer();
50578         context.photos().on("change.mapillary_map_features", null);
50579       }
50580       dispatch10.call("change");
50581       return this;
50582     };
50583     drawMapFeatures.supported = function() {
50584       return !!getService();
50585     };
50586     init2();
50587     return drawMapFeatures;
50588   }
50589
50590   // modules/svg/kartaview_images.js
50591   function svgKartaviewImages(projection2, context, dispatch10) {
50592     var throttledRedraw = throttle_default(function() {
50593       dispatch10.call("change");
50594     }, 1e3);
50595     var minZoom3 = 12;
50596     var minMarkerZoom = 16;
50597     var minViewfieldZoom = 18;
50598     var layer = select_default2(null);
50599     var _kartaview;
50600     function init2() {
50601       if (svgKartaviewImages.initialized)
50602         return;
50603       svgKartaviewImages.enabled = false;
50604       svgKartaviewImages.initialized = true;
50605     }
50606     function getService() {
50607       if (services.kartaview && !_kartaview) {
50608         _kartaview = services.kartaview;
50609         _kartaview.event.on("loadedImages", throttledRedraw);
50610       } else if (!services.kartaview && _kartaview) {
50611         _kartaview = null;
50612       }
50613       return _kartaview;
50614     }
50615     function showLayer() {
50616       var service = getService();
50617       if (!service)
50618         return;
50619       editOn();
50620       layer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end", function() {
50621         dispatch10.call("change");
50622       });
50623     }
50624     function hideLayer() {
50625       throttledRedraw.cancel();
50626       layer.transition().duration(250).style("opacity", 0).on("end", editOff);
50627     }
50628     function editOn() {
50629       layer.style("display", "block");
50630     }
50631     function editOff() {
50632       layer.selectAll(".viewfield-group").remove();
50633       layer.style("display", "none");
50634     }
50635     function click(d3_event, d) {
50636       var service = getService();
50637       if (!service)
50638         return;
50639       service.ensureViewerLoaded(context).then(function() {
50640         service.selectImage(context, d.key).showViewer(context);
50641       });
50642       context.map().centerEase(d.loc);
50643     }
50644     function mouseover(d3_event, d) {
50645       var service = getService();
50646       if (service)
50647         service.setStyles(context, d);
50648     }
50649     function mouseout() {
50650       var service = getService();
50651       if (service)
50652         service.setStyles(context, null);
50653     }
50654     function transform2(d) {
50655       var t = svgPointTransform(projection2)(d);
50656       if (d.ca) {
50657         t += " rotate(" + Math.floor(d.ca) + ",0,0)";
50658       }
50659       return t;
50660     }
50661     function filterImages(images) {
50662       var fromDate = context.photos().fromDate();
50663       var toDate = context.photos().toDate();
50664       var usernames = context.photos().usernames();
50665       if (fromDate) {
50666         var fromTimestamp = new Date(fromDate).getTime();
50667         images = images.filter(function(item) {
50668           return new Date(item.captured_at).getTime() >= fromTimestamp;
50669         });
50670       }
50671       if (toDate) {
50672         var toTimestamp = new Date(toDate).getTime();
50673         images = images.filter(function(item) {
50674           return new Date(item.captured_at).getTime() <= toTimestamp;
50675         });
50676       }
50677       if (usernames) {
50678         images = images.filter(function(item) {
50679           return usernames.indexOf(item.captured_by) !== -1;
50680         });
50681       }
50682       return images;
50683     }
50684     function filterSequences(sequences) {
50685       var fromDate = context.photos().fromDate();
50686       var toDate = context.photos().toDate();
50687       var usernames = context.photos().usernames();
50688       if (fromDate) {
50689         var fromTimestamp = new Date(fromDate).getTime();
50690         sequences = sequences.filter(function(image) {
50691           return new Date(image.properties.captured_at).getTime() >= fromTimestamp;
50692         });
50693       }
50694       if (toDate) {
50695         var toTimestamp = new Date(toDate).getTime();
50696         sequences = sequences.filter(function(image) {
50697           return new Date(image.properties.captured_at).getTime() <= toTimestamp;
50698         });
50699       }
50700       if (usernames) {
50701         sequences = sequences.filter(function(image) {
50702           return usernames.indexOf(image.properties.captured_by) !== -1;
50703         });
50704       }
50705       return sequences;
50706     }
50707     function update() {
50708       var viewer = context.container().select(".photoviewer");
50709       var selected = viewer.empty() ? void 0 : viewer.datum();
50710       var z = ~~context.map().zoom();
50711       var showMarkers = z >= minMarkerZoom;
50712       var showViewfields = z >= minViewfieldZoom;
50713       var service = getService();
50714       var sequences = [];
50715       var images = [];
50716       if (context.photos().showsFlat()) {
50717         sequences = service ? service.sequences(projection2) : [];
50718         images = service && showMarkers ? service.images(projection2) : [];
50719         sequences = filterSequences(sequences);
50720         images = filterImages(images);
50721       }
50722       var traces = layer.selectAll(".sequences").selectAll(".sequence").data(sequences, function(d) {
50723         return d.properties.key;
50724       });
50725       traces.exit().remove();
50726       traces = traces.enter().append("path").attr("class", "sequence").merge(traces).attr("d", svgPath(projection2).geojson);
50727       var groups = layer.selectAll(".markers").selectAll(".viewfield-group").data(images, function(d) {
50728         return d.key;
50729       });
50730       groups.exit().remove();
50731       var groupsEnter = groups.enter().append("g").attr("class", "viewfield-group").on("mouseenter", mouseover).on("mouseleave", mouseout).on("click", click);
50732       groupsEnter.append("g").attr("class", "viewfield-scale");
50733       var markers = groups.merge(groupsEnter).sort(function(a, b) {
50734         return a === selected ? 1 : b === selected ? -1 : b.loc[1] - a.loc[1];
50735       }).attr("transform", transform2).select(".viewfield-scale");
50736       markers.selectAll("circle").data([0]).enter().append("circle").attr("dx", "0").attr("dy", "0").attr("r", "6");
50737       var viewfields = markers.selectAll(".viewfield").data(showViewfields ? [0] : []);
50738       viewfields.exit().remove();
50739       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");
50740     }
50741     function drawImages(selection2) {
50742       var enabled = svgKartaviewImages.enabled, service = getService();
50743       layer = selection2.selectAll(".layer-kartaview").data(service ? [0] : []);
50744       layer.exit().remove();
50745       var layerEnter = layer.enter().append("g").attr("class", "layer-kartaview").style("display", enabled ? "block" : "none");
50746       layerEnter.append("g").attr("class", "sequences");
50747       layerEnter.append("g").attr("class", "markers");
50748       layer = layerEnter.merge(layer);
50749       if (enabled) {
50750         if (service && ~~context.map().zoom() >= minZoom3) {
50751           editOn();
50752           update();
50753           service.loadImages(projection2);
50754         } else {
50755           editOff();
50756         }
50757       }
50758     }
50759     drawImages.enabled = function(_) {
50760       if (!arguments.length)
50761         return svgKartaviewImages.enabled;
50762       svgKartaviewImages.enabled = _;
50763       if (svgKartaviewImages.enabled) {
50764         showLayer();
50765         context.photos().on("change.kartaview_images", update);
50766       } else {
50767         hideLayer();
50768         context.photos().on("change.kartaview_images", null);
50769       }
50770       dispatch10.call("change");
50771       return this;
50772     };
50773     drawImages.supported = function() {
50774       return !!getService();
50775     };
50776     init2();
50777     return drawImages;
50778   }
50779
50780   // modules/svg/osm.js
50781   function svgOsm(projection2, context, dispatch10) {
50782     var enabled = true;
50783     function drawOsm(selection2) {
50784       selection2.selectAll(".layer-osm").data(["covered", "areas", "lines", "points", "labels"]).enter().append("g").attr("class", function(d) {
50785         return "layer-osm " + d;
50786       });
50787       selection2.selectAll(".layer-osm.points").selectAll(".points-group").data(["points", "midpoints", "vertices", "turns"]).enter().append("g").attr("class", function(d) {
50788         return "points-group " + d;
50789       });
50790     }
50791     function showLayer() {
50792       var layer = context.surface().selectAll(".data-layer.osm");
50793       layer.interrupt();
50794       layer.classed("disabled", false).style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() {
50795         dispatch10.call("change");
50796       });
50797     }
50798     function hideLayer() {
50799       var layer = context.surface().selectAll(".data-layer.osm");
50800       layer.interrupt();
50801       layer.transition().duration(250).style("opacity", 0).on("end interrupt", function() {
50802         layer.classed("disabled", true);
50803         dispatch10.call("change");
50804       });
50805     }
50806     drawOsm.enabled = function(val) {
50807       if (!arguments.length)
50808         return enabled;
50809       enabled = val;
50810       if (enabled) {
50811         showLayer();
50812       } else {
50813         hideLayer();
50814       }
50815       dispatch10.call("change");
50816       return this;
50817     };
50818     return drawOsm;
50819   }
50820
50821   // modules/svg/notes.js
50822   var _notesEnabled = false;
50823   var _osmService;
50824   function svgNotes(projection2, context, dispatch10) {
50825     if (!dispatch10) {
50826       dispatch10 = dispatch_default("change");
50827     }
50828     var throttledRedraw = throttle_default(function() {
50829       dispatch10.call("change");
50830     }, 1e3);
50831     var minZoom3 = 12;
50832     var touchLayer = select_default2(null);
50833     var drawLayer = select_default2(null);
50834     var _notesVisible = false;
50835     function markerPath(selection2, klass) {
50836       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");
50837     }
50838     function getService() {
50839       if (services.osm && !_osmService) {
50840         _osmService = services.osm;
50841         _osmService.on("loadedNotes", throttledRedraw);
50842       } else if (!services.osm && _osmService) {
50843         _osmService = null;
50844       }
50845       return _osmService;
50846     }
50847     function editOn() {
50848       if (!_notesVisible) {
50849         _notesVisible = true;
50850         drawLayer.style("display", "block");
50851       }
50852     }
50853     function editOff() {
50854       if (_notesVisible) {
50855         _notesVisible = false;
50856         drawLayer.style("display", "none");
50857         drawLayer.selectAll(".note").remove();
50858         touchLayer.selectAll(".note").remove();
50859       }
50860     }
50861     function layerOn() {
50862       editOn();
50863       drawLayer.style("opacity", 0).transition().duration(250).style("opacity", 1).on("end interrupt", function() {
50864         dispatch10.call("change");
50865       });
50866     }
50867     function layerOff() {
50868       throttledRedraw.cancel();
50869       drawLayer.interrupt();
50870       touchLayer.selectAll(".note").remove();
50871       drawLayer.transition().duration(250).style("opacity", 0).on("end interrupt", function() {
50872         editOff();
50873         dispatch10.call("change");
50874       });
50875     }
50876     function updateMarkers() {
50877       if (!_notesVisible || !_notesEnabled)
50878         return;
50879       var service = getService();
50880       var selectedID = context.selectedNoteID();
50881       var data = service ? service.notes(projection2) : [];
50882       var getTransform = svgPointTransform(projection2);
50883       var notes = drawLayer.selectAll(".note").data(data, function(d) {
50884         return d.status + d.id;
50885       });
50886       notes.exit().remove();
50887       var notesEnter = notes.enter().append("g").attr("class", function(d) {
50888         return "note note-" + d.id + " " + d.status;
50889       }).classed("new", function(d) {
50890         return d.id < 0;
50891       });
50892       notesEnter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
50893       notesEnter.append("path").call(markerPath, "shadow");
50894       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");
50895       notesEnter.selectAll(".icon-annotation").data(function(d) {
50896         return [d];
50897       }).enter().append("use").attr("class", "icon-annotation").attr("width", "10px").attr("height", "10px").attr("x", "-3px").attr("y", "-19px").attr("xlink:href", function(d) {
50898         if (d.id < 0)
50899           return "#iD-icon-plus";
50900         if (d.status === "open")
50901           return "#iD-icon-close";
50902         return "#iD-icon-apply";
50903       });
50904       notes.merge(notesEnter).sort(sortY).classed("selected", function(d) {
50905         var mode = context.mode();
50906         var isMoving = mode && mode.id === "drag-note";
50907         return !isMoving && d.id === selectedID;
50908       }).attr("transform", getTransform);
50909       if (touchLayer.empty())
50910         return;
50911       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
50912       var targets = touchLayer.selectAll(".note").data(data, function(d) {
50913         return d.id;
50914       });
50915       targets.exit().remove();
50916       targets.enter().append("rect").attr("width", "20px").attr("height", "20px").attr("x", "-8px").attr("y", "-22px").merge(targets).sort(sortY).attr("class", function(d) {
50917         var newClass = d.id < 0 ? "new" : "";
50918         return "note target note-" + d.id + " " + fillClass + newClass;
50919       }).attr("transform", getTransform);
50920       function sortY(a, b) {
50921         if (a.id === selectedID)
50922           return 1;
50923         if (b.id === selectedID)
50924           return -1;
50925         return b.loc[1] - a.loc[1];
50926       }
50927     }
50928     function drawNotes(selection2) {
50929       var service = getService();
50930       var surface = context.surface();
50931       if (surface && !surface.empty()) {
50932         touchLayer = surface.selectAll(".data-layer.touch .layer-touch.markers");
50933       }
50934       drawLayer = selection2.selectAll(".layer-notes").data(service ? [0] : []);
50935       drawLayer.exit().remove();
50936       drawLayer = drawLayer.enter().append("g").attr("class", "layer-notes").style("display", _notesEnabled ? "block" : "none").merge(drawLayer);
50937       if (_notesEnabled) {
50938         if (service && ~~context.map().zoom() >= minZoom3) {
50939           editOn();
50940           service.loadNotes(projection2);
50941           updateMarkers();
50942         } else {
50943           editOff();
50944         }
50945       }
50946     }
50947     drawNotes.enabled = function(val) {
50948       if (!arguments.length)
50949         return _notesEnabled;
50950       _notesEnabled = val;
50951       if (_notesEnabled) {
50952         layerOn();
50953       } else {
50954         layerOff();
50955         if (context.selectedNoteID()) {
50956           context.enter(modeBrowse(context));
50957         }
50958       }
50959       dispatch10.call("change");
50960       return this;
50961     };
50962     return drawNotes;
50963   }
50964
50965   // modules/svg/touch.js
50966   function svgTouch() {
50967     function drawTouch(selection2) {
50968       selection2.selectAll(".layer-touch").data(["areas", "lines", "points", "turns", "markers"]).enter().append("g").attr("class", function(d) {
50969         return "layer-touch " + d;
50970       });
50971     }
50972     return drawTouch;
50973   }
50974
50975   // modules/util/dimensions.js
50976   function refresh(selection2, node) {
50977     var cr = node.getBoundingClientRect();
50978     var prop = [cr.width, cr.height];
50979     selection2.property("__dimensions__", prop);
50980     return prop;
50981   }
50982   function utilGetDimensions(selection2, force) {
50983     if (!selection2 || selection2.empty()) {
50984       return [0, 0];
50985     }
50986     var node = selection2.node(), cached = selection2.property("__dimensions__");
50987     return !cached || force ? refresh(selection2, node) : cached;
50988   }
50989   function utilSetDimensions(selection2, dimensions) {
50990     if (!selection2 || selection2.empty()) {
50991       return selection2;
50992     }
50993     var node = selection2.node();
50994     if (dimensions === null) {
50995       refresh(selection2, node);
50996       return selection2;
50997     }
50998     return selection2.property("__dimensions__", [dimensions[0], dimensions[1]]).attr("width", dimensions[0]).attr("height", dimensions[1]);
50999   }
51000
51001   // modules/svg/layers.js
51002   function svgLayers(projection2, context) {
51003     var dispatch10 = dispatch_default("change");
51004     var svg2 = select_default2(null);
51005     var _layers = [
51006       { id: "osm", layer: svgOsm(projection2, context, dispatch10) },
51007       { id: "notes", layer: svgNotes(projection2, context, dispatch10) },
51008       { id: "data", layer: svgData(projection2, context, dispatch10) },
51009       { id: "keepRight", layer: svgKeepRight(projection2, context, dispatch10) },
51010       { id: "improveOSM", layer: svgImproveOSM(projection2, context, dispatch10) },
51011       { id: "osmose", layer: svgOsmose(projection2, context, dispatch10) },
51012       { id: "streetside", layer: svgStreetside(projection2, context, dispatch10) },
51013       { id: "mapillary", layer: svgMapillaryImages(projection2, context, dispatch10) },
51014       { id: "mapillary-position", layer: svgMapillaryPosition(projection2, context, dispatch10) },
51015       { id: "mapillary-map-features", layer: svgMapillaryMapFeatures(projection2, context, dispatch10) },
51016       { id: "mapillary-signs", layer: svgMapillarySigns(projection2, context, dispatch10) },
51017       { id: "kartaview", layer: svgKartaviewImages(projection2, context, dispatch10) },
51018       { id: "debug", layer: svgDebug(projection2, context, dispatch10) },
51019       { id: "geolocate", layer: svgGeolocate(projection2, context, dispatch10) },
51020       { id: "touch", layer: svgTouch(projection2, context, dispatch10) }
51021     ];
51022     function drawLayers(selection2) {
51023       svg2 = selection2.selectAll(".surface").data([0]);
51024       svg2 = svg2.enter().append("svg").attr("class", "surface").merge(svg2);
51025       var defs = svg2.selectAll(".surface-defs").data([0]);
51026       defs.enter().append("defs").attr("class", "surface-defs");
51027       var groups = svg2.selectAll(".data-layer").data(_layers);
51028       groups.exit().remove();
51029       groups.enter().append("g").attr("class", function(d) {
51030         return "data-layer " + d.id;
51031       }).merge(groups).each(function(d) {
51032         select_default2(this).call(d.layer);
51033       });
51034     }
51035     drawLayers.all = function() {
51036       return _layers;
51037     };
51038     drawLayers.layer = function(id2) {
51039       var obj = _layers.find(function(o) {
51040         return o.id === id2;
51041       });
51042       return obj && obj.layer;
51043     };
51044     drawLayers.only = function(what) {
51045       var arr = [].concat(what);
51046       var all = _layers.map(function(layer) {
51047         return layer.id;
51048       });
51049       return drawLayers.remove(utilArrayDifference(all, arr));
51050     };
51051     drawLayers.remove = function(what) {
51052       var arr = [].concat(what);
51053       arr.forEach(function(id2) {
51054         _layers = _layers.filter(function(o) {
51055           return o.id !== id2;
51056         });
51057       });
51058       dispatch10.call("change");
51059       return this;
51060     };
51061     drawLayers.add = function(what) {
51062       var arr = [].concat(what);
51063       arr.forEach(function(obj) {
51064         if ("id" in obj && "layer" in obj) {
51065           _layers.push(obj);
51066         }
51067       });
51068       dispatch10.call("change");
51069       return this;
51070     };
51071     drawLayers.dimensions = function(val) {
51072       if (!arguments.length)
51073         return utilGetDimensions(svg2);
51074       utilSetDimensions(svg2, val);
51075       return this;
51076     };
51077     return utilRebind(drawLayers, dispatch10, "on");
51078   }
51079
51080   // modules/svg/lines.js
51081   var import_fast_deep_equal6 = __toESM(require_fast_deep_equal());
51082   function svgLines(projection2, context) {
51083     var detected = utilDetect();
51084     var highway_stack = {
51085       motorway: 0,
51086       motorway_link: 1,
51087       trunk: 2,
51088       trunk_link: 3,
51089       primary: 4,
51090       primary_link: 5,
51091       secondary: 6,
51092       tertiary: 7,
51093       unclassified: 8,
51094       residential: 9,
51095       service: 10,
51096       footway: 11
51097     };
51098     function drawTargets(selection2, graph, entities, filter2) {
51099       var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
51100       var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
51101       var getPath = svgPath(projection2).geojson;
51102       var activeID = context.activeID();
51103       var base = context.history().base();
51104       var data = { targets: [], nopes: [] };
51105       entities.forEach(function(way) {
51106         var features = svgSegmentWay(way, graph, activeID);
51107         data.targets.push.apply(data.targets, features.passive);
51108         data.nopes.push.apply(data.nopes, features.active);
51109       });
51110       var targetData = data.targets.filter(getPath);
51111       var targets = selection2.selectAll(".line.target-allowed").filter(function(d) {
51112         return filter2(d.properties.entity);
51113       }).data(targetData, function key(d) {
51114         return d.id;
51115       });
51116       targets.exit().remove();
51117       var segmentWasEdited = function(d) {
51118         var wayID = d.properties.entity.id;
51119         if (!base.entities[wayID] || !(0, import_fast_deep_equal6.default)(graph.entities[wayID].nodes, base.entities[wayID].nodes)) {
51120           return false;
51121         }
51122         return d.properties.nodes.some(function(n2) {
51123           return !base.entities[n2.id] || !(0, import_fast_deep_equal6.default)(graph.entities[n2.id].loc, base.entities[n2.id].loc);
51124         });
51125       };
51126       targets.enter().append("path").merge(targets).attr("d", getPath).attr("class", function(d) {
51127         return "way line target target-allowed " + targetClass + d.id;
51128       }).classed("segment-edited", segmentWasEdited);
51129       var nopeData = data.nopes.filter(getPath);
51130       var nopes = selection2.selectAll(".line.target-nope").filter(function(d) {
51131         return filter2(d.properties.entity);
51132       }).data(nopeData, function key(d) {
51133         return d.id;
51134       });
51135       nopes.exit().remove();
51136       nopes.enter().append("path").merge(nopes).attr("d", getPath).attr("class", function(d) {
51137         return "way line target target-nope " + nopeClass + d.id;
51138       }).classed("segment-edited", segmentWasEdited);
51139     }
51140     function drawLines(selection2, graph, entities, filter2) {
51141       var base = context.history().base();
51142       function waystack(a, b) {
51143         var selected = context.selectedIDs();
51144         var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
51145         var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
51146         if (a.tags.highway) {
51147           scoreA -= highway_stack[a.tags.highway];
51148         }
51149         if (b.tags.highway) {
51150           scoreB -= highway_stack[b.tags.highway];
51151         }
51152         return scoreA - scoreB;
51153       }
51154       function drawLineGroup(selection3, klass, isSelected) {
51155         var mode = context.mode();
51156         var isDrawing = mode && /^draw/.test(mode.id);
51157         var selectedClass = !isDrawing && isSelected ? "selected " : "";
51158         var lines = selection3.selectAll("path").filter(filter2).data(getPathData(isSelected), osmEntity.key);
51159         lines.exit().remove();
51160         lines.enter().append("path").attr("class", function(d) {
51161           var prefix = "way line";
51162           if (!d.hasInterestingTags()) {
51163             var parentRelations = graph.parentRelations(d);
51164             var parentMultipolygons = parentRelations.filter(function(relation) {
51165               return relation.isMultipolygon();
51166             });
51167             if (parentMultipolygons.length > 0 && // and only multipolygon relations
51168             parentRelations.length === parentMultipolygons.length) {
51169               prefix = "relation area";
51170             }
51171           }
51172           var oldMPClass = oldMultiPolygonOuters[d.id] ? "old-multipolygon " : "";
51173           return prefix + " " + klass + " " + selectedClass + oldMPClass + d.id;
51174         }).classed("added", function(d) {
51175           return !base.entities[d.id];
51176         }).classed("geometry-edited", function(d) {
51177           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);
51178         }).classed("retagged", function(d) {
51179           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);
51180         }).call(svgTagClasses()).merge(lines).sort(waystack).attr("d", getPath).call(svgTagClasses().tags(svgRelationMemberTags(graph)));
51181         return selection3;
51182       }
51183       function getPathData(isSelected) {
51184         return function() {
51185           var layer = this.parentNode.__data__;
51186           var data = pathdata[layer] || [];
51187           return data.filter(function(d) {
51188             if (isSelected) {
51189               return context.selectedIDs().indexOf(d.id) !== -1;
51190             } else {
51191               return context.selectedIDs().indexOf(d.id) === -1;
51192             }
51193           });
51194         };
51195       }
51196       function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
51197         var markergroup = layergroup.selectAll("g." + groupclass).data([pathclass]);
51198         markergroup = markergroup.enter().append("g").attr("class", groupclass).merge(markergroup);
51199         var markers = markergroup.selectAll("path").filter(filter2).data(
51200           function data() {
51201             return groupdata[this.parentNode.__data__] || [];
51202           },
51203           function key(d) {
51204             return [d.id, d.index];
51205           }
51206         );
51207         markers.exit().remove();
51208         markers = markers.enter().append("path").attr("class", pathclass).merge(markers).attr("marker-mid", marker).attr("d", function(d) {
51209           return d.d;
51210         });
51211         if (detected.ie) {
51212           markers.each(function() {
51213             this.parentNode.insertBefore(this, this);
51214           });
51215         }
51216       }
51217       var getPath = svgPath(projection2, graph);
51218       var ways = [];
51219       var onewaydata = {};
51220       var sideddata = {};
51221       var oldMultiPolygonOuters = {};
51222       for (var i2 = 0; i2 < entities.length; i2++) {
51223         var entity = entities[i2];
51224         var outer = osmOldMultipolygonOuterMember(entity, graph);
51225         if (outer) {
51226           ways.push(entity.mergeTags(outer.tags));
51227           oldMultiPolygonOuters[outer.id] = true;
51228         } else if (entity.geometry(graph) === "line" || entity.geometry(graph) === "area" && entity.sidednessIdentifier && entity.sidednessIdentifier() === "coastline") {
51229           ways.push(entity);
51230         }
51231       }
51232       ways = ways.filter(getPath);
51233       var pathdata = utilArrayGroupBy(ways, function(way) {
51234         return way.layer();
51235       });
51236       Object.keys(pathdata).forEach(function(k) {
51237         var v = pathdata[k];
51238         var onewayArr = v.filter(function(d) {
51239           return d.isOneWay();
51240         });
51241         var onewaySegments = svgMarkerSegments(
51242           projection2,
51243           graph,
51244           35,
51245           function shouldReverse(entity2) {
51246             return entity2.tags.oneway === "-1";
51247           },
51248           function bothDirections(entity2) {
51249             return entity2.tags.oneway === "reversible" || entity2.tags.oneway === "alternating";
51250           }
51251         );
51252         onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
51253         var sidedArr = v.filter(function(d) {
51254           return d.isSided();
51255         });
51256         var sidedSegments = svgMarkerSegments(
51257           projection2,
51258           graph,
51259           30,
51260           function shouldReverse() {
51261             return false;
51262           },
51263           function bothDirections() {
51264             return false;
51265           }
51266         );
51267         sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
51268       });
51269       var covered = selection2.selectAll(".layer-osm.covered");
51270       var uncovered = selection2.selectAll(".layer-osm.lines");
51271       var touchLayer = selection2.selectAll(".layer-touch.lines");
51272       [covered, uncovered].forEach(function(selection3) {
51273         var range3 = selection3 === covered ? range(-10, 0) : range(0, 11);
51274         var layergroup = selection3.selectAll("g.layergroup").data(range3);
51275         layergroup = layergroup.enter().append("g").attr("class", function(d) {
51276           return "layergroup layer" + String(d);
51277         }).merge(layergroup);
51278         layergroup.selectAll("g.linegroup").data(["shadow", "casing", "stroke", "shadow-highlighted", "casing-highlighted", "stroke-highlighted"]).enter().append("g").attr("class", function(d) {
51279           return "linegroup line-" + d;
51280         });
51281         layergroup.selectAll("g.line-shadow").call(drawLineGroup, "shadow", false);
51282         layergroup.selectAll("g.line-casing").call(drawLineGroup, "casing", false);
51283         layergroup.selectAll("g.line-stroke").call(drawLineGroup, "stroke", false);
51284         layergroup.selectAll("g.line-shadow-highlighted").call(drawLineGroup, "shadow", true);
51285         layergroup.selectAll("g.line-casing-highlighted").call(drawLineGroup, "casing", true);
51286         layergroup.selectAll("g.line-stroke-highlighted").call(drawLineGroup, "stroke", true);
51287         addMarkers(layergroup, "oneway", "onewaygroup", onewaydata, "url(#ideditor-oneway-marker)");
51288         addMarkers(
51289           layergroup,
51290           "sided",
51291           "sidedgroup",
51292           sideddata,
51293           function marker(d) {
51294             var category = graph.entity(d.id).sidednessIdentifier();
51295             return "url(#ideditor-sided-marker-" + category + ")";
51296           }
51297         );
51298       });
51299       touchLayer.call(drawTargets, graph, ways, filter2);
51300     }
51301     return drawLines;
51302   }
51303
51304   // modules/svg/midpoints.js
51305   function svgMidpoints(projection2, context) {
51306     var targetRadius = 8;
51307     function drawTargets(selection2, graph, entities, filter2) {
51308       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
51309       var getTransform = svgPointTransform(projection2).geojson;
51310       var data = entities.map(function(midpoint) {
51311         return {
51312           type: "Feature",
51313           id: midpoint.id,
51314           properties: {
51315             target: true,
51316             entity: midpoint
51317           },
51318           geometry: {
51319             type: "Point",
51320             coordinates: midpoint.loc
51321           }
51322         };
51323       });
51324       var targets = selection2.selectAll(".midpoint.target").filter(function(d) {
51325         return filter2(d.properties.entity);
51326       }).data(data, function key(d) {
51327         return d.id;
51328       });
51329       targets.exit().remove();
51330       targets.enter().append("circle").attr("r", targetRadius).merge(targets).attr("class", function(d) {
51331         return "node midpoint target " + fillClass + d.id;
51332       }).attr("transform", getTransform);
51333     }
51334     function drawMidpoints(selection2, graph, entities, filter2, extent) {
51335       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.midpoints");
51336       var touchLayer = selection2.selectAll(".layer-touch.points");
51337       var mode = context.mode();
51338       if (mode && mode.id !== "select" || !context.map().withinEditableZoom()) {
51339         drawLayer.selectAll(".midpoint").remove();
51340         touchLayer.selectAll(".midpoint.target").remove();
51341         return;
51342       }
51343       var poly = extent.polygon();
51344       var midpoints = {};
51345       for (var i2 = 0; i2 < entities.length; i2++) {
51346         var entity = entities[i2];
51347         if (entity.type !== "way")
51348           continue;
51349         if (!filter2(entity))
51350           continue;
51351         if (context.selectedIDs().indexOf(entity.id) < 0)
51352           continue;
51353         var nodes = graph.childNodes(entity);
51354         for (var j2 = 0; j2 < nodes.length - 1; j2++) {
51355           var a = nodes[j2];
51356           var b = nodes[j2 + 1];
51357           var id2 = [a.id, b.id].sort().join("-");
51358           if (midpoints[id2]) {
51359             midpoints[id2].parents.push(entity);
51360           } else if (geoVecLength(projection2(a.loc), projection2(b.loc)) > 40) {
51361             var point2 = geoVecInterp(a.loc, b.loc, 0.5);
51362             var loc = null;
51363             if (extent.intersects(point2)) {
51364               loc = point2;
51365             } else {
51366               for (var k = 0; k < 4; k++) {
51367                 point2 = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
51368                 if (point2 && geoVecLength(projection2(a.loc), projection2(point2)) > 20 && geoVecLength(projection2(b.loc), projection2(point2)) > 20) {
51369                   loc = point2;
51370                   break;
51371                 }
51372               }
51373             }
51374             if (loc) {
51375               midpoints[id2] = {
51376                 type: "midpoint",
51377                 id: id2,
51378                 loc,
51379                 edge: [a.id, b.id],
51380                 parents: [entity]
51381               };
51382             }
51383           }
51384         }
51385       }
51386       function midpointFilter(d) {
51387         if (midpoints[d.id])
51388           return true;
51389         for (var i3 = 0; i3 < d.parents.length; i3++) {
51390           if (filter2(d.parents[i3])) {
51391             return true;
51392           }
51393         }
51394         return false;
51395       }
51396       var groups = drawLayer.selectAll(".midpoint").filter(midpointFilter).data(Object.values(midpoints), function(d) {
51397         return d.id;
51398       });
51399       groups.exit().remove();
51400       var enter = groups.enter().insert("g", ":first-child").attr("class", "midpoint");
51401       enter.append("polygon").attr("points", "-6,8 10,0 -6,-8").attr("class", "shadow");
51402       enter.append("polygon").attr("points", "-3,4 5,0 -3,-4").attr("class", "fill");
51403       groups = groups.merge(enter).attr("transform", function(d) {
51404         var translate = svgPointTransform(projection2);
51405         var a2 = graph.entity(d.edge[0]);
51406         var b2 = graph.entity(d.edge[1]);
51407         var angle2 = geoAngle(a2, b2, projection2) * (180 / Math.PI);
51408         return translate(d) + " rotate(" + angle2 + ")";
51409       }).call(svgTagClasses().tags(
51410         function(d) {
51411           return d.parents[0].tags;
51412         }
51413       ));
51414       groups.select("polygon.shadow");
51415       groups.select("polygon.fill");
51416       touchLayer.call(drawTargets, graph, Object.values(midpoints), midpointFilter);
51417     }
51418     return drawMidpoints;
51419   }
51420
51421   // modules/svg/points.js
51422   var import_fast_deep_equal7 = __toESM(require_fast_deep_equal());
51423   function svgPoints(projection2, context) {
51424     function markerPath(selection2, klass) {
51425       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");
51426     }
51427     function sortY(a, b) {
51428       return b.loc[1] - a.loc[1];
51429     }
51430     function fastEntityKey(d) {
51431       var mode = context.mode();
51432       var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
51433       return isMoving ? d.id : osmEntity.key(d);
51434     }
51435     function drawTargets(selection2, graph, entities, filter2) {
51436       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
51437       var getTransform = svgPointTransform(projection2).geojson;
51438       var activeID = context.activeID();
51439       var data = [];
51440       entities.forEach(function(node) {
51441         if (activeID === node.id)
51442           return;
51443         data.push({
51444           type: "Feature",
51445           id: node.id,
51446           properties: {
51447             target: true,
51448             entity: node
51449           },
51450           geometry: node.asGeoJSON()
51451         });
51452       });
51453       var targets = selection2.selectAll(".point.target").filter(function(d) {
51454         return filter2(d.properties.entity);
51455       }).data(data, function key(d) {
51456         return d.id;
51457       });
51458       targets.exit().remove();
51459       targets.enter().append("rect").attr("x", -10).attr("y", -26).attr("width", 20).attr("height", 30).merge(targets).attr("class", function(d) {
51460         return "node point target " + fillClass + d.id;
51461       }).attr("transform", getTransform);
51462     }
51463     function drawPoints(selection2, graph, entities, filter2) {
51464       var wireframe = context.surface().classed("fill-wireframe");
51465       var zoom = geoScaleToZoom(projection2.scale());
51466       var base = context.history().base();
51467       function renderAsPoint(entity) {
51468         return entity.geometry(graph) === "point" && !(zoom >= 18 && entity.directions(graph, projection2).length);
51469       }
51470       var points = wireframe ? [] : entities.filter(renderAsPoint);
51471       points.sort(sortY);
51472       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.points");
51473       var touchLayer = selection2.selectAll(".layer-touch.points");
51474       var groups = drawLayer.selectAll("g.point").filter(filter2).data(points, fastEntityKey);
51475       groups.exit().remove();
51476       var enter = groups.enter().append("g").attr("class", function(d) {
51477         return "node point " + d.id;
51478       }).order();
51479       enter.append("path").call(markerPath, "shadow");
51480       enter.append("ellipse").attr("cx", 0.5).attr("cy", 1).attr("rx", 6.5).attr("ry", 3).attr("class", "stroke");
51481       enter.append("path").call(markerPath, "stroke");
51482       enter.append("use").attr("transform", "translate(-5.5, -20)").attr("class", "icon").attr("width", "12px").attr("height", "12px");
51483       groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("added", function(d) {
51484         return !base.entities[d.id];
51485       }).classed("moved", function(d) {
51486         return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].loc, base.entities[d.id].loc);
51487       }).classed("retagged", function(d) {
51488         return base.entities[d.id] && !(0, import_fast_deep_equal7.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
51489       }).call(svgTagClasses());
51490       groups.select(".shadow");
51491       groups.select(".stroke");
51492       groups.select(".icon").attr("xlink:href", function(entity) {
51493         var preset = _mainPresetIndex.match(entity, graph);
51494         var picon = preset && preset.icon;
51495         return picon ? "#" + picon : "";
51496       });
51497       touchLayer.call(drawTargets, graph, points, filter2);
51498     }
51499     return drawPoints;
51500   }
51501
51502   // modules/svg/turns.js
51503   function svgTurns(projection2, context) {
51504     function icon2(turn) {
51505       var u = turn.u ? "-u" : "";
51506       if (turn.no)
51507         return "#iD-turn-no" + u;
51508       if (turn.only)
51509         return "#iD-turn-only" + u;
51510       return "#iD-turn-yes" + u;
51511     }
51512     function drawTurns(selection2, graph, turns) {
51513       function turnTransform(d) {
51514         var pxRadius = 50;
51515         var toWay = graph.entity(d.to.way);
51516         var toPoints = graph.childNodes(toWay).map(function(n2) {
51517           return n2.loc;
51518         }).map(projection2);
51519         var toLength = geoPathLength(toPoints);
51520         var mid = toLength / 2;
51521         var toNode = graph.entity(d.to.node);
51522         var toVertex = graph.entity(d.to.vertex);
51523         var a = geoAngle(toVertex, toNode, projection2);
51524         var o = projection2(toVertex.loc);
51525         var r = d.u ? 0 : !toWay.__via ? pxRadius : Math.min(mid, pxRadius);
51526         return "translate(" + (r * Math.cos(a) + o[0]) + "," + (r * Math.sin(a) + o[1]) + ") rotate(" + a * 180 / Math.PI + ")";
51527       }
51528       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.turns");
51529       var touchLayer = selection2.selectAll(".layer-touch.turns");
51530       var groups = drawLayer.selectAll("g.turn").data(turns, function(d) {
51531         return d.key;
51532       });
51533       groups.exit().remove();
51534       var groupsEnter = groups.enter().append("g").attr("class", function(d) {
51535         return "turn " + d.key;
51536       });
51537       var turnsEnter = groupsEnter.filter(function(d) {
51538         return !d.u;
51539       });
51540       turnsEnter.append("rect").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
51541       turnsEnter.append("use").attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
51542       var uEnter = groupsEnter.filter(function(d) {
51543         return d.u;
51544       });
51545       uEnter.append("circle").attr("r", "16");
51546       uEnter.append("use").attr("transform", "translate(-16, -16)").attr("width", "32").attr("height", "32");
51547       groups = groups.merge(groupsEnter).attr("opacity", function(d) {
51548         return d.direct === false ? "0.7" : null;
51549       }).attr("transform", turnTransform);
51550       groups.select("use").attr("xlink:href", icon2);
51551       groups.select("rect");
51552       groups.select("circle");
51553       var fillClass = context.getDebug("target") ? "pink " : "nocolor ";
51554       groups = touchLayer.selectAll("g.turn").data(turns, function(d) {
51555         return d.key;
51556       });
51557       groups.exit().remove();
51558       groupsEnter = groups.enter().append("g").attr("class", function(d) {
51559         return "turn " + d.key;
51560       });
51561       turnsEnter = groupsEnter.filter(function(d) {
51562         return !d.u;
51563       });
51564       turnsEnter.append("rect").attr("class", "target " + fillClass).attr("transform", "translate(-22, -12)").attr("width", "44").attr("height", "24");
51565       uEnter = groupsEnter.filter(function(d) {
51566         return d.u;
51567       });
51568       uEnter.append("circle").attr("class", "target " + fillClass).attr("r", "16");
51569       groups = groups.merge(groupsEnter).attr("transform", turnTransform);
51570       groups.select("rect");
51571       groups.select("circle");
51572       return this;
51573     }
51574     return drawTurns;
51575   }
51576
51577   // modules/svg/vertices.js
51578   var import_fast_deep_equal8 = __toESM(require_fast_deep_equal());
51579   function svgVertices(projection2, context) {
51580     var radiuses = {
51581       //       z16-, z17,   z18+,  w/icon
51582       shadow: [6, 7.5, 7.5, 12],
51583       stroke: [2.5, 3.5, 3.5, 8],
51584       fill: [1, 1.5, 1.5, 1.5]
51585     };
51586     var _currHoverTarget;
51587     var _currPersistent = {};
51588     var _currHover = {};
51589     var _prevHover = {};
51590     var _currSelected = {};
51591     var _prevSelected = {};
51592     var _radii = {};
51593     function sortY(a, b) {
51594       return b.loc[1] - a.loc[1];
51595     }
51596     function fastEntityKey(d) {
51597       var mode = context.mode();
51598       var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
51599       return isMoving ? d.id : osmEntity.key(d);
51600     }
51601     function draw(selection2, graph, vertices, sets2, filter2) {
51602       sets2 = sets2 || { selected: {}, important: {}, hovered: {} };
51603       var icons = {};
51604       var directions = {};
51605       var wireframe = context.surface().classed("fill-wireframe");
51606       var zoom = geoScaleToZoom(projection2.scale());
51607       var z = zoom < 17 ? 0 : zoom < 18 ? 1 : 2;
51608       var activeID = context.activeID();
51609       var base = context.history().base();
51610       function getIcon(d) {
51611         var entity = graph.entity(d.id);
51612         if (entity.id in icons)
51613           return icons[entity.id];
51614         icons[entity.id] = entity.hasInterestingTags() && _mainPresetIndex.match(entity, graph).icon;
51615         return icons[entity.id];
51616       }
51617       function getDirections(entity) {
51618         if (entity.id in directions)
51619           return directions[entity.id];
51620         var angles = entity.directions(graph, projection2);
51621         directions[entity.id] = angles.length ? angles : false;
51622         return angles;
51623       }
51624       function updateAttributes(selection3) {
51625         ["shadow", "stroke", "fill"].forEach(function(klass) {
51626           var rads = radiuses[klass];
51627           selection3.selectAll("." + klass).each(function(entity) {
51628             var i2 = z && getIcon(entity);
51629             var r = rads[i2 ? 3 : z];
51630             if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
51631               r += 1.5;
51632             }
51633             if (klass === "shadow") {
51634               _radii[entity.id] = r;
51635             }
51636             select_default2(this).attr("r", r).attr("visibility", i2 && klass === "fill" ? "hidden" : null);
51637           });
51638         });
51639       }
51640       vertices.sort(sortY);
51641       var groups = selection2.selectAll("g.vertex").filter(filter2).data(vertices, fastEntityKey);
51642       groups.exit().remove();
51643       var enter = groups.enter().append("g").attr("class", function(d) {
51644         return "node vertex " + d.id;
51645       }).order();
51646       enter.append("circle").attr("class", "shadow");
51647       enter.append("circle").attr("class", "stroke");
51648       enter.filter(function(d) {
51649         return d.hasInterestingTags();
51650       }).append("circle").attr("class", "fill");
51651       groups = groups.merge(enter).attr("transform", svgPointTransform(projection2)).classed("sibling", function(d) {
51652         return d.id in sets2.selected;
51653       }).classed("shared", function(d) {
51654         return graph.isShared(d);
51655       }).classed("endpoint", function(d) {
51656         return d.isEndpoint(graph);
51657       }).classed("added", function(d) {
51658         return !base.entities[d.id];
51659       }).classed("moved", function(d) {
51660         return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].loc, base.entities[d.id].loc);
51661       }).classed("retagged", function(d) {
51662         return base.entities[d.id] && !(0, import_fast_deep_equal8.default)(graph.entities[d.id].tags, base.entities[d.id].tags);
51663       }).call(updateAttributes);
51664       var iconUse = groups.selectAll(".icon").data(function data(d) {
51665         return zoom >= 17 && getIcon(d) ? [d] : [];
51666       }, fastEntityKey);
51667       iconUse.exit().remove();
51668       iconUse.enter().append("use").attr("class", "icon").attr("width", "12px").attr("height", "12px").attr("transform", "translate(-6, -6)").attr("xlink:href", function(d) {
51669         var picon = getIcon(d);
51670         return picon ? "#" + picon : "";
51671       });
51672       var dgroups = groups.selectAll(".viewfieldgroup").data(function data(d) {
51673         return zoom >= 18 && getDirections(d) ? [d] : [];
51674       }, fastEntityKey);
51675       dgroups.exit().remove();
51676       dgroups = dgroups.enter().insert("g", ".shadow").attr("class", "viewfieldgroup").merge(dgroups);
51677       var viewfields = dgroups.selectAll(".viewfield").data(getDirections, function key(d) {
51678         return osmEntity.key(d);
51679       });
51680       viewfields.exit().remove();
51681       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) {
51682         return "rotate(" + d + ")";
51683       });
51684     }
51685     function drawTargets(selection2, graph, entities, filter2) {
51686       var targetClass = context.getDebug("target") ? "pink " : "nocolor ";
51687       var nopeClass = context.getDebug("target") ? "red " : "nocolor ";
51688       var getTransform = svgPointTransform(projection2).geojson;
51689       var activeID = context.activeID();
51690       var data = { targets: [], nopes: [] };
51691       entities.forEach(function(node) {
51692         if (activeID === node.id)
51693           return;
51694         var vertexType = svgPassiveVertex(node, graph, activeID);
51695         if (vertexType !== 0) {
51696           data.targets.push({
51697             type: "Feature",
51698             id: node.id,
51699             properties: {
51700               target: true,
51701               entity: node
51702             },
51703             geometry: node.asGeoJSON()
51704           });
51705         } else {
51706           data.nopes.push({
51707             type: "Feature",
51708             id: node.id + "-nope",
51709             properties: {
51710               nope: true,
51711               target: true,
51712               entity: node
51713             },
51714             geometry: node.asGeoJSON()
51715           });
51716         }
51717       });
51718       var targets = selection2.selectAll(".vertex.target-allowed").filter(function(d) {
51719         return filter2(d.properties.entity);
51720       }).data(data.targets, function key(d) {
51721         return d.id;
51722       });
51723       targets.exit().remove();
51724       targets.enter().append("circle").attr("r", function(d) {
51725         return _radii[d.id] || radiuses.shadow[3];
51726       }).merge(targets).attr("class", function(d) {
51727         return "node vertex target target-allowed " + targetClass + d.id;
51728       }).attr("transform", getTransform);
51729       var nopes = selection2.selectAll(".vertex.target-nope").filter(function(d) {
51730         return filter2(d.properties.entity);
51731       }).data(data.nopes, function key(d) {
51732         return d.id;
51733       });
51734       nopes.exit().remove();
51735       nopes.enter().append("circle").attr("r", function(d) {
51736         return _radii[d.properties.entity.id] || radiuses.shadow[3];
51737       }).merge(nopes).attr("class", function(d) {
51738         return "node vertex target target-nope " + nopeClass + d.id;
51739       }).attr("transform", getTransform);
51740     }
51741     function renderAsVertex(entity, graph, wireframe, zoom) {
51742       var geometry = entity.geometry(graph);
51743       return geometry === "vertex" || geometry === "point" && (wireframe || zoom >= 18 && entity.directions(graph, projection2).length);
51744     }
51745     function isEditedNode(node, base, head) {
51746       var baseNode = base.entities[node.id];
51747       var headNode = head.entities[node.id];
51748       return !headNode || !baseNode || !(0, import_fast_deep_equal8.default)(headNode.tags, baseNode.tags) || !(0, import_fast_deep_equal8.default)(headNode.loc, baseNode.loc);
51749     }
51750     function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
51751       var results = {};
51752       var seenIds = {};
51753       function addChildVertices(entity) {
51754         if (seenIds[entity.id])
51755           return;
51756         seenIds[entity.id] = true;
51757         var geometry = entity.geometry(graph);
51758         if (!context.features().isHiddenFeature(entity, graph, geometry)) {
51759           var i2;
51760           if (entity.type === "way") {
51761             for (i2 = 0; i2 < entity.nodes.length; i2++) {
51762               var child = graph.hasEntity(entity.nodes[i2]);
51763               if (child) {
51764                 addChildVertices(child);
51765               }
51766             }
51767           } else if (entity.type === "relation") {
51768             for (i2 = 0; i2 < entity.members.length; i2++) {
51769               var member = graph.hasEntity(entity.members[i2].id);
51770               if (member) {
51771                 addChildVertices(member);
51772               }
51773             }
51774           } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
51775             results[entity.id] = entity;
51776           }
51777         }
51778       }
51779       ids.forEach(function(id2) {
51780         var entity = graph.hasEntity(id2);
51781         if (!entity)
51782           return;
51783         if (entity.type === "node") {
51784           if (renderAsVertex(entity, graph, wireframe, zoom)) {
51785             results[entity.id] = entity;
51786             graph.parentWays(entity).forEach(function(entity2) {
51787               addChildVertices(entity2);
51788             });
51789           }
51790         } else {
51791           addChildVertices(entity);
51792         }
51793       });
51794       return results;
51795     }
51796     function drawVertices(selection2, graph, entities, filter2, extent, fullRedraw) {
51797       var wireframe = context.surface().classed("fill-wireframe");
51798       var visualDiff = context.surface().classed("highlight-edited");
51799       var zoom = geoScaleToZoom(projection2.scale());
51800       var mode = context.mode();
51801       var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
51802       var base = context.history().base();
51803       var drawLayer = selection2.selectAll(".layer-osm.points .points-group.vertices");
51804       var touchLayer = selection2.selectAll(".layer-touch.points");
51805       if (fullRedraw) {
51806         _currPersistent = {};
51807         _radii = {};
51808       }
51809       for (var i2 = 0; i2 < entities.length; i2++) {
51810         var entity = entities[i2];
51811         var geometry = entity.geometry(graph);
51812         var keep = false;
51813         if (geometry === "point" && renderAsVertex(entity, graph, wireframe, zoom)) {
51814           _currPersistent[entity.id] = entity;
51815           keep = true;
51816         } else if (geometry === "vertex" && (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph) || visualDiff && isEditedNode(entity, base, graph))) {
51817           _currPersistent[entity.id] = entity;
51818           keep = true;
51819         }
51820         if (!keep && !fullRedraw) {
51821           delete _currPersistent[entity.id];
51822         }
51823       }
51824       var sets2 = {
51825         persistent: _currPersistent,
51826         // persistent = important vertices (render always)
51827         selected: _currSelected,
51828         // selected + siblings of selected (render always)
51829         hovered: _currHover
51830         // hovered + siblings of hovered (render only in draw modes)
51831       };
51832       var all = Object.assign({}, isMoving ? _currHover : {}, _currSelected, _currPersistent);
51833       var filterRendered = function(d) {
51834         return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter2(d);
51835       };
51836       drawLayer.call(draw, graph, currentVisible(all), sets2, filterRendered);
51837       var filterTouch = function(d) {
51838         return isMoving ? true : filterRendered(d);
51839       };
51840       touchLayer.call(drawTargets, graph, currentVisible(all), filterTouch);
51841       function currentVisible(which) {
51842         return Object.keys(which).map(graph.hasEntity, graph).filter(function(entity2) {
51843           return entity2 && entity2.intersects(extent, graph);
51844         });
51845       }
51846     }
51847     drawVertices.drawSelected = function(selection2, graph, extent) {
51848       var wireframe = context.surface().classed("fill-wireframe");
51849       var zoom = geoScaleToZoom(projection2.scale());
51850       _prevSelected = _currSelected || {};
51851       if (context.map().isInWideSelection()) {
51852         _currSelected = {};
51853         context.selectedIDs().forEach(function(id2) {
51854           var entity = graph.hasEntity(id2);
51855           if (!entity)
51856             return;
51857           if (entity.type === "node") {
51858             if (renderAsVertex(entity, graph, wireframe, zoom)) {
51859               _currSelected[entity.id] = entity;
51860             }
51861           }
51862         });
51863       } else {
51864         _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
51865       }
51866       var filter2 = function(d) {
51867         return d.id in _prevSelected;
51868       };
51869       drawVertices(selection2, graph, Object.values(_prevSelected), filter2, extent, false);
51870     };
51871     drawVertices.drawHover = function(selection2, graph, target, extent) {
51872       if (target === _currHoverTarget)
51873         return;
51874       var wireframe = context.surface().classed("fill-wireframe");
51875       var zoom = geoScaleToZoom(projection2.scale());
51876       _prevHover = _currHover || {};
51877       _currHoverTarget = target;
51878       var entity = target && target.properties && target.properties.entity;
51879       if (entity) {
51880         _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
51881       } else {
51882         _currHover = {};
51883       }
51884       var filter2 = function(d) {
51885         return d.id in _prevHover;
51886       };
51887       drawVertices(selection2, graph, Object.values(_prevHover), filter2, extent, false);
51888     };
51889     return drawVertices;
51890   }
51891
51892   // modules/util/bind_once.js
51893   function utilBindOnce(target, type2, listener, capture) {
51894     var typeOnce = type2 + ".once";
51895     function one2() {
51896       target.on(typeOnce, null);
51897       listener.apply(this, arguments);
51898     }
51899     target.on(typeOnce, one2, capture);
51900     return this;
51901   }
51902
51903   // modules/util/zoom_pan.js
51904   function defaultFilter3(d3_event) {
51905     return !d3_event.ctrlKey && !d3_event.button;
51906   }
51907   function defaultExtent2() {
51908     var e = this;
51909     if (e instanceof SVGElement) {
51910       e = e.ownerSVGElement || e;
51911       if (e.hasAttribute("viewBox")) {
51912         e = e.viewBox.baseVal;
51913         return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
51914       }
51915       return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
51916     }
51917     return [[0, 0], [e.clientWidth, e.clientHeight]];
51918   }
51919   function defaultWheelDelta2(d3_event) {
51920     return -d3_event.deltaY * (d3_event.deltaMode === 1 ? 0.05 : d3_event.deltaMode ? 1 : 2e-3);
51921   }
51922   function defaultConstrain2(transform2, extent, translateExtent) {
51923     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];
51924     return transform2.translate(
51925       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
51926       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
51927     );
51928   }
51929   function utilZoomPan() {
51930     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;
51931     function zoom(selection2) {
51932       selection2.on("pointerdown.zoom", pointerdown).on("wheel.zoom", wheeled).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
51933       select_default2(window).on("pointermove.zoompan", pointermove).on("pointerup.zoompan pointercancel.zoompan", pointerup);
51934     }
51935     zoom.transform = function(collection, transform2, point2) {
51936       var selection2 = collection.selection ? collection.selection() : collection;
51937       if (collection !== selection2) {
51938         schedule(collection, transform2, point2);
51939       } else {
51940         selection2.interrupt().each(function() {
51941           gesture(this, arguments).start(null).zoom(null, null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(null);
51942         });
51943       }
51944     };
51945     zoom.scaleBy = function(selection2, k, p) {
51946       zoom.scaleTo(selection2, function() {
51947         var k0 = _transform.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k;
51948         return k0 * k1;
51949       }, p);
51950     };
51951     zoom.scaleTo = function(selection2, k, p) {
51952       zoom.transform(selection2, function() {
51953         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;
51954         return constrain(translate(scale(t0, k1), p02, p1), e, translateExtent);
51955       }, p);
51956     };
51957     zoom.translateBy = function(selection2, x, y) {
51958       zoom.transform(selection2, function() {
51959         return constrain(_transform.translate(
51960           typeof x === "function" ? x.apply(this, arguments) : x,
51961           typeof y === "function" ? y.apply(this, arguments) : y
51962         ), extent.apply(this, arguments), translateExtent);
51963       });
51964     };
51965     zoom.translateTo = function(selection2, x, y, p) {
51966       zoom.transform(selection2, function() {
51967         var e = extent.apply(this, arguments), t = _transform, p02 = !p ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
51968         return constrain(identity2.translate(p02[0], p02[1]).scale(t.k).translate(
51969           typeof x === "function" ? -x.apply(this, arguments) : -x,
51970           typeof y === "function" ? -y.apply(this, arguments) : -y
51971         ), e, translateExtent);
51972       }, p);
51973     };
51974     function scale(transform2, k) {
51975       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
51976       return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y);
51977     }
51978     function translate(transform2, p02, p1) {
51979       var x = p02[0] - p1[0] * transform2.k, y = p02[1] - p1[1] * transform2.k;
51980       return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y);
51981     }
51982     function centroid(extent2) {
51983       return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2];
51984     }
51985     function schedule(transition2, transform2, point2) {
51986       transition2.on("start.zoom", function() {
51987         gesture(this, arguments).start(null);
51988       }).on("interrupt.zoom end.zoom", function() {
51989         gesture(this, arguments).end(null);
51990       }).tween("zoom", function() {
51991         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));
51992         return function(t) {
51993           if (t === 1) {
51994             t = b;
51995           } else {
51996             var l = i2(t);
51997             var k = w / l[2];
51998             t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k);
51999           }
52000           g.zoom(null, null, t);
52001         };
52002       });
52003     }
52004     function gesture(that, args, clean2) {
52005       return !clean2 && _activeGesture || new Gesture(that, args);
52006     }
52007     function Gesture(that, args) {
52008       this.that = that;
52009       this.args = args;
52010       this.active = 0;
52011       this.extent = extent.apply(that, args);
52012     }
52013     Gesture.prototype = {
52014       start: function(d3_event) {
52015         if (++this.active === 1) {
52016           _activeGesture = this;
52017           dispatch10.call("start", this, d3_event);
52018         }
52019         return this;
52020       },
52021       zoom: function(d3_event, key, transform2) {
52022         if (this.mouse && key !== "mouse")
52023           this.mouse[1] = transform2.invert(this.mouse[0]);
52024         if (this.pointer0 && key !== "touch")
52025           this.pointer0[1] = transform2.invert(this.pointer0[0]);
52026         if (this.pointer1 && key !== "touch")
52027           this.pointer1[1] = transform2.invert(this.pointer1[0]);
52028         _transform = transform2;
52029         dispatch10.call("zoom", this, d3_event, key, transform2);
52030         return this;
52031       },
52032       end: function(d3_event) {
52033         if (--this.active === 0) {
52034           _activeGesture = null;
52035           dispatch10.call("end", this, d3_event);
52036         }
52037         return this;
52038       }
52039     };
52040     function wheeled(d3_event) {
52041       if (!filter2.apply(this, arguments))
52042         return;
52043       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);
52044       if (g.wheel) {
52045         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
52046           g.mouse[1] = t.invert(g.mouse[0] = p);
52047         }
52048         clearTimeout(g.wheel);
52049       } else {
52050         g.mouse = [p, t.invert(p)];
52051         interrupt_default(this);
52052         g.start(d3_event);
52053       }
52054       d3_event.preventDefault();
52055       d3_event.stopImmediatePropagation();
52056       g.wheel = setTimeout(wheelidled, _wheelDelay);
52057       g.zoom(d3_event, "mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
52058       function wheelidled() {
52059         g.wheel = null;
52060         g.end(d3_event);
52061       }
52062     }
52063     var _downPointerIDs = /* @__PURE__ */ new Set();
52064     var _pointerLocGetter;
52065     function pointerdown(d3_event) {
52066       _downPointerIDs.add(d3_event.pointerId);
52067       if (!filter2.apply(this, arguments))
52068         return;
52069       var g = gesture(this, arguments, _downPointerIDs.size === 1);
52070       var started;
52071       d3_event.stopImmediatePropagation();
52072       _pointerLocGetter = utilFastMouse(this);
52073       var loc = _pointerLocGetter(d3_event);
52074       var p = [loc, _transform.invert(loc), d3_event.pointerId];
52075       if (!g.pointer0) {
52076         g.pointer0 = p;
52077         started = true;
52078       } else if (!g.pointer1 && g.pointer0[2] !== p[2]) {
52079         g.pointer1 = p;
52080       }
52081       if (started) {
52082         interrupt_default(this);
52083         g.start(d3_event);
52084       }
52085     }
52086     function pointermove(d3_event) {
52087       if (!_downPointerIDs.has(d3_event.pointerId))
52088         return;
52089       if (!_activeGesture || !_pointerLocGetter)
52090         return;
52091       var g = gesture(this, arguments);
52092       var isPointer0 = g.pointer0 && g.pointer0[2] === d3_event.pointerId;
52093       var isPointer1 = !isPointer0 && g.pointer1 && g.pointer1[2] === d3_event.pointerId;
52094       if ((isPointer0 || isPointer1) && "buttons" in d3_event && !d3_event.buttons) {
52095         if (g.pointer0)
52096           _downPointerIDs.delete(g.pointer0[2]);
52097         if (g.pointer1)
52098           _downPointerIDs.delete(g.pointer1[2]);
52099         g.end(d3_event);
52100         return;
52101       }
52102       d3_event.preventDefault();
52103       d3_event.stopImmediatePropagation();
52104       var loc = _pointerLocGetter(d3_event);
52105       var t, p, l;
52106       if (isPointer0)
52107         g.pointer0[0] = loc;
52108       else if (isPointer1)
52109         g.pointer1[0] = loc;
52110       t = _transform;
52111       if (g.pointer1) {
52112         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;
52113         t = scale(t, Math.sqrt(dp / dl));
52114         p = [(p02[0] + p1[0]) / 2, (p02[1] + p1[1]) / 2];
52115         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
52116       } else if (g.pointer0) {
52117         p = g.pointer0[0];
52118         l = g.pointer0[1];
52119       } else {
52120         return;
52121       }
52122       g.zoom(d3_event, "touch", constrain(translate(t, p, l), g.extent, translateExtent));
52123     }
52124     function pointerup(d3_event) {
52125       if (!_downPointerIDs.has(d3_event.pointerId))
52126         return;
52127       _downPointerIDs.delete(d3_event.pointerId);
52128       if (!_activeGesture)
52129         return;
52130       var g = gesture(this, arguments);
52131       d3_event.stopImmediatePropagation();
52132       if (g.pointer0 && g.pointer0[2] === d3_event.pointerId)
52133         delete g.pointer0;
52134       else if (g.pointer1 && g.pointer1[2] === d3_event.pointerId)
52135         delete g.pointer1;
52136       if (g.pointer1 && !g.pointer0) {
52137         g.pointer0 = g.pointer1;
52138         delete g.pointer1;
52139       }
52140       if (g.pointer0) {
52141         g.pointer0[1] = _transform.invert(g.pointer0[0]);
52142       } else {
52143         g.end(d3_event);
52144       }
52145     }
52146     zoom.wheelDelta = function(_) {
52147       return arguments.length ? (wheelDelta = utilFunctor(+_), zoom) : wheelDelta;
52148     };
52149     zoom.filter = function(_) {
52150       return arguments.length ? (filter2 = utilFunctor(!!_), zoom) : filter2;
52151     };
52152     zoom.extent = function(_) {
52153       return arguments.length ? (extent = utilFunctor([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
52154     };
52155     zoom.scaleExtent = function(_) {
52156       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
52157     };
52158     zoom.translateExtent = function(_) {
52159       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]]];
52160     };
52161     zoom.constrain = function(_) {
52162       return arguments.length ? (constrain = _, zoom) : constrain;
52163     };
52164     zoom.interpolate = function(_) {
52165       return arguments.length ? (interpolate = _, zoom) : interpolate;
52166     };
52167     zoom._transform = function(_) {
52168       return arguments.length ? (_transform = _, zoom) : _transform;
52169     };
52170     return utilRebind(zoom, dispatch10, "on");
52171   }
52172
52173   // modules/util/double_up.js
52174   function utilDoubleUp() {
52175     var dispatch10 = dispatch_default("doubleUp");
52176     var _maxTimespan = 500;
52177     var _maxDistance = 20;
52178     var _pointer;
52179     function pointerIsValidFor(loc) {
52180       return (/* @__PURE__ */ new Date()).getTime() - _pointer.startTime <= _maxTimespan && // all pointer events must occur within a small distance of the first pointerdown
52181       geoVecLength(_pointer.startLoc, loc) <= _maxDistance;
52182     }
52183     function pointerdown(d3_event) {
52184       if (d3_event.ctrlKey || d3_event.button === 2)
52185         return;
52186       var loc = [d3_event.clientX, d3_event.clientY];
52187       if (_pointer && !pointerIsValidFor(loc)) {
52188         _pointer = void 0;
52189       }
52190       if (!_pointer) {
52191         _pointer = {
52192           startLoc: loc,
52193           startTime: (/* @__PURE__ */ new Date()).getTime(),
52194           upCount: 0,
52195           pointerId: d3_event.pointerId
52196         };
52197       } else {
52198         _pointer.pointerId = d3_event.pointerId;
52199       }
52200     }
52201     function pointerup(d3_event) {
52202       if (d3_event.ctrlKey || d3_event.button === 2)
52203         return;
52204       if (!_pointer || _pointer.pointerId !== d3_event.pointerId)
52205         return;
52206       _pointer.upCount += 1;
52207       if (_pointer.upCount === 2) {
52208         var loc = [d3_event.clientX, d3_event.clientY];
52209         if (pointerIsValidFor(loc)) {
52210           var locInThis = utilFastMouse(this)(d3_event);
52211           dispatch10.call("doubleUp", this, d3_event, locInThis);
52212         }
52213         _pointer = void 0;
52214       }
52215     }
52216     function doubleUp(selection2) {
52217       if ("PointerEvent" in window) {
52218         selection2.on("pointerdown.doubleUp", pointerdown).on("pointerup.doubleUp", pointerup);
52219       } else {
52220         selection2.on("dblclick.doubleUp", function(d3_event) {
52221           dispatch10.call("doubleUp", this, d3_event, utilFastMouse(this)(d3_event));
52222         });
52223       }
52224     }
52225     doubleUp.off = function(selection2) {
52226       selection2.on("pointerdown.doubleUp", null).on("pointerup.doubleUp", null).on("dblclick.doubleUp", null);
52227     };
52228     return utilRebind(doubleUp, dispatch10, "on");
52229   }
52230
52231   // modules/renderer/map.js
52232   var TILESIZE = 256;
52233   var minZoom2 = 2;
52234   var maxZoom = 24;
52235   var kMin = geoZoomToScale(minZoom2, TILESIZE);
52236   var kMax = geoZoomToScale(maxZoom, TILESIZE);
52237   function clamp(num, min3, max3) {
52238     return Math.max(min3, Math.min(num, max3));
52239   }
52240   function rendererMap(context) {
52241     var dispatch10 = dispatch_default(
52242       "move",
52243       "drawn",
52244       "crossEditableZoom",
52245       "hitMinZoom",
52246       "changeHighlighting",
52247       "changeAreaFill"
52248     );
52249     var projection2 = context.projection;
52250     var curtainProjection = context.curtainProjection;
52251     var drawLayers;
52252     var drawPoints;
52253     var drawVertices;
52254     var drawLines;
52255     var drawAreas;
52256     var drawMidpoints;
52257     var drawLabels;
52258     var _selection = select_default2(null);
52259     var supersurface = select_default2(null);
52260     var wrapper = select_default2(null);
52261     var surface = select_default2(null);
52262     var _dimensions = [1, 1];
52263     var _dblClickZoomEnabled = true;
52264     var _redrawEnabled = true;
52265     var _gestureTransformStart;
52266     var _transformStart = projection2.transform();
52267     var _transformLast;
52268     var _isTransformed = false;
52269     var _minzoom = 0;
52270     var _getMouseCoords;
52271     var _lastPointerEvent;
52272     var _lastWithinEditableZoom;
52273     var _pointerDown = false;
52274     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
52275     var _zoomerPannerFunction = "PointerEvent" in window ? utilZoomPan : zoom_default2;
52276     var _zoomerPanner = _zoomerPannerFunction().scaleExtent([kMin, kMax]).interpolate(value_default).filter(zoomEventFilter).on("zoom.map", zoomPan).on("start.map", function(d3_event) {
52277       _pointerDown = d3_event && (d3_event.type === "pointerdown" || d3_event.sourceEvent && d3_event.sourceEvent.type === "pointerdown");
52278     }).on("end.map", function() {
52279       _pointerDown = false;
52280     });
52281     var _doubleUpHandler = utilDoubleUp();
52282     var scheduleRedraw = throttle_default(redraw, 750);
52283     function cancelPendingRedraw() {
52284       scheduleRedraw.cancel();
52285     }
52286     function map2(selection2) {
52287       _selection = selection2;
52288       context.on("change.map", immediateRedraw);
52289       var osm = context.connection();
52290       if (osm) {
52291         osm.on("change.map", immediateRedraw);
52292       }
52293       function didUndoOrRedo(targetTransform) {
52294         var mode = context.mode().id;
52295         if (mode !== "browse" && mode !== "select")
52296           return;
52297         if (targetTransform) {
52298           map2.transformEase(targetTransform);
52299         }
52300       }
52301       context.history().on("merge.map", function() {
52302         scheduleRedraw();
52303       }).on("change.map", immediateRedraw).on("undone.map", function(stack, fromStack) {
52304         didUndoOrRedo(fromStack.transform);
52305       }).on("redone.map", function(stack) {
52306         didUndoOrRedo(stack.transform);
52307       });
52308       context.background().on("change.map", immediateRedraw);
52309       context.features().on("redraw.map", immediateRedraw);
52310       drawLayers.on("change.map", function() {
52311         context.background().updateImagery();
52312         immediateRedraw();
52313       });
52314       selection2.on("wheel.map mousewheel.map", function(d3_event) {
52315         d3_event.preventDefault();
52316       }).call(_zoomerPanner).call(_zoomerPanner.transform, projection2.transform()).on("dblclick.zoom", null);
52317       map2.supersurface = supersurface = selection2.append("div").attr("class", "supersurface").call(utilSetTransform, 0, 0);
52318       wrapper = supersurface.append("div").attr("class", "layer layer-data");
52319       map2.surface = surface = wrapper.call(drawLayers).selectAll(".surface");
52320       surface.call(drawLabels.observe).call(_doubleUpHandler).on(_pointerPrefix + "down.zoom", function(d3_event) {
52321         _lastPointerEvent = d3_event;
52322         if (d3_event.button === 2) {
52323           d3_event.stopPropagation();
52324         }
52325       }, true).on(_pointerPrefix + "up.zoom", function(d3_event) {
52326         _lastPointerEvent = d3_event;
52327         if (resetTransform()) {
52328           immediateRedraw();
52329         }
52330       }).on(_pointerPrefix + "move.map", function(d3_event) {
52331         _lastPointerEvent = d3_event;
52332       }).on(_pointerPrefix + "over.vertices", function(d3_event) {
52333         if (map2.editableDataEnabled() && !_isTransformed) {
52334           var hover = d3_event.target.__data__;
52335           surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent());
52336           dispatch10.call("drawn", this, { full: false });
52337         }
52338       }).on(_pointerPrefix + "out.vertices", function(d3_event) {
52339         if (map2.editableDataEnabled() && !_isTransformed) {
52340           var hover = d3_event.relatedTarget && d3_event.relatedTarget.__data__;
52341           surface.call(drawVertices.drawHover, context.graph(), hover, map2.extent());
52342           dispatch10.call("drawn", this, { full: false });
52343         }
52344       });
52345       var detected = utilDetect();
52346       if ("GestureEvent" in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping,
52347       // but we only need to do this on desktop Safari anyway. – #7694
52348       !detected.isMobileWebKit) {
52349         surface.on("gesturestart.surface", function(d3_event) {
52350           d3_event.preventDefault();
52351           _gestureTransformStart = projection2.transform();
52352         }).on("gesturechange.surface", gestureChange);
52353       }
52354       updateAreaFill();
52355       _doubleUpHandler.on("doubleUp.map", function(d3_event, p02) {
52356         if (!_dblClickZoomEnabled)
52357           return;
52358         if (typeof d3_event.target.__data__ === "object" && // or area fills
52359         !select_default2(d3_event.target).classed("fill"))
52360           return;
52361         var zoomOut2 = d3_event.shiftKey;
52362         var t = projection2.transform();
52363         var p1 = t.invert(p02);
52364         t = t.scale(zoomOut2 ? 0.5 : 2);
52365         t.x = p02[0] - p1[0] * t.k;
52366         t.y = p02[1] - p1[1] * t.k;
52367         map2.transformEase(t);
52368       });
52369       context.on("enter.map", function() {
52370         if (!map2.editableDataEnabled(
52371           true
52372           /* skip zoom check */
52373         ))
52374           return;
52375         if (_isTransformed)
52376           return;
52377         var graph = context.graph();
52378         var selectedAndParents = {};
52379         context.selectedIDs().forEach(function(id2) {
52380           var entity = graph.hasEntity(id2);
52381           if (entity) {
52382             selectedAndParents[entity.id] = entity;
52383             if (entity.type === "node") {
52384               graph.parentWays(entity).forEach(function(parent) {
52385                 selectedAndParents[parent.id] = parent;
52386               });
52387             }
52388           }
52389         });
52390         var data = Object.values(selectedAndParents);
52391         var filter2 = function(d) {
52392           return d.id in selectedAndParents;
52393         };
52394         data = context.features().filter(data, graph);
52395         surface.call(drawVertices.drawSelected, graph, map2.extent()).call(drawLines, graph, data, filter2).call(drawAreas, graph, data, filter2).call(drawMidpoints, graph, data, filter2, map2.trimmedExtent());
52396         dispatch10.call("drawn", this, { full: false });
52397         scheduleRedraw();
52398       });
52399       map2.dimensions(utilGetDimensions(selection2));
52400     }
52401     function zoomEventFilter(d3_event) {
52402       if (d3_event.type === "mousedown") {
52403         var hasOrphan = false;
52404         var listeners = window.__on;
52405         for (var i2 = 0; i2 < listeners.length; i2++) {
52406           var listener = listeners[i2];
52407           if (listener.name === "zoom" && listener.type === "mouseup") {
52408             hasOrphan = true;
52409             break;
52410           }
52411         }
52412         if (hasOrphan) {
52413           var event = window.CustomEvent;
52414           if (event) {
52415             event = new event("mouseup");
52416           } else {
52417             event = window.document.createEvent("Event");
52418             event.initEvent("mouseup", false, false);
52419           }
52420           event.view = window;
52421           window.dispatchEvent(event);
52422         }
52423       }
52424       return d3_event.button !== 2;
52425     }
52426     function pxCenter() {
52427       return [_dimensions[0] / 2, _dimensions[1] / 2];
52428     }
52429     function drawEditable(difference, extent) {
52430       var mode = context.mode();
52431       var graph = context.graph();
52432       var features = context.features();
52433       var all = context.history().intersects(map2.extent());
52434       var fullRedraw = false;
52435       var data;
52436       var set3;
52437       var filter2;
52438       var applyFeatureLayerFilters = true;
52439       if (map2.isInWideSelection()) {
52440         data = [];
52441         utilEntityAndDeepMemberIDs(mode.selectedIDs(), context.graph()).forEach(function(id2) {
52442           var entity = context.hasEntity(id2);
52443           if (entity)
52444             data.push(entity);
52445         });
52446         fullRedraw = true;
52447         filter2 = utilFunctor(true);
52448         applyFeatureLayerFilters = false;
52449       } else if (difference) {
52450         var complete = difference.complete(map2.extent());
52451         data = Object.values(complete).filter(Boolean);
52452         set3 = new Set(Object.keys(complete));
52453         filter2 = function(d) {
52454           return set3.has(d.id);
52455         };
52456         features.clear(data);
52457       } else {
52458         if (features.gatherStats(all, graph, _dimensions)) {
52459           extent = void 0;
52460         }
52461         if (extent) {
52462           data = context.history().intersects(map2.extent().intersection(extent));
52463           set3 = new Set(data.map(function(entity) {
52464             return entity.id;
52465           }));
52466           filter2 = function(d) {
52467             return set3.has(d.id);
52468           };
52469         } else {
52470           data = all;
52471           fullRedraw = true;
52472           filter2 = utilFunctor(true);
52473         }
52474       }
52475       if (applyFeatureLayerFilters) {
52476         data = features.filter(data, graph);
52477       } else {
52478         context.features().resetStats();
52479       }
52480       if (mode && mode.id === "select") {
52481         surface.call(drawVertices.drawSelected, graph, map2.extent());
52482       }
52483       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);
52484       dispatch10.call("drawn", this, { full: true });
52485     }
52486     map2.init = function() {
52487       drawLayers = svgLayers(projection2, context);
52488       drawPoints = svgPoints(projection2, context);
52489       drawVertices = svgVertices(projection2, context);
52490       drawLines = svgLines(projection2, context);
52491       drawAreas = svgAreas(projection2, context);
52492       drawMidpoints = svgMidpoints(projection2, context);
52493       drawLabels = svgLabels(projection2, context);
52494     };
52495     function editOff() {
52496       context.features().resetStats();
52497       surface.selectAll(".layer-osm *").remove();
52498       surface.selectAll(".layer-touch:not(.markers) *").remove();
52499       var allowed = {
52500         "browse": true,
52501         "save": true,
52502         "select-note": true,
52503         "select-data": true,
52504         "select-error": true
52505       };
52506       var mode = context.mode();
52507       if (mode && !allowed[mode.id]) {
52508         context.enter(modeBrowse(context));
52509       }
52510       dispatch10.call("drawn", this, { full: true });
52511     }
52512     function gestureChange(d3_event) {
52513       var e = d3_event;
52514       e.preventDefault();
52515       var props = {
52516         deltaMode: 0,
52517         // dummy values to ignore in zoomPan
52518         deltaY: 1,
52519         // dummy values to ignore in zoomPan
52520         clientX: e.clientX,
52521         clientY: e.clientY,
52522         screenX: e.screenX,
52523         screenY: e.screenY,
52524         x: e.x,
52525         y: e.y
52526       };
52527       var e22 = new WheelEvent("wheel", props);
52528       e22._scale = e.scale;
52529       e22._rotation = e.rotation;
52530       _selection.node().dispatchEvent(e22);
52531     }
52532     function zoomPan(event, key, transform2) {
52533       var source = event && event.sourceEvent || event;
52534       var eventTransform = transform2 || event && event.transform;
52535       var x = eventTransform.x;
52536       var y = eventTransform.y;
52537       var k = eventTransform.k;
52538       if (source && source.type === "wheel") {
52539         if (_pointerDown)
52540           return;
52541         var detected = utilDetect();
52542         var dX = source.deltaX;
52543         var dY = source.deltaY;
52544         var x2 = x;
52545         var y2 = y;
52546         var k2 = k;
52547         var t0, p02, p1;
52548         if (source.deltaMode === 1) {
52549           var lines = Math.abs(source.deltaY);
52550           var sign2 = source.deltaY > 0 ? 1 : -1;
52551           dY = sign2 * clamp(
52552             Math.exp((lines - 1) * 0.75) * 4.000244140625,
52553             4.000244140625,
52554             // min
52555             350.000244140625
52556             // max
52557           );
52558           if (detected.os !== "mac") {
52559             dY *= 5;
52560           }
52561           t0 = _isTransformed ? _transformLast : _transformStart;
52562           p02 = _getMouseCoords(source);
52563           p1 = t0.invert(p02);
52564           k2 = t0.k * Math.pow(2, -dY / 500);
52565           k2 = clamp(k2, kMin, kMax);
52566           x2 = p02[0] - p1[0] * k2;
52567           y2 = p02[1] - p1[1] * k2;
52568         } else if (source._scale) {
52569           t0 = _gestureTransformStart;
52570           p02 = _getMouseCoords(source);
52571           p1 = t0.invert(p02);
52572           k2 = t0.k * source._scale;
52573           k2 = clamp(k2, kMin, kMax);
52574           x2 = p02[0] - p1[0] * k2;
52575           y2 = p02[1] - p1[1] * k2;
52576         } else if (source.ctrlKey && !isInteger(dY)) {
52577           dY *= 6;
52578           t0 = _isTransformed ? _transformLast : _transformStart;
52579           p02 = _getMouseCoords(source);
52580           p1 = t0.invert(p02);
52581           k2 = t0.k * Math.pow(2, -dY / 500);
52582           k2 = clamp(k2, kMin, kMax);
52583           x2 = p02[0] - p1[0] * k2;
52584           y2 = p02[1] - p1[1] * k2;
52585         } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
52586           t0 = _isTransformed ? _transformLast : _transformStart;
52587           p02 = _getMouseCoords(source);
52588           p1 = t0.invert(p02);
52589           k2 = t0.k * Math.pow(2, -dY / 500);
52590           k2 = clamp(k2, kMin, kMax);
52591           x2 = p02[0] - p1[0] * k2;
52592           y2 = p02[1] - p1[1] * k2;
52593         } else if (detected.os === "mac" && detected.browser !== "Firefox" && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
52594           p1 = projection2.translate();
52595           x2 = p1[0] - dX;
52596           y2 = p1[1] - dY;
52597           k2 = projection2.scale();
52598           k2 = clamp(k2, kMin, kMax);
52599         }
52600         if (x2 !== x || y2 !== y || k2 !== k) {
52601           x = x2;
52602           y = y2;
52603           k = k2;
52604           eventTransform = identity2.translate(x2, y2).scale(k2);
52605           if (_zoomerPanner._transform) {
52606             _zoomerPanner._transform(eventTransform);
52607           } else {
52608             _selection.node().__zoom = eventTransform;
52609           }
52610         }
52611       }
52612       if (_transformStart.x === x && _transformStart.y === y && _transformStart.k === k) {
52613         return;
52614       }
52615       if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
52616         surface.interrupt();
52617         dispatch10.call("hitMinZoom", this, map2);
52618         setCenterZoom(map2.center(), context.minEditableZoom(), 0, true);
52619         scheduleRedraw();
52620         dispatch10.call("move", this, map2);
52621         return;
52622       }
52623       projection2.transform(eventTransform);
52624       var withinEditableZoom = map2.withinEditableZoom();
52625       if (_lastWithinEditableZoom !== withinEditableZoom) {
52626         if (_lastWithinEditableZoom !== void 0) {
52627           dispatch10.call("crossEditableZoom", this, withinEditableZoom);
52628         }
52629         _lastWithinEditableZoom = withinEditableZoom;
52630       }
52631       var scale = k / _transformStart.k;
52632       var tX = (x / scale - _transformStart.x) * scale;
52633       var tY = (y / scale - _transformStart.y) * scale;
52634       if (context.inIntro()) {
52635         curtainProjection.transform({
52636           x: x - tX,
52637           y: y - tY,
52638           k
52639         });
52640       }
52641       if (source) {
52642         _lastPointerEvent = event;
52643       }
52644       _isTransformed = true;
52645       _transformLast = eventTransform;
52646       utilSetTransform(supersurface, tX, tY, scale);
52647       scheduleRedraw();
52648       dispatch10.call("move", this, map2);
52649       function isInteger(val) {
52650         return typeof val === "number" && isFinite(val) && Math.floor(val) === val;
52651       }
52652     }
52653     function resetTransform() {
52654       if (!_isTransformed)
52655         return false;
52656       utilSetTransform(supersurface, 0, 0);
52657       _isTransformed = false;
52658       if (context.inIntro()) {
52659         curtainProjection.transform(projection2.transform());
52660       }
52661       return true;
52662     }
52663     function redraw(difference, extent) {
52664       if (surface.empty() || !_redrawEnabled)
52665         return;
52666       if (resetTransform()) {
52667         difference = extent = void 0;
52668       }
52669       var zoom = map2.zoom();
52670       var z = String(~~zoom);
52671       if (surface.attr("data-zoom") !== z) {
52672         surface.attr("data-zoom", z);
52673       }
52674       var lat = map2.center()[1];
52675       var lowzoom = linear3().domain([-60, 0, 60]).range([17, 18.5, 17]).clamp(true);
52676       surface.classed("low-zoom", zoom <= lowzoom(lat));
52677       if (!difference) {
52678         supersurface.call(context.background());
52679         wrapper.call(drawLayers);
52680       }
52681       if (map2.editableDataEnabled() || map2.isInWideSelection()) {
52682         context.loadTiles(projection2);
52683         drawEditable(difference, extent);
52684       } else {
52685         editOff();
52686       }
52687       _transformStart = projection2.transform();
52688       return map2;
52689     }
52690     var immediateRedraw = function(difference, extent) {
52691       if (!difference && !extent)
52692         cancelPendingRedraw();
52693       redraw(difference, extent);
52694     };
52695     map2.lastPointerEvent = function() {
52696       return _lastPointerEvent;
52697     };
52698     map2.mouse = function(d3_event) {
52699       var event = d3_event || _lastPointerEvent;
52700       if (event) {
52701         var s;
52702         while (s = event.sourceEvent) {
52703           event = s;
52704         }
52705         return _getMouseCoords(event);
52706       }
52707       return null;
52708     };
52709     map2.mouseCoordinates = function() {
52710       var coord2 = map2.mouse() || pxCenter();
52711       return projection2.invert(coord2);
52712     };
52713     map2.dblclickZoomEnable = function(val) {
52714       if (!arguments.length)
52715         return _dblClickZoomEnabled;
52716       _dblClickZoomEnabled = val;
52717       return map2;
52718     };
52719     map2.redrawEnable = function(val) {
52720       if (!arguments.length)
52721         return _redrawEnabled;
52722       _redrawEnabled = val;
52723       return map2;
52724     };
52725     map2.isTransformed = function() {
52726       return _isTransformed;
52727     };
52728     function setTransform(t2, duration, force) {
52729       var t = projection2.transform();
52730       if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y)
52731         return false;
52732       if (duration) {
52733         _selection.transition().duration(duration).on("start", function() {
52734           map2.startEase();
52735         }).call(_zoomerPanner.transform, identity2.translate(t2.x, t2.y).scale(t2.k));
52736       } else {
52737         projection2.transform(t2);
52738         _transformStart = t2;
52739         _selection.call(_zoomerPanner.transform, _transformStart);
52740       }
52741       return true;
52742     }
52743     function setCenterZoom(loc2, z2, duration, force) {
52744       var c = map2.center();
52745       var z = map2.zoom();
52746       if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force)
52747         return false;
52748       var proj = geoRawMercator().transform(projection2.transform());
52749       var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
52750       proj.scale(k2);
52751       var t = proj.translate();
52752       var point2 = proj(loc2);
52753       var center = pxCenter();
52754       t[0] += center[0] - point2[0];
52755       t[1] += center[1] - point2[1];
52756       return setTransform(identity2.translate(t[0], t[1]).scale(k2), duration, force);
52757     }
52758     map2.pan = function(delta, duration) {
52759       var t = projection2.translate();
52760       var k = projection2.scale();
52761       t[0] += delta[0];
52762       t[1] += delta[1];
52763       if (duration) {
52764         _selection.transition().duration(duration).on("start", function() {
52765           map2.startEase();
52766         }).call(_zoomerPanner.transform, identity2.translate(t[0], t[1]).scale(k));
52767       } else {
52768         projection2.translate(t);
52769         _transformStart = projection2.transform();
52770         _selection.call(_zoomerPanner.transform, _transformStart);
52771         dispatch10.call("move", this, map2);
52772         immediateRedraw();
52773       }
52774       return map2;
52775     };
52776     map2.dimensions = function(val) {
52777       if (!arguments.length)
52778         return _dimensions;
52779       _dimensions = val;
52780       drawLayers.dimensions(_dimensions);
52781       context.background().dimensions(_dimensions);
52782       projection2.clipExtent([[0, 0], _dimensions]);
52783       _getMouseCoords = utilFastMouse(supersurface.node());
52784       scheduleRedraw();
52785       return map2;
52786     };
52787     function zoomIn(delta) {
52788       setCenterZoom(map2.center(), ~~map2.zoom() + delta, 250, true);
52789     }
52790     function zoomOut(delta) {
52791       setCenterZoom(map2.center(), ~~map2.zoom() - delta, 250, true);
52792     }
52793     map2.zoomIn = function() {
52794       zoomIn(1);
52795     };
52796     map2.zoomInFurther = function() {
52797       zoomIn(4);
52798     };
52799     map2.canZoomIn = function() {
52800       return map2.zoom() < maxZoom;
52801     };
52802     map2.zoomOut = function() {
52803       zoomOut(1);
52804     };
52805     map2.zoomOutFurther = function() {
52806       zoomOut(4);
52807     };
52808     map2.canZoomOut = function() {
52809       return map2.zoom() > minZoom2;
52810     };
52811     map2.center = function(loc2) {
52812       if (!arguments.length) {
52813         return projection2.invert(pxCenter());
52814       }
52815       if (setCenterZoom(loc2, map2.zoom())) {
52816         dispatch10.call("move", this, map2);
52817       }
52818       scheduleRedraw();
52819       return map2;
52820     };
52821     map2.unobscuredCenterZoomEase = function(loc, zoom) {
52822       var offset = map2.unobscuredOffsetPx();
52823       var proj = geoRawMercator().transform(projection2.transform());
52824       proj.scale(geoZoomToScale(zoom, TILESIZE));
52825       var locPx = proj(loc);
52826       var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
52827       var offsetLoc = proj.invert(offsetLocPx);
52828       map2.centerZoomEase(offsetLoc, zoom);
52829     };
52830     map2.unobscuredOffsetPx = function() {
52831       var openPane = context.container().select(".map-panes .map-pane.shown");
52832       if (!openPane.empty()) {
52833         return [openPane.node().offsetWidth / 2, 0];
52834       }
52835       return [0, 0];
52836     };
52837     map2.zoom = function(z2) {
52838       if (!arguments.length) {
52839         return Math.max(geoScaleToZoom(projection2.scale(), TILESIZE), 0);
52840       }
52841       if (z2 < _minzoom) {
52842         surface.interrupt();
52843         dispatch10.call("hitMinZoom", this, map2);
52844         z2 = context.minEditableZoom();
52845       }
52846       if (setCenterZoom(map2.center(), z2)) {
52847         dispatch10.call("move", this, map2);
52848       }
52849       scheduleRedraw();
52850       return map2;
52851     };
52852     map2.centerZoom = function(loc2, z2) {
52853       if (setCenterZoom(loc2, z2)) {
52854         dispatch10.call("move", this, map2);
52855       }
52856       scheduleRedraw();
52857       return map2;
52858     };
52859     map2.zoomTo = function(entity) {
52860       var extent = entity.extent(context.graph());
52861       if (!isFinite(extent.area()))
52862         return map2;
52863       var z2 = clamp(map2.trimmedExtentZoom(extent), 0, 20);
52864       return map2.centerZoom(extent.center(), z2);
52865     };
52866     map2.centerEase = function(loc2, duration) {
52867       duration = duration || 250;
52868       setCenterZoom(loc2, map2.zoom(), duration);
52869       return map2;
52870     };
52871     map2.zoomEase = function(z2, duration) {
52872       duration = duration || 250;
52873       setCenterZoom(map2.center(), z2, duration, false);
52874       return map2;
52875     };
52876     map2.centerZoomEase = function(loc2, z2, duration) {
52877       duration = duration || 250;
52878       setCenterZoom(loc2, z2, duration, false);
52879       return map2;
52880     };
52881     map2.transformEase = function(t2, duration) {
52882       duration = duration || 250;
52883       setTransform(
52884         t2,
52885         duration,
52886         false
52887         /* don't force */
52888       );
52889       return map2;
52890     };
52891     map2.zoomToEase = function(obj, duration) {
52892       var extent;
52893       if (Array.isArray(obj)) {
52894         obj.forEach(function(entity) {
52895           var entityExtent = entity.extent(context.graph());
52896           if (!extent) {
52897             extent = entityExtent;
52898           } else {
52899             extent = extent.extend(entityExtent);
52900           }
52901         });
52902       } else {
52903         extent = obj.extent(context.graph());
52904       }
52905       if (!isFinite(extent.area()))
52906         return map2;
52907       var z2 = clamp(map2.trimmedExtentZoom(extent), 0, 20);
52908       return map2.centerZoomEase(extent.center(), z2, duration);
52909     };
52910     map2.startEase = function() {
52911       utilBindOnce(surface, _pointerPrefix + "down.ease", function() {
52912         map2.cancelEase();
52913       });
52914       return map2;
52915     };
52916     map2.cancelEase = function() {
52917       _selection.interrupt();
52918       return map2;
52919     };
52920     map2.extent = function(val) {
52921       if (!arguments.length) {
52922         return new geoExtent(
52923           projection2.invert([0, _dimensions[1]]),
52924           projection2.invert([_dimensions[0], 0])
52925         );
52926       } else {
52927         var extent = geoExtent(val);
52928         map2.centerZoom(extent.center(), map2.extentZoom(extent));
52929       }
52930     };
52931     map2.trimmedExtent = function(val) {
52932       if (!arguments.length) {
52933         var headerY = 71;
52934         var footerY = 30;
52935         var pad2 = 10;
52936         return new geoExtent(
52937           projection2.invert([pad2, _dimensions[1] - footerY - pad2]),
52938           projection2.invert([_dimensions[0] - pad2, headerY + pad2])
52939         );
52940       } else {
52941         var extent = geoExtent(val);
52942         map2.centerZoom(extent.center(), map2.trimmedExtentZoom(extent));
52943       }
52944     };
52945     function calcExtentZoom(extent, dim) {
52946       var tl = projection2([extent[0][0], extent[1][1]]);
52947       var br = projection2([extent[1][0], extent[0][1]]);
52948       var hFactor = (br[0] - tl[0]) / dim[0];
52949       var vFactor = (br[1] - tl[1]) / dim[1];
52950       var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
52951       var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
52952       var newZoom = map2.zoom() - Math.max(hZoomDiff, vZoomDiff);
52953       return newZoom;
52954     }
52955     map2.extentZoom = function(val) {
52956       return calcExtentZoom(geoExtent(val), _dimensions);
52957     };
52958     map2.trimmedExtentZoom = function(val) {
52959       var trimY = 120;
52960       var trimX = 40;
52961       var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
52962       return calcExtentZoom(geoExtent(val), trimmed);
52963     };
52964     map2.withinEditableZoom = function() {
52965       return map2.zoom() >= context.minEditableZoom();
52966     };
52967     map2.isInWideSelection = function() {
52968       return !map2.withinEditableZoom() && context.selectedIDs().length;
52969     };
52970     map2.editableDataEnabled = function(skipZoomCheck) {
52971       var layer = context.layers().layer("osm");
52972       if (!layer || !layer.enabled())
52973         return false;
52974       return skipZoomCheck || map2.withinEditableZoom();
52975     };
52976     map2.notesEditable = function() {
52977       var layer = context.layers().layer("notes");
52978       if (!layer || !layer.enabled())
52979         return false;
52980       return map2.withinEditableZoom();
52981     };
52982     map2.minzoom = function(val) {
52983       if (!arguments.length)
52984         return _minzoom;
52985       _minzoom = val;
52986       return map2;
52987     };
52988     map2.toggleHighlightEdited = function() {
52989       surface.classed("highlight-edited", !surface.classed("highlight-edited"));
52990       map2.pan([0, 0]);
52991       dispatch10.call("changeHighlighting", this);
52992     };
52993     map2.areaFillOptions = ["wireframe", "partial", "full"];
52994     map2.activeAreaFill = function(val) {
52995       if (!arguments.length)
52996         return corePreferences("area-fill") || "partial";
52997       corePreferences("area-fill", val);
52998       if (val !== "wireframe") {
52999         corePreferences("area-fill-toggle", val);
53000       }
53001       updateAreaFill();
53002       map2.pan([0, 0]);
53003       dispatch10.call("changeAreaFill", this);
53004       return map2;
53005     };
53006     map2.toggleWireframe = function() {
53007       var activeFill = map2.activeAreaFill();
53008       if (activeFill === "wireframe") {
53009         activeFill = corePreferences("area-fill-toggle") || "partial";
53010       } else {
53011         activeFill = "wireframe";
53012       }
53013       map2.activeAreaFill(activeFill);
53014     };
53015     function updateAreaFill() {
53016       var activeFill = map2.activeAreaFill();
53017       map2.areaFillOptions.forEach(function(opt) {
53018         surface.classed("fill-" + opt, Boolean(opt === activeFill));
53019       });
53020     }
53021     map2.layers = () => drawLayers;
53022     map2.doubleUpHandler = function() {
53023       return _doubleUpHandler;
53024     };
53025     return utilRebind(map2, dispatch10, "on");
53026   }
53027
53028   // modules/renderer/photos.js
53029   function rendererPhotos(context) {
53030     var dispatch10 = dispatch_default("change");
53031     var _layerIDs = ["streetside", "mapillary", "mapillary-map-features", "mapillary-signs", "kartaview"];
53032     var _allPhotoTypes = ["flat", "panoramic"];
53033     var _shownPhotoTypes = _allPhotoTypes.slice();
53034     var _dateFilters = ["fromDate", "toDate"];
53035     var _fromDate;
53036     var _toDate;
53037     var _usernames;
53038     function photos() {
53039     }
53040     function updateStorage() {
53041       if (window.mocha)
53042         return;
53043       var hash = utilStringQs(window.location.hash);
53044       var enabled = context.layers().all().filter(function(d) {
53045         return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
53046       }).map(function(d) {
53047         return d.id;
53048       });
53049       if (enabled.length) {
53050         hash.photo_overlay = enabled.join(",");
53051       } else {
53052         delete hash.photo_overlay;
53053       }
53054       window.location.replace("#" + utilQsString(hash, true));
53055     }
53056     photos.overlayLayerIDs = function() {
53057       return _layerIDs;
53058     };
53059     photos.allPhotoTypes = function() {
53060       return _allPhotoTypes;
53061     };
53062     photos.dateFilters = function() {
53063       return _dateFilters;
53064     };
53065     photos.dateFilterValue = function(val) {
53066       return val === _dateFilters[0] ? _fromDate : _toDate;
53067     };
53068     photos.setDateFilter = function(type2, val, updateUrl) {
53069       var date = val && new Date(val);
53070       if (date && !isNaN(date)) {
53071         val = date.toISOString().slice(0, 10);
53072       } else {
53073         val = null;
53074       }
53075       if (type2 === _dateFilters[0]) {
53076         _fromDate = val;
53077         if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
53078           _toDate = _fromDate;
53079         }
53080       }
53081       if (type2 === _dateFilters[1]) {
53082         _toDate = val;
53083         if (_fromDate && _toDate && new Date(_toDate) < new Date(_fromDate)) {
53084           _fromDate = _toDate;
53085         }
53086       }
53087       dispatch10.call("change", this);
53088       if (updateUrl) {
53089         var rangeString;
53090         if (_fromDate || _toDate) {
53091           rangeString = (_fromDate || "") + "_" + (_toDate || "");
53092         }
53093         setUrlFilterValue("photo_dates", rangeString);
53094       }
53095     };
53096     photos.setUsernameFilter = function(val, updateUrl) {
53097       if (val && typeof val === "string")
53098         val = val.replace(/;/g, ",").split(",");
53099       if (val) {
53100         val = val.map((d) => d.trim()).filter(Boolean);
53101         if (!val.length) {
53102           val = null;
53103         }
53104       }
53105       _usernames = val;
53106       dispatch10.call("change", this);
53107       if (updateUrl) {
53108         var hashString;
53109         if (_usernames) {
53110           hashString = _usernames.join(",");
53111         }
53112         setUrlFilterValue("photo_username", hashString);
53113       }
53114     };
53115     function setUrlFilterValue(property, val) {
53116       if (!window.mocha) {
53117         var hash = utilStringQs(window.location.hash);
53118         if (val) {
53119           if (hash[property] === val)
53120             return;
53121           hash[property] = val;
53122         } else {
53123           if (!(property in hash))
53124             return;
53125           delete hash[property];
53126         }
53127         window.location.replace("#" + utilQsString(hash, true));
53128       }
53129     }
53130     function showsLayer(id2) {
53131       var layer = context.layers().layer(id2);
53132       return layer && layer.supported() && layer.enabled();
53133     }
53134     photos.shouldFilterByDate = function() {
53135       return showsLayer("mapillary") || showsLayer("kartaview") || showsLayer("streetside");
53136     };
53137     photos.shouldFilterByPhotoType = function() {
53138       return showsLayer("mapillary") || showsLayer("streetside") && showsLayer("kartaview");
53139     };
53140     photos.shouldFilterByUsername = function() {
53141       return !showsLayer("mapillary") && showsLayer("kartaview") && !showsLayer("streetside");
53142     };
53143     photos.showsPhotoType = function(val) {
53144       if (!photos.shouldFilterByPhotoType())
53145         return true;
53146       return _shownPhotoTypes.indexOf(val) !== -1;
53147     };
53148     photos.showsFlat = function() {
53149       return photos.showsPhotoType("flat");
53150     };
53151     photos.showsPanoramic = function() {
53152       return photos.showsPhotoType("panoramic");
53153     };
53154     photos.fromDate = function() {
53155       return _fromDate;
53156     };
53157     photos.toDate = function() {
53158       return _toDate;
53159     };
53160     photos.togglePhotoType = function(val) {
53161       var index = _shownPhotoTypes.indexOf(val);
53162       if (index !== -1) {
53163         _shownPhotoTypes.splice(index, 1);
53164       } else {
53165         _shownPhotoTypes.push(val);
53166       }
53167       dispatch10.call("change", this);
53168       return photos;
53169     };
53170     photos.usernames = function() {
53171       return _usernames;
53172     };
53173     photos.init = function() {
53174       var hash = utilStringQs(window.location.hash);
53175       if (hash.photo_dates) {
53176         var parts = /^(.*)[–_](.*)$/g.exec(hash.photo_dates.trim());
53177         this.setDateFilter("fromDate", parts && parts.length >= 2 && parts[1], false);
53178         this.setDateFilter("toDate", parts && parts.length >= 3 && parts[2], false);
53179       }
53180       if (hash.photo_username) {
53181         this.setUsernameFilter(hash.photo_username, false);
53182       }
53183       if (hash.photo_overlay) {
53184         var hashOverlayIDs = hash.photo_overlay.replace(/;/g, ",").split(",");
53185         hashOverlayIDs.forEach(function(id2) {
53186           if (id2 === "openstreetcam")
53187             id2 = "kartaview";
53188           var layer2 = _layerIDs.indexOf(id2) !== -1 && context.layers().layer(id2);
53189           if (layer2 && !layer2.enabled())
53190             layer2.enabled(true);
53191         });
53192       }
53193       if (hash.photo) {
53194         var photoIds = hash.photo.replace(/;/g, ",").split(",");
53195         var photoId = photoIds.length && photoIds[0].trim();
53196         var results = /(.*)\/(.*)/g.exec(photoId);
53197         if (results && results.length >= 3) {
53198           var serviceId = results[1];
53199           if (serviceId === "openstreetcam")
53200             serviceId = "kartaview";
53201           var photoKey = results[2];
53202           var service = services[serviceId];
53203           if (service && service.ensureViewerLoaded) {
53204             var layer = _layerIDs.indexOf(serviceId) !== -1 && context.layers().layer(serviceId);
53205             if (layer && !layer.enabled())
53206               layer.enabled(true);
53207             var baselineTime = Date.now();
53208             service.on("loadedImages.rendererPhotos", function() {
53209               if (Date.now() - baselineTime > 45e3) {
53210                 service.on("loadedImages.rendererPhotos", null);
53211                 return;
53212               }
53213               if (!service.cachedImage(photoKey))
53214                 return;
53215               service.on("loadedImages.rendererPhotos", null);
53216               service.ensureViewerLoaded(context).then(function() {
53217                 service.selectImage(context, photoKey).showViewer(context);
53218               });
53219             });
53220           }
53221         }
53222       }
53223       context.layers().on("change.rendererPhotos", updateStorage);
53224     };
53225     return utilRebind(photos, dispatch10, "on");
53226   }
53227
53228   // modules/ui/account.js
53229   function uiAccount(context) {
53230     const osm = context.connection();
53231     function updateUserDetails(selection2) {
53232       if (!osm)
53233         return;
53234       if (!osm.authenticated()) {
53235         render(selection2, null);
53236       } else {
53237         osm.userDetails((err, user) => render(selection2, user));
53238       }
53239     }
53240     function render(selection2, user) {
53241       let userInfo = selection2.select(".userInfo");
53242       let loginLogout = selection2.select(".loginLogout");
53243       if (user) {
53244         userInfo.html("").classed("hide", false);
53245         let userLink = userInfo.append("a").attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
53246         if (user.image_url) {
53247           userLink.append("img").attr("class", "icon pre-text user-icon").attr("src", user.image_url);
53248         } else {
53249           userLink.call(svgIcon("#iD-icon-avatar", "pre-text light"));
53250         }
53251         userLink.append("span").attr("class", "label").html(user.display_name);
53252         loginLogout.classed("hide", false).select("a").text(_t("logout")).on("click", (e) => {
53253           e.preventDefault();
53254           osm.logout();
53255           tryLogout();
53256         });
53257       } else {
53258         userInfo.html("").classed("hide", true);
53259         loginLogout.classed("hide", false).select("a").text(_t("login")).on("click", (e) => {
53260           e.preventDefault();
53261           osm.authenticate();
53262         });
53263       }
53264     }
53265     function tryLogout() {
53266       if (!osm)
53267         return;
53268       const url = osm.getUrlRoot() + "/logout?referer=%2Flogin";
53269       const w = 600;
53270       const h = 550;
53271       const settings = [
53272         ["width", w],
53273         ["height", h],
53274         ["left", window.screen.width / 2 - w / 2],
53275         ["top", window.screen.height / 2 - h / 2]
53276       ].map((x) => x.join("=")).join(",");
53277       window.open(url, "_blank", settings);
53278     }
53279     return function(selection2) {
53280       if (!osm)
53281         return;
53282       selection2.append("li").attr("class", "userInfo").classed("hide", true);
53283       selection2.append("li").attr("class", "loginLogout").classed("hide", true).append("a").attr("href", "#");
53284       osm.on("change.account", () => updateUserDetails(selection2));
53285       updateUserDetails(selection2);
53286     };
53287   }
53288
53289   // modules/ui/attribution.js
53290   function uiAttribution(context) {
53291     let _selection = select_default2(null);
53292     function render(selection2, data, klass) {
53293       let div = selection2.selectAll(`.${klass}`).data([0]);
53294       div = div.enter().append("div").attr("class", klass).merge(div);
53295       let attributions = div.selectAll(".attribution").data(data, (d) => d.id);
53296       attributions.exit().remove();
53297       attributions = attributions.enter().append("span").attr("class", "attribution").each((d, i2, nodes) => {
53298         let attribution = select_default2(nodes[i2]);
53299         if (d.terms_html) {
53300           attribution.html(d.terms_html);
53301           return;
53302         }
53303         if (d.terms_url) {
53304           attribution = attribution.append("a").attr("href", d.terms_url).attr("target", "_blank");
53305         }
53306         const sourceID = d.id.replace(/\./g, "<TX_DOT>");
53307         const terms_text = _t(
53308           `imagery.${sourceID}.attribution.text`,
53309           { default: d.terms_text || d.id || d.name() }
53310         );
53311         if (d.icon && !d.overlay) {
53312           attribution.append("img").attr("class", "source-image").attr("src", d.icon);
53313         }
53314         attribution.append("span").attr("class", "attribution-text").text(terms_text);
53315       }).merge(attributions);
53316       let copyright = attributions.selectAll(".copyright-notice").data((d) => {
53317         let notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
53318         return notice ? [notice] : [];
53319       });
53320       copyright.exit().remove();
53321       copyright = copyright.enter().append("span").attr("class", "copyright-notice").merge(copyright);
53322       copyright.text(String);
53323     }
53324     function update() {
53325       let baselayer = context.background().baseLayerSource();
53326       _selection.call(render, baselayer ? [baselayer] : [], "base-layer-attribution");
53327       const z = context.map().zoom();
53328       let overlays = context.background().overlayLayerSources() || [];
53329       _selection.call(render, overlays.filter((s) => s.validZoom(z)), "overlay-layer-attribution");
53330     }
53331     return function(selection2) {
53332       _selection = selection2;
53333       context.background().on("change.attribution", update);
53334       context.map().on("move.attribution", throttle_default(update, 400, { leading: false }));
53335       update();
53336     };
53337   }
53338
53339   // modules/ui/contributors.js
53340   function uiContributors(context) {
53341     var osm = context.connection(), debouncedUpdate = debounce_default(function() {
53342       update();
53343     }, 1e3), limit = 4, hidden = false, wrap2 = select_default2(null);
53344     function update() {
53345       if (!osm)
53346         return;
53347       var users = {}, entities = context.history().intersects(context.map().extent());
53348       entities.forEach(function(entity) {
53349         if (entity && entity.user)
53350           users[entity.user] = true;
53351       });
53352       var u = Object.keys(users), subset = u.slice(0, u.length > limit ? limit - 1 : limit);
53353       wrap2.html("").call(svgIcon("#iD-icon-nearby", "pre-text light"));
53354       var userList = select_default2(document.createElement("span"));
53355       userList.selectAll().data(subset).enter().append("a").attr("class", "user-link").attr("href", function(d) {
53356         return osm.userURL(d);
53357       }).attr("target", "_blank").text(String);
53358       if (u.length > limit) {
53359         var count = select_default2(document.createElement("span"));
53360         var othersNum = u.length - limit + 1;
53361         count.append("a").attr("target", "_blank").attr("href", function() {
53362           return osm.changesetsURL(context.map().center(), context.map().zoom());
53363         }).text(othersNum);
53364         wrap2.append("span").html(_t.html("contributors.truncated_list", { n: othersNum, users: { html: userList.html() }, count: { html: count.html() } }));
53365       } else {
53366         wrap2.append("span").html(_t.html("contributors.list", { users: { html: userList.html() } }));
53367       }
53368       if (!u.length) {
53369         hidden = true;
53370         wrap2.transition().style("opacity", 0);
53371       } else if (hidden) {
53372         wrap2.transition().style("opacity", 1);
53373       }
53374     }
53375     return function(selection2) {
53376       if (!osm)
53377         return;
53378       wrap2 = selection2;
53379       update();
53380       osm.on("loaded.contributors", debouncedUpdate);
53381       context.map().on("move.contributors", debouncedUpdate);
53382     };
53383   }
53384
53385   // modules/ui/popover.js
53386   var _popoverID = 0;
53387   function uiPopover(klass) {
53388     var _id = _popoverID++;
53389     var _anchorSelection = select_default2(null);
53390     var popover = function(selection2) {
53391       _anchorSelection = selection2;
53392       selection2.each(setup);
53393     };
53394     var _animation = utilFunctor(false);
53395     var _placement = utilFunctor("top");
53396     var _alignment = utilFunctor("center");
53397     var _scrollContainer = utilFunctor(select_default2(null));
53398     var _content;
53399     var _displayType = utilFunctor("");
53400     var _hasArrow = utilFunctor(true);
53401     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
53402     popover.displayType = function(val) {
53403       if (arguments.length) {
53404         _displayType = utilFunctor(val);
53405         return popover;
53406       } else {
53407         return _displayType;
53408       }
53409     };
53410     popover.hasArrow = function(val) {
53411       if (arguments.length) {
53412         _hasArrow = utilFunctor(val);
53413         return popover;
53414       } else {
53415         return _hasArrow;
53416       }
53417     };
53418     popover.placement = function(val) {
53419       if (arguments.length) {
53420         _placement = utilFunctor(val);
53421         return popover;
53422       } else {
53423         return _placement;
53424       }
53425     };
53426     popover.alignment = function(val) {
53427       if (arguments.length) {
53428         _alignment = utilFunctor(val);
53429         return popover;
53430       } else {
53431         return _alignment;
53432       }
53433     };
53434     popover.scrollContainer = function(val) {
53435       if (arguments.length) {
53436         _scrollContainer = utilFunctor(val);
53437         return popover;
53438       } else {
53439         return _scrollContainer;
53440       }
53441     };
53442     popover.content = function(val) {
53443       if (arguments.length) {
53444         _content = val;
53445         return popover;
53446       } else {
53447         return _content;
53448       }
53449     };
53450     popover.isShown = function() {
53451       var popoverSelection = _anchorSelection.select(".popover-" + _id);
53452       return !popoverSelection.empty() && popoverSelection.classed("in");
53453     };
53454     popover.show = function() {
53455       _anchorSelection.each(show);
53456     };
53457     popover.updateContent = function() {
53458       _anchorSelection.each(updateContent);
53459     };
53460     popover.hide = function() {
53461       _anchorSelection.each(hide);
53462     };
53463     popover.toggle = function() {
53464       _anchorSelection.each(toggle);
53465     };
53466     popover.destroy = function(selection2, selector) {
53467       selector = selector || ".popover-" + _id;
53468       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() {
53469         return this.getAttribute("data-original-title") || this.getAttribute("title");
53470       }).attr("data-original-title", null).selectAll(selector).remove();
53471     };
53472     popover.destroyAny = function(selection2) {
53473       selection2.call(popover.destroy, ".popover");
53474     };
53475     function setup() {
53476       var anchor = select_default2(this);
53477       var animate = _animation.apply(this, arguments);
53478       var popoverSelection = anchor.selectAll(".popover-" + _id).data([0]);
53479       var enter = popoverSelection.enter().append("div").attr("class", "popover popover-" + _id + " " + (klass ? klass : "")).classed("arrowed", _hasArrow.apply(this, arguments));
53480       enter.append("div").attr("class", "popover-arrow");
53481       enter.append("div").attr("class", "popover-inner");
53482       popoverSelection = enter.merge(popoverSelection);
53483       if (animate) {
53484         popoverSelection.classed("fade", true);
53485       }
53486       var display = _displayType.apply(this, arguments);
53487       if (display === "hover") {
53488         var _lastNonMouseEnterTime;
53489         anchor.on(_pointerPrefix + "enter.popover", function(d3_event) {
53490           if (d3_event.pointerType) {
53491             if (d3_event.pointerType !== "mouse") {
53492               _lastNonMouseEnterTime = d3_event.timeStamp;
53493               return;
53494             } else if (_lastNonMouseEnterTime && d3_event.timeStamp - _lastNonMouseEnterTime < 1500) {
53495               return;
53496             }
53497           }
53498           if (d3_event.buttons !== 0)
53499             return;
53500           show.apply(this, arguments);
53501         }).on(_pointerPrefix + "leave.popover", function() {
53502           hide.apply(this, arguments);
53503         }).on("focus.popover", function() {
53504           show.apply(this, arguments);
53505         }).on("blur.popover", function() {
53506           hide.apply(this, arguments);
53507         });
53508       } else if (display === "clickFocus") {
53509         anchor.on(_pointerPrefix + "down.popover", function(d3_event) {
53510           d3_event.preventDefault();
53511           d3_event.stopPropagation();
53512         }).on(_pointerPrefix + "up.popover", function(d3_event) {
53513           d3_event.preventDefault();
53514           d3_event.stopPropagation();
53515         }).on("click.popover", toggle);
53516         popoverSelection.attr("tabindex", 0).on("blur.popover", function() {
53517           anchor.each(function() {
53518             hide.apply(this, arguments);
53519           });
53520         });
53521       }
53522     }
53523     function show() {
53524       var anchor = select_default2(this);
53525       var popoverSelection = anchor.selectAll(".popover-" + _id);
53526       if (popoverSelection.empty()) {
53527         anchor.call(popover.destroy);
53528         anchor.each(setup);
53529         popoverSelection = anchor.selectAll(".popover-" + _id);
53530       }
53531       popoverSelection.classed("in", true);
53532       var displayType = _displayType.apply(this, arguments);
53533       if (displayType === "clickFocus") {
53534         anchor.classed("active", true);
53535         popoverSelection.node().focus();
53536       }
53537       anchor.each(updateContent);
53538     }
53539     function updateContent() {
53540       var anchor = select_default2(this);
53541       if (_content) {
53542         anchor.selectAll(".popover-" + _id + " > .popover-inner").call(_content.apply(this, arguments));
53543       }
53544       updatePosition.apply(this, arguments);
53545       updatePosition.apply(this, arguments);
53546       updatePosition.apply(this, arguments);
53547     }
53548     function updatePosition() {
53549       var anchor = select_default2(this);
53550       var popoverSelection = anchor.selectAll(".popover-" + _id);
53551       var scrollContainer = _scrollContainer && _scrollContainer.apply(this, arguments);
53552       var scrollNode = scrollContainer && !scrollContainer.empty() && scrollContainer.node();
53553       var scrollLeft = scrollNode ? scrollNode.scrollLeft : 0;
53554       var scrollTop = scrollNode ? scrollNode.scrollTop : 0;
53555       var placement = _placement.apply(this, arguments);
53556       popoverSelection.classed("left", false).classed("right", false).classed("top", false).classed("bottom", false).classed(placement, true);
53557       var alignment = _alignment.apply(this, arguments);
53558       var alignFactor = 0.5;
53559       if (alignment === "leading") {
53560         alignFactor = 0;
53561       } else if (alignment === "trailing") {
53562         alignFactor = 1;
53563       }
53564       var anchorFrame = getFrame(anchor.node());
53565       var popoverFrame = getFrame(popoverSelection.node());
53566       var position;
53567       switch (placement) {
53568         case "top":
53569           position = {
53570             x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
53571             y: anchorFrame.y - popoverFrame.h
53572           };
53573           break;
53574         case "bottom":
53575           position = {
53576             x: anchorFrame.x + (anchorFrame.w - popoverFrame.w) * alignFactor,
53577             y: anchorFrame.y + anchorFrame.h
53578           };
53579           break;
53580         case "left":
53581           position = {
53582             x: anchorFrame.x - popoverFrame.w,
53583             y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
53584           };
53585           break;
53586         case "right":
53587           position = {
53588             x: anchorFrame.x + anchorFrame.w,
53589             y: anchorFrame.y + (anchorFrame.h - popoverFrame.h) * alignFactor
53590           };
53591           break;
53592       }
53593       if (position) {
53594         if (scrollNode && (placement === "top" || placement === "bottom")) {
53595           var initialPosX = position.x;
53596           if (position.x + popoverFrame.w > scrollNode.offsetWidth - 10) {
53597             position.x = scrollNode.offsetWidth - 10 - popoverFrame.w;
53598           } else if (position.x < 10) {
53599             position.x = 10;
53600           }
53601           var arrow = anchor.selectAll(".popover-" + _id + " > .popover-arrow");
53602           var arrowPosX = Math.min(Math.max(popoverFrame.w / 2 - (position.x - initialPosX), 10), popoverFrame.w - 10);
53603           arrow.style("left", ~~arrowPosX + "px");
53604         }
53605         popoverSelection.style("left", ~~position.x + "px").style("top", ~~position.y + "px");
53606       } else {
53607         popoverSelection.style("left", null).style("top", null);
53608       }
53609       function getFrame(node) {
53610         var positionStyle = select_default2(node).style("position");
53611         if (positionStyle === "absolute" || positionStyle === "static") {
53612           return {
53613             x: node.offsetLeft - scrollLeft,
53614             y: node.offsetTop - scrollTop,
53615             w: node.offsetWidth,
53616             h: node.offsetHeight
53617           };
53618         } else {
53619           return {
53620             x: 0,
53621             y: 0,
53622             w: node.offsetWidth,
53623             h: node.offsetHeight
53624           };
53625         }
53626       }
53627     }
53628     function hide() {
53629       var anchor = select_default2(this);
53630       if (_displayType.apply(this, arguments) === "clickFocus") {
53631         anchor.classed("active", false);
53632       }
53633       anchor.selectAll(".popover-" + _id).classed("in", false);
53634     }
53635     function toggle() {
53636       if (select_default2(this).select(".popover-" + _id).classed("in")) {
53637         hide.apply(this, arguments);
53638       } else {
53639         show.apply(this, arguments);
53640       }
53641     }
53642     return popover;
53643   }
53644
53645   // modules/ui/tooltip.js
53646   function uiTooltip(klass) {
53647     var tooltip = uiPopover((klass || "") + " tooltip").displayType("hover");
53648     var _title = function() {
53649       var title = this.getAttribute("data-original-title");
53650       if (title) {
53651         return title;
53652       } else {
53653         title = this.getAttribute("title");
53654         this.removeAttribute("title");
53655         this.setAttribute("data-original-title", title);
53656       }
53657       return title;
53658     };
53659     var _heading = utilFunctor(null);
53660     var _keys = utilFunctor(null);
53661     tooltip.title = function(val) {
53662       if (!arguments.length)
53663         return _title;
53664       _title = utilFunctor(val);
53665       return tooltip;
53666     };
53667     tooltip.heading = function(val) {
53668       if (!arguments.length)
53669         return _heading;
53670       _heading = utilFunctor(val);
53671       return tooltip;
53672     };
53673     tooltip.keys = function(val) {
53674       if (!arguments.length)
53675         return _keys;
53676       _keys = utilFunctor(val);
53677       return tooltip;
53678     };
53679     tooltip.content(function() {
53680       var heading = _heading.apply(this, arguments);
53681       var text2 = _title.apply(this, arguments);
53682       var keys2 = _keys.apply(this, arguments);
53683       var headingCallback = typeof heading === "function" ? heading : (s) => s.text(heading);
53684       var textCallback = typeof text2 === "function" ? text2 : (s) => s.text(text2);
53685       return function(selection2) {
53686         var headingSelect = selection2.selectAll(".tooltip-heading").data(heading ? [heading] : []);
53687         headingSelect.exit().remove();
53688         headingSelect.enter().append("div").attr("class", "tooltip-heading").merge(headingSelect).text("").call(headingCallback);
53689         var textSelect = selection2.selectAll(".tooltip-text").data(text2 ? [text2] : []);
53690         textSelect.exit().remove();
53691         textSelect.enter().append("div").attr("class", "tooltip-text").merge(textSelect).text("").call(textCallback);
53692         var keyhintWrap = selection2.selectAll(".keyhint-wrap").data(keys2 && keys2.length ? [0] : []);
53693         keyhintWrap.exit().remove();
53694         var keyhintWrapEnter = keyhintWrap.enter().append("div").attr("class", "keyhint-wrap");
53695         keyhintWrapEnter.append("span").call(_t.append("tooltip_keyhint"));
53696         keyhintWrap = keyhintWrapEnter.merge(keyhintWrap);
53697         keyhintWrap.selectAll("kbd.shortcut").data(keys2 && keys2.length ? keys2 : []).enter().append("kbd").attr("class", "shortcut").text(function(d) {
53698           return d;
53699         });
53700       };
53701     });
53702     return tooltip;
53703   }
53704
53705   // modules/ui/edit_menu.js
53706   function uiEditMenu(context) {
53707     var dispatch10 = dispatch_default("toggled");
53708     var _menu = select_default2(null);
53709     var _operations = [];
53710     var _anchorLoc = [0, 0];
53711     var _anchorLocLonLat = [0, 0];
53712     var _triggerType = "";
53713     var _vpTopMargin = 85;
53714     var _vpBottomMargin = 45;
53715     var _vpSideMargin = 35;
53716     var _menuTop = false;
53717     var _menuHeight;
53718     var _menuWidth;
53719     var _verticalPadding = 4;
53720     var _tooltipWidth = 210;
53721     var _menuSideMargin = 10;
53722     var _tooltips = [];
53723     var editMenu = function(selection2) {
53724       var isTouchMenu = _triggerType.includes("touch") || _triggerType.includes("pen");
53725       var ops = _operations.filter(function(op) {
53726         return !isTouchMenu || !op.mouseOnly;
53727       });
53728       if (!ops.length)
53729         return;
53730       _tooltips = [];
53731       _menuTop = isTouchMenu;
53732       var showLabels = isTouchMenu;
53733       var buttonHeight = showLabels ? 32 : 34;
53734       if (showLabels) {
53735         _menuWidth = 52 + Math.min(120, 6 * Math.max.apply(Math, ops.map(function(op) {
53736           return op.title.length;
53737         })));
53738       } else {
53739         _menuWidth = 44;
53740       }
53741       _menuHeight = _verticalPadding * 2 + ops.length * buttonHeight;
53742       _menu = selection2.append("div").attr("class", "edit-menu").classed("touch-menu", isTouchMenu).style("padding", _verticalPadding + "px 0");
53743       var buttons = _menu.selectAll(".edit-menu-item").data(ops);
53744       var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
53745         return "edit-menu-item edit-menu-item-" + d.id;
53746       }).style("height", buttonHeight + "px").on("click", click).on("pointerup", pointerup).on("pointerdown mousedown", function pointerdown(d3_event) {
53747         d3_event.stopPropagation();
53748       }).on("mouseenter.highlight", function(d3_event, d) {
53749         if (!d.relatedEntityIds || select_default2(this).classed("disabled"))
53750           return;
53751         utilHighlightEntities(d.relatedEntityIds(), true, context);
53752       }).on("mouseleave.highlight", function(d3_event, d) {
53753         if (!d.relatedEntityIds)
53754           return;
53755         utilHighlightEntities(d.relatedEntityIds(), false, context);
53756       });
53757       buttonsEnter.each(function(d) {
53758         var tooltip = uiTooltip().heading(() => d.title).title(d.tooltip).keys([d.keys[0]]);
53759         _tooltips.push(tooltip);
53760         select_default2(this).call(tooltip).append("div").attr("class", "icon-wrap").call(svgIcon(d.icon && d.icon() || "#iD-operation-" + d.id, "operation"));
53761       });
53762       if (showLabels) {
53763         buttonsEnter.append("span").attr("class", "label").each(function(d) {
53764           select_default2(this).call(d.title);
53765         });
53766       }
53767       buttonsEnter.merge(buttons).classed("disabled", function(d) {
53768         return d.disabled();
53769       });
53770       updatePosition();
53771       var initialScale = context.projection.scale();
53772       context.map().on("move.edit-menu", function() {
53773         if (initialScale !== context.projection.scale()) {
53774           editMenu.close();
53775         }
53776       }).on("drawn.edit-menu", function(info) {
53777         if (info.full)
53778           updatePosition();
53779       });
53780       var lastPointerUpType;
53781       function pointerup(d3_event) {
53782         lastPointerUpType = d3_event.pointerType;
53783       }
53784       function click(d3_event, operation) {
53785         d3_event.stopPropagation();
53786         if (operation.relatedEntityIds) {
53787           utilHighlightEntities(operation.relatedEntityIds(), false, context);
53788         }
53789         if (operation.disabled()) {
53790           if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
53791             context.ui().flash.duration(4e3).iconName("#iD-operation-" + operation.id).iconClass("operation disabled").label(operation.tooltip())();
53792           }
53793         } else {
53794           if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
53795             context.ui().flash.duration(2e3).iconName("#iD-operation-" + operation.id).iconClass("operation").label(operation.annotation() || operation.title)();
53796           }
53797           operation();
53798           editMenu.close();
53799         }
53800         lastPointerUpType = null;
53801       }
53802       dispatch10.call("toggled", this, true);
53803     };
53804     function updatePosition() {
53805       if (!_menu || _menu.empty())
53806         return;
53807       var anchorLoc = context.projection(_anchorLocLonLat);
53808       var viewport = context.surfaceRect();
53809       if (anchorLoc[0] < 0 || anchorLoc[0] > viewport.width || anchorLoc[1] < 0 || anchorLoc[1] > viewport.height) {
53810         editMenu.close();
53811         return;
53812       }
53813       var menuLeft = displayOnLeft(viewport);
53814       var offset = [0, 0];
53815       offset[0] = menuLeft ? -1 * (_menuSideMargin + _menuWidth) : _menuSideMargin;
53816       if (_menuTop) {
53817         if (anchorLoc[1] - _menuHeight < _vpTopMargin) {
53818           offset[1] = -anchorLoc[1] + _vpTopMargin;
53819         } else {
53820           offset[1] = -_menuHeight;
53821         }
53822       } else {
53823         if (anchorLoc[1] + _menuHeight > viewport.height - _vpBottomMargin) {
53824           offset[1] = -anchorLoc[1] - _menuHeight + viewport.height - _vpBottomMargin;
53825         } else {
53826           offset[1] = 0;
53827         }
53828       }
53829       var origin = geoVecAdd(anchorLoc, offset);
53830       _menu.style("left", origin[0] + "px").style("top", origin[1] + "px");
53831       var tooltipSide = tooltipPosition(viewport, menuLeft);
53832       _tooltips.forEach(function(tooltip) {
53833         tooltip.placement(tooltipSide);
53834       });
53835       function displayOnLeft(viewport2) {
53836         if (_mainLocalizer.textDirection() === "ltr") {
53837           if (anchorLoc[0] + _menuSideMargin + _menuWidth > viewport2.width - _vpSideMargin) {
53838             return true;
53839           }
53840           return false;
53841         } else {
53842           if (anchorLoc[0] - _menuSideMargin - _menuWidth < _vpSideMargin) {
53843             return false;
53844           }
53845           return true;
53846         }
53847       }
53848       function tooltipPosition(viewport2, menuLeft2) {
53849         if (_mainLocalizer.textDirection() === "ltr") {
53850           if (menuLeft2) {
53851             return "left";
53852           }
53853           if (anchorLoc[0] + _menuSideMargin + _menuWidth + _tooltipWidth > viewport2.width - _vpSideMargin) {
53854             return "left";
53855           }
53856           return "right";
53857         } else {
53858           if (!menuLeft2) {
53859             return "right";
53860           }
53861           if (anchorLoc[0] - _menuSideMargin - _menuWidth - _tooltipWidth < _vpSideMargin) {
53862             return "right";
53863           }
53864           return "left";
53865         }
53866       }
53867     }
53868     editMenu.close = function() {
53869       context.map().on("move.edit-menu", null).on("drawn.edit-menu", null);
53870       _menu.remove();
53871       _tooltips = [];
53872       dispatch10.call("toggled", this, false);
53873     };
53874     editMenu.anchorLoc = function(val) {
53875       if (!arguments.length)
53876         return _anchorLoc;
53877       _anchorLoc = val;
53878       _anchorLocLonLat = context.projection.invert(_anchorLoc);
53879       return editMenu;
53880     };
53881     editMenu.triggerType = function(val) {
53882       if (!arguments.length)
53883         return _triggerType;
53884       _triggerType = val;
53885       return editMenu;
53886     };
53887     editMenu.operations = function(val) {
53888       if (!arguments.length)
53889         return _operations;
53890       _operations = val;
53891       return editMenu;
53892     };
53893     return utilRebind(editMenu, dispatch10, "on");
53894   }
53895
53896   // modules/ui/feature_info.js
53897   function uiFeatureInfo(context) {
53898     function update(selection2) {
53899       var features = context.features();
53900       var stats = features.stats();
53901       var count = 0;
53902       var hiddenList = features.hidden().map(function(k) {
53903         if (stats[k]) {
53904           count += stats[k];
53905           return _t.append("inspector.title_count", {
53906             title: _t("feature." + k + ".description"),
53907             count: stats[k]
53908           });
53909         }
53910         return null;
53911       }).filter(Boolean);
53912       selection2.text("");
53913       if (hiddenList.length) {
53914         var tooltipBehavior = uiTooltip().placement("top").title(function() {
53915           return (selection3) => {
53916             hiddenList.forEach((hiddenFeature) => {
53917               selection3.append("div").call(hiddenFeature);
53918             });
53919           };
53920         });
53921         selection2.append("a").attr("class", "chip").attr("href", "#").call(_t.append("feature_info.hidden_warning", { count })).call(tooltipBehavior).on("click", function(d3_event) {
53922           tooltipBehavior.hide();
53923           d3_event.preventDefault();
53924           context.ui().togglePanes(context.container().select(".map-panes .map-data-pane"));
53925         });
53926       }
53927       selection2.classed("hide", !hiddenList.length);
53928     }
53929     return function(selection2) {
53930       update(selection2);
53931       context.features().on("change.feature_info", function() {
53932         update(selection2);
53933       });
53934     };
53935   }
53936
53937   // modules/ui/flash.js
53938   function uiFlash(context) {
53939     var _flashTimer;
53940     var _duration = 2e3;
53941     var _iconName = "#iD-icon-no";
53942     var _iconClass = "disabled";
53943     var _label = (s) => s.text("");
53944     function flash() {
53945       if (_flashTimer) {
53946         _flashTimer.stop();
53947       }
53948       context.container().select(".main-footer-wrap").classed("footer-hide", true).classed("footer-show", false);
53949       context.container().select(".flash-wrap").classed("footer-hide", false).classed("footer-show", true);
53950       var content = context.container().select(".flash-wrap").selectAll(".flash-content").data([0]);
53951       var contentEnter = content.enter().append("div").attr("class", "flash-content");
53952       var iconEnter = contentEnter.append("svg").attr("class", "flash-icon icon").append("g").attr("transform", "translate(10,10)");
53953       iconEnter.append("circle").attr("r", 9);
53954       iconEnter.append("use").attr("transform", "translate(-7,-7)").attr("width", "14").attr("height", "14");
53955       contentEnter.append("div").attr("class", "flash-text");
53956       content = content.merge(contentEnter);
53957       content.selectAll(".flash-icon").attr("class", "icon flash-icon " + (_iconClass || ""));
53958       content.selectAll(".flash-icon use").attr("xlink:href", _iconName);
53959       content.selectAll(".flash-text").attr("class", "flash-text").call(_label);
53960       _flashTimer = timeout_default(function() {
53961         _flashTimer = null;
53962         context.container().select(".main-footer-wrap").classed("footer-hide", false).classed("footer-show", true);
53963         context.container().select(".flash-wrap").classed("footer-hide", true).classed("footer-show", false);
53964       }, _duration);
53965       return content;
53966     }
53967     flash.duration = function(_) {
53968       if (!arguments.length)
53969         return _duration;
53970       _duration = _;
53971       return flash;
53972     };
53973     flash.label = function(_) {
53974       if (!arguments.length)
53975         return _label;
53976       if (typeof _ !== "function") {
53977         _label = (selection2) => selection2.text(_);
53978       } else {
53979         _label = (selection2) => selection2.text("").call(_);
53980       }
53981       return flash;
53982     };
53983     flash.iconName = function(_) {
53984       if (!arguments.length)
53985         return _iconName;
53986       _iconName = _;
53987       return flash;
53988     };
53989     flash.iconClass = function(_) {
53990       if (!arguments.length)
53991         return _iconClass;
53992       _iconClass = _;
53993       return flash;
53994     };
53995     return flash;
53996   }
53997
53998   // modules/ui/full_screen.js
53999   function uiFullScreen(context) {
54000     var element = context.container().node();
54001     function getFullScreenFn() {
54002       if (element.requestFullscreen) {
54003         return element.requestFullscreen;
54004       } else if (element.msRequestFullscreen) {
54005         return element.msRequestFullscreen;
54006       } else if (element.mozRequestFullScreen) {
54007         return element.mozRequestFullScreen;
54008       } else if (element.webkitRequestFullscreen) {
54009         return element.webkitRequestFullscreen;
54010       }
54011     }
54012     function getExitFullScreenFn() {
54013       if (document.exitFullscreen) {
54014         return document.exitFullscreen;
54015       } else if (document.msExitFullscreen) {
54016         return document.msExitFullscreen;
54017       } else if (document.mozCancelFullScreen) {
54018         return document.mozCancelFullScreen;
54019       } else if (document.webkitExitFullscreen) {
54020         return document.webkitExitFullscreen;
54021       }
54022     }
54023     function isFullScreen() {
54024       return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
54025     }
54026     function isSupported() {
54027       return !!getFullScreenFn();
54028     }
54029     function fullScreen(d3_event) {
54030       d3_event.preventDefault();
54031       if (!isFullScreen()) {
54032         getFullScreenFn().apply(element);
54033       } else {
54034         getExitFullScreenFn().apply(document);
54035       }
54036     }
54037     return function() {
54038       if (!isSupported())
54039         return;
54040       var detected = utilDetect();
54041       var keys2 = detected.os === "mac" ? [uiCmd("\u2303\u2318F"), "f11"] : ["f11"];
54042       context.keybinding().on(keys2, fullScreen);
54043     };
54044   }
54045
54046   // modules/ui/geolocate.js
54047   function uiGeolocate(context) {
54048     var _geolocationOptions = {
54049       // prioritize speed and power usage over precision
54050       enableHighAccuracy: false,
54051       // don't hang indefinitely getting the location
54052       timeout: 6e3
54053       // 6sec
54054     };
54055     var _locating = uiLoading(context).message(_t.html("geolocate.locating")).blocking(true);
54056     var _layer = context.layers().layer("geolocate");
54057     var _position;
54058     var _extent;
54059     var _timeoutID;
54060     var _button = select_default2(null);
54061     function click() {
54062       if (context.inIntro())
54063         return;
54064       if (!_layer.enabled() && !_locating.isShown()) {
54065         _timeoutID = setTimeout(
54066           error,
54067           1e4
54068           /* 10sec */
54069         );
54070         context.container().call(_locating);
54071         navigator.geolocation.getCurrentPosition(success, error, _geolocationOptions);
54072       } else {
54073         _locating.close();
54074         _layer.enabled(null, false);
54075         updateButtonState();
54076       }
54077     }
54078     function zoomTo() {
54079       context.enter(modeBrowse(context));
54080       var map2 = context.map();
54081       _layer.enabled(_position, true);
54082       updateButtonState();
54083       map2.centerZoomEase(_extent.center(), Math.min(20, map2.extentZoom(_extent)));
54084     }
54085     function success(geolocation) {
54086       _position = geolocation;
54087       var coords = _position.coords;
54088       _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
54089       zoomTo();
54090       finish();
54091     }
54092     function error() {
54093       if (_position) {
54094         zoomTo();
54095       } else {
54096         context.ui().flash.label(_t.append("geolocate.location_unavailable")).iconName("#iD-icon-geolocate")();
54097       }
54098       finish();
54099     }
54100     function finish() {
54101       _locating.close();
54102       if (_timeoutID) {
54103         clearTimeout(_timeoutID);
54104       }
54105       _timeoutID = void 0;
54106     }
54107     function updateButtonState() {
54108       _button.classed("active", _layer.enabled());
54109       _button.attr("aria-pressed", _layer.enabled());
54110     }
54111     return function(selection2) {
54112       if (!navigator.geolocation || !navigator.geolocation.getCurrentPosition)
54113         return;
54114       _button = selection2.append("button").on("click", click).attr("aria-pressed", false).call(svgIcon("#iD-icon-geolocate", "light")).call(
54115         uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(() => _t.append("geolocate.title")).keys([_t("geolocate.key")])
54116       );
54117       context.keybinding().on(_t("geolocate.key"), click);
54118     };
54119   }
54120
54121   // modules/ui/panels/background.js
54122   function uiPanelBackground(context) {
54123     var background = context.background();
54124     var _currSourceName = null;
54125     var _metadata = {};
54126     var _metadataKeys = [
54127       "zoom",
54128       "vintage",
54129       "source",
54130       "description",
54131       "resolution",
54132       "accuracy"
54133     ];
54134     var debouncedRedraw = debounce_default(redraw, 250);
54135     function redraw(selection2) {
54136       var source = background.baseLayerSource();
54137       if (!source)
54138         return;
54139       var isDG = source.id.match(/^DigitalGlobe/i) !== null;
54140       var sourceLabel = source.label();
54141       if (_currSourceName !== sourceLabel) {
54142         _currSourceName = sourceLabel;
54143         _metadata = {};
54144       }
54145       selection2.text("");
54146       var list = selection2.append("ul").attr("class", "background-info");
54147       list.append("li").call(_currSourceName);
54148       _metadataKeys.forEach(function(k) {
54149         if (isDG && k === "vintage")
54150           return;
54151         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]);
54152       });
54153       debouncedGetMetadata(selection2);
54154       var toggleTiles = context.getDebug("tile") ? "hide_tiles" : "show_tiles";
54155       selection2.append("a").call(_t.append("info_panels.background." + toggleTiles)).attr("href", "#").attr("class", "button button-toggle-tiles").on("click", function(d3_event) {
54156         d3_event.preventDefault();
54157         context.setDebug("tile", !context.getDebug("tile"));
54158         selection2.call(redraw);
54159       });
54160       if (isDG) {
54161         var key = source.id + "-vintage";
54162         var sourceVintage = context.background().findSource(key);
54163         var showsVintage = context.background().showsLayer(sourceVintage);
54164         var toggleVintage = showsVintage ? "hide_vintage" : "show_vintage";
54165         selection2.append("a").call(_t.append("info_panels.background." + toggleVintage)).attr("href", "#").attr("class", "button button-toggle-vintage").on("click", function(d3_event) {
54166           d3_event.preventDefault();
54167           context.background().toggleOverlayLayer(sourceVintage);
54168           selection2.call(redraw);
54169         });
54170       }
54171       ["DigitalGlobe-Premium", "DigitalGlobe-Standard"].forEach(function(layerId) {
54172         if (source.id !== layerId) {
54173           var key2 = layerId + "-vintage";
54174           var sourceVintage2 = context.background().findSource(key2);
54175           if (context.background().showsLayer(sourceVintage2)) {
54176             context.background().toggleOverlayLayer(sourceVintage2);
54177           }
54178         }
54179       });
54180     }
54181     var debouncedGetMetadata = debounce_default(getMetadata, 250);
54182     function getMetadata(selection2) {
54183       var tile = context.container().select(".layer-background img.tile-center");
54184       if (tile.empty())
54185         return;
54186       var sourceName = _currSourceName;
54187       var d = tile.datum();
54188       var zoom = d && d.length >= 3 && d[2] || Math.floor(context.map().zoom());
54189       var center = context.map().center();
54190       _metadata.zoom = String(zoom);
54191       selection2.selectAll(".background-info-list-zoom").classed("hide", false).selectAll(".background-info-span-zoom").text(_metadata.zoom);
54192       if (!d || !d.length >= 3)
54193         return;
54194       background.baseLayerSource().getMetadata(center, d, function(err, result) {
54195         if (err || _currSourceName !== sourceName)
54196           return;
54197         var vintage = result.vintage;
54198         _metadata.vintage = vintage && vintage.range || _t("info_panels.background.unknown");
54199         selection2.selectAll(".background-info-list-vintage").classed("hide", false).selectAll(".background-info-span-vintage").text(_metadata.vintage);
54200         _metadataKeys.forEach(function(k) {
54201           if (k === "zoom" || k === "vintage")
54202             return;
54203           var val = result[k];
54204           _metadata[k] = val;
54205           selection2.selectAll(".background-info-list-" + k).classed("hide", !val).selectAll(".background-info-span-" + k).text(val);
54206         });
54207       });
54208     }
54209     var panel = function(selection2) {
54210       selection2.call(redraw);
54211       context.map().on("drawn.info-background", function() {
54212         selection2.call(debouncedRedraw);
54213       }).on("move.info-background", function() {
54214         selection2.call(debouncedGetMetadata);
54215       });
54216     };
54217     panel.off = function() {
54218       context.map().on("drawn.info-background", null).on("move.info-background", null);
54219     };
54220     panel.id = "background";
54221     panel.label = _t.append("info_panels.background.title");
54222     panel.key = _t("info_panels.background.key");
54223     return panel;
54224   }
54225
54226   // modules/ui/panels/history.js
54227   function uiPanelHistory(context) {
54228     var osm;
54229     function displayTimestamp(timestamp) {
54230       if (!timestamp)
54231         return _t("info_panels.history.unknown");
54232       var options2 = {
54233         day: "numeric",
54234         month: "short",
54235         year: "numeric",
54236         hour: "numeric",
54237         minute: "numeric",
54238         second: "numeric"
54239       };
54240       var d = new Date(timestamp);
54241       if (isNaN(d.getTime()))
54242         return _t("info_panels.history.unknown");
54243       return d.toLocaleString(_mainLocalizer.localeCode(), options2);
54244     }
54245     function displayUser(selection2, userName) {
54246       if (!userName) {
54247         selection2.append("span").call(_t.append("info_panels.history.unknown"));
54248         return;
54249       }
54250       selection2.append("span").attr("class", "user-name").text(userName);
54251       var links = selection2.append("div").attr("class", "links");
54252       if (osm) {
54253         links.append("a").attr("class", "user-osm-link").attr("href", osm.userURL(userName)).attr("target", "_blank").call(_t.append("info_panels.history.profile_link"));
54254       }
54255       links.append("a").attr("class", "user-hdyc-link").attr("href", "https://hdyc.neis-one.org/?" + userName).attr("target", "_blank").attr("tabindex", -1).text("HDYC");
54256     }
54257     function displayChangeset(selection2, changeset) {
54258       if (!changeset) {
54259         selection2.append("span").call(_t.append("info_panels.history.unknown"));
54260         return;
54261       }
54262       selection2.append("span").attr("class", "changeset-id").text(changeset);
54263       var links = selection2.append("div").attr("class", "links");
54264       if (osm) {
54265         links.append("a").attr("class", "changeset-osm-link").attr("href", osm.changesetURL(changeset)).attr("target", "_blank").call(_t.append("info_panels.history.changeset_link"));
54266       }
54267       links.append("a").attr("class", "changeset-osmcha-link").attr("href", "https://osmcha.org/changesets/" + changeset).attr("target", "_blank").text("OSMCha");
54268       links.append("a").attr("class", "changeset-achavi-link").attr("href", "https://overpass-api.de/achavi/?changeset=" + changeset).attr("target", "_blank").text("Achavi");
54269     }
54270     function redraw(selection2) {
54271       var selectedNoteID = context.selectedNoteID();
54272       osm = context.connection();
54273       var selected, note, entity;
54274       if (selectedNoteID && osm) {
54275         selected = [_t.html("note.note") + " " + selectedNoteID];
54276         note = osm.getNote(selectedNoteID);
54277       } else {
54278         selected = context.selectedIDs().filter(function(e) {
54279           return context.hasEntity(e);
54280         });
54281         if (selected.length) {
54282           entity = context.entity(selected[0]);
54283         }
54284       }
54285       var singular = selected.length === 1 ? selected[0] : null;
54286       selection2.html("");
54287       if (singular) {
54288         selection2.append("h4").attr("class", "history-heading").html(singular);
54289       } else {
54290         selection2.append("h4").attr("class", "history-heading").call(_t.append("info_panels.selected", { n: selected.length }));
54291       }
54292       if (!singular)
54293         return;
54294       if (entity) {
54295         selection2.call(redrawEntity, entity);
54296       } else if (note) {
54297         selection2.call(redrawNote, note);
54298       }
54299     }
54300     function redrawNote(selection2, note) {
54301       if (!note || note.isNew()) {
54302         selection2.append("div").call(_t.append("info_panels.history.note_no_history"));
54303         return;
54304       }
54305       var list = selection2.append("ul");
54306       list.append("li").call(_t.append("info_panels.history.note_comments", { suffix: ":" })).append("span").text(note.comments.length);
54307       if (note.comments.length) {
54308         list.append("li").call(_t.append("info_panels.history.note_created_date", { suffix: ":" })).append("span").text(displayTimestamp(note.comments[0].date));
54309         list.append("li").call(_t.append("info_panels.history.note_created_user", { suffix: ":" })).call(displayUser, note.comments[0].user);
54310       }
54311       if (osm) {
54312         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"));
54313       }
54314     }
54315     function redrawEntity(selection2, entity) {
54316       if (!entity || entity.isNew()) {
54317         selection2.append("div").call(_t.append("info_panels.history.no_history"));
54318         return;
54319       }
54320       var links = selection2.append("div").attr("class", "links");
54321       if (osm) {
54322         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"));
54323       }
54324       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");
54325       var list = selection2.append("ul");
54326       list.append("li").call(_t.append("info_panels.history.version", { suffix: ":" })).append("span").text(entity.version);
54327       list.append("li").call(_t.append("info_panels.history.last_edit", { suffix: ":" })).append("span").text(displayTimestamp(entity.timestamp));
54328       list.append("li").call(_t.append("info_panels.history.edited_by", { suffix: ":" })).call(displayUser, entity.user);
54329       list.append("li").call(_t.append("info_panels.history.changeset", { suffix: ":" })).call(displayChangeset, entity.changeset);
54330     }
54331     var panel = function(selection2) {
54332       selection2.call(redraw);
54333       context.map().on("drawn.info-history", function() {
54334         selection2.call(redraw);
54335       });
54336       context.on("enter.info-history", function() {
54337         selection2.call(redraw);
54338       });
54339     };
54340     panel.off = function() {
54341       context.map().on("drawn.info-history", null);
54342       context.on("enter.info-history", null);
54343     };
54344     panel.id = "history";
54345     panel.label = _t.append("info_panels.history.title");
54346     panel.key = _t("info_panels.history.key");
54347     return panel;
54348   }
54349
54350   // modules/util/units.js
54351   var OSM_PRECISION = 7;
54352   function displayLength(m, isImperial) {
54353     var d = m * (isImperial ? 3.28084 : 1);
54354     var unit2;
54355     if (isImperial) {
54356       if (d >= 5280) {
54357         d /= 5280;
54358         unit2 = "miles";
54359       } else {
54360         unit2 = "feet";
54361       }
54362     } else {
54363       if (d >= 1e3) {
54364         d /= 1e3;
54365         unit2 = "kilometers";
54366       } else {
54367         unit2 = "meters";
54368       }
54369     }
54370     return _t("units." + unit2, {
54371       quantity: d.toLocaleString(_mainLocalizer.localeCode(), {
54372         maximumSignificantDigits: 4
54373       })
54374     });
54375   }
54376   function displayArea(m2, isImperial) {
54377     var locale2 = _mainLocalizer.localeCode();
54378     var d = m2 * (isImperial ? 10.7639111056 : 1);
54379     var d1, d2, area;
54380     var unit1 = "";
54381     var unit2 = "";
54382     if (isImperial) {
54383       if (d >= 6969600) {
54384         d1 = d / 27878400;
54385         unit1 = "square_miles";
54386       } else {
54387         d1 = d;
54388         unit1 = "square_feet";
54389       }
54390       if (d > 4356 && d < 4356e4) {
54391         d2 = d / 43560;
54392         unit2 = "acres";
54393       }
54394     } else {
54395       if (d >= 25e4) {
54396         d1 = d / 1e6;
54397         unit1 = "square_kilometers";
54398       } else {
54399         d1 = d;
54400         unit1 = "square_meters";
54401       }
54402       if (d > 1e3 && d < 1e7) {
54403         d2 = d / 1e4;
54404         unit2 = "hectares";
54405       }
54406     }
54407     area = _t("units." + unit1, {
54408       quantity: d1.toLocaleString(locale2, {
54409         maximumSignificantDigits: 4
54410       })
54411     });
54412     if (d2) {
54413       return _t("units.area_pair", {
54414         area1: area,
54415         area2: _t("units." + unit2, {
54416           quantity: d2.toLocaleString(locale2, {
54417             maximumSignificantDigits: 2
54418           })
54419         })
54420       });
54421     } else {
54422       return area;
54423     }
54424   }
54425   function wrap(x, min3, max3) {
54426     var d = max3 - min3;
54427     return ((x - min3) % d + d) % d + min3;
54428   }
54429   function clamp2(x, min3, max3) {
54430     return Math.max(min3, Math.min(x, max3));
54431   }
54432   function displayCoordinate(deg, pos, neg) {
54433     var locale2 = _mainLocalizer.localeCode();
54434     var min3 = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
54435     var sec = (min3 - Math.floor(min3)) * 60;
54436     var displayDegrees = _t("units.arcdegrees", {
54437       quantity: Math.floor(Math.abs(deg)).toLocaleString(locale2)
54438     });
54439     var displayCoordinate2;
54440     if (Math.floor(sec) > 0) {
54441       displayCoordinate2 = displayDegrees + _t("units.arcminutes", {
54442         quantity: Math.floor(min3).toLocaleString(locale2)
54443       }) + _t("units.arcseconds", {
54444         quantity: Math.round(sec).toLocaleString(locale2)
54445       });
54446     } else if (Math.floor(min3) > 0) {
54447       displayCoordinate2 = displayDegrees + _t("units.arcminutes", {
54448         quantity: Math.round(min3).toLocaleString(locale2)
54449       });
54450     } else {
54451       displayCoordinate2 = _t("units.arcdegrees", {
54452         quantity: Math.round(Math.abs(deg)).toLocaleString(locale2)
54453       });
54454     }
54455     if (deg === 0) {
54456       return displayCoordinate2;
54457     } else {
54458       return _t("units.coordinate", {
54459         coordinate: displayCoordinate2,
54460         direction: _t("units." + (deg > 0 ? pos : neg))
54461       });
54462     }
54463   }
54464   function dmsCoordinatePair(coord2) {
54465     return _t("units.coordinate_pair", {
54466       latitude: displayCoordinate(clamp2(coord2[1], -90, 90), "north", "south"),
54467       longitude: displayCoordinate(wrap(coord2[0], -180, 180), "east", "west")
54468     });
54469   }
54470   function decimalCoordinatePair(coord2) {
54471     return _t("units.coordinate_pair", {
54472       latitude: clamp2(coord2[1], -90, 90).toFixed(OSM_PRECISION),
54473       longitude: wrap(coord2[0], -180, 180).toFixed(OSM_PRECISION)
54474     });
54475   }
54476
54477   // modules/ui/panels/location.js
54478   function uiPanelLocation(context) {
54479     var currLocation = "";
54480     function redraw(selection2) {
54481       selection2.html("");
54482       var list = selection2.append("ul");
54483       var coord2 = context.map().mouseCoordinates();
54484       if (coord2.some(isNaN)) {
54485         coord2 = context.map().center();
54486       }
54487       list.append("li").text(dmsCoordinatePair(coord2)).append("li").text(decimalCoordinatePair(coord2));
54488       selection2.append("div").attr("class", "location-info").text(currLocation || " ");
54489       debouncedGetLocation(selection2, coord2);
54490     }
54491     var debouncedGetLocation = debounce_default(getLocation, 250);
54492     function getLocation(selection2, coord2) {
54493       if (!services.geocoder) {
54494         currLocation = _t("info_panels.location.unknown_location");
54495         selection2.selectAll(".location-info").text(currLocation);
54496       } else {
54497         services.geocoder.reverse(coord2, function(err, result) {
54498           currLocation = result ? result.display_name : _t("info_panels.location.unknown_location");
54499           selection2.selectAll(".location-info").text(currLocation);
54500         });
54501       }
54502     }
54503     var panel = function(selection2) {
54504       selection2.call(redraw);
54505       context.surface().on(("PointerEvent" in window ? "pointer" : "mouse") + "move.info-location", function() {
54506         selection2.call(redraw);
54507       });
54508     };
54509     panel.off = function() {
54510       context.surface().on(".info-location", null);
54511     };
54512     panel.id = "location";
54513     panel.label = _t.append("info_panels.location.title");
54514     panel.key = _t("info_panels.location.key");
54515     return panel;
54516   }
54517
54518   // modules/ui/panels/measurement.js
54519   function uiPanelMeasurement(context) {
54520     function radiansToMeters(r) {
54521       return r * 63710071809e-4;
54522     }
54523     function steradiansToSqmeters(r) {
54524       return r / (4 * Math.PI) * 510065621724e3;
54525     }
54526     function toLineString(feature3) {
54527       if (feature3.type === "LineString")
54528         return feature3;
54529       var result = { type: "LineString", coordinates: [] };
54530       if (feature3.type === "Polygon") {
54531         result.coordinates = feature3.coordinates[0];
54532       } else if (feature3.type === "MultiPolygon") {
54533         result.coordinates = feature3.coordinates[0][0];
54534       }
54535       return result;
54536     }
54537     var _isImperial = !_mainLocalizer.usesMetric();
54538     function redraw(selection2) {
54539       var graph = context.graph();
54540       var selectedNoteID = context.selectedNoteID();
54541       var osm = services.osm;
54542       var localeCode = _mainLocalizer.localeCode();
54543       var heading;
54544       var center, location, centroid;
54545       var closed, geometry;
54546       var totalNodeCount, length = 0, area = 0, distance;
54547       if (selectedNoteID && osm) {
54548         var note = osm.getNote(selectedNoteID);
54549         heading = _t.html("note.note") + " " + selectedNoteID;
54550         location = note.loc;
54551         geometry = "note";
54552       } else {
54553         var selectedIDs = context.selectedIDs().filter(function(id2) {
54554           return context.hasEntity(id2);
54555         });
54556         var selected = selectedIDs.map(function(id2) {
54557           return context.entity(id2);
54558         });
54559         heading = selected.length === 1 ? selected[0].id : _t.html("info_panels.selected", { n: selected.length });
54560         if (selected.length) {
54561           var extent = geoExtent();
54562           for (var i2 in selected) {
54563             var entity = selected[i2];
54564             extent._extend(entity.extent(graph));
54565             geometry = entity.geometry(graph);
54566             if (geometry === "line" || geometry === "area") {
54567               closed = entity.type === "relation" || entity.isClosed() && !entity.isDegenerate();
54568               var feature3 = entity.asGeoJSON(graph);
54569               length += radiansToMeters(length_default(toLineString(feature3)));
54570               centroid = path_default(context.projection).centroid(entity.asGeoJSON(graph));
54571               centroid = centroid && context.projection.invert(centroid);
54572               if (!centroid || !isFinite(centroid[0]) || !isFinite(centroid[1])) {
54573                 centroid = entity.extent(graph).center();
54574               }
54575               if (closed) {
54576                 area += steradiansToSqmeters(entity.area(graph));
54577               }
54578             }
54579           }
54580           if (selected.length > 1) {
54581             geometry = null;
54582             closed = null;
54583             centroid = null;
54584           }
54585           if (selected.length === 2 && selected[0].type === "node" && selected[1].type === "node") {
54586             distance = geoSphericalDistance(selected[0].loc, selected[1].loc);
54587           }
54588           if (selected.length === 1 && selected[0].type === "node") {
54589             location = selected[0].loc;
54590           } else {
54591             totalNodeCount = utilGetAllNodes(selectedIDs, context.graph()).length;
54592           }
54593           if (!location && !centroid) {
54594             center = extent.center();
54595           }
54596         }
54597       }
54598       selection2.html("");
54599       if (heading) {
54600         selection2.append("h4").attr("class", "measurement-heading").html(heading);
54601       }
54602       var list = selection2.append("ul");
54603       var coordItem;
54604       if (geometry) {
54605         list.append("li").call(_t.append("info_panels.measurement.geometry", { suffix: ":" })).append("span").html(
54606           closed ? _t.html("info_panels.measurement.closed_" + geometry) : _t.html("geometry." + geometry)
54607         );
54608       }
54609       if (totalNodeCount) {
54610         list.append("li").call(_t.append("info_panels.measurement.node_count", { suffix: ":" })).append("span").text(totalNodeCount.toLocaleString(localeCode));
54611       }
54612       if (area) {
54613         list.append("li").call(_t.append("info_panels.measurement.area", { suffix: ":" })).append("span").text(displayArea(area, _isImperial));
54614       }
54615       if (length) {
54616         list.append("li").call(_t.append("info_panels.measurement." + (closed ? "perimeter" : "length"), { suffix: ":" })).append("span").text(displayLength(length, _isImperial));
54617       }
54618       if (typeof distance === "number") {
54619         list.append("li").call(_t.append("info_panels.measurement.distance", { suffix: ":" })).append("span").text(displayLength(distance, _isImperial));
54620       }
54621       if (location) {
54622         coordItem = list.append("li").call(_t.append("info_panels.measurement.location", { suffix: ":" }));
54623         coordItem.append("span").text(dmsCoordinatePair(location));
54624         coordItem.append("span").text(decimalCoordinatePair(location));
54625       }
54626       if (centroid) {
54627         coordItem = list.append("li").call(_t.append("info_panels.measurement.centroid", { suffix: ":" }));
54628         coordItem.append("span").text(dmsCoordinatePair(centroid));
54629         coordItem.append("span").text(decimalCoordinatePair(centroid));
54630       }
54631       if (center) {
54632         coordItem = list.append("li").call(_t.append("info_panels.measurement.center", { suffix: ":" }));
54633         coordItem.append("span").text(dmsCoordinatePair(center));
54634         coordItem.append("span").text(decimalCoordinatePair(center));
54635       }
54636       if (length || area || typeof distance === "number") {
54637         var toggle = _isImperial ? "imperial" : "metric";
54638         selection2.append("a").call(_t.append("info_panels.measurement." + toggle)).attr("href", "#").attr("class", "button button-toggle-units").on("click", function(d3_event) {
54639           d3_event.preventDefault();
54640           _isImperial = !_isImperial;
54641           selection2.call(redraw);
54642         });
54643       }
54644     }
54645     var panel = function(selection2) {
54646       selection2.call(redraw);
54647       context.map().on("drawn.info-measurement", function() {
54648         selection2.call(redraw);
54649       });
54650       context.on("enter.info-measurement", function() {
54651         selection2.call(redraw);
54652       });
54653     };
54654     panel.off = function() {
54655       context.map().on("drawn.info-measurement", null);
54656       context.on("enter.info-measurement", null);
54657     };
54658     panel.id = "measurement";
54659     panel.label = _t.append("info_panels.measurement.title");
54660     panel.key = _t("info_panels.measurement.key");
54661     return panel;
54662   }
54663
54664   // modules/ui/panels/index.js
54665   var uiInfoPanels = {
54666     background: uiPanelBackground,
54667     history: uiPanelHistory,
54668     location: uiPanelLocation,
54669     measurement: uiPanelMeasurement
54670   };
54671
54672   // modules/ui/info.js
54673   function uiInfo(context) {
54674     var ids = Object.keys(uiInfoPanels);
54675     var wasActive = ["measurement"];
54676     var panels = {};
54677     var active = {};
54678     ids.forEach(function(k) {
54679       if (!panels[k]) {
54680         panels[k] = uiInfoPanels[k](context);
54681         active[k] = false;
54682       }
54683     });
54684     function info(selection2) {
54685       function redraw() {
54686         var activeids = ids.filter(function(k) {
54687           return active[k];
54688         }).sort();
54689         var containers = infoPanels.selectAll(".panel-container").data(activeids, function(k) {
54690           return k;
54691         });
54692         containers.exit().style("opacity", 1).transition().duration(200).style("opacity", 0).on("end", function(d) {
54693           select_default2(this).call(panels[d].off).remove();
54694         });
54695         var enter = containers.enter().append("div").attr("class", function(d) {
54696           return "fillD2 panel-container panel-container-" + d;
54697         });
54698         enter.style("opacity", 0).transition().duration(200).style("opacity", 1);
54699         var title = enter.append("div").attr("class", "panel-title fillD2");
54700         title.append("h3").each(function(d) {
54701           return panels[d].label(select_default2(this));
54702         });
54703         title.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function(d3_event, d) {
54704           d3_event.stopImmediatePropagation();
54705           d3_event.preventDefault();
54706           info.toggle(d);
54707         }).call(svgIcon("#iD-icon-close"));
54708         enter.append("div").attr("class", function(d) {
54709           return "panel-content panel-content-" + d;
54710         });
54711         infoPanels.selectAll(".panel-content").each(function(d) {
54712           select_default2(this).call(panels[d]);
54713         });
54714       }
54715       info.toggle = function(which) {
54716         var activeids = ids.filter(function(k) {
54717           return active[k];
54718         });
54719         if (which) {
54720           active[which] = !active[which];
54721           if (activeids.length === 1 && activeids[0] === which) {
54722             wasActive = [which];
54723           }
54724           context.container().select("." + which + "-panel-toggle-item").classed("active", active[which]).select("input").property("checked", active[which]);
54725         } else {
54726           if (activeids.length) {
54727             wasActive = activeids;
54728             activeids.forEach(function(k) {
54729               active[k] = false;
54730             });
54731           } else {
54732             wasActive.forEach(function(k) {
54733               active[k] = true;
54734             });
54735           }
54736         }
54737         redraw();
54738       };
54739       var infoPanels = selection2.selectAll(".info-panels").data([0]);
54740       infoPanels = infoPanels.enter().append("div").attr("class", "info-panels").merge(infoPanels);
54741       redraw();
54742       context.keybinding().on(uiCmd("\u2318" + _t("info_panels.key")), function(d3_event) {
54743         d3_event.stopImmediatePropagation();
54744         d3_event.preventDefault();
54745         info.toggle();
54746       });
54747       ids.forEach(function(k) {
54748         var key = _t("info_panels." + k + ".key", { default: null });
54749         if (!key)
54750           return;
54751         context.keybinding().on(uiCmd("\u2318\u21E7" + key), function(d3_event) {
54752           d3_event.stopImmediatePropagation();
54753           d3_event.preventDefault();
54754           info.toggle(k);
54755         });
54756       });
54757     }
54758     return info;
54759   }
54760
54761   // modules/ui/intro/helper.js
54762   function pointBox(loc, context) {
54763     var rect = context.surfaceRect();
54764     var point2 = context.curtainProjection(loc);
54765     return {
54766       left: point2[0] + rect.left - 40,
54767       top: point2[1] + rect.top - 60,
54768       width: 80,
54769       height: 90
54770     };
54771   }
54772   function pad(locOrBox, padding, context) {
54773     var box;
54774     if (locOrBox instanceof Array) {
54775       var rect = context.surfaceRect();
54776       var point2 = context.curtainProjection(locOrBox);
54777       box = {
54778         left: point2[0] + rect.left,
54779         top: point2[1] + rect.top
54780       };
54781     } else {
54782       box = locOrBox;
54783     }
54784     return {
54785       left: box.left - padding,
54786       top: box.top - padding,
54787       width: (box.width || 0) + 2 * padding,
54788       height: (box.width || 0) + 2 * padding
54789     };
54790   }
54791   function icon(name, svgklass, useklass) {
54792     return '<svg class="icon ' + (svgklass || "") + '"><use xlink:href="' + name + '"' + (useklass ? ' class="' + useklass + '"' : "") + "></use></svg>";
54793   }
54794   var helpStringReplacements;
54795   function helpHtml(id2, replacements) {
54796     if (!helpStringReplacements) {
54797       helpStringReplacements = {
54798         // insert icons corresponding to various UI elements
54799         point_icon: icon("#iD-icon-point", "inline"),
54800         line_icon: icon("#iD-icon-line", "inline"),
54801         area_icon: icon("#iD-icon-area", "inline"),
54802         note_icon: icon("#iD-icon-note", "inline add-note"),
54803         plus: icon("#iD-icon-plus", "inline"),
54804         minus: icon("#iD-icon-minus", "inline"),
54805         layers_icon: icon("#iD-icon-layers", "inline"),
54806         data_icon: icon("#iD-icon-data", "inline"),
54807         inspect: icon("#iD-icon-inspect", "inline"),
54808         help_icon: icon("#iD-icon-help", "inline"),
54809         undo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo", "inline"),
54810         redo_icon: icon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-undo" : "#iD-icon-redo", "inline"),
54811         save_icon: icon("#iD-icon-save", "inline"),
54812         // operation icons
54813         circularize_icon: icon("#iD-operation-circularize", "inline operation"),
54814         continue_icon: icon("#iD-operation-continue", "inline operation"),
54815         copy_icon: icon("#iD-operation-copy", "inline operation"),
54816         delete_icon: icon("#iD-operation-delete", "inline operation"),
54817         disconnect_icon: icon("#iD-operation-disconnect", "inline operation"),
54818         downgrade_icon: icon("#iD-operation-downgrade", "inline operation"),
54819         extract_icon: icon("#iD-operation-extract", "inline operation"),
54820         merge_icon: icon("#iD-operation-merge", "inline operation"),
54821         move_icon: icon("#iD-operation-move", "inline operation"),
54822         orthogonalize_icon: icon("#iD-operation-orthogonalize", "inline operation"),
54823         paste_icon: icon("#iD-operation-paste", "inline operation"),
54824         reflect_long_icon: icon("#iD-operation-reflect-long", "inline operation"),
54825         reflect_short_icon: icon("#iD-operation-reflect-short", "inline operation"),
54826         reverse_icon: icon("#iD-operation-reverse", "inline operation"),
54827         rotate_icon: icon("#iD-operation-rotate", "inline operation"),
54828         split_icon: icon("#iD-operation-split", "inline operation"),
54829         straighten_icon: icon("#iD-operation-straighten", "inline operation"),
54830         // interaction icons
54831         leftclick: icon("#iD-walkthrough-mouse-left", "inline operation"),
54832         rightclick: icon("#iD-walkthrough-mouse-right", "inline operation"),
54833         mousewheel_icon: icon("#iD-walkthrough-mousewheel", "inline operation"),
54834         tap_icon: icon("#iD-walkthrough-tap", "inline operation"),
54835         doubletap_icon: icon("#iD-walkthrough-doubletap", "inline operation"),
54836         longpress_icon: icon("#iD-walkthrough-longpress", "inline operation"),
54837         touchdrag_icon: icon("#iD-walkthrough-touchdrag", "inline operation"),
54838         pinch_icon: icon("#iD-walkthrough-pinch-apart", "inline operation"),
54839         // insert keys; may be localized and platform-dependent
54840         shift: uiCmd.display("\u21E7"),
54841         alt: uiCmd.display("\u2325"),
54842         return: uiCmd.display("\u21B5"),
54843         esc: _t.html("shortcuts.key.esc"),
54844         space: _t.html("shortcuts.key.space"),
54845         add_note_key: _t.html("modes.add_note.key"),
54846         help_key: _t.html("help.key"),
54847         shortcuts_key: _t.html("shortcuts.toggle.key"),
54848         // reference localized UI labels directly so that they'll always match
54849         save: _t.html("save.title"),
54850         undo: _t.html("undo.title"),
54851         redo: _t.html("redo.title"),
54852         upload: _t.html("commit.save"),
54853         point: _t.html("modes.add_point.title"),
54854         line: _t.html("modes.add_line.title"),
54855         area: _t.html("modes.add_area.title"),
54856         note: _t.html("modes.add_note.label"),
54857         circularize: _t.html("operations.circularize.title"),
54858         continue: _t.html("operations.continue.title"),
54859         copy: _t.html("operations.copy.title"),
54860         delete: _t.html("operations.delete.title"),
54861         disconnect: _t.html("operations.disconnect.title"),
54862         downgrade: _t.html("operations.downgrade.title"),
54863         extract: _t.html("operations.extract.title"),
54864         merge: _t.html("operations.merge.title"),
54865         move: _t.html("operations.move.title"),
54866         orthogonalize: _t.html("operations.orthogonalize.title"),
54867         paste: _t.html("operations.paste.title"),
54868         reflect_long: _t.html("operations.reflect.title.long"),
54869         reflect_short: _t.html("operations.reflect.title.short"),
54870         reverse: _t.html("operations.reverse.title"),
54871         rotate: _t.html("operations.rotate.title"),
54872         split: _t.html("operations.split.title"),
54873         straighten: _t.html("operations.straighten.title"),
54874         map_data: _t.html("map_data.title"),
54875         osm_notes: _t.html("map_data.layers.notes.title"),
54876         fields: _t.html("inspector.fields"),
54877         tags: _t.html("inspector.tags"),
54878         relations: _t.html("inspector.relations"),
54879         new_relation: _t.html("inspector.new_relation"),
54880         turn_restrictions: _t.html("_tagging.presets.fields.restrictions.label"),
54881         background_settings: _t.html("background.description"),
54882         imagery_offset: _t.html("background.fix_misalignment"),
54883         start_the_walkthrough: _t.html("splash.walkthrough"),
54884         help: _t.html("help.title"),
54885         ok: _t.html("intro.ok")
54886       };
54887       for (var key in helpStringReplacements) {
54888         helpStringReplacements[key] = { html: helpStringReplacements[key] };
54889       }
54890     }
54891     var reps;
54892     if (replacements) {
54893       reps = Object.assign(replacements, helpStringReplacements);
54894     } else {
54895       reps = helpStringReplacements;
54896     }
54897     return _t.html(id2, reps).replace(/\`(.*?)\`/g, "<kbd>$1</kbd>");
54898   }
54899   function slugify(text2) {
54900     return text2.toString().toLowerCase().replace(/\s+/g, "-").replace(/[^\w\-]+/g, "").replace(/\-\-+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
54901   }
54902   var missingStrings = {};
54903   function checkKey(key, text2) {
54904     if (_t(key, { default: void 0 }) === void 0) {
54905       if (missingStrings.hasOwnProperty(key))
54906         return;
54907       missingStrings[key] = text2;
54908       var missing = key + ": " + text2;
54909       if (typeof console !== "undefined")
54910         console.log(missing);
54911     }
54912   }
54913   function localize(obj) {
54914     var key;
54915     var name = obj.tags && obj.tags.name;
54916     if (name) {
54917       key = "intro.graph.name." + slugify(name);
54918       obj.tags.name = _t(key, { default: name });
54919       checkKey(key, name);
54920     }
54921     var street = obj.tags && obj.tags["addr:street"];
54922     if (street) {
54923       key = "intro.graph.name." + slugify(street);
54924       obj.tags["addr:street"] = _t(key, { default: street });
54925       checkKey(key, street);
54926       var addrTags = [
54927         "block_number",
54928         "city",
54929         "county",
54930         "district",
54931         "hamlet",
54932         "neighbourhood",
54933         "postcode",
54934         "province",
54935         "quarter",
54936         "state",
54937         "subdistrict",
54938         "suburb"
54939       ];
54940       addrTags.forEach(function(k) {
54941         var key2 = "intro.graph." + k;
54942         var tag = "addr:" + k;
54943         var val = obj.tags && obj.tags[tag];
54944         var str2 = _t(key2, { default: val });
54945         if (str2) {
54946           if (str2.match(/^<.*>$/) !== null) {
54947             delete obj.tags[tag];
54948           } else {
54949             obj.tags[tag] = str2;
54950           }
54951         }
54952       });
54953     }
54954     return obj;
54955   }
54956   function isMostlySquare(points) {
54957     var threshold = 15;
54958     var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);
54959     var upperBound = Math.cos(threshold * Math.PI / 180);
54960     for (var i2 = 0; i2 < points.length; i2++) {
54961       var a = points[(i2 - 1 + points.length) % points.length];
54962       var origin = points[i2];
54963       var b = points[(i2 + 1) % points.length];
54964       var dotp = geoVecNormalizedDot(a, b, origin);
54965       var mag = Math.abs(dotp);
54966       if (mag > lowerBound && mag < upperBound) {
54967         return false;
54968       }
54969     }
54970     return true;
54971   }
54972   function selectMenuItem(context, operation) {
54973     return context.container().select(".edit-menu .edit-menu-item-" + operation);
54974   }
54975   function transitionTime(point1, point2) {
54976     var distance = geoSphericalDistance(point1, point2);
54977     if (distance === 0) {
54978       return 0;
54979     } else if (distance < 80) {
54980       return 500;
54981     } else {
54982       return 1e3;
54983     }
54984   }
54985
54986   // modules/ui/toggle.js
54987   function uiToggle(show, callback) {
54988     return function(selection2) {
54989       selection2.style("opacity", show ? 0 : 1).classed("hide", false).transition().style("opacity", show ? 1 : 0).on("end", function() {
54990         select_default2(this).classed("hide", !show).style("opacity", null);
54991         if (callback)
54992           callback.apply(this);
54993       });
54994     };
54995   }
54996
54997   // modules/ui/curtain.js
54998   function uiCurtain(containerNode) {
54999     var surface = select_default2(null), tooltip = select_default2(null), darkness = select_default2(null);
55000     function curtain(selection2) {
55001       surface = selection2.append("svg").attr("class", "curtain").style("top", 0).style("left", 0);
55002       darkness = surface.append("path").attr("x", 0).attr("y", 0).attr("class", "curtain-darkness");
55003       select_default2(window).on("resize.curtain", resize);
55004       tooltip = selection2.append("div").attr("class", "tooltip");
55005       tooltip.append("div").attr("class", "popover-arrow");
55006       tooltip.append("div").attr("class", "popover-inner");
55007       resize();
55008       function resize() {
55009         surface.attr("width", containerNode.clientWidth).attr("height", containerNode.clientHeight);
55010         curtain.cut(darkness.datum());
55011       }
55012     }
55013     curtain.reveal = function(box, html2, options2) {
55014       options2 = options2 || {};
55015       if (typeof box === "string") {
55016         box = select_default2(box).node();
55017       }
55018       if (box && box.getBoundingClientRect) {
55019         box = copyBox(box.getBoundingClientRect());
55020         var containerRect = containerNode.getBoundingClientRect();
55021         box.top -= containerRect.top;
55022         box.left -= containerRect.left;
55023       }
55024       if (box && options2.padding) {
55025         box.top -= options2.padding;
55026         box.left -= options2.padding;
55027         box.bottom += options2.padding;
55028         box.right += options2.padding;
55029         box.height += options2.padding * 2;
55030         box.width += options2.padding * 2;
55031       }
55032       var tooltipBox;
55033       if (options2.tooltipBox) {
55034         tooltipBox = options2.tooltipBox;
55035         if (typeof tooltipBox === "string") {
55036           tooltipBox = select_default2(tooltipBox).node();
55037         }
55038         if (tooltipBox && tooltipBox.getBoundingClientRect) {
55039           tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
55040         }
55041       } else {
55042         tooltipBox = box;
55043       }
55044       if (tooltipBox && html2) {
55045         if (html2.indexOf("**") !== -1) {
55046           if (html2.indexOf("<span") === 0) {
55047             html2 = html2.replace(/^(<span.*?>)(.+?)(\*\*)/, "$1<span>$2</span>$3");
55048           } else {
55049             html2 = html2.replace(/^(.+?)(\*\*)/, "<span>$1</span>$2");
55050           }
55051           html2 = html2.replace(/\*\*(.*?)\*\*/g, '<span class="instruction">$1</span>');
55052         }
55053         html2 = html2.replace(/\*(.*?)\*/g, "<em>$1</em>");
55054         html2 = html2.replace(/\{br\}/g, "<br/><br/>");
55055         if (options2.buttonText && options2.buttonCallback) {
55056           html2 += '<div class="button-section"><button href="#" class="button action">' + options2.buttonText + "</button></div>";
55057         }
55058         var classes = "curtain-tooltip popover tooltip arrowed in " + (options2.tooltipClass || "");
55059         tooltip.classed(classes, true).selectAll(".popover-inner").html(html2);
55060         if (options2.buttonText && options2.buttonCallback) {
55061           var button = tooltip.selectAll(".button-section .button.action");
55062           button.on("click", function(d3_event) {
55063             d3_event.preventDefault();
55064             options2.buttonCallback();
55065           });
55066         }
55067         var tip = copyBox(tooltip.node().getBoundingClientRect()), w = containerNode.clientWidth, h = containerNode.clientHeight, tooltipWidth = 200, tooltipArrow = 5, side, pos;
55068         if (options2.tooltipClass === "intro-mouse") {
55069           tip.height += 80;
55070         }
55071         if (tooltipBox.top + tooltipBox.height > h) {
55072           tooltipBox.height -= tooltipBox.top + tooltipBox.height - h;
55073         }
55074         if (tooltipBox.left + tooltipBox.width > w) {
55075           tooltipBox.width -= tooltipBox.left + tooltipBox.width - w;
55076         }
55077         if (tooltipBox.top + tooltipBox.height < 100) {
55078           side = "bottom";
55079           pos = [
55080             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
55081             tooltipBox.top + tooltipBox.height
55082           ];
55083         } else if (tooltipBox.top > h - 140) {
55084           side = "top";
55085           pos = [
55086             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
55087             tooltipBox.top - tip.height
55088           ];
55089         } else {
55090           var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
55091           if (_mainLocalizer.textDirection() === "rtl") {
55092             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
55093               side = "right";
55094               pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
55095             } else {
55096               side = "left";
55097               pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
55098             }
55099           } else {
55100             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
55101               side = "left";
55102               pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
55103             } else {
55104               side = "right";
55105               pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
55106             }
55107           }
55108         }
55109         if (options2.duration !== 0 || !tooltip.classed(side)) {
55110           tooltip.call(uiToggle(true));
55111         }
55112         tooltip.style("top", pos[1] + "px").style("left", pos[0] + "px").attr("class", classes + " " + side);
55113         var shiftY = 0;
55114         if (side === "left" || side === "right") {
55115           if (pos[1] < 60) {
55116             shiftY = 60 - pos[1];
55117           } else if (pos[1] + tip.height > h - 100) {
55118             shiftY = h - pos[1] - tip.height - 100;
55119           }
55120         }
55121         tooltip.selectAll(".popover-inner").style("top", shiftY + "px");
55122       } else {
55123         tooltip.classed("in", false).call(uiToggle(false));
55124       }
55125       curtain.cut(box, options2.duration);
55126       return tooltip;
55127     };
55128     curtain.cut = function(datum2, duration) {
55129       darkness.datum(datum2).interrupt();
55130       var selection2;
55131       if (duration === 0) {
55132         selection2 = darkness;
55133       } else {
55134         selection2 = darkness.transition().duration(duration || 600).ease(linear2);
55135       }
55136       selection2.attr("d", function(d) {
55137         var containerWidth = containerNode.clientWidth;
55138         var containerHeight = containerNode.clientHeight;
55139         var string = "M 0,0 L 0," + containerHeight + " L " + containerWidth + "," + containerHeight + "L" + containerWidth + ",0 Z";
55140         if (!d)
55141           return string;
55142         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";
55143       });
55144     };
55145     curtain.remove = function() {
55146       surface.remove();
55147       tooltip.remove();
55148       select_default2(window).on("resize.curtain", null);
55149     };
55150     function copyBox(src) {
55151       return {
55152         top: src.top,
55153         right: src.right,
55154         bottom: src.bottom,
55155         left: src.left,
55156         width: src.width,
55157         height: src.height
55158       };
55159     }
55160     return curtain;
55161   }
55162
55163   // modules/ui/intro/welcome.js
55164   function uiIntroWelcome(context, reveal) {
55165     var dispatch10 = dispatch_default("done");
55166     var chapter = {
55167       title: "intro.welcome.title"
55168     };
55169     function welcome() {
55170       context.map().centerZoom([-85.63591, 41.94285], 19);
55171       reveal(
55172         ".intro-nav-wrap .chapter-welcome",
55173         helpHtml("intro.welcome.welcome"),
55174         { buttonText: _t.html("intro.ok"), buttonCallback: practice }
55175       );
55176     }
55177     function practice() {
55178       reveal(
55179         ".intro-nav-wrap .chapter-welcome",
55180         helpHtml("intro.welcome.practice"),
55181         { buttonText: _t.html("intro.ok"), buttonCallback: words }
55182       );
55183     }
55184     function words() {
55185       reveal(
55186         ".intro-nav-wrap .chapter-welcome",
55187         helpHtml("intro.welcome.words"),
55188         { buttonText: _t.html("intro.ok"), buttonCallback: chapters }
55189       );
55190     }
55191     function chapters() {
55192       dispatch10.call("done");
55193       reveal(
55194         ".intro-nav-wrap .chapter-navigation",
55195         helpHtml("intro.welcome.chapters", { next: _t("intro.navigation.title") })
55196       );
55197     }
55198     chapter.enter = function() {
55199       welcome();
55200     };
55201     chapter.exit = function() {
55202       context.container().select(".curtain-tooltip.intro-mouse").selectAll(".counter").remove();
55203     };
55204     chapter.restart = function() {
55205       chapter.exit();
55206       chapter.enter();
55207     };
55208     return utilRebind(chapter, dispatch10, "on");
55209   }
55210
55211   // modules/ui/intro/navigation.js
55212   function uiIntroNavigation(context, reveal) {
55213     var dispatch10 = dispatch_default("done");
55214     var timeouts = [];
55215     var hallId = "n2061";
55216     var townHall = [-85.63591, 41.94285];
55217     var springStreetId = "w397";
55218     var springStreetEndId = "n1834";
55219     var springStreet = [-85.63582, 41.94255];
55220     var onewayField = _mainPresetIndex.field("oneway");
55221     var maxspeedField = _mainPresetIndex.field("maxspeed");
55222     var chapter = {
55223       title: "intro.navigation.title"
55224     };
55225     function timeout2(f2, t) {
55226       timeouts.push(window.setTimeout(f2, t));
55227     }
55228     function eventCancel(d3_event) {
55229       d3_event.stopPropagation();
55230       d3_event.preventDefault();
55231     }
55232     function isTownHallSelected() {
55233       var ids = context.selectedIDs();
55234       return ids.length === 1 && ids[0] === hallId;
55235     }
55236     function dragMap() {
55237       context.enter(modeBrowse(context));
55238       context.history().reset("initial");
55239       var msec = transitionTime(townHall, context.map().center());
55240       if (msec) {
55241         reveal(null, null, { duration: 0 });
55242       }
55243       context.map().centerZoomEase(townHall, 19, msec);
55244       timeout2(function() {
55245         var centerStart = context.map().center();
55246         var textId = context.lastPointerType() === "mouse" ? "drag" : "drag_touch";
55247         var dragString = helpHtml("intro.navigation.map_info") + "{br}" + helpHtml("intro.navigation." + textId);
55248         reveal(".surface", dragString);
55249         context.map().on("drawn.intro", function() {
55250           reveal(".surface", dragString, { duration: 0 });
55251         });
55252         context.map().on("move.intro", function() {
55253           var centerNow = context.map().center();
55254           if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
55255             context.map().on("move.intro", null);
55256             timeout2(function() {
55257               continueTo(zoomMap);
55258             }, 3e3);
55259           }
55260         });
55261       }, msec + 100);
55262       function continueTo(nextStep) {
55263         context.map().on("move.intro drawn.intro", null);
55264         nextStep();
55265       }
55266     }
55267     function zoomMap() {
55268       var zoomStart = context.map().zoom();
55269       var textId = context.lastPointerType() === "mouse" ? "zoom" : "zoom_touch";
55270       var zoomString = helpHtml("intro.navigation." + textId);
55271       reveal(".surface", zoomString);
55272       context.map().on("drawn.intro", function() {
55273         reveal(".surface", zoomString, { duration: 0 });
55274       });
55275       context.map().on("move.intro", function() {
55276         if (context.map().zoom() !== zoomStart) {
55277           context.map().on("move.intro", null);
55278           timeout2(function() {
55279             continueTo(features);
55280           }, 3e3);
55281         }
55282       });
55283       function continueTo(nextStep) {
55284         context.map().on("move.intro drawn.intro", null);
55285         nextStep();
55286       }
55287     }
55288     function features() {
55289       var onClick = function() {
55290         continueTo(pointsLinesAreas);
55291       };
55292       reveal(
55293         ".surface",
55294         helpHtml("intro.navigation.features"),
55295         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55296       );
55297       context.map().on("drawn.intro", function() {
55298         reveal(
55299           ".surface",
55300           helpHtml("intro.navigation.features"),
55301           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55302         );
55303       });
55304       function continueTo(nextStep) {
55305         context.map().on("drawn.intro", null);
55306         nextStep();
55307       }
55308     }
55309     function pointsLinesAreas() {
55310       var onClick = function() {
55311         continueTo(nodesWays);
55312       };
55313       reveal(
55314         ".surface",
55315         helpHtml("intro.navigation.points_lines_areas"),
55316         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55317       );
55318       context.map().on("drawn.intro", function() {
55319         reveal(
55320           ".surface",
55321           helpHtml("intro.navigation.points_lines_areas"),
55322           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55323         );
55324       });
55325       function continueTo(nextStep) {
55326         context.map().on("drawn.intro", null);
55327         nextStep();
55328       }
55329     }
55330     function nodesWays() {
55331       var onClick = function() {
55332         continueTo(clickTownHall);
55333       };
55334       reveal(
55335         ".surface",
55336         helpHtml("intro.navigation.nodes_ways"),
55337         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55338       );
55339       context.map().on("drawn.intro", function() {
55340         reveal(
55341           ".surface",
55342           helpHtml("intro.navigation.nodes_ways"),
55343           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55344         );
55345       });
55346       function continueTo(nextStep) {
55347         context.map().on("drawn.intro", null);
55348         nextStep();
55349       }
55350     }
55351     function clickTownHall() {
55352       context.enter(modeBrowse(context));
55353       context.history().reset("initial");
55354       var entity = context.hasEntity(hallId);
55355       if (!entity)
55356         return;
55357       reveal(null, null, { duration: 0 });
55358       context.map().centerZoomEase(entity.loc, 19, 500);
55359       timeout2(function() {
55360         var entity2 = context.hasEntity(hallId);
55361         if (!entity2)
55362           return;
55363         var box = pointBox(entity2.loc, context);
55364         var textId = context.lastPointerType() === "mouse" ? "click_townhall" : "tap_townhall";
55365         reveal(box, helpHtml("intro.navigation." + textId));
55366         context.map().on("move.intro drawn.intro", function() {
55367           var entity3 = context.hasEntity(hallId);
55368           if (!entity3)
55369             return;
55370           var box2 = pointBox(entity3.loc, context);
55371           reveal(box2, helpHtml("intro.navigation." + textId), { duration: 0 });
55372         });
55373         context.on("enter.intro", function() {
55374           if (isTownHallSelected())
55375             continueTo(selectedTownHall);
55376         });
55377       }, 550);
55378       context.history().on("change.intro", function() {
55379         if (!context.hasEntity(hallId)) {
55380           continueTo(clickTownHall);
55381         }
55382       });
55383       function continueTo(nextStep) {
55384         context.on("enter.intro", null);
55385         context.map().on("move.intro drawn.intro", null);
55386         context.history().on("change.intro", null);
55387         nextStep();
55388       }
55389     }
55390     function selectedTownHall() {
55391       if (!isTownHallSelected())
55392         return clickTownHall();
55393       var entity = context.hasEntity(hallId);
55394       if (!entity)
55395         return clickTownHall();
55396       var box = pointBox(entity.loc, context);
55397       var onClick = function() {
55398         continueTo(editorTownHall);
55399       };
55400       reveal(
55401         box,
55402         helpHtml("intro.navigation.selected_townhall"),
55403         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55404       );
55405       context.map().on("move.intro drawn.intro", function() {
55406         var entity2 = context.hasEntity(hallId);
55407         if (!entity2)
55408           return;
55409         var box2 = pointBox(entity2.loc, context);
55410         reveal(
55411           box2,
55412           helpHtml("intro.navigation.selected_townhall"),
55413           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55414         );
55415       });
55416       context.history().on("change.intro", function() {
55417         if (!context.hasEntity(hallId)) {
55418           continueTo(clickTownHall);
55419         }
55420       });
55421       function continueTo(nextStep) {
55422         context.map().on("move.intro drawn.intro", null);
55423         context.history().on("change.intro", null);
55424         nextStep();
55425       }
55426     }
55427     function editorTownHall() {
55428       if (!isTownHallSelected())
55429         return clickTownHall();
55430       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55431       var onClick = function() {
55432         continueTo(presetTownHall);
55433       };
55434       reveal(
55435         ".entity-editor-pane",
55436         helpHtml("intro.navigation.editor_townhall"),
55437         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55438       );
55439       context.on("exit.intro", function() {
55440         continueTo(clickTownHall);
55441       });
55442       context.history().on("change.intro", function() {
55443         if (!context.hasEntity(hallId)) {
55444           continueTo(clickTownHall);
55445         }
55446       });
55447       function continueTo(nextStep) {
55448         context.on("exit.intro", null);
55449         context.history().on("change.intro", null);
55450         context.container().select(".inspector-wrap").on("wheel.intro", null);
55451         nextStep();
55452       }
55453     }
55454     function presetTownHall() {
55455       if (!isTownHallSelected())
55456         return clickTownHall();
55457       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55458       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55459       var entity = context.entity(context.selectedIDs()[0]);
55460       var preset = _mainPresetIndex.match(entity, context.graph());
55461       var onClick = function() {
55462         continueTo(fieldsTownHall);
55463       };
55464       reveal(
55465         ".entity-editor-pane .section-feature-type",
55466         helpHtml("intro.navigation.preset_townhall", { preset: preset.name() }),
55467         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55468       );
55469       context.on("exit.intro", function() {
55470         continueTo(clickTownHall);
55471       });
55472       context.history().on("change.intro", function() {
55473         if (!context.hasEntity(hallId)) {
55474           continueTo(clickTownHall);
55475         }
55476       });
55477       function continueTo(nextStep) {
55478         context.on("exit.intro", null);
55479         context.history().on("change.intro", null);
55480         context.container().select(".inspector-wrap").on("wheel.intro", null);
55481         nextStep();
55482       }
55483     }
55484     function fieldsTownHall() {
55485       if (!isTownHallSelected())
55486         return clickTownHall();
55487       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55488       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55489       var onClick = function() {
55490         continueTo(closeTownHall);
55491       };
55492       reveal(
55493         ".entity-editor-pane .section-preset-fields",
55494         helpHtml("intro.navigation.fields_townhall"),
55495         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55496       );
55497       context.on("exit.intro", function() {
55498         continueTo(clickTownHall);
55499       });
55500       context.history().on("change.intro", function() {
55501         if (!context.hasEntity(hallId)) {
55502           continueTo(clickTownHall);
55503         }
55504       });
55505       function continueTo(nextStep) {
55506         context.on("exit.intro", null);
55507         context.history().on("change.intro", null);
55508         context.container().select(".inspector-wrap").on("wheel.intro", null);
55509         nextStep();
55510       }
55511     }
55512     function closeTownHall() {
55513       if (!isTownHallSelected())
55514         return clickTownHall();
55515       var selector = ".entity-editor-pane button.close svg use";
55516       var href = select_default2(selector).attr("href") || "#iD-icon-close";
55517       reveal(
55518         ".entity-editor-pane",
55519         helpHtml("intro.navigation.close_townhall", { button: { html: icon(href, "inline") } })
55520       );
55521       context.on("exit.intro", function() {
55522         continueTo(searchStreet);
55523       });
55524       context.history().on("change.intro", function() {
55525         var selector2 = ".entity-editor-pane button.close svg use";
55526         var href2 = select_default2(selector2).attr("href") || "#iD-icon-close";
55527         reveal(
55528           ".entity-editor-pane",
55529           helpHtml("intro.navigation.close_townhall", { button: { html: icon(href2, "inline") } }),
55530           { duration: 0 }
55531         );
55532       });
55533       function continueTo(nextStep) {
55534         context.on("exit.intro", null);
55535         context.history().on("change.intro", null);
55536         nextStep();
55537       }
55538     }
55539     function searchStreet() {
55540       context.enter(modeBrowse(context));
55541       context.history().reset("initial");
55542       var msec = transitionTime(springStreet, context.map().center());
55543       if (msec) {
55544         reveal(null, null, { duration: 0 });
55545       }
55546       context.map().centerZoomEase(springStreet, 19, msec);
55547       timeout2(function() {
55548         reveal(
55549           ".search-header input",
55550           helpHtml("intro.navigation.search_street", { name: _t("intro.graph.name.spring-street") })
55551         );
55552         context.container().select(".search-header input").on("keyup.intro", checkSearchResult);
55553       }, msec + 100);
55554     }
55555     function checkSearchResult() {
55556       var first = context.container().select(".feature-list-item:nth-child(0n+2)");
55557       var firstName = first.select(".entity-name");
55558       var name = _t("intro.graph.name.spring-street");
55559       if (!firstName.empty() && firstName.html() === name) {
55560         reveal(
55561           first.node(),
55562           helpHtml("intro.navigation.choose_street", { name }),
55563           { duration: 300 }
55564         );
55565         context.on("exit.intro", function() {
55566           continueTo(selectedStreet);
55567         });
55568         context.container().select(".search-header input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
55569       }
55570       function continueTo(nextStep) {
55571         context.on("exit.intro", null);
55572         context.container().select(".search-header input").on("keydown.intro", null).on("keyup.intro", null);
55573         nextStep();
55574       }
55575     }
55576     function selectedStreet() {
55577       if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
55578         return searchStreet();
55579       }
55580       var onClick = function() {
55581         continueTo(editorStreet);
55582       };
55583       var entity = context.entity(springStreetEndId);
55584       var box = pointBox(entity.loc, context);
55585       box.height = 500;
55586       reveal(
55587         box,
55588         helpHtml("intro.navigation.selected_street", { name: _t("intro.graph.name.spring-street") }),
55589         { duration: 600, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55590       );
55591       timeout2(function() {
55592         context.map().on("move.intro drawn.intro", function() {
55593           var entity2 = context.hasEntity(springStreetEndId);
55594           if (!entity2)
55595             return;
55596           var box2 = pointBox(entity2.loc, context);
55597           box2.height = 500;
55598           reveal(
55599             box2,
55600             helpHtml("intro.navigation.selected_street", { name: _t("intro.graph.name.spring-street") }),
55601             { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
55602           );
55603         });
55604       }, 600);
55605       context.on("enter.intro", function(mode) {
55606         if (!context.hasEntity(springStreetId)) {
55607           return continueTo(searchStreet);
55608         }
55609         var ids = context.selectedIDs();
55610         if (mode.id !== "select" || !ids.length || ids[0] !== springStreetId) {
55611           context.enter(modeSelect(context, [springStreetId]));
55612         }
55613       });
55614       context.history().on("change.intro", function() {
55615         if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
55616           timeout2(function() {
55617             continueTo(searchStreet);
55618           }, 300);
55619         }
55620       });
55621       function continueTo(nextStep) {
55622         context.map().on("move.intro drawn.intro", null);
55623         context.on("enter.intro", null);
55624         context.history().on("change.intro", null);
55625         nextStep();
55626       }
55627     }
55628     function editorStreet() {
55629       var selector = ".entity-editor-pane button.close svg use";
55630       var href = select_default2(selector).attr("href") || "#iD-icon-close";
55631       reveal(".entity-editor-pane", helpHtml("intro.navigation.street_different_fields") + "{br}" + helpHtml("intro.navigation.editor_street", {
55632         button: { html: icon(href, "inline") },
55633         field1: onewayField.title(),
55634         field2: maxspeedField.title()
55635       }));
55636       context.on("exit.intro", function() {
55637         continueTo(play);
55638       });
55639       context.history().on("change.intro", function() {
55640         var selector2 = ".entity-editor-pane button.close svg use";
55641         var href2 = select_default2(selector2).attr("href") || "#iD-icon-close";
55642         reveal(
55643           ".entity-editor-pane",
55644           helpHtml("intro.navigation.street_different_fields") + "{br}" + helpHtml("intro.navigation.editor_street", {
55645             button: { html: icon(href2, "inline") },
55646             field1: onewayField.title(),
55647             field2: maxspeedField.title()
55648           }),
55649           { duration: 0 }
55650         );
55651       });
55652       function continueTo(nextStep) {
55653         context.on("exit.intro", null);
55654         context.history().on("change.intro", null);
55655         nextStep();
55656       }
55657     }
55658     function play() {
55659       dispatch10.call("done");
55660       reveal(
55661         ".ideditor",
55662         helpHtml("intro.navigation.play", { next: _t("intro.points.title") }),
55663         {
55664           tooltipBox: ".intro-nav-wrap .chapter-point",
55665           buttonText: _t.html("intro.ok"),
55666           buttonCallback: function() {
55667             reveal(".ideditor");
55668           }
55669         }
55670       );
55671     }
55672     chapter.enter = function() {
55673       dragMap();
55674     };
55675     chapter.exit = function() {
55676       timeouts.forEach(window.clearTimeout);
55677       context.on("enter.intro exit.intro", null);
55678       context.map().on("move.intro drawn.intro", null);
55679       context.history().on("change.intro", null);
55680       context.container().select(".inspector-wrap").on("wheel.intro", null);
55681       context.container().select(".search-header input").on("keydown.intro keyup.intro", null);
55682     };
55683     chapter.restart = function() {
55684       chapter.exit();
55685       chapter.enter();
55686     };
55687     return utilRebind(chapter, dispatch10, "on");
55688   }
55689
55690   // modules/ui/intro/point.js
55691   function uiIntroPoint(context, reveal) {
55692     var dispatch10 = dispatch_default("done");
55693     var timeouts = [];
55694     var intersection = [-85.63279, 41.94394];
55695     var building = [-85.632422, 41.944045];
55696     var cafePreset = _mainPresetIndex.item("amenity/cafe");
55697     var _pointID = null;
55698     var chapter = {
55699       title: "intro.points.title"
55700     };
55701     function timeout2(f2, t) {
55702       timeouts.push(window.setTimeout(f2, t));
55703     }
55704     function eventCancel(d3_event) {
55705       d3_event.stopPropagation();
55706       d3_event.preventDefault();
55707     }
55708     function addPoint() {
55709       context.enter(modeBrowse(context));
55710       context.history().reset("initial");
55711       var msec = transitionTime(intersection, context.map().center());
55712       if (msec) {
55713         reveal(null, null, { duration: 0 });
55714       }
55715       context.map().centerZoomEase(intersection, 19, msec);
55716       timeout2(function() {
55717         var tooltip = reveal(
55718           "button.add-point",
55719           helpHtml("intro.points.points_info") + "{br}" + helpHtml("intro.points.add_point")
55720         );
55721         _pointID = null;
55722         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-points");
55723         context.on("enter.intro", function(mode) {
55724           if (mode.id !== "add-point")
55725             return;
55726           continueTo(placePoint);
55727         });
55728       }, msec + 100);
55729       function continueTo(nextStep) {
55730         context.on("enter.intro", null);
55731         nextStep();
55732       }
55733     }
55734     function placePoint() {
55735       if (context.mode().id !== "add-point") {
55736         return chapter.restart();
55737       }
55738       var pointBox2 = pad(building, 150, context);
55739       var textId = context.lastPointerType() === "mouse" ? "place_point" : "place_point_touch";
55740       reveal(pointBox2, helpHtml("intro.points." + textId));
55741       context.map().on("move.intro drawn.intro", function() {
55742         pointBox2 = pad(building, 150, context);
55743         reveal(pointBox2, helpHtml("intro.points." + textId), { duration: 0 });
55744       });
55745       context.on("enter.intro", function(mode) {
55746         if (mode.id !== "select")
55747           return chapter.restart();
55748         _pointID = context.mode().selectedIDs()[0];
55749         continueTo(searchPreset);
55750       });
55751       function continueTo(nextStep) {
55752         context.map().on("move.intro drawn.intro", null);
55753         context.on("enter.intro", null);
55754         nextStep();
55755       }
55756     }
55757     function searchPreset() {
55758       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55759         return addPoint();
55760       }
55761       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55762       context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
55763       reveal(
55764         ".preset-search-input",
55765         helpHtml("intro.points.search_cafe", { preset: cafePreset.name() })
55766       );
55767       context.on("enter.intro", function(mode) {
55768         if (!_pointID || !context.hasEntity(_pointID)) {
55769           return continueTo(addPoint);
55770         }
55771         var ids = context.selectedIDs();
55772         if (mode.id !== "select" || !ids.length || ids[0] !== _pointID) {
55773           context.enter(modeSelect(context, [_pointID]));
55774           context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
55775           context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
55776           reveal(
55777             ".preset-search-input",
55778             helpHtml("intro.points.search_cafe", { preset: cafePreset.name() })
55779           );
55780           context.history().on("change.intro", null);
55781         }
55782       });
55783       function checkPresetSearch() {
55784         var first = context.container().select(".preset-list-item:first-child");
55785         if (first.classed("preset-amenity-cafe")) {
55786           context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
55787           reveal(
55788             first.select(".preset-list-button").node(),
55789             helpHtml("intro.points.choose_cafe", { preset: cafePreset.name() }),
55790             { duration: 300 }
55791           );
55792           context.history().on("change.intro", function() {
55793             continueTo(aboutFeatureEditor);
55794           });
55795         }
55796       }
55797       function continueTo(nextStep) {
55798         context.on("enter.intro", null);
55799         context.history().on("change.intro", null);
55800         context.container().select(".inspector-wrap").on("wheel.intro", null);
55801         context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
55802         nextStep();
55803       }
55804     }
55805     function aboutFeatureEditor() {
55806       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55807         return addPoint();
55808       }
55809       timeout2(function() {
55810         reveal(".entity-editor-pane", helpHtml("intro.points.feature_editor"), {
55811           tooltipClass: "intro-points-describe",
55812           buttonText: _t.html("intro.ok"),
55813           buttonCallback: function() {
55814             continueTo(addName);
55815           }
55816         });
55817       }, 400);
55818       context.on("exit.intro", function() {
55819         continueTo(reselectPoint);
55820       });
55821       function continueTo(nextStep) {
55822         context.on("exit.intro", null);
55823         nextStep();
55824       }
55825     }
55826     function addName() {
55827       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55828         return addPoint();
55829       }
55830       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55831       var addNameString = helpHtml("intro.points.fields_info") + "{br}" + helpHtml("intro.points.add_name");
55832       timeout2(function() {
55833         var entity = context.entity(_pointID);
55834         if (entity.tags.name) {
55835           var tooltip = reveal(".entity-editor-pane", addNameString, {
55836             tooltipClass: "intro-points-describe",
55837             buttonText: _t.html("intro.ok"),
55838             buttonCallback: function() {
55839               continueTo(addCloseEditor);
55840             }
55841           });
55842           tooltip.select(".instruction").style("display", "none");
55843         } else {
55844           reveal(
55845             ".entity-editor-pane",
55846             addNameString,
55847             { tooltipClass: "intro-points-describe" }
55848           );
55849         }
55850       }, 400);
55851       context.history().on("change.intro", function() {
55852         continueTo(addCloseEditor);
55853       });
55854       context.on("exit.intro", function() {
55855         continueTo(reselectPoint);
55856       });
55857       function continueTo(nextStep) {
55858         context.on("exit.intro", null);
55859         context.history().on("change.intro", null);
55860         nextStep();
55861       }
55862     }
55863     function addCloseEditor() {
55864       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55865       var selector = ".entity-editor-pane button.close svg use";
55866       var href = select_default2(selector).attr("href") || "#iD-icon-close";
55867       context.on("exit.intro", function() {
55868         continueTo(reselectPoint);
55869       });
55870       reveal(
55871         ".entity-editor-pane",
55872         helpHtml("intro.points.add_close", { button: { html: icon(href, "inline") } })
55873       );
55874       function continueTo(nextStep) {
55875         context.on("exit.intro", null);
55876         nextStep();
55877       }
55878     }
55879     function reselectPoint() {
55880       if (!_pointID)
55881         return chapter.restart();
55882       var entity = context.hasEntity(_pointID);
55883       if (!entity)
55884         return chapter.restart();
55885       var oldPreset = _mainPresetIndex.match(entity, context.graph());
55886       context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
55887       context.enter(modeBrowse(context));
55888       var msec = transitionTime(entity.loc, context.map().center());
55889       if (msec) {
55890         reveal(null, null, { duration: 0 });
55891       }
55892       context.map().centerEase(entity.loc, msec);
55893       timeout2(function() {
55894         var box = pointBox(entity.loc, context);
55895         reveal(box, helpHtml("intro.points.reselect"), { duration: 600 });
55896         timeout2(function() {
55897           context.map().on("move.intro drawn.intro", function() {
55898             var entity2 = context.hasEntity(_pointID);
55899             if (!entity2)
55900               return chapter.restart();
55901             var box2 = pointBox(entity2.loc, context);
55902             reveal(box2, helpHtml("intro.points.reselect"), { duration: 0 });
55903           });
55904         }, 600);
55905         context.on("enter.intro", function(mode) {
55906           if (mode.id !== "select")
55907             return;
55908           continueTo(updatePoint);
55909         });
55910       }, msec + 100);
55911       function continueTo(nextStep) {
55912         context.map().on("move.intro drawn.intro", null);
55913         context.on("enter.intro", null);
55914         nextStep();
55915       }
55916     }
55917     function updatePoint() {
55918       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55919         return continueTo(reselectPoint);
55920       }
55921       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55922       context.on("exit.intro", function() {
55923         continueTo(reselectPoint);
55924       });
55925       context.history().on("change.intro", function() {
55926         continueTo(updateCloseEditor);
55927       });
55928       timeout2(function() {
55929         reveal(
55930           ".entity-editor-pane",
55931           helpHtml("intro.points.update"),
55932           { tooltipClass: "intro-points-describe" }
55933         );
55934       }, 400);
55935       function continueTo(nextStep) {
55936         context.on("exit.intro", null);
55937         context.history().on("change.intro", null);
55938         nextStep();
55939       }
55940     }
55941     function updateCloseEditor() {
55942       if (context.mode().id !== "select" || !_pointID || !context.hasEntity(_pointID)) {
55943         return continueTo(reselectPoint);
55944       }
55945       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
55946       context.on("exit.intro", function() {
55947         continueTo(rightClickPoint);
55948       });
55949       timeout2(function() {
55950         reveal(
55951           ".entity-editor-pane",
55952           helpHtml("intro.points.update_close", { button: { html: icon("#iD-icon-close", "inline") } })
55953         );
55954       }, 500);
55955       function continueTo(nextStep) {
55956         context.on("exit.intro", null);
55957         nextStep();
55958       }
55959     }
55960     function rightClickPoint() {
55961       if (!_pointID)
55962         return chapter.restart();
55963       var entity = context.hasEntity(_pointID);
55964       if (!entity)
55965         return chapter.restart();
55966       context.enter(modeBrowse(context));
55967       var box = pointBox(entity.loc, context);
55968       var textId = context.lastPointerType() === "mouse" ? "rightclick" : "edit_menu_touch";
55969       reveal(box, helpHtml("intro.points." + textId), { duration: 600 });
55970       timeout2(function() {
55971         context.map().on("move.intro", function() {
55972           var entity2 = context.hasEntity(_pointID);
55973           if (!entity2)
55974             return chapter.restart();
55975           var box2 = pointBox(entity2.loc, context);
55976           reveal(box2, helpHtml("intro.points." + textId), { duration: 0 });
55977         });
55978       }, 600);
55979       context.on("enter.intro", function(mode) {
55980         if (mode.id !== "select")
55981           return;
55982         var ids = context.selectedIDs();
55983         if (ids.length !== 1 || ids[0] !== _pointID)
55984           return;
55985         timeout2(function() {
55986           var node = selectMenuItem(context, "delete").node();
55987           if (!node)
55988             return;
55989           continueTo(enterDelete);
55990         }, 50);
55991       });
55992       function continueTo(nextStep) {
55993         context.on("enter.intro", null);
55994         context.map().on("move.intro", null);
55995         nextStep();
55996       }
55997     }
55998     function enterDelete() {
55999       if (!_pointID)
56000         return chapter.restart();
56001       var entity = context.hasEntity(_pointID);
56002       if (!entity)
56003         return chapter.restart();
56004       var node = selectMenuItem(context, "delete").node();
56005       if (!node) {
56006         return continueTo(rightClickPoint);
56007       }
56008       reveal(
56009         ".edit-menu",
56010         helpHtml("intro.points.delete"),
56011         { padding: 50 }
56012       );
56013       timeout2(function() {
56014         context.map().on("move.intro", function() {
56015           reveal(
56016             ".edit-menu",
56017             helpHtml("intro.points.delete"),
56018             { duration: 0, padding: 50 }
56019           );
56020         });
56021       }, 300);
56022       context.on("exit.intro", function() {
56023         if (!_pointID)
56024           return chapter.restart();
56025         var entity2 = context.hasEntity(_pointID);
56026         if (entity2)
56027           return continueTo(rightClickPoint);
56028       });
56029       context.history().on("change.intro", function(changed) {
56030         if (changed.deleted().length) {
56031           continueTo(undo);
56032         }
56033       });
56034       function continueTo(nextStep) {
56035         context.map().on("move.intro", null);
56036         context.history().on("change.intro", null);
56037         context.on("exit.intro", null);
56038         nextStep();
56039       }
56040     }
56041     function undo() {
56042       context.history().on("change.intro", function() {
56043         continueTo(play);
56044       });
56045       reveal(
56046         ".top-toolbar button.undo-button",
56047         helpHtml("intro.points.undo")
56048       );
56049       function continueTo(nextStep) {
56050         context.history().on("change.intro", null);
56051         nextStep();
56052       }
56053     }
56054     function play() {
56055       dispatch10.call("done");
56056       reveal(
56057         ".ideditor",
56058         helpHtml("intro.points.play", { next: _t("intro.areas.title") }),
56059         {
56060           tooltipBox: ".intro-nav-wrap .chapter-area",
56061           buttonText: _t.html("intro.ok"),
56062           buttonCallback: function() {
56063             reveal(".ideditor");
56064           }
56065         }
56066       );
56067     }
56068     chapter.enter = function() {
56069       addPoint();
56070     };
56071     chapter.exit = function() {
56072       timeouts.forEach(window.clearTimeout);
56073       context.on("enter.intro exit.intro", null);
56074       context.map().on("move.intro drawn.intro", null);
56075       context.history().on("change.intro", null);
56076       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56077       context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
56078     };
56079     chapter.restart = function() {
56080       chapter.exit();
56081       chapter.enter();
56082     };
56083     return utilRebind(chapter, dispatch10, "on");
56084   }
56085
56086   // modules/ui/intro/area.js
56087   function uiIntroArea(context, reveal) {
56088     var dispatch10 = dispatch_default("done");
56089     var playground = [-85.63552, 41.94159];
56090     var playgroundPreset = _mainPresetIndex.item("leisure/playground");
56091     var nameField = _mainPresetIndex.field("name");
56092     var descriptionField = _mainPresetIndex.field("description");
56093     var timeouts = [];
56094     var _areaID;
56095     var chapter = {
56096       title: "intro.areas.title"
56097     };
56098     function timeout2(f2, t) {
56099       timeouts.push(window.setTimeout(f2, t));
56100     }
56101     function eventCancel(d3_event) {
56102       d3_event.stopPropagation();
56103       d3_event.preventDefault();
56104     }
56105     function revealPlayground(center, text2, options2) {
56106       var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
56107       var box = pad(center, padding, context);
56108       reveal(box, text2, options2);
56109     }
56110     function addArea() {
56111       context.enter(modeBrowse(context));
56112       context.history().reset("initial");
56113       _areaID = null;
56114       var msec = transitionTime(playground, context.map().center());
56115       if (msec) {
56116         reveal(null, null, { duration: 0 });
56117       }
56118       context.map().centerZoomEase(playground, 19, msec);
56119       timeout2(function() {
56120         var tooltip = reveal(
56121           "button.add-area",
56122           helpHtml("intro.areas.add_playground")
56123         );
56124         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-areas");
56125         context.on("enter.intro", function(mode) {
56126           if (mode.id !== "add-area")
56127             return;
56128           continueTo(startPlayground);
56129         });
56130       }, msec + 100);
56131       function continueTo(nextStep) {
56132         context.on("enter.intro", null);
56133         nextStep();
56134       }
56135     }
56136     function startPlayground() {
56137       if (context.mode().id !== "add-area") {
56138         return chapter.restart();
56139       }
56140       _areaID = null;
56141       context.map().zoomEase(19.5, 500);
56142       timeout2(function() {
56143         var textId = context.lastPointerType() === "mouse" ? "starting_node_click" : "starting_node_tap";
56144         var startDrawString = helpHtml("intro.areas.start_playground") + helpHtml("intro.areas." + textId);
56145         revealPlayground(
56146           playground,
56147           startDrawString,
56148           { duration: 250 }
56149         );
56150         timeout2(function() {
56151           context.map().on("move.intro drawn.intro", function() {
56152             revealPlayground(
56153               playground,
56154               startDrawString,
56155               { duration: 0 }
56156             );
56157           });
56158           context.on("enter.intro", function(mode) {
56159             if (mode.id !== "draw-area")
56160               return chapter.restart();
56161             continueTo(continuePlayground);
56162           });
56163         }, 250);
56164       }, 550);
56165       function continueTo(nextStep) {
56166         context.map().on("move.intro drawn.intro", null);
56167         context.on("enter.intro", null);
56168         nextStep();
56169       }
56170     }
56171     function continuePlayground() {
56172       if (context.mode().id !== "draw-area") {
56173         return chapter.restart();
56174       }
56175       _areaID = null;
56176       revealPlayground(
56177         playground,
56178         helpHtml("intro.areas.continue_playground"),
56179         { duration: 250 }
56180       );
56181       timeout2(function() {
56182         context.map().on("move.intro drawn.intro", function() {
56183           revealPlayground(
56184             playground,
56185             helpHtml("intro.areas.continue_playground"),
56186             { duration: 0 }
56187           );
56188         });
56189       }, 250);
56190       context.on("enter.intro", function(mode) {
56191         if (mode.id === "draw-area") {
56192           var entity = context.hasEntity(context.selectedIDs()[0]);
56193           if (entity && entity.nodes.length >= 6) {
56194             return continueTo(finishPlayground);
56195           } else {
56196             return;
56197           }
56198         } else if (mode.id === "select") {
56199           _areaID = context.selectedIDs()[0];
56200           return continueTo(searchPresets);
56201         } else {
56202           return chapter.restart();
56203         }
56204       });
56205       function continueTo(nextStep) {
56206         context.map().on("move.intro drawn.intro", null);
56207         context.on("enter.intro", null);
56208         nextStep();
56209       }
56210     }
56211     function finishPlayground() {
56212       if (context.mode().id !== "draw-area") {
56213         return chapter.restart();
56214       }
56215       _areaID = null;
56216       var finishString = helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.areas.finish_playground");
56217       revealPlayground(
56218         playground,
56219         finishString,
56220         { duration: 250 }
56221       );
56222       timeout2(function() {
56223         context.map().on("move.intro drawn.intro", function() {
56224           revealPlayground(
56225             playground,
56226             finishString,
56227             { duration: 0 }
56228           );
56229         });
56230       }, 250);
56231       context.on("enter.intro", function(mode) {
56232         if (mode.id === "draw-area") {
56233           return;
56234         } else if (mode.id === "select") {
56235           _areaID = context.selectedIDs()[0];
56236           return continueTo(searchPresets);
56237         } else {
56238           return chapter.restart();
56239         }
56240       });
56241       function continueTo(nextStep) {
56242         context.map().on("move.intro drawn.intro", null);
56243         context.on("enter.intro", null);
56244         nextStep();
56245       }
56246     }
56247     function searchPresets() {
56248       if (!_areaID || !context.hasEntity(_areaID)) {
56249         return addArea();
56250       }
56251       var ids = context.selectedIDs();
56252       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
56253         context.enter(modeSelect(context, [_areaID]));
56254       }
56255       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56256       timeout2(function() {
56257         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
56258         context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
56259         reveal(
56260           ".preset-search-input",
56261           helpHtml("intro.areas.search_playground", { preset: playgroundPreset.name() })
56262         );
56263       }, 400);
56264       context.on("enter.intro", function(mode) {
56265         if (!_areaID || !context.hasEntity(_areaID)) {
56266           return continueTo(addArea);
56267         }
56268         var ids2 = context.selectedIDs();
56269         if (mode.id !== "select" || !ids2.length || ids2[0] !== _areaID) {
56270           context.enter(modeSelect(context, [_areaID]));
56271           context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
56272           context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56273           context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
56274           reveal(
56275             ".preset-search-input",
56276             helpHtml("intro.areas.search_playground", { preset: playgroundPreset.name() })
56277           );
56278           context.history().on("change.intro", null);
56279         }
56280       });
56281       function checkPresetSearch() {
56282         var first = context.container().select(".preset-list-item:first-child");
56283         if (first.classed("preset-leisure-playground")) {
56284           reveal(
56285             first.select(".preset-list-button").node(),
56286             helpHtml("intro.areas.choose_playground", { preset: playgroundPreset.name() }),
56287             { duration: 300 }
56288           );
56289           context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
56290           context.history().on("change.intro", function() {
56291             continueTo(clickAddField);
56292           });
56293         }
56294       }
56295       function continueTo(nextStep) {
56296         context.container().select(".inspector-wrap").on("wheel.intro", null);
56297         context.on("enter.intro", null);
56298         context.history().on("change.intro", null);
56299         context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
56300         nextStep();
56301       }
56302     }
56303     function clickAddField() {
56304       if (!_areaID || !context.hasEntity(_areaID)) {
56305         return addArea();
56306       }
56307       var ids = context.selectedIDs();
56308       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
56309         return searchPresets();
56310       }
56311       if (!context.container().select(".form-field-description").empty()) {
56312         return continueTo(describePlayground);
56313       }
56314       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56315       timeout2(function() {
56316         context.container().select(".inspector-wrap .panewrap").style("right", "0%");
56317         var entity = context.entity(_areaID);
56318         if (entity.tags.description) {
56319           return continueTo(play);
56320         }
56321         var box = context.container().select(".more-fields").node().getBoundingClientRect();
56322         if (box.top > 300) {
56323           var pane = context.container().select(".entity-editor-pane .inspector-body");
56324           var start2 = pane.node().scrollTop;
56325           var end = start2 + (box.top - 300);
56326           pane.transition().duration(250).tween("scroll.inspector", function() {
56327             var node = this;
56328             var i2 = number_default(start2, end);
56329             return function(t) {
56330               node.scrollTop = i2(t);
56331             };
56332           });
56333         }
56334         timeout2(function() {
56335           reveal(
56336             ".more-fields .combobox-input",
56337             helpHtml("intro.areas.add_field", {
56338               name: nameField.title(),
56339               description: descriptionField.title()
56340             }),
56341             { duration: 300 }
56342           );
56343           context.container().select(".more-fields .combobox-input").on("click.intro", function() {
56344             var watcher;
56345             watcher = window.setInterval(function() {
56346               if (!context.container().select("div.combobox").empty()) {
56347                 window.clearInterval(watcher);
56348                 continueTo(chooseDescriptionField);
56349               }
56350             }, 300);
56351           });
56352         }, 300);
56353       }, 400);
56354       context.on("exit.intro", function() {
56355         return continueTo(searchPresets);
56356       });
56357       function continueTo(nextStep) {
56358         context.container().select(".inspector-wrap").on("wheel.intro", null);
56359         context.container().select(".more-fields .combobox-input").on("click.intro", null);
56360         context.on("exit.intro", null);
56361         nextStep();
56362       }
56363     }
56364     function chooseDescriptionField() {
56365       if (!_areaID || !context.hasEntity(_areaID)) {
56366         return addArea();
56367       }
56368       var ids = context.selectedIDs();
56369       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
56370         return searchPresets();
56371       }
56372       if (!context.container().select(".form-field-description").empty()) {
56373         return continueTo(describePlayground);
56374       }
56375       if (context.container().select("div.combobox").empty()) {
56376         return continueTo(clickAddField);
56377       }
56378       var watcher;
56379       watcher = window.setInterval(function() {
56380         if (context.container().select("div.combobox").empty()) {
56381           window.clearInterval(watcher);
56382           timeout2(function() {
56383             if (context.container().select(".form-field-description").empty()) {
56384               continueTo(retryChooseDescription);
56385             } else {
56386               continueTo(describePlayground);
56387             }
56388           }, 300);
56389         }
56390       }, 300);
56391       reveal(
56392         "div.combobox",
56393         helpHtml("intro.areas.choose_field", { field: descriptionField.title() }),
56394         { duration: 300 }
56395       );
56396       context.on("exit.intro", function() {
56397         return continueTo(searchPresets);
56398       });
56399       function continueTo(nextStep) {
56400         if (watcher)
56401           window.clearInterval(watcher);
56402         context.on("exit.intro", null);
56403         nextStep();
56404       }
56405     }
56406     function describePlayground() {
56407       if (!_areaID || !context.hasEntity(_areaID)) {
56408         return addArea();
56409       }
56410       var ids = context.selectedIDs();
56411       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
56412         return searchPresets();
56413       }
56414       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
56415       if (context.container().select(".form-field-description").empty()) {
56416         return continueTo(retryChooseDescription);
56417       }
56418       context.on("exit.intro", function() {
56419         continueTo(play);
56420       });
56421       reveal(
56422         ".entity-editor-pane",
56423         helpHtml("intro.areas.describe_playground", { button: { html: icon("#iD-icon-close", "inline") } }),
56424         { duration: 300 }
56425       );
56426       function continueTo(nextStep) {
56427         context.on("exit.intro", null);
56428         nextStep();
56429       }
56430     }
56431     function retryChooseDescription() {
56432       if (!_areaID || !context.hasEntity(_areaID)) {
56433         return addArea();
56434       }
56435       var ids = context.selectedIDs();
56436       if (context.mode().id !== "select" || !ids.length || ids[0] !== _areaID) {
56437         return searchPresets();
56438       }
56439       context.container().select(".inspector-wrap .panewrap").style("right", "0%");
56440       reveal(
56441         ".entity-editor-pane",
56442         helpHtml("intro.areas.retry_add_field", { field: descriptionField.title() }),
56443         {
56444           buttonText: _t.html("intro.ok"),
56445           buttonCallback: function() {
56446             continueTo(clickAddField);
56447           }
56448         }
56449       );
56450       context.on("exit.intro", function() {
56451         return continueTo(searchPresets);
56452       });
56453       function continueTo(nextStep) {
56454         context.on("exit.intro", null);
56455         nextStep();
56456       }
56457     }
56458     function play() {
56459       dispatch10.call("done");
56460       reveal(
56461         ".ideditor",
56462         helpHtml("intro.areas.play", { next: _t("intro.lines.title") }),
56463         {
56464           tooltipBox: ".intro-nav-wrap .chapter-line",
56465           buttonText: _t.html("intro.ok"),
56466           buttonCallback: function() {
56467             reveal(".ideditor");
56468           }
56469         }
56470       );
56471     }
56472     chapter.enter = function() {
56473       addArea();
56474     };
56475     chapter.exit = function() {
56476       timeouts.forEach(window.clearTimeout);
56477       context.on("enter.intro exit.intro", null);
56478       context.map().on("move.intro drawn.intro", null);
56479       context.history().on("change.intro", null);
56480       context.container().select(".inspector-wrap").on("wheel.intro", null);
56481       context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
56482       context.container().select(".more-fields .combobox-input").on("click.intro", null);
56483     };
56484     chapter.restart = function() {
56485       chapter.exit();
56486       chapter.enter();
56487     };
56488     return utilRebind(chapter, dispatch10, "on");
56489   }
56490
56491   // modules/ui/intro/line.js
56492   function uiIntroLine(context, reveal) {
56493     var dispatch10 = dispatch_default("done");
56494     var timeouts = [];
56495     var _tulipRoadID = null;
56496     var flowerRoadID = "w646";
56497     var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
56498     var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
56499     var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
56500     var roadCategory = _mainPresetIndex.item("category-road_minor");
56501     var residentialPreset = _mainPresetIndex.item("highway/residential");
56502     var woodRoadID = "w525";
56503     var woodRoadEndID = "n2862";
56504     var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
56505     var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
56506     var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
56507     var washingtonStreetID = "w522";
56508     var twelfthAvenueID = "w1";
56509     var eleventhAvenueEndID = "n3550";
56510     var twelfthAvenueEndID = "n5";
56511     var _washingtonSegmentID = null;
56512     var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
56513     var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
56514     var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
56515     var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
56516     var chapter = {
56517       title: "intro.lines.title"
56518     };
56519     function timeout2(f2, t) {
56520       timeouts.push(window.setTimeout(f2, t));
56521     }
56522     function eventCancel(d3_event) {
56523       d3_event.stopPropagation();
56524       d3_event.preventDefault();
56525     }
56526     function addLine() {
56527       context.enter(modeBrowse(context));
56528       context.history().reset("initial");
56529       var msec = transitionTime(tulipRoadStart, context.map().center());
56530       if (msec) {
56531         reveal(null, null, { duration: 0 });
56532       }
56533       context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
56534       timeout2(function() {
56535         var tooltip = reveal(
56536           "button.add-line",
56537           helpHtml("intro.lines.add_line")
56538         );
56539         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-lines");
56540         context.on("enter.intro", function(mode) {
56541           if (mode.id !== "add-line")
56542             return;
56543           continueTo(startLine);
56544         });
56545       }, msec + 100);
56546       function continueTo(nextStep) {
56547         context.on("enter.intro", null);
56548         nextStep();
56549       }
56550     }
56551     function startLine() {
56552       if (context.mode().id !== "add-line")
56553         return chapter.restart();
56554       _tulipRoadID = null;
56555       var padding = 70 * Math.pow(2, context.map().zoom() - 18);
56556       var box = pad(tulipRoadStart, padding, context);
56557       box.height = box.height + 100;
56558       var textId = context.lastPointerType() === "mouse" ? "start_line" : "start_line_tap";
56559       var startLineString = helpHtml("intro.lines.missing_road") + "{br}" + helpHtml("intro.lines.line_draw_info") + helpHtml("intro.lines." + textId);
56560       reveal(box, startLineString);
56561       context.map().on("move.intro drawn.intro", function() {
56562         padding = 70 * Math.pow(2, context.map().zoom() - 18);
56563         box = pad(tulipRoadStart, padding, context);
56564         box.height = box.height + 100;
56565         reveal(box, startLineString, { duration: 0 });
56566       });
56567       context.on("enter.intro", function(mode) {
56568         if (mode.id !== "draw-line")
56569           return chapter.restart();
56570         continueTo(drawLine);
56571       });
56572       function continueTo(nextStep) {
56573         context.map().on("move.intro drawn.intro", null);
56574         context.on("enter.intro", null);
56575         nextStep();
56576       }
56577     }
56578     function drawLine() {
56579       if (context.mode().id !== "draw-line")
56580         return chapter.restart();
56581       _tulipRoadID = context.mode().selectedIDs()[0];
56582       context.map().centerEase(tulipRoadMidpoint, 500);
56583       timeout2(function() {
56584         var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
56585         var box = pad(tulipRoadMidpoint, padding, context);
56586         box.height = box.height * 2;
56587         reveal(
56588           box,
56589           helpHtml("intro.lines.intersect", { name: _t("intro.graph.name.flower-street") })
56590         );
56591         context.map().on("move.intro drawn.intro", function() {
56592           padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
56593           box = pad(tulipRoadMidpoint, padding, context);
56594           box.height = box.height * 2;
56595           reveal(
56596             box,
56597             helpHtml("intro.lines.intersect", { name: _t("intro.graph.name.flower-street") }),
56598             { duration: 0 }
56599           );
56600         });
56601       }, 550);
56602       context.history().on("change.intro", function() {
56603         if (isLineConnected()) {
56604           continueTo(continueLine);
56605         }
56606       });
56607       context.on("enter.intro", function(mode) {
56608         if (mode.id === "draw-line") {
56609           return;
56610         } else if (mode.id === "select") {
56611           continueTo(retryIntersect);
56612           return;
56613         } else {
56614           return chapter.restart();
56615         }
56616       });
56617       function continueTo(nextStep) {
56618         context.map().on("move.intro drawn.intro", null);
56619         context.history().on("change.intro", null);
56620         context.on("enter.intro", null);
56621         nextStep();
56622       }
56623     }
56624     function isLineConnected() {
56625       var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
56626       if (!entity)
56627         return false;
56628       var drawNodes = context.graph().childNodes(entity);
56629       return drawNodes.some(function(node) {
56630         return context.graph().parentWays(node).some(function(parent) {
56631           return parent.id === flowerRoadID;
56632         });
56633       });
56634     }
56635     function retryIntersect() {
56636       select_default2(window).on("pointerdown.intro mousedown.intro", eventCancel, true);
56637       var box = pad(tulipRoadIntersection, 80, context);
56638       reveal(
56639         box,
56640         helpHtml("intro.lines.retry_intersect", { name: _t("intro.graph.name.flower-street") })
56641       );
56642       timeout2(chapter.restart, 3e3);
56643     }
56644     function continueLine() {
56645       if (context.mode().id !== "draw-line")
56646         return chapter.restart();
56647       var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
56648       if (!entity)
56649         return chapter.restart();
56650       context.map().centerEase(tulipRoadIntersection, 500);
56651       var continueLineText = helpHtml("intro.lines.continue_line") + "{br}" + helpHtml("intro.lines.finish_line_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.lines.finish_road");
56652       reveal(".surface", continueLineText);
56653       context.on("enter.intro", function(mode) {
56654         if (mode.id === "draw-line") {
56655           return;
56656         } else if (mode.id === "select") {
56657           return continueTo(chooseCategoryRoad);
56658         } else {
56659           return chapter.restart();
56660         }
56661       });
56662       function continueTo(nextStep) {
56663         context.on("enter.intro", null);
56664         nextStep();
56665       }
56666     }
56667     function chooseCategoryRoad() {
56668       if (context.mode().id !== "select")
56669         return chapter.restart();
56670       context.on("exit.intro", function() {
56671         return chapter.restart();
56672       });
56673       var button = context.container().select(".preset-category-road_minor .preset-list-button");
56674       if (button.empty())
56675         return chapter.restart();
56676       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56677       timeout2(function() {
56678         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
56679         reveal(
56680           button.node(),
56681           helpHtml("intro.lines.choose_category_road", { category: roadCategory.name() })
56682         );
56683         button.on("click.intro", function() {
56684           continueTo(choosePresetResidential);
56685         });
56686       }, 400);
56687       function continueTo(nextStep) {
56688         context.container().select(".inspector-wrap").on("wheel.intro", null);
56689         context.container().select(".preset-list-button").on("click.intro", null);
56690         context.on("exit.intro", null);
56691         nextStep();
56692       }
56693     }
56694     function choosePresetResidential() {
56695       if (context.mode().id !== "select")
56696         return chapter.restart();
56697       context.on("exit.intro", function() {
56698         return chapter.restart();
56699       });
56700       var subgrid = context.container().select(".preset-category-road_minor .subgrid");
56701       if (subgrid.empty())
56702         return chapter.restart();
56703       subgrid.selectAll(":not(.preset-highway-residential) .preset-list-button").on("click.intro", function() {
56704         continueTo(retryPresetResidential);
56705       });
56706       subgrid.selectAll(".preset-highway-residential .preset-list-button").on("click.intro", function() {
56707         continueTo(nameRoad);
56708       });
56709       timeout2(function() {
56710         reveal(
56711           subgrid.node(),
56712           helpHtml("intro.lines.choose_preset_residential", { preset: residentialPreset.name() }),
56713           { tooltipBox: ".preset-highway-residential .preset-list-button", duration: 300 }
56714         );
56715       }, 300);
56716       function continueTo(nextStep) {
56717         context.container().select(".preset-list-button").on("click.intro", null);
56718         context.on("exit.intro", null);
56719         nextStep();
56720       }
56721     }
56722     function retryPresetResidential() {
56723       if (context.mode().id !== "select")
56724         return chapter.restart();
56725       context.on("exit.intro", function() {
56726         return chapter.restart();
56727       });
56728       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
56729       timeout2(function() {
56730         var button = context.container().select(".entity-editor-pane .preset-list-button");
56731         reveal(
56732           button.node(),
56733           helpHtml("intro.lines.retry_preset_residential", { preset: residentialPreset.name() })
56734         );
56735         button.on("click.intro", function() {
56736           continueTo(chooseCategoryRoad);
56737         });
56738       }, 500);
56739       function continueTo(nextStep) {
56740         context.container().select(".inspector-wrap").on("wheel.intro", null);
56741         context.container().select(".preset-list-button").on("click.intro", null);
56742         context.on("exit.intro", null);
56743         nextStep();
56744       }
56745     }
56746     function nameRoad() {
56747       context.on("exit.intro", function() {
56748         continueTo(didNameRoad);
56749       });
56750       timeout2(function() {
56751         reveal(
56752           ".entity-editor-pane",
56753           helpHtml("intro.lines.name_road", { button: { html: icon("#iD-icon-close", "inline") } }),
56754           { tooltipClass: "intro-lines-name_road" }
56755         );
56756       }, 500);
56757       function continueTo(nextStep) {
56758         context.on("exit.intro", null);
56759         nextStep();
56760       }
56761     }
56762     function didNameRoad() {
56763       context.history().checkpoint("doneAddLine");
56764       timeout2(function() {
56765         reveal(".surface", helpHtml("intro.lines.did_name_road"), {
56766           buttonText: _t.html("intro.ok"),
56767           buttonCallback: function() {
56768             continueTo(updateLine);
56769           }
56770         });
56771       }, 500);
56772       function continueTo(nextStep) {
56773         nextStep();
56774       }
56775     }
56776     function updateLine() {
56777       context.history().reset("doneAddLine");
56778       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56779         return chapter.restart();
56780       }
56781       var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
56782       if (msec) {
56783         reveal(null, null, { duration: 0 });
56784       }
56785       context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
56786       timeout2(function() {
56787         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
56788         var box = pad(woodRoadDragMidpoint, padding, context);
56789         var advance = function() {
56790           continueTo(addNode);
56791         };
56792         reveal(
56793           box,
56794           helpHtml("intro.lines.update_line"),
56795           { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56796         );
56797         context.map().on("move.intro drawn.intro", function() {
56798           var padding2 = 250 * Math.pow(2, context.map().zoom() - 19);
56799           var box2 = pad(woodRoadDragMidpoint, padding2, context);
56800           reveal(
56801             box2,
56802             helpHtml("intro.lines.update_line"),
56803             { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
56804           );
56805         });
56806       }, msec + 100);
56807       function continueTo(nextStep) {
56808         context.map().on("move.intro drawn.intro", null);
56809         nextStep();
56810       }
56811     }
56812     function addNode() {
56813       context.history().reset("doneAddLine");
56814       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56815         return chapter.restart();
56816       }
56817       var padding = 40 * Math.pow(2, context.map().zoom() - 19);
56818       var box = pad(woodRoadAddNode, padding, context);
56819       var addNodeString = helpHtml("intro.lines.add_node" + (context.lastPointerType() === "mouse" ? "" : "_touch"));
56820       reveal(box, addNodeString);
56821       context.map().on("move.intro drawn.intro", function() {
56822         var padding2 = 40 * Math.pow(2, context.map().zoom() - 19);
56823         var box2 = pad(woodRoadAddNode, padding2, context);
56824         reveal(box2, addNodeString, { duration: 0 });
56825       });
56826       context.history().on("change.intro", function(changed) {
56827         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56828           return continueTo(updateLine);
56829         }
56830         if (changed.created().length === 1) {
56831           timeout2(function() {
56832             continueTo(startDragEndpoint);
56833           }, 500);
56834         }
56835       });
56836       context.on("enter.intro", function(mode) {
56837         if (mode.id !== "select") {
56838           continueTo(updateLine);
56839         }
56840       });
56841       function continueTo(nextStep) {
56842         context.map().on("move.intro drawn.intro", null);
56843         context.history().on("change.intro", null);
56844         context.on("enter.intro", null);
56845         nextStep();
56846       }
56847     }
56848     function startDragEndpoint() {
56849       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56850         return continueTo(updateLine);
56851       }
56852       var padding = 100 * Math.pow(2, context.map().zoom() - 19);
56853       var box = pad(woodRoadDragEndpoint, padding, context);
56854       var startDragString = helpHtml("intro.lines.start_drag_endpoint" + (context.lastPointerType() === "mouse" ? "" : "_touch")) + helpHtml("intro.lines.drag_to_intersection");
56855       reveal(box, startDragString);
56856       context.map().on("move.intro drawn.intro", function() {
56857         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56858           return continueTo(updateLine);
56859         }
56860         var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
56861         var box2 = pad(woodRoadDragEndpoint, padding2, context);
56862         reveal(box2, startDragString, { duration: 0 });
56863         var entity = context.entity(woodRoadEndID);
56864         if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
56865           continueTo(finishDragEndpoint);
56866         }
56867       });
56868       function continueTo(nextStep) {
56869         context.map().on("move.intro drawn.intro", null);
56870         nextStep();
56871       }
56872     }
56873     function finishDragEndpoint() {
56874       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56875         return continueTo(updateLine);
56876       }
56877       var padding = 100 * Math.pow(2, context.map().zoom() - 19);
56878       var box = pad(woodRoadDragEndpoint, padding, context);
56879       var finishDragString = helpHtml("intro.lines.spot_looks_good") + helpHtml("intro.lines.finish_drag_endpoint" + (context.lastPointerType() === "mouse" ? "" : "_touch"));
56880       reveal(box, finishDragString);
56881       context.map().on("move.intro drawn.intro", function() {
56882         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56883           return continueTo(updateLine);
56884         }
56885         var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
56886         var box2 = pad(woodRoadDragEndpoint, padding2, context);
56887         reveal(box2, finishDragString, { duration: 0 });
56888         var entity = context.entity(woodRoadEndID);
56889         if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
56890           continueTo(startDragEndpoint);
56891         }
56892       });
56893       context.on("enter.intro", function() {
56894         continueTo(startDragMidpoint);
56895       });
56896       function continueTo(nextStep) {
56897         context.map().on("move.intro drawn.intro", null);
56898         context.on("enter.intro", null);
56899         nextStep();
56900       }
56901     }
56902     function startDragMidpoint() {
56903       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56904         return continueTo(updateLine);
56905       }
56906       if (context.selectedIDs().indexOf(woodRoadID) === -1) {
56907         context.enter(modeSelect(context, [woodRoadID]));
56908       }
56909       var padding = 80 * Math.pow(2, context.map().zoom() - 19);
56910       var box = pad(woodRoadDragMidpoint, padding, context);
56911       reveal(box, helpHtml("intro.lines.start_drag_midpoint"));
56912       context.map().on("move.intro drawn.intro", function() {
56913         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56914           return continueTo(updateLine);
56915         }
56916         var padding2 = 80 * Math.pow(2, context.map().zoom() - 19);
56917         var box2 = pad(woodRoadDragMidpoint, padding2, context);
56918         reveal(box2, helpHtml("intro.lines.start_drag_midpoint"), { duration: 0 });
56919       });
56920       context.history().on("change.intro", function(changed) {
56921         if (changed.created().length === 1) {
56922           continueTo(continueDragMidpoint);
56923         }
56924       });
56925       context.on("enter.intro", function(mode) {
56926         if (mode.id !== "select") {
56927           context.enter(modeSelect(context, [woodRoadID]));
56928         }
56929       });
56930       function continueTo(nextStep) {
56931         context.map().on("move.intro drawn.intro", null);
56932         context.history().on("change.intro", null);
56933         context.on("enter.intro", null);
56934         nextStep();
56935       }
56936     }
56937     function continueDragMidpoint() {
56938       if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56939         return continueTo(updateLine);
56940       }
56941       var padding = 100 * Math.pow(2, context.map().zoom() - 19);
56942       var box = pad(woodRoadDragEndpoint, padding, context);
56943       box.height += 400;
56944       var advance = function() {
56945         context.history().checkpoint("doneUpdateLine");
56946         continueTo(deleteLines);
56947       };
56948       reveal(
56949         box,
56950         helpHtml("intro.lines.continue_drag_midpoint"),
56951         { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56952       );
56953       context.map().on("move.intro drawn.intro", function() {
56954         if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
56955           return continueTo(updateLine);
56956         }
56957         var padding2 = 100 * Math.pow(2, context.map().zoom() - 19);
56958         var box2 = pad(woodRoadDragEndpoint, padding2, context);
56959         box2.height += 400;
56960         reveal(
56961           box2,
56962           helpHtml("intro.lines.continue_drag_midpoint"),
56963           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
56964         );
56965       });
56966       function continueTo(nextStep) {
56967         context.map().on("move.intro drawn.intro", null);
56968         nextStep();
56969       }
56970     }
56971     function deleteLines() {
56972       context.history().reset("doneUpdateLine");
56973       context.enter(modeBrowse(context));
56974       if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
56975         return chapter.restart();
56976       }
56977       var msec = transitionTime(deleteLinesLoc, context.map().center());
56978       if (msec) {
56979         reveal(null, null, { duration: 0 });
56980       }
56981       context.map().centerZoomEase(deleteLinesLoc, 18, msec);
56982       timeout2(function() {
56983         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56984         var box = pad(deleteLinesLoc, padding, context);
56985         box.top -= 200;
56986         box.height += 400;
56987         var advance = function() {
56988           continueTo(rightClickIntersection);
56989         };
56990         reveal(
56991           box,
56992           helpHtml("intro.lines.delete_lines", { street: _t("intro.graph.name.12th-avenue") }),
56993           { buttonText: _t.html("intro.ok"), buttonCallback: advance }
56994         );
56995         context.map().on("move.intro drawn.intro", function() {
56996           var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
56997           var box2 = pad(deleteLinesLoc, padding2, context);
56998           box2.top -= 200;
56999           box2.height += 400;
57000           reveal(
57001             box2,
57002             helpHtml("intro.lines.delete_lines", { street: _t("intro.graph.name.12th-avenue") }),
57003             { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
57004           );
57005         });
57006         context.history().on("change.intro", function() {
57007           timeout2(function() {
57008             continueTo(deleteLines);
57009           }, 500);
57010         });
57011       }, msec + 100);
57012       function continueTo(nextStep) {
57013         context.map().on("move.intro drawn.intro", null);
57014         context.history().on("change.intro", null);
57015         nextStep();
57016       }
57017     }
57018     function rightClickIntersection() {
57019       context.history().reset("doneUpdateLine");
57020       context.enter(modeBrowse(context));
57021       context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
57022       var rightClickString = helpHtml("intro.lines.split_street", {
57023         street1: _t("intro.graph.name.11th-avenue"),
57024         street2: _t("intro.graph.name.washington-street")
57025       }) + helpHtml("intro.lines." + (context.lastPointerType() === "mouse" ? "rightclick_intersection" : "edit_menu_intersection_touch"));
57026       timeout2(function() {
57027         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
57028         var box = pad(eleventhAvenueEnd, padding, context);
57029         reveal(box, rightClickString);
57030         context.map().on("move.intro drawn.intro", function() {
57031           var padding2 = 60 * Math.pow(2, context.map().zoom() - 18);
57032           var box2 = pad(eleventhAvenueEnd, padding2, context);
57033           reveal(
57034             box2,
57035             rightClickString,
57036             { duration: 0 }
57037           );
57038         });
57039         context.on("enter.intro", function(mode) {
57040           if (mode.id !== "select")
57041             return;
57042           var ids = context.selectedIDs();
57043           if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID)
57044             return;
57045           timeout2(function() {
57046             var node = selectMenuItem(context, "split").node();
57047             if (!node)
57048               return;
57049             continueTo(splitIntersection);
57050           }, 50);
57051         });
57052         context.history().on("change.intro", function() {
57053           timeout2(function() {
57054             continueTo(deleteLines);
57055           }, 300);
57056         });
57057       }, 600);
57058       function continueTo(nextStep) {
57059         context.map().on("move.intro drawn.intro", null);
57060         context.on("enter.intro", null);
57061         context.history().on("change.intro", null);
57062         nextStep();
57063       }
57064     }
57065     function splitIntersection() {
57066       if (!context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57067         return continueTo(deleteLines);
57068       }
57069       var node = selectMenuItem(context, "split").node();
57070       if (!node) {
57071         return continueTo(rightClickIntersection);
57072       }
57073       var wasChanged = false;
57074       _washingtonSegmentID = null;
57075       reveal(
57076         ".edit-menu",
57077         helpHtml(
57078           "intro.lines.split_intersection",
57079           { street: _t("intro.graph.name.washington-street") }
57080         ),
57081         { padding: 50 }
57082       );
57083       context.map().on("move.intro drawn.intro", function() {
57084         var node2 = selectMenuItem(context, "split").node();
57085         if (!wasChanged && !node2) {
57086           return continueTo(rightClickIntersection);
57087         }
57088         reveal(
57089           ".edit-menu",
57090           helpHtml(
57091             "intro.lines.split_intersection",
57092             { street: _t("intro.graph.name.washington-street") }
57093           ),
57094           { duration: 0, padding: 50 }
57095         );
57096       });
57097       context.history().on("change.intro", function(changed) {
57098         wasChanged = true;
57099         timeout2(function() {
57100           if (context.history().undoAnnotation() === _t("operations.split.annotation.line", { n: 1 })) {
57101             _washingtonSegmentID = changed.created()[0].id;
57102             continueTo(didSplit);
57103           } else {
57104             _washingtonSegmentID = null;
57105             continueTo(retrySplit);
57106           }
57107         }, 300);
57108       });
57109       function continueTo(nextStep) {
57110         context.map().on("move.intro drawn.intro", null);
57111         context.history().on("change.intro", null);
57112         nextStep();
57113       }
57114     }
57115     function retrySplit() {
57116       context.enter(modeBrowse(context));
57117       context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
57118       var advance = function() {
57119         continueTo(rightClickIntersection);
57120       };
57121       var padding = 60 * Math.pow(2, context.map().zoom() - 18);
57122       var box = pad(eleventhAvenueEnd, padding, context);
57123       reveal(
57124         box,
57125         helpHtml("intro.lines.retry_split"),
57126         { buttonText: _t.html("intro.ok"), buttonCallback: advance }
57127       );
57128       context.map().on("move.intro drawn.intro", function() {
57129         var padding2 = 60 * Math.pow(2, context.map().zoom() - 18);
57130         var box2 = pad(eleventhAvenueEnd, padding2, context);
57131         reveal(
57132           box2,
57133           helpHtml("intro.lines.retry_split"),
57134           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: advance }
57135         );
57136       });
57137       function continueTo(nextStep) {
57138         context.map().on("move.intro drawn.intro", null);
57139         nextStep();
57140       }
57141     }
57142     function didSplit() {
57143       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57144         return continueTo(rightClickIntersection);
57145       }
57146       var ids = context.selectedIDs();
57147       var string = "intro.lines.did_split_" + (ids.length > 1 ? "multi" : "single");
57148       var street = _t("intro.graph.name.washington-street");
57149       var padding = 200 * Math.pow(2, context.map().zoom() - 18);
57150       var box = pad(twelfthAvenue, padding, context);
57151       box.width = box.width / 2;
57152       reveal(
57153         box,
57154         helpHtml(string, { street1: street, street2: street }),
57155         { duration: 500 }
57156       );
57157       timeout2(function() {
57158         context.map().centerZoomEase(twelfthAvenue, 18, 500);
57159         context.map().on("move.intro drawn.intro", function() {
57160           var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
57161           var box2 = pad(twelfthAvenue, padding2, context);
57162           box2.width = box2.width / 2;
57163           reveal(
57164             box2,
57165             helpHtml(string, { street1: street, street2: street }),
57166             { duration: 0 }
57167           );
57168         });
57169       }, 600);
57170       context.on("enter.intro", function() {
57171         var ids2 = context.selectedIDs();
57172         if (ids2.length === 1 && ids2[0] === _washingtonSegmentID) {
57173           continueTo(multiSelect);
57174         }
57175       });
57176       context.history().on("change.intro", function() {
57177         if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57178           return continueTo(rightClickIntersection);
57179         }
57180       });
57181       function continueTo(nextStep) {
57182         context.map().on("move.intro drawn.intro", null);
57183         context.on("enter.intro", null);
57184         context.history().on("change.intro", null);
57185         nextStep();
57186       }
57187     }
57188     function multiSelect() {
57189       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57190         return continueTo(rightClickIntersection);
57191       }
57192       var ids = context.selectedIDs();
57193       var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
57194       var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
57195       if (hasWashington && hasTwelfth) {
57196         return continueTo(multiRightClick);
57197       } else if (!hasWashington && !hasTwelfth) {
57198         return continueTo(didSplit);
57199       }
57200       context.map().centerZoomEase(twelfthAvenue, 18, 500);
57201       timeout2(function() {
57202         var selected, other, padding, box;
57203         if (hasWashington) {
57204           selected = _t("intro.graph.name.washington-street");
57205           other = _t("intro.graph.name.12th-avenue");
57206           padding = 60 * Math.pow(2, context.map().zoom() - 18);
57207           box = pad(twelfthAvenueEnd, padding, context);
57208           box.width *= 3;
57209         } else {
57210           selected = _t("intro.graph.name.12th-avenue");
57211           other = _t("intro.graph.name.washington-street");
57212           padding = 200 * Math.pow(2, context.map().zoom() - 18);
57213           box = pad(twelfthAvenue, padding, context);
57214           box.width /= 2;
57215         }
57216         reveal(
57217           box,
57218           helpHtml(
57219             "intro.lines.multi_select",
57220             { selected, other1: other }
57221           ) + " " + helpHtml(
57222             "intro.lines.add_to_selection_" + (context.lastPointerType() === "mouse" ? "click" : "touch"),
57223             { selected, other2: other }
57224           )
57225         );
57226         context.map().on("move.intro drawn.intro", function() {
57227           if (hasWashington) {
57228             selected = _t("intro.graph.name.washington-street");
57229             other = _t("intro.graph.name.12th-avenue");
57230             padding = 60 * Math.pow(2, context.map().zoom() - 18);
57231             box = pad(twelfthAvenueEnd, padding, context);
57232             box.width *= 3;
57233           } else {
57234             selected = _t("intro.graph.name.12th-avenue");
57235             other = _t("intro.graph.name.washington-street");
57236             padding = 200 * Math.pow(2, context.map().zoom() - 18);
57237             box = pad(twelfthAvenue, padding, context);
57238             box.width /= 2;
57239           }
57240           reveal(
57241             box,
57242             helpHtml(
57243               "intro.lines.multi_select",
57244               { selected, other1: other }
57245             ) + " " + helpHtml(
57246               "intro.lines.add_to_selection_" + (context.lastPointerType() === "mouse" ? "click" : "touch"),
57247               { selected, other2: other }
57248             ),
57249             { duration: 0 }
57250           );
57251         });
57252         context.on("enter.intro", function() {
57253           continueTo(multiSelect);
57254         });
57255         context.history().on("change.intro", function() {
57256           if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57257             return continueTo(rightClickIntersection);
57258           }
57259         });
57260       }, 600);
57261       function continueTo(nextStep) {
57262         context.map().on("move.intro drawn.intro", null);
57263         context.on("enter.intro", null);
57264         context.history().on("change.intro", null);
57265         nextStep();
57266       }
57267     }
57268     function multiRightClick() {
57269       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57270         return continueTo(rightClickIntersection);
57271       }
57272       var padding = 200 * Math.pow(2, context.map().zoom() - 18);
57273       var box = pad(twelfthAvenue, padding, context);
57274       var rightClickString = helpHtml("intro.lines.multi_select_success") + helpHtml("intro.lines.multi_" + (context.lastPointerType() === "mouse" ? "rightclick" : "edit_menu_touch"));
57275       reveal(box, rightClickString);
57276       context.map().on("move.intro drawn.intro", function() {
57277         var padding2 = 200 * Math.pow(2, context.map().zoom() - 18);
57278         var box2 = pad(twelfthAvenue, padding2, context);
57279         reveal(box2, rightClickString, { duration: 0 });
57280       });
57281       context.ui().editMenu().on("toggled.intro", function(open) {
57282         if (!open)
57283           return;
57284         timeout2(function() {
57285           var ids = context.selectedIDs();
57286           if (ids.length === 2 && ids.indexOf(twelfthAvenueID) !== -1 && ids.indexOf(_washingtonSegmentID) !== -1) {
57287             var node = selectMenuItem(context, "delete").node();
57288             if (!node)
57289               return;
57290             continueTo(multiDelete);
57291           } else if (ids.length === 1 && ids.indexOf(_washingtonSegmentID) !== -1) {
57292             return continueTo(multiSelect);
57293           } else {
57294             return continueTo(didSplit);
57295           }
57296         }, 300);
57297       });
57298       context.history().on("change.intro", function() {
57299         if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57300           return continueTo(rightClickIntersection);
57301         }
57302       });
57303       function continueTo(nextStep) {
57304         context.map().on("move.intro drawn.intro", null);
57305         context.ui().editMenu().on("toggled.intro", null);
57306         context.history().on("change.intro", null);
57307         nextStep();
57308       }
57309     }
57310     function multiDelete() {
57311       if (!_washingtonSegmentID || !context.hasEntity(_washingtonSegmentID) || !context.hasEntity(washingtonStreetID) || !context.hasEntity(twelfthAvenueID) || !context.hasEntity(eleventhAvenueEndID)) {
57312         return continueTo(rightClickIntersection);
57313       }
57314       var node = selectMenuItem(context, "delete").node();
57315       if (!node)
57316         return continueTo(multiRightClick);
57317       reveal(
57318         ".edit-menu",
57319         helpHtml("intro.lines.multi_delete"),
57320         { padding: 50 }
57321       );
57322       context.map().on("move.intro drawn.intro", function() {
57323         reveal(
57324           ".edit-menu",
57325           helpHtml("intro.lines.multi_delete"),
57326           { duration: 0, padding: 50 }
57327         );
57328       });
57329       context.on("exit.intro", function() {
57330         if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
57331           return continueTo(multiSelect);
57332         }
57333       });
57334       context.history().on("change.intro", function() {
57335         if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
57336           continueTo(retryDelete);
57337         } else {
57338           continueTo(play);
57339         }
57340       });
57341       function continueTo(nextStep) {
57342         context.map().on("move.intro drawn.intro", null);
57343         context.on("exit.intro", null);
57344         context.history().on("change.intro", null);
57345         nextStep();
57346       }
57347     }
57348     function retryDelete() {
57349       context.enter(modeBrowse(context));
57350       var padding = 200 * Math.pow(2, context.map().zoom() - 18);
57351       var box = pad(twelfthAvenue, padding, context);
57352       reveal(box, helpHtml("intro.lines.retry_delete"), {
57353         buttonText: _t.html("intro.ok"),
57354         buttonCallback: function() {
57355           continueTo(multiSelect);
57356         }
57357       });
57358       function continueTo(nextStep) {
57359         nextStep();
57360       }
57361     }
57362     function play() {
57363       dispatch10.call("done");
57364       reveal(
57365         ".ideditor",
57366         helpHtml("intro.lines.play", { next: _t("intro.buildings.title") }),
57367         {
57368           tooltipBox: ".intro-nav-wrap .chapter-building",
57369           buttonText: _t.html("intro.ok"),
57370           buttonCallback: function() {
57371             reveal(".ideditor");
57372           }
57373         }
57374       );
57375     }
57376     chapter.enter = function() {
57377       addLine();
57378     };
57379     chapter.exit = function() {
57380       timeouts.forEach(window.clearTimeout);
57381       select_default2(window).on("pointerdown.intro mousedown.intro", null, true);
57382       context.on("enter.intro exit.intro", null);
57383       context.map().on("move.intro drawn.intro", null);
57384       context.history().on("change.intro", null);
57385       context.container().select(".inspector-wrap").on("wheel.intro", null);
57386       context.container().select(".preset-list-button").on("click.intro", null);
57387     };
57388     chapter.restart = function() {
57389       chapter.exit();
57390       chapter.enter();
57391     };
57392     return utilRebind(chapter, dispatch10, "on");
57393   }
57394
57395   // modules/ui/intro/building.js
57396   function uiIntroBuilding(context, reveal) {
57397     var dispatch10 = dispatch_default("done");
57398     var house = [-85.62815, 41.95638];
57399     var tank = [-85.62732, 41.95347];
57400     var buildingCatetory = _mainPresetIndex.item("category-building");
57401     var housePreset = _mainPresetIndex.item("building/house");
57402     var tankPreset = _mainPresetIndex.item("man_made/storage_tank");
57403     var timeouts = [];
57404     var _houseID = null;
57405     var _tankID = null;
57406     var chapter = {
57407       title: "intro.buildings.title"
57408     };
57409     function timeout2(f2, t) {
57410       timeouts.push(window.setTimeout(f2, t));
57411     }
57412     function eventCancel(d3_event) {
57413       d3_event.stopPropagation();
57414       d3_event.preventDefault();
57415     }
57416     function revealHouse(center, text2, options2) {
57417       var padding = 160 * Math.pow(2, context.map().zoom() - 20);
57418       var box = pad(center, padding, context);
57419       reveal(box, text2, options2);
57420     }
57421     function revealTank(center, text2, options2) {
57422       var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
57423       var box = pad(center, padding, context);
57424       reveal(box, text2, options2);
57425     }
57426     function addHouse() {
57427       context.enter(modeBrowse(context));
57428       context.history().reset("initial");
57429       _houseID = null;
57430       var msec = transitionTime(house, context.map().center());
57431       if (msec) {
57432         reveal(null, null, { duration: 0 });
57433       }
57434       context.map().centerZoomEase(house, 19, msec);
57435       timeout2(function() {
57436         var tooltip = reveal(
57437           "button.add-area",
57438           helpHtml("intro.buildings.add_building")
57439         );
57440         tooltip.selectAll(".popover-inner").insert("svg", "span").attr("class", "tooltip-illustration").append("use").attr("xlink:href", "#iD-graphic-buildings");
57441         context.on("enter.intro", function(mode) {
57442           if (mode.id !== "add-area")
57443             return;
57444           continueTo(startHouse);
57445         });
57446       }, msec + 100);
57447       function continueTo(nextStep) {
57448         context.on("enter.intro", null);
57449         nextStep();
57450       }
57451     }
57452     function startHouse() {
57453       if (context.mode().id !== "add-area") {
57454         return continueTo(addHouse);
57455       }
57456       _houseID = null;
57457       context.map().zoomEase(20, 500);
57458       timeout2(function() {
57459         var startString = helpHtml("intro.buildings.start_building") + helpHtml("intro.buildings.building_corner_" + (context.lastPointerType() === "mouse" ? "click" : "tap"));
57460         revealHouse(house, startString);
57461         context.map().on("move.intro drawn.intro", function() {
57462           revealHouse(house, startString, { duration: 0 });
57463         });
57464         context.on("enter.intro", function(mode) {
57465           if (mode.id !== "draw-area")
57466             return chapter.restart();
57467           continueTo(continueHouse);
57468         });
57469       }, 550);
57470       function continueTo(nextStep) {
57471         context.map().on("move.intro drawn.intro", null);
57472         context.on("enter.intro", null);
57473         nextStep();
57474       }
57475     }
57476     function continueHouse() {
57477       if (context.mode().id !== "draw-area") {
57478         return continueTo(addHouse);
57479       }
57480       _houseID = null;
57481       var continueString = helpHtml("intro.buildings.continue_building") + "{br}" + helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.buildings.finish_building");
57482       revealHouse(house, continueString);
57483       context.map().on("move.intro drawn.intro", function() {
57484         revealHouse(house, continueString, { duration: 0 });
57485       });
57486       context.on("enter.intro", function(mode) {
57487         if (mode.id === "draw-area") {
57488           return;
57489         } else if (mode.id === "select") {
57490           var graph = context.graph();
57491           var way = context.entity(context.selectedIDs()[0]);
57492           var nodes = graph.childNodes(way);
57493           var points = utilArrayUniq(nodes).map(function(n2) {
57494             return context.projection(n2.loc);
57495           });
57496           if (isMostlySquare(points)) {
57497             _houseID = way.id;
57498             return continueTo(chooseCategoryBuilding);
57499           } else {
57500             return continueTo(retryHouse);
57501           }
57502         } else {
57503           return chapter.restart();
57504         }
57505       });
57506       function continueTo(nextStep) {
57507         context.map().on("move.intro drawn.intro", null);
57508         context.on("enter.intro", null);
57509         nextStep();
57510       }
57511     }
57512     function retryHouse() {
57513       var onClick = function() {
57514         continueTo(addHouse);
57515       };
57516       revealHouse(
57517         house,
57518         helpHtml("intro.buildings.retry_building"),
57519         { buttonText: _t.html("intro.ok"), buttonCallback: onClick }
57520       );
57521       context.map().on("move.intro drawn.intro", function() {
57522         revealHouse(
57523           house,
57524           helpHtml("intro.buildings.retry_building"),
57525           { duration: 0, buttonText: _t.html("intro.ok"), buttonCallback: onClick }
57526         );
57527       });
57528       function continueTo(nextStep) {
57529         context.map().on("move.intro drawn.intro", null);
57530         nextStep();
57531       }
57532     }
57533     function chooseCategoryBuilding() {
57534       if (!_houseID || !context.hasEntity(_houseID)) {
57535         return addHouse();
57536       }
57537       var ids = context.selectedIDs();
57538       if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
57539         context.enter(modeSelect(context, [_houseID]));
57540       }
57541       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57542       timeout2(function() {
57543         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57544         var button = context.container().select(".preset-category-building .preset-list-button");
57545         reveal(
57546           button.node(),
57547           helpHtml("intro.buildings.choose_category_building", { category: buildingCatetory.name() })
57548         );
57549         button.on("click.intro", function() {
57550           button.on("click.intro", null);
57551           continueTo(choosePresetHouse);
57552         });
57553       }, 400);
57554       context.on("enter.intro", function(mode) {
57555         if (!_houseID || !context.hasEntity(_houseID)) {
57556           return continueTo(addHouse);
57557         }
57558         var ids2 = context.selectedIDs();
57559         if (mode.id !== "select" || !ids2.length || ids2[0] !== _houseID) {
57560           return continueTo(chooseCategoryBuilding);
57561         }
57562       });
57563       function continueTo(nextStep) {
57564         context.container().select(".inspector-wrap").on("wheel.intro", null);
57565         context.container().select(".preset-list-button").on("click.intro", null);
57566         context.on("enter.intro", null);
57567         nextStep();
57568       }
57569     }
57570     function choosePresetHouse() {
57571       if (!_houseID || !context.hasEntity(_houseID)) {
57572         return addHouse();
57573       }
57574       var ids = context.selectedIDs();
57575       if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
57576         context.enter(modeSelect(context, [_houseID]));
57577       }
57578       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57579       timeout2(function() {
57580         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57581         var button = context.container().select(".preset-building-house .preset-list-button");
57582         reveal(
57583           button.node(),
57584           helpHtml("intro.buildings.choose_preset_house", { preset: housePreset.name() }),
57585           { duration: 300 }
57586         );
57587         button.on("click.intro", function() {
57588           button.on("click.intro", null);
57589           continueTo(closeEditorHouse);
57590         });
57591       }, 400);
57592       context.on("enter.intro", function(mode) {
57593         if (!_houseID || !context.hasEntity(_houseID)) {
57594           return continueTo(addHouse);
57595         }
57596         var ids2 = context.selectedIDs();
57597         if (mode.id !== "select" || !ids2.length || ids2[0] !== _houseID) {
57598           return continueTo(chooseCategoryBuilding);
57599         }
57600       });
57601       function continueTo(nextStep) {
57602         context.container().select(".inspector-wrap").on("wheel.intro", null);
57603         context.container().select(".preset-list-button").on("click.intro", null);
57604         context.on("enter.intro", null);
57605         nextStep();
57606       }
57607     }
57608     function closeEditorHouse() {
57609       if (!_houseID || !context.hasEntity(_houseID)) {
57610         return addHouse();
57611       }
57612       var ids = context.selectedIDs();
57613       if (context.mode().id !== "select" || !ids.length || ids[0] !== _houseID) {
57614         context.enter(modeSelect(context, [_houseID]));
57615       }
57616       context.history().checkpoint("hasHouse");
57617       context.on("exit.intro", function() {
57618         continueTo(rightClickHouse);
57619       });
57620       timeout2(function() {
57621         reveal(
57622           ".entity-editor-pane",
57623           helpHtml("intro.buildings.close", { button: { html: icon("#iD-icon-close", "inline") } })
57624         );
57625       }, 500);
57626       function continueTo(nextStep) {
57627         context.on("exit.intro", null);
57628         nextStep();
57629       }
57630     }
57631     function rightClickHouse() {
57632       if (!_houseID)
57633         return chapter.restart();
57634       context.enter(modeBrowse(context));
57635       context.history().reset("hasHouse");
57636       var zoom = context.map().zoom();
57637       if (zoom < 20) {
57638         zoom = 20;
57639       }
57640       context.map().centerZoomEase(house, zoom, 500);
57641       context.on("enter.intro", function(mode) {
57642         if (mode.id !== "select")
57643           return;
57644         var ids = context.selectedIDs();
57645         if (ids.length !== 1 || ids[0] !== _houseID)
57646           return;
57647         timeout2(function() {
57648           var node = selectMenuItem(context, "orthogonalize").node();
57649           if (!node)
57650             return;
57651           continueTo(clickSquare);
57652         }, 50);
57653       });
57654       context.map().on("move.intro drawn.intro", function() {
57655         var rightclickString = helpHtml("intro.buildings." + (context.lastPointerType() === "mouse" ? "rightclick_building" : "edit_menu_building_touch"));
57656         revealHouse(house, rightclickString, { duration: 0 });
57657       });
57658       context.history().on("change.intro", function() {
57659         continueTo(rightClickHouse);
57660       });
57661       function continueTo(nextStep) {
57662         context.on("enter.intro", null);
57663         context.map().on("move.intro drawn.intro", null);
57664         context.history().on("change.intro", null);
57665         nextStep();
57666       }
57667     }
57668     function clickSquare() {
57669       if (!_houseID)
57670         return chapter.restart();
57671       var entity = context.hasEntity(_houseID);
57672       if (!entity)
57673         return continueTo(rightClickHouse);
57674       var node = selectMenuItem(context, "orthogonalize").node();
57675       if (!node) {
57676         return continueTo(rightClickHouse);
57677       }
57678       var wasChanged = false;
57679       reveal(
57680         ".edit-menu",
57681         helpHtml("intro.buildings.square_building"),
57682         { padding: 50 }
57683       );
57684       context.on("enter.intro", function(mode) {
57685         if (mode.id === "browse") {
57686           continueTo(rightClickHouse);
57687         } else if (mode.id === "move" || mode.id === "rotate") {
57688           continueTo(retryClickSquare);
57689         }
57690       });
57691       context.map().on("move.intro", function() {
57692         var node2 = selectMenuItem(context, "orthogonalize").node();
57693         if (!wasChanged && !node2) {
57694           return continueTo(rightClickHouse);
57695         }
57696         reveal(
57697           ".edit-menu",
57698           helpHtml("intro.buildings.square_building"),
57699           { duration: 0, padding: 50 }
57700         );
57701       });
57702       context.history().on("change.intro", function() {
57703         wasChanged = true;
57704         context.history().on("change.intro", null);
57705         timeout2(function() {
57706           if (context.history().undoAnnotation() === _t("operations.orthogonalize.annotation.feature", { n: 1 })) {
57707             continueTo(doneSquare);
57708           } else {
57709             continueTo(retryClickSquare);
57710           }
57711         }, 500);
57712       });
57713       function continueTo(nextStep) {
57714         context.on("enter.intro", null);
57715         context.map().on("move.intro", null);
57716         context.history().on("change.intro", null);
57717         nextStep();
57718       }
57719     }
57720     function retryClickSquare() {
57721       context.enter(modeBrowse(context));
57722       revealHouse(house, helpHtml("intro.buildings.retry_square"), {
57723         buttonText: _t.html("intro.ok"),
57724         buttonCallback: function() {
57725           continueTo(rightClickHouse);
57726         }
57727       });
57728       function continueTo(nextStep) {
57729         nextStep();
57730       }
57731     }
57732     function doneSquare() {
57733       context.history().checkpoint("doneSquare");
57734       revealHouse(house, helpHtml("intro.buildings.done_square"), {
57735         buttonText: _t.html("intro.ok"),
57736         buttonCallback: function() {
57737           continueTo(addTank);
57738         }
57739       });
57740       function continueTo(nextStep) {
57741         nextStep();
57742       }
57743     }
57744     function addTank() {
57745       context.enter(modeBrowse(context));
57746       context.history().reset("doneSquare");
57747       _tankID = null;
57748       var msec = transitionTime(tank, context.map().center());
57749       if (msec) {
57750         reveal(null, null, { duration: 0 });
57751       }
57752       context.map().centerZoomEase(tank, 19.5, msec);
57753       timeout2(function() {
57754         reveal(
57755           "button.add-area",
57756           helpHtml("intro.buildings.add_tank")
57757         );
57758         context.on("enter.intro", function(mode) {
57759           if (mode.id !== "add-area")
57760             return;
57761           continueTo(startTank);
57762         });
57763       }, msec + 100);
57764       function continueTo(nextStep) {
57765         context.on("enter.intro", null);
57766         nextStep();
57767       }
57768     }
57769     function startTank() {
57770       if (context.mode().id !== "add-area") {
57771         return continueTo(addTank);
57772       }
57773       _tankID = null;
57774       timeout2(function() {
57775         var startString = helpHtml("intro.buildings.start_tank") + helpHtml("intro.buildings.tank_edge_" + (context.lastPointerType() === "mouse" ? "click" : "tap"));
57776         revealTank(tank, startString);
57777         context.map().on("move.intro drawn.intro", function() {
57778           revealTank(tank, startString, { duration: 0 });
57779         });
57780         context.on("enter.intro", function(mode) {
57781           if (mode.id !== "draw-area")
57782             return chapter.restart();
57783           continueTo(continueTank);
57784         });
57785       }, 550);
57786       function continueTo(nextStep) {
57787         context.map().on("move.intro drawn.intro", null);
57788         context.on("enter.intro", null);
57789         nextStep();
57790       }
57791     }
57792     function continueTank() {
57793       if (context.mode().id !== "draw-area") {
57794         return continueTo(addTank);
57795       }
57796       _tankID = null;
57797       var continueString = helpHtml("intro.buildings.continue_tank") + "{br}" + helpHtml("intro.areas.finish_area_" + (context.lastPointerType() === "mouse" ? "click" : "tap")) + helpHtml("intro.buildings.finish_tank");
57798       revealTank(tank, continueString);
57799       context.map().on("move.intro drawn.intro", function() {
57800         revealTank(tank, continueString, { duration: 0 });
57801       });
57802       context.on("enter.intro", function(mode) {
57803         if (mode.id === "draw-area") {
57804           return;
57805         } else if (mode.id === "select") {
57806           _tankID = context.selectedIDs()[0];
57807           return continueTo(searchPresetTank);
57808         } else {
57809           return continueTo(addTank);
57810         }
57811       });
57812       function continueTo(nextStep) {
57813         context.map().on("move.intro drawn.intro", null);
57814         context.on("enter.intro", null);
57815         nextStep();
57816       }
57817     }
57818     function searchPresetTank() {
57819       if (!_tankID || !context.hasEntity(_tankID)) {
57820         return addTank();
57821       }
57822       var ids = context.selectedIDs();
57823       if (context.mode().id !== "select" || !ids.length || ids[0] !== _tankID) {
57824         context.enter(modeSelect(context, [_tankID]));
57825       }
57826       context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57827       timeout2(function() {
57828         context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57829         context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
57830         reveal(
57831           ".preset-search-input",
57832           helpHtml("intro.buildings.search_tank", { preset: tankPreset.name() })
57833         );
57834       }, 400);
57835       context.on("enter.intro", function(mode) {
57836         if (!_tankID || !context.hasEntity(_tankID)) {
57837           return continueTo(addTank);
57838         }
57839         var ids2 = context.selectedIDs();
57840         if (mode.id !== "select" || !ids2.length || ids2[0] !== _tankID) {
57841           context.enter(modeSelect(context, [_tankID]));
57842           context.container().select(".inspector-wrap .panewrap").style("right", "-100%");
57843           context.container().select(".inspector-wrap").on("wheel.intro", eventCancel);
57844           context.container().select(".preset-search-input").on("keydown.intro", null).on("keyup.intro", checkPresetSearch);
57845           reveal(
57846             ".preset-search-input",
57847             helpHtml("intro.buildings.search_tank", { preset: tankPreset.name() })
57848           );
57849           context.history().on("change.intro", null);
57850         }
57851       });
57852       function checkPresetSearch() {
57853         var first = context.container().select(".preset-list-item:first-child");
57854         if (first.classed("preset-man_made-storage_tank")) {
57855           reveal(
57856             first.select(".preset-list-button").node(),
57857             helpHtml("intro.buildings.choose_tank", { preset: tankPreset.name() }),
57858             { duration: 300 }
57859           );
57860           context.container().select(".preset-search-input").on("keydown.intro", eventCancel, true).on("keyup.intro", null);
57861           context.history().on("change.intro", function() {
57862             continueTo(closeEditorTank);
57863           });
57864         }
57865       }
57866       function continueTo(nextStep) {
57867         context.container().select(".inspector-wrap").on("wheel.intro", null);
57868         context.on("enter.intro", null);
57869         context.history().on("change.intro", null);
57870         context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
57871         nextStep();
57872       }
57873     }
57874     function closeEditorTank() {
57875       if (!_tankID || !context.hasEntity(_tankID)) {
57876         return addTank();
57877       }
57878       var ids = context.selectedIDs();
57879       if (context.mode().id !== "select" || !ids.length || ids[0] !== _tankID) {
57880         context.enter(modeSelect(context, [_tankID]));
57881       }
57882       context.history().checkpoint("hasTank");
57883       context.on("exit.intro", function() {
57884         continueTo(rightClickTank);
57885       });
57886       timeout2(function() {
57887         reveal(
57888           ".entity-editor-pane",
57889           helpHtml("intro.buildings.close", { button: { html: icon("#iD-icon-close", "inline") } })
57890         );
57891       }, 500);
57892       function continueTo(nextStep) {
57893         context.on("exit.intro", null);
57894         nextStep();
57895       }
57896     }
57897     function rightClickTank() {
57898       if (!_tankID)
57899         return continueTo(addTank);
57900       context.enter(modeBrowse(context));
57901       context.history().reset("hasTank");
57902       context.map().centerEase(tank, 500);
57903       timeout2(function() {
57904         context.on("enter.intro", function(mode) {
57905           if (mode.id !== "select")
57906             return;
57907           var ids = context.selectedIDs();
57908           if (ids.length !== 1 || ids[0] !== _tankID)
57909             return;
57910           timeout2(function() {
57911             var node = selectMenuItem(context, "circularize").node();
57912             if (!node)
57913               return;
57914             continueTo(clickCircle);
57915           }, 50);
57916         });
57917         var rightclickString = helpHtml("intro.buildings." + (context.lastPointerType() === "mouse" ? "rightclick_tank" : "edit_menu_tank_touch"));
57918         revealTank(tank, rightclickString);
57919         context.map().on("move.intro drawn.intro", function() {
57920           revealTank(tank, rightclickString, { duration: 0 });
57921         });
57922         context.history().on("change.intro", function() {
57923           continueTo(rightClickTank);
57924         });
57925       }, 600);
57926       function continueTo(nextStep) {
57927         context.on("enter.intro", null);
57928         context.map().on("move.intro drawn.intro", null);
57929         context.history().on("change.intro", null);
57930         nextStep();
57931       }
57932     }
57933     function clickCircle() {
57934       if (!_tankID)
57935         return chapter.restart();
57936       var entity = context.hasEntity(_tankID);
57937       if (!entity)
57938         return continueTo(rightClickTank);
57939       var node = selectMenuItem(context, "circularize").node();
57940       if (!node) {
57941         return continueTo(rightClickTank);
57942       }
57943       var wasChanged = false;
57944       reveal(
57945         ".edit-menu",
57946         helpHtml("intro.buildings.circle_tank"),
57947         { padding: 50 }
57948       );
57949       context.on("enter.intro", function(mode) {
57950         if (mode.id === "browse") {
57951           continueTo(rightClickTank);
57952         } else if (mode.id === "move" || mode.id === "rotate") {
57953           continueTo(retryClickCircle);
57954         }
57955       });
57956       context.map().on("move.intro", function() {
57957         var node2 = selectMenuItem(context, "circularize").node();
57958         if (!wasChanged && !node2) {
57959           return continueTo(rightClickTank);
57960         }
57961         reveal(
57962           ".edit-menu",
57963           helpHtml("intro.buildings.circle_tank"),
57964           { duration: 0, padding: 50 }
57965         );
57966       });
57967       context.history().on("change.intro", function() {
57968         wasChanged = true;
57969         context.history().on("change.intro", null);
57970         timeout2(function() {
57971           if (context.history().undoAnnotation() === _t("operations.circularize.annotation.feature", { n: 1 })) {
57972             continueTo(play);
57973           } else {
57974             continueTo(retryClickCircle);
57975           }
57976         }, 500);
57977       });
57978       function continueTo(nextStep) {
57979         context.on("enter.intro", null);
57980         context.map().on("move.intro", null);
57981         context.history().on("change.intro", null);
57982         nextStep();
57983       }
57984     }
57985     function retryClickCircle() {
57986       context.enter(modeBrowse(context));
57987       revealTank(tank, helpHtml("intro.buildings.retry_circle"), {
57988         buttonText: _t.html("intro.ok"),
57989         buttonCallback: function() {
57990           continueTo(rightClickTank);
57991         }
57992       });
57993       function continueTo(nextStep) {
57994         nextStep();
57995       }
57996     }
57997     function play() {
57998       dispatch10.call("done");
57999       reveal(
58000         ".ideditor",
58001         helpHtml("intro.buildings.play", { next: _t("intro.startediting.title") }),
58002         {
58003           tooltipBox: ".intro-nav-wrap .chapter-startEditing",
58004           buttonText: _t.html("intro.ok"),
58005           buttonCallback: function() {
58006             reveal(".ideditor");
58007           }
58008         }
58009       );
58010     }
58011     chapter.enter = function() {
58012       addHouse();
58013     };
58014     chapter.exit = function() {
58015       timeouts.forEach(window.clearTimeout);
58016       context.on("enter.intro exit.intro", null);
58017       context.map().on("move.intro drawn.intro", null);
58018       context.history().on("change.intro", null);
58019       context.container().select(".inspector-wrap").on("wheel.intro", null);
58020       context.container().select(".preset-search-input").on("keydown.intro keyup.intro", null);
58021       context.container().select(".more-fields .combobox-input").on("click.intro", null);
58022     };
58023     chapter.restart = function() {
58024       chapter.exit();
58025       chapter.enter();
58026     };
58027     return utilRebind(chapter, dispatch10, "on");
58028   }
58029
58030   // modules/ui/intro/start_editing.js
58031   function uiIntroStartEditing(context, reveal) {
58032     var dispatch10 = dispatch_default("done", "startEditing");
58033     var modalSelection = select_default2(null);
58034     var chapter = {
58035       title: "intro.startediting.title"
58036     };
58037     function showHelp() {
58038       reveal(
58039         ".map-control.help-control",
58040         helpHtml("intro.startediting.help"),
58041         {
58042           buttonText: _t.html("intro.ok"),
58043           buttonCallback: function() {
58044             shortcuts();
58045           }
58046         }
58047       );
58048     }
58049     function shortcuts() {
58050       reveal(
58051         ".map-control.help-control",
58052         helpHtml("intro.startediting.shortcuts"),
58053         {
58054           buttonText: _t.html("intro.ok"),
58055           buttonCallback: function() {
58056             showSave();
58057           }
58058         }
58059       );
58060     }
58061     function showSave() {
58062       context.container().selectAll(".shaded").remove();
58063       reveal(
58064         ".top-toolbar button.save",
58065         helpHtml("intro.startediting.save"),
58066         {
58067           buttonText: _t.html("intro.ok"),
58068           buttonCallback: function() {
58069             showStart();
58070           }
58071         }
58072       );
58073     }
58074     function showStart() {
58075       context.container().selectAll(".shaded").remove();
58076       modalSelection = uiModal(context.container());
58077       modalSelection.select(".modal").attr("class", "modal-splash modal");
58078       modalSelection.selectAll(".close").remove();
58079       var startbutton = modalSelection.select(".content").attr("class", "fillL").append("button").attr("class", "modal-section huge-modal-button").on("click", function() {
58080         modalSelection.remove();
58081       });
58082       startbutton.append("svg").attr("class", "illustration").append("use").attr("xlink:href", "#iD-logo-walkthrough");
58083       startbutton.append("h2").call(_t.append("intro.startediting.start"));
58084       dispatch10.call("startEditing");
58085     }
58086     chapter.enter = function() {
58087       showHelp();
58088     };
58089     chapter.exit = function() {
58090       modalSelection.remove();
58091       context.container().selectAll(".shaded").remove();
58092     };
58093     return utilRebind(chapter, dispatch10, "on");
58094   }
58095
58096   // modules/ui/intro/intro.js
58097   var chapterUi = {
58098     welcome: uiIntroWelcome,
58099     navigation: uiIntroNavigation,
58100     point: uiIntroPoint,
58101     area: uiIntroArea,
58102     line: uiIntroLine,
58103     building: uiIntroBuilding,
58104     startEditing: uiIntroStartEditing
58105   };
58106   var chapterFlow = [
58107     "welcome",
58108     "navigation",
58109     "point",
58110     "area",
58111     "line",
58112     "building",
58113     "startEditing"
58114   ];
58115   function uiIntro(context) {
58116     const INTRO_IMAGERY = "EsriWorldImageryClarity";
58117     let _introGraph = {};
58118     let _currChapter;
58119     function intro(selection2) {
58120       _mainFileFetcher.get("intro_graph").then((dataIntroGraph) => {
58121         for (let id2 in dataIntroGraph) {
58122           if (!_introGraph[id2]) {
58123             _introGraph[id2] = osmEntity(localize(dataIntroGraph[id2]));
58124           }
58125         }
58126         selection2.call(startIntro);
58127       }).catch(function() {
58128       });
58129     }
58130     function startIntro(selection2) {
58131       context.enter(modeBrowse(context));
58132       let osm = context.connection();
58133       let history = context.history().toJSON();
58134       let hash = window.location.hash;
58135       let center = context.map().center();
58136       let zoom = context.map().zoom();
58137       let background = context.background().baseLayerSource();
58138       let overlays = context.background().overlayLayerSources();
58139       let opacity = context.container().selectAll(".main-map .layer-background").style("opacity");
58140       let caches = osm && osm.caches();
58141       let baseEntities = context.history().graph().base().entities;
58142       context.ui().sidebar.expand();
58143       context.container().selectAll("button.sidebar-toggle").classed("disabled", true);
58144       context.inIntro(true);
58145       if (osm) {
58146         osm.toggle(false).reset();
58147       }
58148       context.history().reset();
58149       context.history().merge(Object.values(coreGraph().load(_introGraph).entities));
58150       context.history().checkpoint("initial");
58151       let imagery = context.background().findSource(INTRO_IMAGERY);
58152       if (imagery) {
58153         context.background().baseLayerSource(imagery);
58154       } else {
58155         context.background().bing();
58156       }
58157       overlays.forEach((d) => context.background().toggleOverlayLayer(d));
58158       let layers = context.layers();
58159       layers.all().forEach((item) => {
58160         if (typeof item.layer.enabled === "function") {
58161           item.layer.enabled(item.id === "osm");
58162         }
58163       });
58164       context.container().selectAll(".main-map .layer-background").style("opacity", 1);
58165       let curtain = uiCurtain(context.container().node());
58166       selection2.call(curtain);
58167       corePreferences("walkthrough_started", "yes");
58168       let storedProgress = corePreferences("walkthrough_progress") || "";
58169       let progress = storedProgress.split(";").filter(Boolean);
58170       let chapters = chapterFlow.map((chapter, i2) => {
58171         let s = chapterUi[chapter](context, curtain.reveal).on("done", () => {
58172           buttons.filter((d) => d.title === s.title).classed("finished", true);
58173           if (i2 < chapterFlow.length - 1) {
58174             const next = chapterFlow[i2 + 1];
58175             context.container().select(`button.chapter-${next}`).classed("next", true);
58176           }
58177           progress.push(chapter);
58178           corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";"));
58179         });
58180         return s;
58181       });
58182       chapters[chapters.length - 1].on("startEditing", () => {
58183         progress.push("startEditing");
58184         corePreferences("walkthrough_progress", utilArrayUniq(progress).join(";"));
58185         let incomplete = utilArrayDifference(chapterFlow, progress);
58186         if (!incomplete.length) {
58187           corePreferences("walkthrough_completed", "yes");
58188         }
58189         curtain.remove();
58190         navwrap.remove();
58191         context.container().selectAll(".main-map .layer-background").style("opacity", opacity);
58192         context.container().selectAll("button.sidebar-toggle").classed("disabled", false);
58193         if (osm) {
58194           osm.toggle(true).reset().caches(caches);
58195         }
58196         context.history().reset().merge(Object.values(baseEntities));
58197         context.background().baseLayerSource(background);
58198         overlays.forEach((d) => context.background().toggleOverlayLayer(d));
58199         if (history) {
58200           context.history().fromJSON(history, false);
58201         }
58202         context.map().centerZoom(center, zoom);
58203         window.location.replace(hash);
58204         context.inIntro(false);
58205       });
58206       let navwrap = selection2.append("div").attr("class", "intro-nav-wrap fillD");
58207       navwrap.append("svg").attr("class", "intro-nav-wrap-logo").append("use").attr("xlink:href", "#iD-logo-walkthrough");
58208       let buttonwrap = navwrap.append("div").attr("class", "joined").selectAll("button.chapter");
58209       let buttons = buttonwrap.data(chapters).enter().append("button").attr("class", (d, i2) => `chapter chapter-${chapterFlow[i2]}`).on("click", enterChapter);
58210       buttons.append("span").html((d) => _t.html(d.title));
58211       buttons.append("span").attr("class", "status").call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward", "inline"));
58212       enterChapter(null, chapters[0]);
58213       function enterChapter(d3_event, newChapter) {
58214         if (_currChapter) {
58215           _currChapter.exit();
58216         }
58217         context.enter(modeBrowse(context));
58218         _currChapter = newChapter;
58219         _currChapter.enter();
58220         buttons.classed("next", false).classed("active", (d) => d.title === _currChapter.title);
58221       }
58222     }
58223     return intro;
58224   }
58225
58226   // modules/ui/issues_info.js
58227   function uiIssuesInfo(context) {
58228     var warningsItem = {
58229       id: "warnings",
58230       count: 0,
58231       iconID: "iD-icon-alert",
58232       descriptionID: "issues.warnings_and_errors"
58233     };
58234     var resolvedItem = {
58235       id: "resolved",
58236       count: 0,
58237       iconID: "iD-icon-apply",
58238       descriptionID: "issues.user_resolved_issues"
58239     };
58240     function update(selection2) {
58241       var shownItems = [];
58242       var liveIssues = context.validator().getIssues({
58243         what: corePreferences("validate-what") || "edited",
58244         where: corePreferences("validate-where") || "all"
58245       });
58246       if (liveIssues.length) {
58247         warningsItem.count = liveIssues.length;
58248         shownItems.push(warningsItem);
58249       }
58250       if (corePreferences("validate-what") === "all") {
58251         var resolvedIssues = context.validator().getResolvedIssues();
58252         if (resolvedIssues.length) {
58253           resolvedItem.count = resolvedIssues.length;
58254           shownItems.push(resolvedItem);
58255         }
58256       }
58257       var chips = selection2.selectAll(".chip").data(shownItems, function(d) {
58258         return d.id;
58259       });
58260       chips.exit().remove();
58261       var enter = chips.enter().append("a").attr("class", function(d) {
58262         return "chip " + d.id + "-count";
58263       }).attr("href", "#").each(function(d) {
58264         var chipSelection = select_default2(this);
58265         var tooltipBehavior = uiTooltip().placement("top").title(() => _t.append(d.descriptionID));
58266         chipSelection.call(tooltipBehavior).on("click", function(d3_event) {
58267           d3_event.preventDefault();
58268           tooltipBehavior.hide(select_default2(this));
58269           context.ui().togglePanes(context.container().select(".map-panes .issues-pane"));
58270         });
58271         chipSelection.call(svgIcon("#" + d.iconID));
58272       });
58273       enter.append("span").attr("class", "count");
58274       enter.merge(chips).selectAll("span.count").text(function(d) {
58275         return d.count.toString();
58276       });
58277     }
58278     return function(selection2) {
58279       update(selection2);
58280       context.validator().on("validated.infobox", function() {
58281         update(selection2);
58282       });
58283     };
58284   }
58285
58286   // modules/ui/map_in_map.js
58287   function uiMapInMap(context) {
58288     function mapInMap(selection2) {
58289       var backgroundLayer = rendererTileLayer(context);
58290       var overlayLayers = {};
58291       var projection2 = geoRawMercator();
58292       var dataLayer = svgData(projection2, context).showLabels(false);
58293       var debugLayer = svgDebug(projection2, context);
58294       var zoom = zoom_default2().scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)]).on("start", zoomStarted).on("zoom", zoomed).on("end", zoomEnded);
58295       var wrap2 = select_default2(null);
58296       var tiles = select_default2(null);
58297       var viewport = select_default2(null);
58298       var _isTransformed = false;
58299       var _isHidden = true;
58300       var _skipEvents = false;
58301       var _gesture = null;
58302       var _zDiff = 6;
58303       var _dMini;
58304       var _cMini;
58305       var _tStart;
58306       var _tCurr;
58307       var _timeoutID;
58308       function zoomStarted() {
58309         if (_skipEvents)
58310           return;
58311         _tStart = _tCurr = projection2.transform();
58312         _gesture = null;
58313       }
58314       function zoomed(d3_event) {
58315         if (_skipEvents)
58316           return;
58317         var x = d3_event.transform.x;
58318         var y = d3_event.transform.y;
58319         var k = d3_event.transform.k;
58320         var isZooming = k !== _tStart.k;
58321         var isPanning = x !== _tStart.x || y !== _tStart.y;
58322         if (!isZooming && !isPanning) {
58323           return;
58324         }
58325         if (!_gesture) {
58326           _gesture = isZooming ? "zoom" : "pan";
58327         }
58328         var tMini = projection2.transform();
58329         var tX, tY, scale;
58330         if (_gesture === "zoom") {
58331           scale = k / tMini.k;
58332           tX = (_cMini[0] / scale - _cMini[0]) * scale;
58333           tY = (_cMini[1] / scale - _cMini[1]) * scale;
58334         } else {
58335           k = tMini.k;
58336           scale = 1;
58337           tX = x - tMini.x;
58338           tY = y - tMini.y;
58339         }
58340         utilSetTransform(tiles, tX, tY, scale);
58341         utilSetTransform(viewport, 0, 0, scale);
58342         _isTransformed = true;
58343         _tCurr = identity2.translate(x, y).scale(k);
58344         var zMain = geoScaleToZoom(context.projection.scale());
58345         var zMini = geoScaleToZoom(k);
58346         _zDiff = zMain - zMini;
58347         queueRedraw();
58348       }
58349       function zoomEnded() {
58350         if (_skipEvents)
58351           return;
58352         if (_gesture !== "pan")
58353           return;
58354         updateProjection();
58355         _gesture = null;
58356         context.map().center(projection2.invert(_cMini));
58357       }
58358       function updateProjection() {
58359         var loc = context.map().center();
58360         var tMain = context.projection.transform();
58361         var zMain = geoScaleToZoom(tMain.k);
58362         var zMini = Math.max(zMain - _zDiff, 0.5);
58363         var kMini = geoZoomToScale(zMini);
58364         projection2.translate([tMain.x, tMain.y]).scale(kMini);
58365         var point2 = projection2(loc);
58366         var mouse = _gesture === "pan" ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
58367         var xMini = _cMini[0] - point2[0] + tMain.x + mouse[0];
58368         var yMini = _cMini[1] - point2[1] + tMain.y + mouse[1];
58369         projection2.translate([xMini, yMini]).clipExtent([[0, 0], _dMini]);
58370         _tCurr = projection2.transform();
58371         if (_isTransformed) {
58372           utilSetTransform(tiles, 0, 0);
58373           utilSetTransform(viewport, 0, 0);
58374           _isTransformed = false;
58375         }
58376         zoom.scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
58377         _skipEvents = true;
58378         wrap2.call(zoom.transform, _tCurr);
58379         _skipEvents = false;
58380       }
58381       function redraw() {
58382         clearTimeout(_timeoutID);
58383         if (_isHidden)
58384           return;
58385         updateProjection();
58386         var zMini = geoScaleToZoom(projection2.scale());
58387         tiles = wrap2.selectAll(".map-in-map-tiles").data([0]);
58388         tiles = tiles.enter().append("div").attr("class", "map-in-map-tiles").merge(tiles);
58389         backgroundLayer.source(context.background().baseLayerSource()).projection(projection2).dimensions(_dMini);
58390         var background = tiles.selectAll(".map-in-map-background").data([0]);
58391         background.enter().append("div").attr("class", "map-in-map-background").merge(background).call(backgroundLayer);
58392         var overlaySources = context.background().overlayLayerSources();
58393         var activeOverlayLayers = [];
58394         for (var i2 = 0; i2 < overlaySources.length; i2++) {
58395           if (overlaySources[i2].validZoom(zMini)) {
58396             if (!overlayLayers[i2])
58397               overlayLayers[i2] = rendererTileLayer(context);
58398             activeOverlayLayers.push(overlayLayers[i2].source(overlaySources[i2]).projection(projection2).dimensions(_dMini));
58399           }
58400         }
58401         var overlay = tiles.selectAll(".map-in-map-overlay").data([0]);
58402         overlay = overlay.enter().append("div").attr("class", "map-in-map-overlay").merge(overlay);
58403         var overlays = overlay.selectAll("div").data(activeOverlayLayers, function(d) {
58404           return d.source().name();
58405         });
58406         overlays.exit().remove();
58407         overlays = overlays.enter().append("div").merge(overlays).each(function(layer) {
58408           select_default2(this).call(layer);
58409         });
58410         var dataLayers = tiles.selectAll(".map-in-map-data").data([0]);
58411         dataLayers.exit().remove();
58412         dataLayers = dataLayers.enter().append("svg").attr("class", "map-in-map-data").merge(dataLayers).call(dataLayer).call(debugLayer);
58413         if (_gesture !== "pan") {
58414           var getPath = path_default(projection2);
58415           var bbox2 = { type: "Polygon", coordinates: [context.map().extent().polygon()] };
58416           viewport = wrap2.selectAll(".map-in-map-viewport").data([0]);
58417           viewport = viewport.enter().append("svg").attr("class", "map-in-map-viewport").merge(viewport);
58418           var path = viewport.selectAll(".map-in-map-bbox").data([bbox2]);
58419           path.enter().append("path").attr("class", "map-in-map-bbox").merge(path).attr("d", getPath).classed("thick", function(d) {
58420             return getPath.area(d) < 30;
58421           });
58422         }
58423       }
58424       function queueRedraw() {
58425         clearTimeout(_timeoutID);
58426         _timeoutID = setTimeout(function() {
58427           redraw();
58428         }, 750);
58429       }
58430       function toggle(d3_event) {
58431         if (d3_event)
58432           d3_event.preventDefault();
58433         _isHidden = !_isHidden;
58434         context.container().select(".minimap-toggle-item").classed("active", !_isHidden).select("input").property("checked", !_isHidden);
58435         if (_isHidden) {
58436           wrap2.style("display", "block").style("opacity", "1").transition().duration(200).style("opacity", "0").on("end", function() {
58437             selection2.selectAll(".map-in-map").style("display", "none");
58438           });
58439         } else {
58440           wrap2.style("display", "block").style("opacity", "0").transition().duration(200).style("opacity", "1").on("end", function() {
58441             redraw();
58442           });
58443         }
58444       }
58445       uiMapInMap.toggle = toggle;
58446       wrap2 = selection2.selectAll(".map-in-map").data([0]);
58447       wrap2 = wrap2.enter().append("div").attr("class", "map-in-map").style("display", _isHidden ? "none" : "block").call(zoom).on("dblclick.zoom", null).merge(wrap2);
58448       _dMini = [200, 150];
58449       _cMini = geoVecScale(_dMini, 0.5);
58450       context.map().on("drawn.map-in-map", function(drawn) {
58451         if (drawn.full === true) {
58452           redraw();
58453         }
58454       });
58455       redraw();
58456       context.keybinding().on(_t("background.minimap.key"), toggle);
58457     }
58458     return mapInMap;
58459   }
58460
58461   // modules/ui/notice.js
58462   function uiNotice(context) {
58463     return function(selection2) {
58464       var div = selection2.append("div").attr("class", "notice");
58465       var button = div.append("button").attr("class", "zoom-to notice fillD").on("click", function() {
58466         context.map().zoomEase(context.minEditableZoom());
58467       }).on("wheel", function(d3_event) {
58468         var e22 = new WheelEvent(d3_event.type, d3_event);
58469         context.surface().node().dispatchEvent(e22);
58470       });
58471       button.call(svgIcon("#iD-icon-plus", "pre-text")).append("span").attr("class", "label").call(_t.append("zoom_in_edit"));
58472       function disableTooHigh() {
58473         var canEdit = context.map().zoom() >= context.minEditableZoom();
58474         div.style("display", canEdit ? "none" : "block");
58475       }
58476       context.map().on("move.notice", debounce_default(disableTooHigh, 500));
58477       disableTooHigh();
58478     };
58479   }
58480
58481   // modules/ui/photoviewer.js
58482   function uiPhotoviewer(context) {
58483     var dispatch10 = dispatch_default("resize");
58484     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
58485     function photoviewer(selection2) {
58486       selection2.append("button").attr("class", "thumb-hide").attr("title", _t("icons.close")).on("click", function() {
58487         if (services.streetside) {
58488           services.streetside.hideViewer(context);
58489         }
58490         if (services.mapillary) {
58491           services.mapillary.hideViewer(context);
58492         }
58493         if (services.kartaview) {
58494           services.kartaview.hideViewer(context);
58495         }
58496       }).append("div").call(svgIcon("#iD-icon-close"));
58497       function preventDefault(d3_event) {
58498         d3_event.preventDefault();
58499       }
58500       selection2.append("button").attr("class", "resize-handle-xy").on("touchstart touchdown touchend", preventDefault).on(
58501         _pointerPrefix + "down",
58502         buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true, resizeOnY: true })
58503       );
58504       selection2.append("button").attr("class", "resize-handle-x").on("touchstart touchdown touchend", preventDefault).on(
58505         _pointerPrefix + "down",
58506         buildResizeListener(selection2, "resize", dispatch10, { resizeOnX: true })
58507       );
58508       selection2.append("button").attr("class", "resize-handle-y").on("touchstart touchdown touchend", preventDefault).on(
58509         _pointerPrefix + "down",
58510         buildResizeListener(selection2, "resize", dispatch10, { resizeOnY: true })
58511       );
58512       function buildResizeListener(target, eventName, dispatch11, options2) {
58513         var resizeOnX = !!options2.resizeOnX;
58514         var resizeOnY = !!options2.resizeOnY;
58515         var minHeight = options2.minHeight || 240;
58516         var minWidth = options2.minWidth || 320;
58517         var pointerId;
58518         var startX;
58519         var startY;
58520         var startWidth;
58521         var startHeight;
58522         function startResize(d3_event) {
58523           if (pointerId !== (d3_event.pointerId || "mouse"))
58524             return;
58525           d3_event.preventDefault();
58526           d3_event.stopPropagation();
58527           var mapSize = context.map().dimensions();
58528           if (resizeOnX) {
58529             var maxWidth = mapSize[0];
58530             var newWidth = clamp3(startWidth + d3_event.clientX - startX, minWidth, maxWidth);
58531             target.style("width", newWidth + "px");
58532           }
58533           if (resizeOnY) {
58534             var maxHeight = mapSize[1] - 90;
58535             var newHeight = clamp3(startHeight + startY - d3_event.clientY, minHeight, maxHeight);
58536             target.style("height", newHeight + "px");
58537           }
58538           dispatch11.call(eventName, target, utilGetDimensions(target, true));
58539         }
58540         function clamp3(num, min3, max3) {
58541           return Math.max(min3, Math.min(num, max3));
58542         }
58543         function stopResize(d3_event) {
58544           if (pointerId !== (d3_event.pointerId || "mouse"))
58545             return;
58546           d3_event.preventDefault();
58547           d3_event.stopPropagation();
58548           select_default2(window).on("." + eventName, null);
58549         }
58550         return function initResize(d3_event) {
58551           d3_event.preventDefault();
58552           d3_event.stopPropagation();
58553           pointerId = d3_event.pointerId || "mouse";
58554           startX = d3_event.clientX;
58555           startY = d3_event.clientY;
58556           var targetRect = target.node().getBoundingClientRect();
58557           startWidth = targetRect.width;
58558           startHeight = targetRect.height;
58559           select_default2(window).on(_pointerPrefix + "move." + eventName, startResize, false).on(_pointerPrefix + "up." + eventName, stopResize, false);
58560           if (_pointerPrefix === "pointer") {
58561             select_default2(window).on("pointercancel." + eventName, stopResize, false);
58562           }
58563         };
58564       }
58565     }
58566     photoviewer.onMapResize = function() {
58567       var photoviewer2 = context.container().select(".photoviewer");
58568       var content = context.container().select(".main-content");
58569       var mapDimensions = utilGetDimensions(content, true);
58570       var photoDimensions = utilGetDimensions(photoviewer2, true);
58571       if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > mapDimensions[1] - 90) {
58572         var setPhotoDimensions = [
58573           Math.min(photoDimensions[0], mapDimensions[0]),
58574           Math.min(photoDimensions[1], mapDimensions[1] - 90)
58575         ];
58576         photoviewer2.style("width", setPhotoDimensions[0] + "px").style("height", setPhotoDimensions[1] + "px");
58577         dispatch10.call("resize", photoviewer2, setPhotoDimensions);
58578       }
58579     };
58580     return utilRebind(photoviewer, dispatch10, "on");
58581   }
58582
58583   // modules/ui/restore.js
58584   function uiRestore(context) {
58585     return function(selection2) {
58586       if (!context.history().hasRestorableChanges())
58587         return;
58588       let modalSelection = uiModal(selection2, true);
58589       modalSelection.select(".modal").attr("class", "modal fillL");
58590       let introModal = modalSelection.select(".content");
58591       introModal.append("div").attr("class", "modal-section").append("h3").call(_t.append("restore.heading"));
58592       introModal.append("div").attr("class", "modal-section").append("p").call(_t.append("restore.description"));
58593       let buttonWrap = introModal.append("div").attr("class", "modal-actions");
58594       let restore = buttonWrap.append("button").attr("class", "restore").on("click", () => {
58595         context.history().restore();
58596         modalSelection.remove();
58597       });
58598       restore.append("svg").attr("class", "logo logo-restore").append("use").attr("xlink:href", "#iD-logo-restore");
58599       restore.append("div").call(_t.append("restore.restore"));
58600       let reset = buttonWrap.append("button").attr("class", "reset").on("click", () => {
58601         context.history().clearSaved();
58602         modalSelection.remove();
58603       });
58604       reset.append("svg").attr("class", "logo logo-reset").append("use").attr("xlink:href", "#iD-logo-reset");
58605       reset.append("div").call(_t.append("restore.reset"));
58606       restore.node().focus();
58607     };
58608   }
58609
58610   // modules/ui/scale.js
58611   function uiScale(context) {
58612     var projection2 = context.projection, isImperial = !_mainLocalizer.usesMetric(), maxLength = 180, tickHeight = 8;
58613     function scaleDefs(loc1, loc2) {
58614       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;
58615       if (isImperial) {
58616         buckets = [528e4, 528e3, 52800, 5280, 500, 50, 5, 1];
58617       } else {
58618         buckets = [5e6, 5e5, 5e4, 5e3, 500, 50, 5, 1];
58619       }
58620       for (i2 = 0; i2 < buckets.length; i2++) {
58621         val = buckets[i2];
58622         if (dist >= val) {
58623           scale.dist = Math.floor(dist / val) * val;
58624           break;
58625         } else {
58626           scale.dist = +dist.toFixed(2);
58627         }
58628       }
58629       dLon = geoMetersToLon(scale.dist / conversion, lat);
58630       scale.px = Math.round(projection2([loc1[0] + dLon, loc1[1]])[0]);
58631       scale.text = displayLength(scale.dist / conversion, isImperial);
58632       return scale;
58633     }
58634     function update(selection2) {
58635       var dims = context.map().dimensions(), loc1 = projection2.invert([0, dims[1]]), loc2 = projection2.invert([maxLength, dims[1]]), scale = scaleDefs(loc1, loc2);
58636       selection2.select(".scale-path").attr("d", "M0.5,0.5v" + tickHeight + "h" + scale.px + "v-" + tickHeight);
58637       selection2.select(".scale-text").style(_mainLocalizer.textDirection() === "ltr" ? "left" : "right", scale.px + 16 + "px").text(scale.text);
58638     }
58639     return function(selection2) {
58640       function switchUnits() {
58641         isImperial = !isImperial;
58642         selection2.call(update);
58643       }
58644       var scalegroup = selection2.append("svg").attr("class", "scale").on("click", switchUnits).append("g").attr("transform", "translate(10,11)");
58645       scalegroup.append("path").attr("class", "scale-path");
58646       selection2.append("div").attr("class", "scale-text");
58647       selection2.call(update);
58648       context.map().on("move.scale", function() {
58649         update(selection2);
58650       });
58651     };
58652   }
58653
58654   // modules/ui/shortcuts.js
58655   function uiShortcuts(context) {
58656     var detected = utilDetect();
58657     var _activeTab = 0;
58658     var _modalSelection;
58659     var _selection = select_default2(null);
58660     var _dataShortcuts;
58661     function shortcutsModal(_modalSelection2) {
58662       _modalSelection2.select(".modal").classed("modal-shortcuts", true);
58663       var content = _modalSelection2.select(".content");
58664       content.append("div").attr("class", "modal-section header").append("h2").call(_t.append("shortcuts.title"));
58665       _mainFileFetcher.get("shortcuts").then(function(data) {
58666         _dataShortcuts = data;
58667         content.call(render);
58668       }).catch(function() {
58669       });
58670     }
58671     function render(selection2) {
58672       if (!_dataShortcuts)
58673         return;
58674       var wrapper = selection2.selectAll(".wrapper").data([0]);
58675       var wrapperEnter = wrapper.enter().append("div").attr("class", "wrapper modal-section");
58676       var tabsBar = wrapperEnter.append("div").attr("class", "tabs-bar");
58677       var shortcutsList = wrapperEnter.append("div").attr("class", "shortcuts-list");
58678       wrapper = wrapper.merge(wrapperEnter);
58679       var tabs = tabsBar.selectAll(".tab").data(_dataShortcuts);
58680       var tabsEnter = tabs.enter().append("a").attr("class", "tab").attr("href", "#").on("click", function(d3_event, d) {
58681         d3_event.preventDefault();
58682         var i2 = _dataShortcuts.indexOf(d);
58683         _activeTab = i2;
58684         render(selection2);
58685       });
58686       tabsEnter.append("span").html(function(d) {
58687         return _t.html(d.text);
58688       });
58689       wrapper.selectAll(".tab").classed("active", function(d, i2) {
58690         return i2 === _activeTab;
58691       });
58692       var shortcuts = shortcutsList.selectAll(".shortcut-tab").data(_dataShortcuts);
58693       var shortcutsEnter = shortcuts.enter().append("div").attr("class", function(d) {
58694         return "shortcut-tab shortcut-tab-" + d.tab;
58695       });
58696       var columnsEnter = shortcutsEnter.selectAll(".shortcut-column").data(function(d) {
58697         return d.columns;
58698       }).enter().append("table").attr("class", "shortcut-column");
58699       var rowsEnter = columnsEnter.selectAll(".shortcut-row").data(function(d) {
58700         return d.rows;
58701       }).enter().append("tr").attr("class", "shortcut-row");
58702       var sectionRows = rowsEnter.filter(function(d) {
58703         return !d.shortcuts;
58704       });
58705       sectionRows.append("td");
58706       sectionRows.append("td").attr("class", "shortcut-section").append("h3").html(function(d) {
58707         return _t.html(d.text);
58708       });
58709       var shortcutRows = rowsEnter.filter(function(d) {
58710         return d.shortcuts;
58711       });
58712       var shortcutKeys = shortcutRows.append("td").attr("class", "shortcut-keys");
58713       var modifierKeys = shortcutKeys.filter(function(d) {
58714         return d.modifiers;
58715       });
58716       modifierKeys.selectAll("kbd.modifier").data(function(d) {
58717         if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") {
58718           return ["\u2318"];
58719         } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") {
58720           return [];
58721         } else {
58722           return d.modifiers;
58723         }
58724       }).enter().each(function() {
58725         var selection3 = select_default2(this);
58726         selection3.append("kbd").attr("class", "modifier").text(function(d) {
58727           return uiCmd.display(d);
58728         });
58729         selection3.append("span").text("+");
58730       });
58731       shortcutKeys.selectAll("kbd.shortcut").data(function(d) {
58732         var arr = d.shortcuts;
58733         if (detected.os === "win" && d.text === "shortcuts.editing.commands.redo") {
58734           arr = ["Y"];
58735         } else if (detected.os !== "mac" && d.text === "shortcuts.browsing.display_options.fullscreen") {
58736           arr = ["F11"];
58737         }
58738         arr = arr.map(function(s) {
58739           return uiCmd.display(s.indexOf(".") !== -1 ? _t(s) : s);
58740         });
58741         return utilArrayUniq(arr).map(function(s) {
58742           return {
58743             shortcut: s,
58744             separator: d.separator,
58745             suffix: d.suffix
58746           };
58747         });
58748       }).enter().each(function(d, i2, nodes) {
58749         var selection3 = select_default2(this);
58750         var click = d.shortcut.toLowerCase().match(/(.*).click/);
58751         if (click && click[1]) {
58752           selection3.call(svgIcon("#iD-walkthrough-mouse-" + click[1], "operation"));
58753         } else if (d.shortcut.toLowerCase() === "long-press") {
58754           selection3.call(svgIcon("#iD-walkthrough-longpress", "longpress operation"));
58755         } else if (d.shortcut.toLowerCase() === "tap") {
58756           selection3.call(svgIcon("#iD-walkthrough-tap", "tap operation"));
58757         } else {
58758           selection3.append("kbd").attr("class", "shortcut").text(function(d2) {
58759             return d2.shortcut;
58760           });
58761         }
58762         if (i2 < nodes.length - 1) {
58763           selection3.append("span").html(d.separator || "\xA0" + _t.html("shortcuts.or") + "\xA0");
58764         } else if (i2 === nodes.length - 1 && d.suffix) {
58765           selection3.append("span").text(d.suffix);
58766         }
58767       });
58768       shortcutKeys.filter(function(d) {
58769         return d.gesture;
58770       }).each(function() {
58771         var selection3 = select_default2(this);
58772         selection3.append("span").text("+");
58773         selection3.append("span").attr("class", "gesture").html(function(d) {
58774           return _t.html(d.gesture);
58775         });
58776       });
58777       shortcutRows.append("td").attr("class", "shortcut-desc").html(function(d) {
58778         return d.text ? _t.html(d.text) : "\xA0";
58779       });
58780       wrapper.selectAll(".shortcut-tab").style("display", function(d, i2) {
58781         return i2 === _activeTab ? "flex" : "none";
58782       });
58783     }
58784     return function(selection2, show) {
58785       _selection = selection2;
58786       if (show) {
58787         _modalSelection = uiModal(selection2);
58788         _modalSelection.call(shortcutsModal);
58789       } else {
58790         context.keybinding().on([_t("shortcuts.toggle.key"), "?"], function() {
58791           if (context.container().selectAll(".modal-shortcuts").size()) {
58792             if (_modalSelection) {
58793               _modalSelection.close();
58794               _modalSelection = null;
58795             }
58796           } else {
58797             _modalSelection = uiModal(_selection);
58798             _modalSelection.call(shortcutsModal);
58799           }
58800         });
58801       }
58802     };
58803   }
58804
58805   // modules/ui/data_header.js
58806   function uiDataHeader() {
58807     var _datum;
58808     function dataHeader(selection2) {
58809       var header = selection2.selectAll(".data-header").data(
58810         _datum ? [_datum] : [],
58811         function(d) {
58812           return d.__featurehash__;
58813         }
58814       );
58815       header.exit().remove();
58816       var headerEnter = header.enter().append("div").attr("class", "data-header");
58817       var iconEnter = headerEnter.append("div").attr("class", "data-header-icon");
58818       iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-data", "note-fill"));
58819       headerEnter.append("div").attr("class", "data-header-label").call(_t.append("map_data.layers.custom.title"));
58820     }
58821     dataHeader.datum = function(val) {
58822       if (!arguments.length)
58823         return _datum;
58824       _datum = val;
58825       return this;
58826     };
58827     return dataHeader;
58828   }
58829
58830   // modules/ui/combobox.js
58831   var _comboHideTimerID;
58832   function uiCombobox(context, klass) {
58833     var dispatch10 = dispatch_default("accept", "cancel", "update");
58834     var container = context.container();
58835     var _suggestions = [];
58836     var _data = [];
58837     var _fetched = {};
58838     var _selected = null;
58839     var _canAutocomplete = true;
58840     var _caseSensitive = false;
58841     var _cancelFetch = false;
58842     var _minItems = 2;
58843     var _tDown = 0;
58844     var _mouseEnterHandler, _mouseLeaveHandler;
58845     var _fetcher = function(val, cb) {
58846       cb(_data.filter(function(d) {
58847         var terms = d.terms || [];
58848         terms.push(d.value);
58849         if (d.key) {
58850           terms.push(d.key);
58851         }
58852         return terms.some(function(term) {
58853           return term.toString().toLowerCase().indexOf(val.toLowerCase()) !== -1;
58854         });
58855       }));
58856     };
58857     var combobox = function(input, attachTo) {
58858       if (!input || input.empty())
58859         return;
58860       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() {
58861         var parent = this.parentNode;
58862         var sibling = this.nextSibling;
58863         select_default2(parent).selectAll(".combobox-caret").filter(function(d) {
58864           return d === input.node();
58865         }).data([input.node()]).enter().insert("div", function() {
58866           return sibling;
58867         }).attr("class", "combobox-caret").on("mousedown.combo-caret", function(d3_event) {
58868           d3_event.preventDefault();
58869           input.node().focus();
58870           mousedown(d3_event);
58871         }).on("mouseup.combo-caret", function(d3_event) {
58872           d3_event.preventDefault();
58873           mouseup(d3_event);
58874         });
58875       });
58876       function mousedown(d3_event) {
58877         if (d3_event.button !== 0)
58878           return;
58879         if (input.classed("disabled"))
58880           return;
58881         _tDown = +/* @__PURE__ */ new Date();
58882         var start2 = input.property("selectionStart");
58883         var end = input.property("selectionEnd");
58884         if (start2 !== end) {
58885           var val = utilGetSetValue(input);
58886           input.node().setSelectionRange(val.length, val.length);
58887           return;
58888         }
58889         input.on("mouseup.combo-input", mouseup);
58890       }
58891       function mouseup(d3_event) {
58892         input.on("mouseup.combo-input", null);
58893         if (d3_event.button !== 0)
58894           return;
58895         if (input.classed("disabled"))
58896           return;
58897         if (input.node() !== document.activeElement)
58898           return;
58899         var start2 = input.property("selectionStart");
58900         var end = input.property("selectionEnd");
58901         if (start2 !== end)
58902           return;
58903         var combo = container.selectAll(".combobox");
58904         if (combo.empty() || combo.datum() !== input.node()) {
58905           var tOrig = _tDown;
58906           window.setTimeout(function() {
58907             if (tOrig !== _tDown)
58908               return;
58909             fetchComboData("", function() {
58910               show();
58911               render();
58912             });
58913           }, 250);
58914         } else {
58915           hide();
58916         }
58917       }
58918       function focus() {
58919         fetchComboData("");
58920       }
58921       function blur() {
58922         _comboHideTimerID = window.setTimeout(hide, 75);
58923       }
58924       function show() {
58925         hide();
58926         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) {
58927           d3_event.preventDefault();
58928         });
58929         container.on("scroll.combo-scroll", render, true);
58930       }
58931       function hide() {
58932         if (_comboHideTimerID) {
58933           window.clearTimeout(_comboHideTimerID);
58934           _comboHideTimerID = void 0;
58935         }
58936         container.selectAll(".combobox").remove();
58937         container.on("scroll.combo-scroll", null);
58938       }
58939       function keydown(d3_event) {
58940         var shown = !container.selectAll(".combobox").empty();
58941         var tagName = input.node() ? input.node().tagName.toLowerCase() : "";
58942         switch (d3_event.keyCode) {
58943           case 8:
58944           case 46:
58945             d3_event.stopPropagation();
58946             _selected = null;
58947             render();
58948             input.on("input.combo-input", function() {
58949               var start2 = input.property("selectionStart");
58950               input.node().setSelectionRange(start2, start2);
58951               input.on("input.combo-input", change);
58952               change(false);
58953             });
58954             break;
58955           case 9:
58956             accept(d3_event);
58957             break;
58958           case 13:
58959             d3_event.preventDefault();
58960             d3_event.stopPropagation();
58961             accept(d3_event);
58962             break;
58963           case 38:
58964             if (tagName === "textarea" && !shown)
58965               return;
58966             d3_event.preventDefault();
58967             if (tagName === "input" && !shown) {
58968               show();
58969             }
58970             nav(-1);
58971             break;
58972           case 40:
58973             if (tagName === "textarea" && !shown)
58974               return;
58975             d3_event.preventDefault();
58976             if (tagName === "input" && !shown) {
58977               show();
58978             }
58979             nav(1);
58980             break;
58981         }
58982       }
58983       function keyup(d3_event) {
58984         switch (d3_event.keyCode) {
58985           case 27:
58986             cancel();
58987             break;
58988         }
58989       }
58990       function change(doAutoComplete) {
58991         if (doAutoComplete === void 0)
58992           doAutoComplete = true;
58993         fetchComboData(value(), function() {
58994           _selected = null;
58995           var val = input.property("value");
58996           if (_suggestions.length) {
58997             if (doAutoComplete && input.property("selectionEnd") === val.length) {
58998               _selected = tryAutocomplete();
58999             }
59000             if (!_selected) {
59001               _selected = val;
59002             }
59003           }
59004           if (val.length) {
59005             var combo = container.selectAll(".combobox");
59006             if (combo.empty()) {
59007               show();
59008             }
59009           } else {
59010             hide();
59011           }
59012           render();
59013         });
59014       }
59015       function nav(dir) {
59016         if (_suggestions.length) {
59017           var index = -1;
59018           for (var i2 = 0; i2 < _suggestions.length; i2++) {
59019             if (_selected && _suggestions[i2].value === _selected) {
59020               index = i2;
59021               break;
59022             }
59023           }
59024           index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
59025           _selected = _suggestions[index].value;
59026           utilGetSetValue(input, _selected);
59027           dispatch10.call("update");
59028         }
59029         render();
59030         ensureVisible();
59031       }
59032       function ensureVisible() {
59033         var combo = container.selectAll(".combobox");
59034         if (combo.empty())
59035           return;
59036         var containerRect = container.node().getBoundingClientRect();
59037         var comboRect = combo.node().getBoundingClientRect();
59038         if (comboRect.bottom > containerRect.bottom) {
59039           var node = attachTo ? attachTo.node() : input.node();
59040           node.scrollIntoView({ behavior: "instant", block: "center" });
59041           render();
59042         }
59043         var selected = combo.selectAll(".combobox-option.selected").node();
59044         if (selected) {
59045           selected.scrollIntoView({ behavior: "smooth", block: "nearest" });
59046         }
59047       }
59048       function value() {
59049         var value2 = input.property("value");
59050         var start2 = input.property("selectionStart");
59051         var end = input.property("selectionEnd");
59052         if (start2 && end) {
59053           value2 = value2.substring(0, start2);
59054         }
59055         return value2;
59056       }
59057       function fetchComboData(v, cb) {
59058         _cancelFetch = false;
59059         _fetcher.call(input, v, function(results) {
59060           if (_cancelFetch)
59061             return;
59062           _suggestions = results;
59063           results.forEach(function(d) {
59064             _fetched[d.value] = d;
59065           });
59066           if (cb) {
59067             cb();
59068           }
59069         });
59070       }
59071       function tryAutocomplete() {
59072         if (!_canAutocomplete)
59073           return;
59074         var val = _caseSensitive ? value() : value().toLowerCase();
59075         if (!val)
59076           return;
59077         if (isFinite(val))
59078           return;
59079         const suggestionValues = [];
59080         _suggestions.forEach((s) => {
59081           suggestionValues.push(s.value);
59082           if (s.key && s.key !== s.value) {
59083             suggestionValues.push(s.key);
59084           }
59085         });
59086         var bestIndex = -1;
59087         for (var i2 = 0; i2 < suggestionValues.length; i2++) {
59088           var suggestion = suggestionValues[i2];
59089           var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
59090           if (compare === val) {
59091             bestIndex = i2;
59092             break;
59093           } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
59094             bestIndex = i2;
59095           }
59096         }
59097         if (bestIndex !== -1) {
59098           var bestVal = suggestionValues[bestIndex];
59099           input.property("value", bestVal);
59100           input.node().setSelectionRange(val.length, bestVal.length);
59101           dispatch10.call("update");
59102           return bestVal;
59103         }
59104       }
59105       function render() {
59106         if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
59107           hide();
59108           return;
59109         }
59110         var shown = !container.selectAll(".combobox").empty();
59111         if (!shown)
59112           return;
59113         var combo = container.selectAll(".combobox");
59114         var options2 = combo.selectAll(".combobox-option").data(_suggestions, function(d) {
59115           return d.value;
59116         });
59117         options2.exit().remove();
59118         options2.enter().append("a").attr("class", function(d) {
59119           return "combobox-option " + (d.klass || "");
59120         }).attr("title", function(d) {
59121           return d.title;
59122         }).each(function(d) {
59123           if (d.display) {
59124             d.display(select_default2(this));
59125           } else {
59126             select_default2(this).text(d.value);
59127           }
59128         }).on("mouseenter", _mouseEnterHandler).on("mouseleave", _mouseLeaveHandler).merge(options2).classed("selected", function(d) {
59129           return d.value === _selected || d.key === _selected;
59130         }).on("click.combo-option", accept).order();
59131         var node = attachTo ? attachTo.node() : input.node();
59132         var containerRect = container.node().getBoundingClientRect();
59133         var rect = node.getBoundingClientRect();
59134         combo.style("left", rect.left + 5 - containerRect.left + "px").style("width", rect.width - 10 + "px").style("top", rect.height + rect.top - containerRect.top + "px");
59135       }
59136       function accept(d3_event, d) {
59137         _cancelFetch = true;
59138         var thiz = input.node();
59139         if (d) {
59140           utilGetSetValue(input, d.value);
59141           utilTriggerEvent(input, "change");
59142         }
59143         var val = utilGetSetValue(input);
59144         thiz.setSelectionRange(val.length, val.length);
59145         d = _fetched[val];
59146         dispatch10.call("accept", thiz, d, val);
59147         hide();
59148       }
59149       function cancel() {
59150         _cancelFetch = true;
59151         var thiz = input.node();
59152         var val = utilGetSetValue(input);
59153         var start2 = input.property("selectionStart");
59154         var end = input.property("selectionEnd");
59155         val = val.slice(0, start2) + val.slice(end);
59156         utilGetSetValue(input, val);
59157         thiz.setSelectionRange(val.length, val.length);
59158         dispatch10.call("cancel", thiz);
59159         hide();
59160       }
59161     };
59162     combobox.canAutocomplete = function(val) {
59163       if (!arguments.length)
59164         return _canAutocomplete;
59165       _canAutocomplete = val;
59166       return combobox;
59167     };
59168     combobox.caseSensitive = function(val) {
59169       if (!arguments.length)
59170         return _caseSensitive;
59171       _caseSensitive = val;
59172       return combobox;
59173     };
59174     combobox.data = function(val) {
59175       if (!arguments.length)
59176         return _data;
59177       _data = val;
59178       return combobox;
59179     };
59180     combobox.fetcher = function(val) {
59181       if (!arguments.length)
59182         return _fetcher;
59183       _fetcher = val;
59184       return combobox;
59185     };
59186     combobox.minItems = function(val) {
59187       if (!arguments.length)
59188         return _minItems;
59189       _minItems = val;
59190       return combobox;
59191     };
59192     combobox.itemsMouseEnter = function(val) {
59193       if (!arguments.length)
59194         return _mouseEnterHandler;
59195       _mouseEnterHandler = val;
59196       return combobox;
59197     };
59198     combobox.itemsMouseLeave = function(val) {
59199       if (!arguments.length)
59200         return _mouseLeaveHandler;
59201       _mouseLeaveHandler = val;
59202       return combobox;
59203     };
59204     return utilRebind(combobox, dispatch10, "on");
59205   }
59206   uiCombobox.off = function(input, context) {
59207     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);
59208     context.container().on("scroll.combo-scroll", null);
59209   };
59210
59211   // modules/ui/disclosure.js
59212   function uiDisclosure(context, key, expandedDefault) {
59213     var dispatch10 = dispatch_default("toggled");
59214     var _expanded;
59215     var _label = utilFunctor("");
59216     var _updatePreference = true;
59217     var _content = function() {
59218     };
59219     var disclosure = function(selection2) {
59220       if (_expanded === void 0 || _expanded === null) {
59221         var preference = corePreferences("disclosure." + key + ".expanded");
59222         _expanded = preference === null ? !!expandedDefault : preference === "true";
59223       }
59224       var hideToggle = selection2.selectAll(".hide-toggle-" + key).data([0]);
59225       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"));
59226       hideToggleEnter.append("span").attr("class", "hide-toggle-text");
59227       hideToggle = hideToggleEnter.merge(hideToggle);
59228       hideToggle.on("click", toggle).attr("title", _t(`icons.${_expanded ? "collapse" : "expand"}`)).attr("aria-expanded", _expanded).classed("expanded", _expanded);
59229       const label = _label();
59230       const labelSelection = hideToggle.selectAll(".hide-toggle-text");
59231       if (typeof label !== "function") {
59232         labelSelection.text(_label());
59233       } else {
59234         labelSelection.text("").call(label);
59235       }
59236       hideToggle.selectAll(".hide-toggle-icon").attr(
59237         "xlink:href",
59238         _expanded ? "#iD-icon-down" : _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward"
59239       );
59240       var wrap2 = selection2.selectAll(".disclosure-wrap").data([0]);
59241       wrap2 = wrap2.enter().append("div").attr("class", "disclosure-wrap disclosure-wrap-" + key).merge(wrap2).classed("hide", !_expanded);
59242       if (_expanded) {
59243         wrap2.call(_content);
59244       }
59245       function toggle(d3_event) {
59246         d3_event.preventDefault();
59247         _expanded = !_expanded;
59248         if (_updatePreference) {
59249           corePreferences("disclosure." + key + ".expanded", _expanded);
59250         }
59251         hideToggle.classed("expanded", _expanded).attr("aria-expanded", _expanded).attr("title", _t(`icons.${_expanded ? "collapse" : "expand"}`));
59252         hideToggle.selectAll(".hide-toggle-icon").attr(
59253           "xlink:href",
59254           _expanded ? "#iD-icon-down" : _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward"
59255         );
59256         wrap2.call(uiToggle(_expanded));
59257         if (_expanded) {
59258           wrap2.call(_content);
59259         }
59260         dispatch10.call("toggled", this, _expanded);
59261       }
59262     };
59263     disclosure.label = function(val) {
59264       if (!arguments.length)
59265         return _label;
59266       _label = utilFunctor(val);
59267       return disclosure;
59268     };
59269     disclosure.expanded = function(val) {
59270       if (!arguments.length)
59271         return _expanded;
59272       _expanded = val;
59273       return disclosure;
59274     };
59275     disclosure.updatePreference = function(val) {
59276       if (!arguments.length)
59277         return _updatePreference;
59278       _updatePreference = val;
59279       return disclosure;
59280     };
59281     disclosure.content = function(val) {
59282       if (!arguments.length)
59283         return _content;
59284       _content = val;
59285       return disclosure;
59286     };
59287     return utilRebind(disclosure, dispatch10, "on");
59288   }
59289
59290   // modules/ui/section.js
59291   function uiSection(id2, context) {
59292     var _classes = utilFunctor("");
59293     var _shouldDisplay;
59294     var _content;
59295     var _disclosure;
59296     var _label;
59297     var _expandedByDefault = utilFunctor(true);
59298     var _disclosureContent;
59299     var _disclosureExpanded;
59300     var _containerSelection = select_default2(null);
59301     var section = {
59302       id: id2
59303     };
59304     section.classes = function(val) {
59305       if (!arguments.length)
59306         return _classes;
59307       _classes = utilFunctor(val);
59308       return section;
59309     };
59310     section.label = function(val) {
59311       if (!arguments.length)
59312         return _label;
59313       _label = utilFunctor(val);
59314       return section;
59315     };
59316     section.expandedByDefault = function(val) {
59317       if (!arguments.length)
59318         return _expandedByDefault;
59319       _expandedByDefault = utilFunctor(val);
59320       return section;
59321     };
59322     section.shouldDisplay = function(val) {
59323       if (!arguments.length)
59324         return _shouldDisplay;
59325       _shouldDisplay = utilFunctor(val);
59326       return section;
59327     };
59328     section.content = function(val) {
59329       if (!arguments.length)
59330         return _content;
59331       _content = val;
59332       return section;
59333     };
59334     section.disclosureContent = function(val) {
59335       if (!arguments.length)
59336         return _disclosureContent;
59337       _disclosureContent = val;
59338       return section;
59339     };
59340     section.disclosureExpanded = function(val) {
59341       if (!arguments.length)
59342         return _disclosureExpanded;
59343       _disclosureExpanded = val;
59344       return section;
59345     };
59346     section.render = function(selection2) {
59347       _containerSelection = selection2.selectAll(".section-" + id2).data([0]);
59348       var sectionEnter = _containerSelection.enter().append("div").attr("class", "section section-" + id2 + " " + (_classes && _classes() || ""));
59349       _containerSelection = sectionEnter.merge(_containerSelection);
59350       _containerSelection.call(renderContent);
59351     };
59352     section.reRender = function() {
59353       _containerSelection.call(renderContent);
59354     };
59355     section.selection = function() {
59356       return _containerSelection;
59357     };
59358     section.disclosure = function() {
59359       return _disclosure;
59360     };
59361     function renderContent(selection2) {
59362       if (_shouldDisplay) {
59363         var shouldDisplay = _shouldDisplay();
59364         selection2.classed("hide", !shouldDisplay);
59365         if (!shouldDisplay) {
59366           selection2.html("");
59367           return;
59368         }
59369       }
59370       if (_disclosureContent) {
59371         if (!_disclosure) {
59372           _disclosure = uiDisclosure(context, id2.replace(/-/g, "_"), _expandedByDefault()).label(_label || "").content(_disclosureContent);
59373         }
59374         if (_disclosureExpanded !== void 0) {
59375           _disclosure.expanded(_disclosureExpanded);
59376           _disclosureExpanded = void 0;
59377         }
59378         selection2.call(_disclosure);
59379         return;
59380       }
59381       if (_content) {
59382         selection2.call(_content);
59383       }
59384     }
59385     return section;
59386   }
59387
59388   // modules/ui/tag_reference.js
59389   function uiTagReference(what) {
59390     var wikibase = what.qid ? services.wikidata : services.osmWikibase;
59391     var tagReference = {};
59392     var _button = select_default2(null);
59393     var _body = select_default2(null);
59394     var _loaded;
59395     var _showing;
59396     function load() {
59397       if (!wikibase)
59398         return;
59399       _button.classed("tag-reference-loading", true);
59400       wikibase.getDocs(what, gotDocs);
59401     }
59402     function gotDocs(err, docs) {
59403       _body.html("");
59404       if (!docs || !docs.title) {
59405         _body.append("p").attr("class", "tag-reference-description").call(_t.append("inspector.no_documentation_key"));
59406         done();
59407         return;
59408       }
59409       if (docs.imageURL) {
59410         _body.append("img").attr("class", "tag-reference-wiki-image").attr("alt", docs.description).attr("src", docs.imageURL).on("load", function() {
59411           done();
59412         }).on("error", function() {
59413           select_default2(this).remove();
59414           done();
59415         });
59416       } else {
59417         done();
59418       }
59419       var tagReferenceDescription = _body.append("p").attr("class", "tag-reference-description").append("span");
59420       if (docs.description) {
59421         tagReferenceDescription = tagReferenceDescription.attr("class", "localized-text").attr("lang", docs.descriptionLocaleCode || "und").text(docs.description);
59422       } else {
59423         tagReferenceDescription = tagReferenceDescription.call(_t.append("inspector.no_documentation_key"));
59424       }
59425       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"));
59426       if (docs.wiki) {
59427         _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));
59428       }
59429       if (what.key === "comment") {
59430         _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"));
59431       }
59432     }
59433     function done() {
59434       _loaded = true;
59435       _button.classed("tag-reference-loading", false);
59436       _body.classed("expanded", true).transition().duration(200).style("max-height", "200px").style("opacity", "1");
59437       _showing = true;
59438       _button.selectAll("svg.icon use").each(function() {
59439         var iconUse = select_default2(this);
59440         if (iconUse.attr("href") === "#iD-icon-info") {
59441           iconUse.attr("href", "#iD-icon-info-filled");
59442         }
59443       });
59444     }
59445     function hide() {
59446       _body.transition().duration(200).style("max-height", "0px").style("opacity", "0").on("end", function() {
59447         _body.classed("expanded", false);
59448       });
59449       _showing = false;
59450       _button.selectAll("svg.icon use").each(function() {
59451         var iconUse = select_default2(this);
59452         if (iconUse.attr("href") === "#iD-icon-info-filled") {
59453           iconUse.attr("href", "#iD-icon-info");
59454         }
59455       });
59456     }
59457     tagReference.button = function(selection2, klass, iconName) {
59458       _button = selection2.selectAll(".tag-reference-button").data([0]);
59459       _button = _button.enter().append("button").attr("class", "tag-reference-button " + (klass || "")).attr("title", _t("icons.information")).call(svgIcon("#iD-icon-" + (iconName || "inspect"))).merge(_button);
59460       _button.on("click", function(d3_event) {
59461         d3_event.stopPropagation();
59462         d3_event.preventDefault();
59463         this.blur();
59464         if (_showing) {
59465           hide();
59466         } else if (_loaded) {
59467           done();
59468         } else {
59469           load();
59470         }
59471       });
59472     };
59473     tagReference.body = function(selection2) {
59474       var itemID = what.qid || what.key + "-" + (what.value || "");
59475       _body = selection2.selectAll(".tag-reference-body").data([itemID], function(d) {
59476         return d;
59477       });
59478       _body.exit().remove();
59479       _body = _body.enter().append("div").attr("class", "tag-reference-body").style("max-height", "0").style("opacity", "0").merge(_body);
59480       if (_showing === false) {
59481         hide();
59482       }
59483     };
59484     tagReference.showing = function(val) {
59485       if (!arguments.length)
59486         return _showing;
59487       _showing = val;
59488       return tagReference;
59489     };
59490     return tagReference;
59491   }
59492
59493   // modules/ui/field_help.js
59494   function uiFieldHelp(context, fieldName) {
59495     var fieldHelp = {};
59496     var _inspector = select_default2(null);
59497     var _wrap = select_default2(null);
59498     var _body = select_default2(null);
59499     var fieldHelpKeys = {
59500       restrictions: [
59501         ["about", [
59502           "about",
59503           "from_via_to",
59504           "maxdist",
59505           "maxvia"
59506         ]],
59507         ["inspecting", [
59508           "about",
59509           "from_shadow",
59510           "allow_shadow",
59511           "restrict_shadow",
59512           "only_shadow",
59513           "restricted",
59514           "only"
59515         ]],
59516         ["modifying", [
59517           "about",
59518           "indicators",
59519           "allow_turn",
59520           "restrict_turn",
59521           "only_turn"
59522         ]],
59523         ["tips", [
59524           "simple",
59525           "simple_example",
59526           "indirect",
59527           "indirect_example",
59528           "indirect_noedit"
59529         ]]
59530       ]
59531     };
59532     var fieldHelpHeadings = {};
59533     var replacements = {
59534       distField: { html: _t.html("restriction.controls.distance") },
59535       viaField: { html: _t.html("restriction.controls.via") },
59536       fromShadow: { html: icon("#iD-turn-shadow", "inline shadow from") },
59537       allowShadow: { html: icon("#iD-turn-shadow", "inline shadow allow") },
59538       restrictShadow: { html: icon("#iD-turn-shadow", "inline shadow restrict") },
59539       onlyShadow: { html: icon("#iD-turn-shadow", "inline shadow only") },
59540       allowTurn: { html: icon("#iD-turn-yes", "inline turn") },
59541       restrictTurn: { html: icon("#iD-turn-no", "inline turn") },
59542       onlyTurn: { html: icon("#iD-turn-only", "inline turn") }
59543     };
59544     var docs = fieldHelpKeys[fieldName].map(function(key) {
59545       var helpkey = "help.field." + fieldName + "." + key[0];
59546       var text2 = key[1].reduce(function(all, part) {
59547         var subkey = helpkey + "." + part;
59548         var depth = fieldHelpHeadings[subkey];
59549         var hhh = depth ? Array(depth + 1).join("#") + " " : "";
59550         return all + hhh + _t.html(subkey, replacements) + "\n\n";
59551       }, "");
59552       return {
59553         key: helpkey,
59554         title: _t.html(helpkey + ".title"),
59555         html: marked(text2.trim())
59556       };
59557     });
59558     function show() {
59559       updatePosition();
59560       _body.classed("hide", false).style("opacity", "0").transition().duration(200).style("opacity", "1");
59561     }
59562     function hide() {
59563       _body.classed("hide", true).transition().duration(200).style("opacity", "0").on("end", function() {
59564         _body.classed("hide", true);
59565       });
59566     }
59567     function clickHelp(index) {
59568       var d = docs[index];
59569       var tkeys = fieldHelpKeys[fieldName][index][1];
59570       _body.selectAll(".field-help-nav-item").classed("active", function(d2, i2) {
59571         return i2 === index;
59572       });
59573       var content = _body.selectAll(".field-help-content").html(d.html);
59574       content.selectAll("p").attr("class", function(d2, i2) {
59575         return tkeys[i2];
59576       });
59577       if (d.key === "help.field.restrictions.inspecting") {
59578         content.insert("img", "p.from_shadow").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_inspect.gif"));
59579       } else if (d.key === "help.field.restrictions.modifying") {
59580         content.insert("img", "p.allow_turn").attr("class", "field-help-image cf").attr("src", context.imagePath("tr_modify.gif"));
59581       }
59582     }
59583     fieldHelp.button = function(selection2) {
59584       if (_body.empty())
59585         return;
59586       var button = selection2.selectAll(".field-help-button").data([0]);
59587       button.enter().append("button").attr("class", "field-help-button").call(svgIcon("#iD-icon-help")).merge(button).on("click", function(d3_event) {
59588         d3_event.stopPropagation();
59589         d3_event.preventDefault();
59590         if (_body.classed("hide")) {
59591           show();
59592         } else {
59593           hide();
59594         }
59595       });
59596     };
59597     function updatePosition() {
59598       var wrap2 = _wrap.node();
59599       var inspector = _inspector.node();
59600       var wRect = wrap2.getBoundingClientRect();
59601       var iRect = inspector.getBoundingClientRect();
59602       _body.style("top", wRect.top + inspector.scrollTop - iRect.top + "px");
59603     }
59604     fieldHelp.body = function(selection2) {
59605       _wrap = selection2.selectAll(".form-field-input-wrap");
59606       if (_wrap.empty())
59607         return;
59608       _inspector = context.container().select(".sidebar .entity-editor-pane .inspector-body");
59609       if (_inspector.empty())
59610         return;
59611       _body = _inspector.selectAll(".field-help-body").data([0]);
59612       var enter = _body.enter().append("div").attr("class", "field-help-body hide");
59613       var titleEnter = enter.append("div").attr("class", "field-help-title cf");
59614       titleEnter.append("h2").attr("class", _mainLocalizer.textDirection() === "rtl" ? "fr" : "fl").call(_t.append("help.field." + fieldName + ".title"));
59615       titleEnter.append("button").attr("class", "fr close").attr("title", _t("icons.close")).on("click", function(d3_event) {
59616         d3_event.stopPropagation();
59617         d3_event.preventDefault();
59618         hide();
59619       }).call(svgIcon("#iD-icon-close"));
59620       var navEnter = enter.append("div").attr("class", "field-help-nav cf");
59621       var titles = docs.map(function(d) {
59622         return d.title;
59623       });
59624       navEnter.selectAll(".field-help-nav-item").data(titles).enter().append("div").attr("class", "field-help-nav-item").html(function(d) {
59625         return d;
59626       }).on("click", function(d3_event, d) {
59627         d3_event.stopPropagation();
59628         d3_event.preventDefault();
59629         clickHelp(titles.indexOf(d));
59630       });
59631       enter.append("div").attr("class", "field-help-content");
59632       _body = _body.merge(enter);
59633       clickHelp(0);
59634     };
59635     return fieldHelp;
59636   }
59637
59638   // modules/ui/fields/check.js
59639   function uiFieldCheck(field, context) {
59640     var dispatch10 = dispatch_default("change");
59641     var options2 = field.options;
59642     var values = [];
59643     var texts = [];
59644     var _tags;
59645     var input = select_default2(null);
59646     var text2 = select_default2(null);
59647     var label = select_default2(null);
59648     var reverser = select_default2(null);
59649     var _impliedYes;
59650     var _entityIDs = [];
59651     var _value;
59652     var stringsField = field.resolveReference("stringsCrossReference");
59653     if (!options2 && stringsField.options) {
59654       options2 = stringsField.options;
59655     }
59656     if (options2) {
59657       for (var i2 in options2) {
59658         var v = options2[i2];
59659         values.push(v === "undefined" ? void 0 : v);
59660         texts.push(stringsField.t.html("options." + v, { "default": v }));
59661       }
59662     } else {
59663       values = [void 0, "yes"];
59664       texts = [_t.html("inspector.unknown"), _t.html("inspector.check.yes")];
59665       if (field.type !== "defaultCheck") {
59666         values.push("no");
59667         texts.push(_t.html("inspector.check.no"));
59668       }
59669     }
59670     function checkImpliedYes() {
59671       _impliedYes = field.id === "oneway_yes";
59672       if (field.id === "oneway") {
59673         var entity = context.entity(_entityIDs[0]);
59674         for (var key in entity.tags) {
59675           if (key in osmOneWayTags && entity.tags[key] in osmOneWayTags[key]) {
59676             _impliedYes = true;
59677             texts[0] = _t.html("_tagging.presets.fields.oneway_yes.options.undefined");
59678             break;
59679           }
59680         }
59681       }
59682     }
59683     function reverserHidden() {
59684       if (!context.container().select("div.inspector-hover").empty())
59685         return true;
59686       return !(_value === "yes" || _impliedYes && !_value);
59687     }
59688     function reverserSetText(selection2) {
59689       var entity = _entityIDs.length && context.hasEntity(_entityIDs[0]);
59690       if (reverserHidden() || !entity)
59691         return selection2;
59692       var first = entity.first();
59693       var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
59694       var pseudoDirection = first < last;
59695       var icon2 = pseudoDirection ? "#iD-icon-forward" : "#iD-icon-backward";
59696       selection2.selectAll(".reverser-span").html("").call(_t.append("inspector.check.reverser")).call(svgIcon(icon2, "inline"));
59697       return selection2;
59698     }
59699     var check = function(selection2) {
59700       checkImpliedYes();
59701       label = selection2.selectAll(".form-field-input-wrap").data([0]);
59702       var enter = label.enter().append("label").attr("class", "form-field-input-wrap form-field-input-check");
59703       enter.append("input").property("indeterminate", field.type !== "defaultCheck").attr("type", "checkbox").attr("id", field.domId);
59704       enter.append("span").html(texts[0]).attr("class", "value");
59705       if (field.type === "onewayCheck") {
59706         enter.append("button").attr("class", "reverser" + (reverserHidden() ? " hide" : "")).append("span").attr("class", "reverser-span");
59707       }
59708       label = label.merge(enter);
59709       input = label.selectAll("input");
59710       text2 = label.selectAll("span.value");
59711       input.on("click", function(d3_event) {
59712         d3_event.stopPropagation();
59713         var t = {};
59714         if (Array.isArray(_tags[field.key])) {
59715           if (values.indexOf("yes") !== -1) {
59716             t[field.key] = "yes";
59717           } else {
59718             t[field.key] = values[0];
59719           }
59720         } else {
59721           t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
59722         }
59723         if (t[field.key] === "reversible" || t[field.key] === "alternating") {
59724           t[field.key] = values[0];
59725         }
59726         dispatch10.call("change", this, t);
59727       });
59728       if (field.type === "onewayCheck") {
59729         reverser = label.selectAll(".reverser");
59730         reverser.call(reverserSetText).on("click", function(d3_event) {
59731           d3_event.preventDefault();
59732           d3_event.stopPropagation();
59733           context.perform(
59734             function(graph) {
59735               for (var i3 in _entityIDs) {
59736                 graph = actionReverse(_entityIDs[i3])(graph);
59737               }
59738               return graph;
59739             },
59740             _t("operations.reverse.annotation.line", { n: 1 })
59741           );
59742           context.validator().validate();
59743           select_default2(this).call(reverserSetText);
59744         });
59745       }
59746     };
59747     check.entityIDs = function(val) {
59748       if (!arguments.length)
59749         return _entityIDs;
59750       _entityIDs = val;
59751       return check;
59752     };
59753     check.tags = function(tags) {
59754       _tags = tags;
59755       function isChecked(val) {
59756         return val !== "no" && val !== "" && val !== void 0 && val !== null;
59757       }
59758       function textFor(val) {
59759         if (val === "")
59760           val = void 0;
59761         var index = values.indexOf(val);
59762         return index !== -1 ? texts[index] : '"' + val + '"';
59763       }
59764       checkImpliedYes();
59765       var isMixed = Array.isArray(tags[field.key]);
59766       _value = !isMixed && tags[field.key] && tags[field.key].toLowerCase();
59767       if (field.type === "onewayCheck" && (_value === "1" || _value === "-1")) {
59768         _value = "yes";
59769       }
59770       input.property("indeterminate", isMixed || field.type !== "defaultCheck" && !_value).property("checked", isChecked(_value));
59771       text2.html(isMixed ? _t.html("inspector.multiple_values") : textFor(_value)).classed("mixed", isMixed);
59772       label.classed("set", !!_value);
59773       if (field.type === "onewayCheck") {
59774         reverser.classed("hide", reverserHidden()).call(reverserSetText);
59775       }
59776     };
59777     check.focus = function() {
59778       input.node().focus();
59779     };
59780     return utilRebind(check, dispatch10, "on");
59781   }
59782
59783   // modules/ui/length_indicator.js
59784   function uiLengthIndicator(maxChars) {
59785     var _wrap = select_default2(null);
59786     var _tooltip = uiPopover("tooltip max-length-warning").placement("bottom").hasArrow(true).content(() => (selection2) => {
59787       selection2.text("");
59788       selection2.call(svgIcon("#iD-icon-alert", "inline"));
59789       selection2.call(_t.append("inspector.max_length_reached", { maxChars }));
59790     });
59791     var _silent = false;
59792     var lengthIndicator = function(selection2) {
59793       _wrap = selection2.selectAll("span.length-indicator-wrap").data([0]);
59794       _wrap = _wrap.enter().append("span").merge(_wrap).classed("length-indicator-wrap", true);
59795       selection2.call(_tooltip);
59796     };
59797     lengthIndicator.update = function(val) {
59798       const strLen = utilUnicodeCharsCount(utilCleanOsmString(val, Number.POSITIVE_INFINITY));
59799       let indicator = _wrap.selectAll("span.length-indicator").data([strLen]);
59800       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");
59801       if (_silent)
59802         return;
59803       if (strLen > maxChars) {
59804         _tooltip.show();
59805       } else {
59806         _tooltip.hide();
59807       }
59808     };
59809     lengthIndicator.silent = function(val) {
59810       if (!arguments.length)
59811         return _silent;
59812       _silent = val;
59813       return lengthIndicator;
59814     };
59815     return lengthIndicator;
59816   }
59817
59818   // modules/ui/fields/combo.js
59819   function uiFieldCombo(field, context) {
59820     var dispatch10 = dispatch_default("change");
59821     var _isMulti = field.type === "multiCombo" || field.type === "manyCombo";
59822     var _isNetwork = field.type === "networkCombo";
59823     var _isSemi = field.type === "semiCombo";
59824     var _showTagInfoSuggestions = field.type !== "manyCombo" && field.autoSuggestions !== false;
59825     var _allowCustomValues = field.type !== "manyCombo" && field.customValues !== false;
59826     var _snake_case = field.snake_case || field.snake_case === void 0;
59827     var _combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(field.caseSensitive).minItems(1);
59828     var _container = select_default2(null);
59829     var _inputWrap = select_default2(null);
59830     var _input = select_default2(null);
59831     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue());
59832     var _comboData = [];
59833     var _multiData = [];
59834     var _entityIDs = [];
59835     var _tags;
59836     var _countryCode;
59837     var _staticPlaceholder;
59838     var _dataDeprecated = [];
59839     _mainFileFetcher.get("deprecated").then(function(d) {
59840       _dataDeprecated = d;
59841     }).catch(function() {
59842     });
59843     if (_isMulti && field.key && /[^:]$/.test(field.key)) {
59844       field.key += ":";
59845     }
59846     function snake(s) {
59847       return s.replace(/\s+/g, "_");
59848     }
59849     function clean2(s) {
59850       return s.split(";").map(function(s2) {
59851         return s2.trim();
59852       }).join(";");
59853     }
59854     function tagValue(dval) {
59855       dval = clean2(dval || "");
59856       var found = getOptions(true).find(function(o) {
59857         return o.key && clean2(o.value) === dval;
59858       });
59859       if (found)
59860         return found.key;
59861       if (field.type === "typeCombo" && !dval) {
59862         return "yes";
59863       }
59864       return restrictTagValueSpelling(dval) || void 0;
59865     }
59866     function restrictTagValueSpelling(dval) {
59867       if (_snake_case) {
59868         dval = snake(dval);
59869       }
59870       if (!field.caseSensitive) {
59871         dval = dval.toLowerCase();
59872       }
59873       return dval;
59874     }
59875     function getLabelId(field2, v) {
59876       return field2.hasTextForStringId(`options.${v}.title`) ? `options.${v}.title` : `options.${v}`;
59877     }
59878     function displayValue(tval) {
59879       tval = tval || "";
59880       var stringsField = field.resolveReference("stringsCrossReference");
59881       const labelId = getLabelId(stringsField, tval);
59882       if (stringsField.hasTextForStringId(labelId)) {
59883         return stringsField.t(labelId, { default: tval });
59884       }
59885       if (field.type === "typeCombo" && tval.toLowerCase() === "yes") {
59886         return "";
59887       }
59888       return tval;
59889     }
59890     function renderValue(tval) {
59891       tval = tval || "";
59892       var stringsField = field.resolveReference("stringsCrossReference");
59893       const labelId = getLabelId(stringsField, tval);
59894       if (stringsField.hasTextForStringId(labelId)) {
59895         return stringsField.t.append(labelId, { default: tval });
59896       }
59897       if (field.type === "typeCombo" && tval.toLowerCase() === "yes") {
59898         tval = "";
59899       }
59900       return (selection2) => selection2.text(tval);
59901     }
59902     function objectDifference(a, b) {
59903       return a.filter(function(d1) {
59904         return !b.some(function(d2) {
59905           return d1.value === d2.value;
59906         });
59907       });
59908     }
59909     function initCombo(selection2, attachTo) {
59910       if (!_allowCustomValues) {
59911         selection2.attr("readonly", "readonly");
59912       }
59913       if (_showTagInfoSuggestions && services.taginfo) {
59914         selection2.call(_combobox.fetcher(setTaginfoValues), attachTo);
59915         setTaginfoValues("", setPlaceholder);
59916       } else {
59917         selection2.call(_combobox, attachTo);
59918         setTimeout(() => setStaticValues(setPlaceholder), 0);
59919       }
59920     }
59921     function getOptions(allOptions) {
59922       var stringsField = field.resolveReference("stringsCrossReference");
59923       if (!(field.options || stringsField.options))
59924         return [];
59925       let options2;
59926       if (allOptions !== true) {
59927         options2 = field.options || stringsField.options;
59928       } else {
59929         options2 = [].concat(field.options, stringsField.options).filter(Boolean);
59930       }
59931       return options2.map(function(v) {
59932         const labelId = getLabelId(stringsField, v);
59933         return {
59934           key: v,
59935           value: stringsField.t(labelId, { default: v }),
59936           title: stringsField.t(`options.${v}.description`, { default: v }),
59937           display: addComboboxIcons(stringsField.t.append(labelId, { default: v }), v),
59938           klass: stringsField.hasTextForStringId(labelId) ? "" : "raw-option"
59939         };
59940       });
59941     }
59942     function setStaticValues(callback, filter2) {
59943       _comboData = getOptions();
59944       if (filter2 !== void 0) {
59945         _comboData = _comboData.filter(filter2);
59946       }
59947       _comboData = objectDifference(_comboData, _multiData);
59948       _combobox.data(_comboData);
59949       if (callback)
59950         callback(_comboData);
59951     }
59952     function setTaginfoValues(q, callback) {
59953       var queryFilter = (d) => d.value.toLowerCase().includes(q.toLowerCase()) || d.key.toLowerCase().includes(q.toLowerCase());
59954       setStaticValues(callback, queryFilter);
59955       var stringsField = field.resolveReference("stringsCrossReference");
59956       var fn = _isMulti ? "multikeys" : "values";
59957       var query = (_isMulti ? field.key : "") + q;
59958       var hasCountryPrefix = _isNetwork && _countryCode && _countryCode.indexOf(q.toLowerCase()) === 0;
59959       if (hasCountryPrefix) {
59960         query = _countryCode + ":";
59961       }
59962       var params = {
59963         debounce: q !== "",
59964         key: field.key,
59965         query
59966       };
59967       if (_entityIDs.length) {
59968         params.geometry = context.graph().geometry(_entityIDs[0]);
59969       }
59970       services.taginfo[fn](params, function(err, data) {
59971         if (err)
59972           return;
59973         data = data.filter((d) => field.type !== "typeCombo" || d.value !== "yes");
59974         data = data.filter((d) => {
59975           var value = d.value;
59976           if (_isMulti) {
59977             value = value.slice(field.key.length);
59978           }
59979           return value === restrictTagValueSpelling(value);
59980         });
59981         var deprecatedValues = osmEntity.deprecatedTagValuesByKey(_dataDeprecated)[field.key];
59982         if (deprecatedValues) {
59983           data = data.filter((d) => !deprecatedValues.includes(d.value));
59984         }
59985         if (hasCountryPrefix) {
59986           data = data.filter((d) => d.value.toLowerCase().indexOf(_countryCode + ":") === 0);
59987         }
59988         const additionalOptions = (field.options || stringsField.options || []).filter((v) => !data.some((dv) => dv.value === (_isMulti ? field.key + v : v))).map((v) => ({ value: v }));
59989         _container.classed("empty-combobox", data.length === 0);
59990         _comboData = data.concat(additionalOptions).map(function(d) {
59991           var v = d.value;
59992           if (_isMulti)
59993             v = v.replace(field.key, "");
59994           const labelId = getLabelId(stringsField, v);
59995           var isLocalizable = stringsField.hasTextForStringId(labelId);
59996           var label = stringsField.t(labelId, { default: v });
59997           return {
59998             key: v,
59999             value: label,
60000             title: stringsField.t(`options.${v}.description`, { default: isLocalizable ? v : d.title !== label ? d.title : "" }),
60001             display: addComboboxIcons(stringsField.t.append(labelId, { default: v }), v),
60002             klass: isLocalizable ? "" : "raw-option"
60003           };
60004         });
60005         _comboData = _comboData.filter(queryFilter);
60006         _comboData = objectDifference(_comboData, _multiData);
60007         if (callback)
60008           callback(_comboData);
60009       });
60010     }
60011     function addComboboxIcons(disp, value) {
60012       const iconsField = field.resolveReference("iconsCrossReference");
60013       if (iconsField.icons) {
60014         return function(selection2) {
60015           var span = selection2.insert("span", ":first-child").attr("class", "tag-value-icon");
60016           if (iconsField.icons[value]) {
60017             span.call(svgIcon(`#${iconsField.icons[value]}`));
60018           }
60019           disp.call(this, selection2);
60020         };
60021       }
60022       return disp;
60023     }
60024     function setPlaceholder(values) {
60025       if (_isMulti || _isSemi) {
60026         _staticPlaceholder = field.placeholder() || _t("inspector.add");
60027       } else {
60028         var vals = values.map(function(d) {
60029           return d.value;
60030         }).filter(function(s) {
60031           return s.length < 20;
60032         });
60033         var placeholders = vals.length > 1 ? vals : values.map(function(d) {
60034           return d.key;
60035         });
60036         _staticPlaceholder = field.placeholder() || placeholders.slice(0, 3).join(", ");
60037       }
60038       if (!/(…|\.\.\.)$/.test(_staticPlaceholder)) {
60039         _staticPlaceholder += "\u2026";
60040       }
60041       var ph;
60042       if (!_isMulti && !_isSemi && _tags && Array.isArray(_tags[field.key])) {
60043         ph = _t("inspector.multiple_values");
60044       } else {
60045         ph = _staticPlaceholder;
60046       }
60047       _container.selectAll("input").attr("placeholder", ph);
60048       var hideAdd = !_allowCustomValues && !values.length;
60049       _container.selectAll(".chiplist .input-wrap").style("display", hideAdd ? "none" : null);
60050     }
60051     function change() {
60052       var t = {};
60053       var val;
60054       if (_isMulti || _isSemi) {
60055         var vals;
60056         if (_isMulti) {
60057           vals = [tagValue(utilGetSetValue(_input))];
60058         } else if (_isSemi) {
60059           val = tagValue(utilGetSetValue(_input)) || "";
60060           val = val.replace(/,/g, ";");
60061           vals = val.split(";");
60062         }
60063         vals = vals.filter(Boolean);
60064         if (!vals.length)
60065           return;
60066         _container.classed("active", false);
60067         utilGetSetValue(_input, "");
60068         if (_isMulti) {
60069           utilArrayUniq(vals).forEach(function(v) {
60070             var key = (field.key || "") + v;
60071             if (_tags) {
60072               var old = _tags[key];
60073               if (typeof old === "string" && old.toLowerCase() !== "no")
60074                 return;
60075             }
60076             key = context.cleanTagKey(key);
60077             field.keys.push(key);
60078             t[key] = "yes";
60079           });
60080         } else if (_isSemi) {
60081           var arr = _multiData.map(function(d) {
60082             return d.key;
60083           });
60084           arr = arr.concat(vals);
60085           t[field.key] = context.cleanTagValue(utilArrayUniq(arr).filter(Boolean).join(";"));
60086         }
60087         window.setTimeout(function() {
60088           _input.node().focus();
60089         }, 10);
60090       } else {
60091         var rawValue = utilGetSetValue(_input);
60092         if (!rawValue && Array.isArray(_tags[field.key]))
60093           return;
60094         val = context.cleanTagValue(tagValue(rawValue));
60095         t[field.key] = val || void 0;
60096       }
60097       dispatch10.call("change", this, t);
60098     }
60099     function removeMultikey(d3_event, d) {
60100       d3_event.preventDefault();
60101       d3_event.stopPropagation();
60102       var t = {};
60103       if (_isMulti) {
60104         t[d.key] = void 0;
60105       } else if (_isSemi) {
60106         var arr = _multiData.map(function(md) {
60107           return md.key === d.key ? null : md.key;
60108         }).filter(Boolean);
60109         arr = utilArrayUniq(arr);
60110         t[field.key] = arr.length ? arr.join(";") : void 0;
60111         _lengthIndicator.update(t[field.key]);
60112       }
60113       dispatch10.call("change", this, t);
60114     }
60115     function invertMultikey(d3_event, d) {
60116       d3_event.preventDefault();
60117       d3_event.stopPropagation();
60118       var t = {};
60119       if (_isMulti) {
60120         t[d.key] = _tags[d.key] === "yes" ? "no" : "yes";
60121       }
60122       dispatch10.call("change", this, t);
60123     }
60124     function combo(selection2) {
60125       _container = selection2.selectAll(".form-field-input-wrap").data([0]);
60126       var type2 = _isMulti || _isSemi ? "multicombo" : "combo";
60127       _container = _container.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + type2).merge(_container);
60128       if (_isMulti || _isSemi) {
60129         _container = _container.selectAll(".chiplist").data([0]);
60130         var listClass = "chiplist";
60131         if (field.key === "destination" || field.key === "via") {
60132           listClass += " full-line-chips";
60133         }
60134         _container = _container.enter().append("ul").attr("class", listClass).on("click", function() {
60135           window.setTimeout(function() {
60136             _input.node().focus();
60137           }, 10);
60138         }).merge(_container);
60139         _inputWrap = _container.selectAll(".input-wrap").data([0]);
60140         _inputWrap = _inputWrap.enter().append("li").attr("class", "input-wrap").merge(_inputWrap);
60141         var hideAdd = !_allowCustomValues && !_comboData.length;
60142         _inputWrap.style("display", hideAdd ? "none" : null);
60143         _input = _inputWrap.selectAll("input").data([0]);
60144       } else {
60145         _input = _container.selectAll("input").data([0]);
60146       }
60147       _input = _input.enter().append("input").attr("type", "text").attr("id", field.domId).call(utilNoAuto).call(initCombo, selection2).merge(_input);
60148       if (_isSemi) {
60149         _inputWrap.call(_lengthIndicator);
60150       } else if (!_isMulti) {
60151         _container.call(_lengthIndicator);
60152       }
60153       if (_isNetwork) {
60154         var extent = combinedEntityExtent();
60155         var countryCode = extent && iso1A2Code(extent.center());
60156         _countryCode = countryCode && countryCode.toLowerCase();
60157       }
60158       _input.on("change", change).on("blur", change).on("input", function() {
60159         let val = utilGetSetValue(_input);
60160         updateIcon(val);
60161         if (_isSemi && _tags[field.key]) {
60162           val += ";" + _tags[field.key];
60163         }
60164         _lengthIndicator.update(val);
60165       });
60166       _input.on("keydown.field", function(d3_event) {
60167         switch (d3_event.keyCode) {
60168           case 13:
60169             _input.node().blur();
60170             d3_event.stopPropagation();
60171             break;
60172         }
60173       });
60174       if (_isMulti || _isSemi) {
60175         _combobox.on("accept", function() {
60176           _input.node().blur();
60177           _input.node().focus();
60178         });
60179         _input.on("focus", function() {
60180           _container.classed("active", true);
60181         });
60182       }
60183       _combobox.on("cancel", function() {
60184         _input.node().blur();
60185       }).on("update", function() {
60186         updateIcon(utilGetSetValue(_input));
60187       });
60188     }
60189     function updateIcon(value) {
60190       value = tagValue(value);
60191       let container = _container;
60192       if (field.type === "multiCombo" || field.type === "semiCombo") {
60193         container = _container.select(".input-wrap");
60194       }
60195       const iconsField = field.resolveReference("iconsCrossReference");
60196       if (iconsField.icons) {
60197         container.selectAll(".tag-value-icon").remove();
60198         if (iconsField.icons[value]) {
60199           container.selectAll(".tag-value-icon").data([value]).enter().insert("div", "input").attr("class", "tag-value-icon").call(svgIcon(`#${iconsField.icons[value]}`));
60200         }
60201       }
60202     }
60203     combo.tags = function(tags) {
60204       _tags = tags;
60205       var stringsField = field.resolveReference("stringsCrossReference");
60206       var isMixed = Array.isArray(tags[field.key]);
60207       var showsValue = (value) => !isMixed && value && !(field.type === "typeCombo" && value === "yes");
60208       var isRawValue = (value) => showsValue(value) && !stringsField.hasTextForStringId(`options.${value}`) && !stringsField.hasTextForStringId(`options.${value}.title`);
60209       var isKnownValue = (value) => showsValue(value) && !isRawValue(value);
60210       var isReadOnly = !_allowCustomValues;
60211       if (_isMulti || _isSemi) {
60212         _multiData = [];
60213         var maxLength;
60214         if (_isMulti) {
60215           for (var k in tags) {
60216             if (field.key && k.indexOf(field.key) !== 0)
60217               continue;
60218             if (!field.key && field.keys.indexOf(k) === -1)
60219               continue;
60220             var v = tags[k];
60221             var suffix = field.key ? k.slice(field.key.length) : k;
60222             _multiData.push({
60223               key: k,
60224               value: displayValue(suffix),
60225               display: addComboboxIcons(renderValue(suffix), suffix),
60226               state: typeof v === "string" ? v.toLowerCase() : "",
60227               isMixed: Array.isArray(v)
60228             });
60229           }
60230           if (field.key) {
60231             field.keys = _multiData.map(function(d) {
60232               return d.key;
60233             });
60234             maxLength = context.maxCharsForTagKey() - utilUnicodeCharsCount(field.key);
60235           } else {
60236             maxLength = context.maxCharsForTagKey();
60237           }
60238         } else if (_isSemi) {
60239           var allValues = [];
60240           var commonValues;
60241           if (Array.isArray(tags[field.key])) {
60242             tags[field.key].forEach(function(tagVal) {
60243               var thisVals = utilArrayUniq((tagVal || "").split(";")).filter(Boolean);
60244               allValues = allValues.concat(thisVals);
60245               if (!commonValues) {
60246                 commonValues = thisVals;
60247               } else {
60248                 commonValues = commonValues.filter((value) => thisVals.includes(value));
60249               }
60250             });
60251             allValues = utilArrayUniq(allValues).filter(Boolean);
60252           } else {
60253             allValues = utilArrayUniq((tags[field.key] || "").split(";")).filter(Boolean);
60254             commonValues = allValues;
60255           }
60256           _multiData = allValues.map(function(v2) {
60257             return {
60258               key: v2,
60259               value: displayValue(v2),
60260               display: addComboboxIcons(renderValue(v2), v2),
60261               isMixed: !commonValues.includes(v2)
60262             };
60263           });
60264           var currLength = utilUnicodeCharsCount(commonValues.join(";"));
60265           maxLength = context.maxCharsForTagValue() - currLength;
60266           if (currLength > 0) {
60267             maxLength -= 1;
60268           }
60269         }
60270         maxLength = Math.max(0, maxLength);
60271         var hideAdd = maxLength <= 0 || !_allowCustomValues && !_comboData.length;
60272         _container.selectAll(".chiplist .input-wrap").style("display", hideAdd ? "none" : null);
60273         var allowDragAndDrop = _isSemi && !Array.isArray(tags[field.key]);
60274         var chips = _container.selectAll(".chip").data(_multiData);
60275         chips.exit().remove();
60276         var enter = chips.enter().insert("li", ".input-wrap").attr("class", "chip");
60277         enter.append("span");
60278         enter.append("a");
60279         chips = chips.merge(enter).order().classed("raw-value", function(d) {
60280           var k2 = d.key;
60281           if (_isMulti)
60282             k2 = k2.replace(field.key, "");
60283           return !stringsField.hasTextForStringId("options." + k2);
60284         }).classed("draggable", allowDragAndDrop).classed("mixed", function(d) {
60285           return d.isMixed;
60286         }).attr("title", function(d) {
60287           if (d.isMixed) {
60288             return _t("inspector.unshared_value_tooltip");
60289           }
60290           if (!["yes", "no"].includes(d.state)) {
60291             return d.state;
60292           }
60293           return null;
60294         }).classed("negated", (d) => d.state === "no");
60295         if (!_isSemi) {
60296           chips.selectAll("input[type=checkbox]").remove();
60297           chips.insert("input", "span").attr("type", "checkbox").property("checked", (d) => d.state === "yes").property("indeterminate", (d) => d.isMixed || !["yes", "no"].includes(d.state)).on("click", invertMultikey);
60298         }
60299         if (allowDragAndDrop) {
60300           registerDragAndDrop(chips);
60301         }
60302         chips.select("span").each(function(d) {
60303           const selection2 = select_default2(this);
60304           if (d.display) {
60305             selection2.text("");
60306             d.display(selection2);
60307           } else {
60308             selection2.text(d.value);
60309           }
60310         });
60311         chips.select("a").attr("href", "#").on("click", removeMultikey).attr("class", "remove").text("\xD7");
60312         updateIcon("");
60313       } else {
60314         var mixedValues = isMixed && tags[field.key].map(function(val) {
60315           return displayValue(val);
60316         }).filter(Boolean);
60317         utilGetSetValue(_input, !isMixed ? displayValue(tags[field.key]) : "").data([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) {
60318           if (isReadOnly && isKnownValue(tags[field.key]) && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) {
60319             d3_event.preventDefault();
60320             d3_event.stopPropagation();
60321             var t = {};
60322             t[field.key] = void 0;
60323             dispatch10.call("change", this, t);
60324           }
60325         });
60326         if (!Array.isArray(tags[field.key])) {
60327           updateIcon(tags[field.key]);
60328         }
60329         if (!isMixed) {
60330           _lengthIndicator.update(tags[field.key]);
60331         }
60332       }
60333       const refreshStyles = () => {
60334         _input.data([tagValue(utilGetSetValue(_input))]).classed("raw-value", isRawValue).classed("known-value", isKnownValue);
60335       };
60336       _input.on("input.refreshStyles", refreshStyles);
60337       _combobox.on("update.refreshStyles", refreshStyles);
60338       refreshStyles();
60339     };
60340     function registerDragAndDrop(selection2) {
60341       var dragOrigin, targetIndex;
60342       selection2.call(
60343         drag_default().on("start", function(d3_event) {
60344           dragOrigin = {
60345             x: d3_event.x,
60346             y: d3_event.y
60347           };
60348           targetIndex = null;
60349         }).on("drag", function(d3_event) {
60350           var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y;
60351           if (!select_default2(this).classed("dragging") && // don't display drag until dragging beyond a distance threshold
60352           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5)
60353             return;
60354           var index = selection2.nodes().indexOf(this);
60355           select_default2(this).classed("dragging", true);
60356           targetIndex = null;
60357           var targetIndexOffsetTop = null;
60358           var draggedTagWidth = select_default2(this).node().offsetWidth;
60359           if (field.key === "destination" || field.key === "via") {
60360             _container.selectAll(".chip").style("transform", function(d2, index2) {
60361               var node = select_default2(this).node();
60362               if (index === index2) {
60363                 return "translate(" + x + "px, " + y + "px)";
60364               } else if (index2 > index && d3_event.y > node.offsetTop) {
60365                 if (targetIndex === null || index2 > targetIndex) {
60366                   targetIndex = index2;
60367                 }
60368                 return "translateY(-100%)";
60369               } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
60370                 if (targetIndex === null || index2 < targetIndex) {
60371                   targetIndex = index2;
60372                 }
60373                 return "translateY(100%)";
60374               }
60375               return null;
60376             });
60377           } else {
60378             _container.selectAll(".chip").each(function(d2, index2) {
60379               var node = select_default2(this).node();
60380               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) {
60381                 targetIndex = index2;
60382                 targetIndexOffsetTop = node.offsetTop;
60383               }
60384             }).style("transform", function(d2, index2) {
60385               var node = select_default2(this).node();
60386               if (index === index2) {
60387                 return "translate(" + x + "px, " + y + "px)";
60388               }
60389               if (node.offsetTop === targetIndexOffsetTop) {
60390                 if (index2 < index && index2 >= targetIndex) {
60391                   return "translateX(" + draggedTagWidth + "px)";
60392                 } else if (index2 > index && index2 <= targetIndex) {
60393                   return "translateX(-" + draggedTagWidth + "px)";
60394                 }
60395               }
60396               return null;
60397             });
60398           }
60399         }).on("end", function() {
60400           if (!select_default2(this).classed("dragging")) {
60401             return;
60402           }
60403           var index = selection2.nodes().indexOf(this);
60404           select_default2(this).classed("dragging", false);
60405           _container.selectAll(".chip").style("transform", null);
60406           if (typeof targetIndex === "number") {
60407             var element = _multiData[index];
60408             _multiData.splice(index, 1);
60409             _multiData.splice(targetIndex, 0, element);
60410             var t = {};
60411             if (_multiData.length) {
60412               t[field.key] = _multiData.map(function(element2) {
60413                 return element2.key;
60414               }).join(";");
60415             } else {
60416               t[field.key] = void 0;
60417             }
60418             dispatch10.call("change", this, t);
60419           }
60420           dragOrigin = void 0;
60421           targetIndex = void 0;
60422         })
60423       );
60424     }
60425     combo.focus = function() {
60426       _input.node().focus();
60427     };
60428     combo.entityIDs = function(val) {
60429       if (!arguments.length)
60430         return _entityIDs;
60431       _entityIDs = val;
60432       return combo;
60433     };
60434     function combinedEntityExtent() {
60435       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
60436     }
60437     return utilRebind(combo, dispatch10, "on");
60438   }
60439
60440   // modules/ui/fields/input.js
60441   var likelyRawNumberFormat = /^-?(0\.\d*|\d*\.\d{0,2}(\d{4,})?|\d{4,}\.\d{3})$/;
60442   function uiFieldText(field, context) {
60443     var dispatch10 = dispatch_default("change");
60444     var input = select_default2(null);
60445     var outlinkButton = select_default2(null);
60446     var wrap2 = select_default2(null);
60447     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue());
60448     var _entityIDs = [];
60449     var _tags;
60450     var _phoneFormats = {};
60451     const isDirectionField = field.key.split(":").some((keyPart) => keyPart === "direction");
60452     const formatFloat = _mainLocalizer.floatFormatter(_mainLocalizer.languageCode());
60453     const parseLocaleFloat = _mainLocalizer.floatParser(_mainLocalizer.languageCode());
60454     const countDecimalPlaces = _mainLocalizer.decimalPlaceCounter(_mainLocalizer.languageCode());
60455     if (field.type === "tel") {
60456       _mainFileFetcher.get("phone_formats").then(function(d) {
60457         _phoneFormats = d;
60458         updatePhonePlaceholder();
60459       }).catch(function() {
60460       });
60461     }
60462     function calcLocked() {
60463       var isLocked = (field.id === "brand" || field.id === "network" || field.id === "operator" || field.id === "flag") && _entityIDs.length && _entityIDs.some(function(entityID) {
60464         var entity = context.graph().hasEntity(entityID);
60465         if (!entity)
60466           return false;
60467         if (entity.tags.wikidata)
60468           return true;
60469         var preset = _mainPresetIndex.match(entity, context.graph());
60470         var isSuggestion = preset && preset.suggestion;
60471         var which = field.id;
60472         return isSuggestion && !!entity.tags[which] && !!entity.tags[which + ":wikidata"];
60473       });
60474       field.locked(isLocked);
60475     }
60476     function i2(selection2) {
60477       calcLocked();
60478       var isLocked = field.locked();
60479       wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
60480       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
60481       input = wrap2.selectAll("input").data([0]);
60482       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);
60483       input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change());
60484       wrap2.call(_lengthIndicator);
60485       if (field.type === "tel") {
60486         updatePhonePlaceholder();
60487       } else if (field.type === "number") {
60488         var rtl = _mainLocalizer.textDirection() === "rtl";
60489         input.attr("type", "text");
60490         var inc = field.increment;
60491         var buttons = wrap2.selectAll(".increment, .decrement").data(rtl ? [inc, -inc] : [-inc, inc]);
60492         buttons.enter().append("button").attr("class", function(d) {
60493           var which = d > 0 ? "increment" : "decrement";
60494           return "form-field-button " + which;
60495         }).attr("title", function(d) {
60496           var which = d > 0 ? "increment" : "decrement";
60497           return _t(`inspector.${which}`);
60498         }).merge(buttons).on("click", function(d3_event, d) {
60499           d3_event.preventDefault();
60500           var isMixed = Array.isArray(_tags[field.key]);
60501           if (isMixed)
60502             return;
60503           var raw_vals = input.node().value || "0";
60504           var vals = raw_vals.split(";");
60505           vals = vals.map(function(v) {
60506             v = v.trim();
60507             const isRawNumber = likelyRawNumberFormat.test(v);
60508             var num = isRawNumber ? parseFloat(v) : parseLocaleFloat(v);
60509             if (isDirectionField) {
60510               const compassDir = cardinal[v.toLowerCase()];
60511               if (compassDir !== void 0) {
60512                 num = compassDir;
60513               }
60514             }
60515             if (!isFinite(num))
60516               return v;
60517             num = parseFloat(num);
60518             if (!isFinite(num))
60519               return v;
60520             num += d;
60521             if (isDirectionField) {
60522               num = (num % 360 + 360) % 360;
60523             }
60524             return formatFloat(clamped(num), isRawNumber ? v.includes(".") ? v.split(".")[1].length : 0 : countDecimalPlaces(v));
60525           });
60526           input.node().value = vals.join(";");
60527           change()();
60528         });
60529       } else if (field.type === "identifier" && field.urlFormat && field.pattern) {
60530         input.attr("type", "text");
60531         outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]);
60532         outlinkButton.enter().append("button").call(svgIcon("#iD-icon-out-link")).attr("class", "form-field-button foreign-id-permalink").attr("title", function() {
60533           var domainResults = /^https?:\/\/(.{1,}?)\//.exec(field.urlFormat);
60534           if (domainResults.length >= 2 && domainResults[1]) {
60535             var domain2 = domainResults[1];
60536             return _t("icons.view_on", { domain: domain2 });
60537           }
60538           return "";
60539         }).on("click", function(d3_event) {
60540           d3_event.preventDefault();
60541           var value = validIdentifierValueForLink();
60542           if (value) {
60543             var url = field.urlFormat.replace(/{value}/, encodeURIComponent(value));
60544             window.open(url, "_blank");
60545           }
60546         }).merge(outlinkButton);
60547       } else if (field.type === "url") {
60548         input.attr("type", "text");
60549         outlinkButton = wrap2.selectAll(".foreign-id-permalink").data([0]);
60550         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) {
60551           d3_event.preventDefault();
60552           const value = validIdentifierValueForLink();
60553           if (value)
60554             window.open(value, "_blank");
60555         }).merge(outlinkButton);
60556       } else if (field.type === "colour") {
60557         input.attr("type", "text");
60558         updateColourPreview();
60559       } else if (field.type === "date") {
60560         input.attr("type", "text");
60561         updateDateField();
60562       }
60563     }
60564     function updateColourPreview() {
60565       function isColourValid(colour2) {
60566         if (!colour2.match(/^(#([0-9a-fA-F]{3}){1,2}|\w+)$/)) {
60567           return false;
60568         } else if (!CSS.supports("color", colour2) || ["unset", "inherit", "initial", "revert"].includes(colour2)) {
60569           return false;
60570         }
60571         return true;
60572       }
60573       wrap2.selectAll(".colour-preview").remove();
60574       const colour = utilGetSetValue(input);
60575       if (!isColourValid(colour) && colour !== "") {
60576         wrap2.selectAll("input.colour-selector").remove();
60577         wrap2.selectAll(".form-field-button").remove();
60578         return;
60579       }
60580       var colourSelector = wrap2.selectAll(".colour-selector").data([0]);
60581       colourSelector.enter().append("input").attr("type", "color").attr("class", "colour-selector").on("input", debounce_default(function(d3_event) {
60582         d3_event.preventDefault();
60583         var colour2 = this.value;
60584         if (!isColourValid(colour2))
60585           return;
60586         utilGetSetValue(input, this.value);
60587         change()();
60588         updateColourPreview();
60589       }, 100));
60590       wrap2.selectAll("input.colour-selector").attr("value", colour);
60591       var chooserButton = wrap2.selectAll(".colour-preview").data([colour]);
60592       chooserButton = chooserButton.enter().append("div").attr("class", "form-field-button colour-preview").append("div").style("background-color", (d) => d).attr("class", "colour-box");
60593       if (colour === "") {
60594         chooserButton = chooserButton.call(svgIcon("#iD-icon-edit"));
60595       }
60596       chooserButton.on("click", () => wrap2.select(".colour-selector").node().showPicker());
60597     }
60598     function updateDateField() {
60599       function isDateValid(date2) {
60600         return date2.match(/^[0-9]{4}(-[0-9]{2}(-[0-9]{2})?)?$/);
60601       }
60602       const date = utilGetSetValue(input);
60603       const now3 = /* @__PURE__ */ new Date();
60604       const today = new Date(now3.getTime() - now3.getTimezoneOffset() * 6e4).toISOString().split("T")[0];
60605       if ((field.key === "check_date" || field.key === "survey:date") && date !== today) {
60606         wrap2.selectAll(".date-set-today").data([0]).enter().append("button").attr("class", "form-field-button date-set-today").call(svgIcon("#fas-rotate")).call(uiTooltip().title(() => _t.append("inspector.set_today"))).on("click", () => {
60607           utilGetSetValue(input, today);
60608           change()();
60609           updateDateField();
60610         });
60611       } else {
60612         wrap2.selectAll(".date-set-today").remove();
60613       }
60614       if (!isDateValid(date) && date !== "") {
60615         wrap2.selectAll("input.date-selector").remove();
60616         wrap2.selectAll(".date-calendar").remove();
60617         return;
60618       }
60619       if (utilDetect().browser !== "Safari") {
60620         var dateSelector = wrap2.selectAll(".date-selector").data([0]);
60621         dateSelector.enter().append("input").attr("type", "date").attr("class", "date-selector").on("input", debounce_default(function(d3_event) {
60622           d3_event.preventDefault();
60623           var date2 = this.value;
60624           if (!isDateValid(date2))
60625             return;
60626           utilGetSetValue(input, this.value);
60627           change()();
60628           updateDateField();
60629         }, 100));
60630         wrap2.selectAll("input.date-selector").attr("value", date);
60631         var calendarButton = wrap2.selectAll(".date-calendar").data([date]);
60632         calendarButton = calendarButton.enter().append("button").attr("class", "form-field-button date-calendar").call(svgIcon("#fas-calendar-days"));
60633         calendarButton.on("click", () => wrap2.select(".date-selector").node().showPicker());
60634       }
60635     }
60636     function updatePhonePlaceholder() {
60637       if (input.empty() || !Object.keys(_phoneFormats).length)
60638         return;
60639       var extent = combinedEntityExtent();
60640       var countryCode = extent && iso1A2Code(extent.center());
60641       var format2 = countryCode && _phoneFormats[countryCode.toLowerCase()];
60642       if (format2)
60643         input.attr("placeholder", format2);
60644     }
60645     function validIdentifierValueForLink() {
60646       const value = utilGetSetValue(input).trim();
60647       if (field.type === "url" && value) {
60648         try {
60649           return new URL(value).href;
60650         } catch (e) {
60651           return null;
60652         }
60653       }
60654       if (field.type === "identifier" && field.pattern) {
60655         return value && value.match(new RegExp(field.pattern))[0];
60656       }
60657       return null;
60658     }
60659     function clamped(num) {
60660       if (field.minValue !== void 0) {
60661         num = Math.max(num, field.minValue);
60662       }
60663       if (field.maxValue !== void 0) {
60664         num = Math.min(num, field.maxValue);
60665       }
60666       return num;
60667     }
60668     function getVals(tags) {
60669       if (field.keys) {
60670         const multiSelection = context.selectedIDs();
60671         tags = multiSelection.length > 1 ? context.selectedIDs().map((id2) => context.graph().entity(id2)).map((entity) => entity.tags) : [tags];
60672         return tags.map((tags2) => new Set(field.keys.reduce((acc, key) => acc.concat(tags2[key]), []).filter(Boolean))).map((vals) => vals.size === 0 ? /* @__PURE__ */ new Set([void 0]) : vals).reduce((a, b) => /* @__PURE__ */ new Set([...a, ...b]));
60673       } else {
60674         return new Set([].concat(tags[field.key]));
60675       }
60676     }
60677     function change(onInput) {
60678       return function() {
60679         var t = {};
60680         var val = utilGetSetValue(input);
60681         if (!onInput)
60682           val = context.cleanTagValue(val);
60683         if (!val && getVals(_tags).size > 1)
60684           return;
60685         var displayVal = val;
60686         if (field.type === "number" && val) {
60687           var numbers2 = val.split(";");
60688           numbers2 = numbers2.map(function(v) {
60689             if (likelyRawNumberFormat.test(v)) {
60690               return v;
60691             }
60692             var num = parseLocaleFloat(v);
60693             const fractionDigits = countDecimalPlaces(v);
60694             return isFinite(num) ? clamped(num).toFixed(fractionDigits) : v;
60695           });
60696           val = numbers2.join(";");
60697         }
60698         if (!onInput)
60699           utilGetSetValue(input, displayVal);
60700         t[field.key] = val || void 0;
60701         if (field.keys) {
60702           dispatch10.call("change", this, (tags) => {
60703             if (field.keys.some((key) => tags[key])) {
60704               field.keys.filter((key) => tags[key]).forEach((key) => {
60705                 tags[key] = val || void 0;
60706               });
60707             } else {
60708               tags[field.key] = val || void 0;
60709             }
60710             return tags;
60711           }, onInput);
60712         } else {
60713           dispatch10.call("change", this, t, onInput);
60714         }
60715       };
60716     }
60717     i2.entityIDs = function(val) {
60718       if (!arguments.length)
60719         return _entityIDs;
60720       _entityIDs = val;
60721       return i2;
60722     };
60723     i2.tags = function(tags) {
60724       _tags = tags;
60725       const vals = getVals(tags);
60726       const isMixed = vals.size > 1;
60727       var val = vals.size === 1 ? [...vals][0] : "";
60728       var shouldUpdate;
60729       if (field.type === "number" && val) {
60730         var numbers2 = val.split(";");
60731         var oriNumbers = utilGetSetValue(input).split(";");
60732         if (numbers2.length !== oriNumbers.length)
60733           shouldUpdate = true;
60734         numbers2 = numbers2.map(function(v) {
60735           v = v.trim();
60736           var num = Number(v);
60737           if (!isFinite(num) || v === "")
60738             return v;
60739           const fractionDigits = v.includes(".") ? v.split(".")[1].length : 0;
60740           return formatFloat(num, fractionDigits);
60741         });
60742         val = numbers2.join(";");
60743         shouldUpdate = (inputValue, setValue) => {
60744           const inputNums = inputValue.split(";").map(
60745             (setVal) => likelyRawNumberFormat.test(setVal) ? parseFloat(setVal) : parseLocaleFloat(setVal)
60746           );
60747           const setNums = setValue.split(";").map(parseLocaleFloat);
60748           return !isEqual_default(inputNums, setNums);
60749         };
60750       }
60751       utilGetSetValue(input, val, shouldUpdate).attr("title", isMixed ? [...vals].join("\n") : void 0).attr("placeholder", isMixed ? _t("inspector.multiple_values") : field.placeholder() || _t("inspector.unknown")).classed("mixed", isMixed);
60752       if (field.type === "number") {
60753         const buttons = wrap2.selectAll(".increment, .decrement");
60754         if (isMixed) {
60755           buttons.attr("disabled", "disabled").classed("disabled", true);
60756         } else {
60757           var raw_vals = tags[field.key] || "0";
60758           const canIncDec = raw_vals.split(";").some((val2) => isFinite(Number(val2)) || isDirectionField && cardinal[val2.trim().toLowerCase()]);
60759           buttons.attr("disabled", canIncDec ? null : "disabled").classed("disabled", !canIncDec);
60760         }
60761       }
60762       if (field.type === "tel")
60763         updatePhonePlaceholder();
60764       if (field.type === "colour")
60765         updateColourPreview();
60766       if (field.type === "date")
60767         updateDateField();
60768       if (outlinkButton && !outlinkButton.empty()) {
60769         var disabled = !validIdentifierValueForLink();
60770         outlinkButton.classed("disabled", disabled);
60771       }
60772       if (!isMixed) {
60773         _lengthIndicator.update(tags[field.key]);
60774       }
60775     };
60776     i2.focus = function() {
60777       var node = input.node();
60778       if (node)
60779         node.focus();
60780     };
60781     function combinedEntityExtent() {
60782       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
60783     }
60784     return utilRebind(i2, dispatch10, "on");
60785   }
60786
60787   // modules/ui/fields/access.js
60788   function uiFieldAccess(field, context) {
60789     var dispatch10 = dispatch_default("change");
60790     var items = select_default2(null);
60791     var _tags;
60792     function access(selection2) {
60793       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
60794       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
60795       var list = wrap2.selectAll("ul").data([0]);
60796       list = list.enter().append("ul").attr("class", "rows").merge(list);
60797       items = list.selectAll("li").data(field.keys);
60798       var enter = items.enter().append("li").attr("class", function(d) {
60799         return "labeled-input preset-access-" + d;
60800       });
60801       enter.append("span").attr("class", "label preset-label-access").attr("for", function(d) {
60802         return "preset-input-access-" + d;
60803       }).html(function(d) {
60804         return field.t.html("types." + d);
60805       });
60806       enter.append("div").attr("class", "preset-input-access-wrap").append("input").attr("type", "text").attr("class", function(d) {
60807         return "preset-input-access preset-input-access-" + d;
60808       }).call(utilNoAuto).each(function(d) {
60809         select_default2(this).call(
60810           uiCombobox(context, "access-" + d).data(access.options(d))
60811         );
60812       });
60813       items = items.merge(enter);
60814       wrap2.selectAll(".preset-input-access").on("change", change).on("blur", change);
60815     }
60816     function change(d3_event, d) {
60817       var tag = {};
60818       var value = context.cleanTagValue(utilGetSetValue(select_default2(this)));
60819       if (!value && typeof _tags[d] !== "string")
60820         return;
60821       tag[d] = value || void 0;
60822       dispatch10.call("change", this, tag);
60823     }
60824     access.options = function(type2) {
60825       var options2 = [
60826         "yes",
60827         "no",
60828         "designated",
60829         "permissive",
60830         "destination",
60831         "customers",
60832         "private",
60833         "permit",
60834         "unknown"
60835       ];
60836       if (type2 === "access") {
60837         options2 = options2.filter((v) => v !== "yes" && v !== "designated");
60838       }
60839       if (type2 === "bicycle") {
60840         options2.splice(options2.length - 4, 0, "dismount");
60841       }
60842       var stringsField = field.resolveReference("stringsCrossReference");
60843       return options2.map(function(option) {
60844         return {
60845           title: stringsField.t("options." + option + ".description"),
60846           value: option
60847         };
60848       });
60849     };
60850     const placeholdersByTag = {
60851       highway: {
60852         footway: {
60853           foot: "designated",
60854           motor_vehicle: "no"
60855         },
60856         steps: {
60857           foot: "yes",
60858           motor_vehicle: "no",
60859           bicycle: "no",
60860           horse: "no"
60861         },
60862         pedestrian: {
60863           foot: "yes",
60864           motor_vehicle: "no"
60865         },
60866         cycleway: {
60867           motor_vehicle: "no",
60868           bicycle: "designated"
60869         },
60870         bridleway: {
60871           motor_vehicle: "no",
60872           horse: "designated"
60873         },
60874         path: {
60875           foot: "yes",
60876           motor_vehicle: "no",
60877           bicycle: "yes",
60878           horse: "yes"
60879         },
60880         motorway: {
60881           foot: "no",
60882           motor_vehicle: "yes",
60883           bicycle: "no",
60884           horse: "no"
60885         },
60886         trunk: {
60887           motor_vehicle: "yes"
60888         },
60889         primary: {
60890           foot: "yes",
60891           motor_vehicle: "yes",
60892           bicycle: "yes",
60893           horse: "yes"
60894         },
60895         secondary: {
60896           foot: "yes",
60897           motor_vehicle: "yes",
60898           bicycle: "yes",
60899           horse: "yes"
60900         },
60901         tertiary: {
60902           foot: "yes",
60903           motor_vehicle: "yes",
60904           bicycle: "yes",
60905           horse: "yes"
60906         },
60907         residential: {
60908           foot: "yes",
60909           motor_vehicle: "yes",
60910           bicycle: "yes",
60911           horse: "yes"
60912         },
60913         unclassified: {
60914           foot: "yes",
60915           motor_vehicle: "yes",
60916           bicycle: "yes",
60917           horse: "yes"
60918         },
60919         service: {
60920           foot: "yes",
60921           motor_vehicle: "yes",
60922           bicycle: "yes",
60923           horse: "yes"
60924         },
60925         motorway_link: {
60926           foot: "no",
60927           motor_vehicle: "yes",
60928           bicycle: "no",
60929           horse: "no"
60930         },
60931         trunk_link: {
60932           motor_vehicle: "yes"
60933         },
60934         primary_link: {
60935           foot: "yes",
60936           motor_vehicle: "yes",
60937           bicycle: "yes",
60938           horse: "yes"
60939         },
60940         secondary_link: {
60941           foot: "yes",
60942           motor_vehicle: "yes",
60943           bicycle: "yes",
60944           horse: "yes"
60945         },
60946         tertiary_link: {
60947           foot: "yes",
60948           motor_vehicle: "yes",
60949           bicycle: "yes",
60950           horse: "yes"
60951         },
60952         construction: {
60953           access: "no"
60954         }
60955       },
60956       barrier: {
60957         bollard: {
60958           access: "no",
60959           bicycle: "yes",
60960           foot: "yes"
60961         },
60962         bus_trap: {
60963           motor_vehicle: "no",
60964           psv: "yes",
60965           foot: "yes",
60966           bicycle: "yes"
60967         },
60968         city_wall: {
60969           access: "no"
60970         },
60971         coupure: {
60972           access: "yes"
60973         },
60974         cycle_barrier: {
60975           motor_vehicle: "no"
60976         },
60977         ditch: {
60978           access: "no"
60979         },
60980         entrance: {
60981           access: "yes"
60982         },
60983         fence: {
60984           access: "no"
60985         },
60986         hedge: {
60987           access: "no"
60988         },
60989         jersey_barrier: {
60990           access: "no"
60991         },
60992         motorcycle_barrier: {
60993           motor_vehicle: "no"
60994         },
60995         rail_guard: {
60996           access: "no"
60997         }
60998       }
60999     };
61000     access.tags = function(tags) {
61001       _tags = tags;
61002       utilGetSetValue(items.selectAll(".preset-input-access"), function(d) {
61003         return typeof tags[d] === "string" ? tags[d] : "";
61004       }).classed("mixed", function(d) {
61005         return tags[d] && Array.isArray(tags[d]);
61006       }).attr("title", function(d) {
61007         return tags[d] && Array.isArray(tags[d]) && tags[d].filter(Boolean).join("\n");
61008       }).attr("placeholder", function(d) {
61009         if (tags[d] && Array.isArray(tags[d])) {
61010           return _t("inspector.multiple_values");
61011         }
61012         if (d === "bicycle" || d === "motor_vehicle") {
61013           if (tags.vehicle && typeof tags.vehicle === "string") {
61014             return tags.vehicle;
61015           }
61016         }
61017         if (tags.access && typeof tags.access === "string") {
61018           return tags.access;
61019         }
61020         function getPlaceholdersByTag(key, placeholdersByKey) {
61021           if (typeof tags[key] === "string") {
61022             if (placeholdersByKey[tags[key]] && placeholdersByKey[tags[key]][d]) {
61023               return placeholdersByKey[tags[key]][d];
61024             }
61025           } else {
61026             var impliedAccesses = tags[key].filter(Boolean).map(function(val) {
61027               return placeholdersByKey[val] && placeholdersByKey[val][d];
61028             }).filter(Boolean);
61029             if (impliedAccesses.length === tags[key].length && new Set(impliedAccesses).size === 1) {
61030               return impliedAccesses[0];
61031             }
61032           }
61033         }
61034         for (const key in placeholdersByTag) {
61035           if (tags[key]) {
61036             const impliedAccess = getPlaceholdersByTag(key, placeholdersByTag[key]);
61037             if (impliedAccess) {
61038               return impliedAccess;
61039             }
61040           }
61041         }
61042         if (d === "access" && !tags.barrier) {
61043           return "yes";
61044         }
61045         return field.placeholder();
61046       });
61047     };
61048     access.focus = function() {
61049       items.selectAll(".preset-input-access").node().focus();
61050     };
61051     return utilRebind(access, dispatch10, "on");
61052   }
61053
61054   // modules/ui/fields/address.js
61055   function uiFieldAddress(field, context) {
61056     var dispatch10 = dispatch_default("change");
61057     var _selection = select_default2(null);
61058     var _wrap = select_default2(null);
61059     var addrField = _mainPresetIndex.field("address");
61060     var _entityIDs = [];
61061     var _tags;
61062     var _countryCode;
61063     var _addressFormats = [{
61064       format: [
61065         ["housenumber", "street"],
61066         ["city", "postcode"]
61067       ]
61068     }];
61069     _mainFileFetcher.get("address_formats").then(function(d) {
61070       _addressFormats = d;
61071       if (!_selection.empty()) {
61072         _selection.call(address);
61073       }
61074     }).catch(function() {
61075     });
61076     function getNear(isAddressable, type2, searchRadius, resultProp) {
61077       var extent = combinedEntityExtent();
61078       var l = extent.center();
61079       var box = geoExtent(l).padByMeters(searchRadius);
61080       var features = context.history().intersects(box).filter(isAddressable).map((d) => {
61081         let dist = geoSphericalDistance(d.extent(context.graph()).center(), l);
61082         if (d.type === "way") {
61083           var loc = context.projection([
61084             (extent[0][0] + extent[1][0]) / 2,
61085             (extent[0][1] + extent[1][1]) / 2
61086           ]);
61087           var choice = geoChooseEdge(context.graph().childNodes(d), loc, context.projection);
61088           dist = Math.min(dist, choice.distance);
61089         }
61090         const value = resultProp && d.tags[resultProp] ? d.tags[resultProp] : d.tags.name;
61091         let title = value;
61092         if (type2 === "street") {
61093           title = `${addrField.t("placeholders.street")}: ${title}`;
61094         } else if (type2 === "place") {
61095           title = `${addrField.t("placeholders.place")}: ${title}`;
61096         }
61097         return {
61098           title,
61099           value,
61100           dist,
61101           type: type2,
61102           klass: `address-${type2}`
61103         };
61104       }).sort(function(a, b) {
61105         return a.dist - b.dist;
61106       });
61107       return utilArrayUniqBy(features, "value");
61108     }
61109     function getNearStreets() {
61110       function isAddressable(d) {
61111         return d.tags.highway && d.tags.name && d.type === "way";
61112       }
61113       return getNear(isAddressable, "street", 200);
61114     }
61115     function getNearPlaces() {
61116       function isAddressable(d) {
61117         if (d.tags.name) {
61118           if (d.tags.place)
61119             return true;
61120           if (d.tags.boundary === "administrative" && d.tags.admin_level > 8)
61121             return true;
61122         }
61123         return false;
61124       }
61125       return getNear(isAddressable, "place", 200);
61126     }
61127     function getNearCities() {
61128       function isAddressable(d) {
61129         if (d.tags.name) {
61130           if (d.tags.boundary === "administrative" && d.tags.admin_level === "8")
61131             return true;
61132           if (d.tags.border_type === "city")
61133             return true;
61134           if (d.tags.place === "city" || d.tags.place === "town" || d.tags.place === "village")
61135             return true;
61136         }
61137         if (d.tags[`${field.key}:city`])
61138           return true;
61139         return false;
61140       }
61141       return getNear(isAddressable, "city", 200, `${field.key}:city`);
61142     }
61143     function getNearPostcodes() {
61144       return [...new Set([].concat(getNearValues("postcode")).concat(getNear((d) => d.tags.postal_code, "postcode", 200, "postal_code")))];
61145     }
61146     function getNearValues(key) {
61147       const tagKey = `${field.key}:${key}`;
61148       function hasTag(d) {
61149         return _entityIDs.indexOf(d.id) === -1 && d.tags[tagKey];
61150       }
61151       return getNear(hasTag, key, 200, tagKey);
61152     }
61153     function updateForCountryCode() {
61154       if (!_countryCode)
61155         return;
61156       var addressFormat;
61157       for (var i2 = 0; i2 < _addressFormats.length; i2++) {
61158         var format2 = _addressFormats[i2];
61159         if (!format2.countryCodes) {
61160           addressFormat = format2;
61161         } else if (format2.countryCodes.indexOf(_countryCode) !== -1) {
61162           addressFormat = format2;
61163           break;
61164         }
61165       }
61166       var dropdowns = addressFormat.dropdowns || [
61167         "city",
61168         "county",
61169         "country",
61170         "district",
61171         "hamlet",
61172         "neighbourhood",
61173         "place",
61174         "postcode",
61175         "province",
61176         "quarter",
61177         "state",
61178         "street",
61179         "street+place",
61180         "subdistrict",
61181         "suburb"
61182       ];
61183       var widths = addressFormat.widths || {
61184         housenumber: 1 / 5,
61185         unit: 1 / 5,
61186         street: 1 / 2,
61187         place: 1 / 2,
61188         city: 2 / 3,
61189         state: 1 / 4,
61190         postcode: 1 / 3
61191       };
61192       function row(r) {
61193         var total = r.reduce(function(sum, key) {
61194           return sum + (widths[key] || 0.5);
61195         }, 0);
61196         return r.map(function(key) {
61197           return {
61198             id: key,
61199             width: (widths[key] || 0.5) / total
61200           };
61201         });
61202       }
61203       var rows = _wrap.selectAll(".addr-row").data(addressFormat.format, function(d) {
61204         return d.toString();
61205       });
61206       rows.exit().remove();
61207       rows.enter().append("div").attr("class", "addr-row").selectAll("input").data(row).enter().append("input").property("type", "text").call(updatePlaceholder).attr("class", function(d) {
61208         return "addr-" + d.id;
61209       }).call(utilNoAuto).each(addDropdown).style("width", function(d) {
61210         return d.width * 100 + "%";
61211       });
61212       function addDropdown(d) {
61213         if (dropdowns.indexOf(d.id) === -1)
61214           return;
61215         var nearValues;
61216         switch (d.id) {
61217           case "street":
61218             nearValues = getNearStreets;
61219             break;
61220           case "place":
61221             nearValues = getNearPlaces;
61222             break;
61223           case "street+place":
61224             nearValues = () => [].concat(getNearStreets()).concat(getNearPlaces());
61225             d.isAutoStreetPlace = true;
61226             d.id = _tags[`${field.key}:place`] ? "place" : "street";
61227             break;
61228           case "city":
61229             nearValues = getNearCities;
61230             break;
61231           case "postcode":
61232             nearValues = getNearPostcodes;
61233             break;
61234           default:
61235             nearValues = getNearValues;
61236         }
61237         select_default2(this).call(
61238           uiCombobox(context, `address-${d.isAutoStreetPlace ? "street-place" : d.id}`).minItems(1).caseSensitive(true).fetcher(function(typedValue, callback) {
61239             typedValue = typedValue.toLowerCase();
61240             callback(nearValues(d.id).filter((v) => v.value.toLowerCase().indexOf(typedValue) !== -1));
61241           }).on("accept", function(selected) {
61242             if (d.isAutoStreetPlace) {
61243               d.id = selected ? selected.type : "street";
61244             }
61245           })
61246         );
61247       }
61248       _wrap.selectAll("input").on("blur", change()).on("change", change());
61249       _wrap.selectAll("input:not(.combobox-input)").on("input", change(true));
61250       if (_tags)
61251         updateTags(_tags);
61252     }
61253     function address(selection2) {
61254       _selection = selection2;
61255       _wrap = selection2.selectAll(".form-field-input-wrap").data([0]);
61256       _wrap = _wrap.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(_wrap);
61257       var extent = combinedEntityExtent();
61258       if (extent) {
61259         var countryCode;
61260         if (context.inIntro()) {
61261           countryCode = _t("intro.graph.countrycode");
61262         } else {
61263           var center = extent.center();
61264           countryCode = iso1A2Code(center);
61265         }
61266         if (countryCode) {
61267           _countryCode = countryCode.toLowerCase();
61268           updateForCountryCode();
61269         }
61270       }
61271     }
61272     function change(onInput) {
61273       return function() {
61274         setTimeout(() => {
61275           var tags = {};
61276           _wrap.selectAll("input").each(function(subfield) {
61277             var key = field.key + ":" + subfield.id;
61278             var value = this.value;
61279             if (!onInput)
61280               value = context.cleanTagValue(value);
61281             if (Array.isArray(_tags[key]) && !value)
61282               return;
61283             if (subfield.isAutoStreetPlace) {
61284               if (subfield.id === "street") {
61285                 tags[`${field.key}:place`] = void 0;
61286               } else if (subfield.id === "place") {
61287                 tags[`${field.key}:street`] = void 0;
61288               }
61289             }
61290             tags[key] = value || void 0;
61291           });
61292           dispatch10.call("change", this, tags, onInput);
61293         }, 0);
61294       };
61295     }
61296     function updatePlaceholder(inputSelection) {
61297       return inputSelection.attr("placeholder", function(subfield) {
61298         if (_tags && Array.isArray(_tags[field.key + ":" + subfield.id])) {
61299           return _t("inspector.multiple_values");
61300         }
61301         if (subfield.isAutoStreetPlace) {
61302           return `${getLocalPlaceholder("street")} / ${getLocalPlaceholder("place")}`;
61303         }
61304         return getLocalPlaceholder(subfield.id);
61305       });
61306     }
61307     function getLocalPlaceholder(key) {
61308       if (_countryCode) {
61309         var localkey = key + "!" + _countryCode;
61310         var tkey = addrField.hasTextForStringId("placeholders." + localkey) ? localkey : key;
61311         return addrField.t("placeholders." + tkey);
61312       }
61313     }
61314     function updateTags(tags) {
61315       utilGetSetValue(_wrap.selectAll("input"), (subfield) => {
61316         var val;
61317         if (subfield.isAutoStreetPlace) {
61318           const streetKey = `${field.key}:street`;
61319           const placeKey = `${field.key}:place`;
61320           if (tags[streetKey] !== void 0 || tags[placeKey] === void 0) {
61321             val = tags[streetKey];
61322             subfield.id = "street";
61323           } else {
61324             val = tags[placeKey];
61325             subfield.id = "place";
61326           }
61327         } else {
61328           val = tags[`${field.key}:${subfield.id}`];
61329         }
61330         return typeof val === "string" ? val : "";
61331       }).attr("title", function(subfield) {
61332         var val = tags[field.key + ":" + subfield.id];
61333         return val && Array.isArray(val) ? val.filter(Boolean).join("\n") : void 0;
61334       }).classed("mixed", function(subfield) {
61335         return Array.isArray(tags[field.key + ":" + subfield.id]);
61336       }).call(updatePlaceholder);
61337     }
61338     function combinedEntityExtent() {
61339       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
61340     }
61341     address.entityIDs = function(val) {
61342       if (!arguments.length)
61343         return _entityIDs;
61344       _entityIDs = val;
61345       return address;
61346     };
61347     address.tags = function(tags) {
61348       _tags = tags;
61349       updateTags(tags);
61350     };
61351     address.focus = function() {
61352       var node = _wrap.selectAll("input").node();
61353       if (node)
61354         node.focus();
61355     };
61356     return utilRebind(address, dispatch10, "on");
61357   }
61358
61359   // modules/ui/fields/directional_combo.js
61360   function uiFieldDirectionalCombo(field, context) {
61361     var dispatch10 = dispatch_default("change");
61362     var items = select_default2(null);
61363     var wrap2 = select_default2(null);
61364     var _tags;
61365     var _combos = {};
61366     if (field.type === "cycleway") {
61367       field = {
61368         ...field,
61369         key: field.keys[0],
61370         keys: field.keys.slice(1)
61371       };
61372     }
61373     function directionalCombo(selection2) {
61374       function stripcolon(s) {
61375         return s.replace(":", "");
61376       }
61377       wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61378       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61379       var div = wrap2.selectAll("ul").data([0]);
61380       div = div.enter().append("ul").attr("class", "rows").merge(div);
61381       items = div.selectAll("li").data(field.keys);
61382       var enter = items.enter().append("li").attr("class", function(d) {
61383         return "labeled-input preset-directionalcombo-" + stripcolon(d);
61384       });
61385       enter.append("span").attr("class", "label preset-label-directionalcombo").attr("for", function(d) {
61386         return "preset-input-directionalcombo-" + stripcolon(d);
61387       }).html(function(d) {
61388         return field.t.html("types." + d);
61389       });
61390       enter.append("div").attr("class", "preset-input-directionalcombo-wrap form-field-input-wrap").each(function(key) {
61391         const subField = {
61392           ...field,
61393           type: "combo",
61394           key
61395         };
61396         const combo = uiFieldCombo(subField, context);
61397         combo.on("change", (t) => change(key, t[key]));
61398         _combos[key] = combo;
61399         select_default2(this).call(combo);
61400       });
61401       items = items.merge(enter);
61402       wrap2.selectAll(".preset-input-directionalcombo").on("change", change).on("blur", change);
61403     }
61404     function change(key, newValue) {
61405       const commonKey = field.key;
61406       const otherKey = key === field.keys[0] ? field.keys[1] : field.keys[0];
61407       dispatch10.call("change", this, (tags) => {
61408         const otherValue = tags[otherKey] || tags[commonKey];
61409         if (newValue === otherValue) {
61410           tags[commonKey] = newValue;
61411           delete tags[key];
61412           delete tags[otherKey];
61413         } else {
61414           tags[key] = newValue;
61415           delete tags[commonKey];
61416           tags[otherKey] = otherValue;
61417         }
61418         return tags;
61419       });
61420     }
61421     directionalCombo.tags = function(tags) {
61422       _tags = tags;
61423       const commonKey = field.key;
61424       for (let key in _combos) {
61425         const uniqueValues = [...new Set([].concat(_tags[commonKey]).concat(_tags[key]).filter(Boolean))];
61426         _combos[key].tags({ [key]: uniqueValues.length > 1 ? uniqueValues : uniqueValues[0] });
61427       }
61428     };
61429     directionalCombo.focus = function() {
61430       var node = wrap2.selectAll("input").node();
61431       if (node)
61432         node.focus();
61433     };
61434     return utilRebind(directionalCombo, dispatch10, "on");
61435   }
61436
61437   // modules/ui/fields/lanes.js
61438   function uiFieldLanes(field, context) {
61439     var dispatch10 = dispatch_default("change");
61440     var LANE_WIDTH = 40;
61441     var LANE_HEIGHT = 200;
61442     var _entityIDs = [];
61443     function lanes(selection2) {
61444       var lanesData = context.entity(_entityIDs[0]).lanes();
61445       if (!context.container().select(".inspector-wrap.inspector-hidden").empty() || !selection2.node().parentNode) {
61446         selection2.call(lanes.off);
61447         return;
61448       }
61449       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61450       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61451       var surface = wrap2.selectAll(".surface").data([0]);
61452       var d = utilGetDimensions(wrap2);
61453       var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
61454       surface = surface.enter().append("svg").attr("width", d[0]).attr("height", 300).attr("class", "surface").merge(surface);
61455       var lanesSelection = surface.selectAll(".lanes").data([0]);
61456       lanesSelection = lanesSelection.enter().append("g").attr("class", "lanes").merge(lanesSelection);
61457       lanesSelection.attr("transform", function() {
61458         return "translate(" + freeSpace / 2 + ", 0)";
61459       });
61460       var lane = lanesSelection.selectAll(".lane").data(lanesData.lanes);
61461       lane.exit().remove();
61462       var enter = lane.enter().append("g").attr("class", "lane");
61463       enter.append("g").append("rect").attr("y", 50).attr("width", LANE_WIDTH).attr("height", LANE_HEIGHT);
61464       enter.append("g").attr("class", "forward").append("text").attr("y", 40).attr("x", 14).text("\u25B2");
61465       enter.append("g").attr("class", "bothways").append("text").attr("y", 40).attr("x", 14).text("\u25B2\u25BC");
61466       enter.append("g").attr("class", "backward").append("text").attr("y", 40).attr("x", 14).text("\u25BC");
61467       lane = lane.merge(enter);
61468       lane.attr("transform", function(d2) {
61469         return "translate(" + LANE_WIDTH * d2.index * 1.5 + ", 0)";
61470       });
61471       lane.select(".forward").style("visibility", function(d2) {
61472         return d2.direction === "forward" ? "visible" : "hidden";
61473       });
61474       lane.select(".bothways").style("visibility", function(d2) {
61475         return d2.direction === "bothways" ? "visible" : "hidden";
61476       });
61477       lane.select(".backward").style("visibility", function(d2) {
61478         return d2.direction === "backward" ? "visible" : "hidden";
61479       });
61480     }
61481     lanes.entityIDs = function(val) {
61482       _entityIDs = val;
61483     };
61484     lanes.tags = function() {
61485     };
61486     lanes.focus = function() {
61487     };
61488     lanes.off = function() {
61489     };
61490     return utilRebind(lanes, dispatch10, "on");
61491   }
61492   uiFieldLanes.supportsMultiselection = false;
61493
61494   // modules/ui/fields/localized.js
61495   var _languagesArray = [];
61496   function uiFieldLocalized(field, context) {
61497     var dispatch10 = dispatch_default("change", "input");
61498     var wikipedia = services.wikipedia;
61499     var input = select_default2(null);
61500     var localizedInputs = select_default2(null);
61501     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue());
61502     var _countryCode;
61503     var _tags;
61504     _mainFileFetcher.get("languages").then(loadLanguagesArray).catch(function() {
61505     });
61506     var _territoryLanguages = {};
61507     _mainFileFetcher.get("territory_languages").then(function(d) {
61508       _territoryLanguages = d;
61509     }).catch(function() {
61510     });
61511     var langCombo = uiCombobox(context, "localized-lang").fetcher(fetchLanguages).minItems(0);
61512     var _selection = select_default2(null);
61513     var _multilingual = [];
61514     var _buttonTip = uiTooltip().title(() => _t.append("translate.translate")).placement("left");
61515     var _wikiTitles;
61516     var _entityIDs = [];
61517     function loadLanguagesArray(dataLanguages) {
61518       if (_languagesArray.length !== 0)
61519         return;
61520       var replacements = {
61521         sr: "sr-Cyrl",
61522         // in OSM, `sr` implies Cyrillic
61523         "sr-Cyrl": false
61524         // `sr-Cyrl` isn't used in OSM
61525       };
61526       for (var code in dataLanguages) {
61527         if (replacements[code] === false)
61528           continue;
61529         var metaCode = code;
61530         if (replacements[code])
61531           metaCode = replacements[code];
61532         _languagesArray.push({
61533           localName: _mainLocalizer.languageName(metaCode, { localOnly: true }),
61534           nativeName: dataLanguages[metaCode].nativeName,
61535           code,
61536           label: _mainLocalizer.languageName(metaCode)
61537         });
61538       }
61539     }
61540     function calcLocked() {
61541       var isLocked = field.id === "name" && _entityIDs.length && _entityIDs.some(function(entityID) {
61542         var entity = context.graph().hasEntity(entityID);
61543         if (!entity)
61544           return false;
61545         if (entity.tags.wikidata)
61546           return true;
61547         if (entity.tags["name:etymology:wikidata"])
61548           return true;
61549         var preset = _mainPresetIndex.match(entity, context.graph());
61550         if (preset) {
61551           var isSuggestion = preset.suggestion;
61552           var fields = preset.fields(entity.extent(context.graph()).center());
61553           var showsBrandField = fields.some(function(d) {
61554             return d.id === "brand";
61555           });
61556           var showsOperatorField = fields.some(function(d) {
61557             return d.id === "operator";
61558           });
61559           var setsName = preset.addTags.name;
61560           var setsBrandWikidata = preset.addTags["brand:wikidata"];
61561           var setsOperatorWikidata = preset.addTags["operator:wikidata"];
61562           return isSuggestion && setsName && (setsBrandWikidata && !showsBrandField || setsOperatorWikidata && !showsOperatorField);
61563         }
61564         return false;
61565       });
61566       field.locked(isLocked);
61567     }
61568     function calcMultilingual(tags) {
61569       var existingLangsOrdered = _multilingual.map(function(item2) {
61570         return item2.lang;
61571       });
61572       var existingLangs = new Set(existingLangsOrdered.filter(Boolean));
61573       for (var k in tags) {
61574         var m = k.match(/^(.*):([a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2})?)$/);
61575         if (m && m[1] === field.key && m[2]) {
61576           var item = { lang: m[2], value: tags[k] };
61577           if (existingLangs.has(item.lang)) {
61578             _multilingual[existingLangsOrdered.indexOf(item.lang)].value = item.value;
61579             existingLangs.delete(item.lang);
61580           } else {
61581             _multilingual.push(item);
61582           }
61583         }
61584       }
61585       _multilingual.forEach(function(item2) {
61586         if (item2.lang && existingLangs.has(item2.lang)) {
61587           item2.value = "";
61588         }
61589       });
61590     }
61591     function localized(selection2) {
61592       _selection = selection2;
61593       calcLocked();
61594       var isLocked = field.locked();
61595       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61596       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61597       input = wrap2.selectAll(".localized-main").data([0]);
61598       input = input.enter().append("input").attr("type", "text").attr("id", field.domId).attr("class", "localized-main").call(utilNoAuto).merge(input);
61599       input.classed("disabled", !!isLocked).attr("readonly", isLocked || null).on("input", change(true)).on("blur", change()).on("change", change());
61600       wrap2.call(_lengthIndicator);
61601       var translateButton = wrap2.selectAll(".localized-add").data([0]);
61602       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);
61603       translateButton.classed("disabled", !!isLocked).call(isLocked ? _buttonTip.destroy : _buttonTip).on("click", addNew);
61604       if (_tags && !_multilingual.length) {
61605         calcMultilingual(_tags);
61606       }
61607       localizedInputs = selection2.selectAll(".localized-multilingual").data([0]);
61608       localizedInputs = localizedInputs.enter().append("div").attr("class", "localized-multilingual").merge(localizedInputs);
61609       localizedInputs.call(renderMultilingual);
61610       localizedInputs.selectAll("button, input").classed("disabled", !!isLocked).attr("readonly", isLocked || null);
61611       selection2.selectAll(".combobox-caret").classed("nope", true);
61612       function addNew(d3_event) {
61613         d3_event.preventDefault();
61614         if (field.locked())
61615           return;
61616         var defaultLang = _mainLocalizer.languageCode().toLowerCase();
61617         var langExists = _multilingual.find(function(datum2) {
61618           return datum2.lang === defaultLang;
61619         });
61620         var isLangEn = defaultLang.indexOf("en") > -1;
61621         if (isLangEn || langExists) {
61622           defaultLang = "";
61623           langExists = _multilingual.find(function(datum2) {
61624             return datum2.lang === defaultLang;
61625           });
61626         }
61627         if (!langExists) {
61628           _multilingual.unshift({ lang: defaultLang, value: "" });
61629           localizedInputs.call(renderMultilingual);
61630         }
61631       }
61632       function change(onInput) {
61633         return function(d3_event) {
61634           if (field.locked()) {
61635             d3_event.preventDefault();
61636             return;
61637           }
61638           var val = utilGetSetValue(select_default2(this));
61639           if (!onInput)
61640             val = context.cleanTagValue(val);
61641           if (!val && Array.isArray(_tags[field.key]))
61642             return;
61643           var t = {};
61644           t[field.key] = val || void 0;
61645           dispatch10.call("change", this, t, onInput);
61646         };
61647       }
61648     }
61649     function key(lang) {
61650       return field.key + ":" + lang;
61651     }
61652     function changeLang(d3_event, d) {
61653       var tags = {};
61654       var lang = utilGetSetValue(select_default2(this)).toLowerCase();
61655       var language = _languagesArray.find(function(d2) {
61656         return d2.label.toLowerCase() === lang || d2.localName && d2.localName.toLowerCase() === lang || d2.nativeName && d2.nativeName.toLowerCase() === lang;
61657       });
61658       if (language)
61659         lang = language.code;
61660       if (d.lang && d.lang !== lang) {
61661         tags[key(d.lang)] = void 0;
61662       }
61663       var newKey = lang && context.cleanTagKey(key(lang));
61664       var value = utilGetSetValue(select_default2(this.parentNode).selectAll(".localized-value"));
61665       if (newKey && value) {
61666         tags[newKey] = value;
61667       } else if (newKey && _wikiTitles && _wikiTitles[d.lang]) {
61668         tags[newKey] = _wikiTitles[d.lang];
61669       }
61670       d.lang = lang;
61671       dispatch10.call("change", this, tags);
61672     }
61673     function changeValue(d3_event, d) {
61674       if (!d.lang)
61675         return;
61676       var value = context.cleanTagValue(utilGetSetValue(select_default2(this))) || void 0;
61677       if (!value && Array.isArray(d.value))
61678         return;
61679       var t = {};
61680       t[key(d.lang)] = value;
61681       d.value = value;
61682       dispatch10.call("change", this, t);
61683     }
61684     function fetchLanguages(value, cb) {
61685       var v = value.toLowerCase();
61686       var langCodes = [_mainLocalizer.localeCode(), _mainLocalizer.languageCode()];
61687       if (_countryCode && _territoryLanguages[_countryCode]) {
61688         langCodes = langCodes.concat(_territoryLanguages[_countryCode]);
61689       }
61690       var langItems = [];
61691       langCodes.forEach(function(code) {
61692         var langItem = _languagesArray.find(function(item) {
61693           return item.code === code;
61694         });
61695         if (langItem)
61696           langItems.push(langItem);
61697       });
61698       langItems = utilArrayUniq(langItems.concat(_languagesArray));
61699       cb(langItems.filter(function(d) {
61700         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;
61701       }).map(function(d) {
61702         return { value: d.label };
61703       }));
61704     }
61705     function renderMultilingual(selection2) {
61706       var entries = selection2.selectAll("div.entry").data(_multilingual, function(d) {
61707         return d.lang;
61708       });
61709       entries.exit().style("top", "0").style("max-height", "240px").transition().duration(200).style("opacity", "0").style("max-height", "0px").remove();
61710       var entriesEnter = entries.enter().append("div").attr("class", "entry").each(function(_, index) {
61711         var wrap2 = select_default2(this);
61712         var domId = utilUniqueDomId(index);
61713         var label = wrap2.append("label").attr("class", "field-label").attr("for", domId);
61714         var text2 = label.append("span").attr("class", "label-text");
61715         text2.append("span").attr("class", "label-textvalue").call(_t.append("translate.localized_translation_label"));
61716         text2.append("span").attr("class", "label-textannotation");
61717         label.append("button").attr("class", "remove-icon-multilingual").attr("title", _t("icons.remove")).on("click", function(d3_event, d) {
61718           if (field.locked())
61719             return;
61720           d3_event.preventDefault();
61721           _multilingual.splice(_multilingual.indexOf(d), 1);
61722           var langKey = d.lang && key(d.lang);
61723           if (langKey && langKey in _tags) {
61724             delete _tags[langKey];
61725             var t = {};
61726             t[langKey] = void 0;
61727             dispatch10.call("change", this, t);
61728             return;
61729           }
61730           renderMultilingual(selection2);
61731         }).call(svgIcon("#iD-operation-delete"));
61732         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);
61733         wrap2.append("input").attr("type", "text").attr("class", "localized-value").on("blur", changeValue).on("change", changeValue);
61734       });
61735       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() {
61736         select_default2(this).style("max-height", "").style("overflow", "visible");
61737       });
61738       entries = entries.merge(entriesEnter);
61739       entries.order();
61740       entries.classed("present", true);
61741       utilGetSetValue(entries.select(".localized-lang"), function(d) {
61742         var langItem = _languagesArray.find(function(item) {
61743           return item.code === d.lang;
61744         });
61745         if (langItem)
61746           return langItem.label;
61747         return d.lang;
61748       });
61749       utilGetSetValue(entries.select(".localized-value"), function(d) {
61750         return typeof d.value === "string" ? d.value : "";
61751       }).attr("title", function(d) {
61752         return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : null;
61753       }).attr("placeholder", function(d) {
61754         return Array.isArray(d.value) ? _t("inspector.multiple_values") : _t("translate.localized_translation_name");
61755       }).classed("mixed", function(d) {
61756         return Array.isArray(d.value);
61757       });
61758     }
61759     localized.tags = function(tags) {
61760       _tags = tags;
61761       if (typeof tags.wikipedia === "string" && !_wikiTitles) {
61762         _wikiTitles = {};
61763         var wm = tags.wikipedia.match(/([^:]+):(.+)/);
61764         if (wm && wm[0] && wm[1]) {
61765           wikipedia.translations(wm[1], wm[2], function(err, d) {
61766             if (err || !d)
61767               return;
61768             _wikiTitles = d;
61769           });
61770         }
61771       }
61772       var isMixed = Array.isArray(tags[field.key]);
61773       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);
61774       calcMultilingual(tags);
61775       _selection.call(localized);
61776       if (!isMixed) {
61777         _lengthIndicator.update(tags[field.key]);
61778       }
61779     };
61780     localized.focus = function() {
61781       input.node().focus();
61782     };
61783     localized.entityIDs = function(val) {
61784       if (!arguments.length)
61785         return _entityIDs;
61786       _entityIDs = val;
61787       _multilingual = [];
61788       loadCountryCode();
61789       return localized;
61790     };
61791     function loadCountryCode() {
61792       var extent = combinedEntityExtent();
61793       var countryCode = extent && iso1A2Code(extent.center());
61794       _countryCode = countryCode && countryCode.toLowerCase();
61795     }
61796     function combinedEntityExtent() {
61797       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
61798     }
61799     return utilRebind(localized, dispatch10, "on");
61800   }
61801
61802   // modules/ui/fields/roadheight.js
61803   function uiFieldRoadheight(field, context) {
61804     var dispatch10 = dispatch_default("change");
61805     var primaryUnitInput = select_default2(null);
61806     var primaryInput = select_default2(null);
61807     var secondaryInput = select_default2(null);
61808     var secondaryUnitInput = select_default2(null);
61809     var _entityIDs = [];
61810     var _tags;
61811     var _isImperial;
61812     var formatFloat = _mainLocalizer.floatFormatter(_mainLocalizer.languageCode());
61813     var parseLocaleFloat = _mainLocalizer.floatParser(_mainLocalizer.languageCode());
61814     var primaryUnits = [
61815       {
61816         value: "m",
61817         title: _t("inspector.roadheight.meter")
61818       },
61819       {
61820         value: "ft",
61821         title: _t("inspector.roadheight.foot")
61822       }
61823     ];
61824     var unitCombo = uiCombobox(context, "roadheight-unit").data(primaryUnits);
61825     function roadheight(selection2) {
61826       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61827       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61828       primaryInput = wrap2.selectAll("input.roadheight-number").data([0]);
61829       primaryInput = primaryInput.enter().append("input").attr("type", "text").attr("class", "roadheight-number").attr("id", field.domId).call(utilNoAuto).merge(primaryInput);
61830       primaryInput.on("change", change).on("blur", change);
61831       var loc = combinedEntityExtent().center();
61832       _isImperial = roadHeightUnit(loc) === "ft";
61833       primaryUnitInput = wrap2.selectAll("input.roadheight-unit").data([0]);
61834       primaryUnitInput = primaryUnitInput.enter().append("input").attr("type", "text").attr("class", "roadheight-unit").call(unitCombo).merge(primaryUnitInput);
61835       primaryUnitInput.on("blur", changeUnits).on("change", changeUnits);
61836       secondaryInput = wrap2.selectAll("input.roadheight-secondary-number").data([0]);
61837       secondaryInput = secondaryInput.enter().append("input").attr("type", "text").attr("class", "roadheight-secondary-number").call(utilNoAuto).merge(secondaryInput);
61838       secondaryInput.on("change", change).on("blur", change);
61839       secondaryUnitInput = wrap2.selectAll("input.roadheight-secondary-unit").data([0]);
61840       secondaryUnitInput = secondaryUnitInput.enter().append("input").attr("type", "text").call(utilNoAuto).classed("disabled", true).classed("roadheight-secondary-unit", true).attr("readonly", "readonly").merge(secondaryUnitInput);
61841       function changeUnits() {
61842         var primaryUnit = utilGetSetValue(primaryUnitInput);
61843         if (primaryUnit === "m") {
61844           _isImperial = false;
61845         } else if (primaryUnit === "ft") {
61846           _isImperial = true;
61847         }
61848         utilGetSetValue(primaryUnitInput, _isImperial ? "ft" : "m");
61849         setUnitSuggestions();
61850         change();
61851       }
61852     }
61853     function setUnitSuggestions() {
61854       utilGetSetValue(primaryUnitInput, _isImperial ? "ft" : "m");
61855     }
61856     function change() {
61857       var tag = {};
61858       var primaryValue = utilGetSetValue(primaryInput).trim();
61859       var secondaryValue = utilGetSetValue(secondaryInput).trim();
61860       if (!primaryValue && !secondaryValue && Array.isArray(_tags[field.key]))
61861         return;
61862       if (!primaryValue && !secondaryValue) {
61863         tag[field.key] = void 0;
61864       } else {
61865         var rawPrimaryValue = likelyRawNumberFormat.test(primaryValue) ? parseFloat(primaryValue) : parseLocaleFloat(primaryValue);
61866         if (isNaN(rawPrimaryValue))
61867           rawPrimaryValue = primaryValue;
61868         var rawSecondaryValue = likelyRawNumberFormat.test(secondaryValue) ? parseFloat(secondaryValue) : parseLocaleFloat(secondaryValue);
61869         if (isNaN(rawSecondaryValue))
61870           rawSecondaryValue = secondaryValue;
61871         if (isNaN(rawPrimaryValue) || isNaN(rawSecondaryValue) || !_isImperial) {
61872           tag[field.key] = context.cleanTagValue(rawPrimaryValue);
61873         } else {
61874           if (rawPrimaryValue !== "") {
61875             rawPrimaryValue = rawPrimaryValue + "'";
61876           }
61877           if (rawSecondaryValue !== "") {
61878             rawSecondaryValue = rawSecondaryValue + '"';
61879           }
61880           tag[field.key] = context.cleanTagValue(rawPrimaryValue + rawSecondaryValue);
61881         }
61882       }
61883       dispatch10.call("change", this, tag);
61884     }
61885     roadheight.tags = function(tags) {
61886       _tags = tags;
61887       var primaryValue = tags[field.key];
61888       var secondaryValue;
61889       var isMixed = Array.isArray(primaryValue);
61890       if (!isMixed) {
61891         if (primaryValue && (primaryValue.indexOf("'") >= 0 || primaryValue.indexOf('"') >= 0)) {
61892           secondaryValue = primaryValue.match(/(-?[\d.]+)"/);
61893           if (secondaryValue !== null) {
61894             secondaryValue = formatFloat(parseFloat(secondaryValue[1]));
61895           }
61896           primaryValue = primaryValue.match(/(-?[\d.]+)'/);
61897           if (primaryValue !== null) {
61898             primaryValue = formatFloat(parseFloat(primaryValue[1]));
61899           }
61900           _isImperial = true;
61901         } else if (primaryValue) {
61902           var rawValue = primaryValue;
61903           primaryValue = parseFloat(rawValue);
61904           if (isNaN(primaryValue)) {
61905             primaryValue = rawValue;
61906           } else {
61907             primaryValue = formatFloat(primaryValue);
61908           }
61909           _isImperial = false;
61910         }
61911       }
61912       setUnitSuggestions();
61913       var inchesPlaceholder = formatFloat(0);
61914       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);
61915       utilGetSetValue(secondaryInput, typeof secondaryValue === "string" ? secondaryValue : "").attr("placeholder", isMixed ? _t("inspector.multiple_values") : _isImperial ? inchesPlaceholder : null).classed("mixed", isMixed).classed("disabled", !_isImperial).attr("readonly", _isImperial ? null : "readonly");
61916       secondaryUnitInput.attr("value", _isImperial ? _t("inspector.roadheight.inch") : null);
61917     };
61918     roadheight.focus = function() {
61919       primaryInput.node().focus();
61920     };
61921     roadheight.entityIDs = function(val) {
61922       _entityIDs = val;
61923     };
61924     function combinedEntityExtent() {
61925       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
61926     }
61927     return utilRebind(roadheight, dispatch10, "on");
61928   }
61929
61930   // modules/ui/fields/roadspeed.js
61931   function uiFieldRoadspeed(field, context) {
61932     var dispatch10 = dispatch_default("change");
61933     var unitInput = select_default2(null);
61934     var input = select_default2(null);
61935     var _entityIDs = [];
61936     var _tags;
61937     var _isImperial;
61938     var formatFloat = _mainLocalizer.floatFormatter(_mainLocalizer.languageCode());
61939     var parseLocaleFloat = _mainLocalizer.floatParser(_mainLocalizer.languageCode());
61940     var speedCombo = uiCombobox(context, "roadspeed");
61941     var unitCombo = uiCombobox(context, "roadspeed-unit").data(["km/h", "mph"].map(comboValues));
61942     var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
61943     var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
61944     function roadspeed(selection2) {
61945       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
61946       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
61947       input = wrap2.selectAll("input.roadspeed-number").data([0]);
61948       input = input.enter().append("input").attr("type", "text").attr("class", "roadspeed-number").attr("id", field.domId).call(utilNoAuto).call(speedCombo).merge(input);
61949       input.on("change", change).on("blur", change);
61950       var loc = combinedEntityExtent().center();
61951       _isImperial = roadSpeedUnit(loc) === "mph";
61952       unitInput = wrap2.selectAll("input.roadspeed-unit").data([0]);
61953       unitInput = unitInput.enter().append("input").attr("type", "text").attr("class", "roadspeed-unit").attr("aria-label", _t("inspector.speed_unit")).call(unitCombo).merge(unitInput);
61954       unitInput.on("blur", changeUnits).on("change", changeUnits);
61955       function changeUnits() {
61956         var unit2 = utilGetSetValue(unitInput);
61957         if (unit2 === "km/h") {
61958           _isImperial = false;
61959         } else if (unit2 === "mph") {
61960           _isImperial = true;
61961         }
61962         utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h");
61963         setUnitSuggestions();
61964         change();
61965       }
61966     }
61967     function setUnitSuggestions() {
61968       speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
61969       utilGetSetValue(unitInput, _isImperial ? "mph" : "km/h");
61970     }
61971     function comboValues(d) {
61972       return {
61973         value: formatFloat(d),
61974         title: formatFloat(d)
61975       };
61976     }
61977     function change() {
61978       var tag = {};
61979       var value = utilGetSetValue(input).trim();
61980       if (!value && Array.isArray(_tags[field.key]))
61981         return;
61982       if (!value) {
61983         tag[field.key] = void 0;
61984       } else {
61985         var rawValue = likelyRawNumberFormat.test(value) ? parseFloat(value) : parseLocaleFloat(value);
61986         if (isNaN(rawValue))
61987           rawValue = value;
61988         if (isNaN(rawValue) || !_isImperial) {
61989           tag[field.key] = context.cleanTagValue(rawValue);
61990         } else {
61991           tag[field.key] = context.cleanTagValue(rawValue + " mph");
61992         }
61993       }
61994       dispatch10.call("change", this, tag);
61995     }
61996     roadspeed.tags = function(tags) {
61997       _tags = tags;
61998       var rawValue = tags[field.key];
61999       var value = rawValue;
62000       var isMixed = Array.isArray(value);
62001       if (!isMixed) {
62002         if (rawValue && rawValue.indexOf("mph") >= 0) {
62003           _isImperial = true;
62004         } else if (rawValue) {
62005           _isImperial = false;
62006         }
62007         value = parseInt(value, 10);
62008         if (isNaN(value)) {
62009           value = rawValue;
62010         } else {
62011           value = formatFloat(value);
62012         }
62013       }
62014       setUnitSuggestions();
62015       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);
62016     };
62017     roadspeed.focus = function() {
62018       input.node().focus();
62019     };
62020     roadspeed.entityIDs = function(val) {
62021       _entityIDs = val;
62022     };
62023     function combinedEntityExtent() {
62024       return _entityIDs && _entityIDs.length && utilTotalExtent(_entityIDs, context.graph());
62025     }
62026     return utilRebind(roadspeed, dispatch10, "on");
62027   }
62028
62029   // modules/ui/fields/radio.js
62030   function uiFieldRadio(field, context) {
62031     var dispatch10 = dispatch_default("change");
62032     var placeholder = select_default2(null);
62033     var wrap2 = select_default2(null);
62034     var labels = select_default2(null);
62035     var radios = select_default2(null);
62036     var radioData = (field.options || field.keys).slice();
62037     var typeField;
62038     var layerField;
62039     var _oldType = {};
62040     var _entityIDs = [];
62041     function selectedKey() {
62042       var node = wrap2.selectAll(".form-field-input-radio label.active input");
62043       return !node.empty() && node.datum();
62044     }
62045     function radio(selection2) {
62046       selection2.classed("preset-radio", true);
62047       wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
62048       var enter = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-radio");
62049       enter.append("span").attr("class", "placeholder");
62050       wrap2 = wrap2.merge(enter);
62051       placeholder = wrap2.selectAll(".placeholder");
62052       labels = wrap2.selectAll("label").data(radioData);
62053       enter = labels.enter().append("label");
62054       var stringsField = field.resolveReference("stringsCrossReference");
62055       enter.append("input").attr("type", "radio").attr("name", field.id).attr("value", function(d) {
62056         return stringsField.t("options." + d, { "default": d });
62057       }).attr("checked", false);
62058       enter.append("span").each(function(d) {
62059         stringsField.t.append("options." + d, { "default": d })(select_default2(this));
62060       });
62061       labels = labels.merge(enter);
62062       radios = labels.selectAll("input").on("change", changeRadio);
62063     }
62064     function structureExtras(selection2, tags) {
62065       var selected = selectedKey() || tags.layer !== void 0;
62066       var type2 = _mainPresetIndex.field(selected);
62067       var layer = _mainPresetIndex.field("layer");
62068       var showLayer = selected === "bridge" || selected === "tunnel" || tags.layer !== void 0;
62069       var extrasWrap = selection2.selectAll(".structure-extras-wrap").data(selected ? [0] : []);
62070       extrasWrap.exit().remove();
62071       extrasWrap = extrasWrap.enter().append("div").attr("class", "structure-extras-wrap").merge(extrasWrap);
62072       var list = extrasWrap.selectAll("ul").data([0]);
62073       list = list.enter().append("ul").attr("class", "rows").merge(list);
62074       if (type2) {
62075         if (!typeField || typeField.id !== selected) {
62076           typeField = uiField(context, type2, _entityIDs, { wrap: false }).on("change", changeType);
62077         }
62078         typeField.tags(tags);
62079       } else {
62080         typeField = null;
62081       }
62082       var typeItem = list.selectAll(".structure-type-item").data(typeField ? [typeField] : [], function(d) {
62083         return d.id;
62084       });
62085       typeItem.exit().remove();
62086       var typeEnter = typeItem.enter().insert("li", ":first-child").attr("class", "labeled-input structure-type-item");
62087       typeEnter.append("span").attr("class", "label structure-label-type").attr("for", "preset-input-" + selected).call(_t.append("inspector.radio.structure.type"));
62088       typeEnter.append("div").attr("class", "structure-input-type-wrap");
62089       typeItem = typeItem.merge(typeEnter);
62090       if (typeField) {
62091         typeItem.selectAll(".structure-input-type-wrap").call(typeField.render);
62092       }
62093       if (layer && showLayer) {
62094         if (!layerField) {
62095           layerField = uiField(context, layer, _entityIDs, { wrap: false }).on("change", changeLayer);
62096         }
62097         layerField.tags(tags);
62098         field.keys = utilArrayUnion(field.keys, ["layer"]);
62099       } else {
62100         layerField = null;
62101         field.keys = field.keys.filter(function(k) {
62102           return k !== "layer";
62103         });
62104       }
62105       var layerItem = list.selectAll(".structure-layer-item").data(layerField ? [layerField] : []);
62106       layerItem.exit().remove();
62107       var layerEnter = layerItem.enter().append("li").attr("class", "labeled-input structure-layer-item");
62108       layerEnter.append("span").attr("class", "label structure-label-layer").attr("for", "preset-input-layer").call(_t.append("inspector.radio.structure.layer"));
62109       layerEnter.append("div").attr("class", "structure-input-layer-wrap");
62110       layerItem = layerItem.merge(layerEnter);
62111       if (layerField) {
62112         layerItem.selectAll(".structure-input-layer-wrap").call(layerField.render);
62113       }
62114     }
62115     function changeType(t, onInput) {
62116       var key = selectedKey();
62117       if (!key)
62118         return;
62119       var val = t[key];
62120       if (val !== "no") {
62121         _oldType[key] = val;
62122       }
62123       if (field.type === "structureRadio") {
62124         if (val === "no" || key !== "bridge" && key !== "tunnel" || key === "tunnel" && val === "building_passage") {
62125           t.layer = void 0;
62126         }
62127         if (t.layer === void 0) {
62128           if (key === "bridge" && val !== "no") {
62129             t.layer = "1";
62130           }
62131           if (key === "tunnel" && val !== "no" && val !== "building_passage") {
62132             t.layer = "-1";
62133           }
62134         }
62135       }
62136       dispatch10.call("change", this, t, onInput);
62137     }
62138     function changeLayer(t, onInput) {
62139       if (t.layer === "0") {
62140         t.layer = void 0;
62141       }
62142       dispatch10.call("change", this, t, onInput);
62143     }
62144     function changeRadio() {
62145       var t = {};
62146       var activeKey;
62147       if (field.key) {
62148         t[field.key] = void 0;
62149       }
62150       radios.each(function(d) {
62151         var active = select_default2(this).property("checked");
62152         if (active)
62153           activeKey = d;
62154         if (field.key) {
62155           if (active)
62156             t[field.key] = d;
62157         } else {
62158           var val = _oldType[activeKey] || "yes";
62159           t[d] = active ? val : void 0;
62160         }
62161       });
62162       if (field.type === "structureRadio") {
62163         if (activeKey === "bridge") {
62164           t.layer = "1";
62165         } else if (activeKey === "tunnel" && t.tunnel !== "building_passage") {
62166           t.layer = "-1";
62167         } else {
62168           t.layer = void 0;
62169         }
62170       }
62171       dispatch10.call("change", this, t);
62172     }
62173     radio.tags = function(tags) {
62174       function isOptionChecked(d) {
62175         if (field.key) {
62176           return tags[field.key] === d;
62177         }
62178         return !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no");
62179       }
62180       function isMixed(d) {
62181         if (field.key) {
62182           return Array.isArray(tags[field.key]) && tags[field.key].includes(d);
62183         }
62184         return Array.isArray(tags[d]);
62185       }
62186       radios.property("checked", function(d) {
62187         return isOptionChecked(d) && (field.key || field.options.filter(isOptionChecked).length === 1);
62188       });
62189       labels.classed("active", function(d) {
62190         if (field.key) {
62191           return Array.isArray(tags[field.key]) && tags[field.key].includes(d) || tags[field.key] === d;
62192         }
62193         return Array.isArray(tags[d]) && tags[d].some((v) => typeof v === "string" && v.toLowerCase() !== "no") || !!(typeof tags[d] === "string" && tags[d].toLowerCase() !== "no");
62194       }).classed("mixed", isMixed).attr("title", function(d) {
62195         return isMixed(d) ? _t("inspector.unshared_value_tooltip") : null;
62196       });
62197       var selection2 = radios.filter(function() {
62198         return this.checked;
62199       });
62200       if (selection2.empty()) {
62201         placeholder.text("");
62202         placeholder.call(_t.append("inspector.none"));
62203       } else {
62204         placeholder.text(selection2.attr("value"));
62205         _oldType[selection2.datum()] = tags[selection2.datum()];
62206       }
62207       if (field.type === "structureRadio") {
62208         if (!!tags.waterway && !_oldType.tunnel) {
62209           _oldType.tunnel = "culvert";
62210         }
62211         wrap2.call(structureExtras, tags);
62212       }
62213     };
62214     radio.focus = function() {
62215       radios.node().focus();
62216     };
62217     radio.entityIDs = function(val) {
62218       if (!arguments.length)
62219         return _entityIDs;
62220       _entityIDs = val;
62221       _oldType = {};
62222       return radio;
62223     };
62224     radio.isAllowed = function() {
62225       return _entityIDs.length === 1;
62226     };
62227     return utilRebind(radio, dispatch10, "on");
62228   }
62229
62230   // modules/ui/fields/restrictions.js
62231   function uiFieldRestrictions(field, context) {
62232     var dispatch10 = dispatch_default("change");
62233     var breathe = behaviorBreathe(context);
62234     corePreferences("turn-restriction-via-way", null);
62235     var storedViaWay = corePreferences("turn-restriction-via-way0");
62236     var storedDistance = corePreferences("turn-restriction-distance");
62237     var _maxViaWay = storedViaWay !== null ? +storedViaWay : 0;
62238     var _maxDistance = storedDistance ? +storedDistance : 30;
62239     var _initialized2 = false;
62240     var _parent = select_default2(null);
62241     var _container = select_default2(null);
62242     var _oldTurns;
62243     var _graph;
62244     var _vertexID;
62245     var _intersection;
62246     var _fromWayID;
62247     var _lastXPos;
62248     function restrictions(selection2) {
62249       _parent = selection2;
62250       if (_vertexID && (context.graph() !== _graph || !_intersection)) {
62251         _graph = context.graph();
62252         _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
62253       }
62254       var isOK = _intersection && _intersection.vertices.length && // has vertices
62255       _intersection.vertices.filter(function(vertex) {
62256         return vertex.id === _vertexID;
62257       }).length && _intersection.ways.length > 2 && // has more than 2 ways
62258       _intersection.ways.filter(function(way) {
62259         return way.__to;
62260       }).length > 1;
62261       select_default2(selection2.node().parentNode).classed("hide", !isOK);
62262       if (!isOK || !context.container().select(".inspector-wrap.inspector-hidden").empty() || !selection2.node().parentNode || !selection2.node().parentNode.parentNode) {
62263         selection2.call(restrictions.off);
62264         return;
62265       }
62266       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
62267       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
62268       var container = wrap2.selectAll(".restriction-container").data([0]);
62269       var containerEnter = container.enter().append("div").attr("class", "restriction-container");
62270       containerEnter.append("div").attr("class", "restriction-help");
62271       _container = containerEnter.merge(container).call(renderViewer);
62272       var controls = wrap2.selectAll(".restriction-controls").data([0]);
62273       controls.enter().append("div").attr("class", "restriction-controls-container").append("div").attr("class", "restriction-controls").merge(controls).call(renderControls);
62274     }
62275     function renderControls(selection2) {
62276       var distControl = selection2.selectAll(".restriction-distance").data([0]);
62277       distControl.exit().remove();
62278       var distControlEnter = distControl.enter().append("div").attr("class", "restriction-control restriction-distance");
62279       distControlEnter.append("span").attr("class", "restriction-control-label restriction-distance-label").call(_t.append("restriction.controls.distance", { suffix: ":" }));
62280       distControlEnter.append("input").attr("class", "restriction-distance-input").attr("type", "range").attr("min", "20").attr("max", "50").attr("step", "5");
62281       distControlEnter.append("span").attr("class", "restriction-distance-text");
62282       selection2.selectAll(".restriction-distance-input").property("value", _maxDistance).on("input", function() {
62283         var val = select_default2(this).property("value");
62284         _maxDistance = +val;
62285         _intersection = null;
62286         _container.selectAll(".layer-osm .layer-turns *").remove();
62287         corePreferences("turn-restriction-distance", _maxDistance);
62288         _parent.call(restrictions);
62289       });
62290       selection2.selectAll(".restriction-distance-text").call(displayMaxDistance(_maxDistance));
62291       var viaControl = selection2.selectAll(".restriction-via-way").data([0]);
62292       viaControl.exit().remove();
62293       var viaControlEnter = viaControl.enter().append("div").attr("class", "restriction-control restriction-via-way");
62294       viaControlEnter.append("span").attr("class", "restriction-control-label restriction-via-way-label").call(_t.append("restriction.controls.via", { suffix: ":" }));
62295       viaControlEnter.append("input").attr("class", "restriction-via-way-input").attr("type", "range").attr("min", "0").attr("max", "2").attr("step", "1");
62296       viaControlEnter.append("span").attr("class", "restriction-via-way-text");
62297       selection2.selectAll(".restriction-via-way-input").property("value", _maxViaWay).on("input", function() {
62298         var val = select_default2(this).property("value");
62299         _maxViaWay = +val;
62300         _container.selectAll(".layer-osm .layer-turns *").remove();
62301         corePreferences("turn-restriction-via-way0", _maxViaWay);
62302         _parent.call(restrictions);
62303       });
62304       selection2.selectAll(".restriction-via-way-text").call(displayMaxVia(_maxViaWay));
62305     }
62306     function renderViewer(selection2) {
62307       if (!_intersection)
62308         return;
62309       var vgraph = _intersection.graph;
62310       var filter2 = utilFunctor(true);
62311       var projection2 = geoRawMercator();
62312       var sdims = utilGetDimensions(context.container().select(".sidebar"));
62313       var d = [sdims[0] - 50, 370];
62314       var c = geoVecScale(d, 0.5);
62315       var z = 22;
62316       projection2.scale(geoZoomToScale(z));
62317       var extent = geoExtent();
62318       for (var i2 = 0; i2 < _intersection.vertices.length; i2++) {
62319         extent._extend(_intersection.vertices[i2].extent());
62320       }
62321       var padTop = 35;
62322       if (_intersection.vertices.length > 1) {
62323         var hPadding = Math.min(160, Math.max(110, d[0] * 0.4));
62324         var vPadding = 160;
62325         var tl = projection2([extent[0][0], extent[1][1]]);
62326         var br = projection2([extent[1][0], extent[0][1]]);
62327         var hFactor = (br[0] - tl[0]) / (d[0] - hPadding);
62328         var vFactor = (br[1] - tl[1]) / (d[1] - vPadding - padTop);
62329         var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
62330         var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
62331         z = z - Math.max(hZoomDiff, vZoomDiff);
62332         projection2.scale(geoZoomToScale(z));
62333       }
62334       var extentCenter = projection2(extent.center());
62335       extentCenter[1] = extentCenter[1] - padTop / 2;
62336       projection2.translate(geoVecSubtract(c, extentCenter)).clipExtent([[0, 0], d]);
62337       var drawLayers = svgLayers(projection2, context).only(["osm", "touch"]).dimensions(d);
62338       var drawVertices = svgVertices(projection2, context);
62339       var drawLines = svgLines(projection2, context);
62340       var drawTurns = svgTurns(projection2, context);
62341       var firstTime = selection2.selectAll(".surface").empty();
62342       selection2.call(drawLayers);
62343       var surface = selection2.selectAll(".surface").classed("tr", true);
62344       if (firstTime) {
62345         _initialized2 = true;
62346         surface.call(breathe);
62347       }
62348       if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
62349         _fromWayID = null;
62350         _oldTurns = null;
62351       }
62352       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));
62353       surface.on("click.restrictions", click).on("mouseover.restrictions", mouseover);
62354       surface.selectAll(".selected").classed("selected", false);
62355       surface.selectAll(".related").classed("related", false);
62356       var way;
62357       if (_fromWayID) {
62358         way = vgraph.entity(_fromWayID);
62359         surface.selectAll("." + _fromWayID).classed("selected", true).classed("related", true);
62360       }
62361       document.addEventListener("resizeWindow", function() {
62362         utilSetDimensions(_container, null);
62363         redraw(1);
62364       }, false);
62365       updateHints(null);
62366       function click(d3_event) {
62367         surface.call(breathe.off).call(breathe);
62368         var datum2 = d3_event.target.__data__;
62369         var entity = datum2 && datum2.properties && datum2.properties.entity;
62370         if (entity) {
62371           datum2 = entity;
62372         }
62373         if (datum2 instanceof osmWay && (datum2.__from || datum2.__via)) {
62374           _fromWayID = datum2.id;
62375           _oldTurns = null;
62376           redraw();
62377         } else if (datum2 instanceof osmTurn) {
62378           var actions, extraActions, turns, i3;
62379           var restrictionType = osmInferRestriction(vgraph, datum2, projection2);
62380           if (datum2.restrictionID && !datum2.direct) {
62381             return;
62382           } else if (datum2.restrictionID && !datum2.only) {
62383             var seen = {};
62384             var datumOnly = JSON.parse(JSON.stringify(datum2));
62385             datumOnly.only = true;
62386             restrictionType = restrictionType.replace(/^no/, "only");
62387             turns = _intersection.turns(_fromWayID, 2);
62388             extraActions = [];
62389             _oldTurns = [];
62390             for (i3 = 0; i3 < turns.length; i3++) {
62391               var turn = turns[i3];
62392               if (seen[turn.restrictionID])
62393                 continue;
62394               if (turn.direct && turn.path[1] === datum2.path[1]) {
62395                 seen[turns[i3].restrictionID] = true;
62396                 turn.restrictionType = osmInferRestriction(vgraph, turn, projection2);
62397                 _oldTurns.push(turn);
62398                 extraActions.push(actionUnrestrictTurn(turn));
62399               }
62400             }
62401             actions = _intersection.actions.concat(extraActions, [
62402               actionRestrictTurn(datumOnly, restrictionType),
62403               _t("operations.restriction.annotation.create")
62404             ]);
62405           } else if (datum2.restrictionID) {
62406             turns = _oldTurns || [];
62407             extraActions = [];
62408             for (i3 = 0; i3 < turns.length; i3++) {
62409               if (turns[i3].key !== datum2.key) {
62410                 extraActions.push(actionRestrictTurn(turns[i3], turns[i3].restrictionType));
62411               }
62412             }
62413             _oldTurns = null;
62414             actions = _intersection.actions.concat(extraActions, [
62415               actionUnrestrictTurn(datum2),
62416               _t("operations.restriction.annotation.delete")
62417             ]);
62418           } else {
62419             actions = _intersection.actions.concat([
62420               actionRestrictTurn(datum2, restrictionType),
62421               _t("operations.restriction.annotation.create")
62422             ]);
62423           }
62424           context.perform.apply(context, actions);
62425           var s = surface.selectAll("." + datum2.key);
62426           datum2 = s.empty() ? null : s.datum();
62427           updateHints(datum2);
62428         } else {
62429           _fromWayID = null;
62430           _oldTurns = null;
62431           redraw();
62432         }
62433       }
62434       function mouseover(d3_event) {
62435         var datum2 = d3_event.target.__data__;
62436         updateHints(datum2);
62437       }
62438       _lastXPos = _lastXPos || sdims[0];
62439       function redraw(minChange) {
62440         var xPos = -1;
62441         if (minChange) {
62442           xPos = utilGetDimensions(context.container().select(".sidebar"))[0];
62443         }
62444         if (!minChange || minChange && Math.abs(xPos - _lastXPos) >= minChange) {
62445           if (context.hasEntity(_vertexID)) {
62446             _lastXPos = xPos;
62447             _container.call(renderViewer);
62448           }
62449         }
62450       }
62451       function highlightPathsFrom(wayID) {
62452         surface.selectAll(".related").classed("related", false).classed("allow", false).classed("restrict", false).classed("only", false);
62453         surface.selectAll("." + wayID).classed("related", true);
62454         if (wayID) {
62455           var turns = _intersection.turns(wayID, _maxViaWay);
62456           for (var i3 = 0; i3 < turns.length; i3++) {
62457             var turn = turns[i3];
62458             var ids = [turn.to.way];
62459             var klass = turn.no ? "restrict" : turn.only ? "only" : "allow";
62460             if (turn.only || turns.length === 1) {
62461               if (turn.via.ways) {
62462                 ids = ids.concat(turn.via.ways);
62463               }
62464             } else if (turn.to.way === wayID) {
62465               continue;
62466             }
62467             surface.selectAll(utilEntitySelector(ids)).classed("related", true).classed("allow", klass === "allow").classed("restrict", klass === "restrict").classed("only", klass === "only");
62468           }
62469         }
62470       }
62471       function updateHints(datum2) {
62472         var help = _container.selectAll(".restriction-help").html("");
62473         var placeholders = {};
62474         ["from", "via", "to"].forEach(function(k) {
62475           placeholders[k] = { html: '<span class="qualifier">' + _t("restriction.help." + k) + "</span>" };
62476         });
62477         var entity = datum2 && datum2.properties && datum2.properties.entity;
62478         if (entity) {
62479           datum2 = entity;
62480         }
62481         if (_fromWayID) {
62482           way = vgraph.entity(_fromWayID);
62483           surface.selectAll("." + _fromWayID).classed("selected", true).classed("related", true);
62484         }
62485         if (datum2 instanceof osmWay && datum2.__from) {
62486           way = datum2;
62487           highlightPathsFrom(_fromWayID ? null : way.id);
62488           surface.selectAll("." + way.id).classed("related", true);
62489           var clickSelect = !_fromWayID || _fromWayID !== way.id;
62490           help.append("div").html(_t.html("restriction.help." + (clickSelect ? "select_from_name" : "from_name"), {
62491             from: placeholders.from,
62492             fromName: displayName(way.id, vgraph)
62493           }));
62494         } else if (datum2 instanceof osmTurn) {
62495           var restrictionType = osmInferRestriction(vgraph, datum2, projection2);
62496           var turnType = restrictionType.replace(/^(only|no)\_/, "");
62497           var indirect = datum2.direct === false ? _t.html("restriction.help.indirect") : "";
62498           var klass, turnText, nextText;
62499           if (datum2.no) {
62500             klass = "restrict";
62501             turnText = _t.html("restriction.help.turn.no_" + turnType, { indirect: { html: indirect } });
62502             nextText = _t.html("restriction.help.turn.only_" + turnType, { indirect: "" });
62503           } else if (datum2.only) {
62504             klass = "only";
62505             turnText = _t.html("restriction.help.turn.only_" + turnType, { indirect: { html: indirect } });
62506             nextText = _t.html("restriction.help.turn.allowed_" + turnType, { indirect: "" });
62507           } else {
62508             klass = "allow";
62509             turnText = _t.html("restriction.help.turn.allowed_" + turnType, { indirect: { html: indirect } });
62510             nextText = _t.html("restriction.help.turn.no_" + turnType, { indirect: "" });
62511           }
62512           help.append("div").attr("class", "qualifier " + klass).html(turnText);
62513           help.append("div").html(_t.html("restriction.help.from_name_to_name", {
62514             from: placeholders.from,
62515             fromName: displayName(datum2.from.way, vgraph),
62516             to: placeholders.to,
62517             toName: displayName(datum2.to.way, vgraph)
62518           }));
62519           if (datum2.via.ways && datum2.via.ways.length) {
62520             var names = [];
62521             for (var i3 = 0; i3 < datum2.via.ways.length; i3++) {
62522               var prev = names[names.length - 1];
62523               var curr = displayName(datum2.via.ways[i3], vgraph);
62524               if (!prev || curr !== prev) {
62525                 names.push(curr);
62526               }
62527             }
62528             help.append("div").html(_t.html("restriction.help.via_names", {
62529               via: placeholders.via,
62530               viaNames: names.join(", ")
62531             }));
62532           }
62533           if (!indirect) {
62534             help.append("div").html(_t.html("restriction.help.toggle", { turn: { html: nextText.trim() } }));
62535           }
62536           highlightPathsFrom(null);
62537           var alongIDs = datum2.path.slice();
62538           surface.selectAll(utilEntitySelector(alongIDs)).classed("related", true).classed("allow", klass === "allow").classed("restrict", klass === "restrict").classed("only", klass === "only");
62539         } else {
62540           highlightPathsFrom(null);
62541           if (_fromWayID) {
62542             help.append("div").html(_t.html("restriction.help.from_name", {
62543               from: placeholders.from,
62544               fromName: displayName(_fromWayID, vgraph)
62545             }));
62546           } else {
62547             help.append("div").html(_t.html("restriction.help.select_from", {
62548               from: placeholders.from
62549             }));
62550           }
62551         }
62552       }
62553     }
62554     function displayMaxDistance(maxDist) {
62555       return (selection2) => {
62556         var isImperial = !_mainLocalizer.usesMetric();
62557         var opts;
62558         if (isImperial) {
62559           var distToFeet = {
62560             // imprecise conversion for prettier display
62561             20: 70,
62562             25: 85,
62563             30: 100,
62564             35: 115,
62565             40: 130,
62566             45: 145,
62567             50: 160
62568           }[maxDist];
62569           opts = { distance: _t("units.feet", { quantity: distToFeet }) };
62570         } else {
62571           opts = { distance: _t("units.meters", { quantity: maxDist }) };
62572         }
62573         return selection2.html("").call(_t.append("restriction.controls.distance_up_to", opts));
62574       };
62575     }
62576     function displayMaxVia(maxVia) {
62577       return (selection2) => {
62578         selection2 = selection2.html("");
62579         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"));
62580       };
62581     }
62582     function displayName(entityID, graph) {
62583       var entity = graph.entity(entityID);
62584       var name = utilDisplayName(entity) || "";
62585       var matched = _mainPresetIndex.match(entity, graph);
62586       var type2 = matched && matched.name() || utilDisplayType(entity.id);
62587       return name || type2;
62588     }
62589     restrictions.entityIDs = function(val) {
62590       _intersection = null;
62591       _fromWayID = null;
62592       _oldTurns = null;
62593       _vertexID = val[0];
62594     };
62595     restrictions.tags = function() {
62596     };
62597     restrictions.focus = function() {
62598     };
62599     restrictions.off = function(selection2) {
62600       if (!_initialized2)
62601         return;
62602       selection2.selectAll(".surface").call(breathe.off).on("click.restrictions", null).on("mouseover.restrictions", null);
62603       select_default2(window).on("resize.restrictions", null);
62604     };
62605     return utilRebind(restrictions, dispatch10, "on");
62606   }
62607   uiFieldRestrictions.supportsMultiselection = false;
62608
62609   // modules/ui/fields/textarea.js
62610   function uiFieldTextarea(field, context) {
62611     var dispatch10 = dispatch_default("change");
62612     var input = select_default2(null);
62613     var _lengthIndicator = uiLengthIndicator(context.maxCharsForTagValue()).silent(field.usage === "changeset" && field.key === "comment");
62614     var _tags;
62615     function textarea(selection2) {
62616       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
62617       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).style("position", "relative").merge(wrap2);
62618       input = wrap2.selectAll("textarea").data([0]);
62619       input = input.enter().append("textarea").attr("id", field.domId).call(utilNoAuto).on("input", change(true)).on("blur", change()).on("change", change()).merge(input);
62620       wrap2.call(_lengthIndicator);
62621       function change(onInput) {
62622         return function() {
62623           var val = utilGetSetValue(input);
62624           if (!onInput)
62625             val = context.cleanTagValue(val);
62626           if (!val && Array.isArray(_tags[field.key]))
62627             return;
62628           var t = {};
62629           t[field.key] = val || void 0;
62630           dispatch10.call("change", this, t, onInput);
62631         };
62632       }
62633     }
62634     textarea.tags = function(tags) {
62635       _tags = tags;
62636       var isMixed = Array.isArray(tags[field.key]);
62637       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);
62638       if (!isMixed) {
62639         _lengthIndicator.update(tags[field.key]);
62640       }
62641     };
62642     textarea.focus = function() {
62643       input.node().focus();
62644     };
62645     return utilRebind(textarea, dispatch10, "on");
62646   }
62647
62648   // modules/ui/fields/wikidata.js
62649   function uiFieldWikidata(field, context) {
62650     var wikidata = services.wikidata;
62651     var dispatch10 = dispatch_default("change");
62652     var _selection = select_default2(null);
62653     var _searchInput = select_default2(null);
62654     var _qid = null;
62655     var _wikidataEntity = null;
62656     var _wikiURL = "";
62657     var _entityIDs = [];
62658     var _wikipediaKey = field.keys && field.keys.find(function(key) {
62659       return key.includes("wikipedia");
62660     });
62661     var _hintKey = field.key === "wikidata" ? "name" : field.key.split(":")[0];
62662     var combobox = uiCombobox(context, "combo-" + field.safeid).caseSensitive(true).minItems(1);
62663     function wiki(selection2) {
62664       _selection = selection2;
62665       var wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
62666       wrap2 = wrap2.enter().append("div").attr("class", "form-field-input-wrap form-field-input-" + field.type).merge(wrap2);
62667       var list = wrap2.selectAll("ul").data([0]);
62668       list = list.enter().append("ul").attr("class", "rows").merge(list);
62669       var searchRow = list.selectAll("li.wikidata-search").data([0]);
62670       var searchRowEnter = searchRow.enter().append("li").attr("class", "wikidata-search");
62671       searchRowEnter.append("input").attr("type", "text").attr("id", field.domId).style("flex", "1").call(utilNoAuto).on("focus", function() {
62672         var node = select_default2(this).node();
62673         node.setSelectionRange(0, node.value.length);
62674       }).on("blur", function() {
62675         setLabelForEntity();
62676       }).call(combobox.fetcher(fetchWikidataItems));
62677       combobox.on("accept", function(d) {
62678         if (d) {
62679           _qid = d.id;
62680           change();
62681         }
62682       }).on("cancel", function() {
62683         setLabelForEntity();
62684       });
62685       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) {
62686         d3_event.preventDefault();
62687         if (_wikiURL)
62688           window.open(_wikiURL, "_blank");
62689       });
62690       searchRow = searchRow.merge(searchRowEnter);
62691       _searchInput = searchRow.select("input");
62692       var wikidataProperties = ["description", "identifier"];
62693       var items = list.selectAll("li.labeled-input").data(wikidataProperties);
62694       var enter = items.enter().append("li").attr("class", function(d) {
62695         return "labeled-input preset-wikidata-" + d;
62696       });
62697       enter.append("span").attr("class", "label").html(function(d) {
62698         return _t.html("wikidata." + d);
62699       });
62700       enter.append("input").attr("type", "text").call(utilNoAuto).classed("disabled", "true").attr("readonly", "true");
62701       enter.append("button").attr("class", "form-field-button").attr("title", _t("icons.copy")).call(svgIcon("#iD-operation-copy")).on("click", function(d3_event) {
62702         d3_event.preventDefault();
62703         select_default2(this.parentNode).select("input").node().select();
62704         document.execCommand("copy");
62705       });
62706     }
62707     function fetchWikidataItems(q, callback) {
62708       if (!q && _hintKey) {
62709         for (var i2 in _entityIDs) {
62710           var entity = context.hasEntity(_entityIDs[i2]);
62711           if (entity.tags[_hintKey]) {
62712             q = entity.tags[_hintKey];
62713             break;
62714           }
62715         }
62716       }
62717       wikidata.itemsForSearchQuery(q, function(err, data) {
62718         if (err) {
62719           if (err !== "No query")
62720             console.error(err);
62721           return;
62722         }
62723         var result = data.map(function(item) {
62724           return {
62725             id: item.id,
62726             value: item.display.label.value + " (" + item.id + ")",
62727             display: (selection2) => selection2.append("span").attr("class", "localized-text").attr("lang", item.display.label.language).text(item.display.label.value),
62728             title: item.display.description && item.display.description.value,
62729             terms: item.aliases
62730           };
62731         });
62732         if (callback)
62733           callback(result);
62734       });
62735     }
62736     function change() {
62737       var syncTags = {};
62738       syncTags[field.key] = _qid;
62739       dispatch10.call("change", this, syncTags);
62740       var initGraph = context.graph();
62741       var initEntityIDs = _entityIDs;
62742       wikidata.entityByQID(_qid, function(err, entity) {
62743         if (err)
62744           return;
62745         if (context.graph() !== initGraph)
62746           return;
62747         if (!entity.sitelinks)
62748           return;
62749         var langs = wikidata.languagesToQuery();
62750         ["labels", "descriptions"].forEach(function(key) {
62751           if (!entity[key])
62752             return;
62753           var valueLangs = Object.keys(entity[key]);
62754           if (valueLangs.length === 0)
62755             return;
62756           var valueLang = valueLangs[0];
62757           if (langs.indexOf(valueLang) === -1) {
62758             langs.push(valueLang);
62759           }
62760         });
62761         var newWikipediaValue;
62762         if (_wikipediaKey) {
62763           var foundPreferred;
62764           for (var i2 in langs) {
62765             var lang = langs[i2];
62766             var siteID = lang.replace("-", "_") + "wiki";
62767             if (entity.sitelinks[siteID]) {
62768               foundPreferred = true;
62769               newWikipediaValue = lang + ":" + entity.sitelinks[siteID].title;
62770               break;
62771             }
62772           }
62773           if (!foundPreferred) {
62774             var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
62775               return site.endsWith("wiki");
62776             });
62777             if (wikiSiteKeys.length === 0) {
62778               newWikipediaValue = null;
62779             } else {
62780               var wikiLang = wikiSiteKeys[0].slice(0, -4).replace("_", "-");
62781               var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
62782               newWikipediaValue = wikiLang + ":" + wikiTitle;
62783             }
62784           }
62785         }
62786         if (newWikipediaValue) {
62787           newWikipediaValue = context.cleanTagValue(newWikipediaValue);
62788         }
62789         if (typeof newWikipediaValue === "undefined")
62790           return;
62791         var actions = initEntityIDs.map(function(entityID) {
62792           var entity2 = context.hasEntity(entityID);
62793           if (!entity2)
62794             return null;
62795           var currTags = Object.assign({}, entity2.tags);
62796           if (newWikipediaValue === null) {
62797             if (!currTags[_wikipediaKey])
62798               return null;
62799             delete currTags[_wikipediaKey];
62800           } else {
62801             currTags[_wikipediaKey] = newWikipediaValue;
62802           }
62803           return actionChangeTags(entityID, currTags);
62804         }).filter(Boolean);
62805         if (!actions.length)
62806           return;
62807         context.overwrite(
62808           function actionUpdateWikipediaTags(graph) {
62809             actions.forEach(function(action) {
62810               graph = action(graph);
62811             });
62812             return graph;
62813           },
62814           context.history().undoAnnotation()
62815         );
62816       });
62817     }
62818     function setLabelForEntity() {
62819       var label = "";
62820       if (_wikidataEntity) {
62821         label = entityPropertyForDisplay(_wikidataEntity, "labels");
62822         if (label.length === 0) {
62823           label = _wikidataEntity.id.toString();
62824         }
62825       }
62826       utilGetSetValue(_searchInput, label);
62827     }
62828     wiki.tags = function(tags) {
62829       var isMixed = Array.isArray(tags[field.key]);
62830       _searchInput.attr("title", isMixed ? tags[field.key].filter(Boolean).join("\n") : null).attr("placeholder", isMixed ? _t("inspector.multiple_values") : "").classed("mixed", isMixed);
62831       _qid = typeof tags[field.key] === "string" && tags[field.key] || "";
62832       if (!/^Q[0-9]*$/.test(_qid)) {
62833         unrecognized();
62834         return;
62835       }
62836       _wikiURL = "https://wikidata.org/wiki/" + _qid;
62837       wikidata.entityByQID(_qid, function(err, entity) {
62838         if (err) {
62839           unrecognized();
62840           return;
62841         }
62842         _wikidataEntity = entity;
62843         setLabelForEntity();
62844         var description = entityPropertyForDisplay(entity, "descriptions");
62845         _selection.select("button.wiki-link").classed("disabled", false);
62846         _selection.select(".preset-wikidata-description").style("display", function() {
62847           return description.length > 0 ? "flex" : "none";
62848         }).select("input").attr("value", description);
62849         _selection.select(".preset-wikidata-identifier").style("display", function() {
62850           return entity.id ? "flex" : "none";
62851         }).select("input").attr("value", entity.id);
62852       });
62853       function unrecognized() {
62854         _wikidataEntity = null;
62855         setLabelForEntity();
62856         _selection.select(".preset-wikidata-description").style("display", "none");
62857         _selection.select(".preset-wikidata-identifier").style("display", "none");
62858         _selection.select("button.wiki-link").classed("disabled", true);
62859         if (_qid && _qid !== "") {
62860           _wikiURL = "https://wikidata.org/wiki/Special:Search?search=" + _qid;
62861         } else {
62862           _wikiURL = "";
62863         }
62864       }
62865     };
62866     function entityPropertyForDisplay(wikidataEntity, propKey) {
62867       if (!wikidataEntity[propKey])
62868         return "";
62869       var propObj = wikidataEntity[propKey];
62870       var langKeys = Object.keys(propObj);
62871       if (langKeys.length === 0)
62872         return "";
62873       var langs = wikidata.languagesToQuery();
62874       for (var i2 in langs) {
62875         var lang = langs[i2];
62876         var valueObj = propObj[lang];
62877         if (valueObj && valueObj.value && valueObj.value.length > 0)
62878           return valueObj.value;
62879       }
62880       return propObj[langKeys[0]].value;
62881     }
62882     wiki.entityIDs = function(val) {
62883       if (!arguments.length)
62884         return _entityIDs;
62885       _entityIDs = val;
62886       return wiki;
62887     };
62888     wiki.focus = function() {
62889       _searchInput.node().focus();
62890     };
62891     return utilRebind(wiki, dispatch10, "on");
62892   }
62893
62894   // modules/ui/fields/wikipedia.js
62895   function uiFieldWikipedia(field, context) {
62896     const dispatch10 = dispatch_default("change");
62897     const wikipedia = services.wikipedia;
62898     const wikidata = services.wikidata;
62899     let _langInput = select_default2(null);
62900     let _titleInput = select_default2(null);
62901     let _wikiURL = "";
62902     let _entityIDs;
62903     let _tags;
62904     let _dataWikipedia = [];
62905     _mainFileFetcher.get("wmf_sitematrix").then((d) => {
62906       _dataWikipedia = d;
62907       if (_tags)
62908         updateForTags(_tags);
62909     }).catch(() => {
62910     });
62911     const langCombo = uiCombobox(context, "wikipedia-lang").fetcher((value, callback) => {
62912       const v = value.toLowerCase();
62913       callback(
62914         _dataWikipedia.filter((d) => {
62915           return d[0].toLowerCase().indexOf(v) >= 0 || d[1].toLowerCase().indexOf(v) >= 0 || d[2].toLowerCase().indexOf(v) >= 0;
62916         }).map((d) => ({ value: d[1] }))
62917       );
62918     });
62919     const titleCombo = uiCombobox(context, "wikipedia-title").fetcher((value, callback) => {
62920       if (!value) {
62921         value = "";
62922         for (let i2 in _entityIDs) {
62923           let entity = context.hasEntity(_entityIDs[i2]);
62924           if (entity.tags.name) {
62925             value = entity.tags.name;
62926             break;
62927           }
62928         }
62929       }
62930       const searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
62931       searchfn(language()[2], value, (query, data) => {
62932         callback(data.map((d) => ({ value: d })));
62933       });
62934     });
62935     function wiki(selection2) {
62936       let wrap2 = selection2.selectAll(".form-field-input-wrap").data([0]);
62937       wrap2 = wrap2.enter().append("div").attr("class", `form-field-input-wrap form-field-input-${field.type}`).merge(wrap2);
62938       let langContainer = wrap2.selectAll(".wiki-lang-container").data([0]);
62939       langContainer = langContainer.enter().append("div").attr("class", "wiki-lang-container").merge(langContainer);
62940       _langInput = langContainer.selectAll("input.wiki-lang").data([0]);
62941       _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);
62942       _langInput.on("blur", changeLang).on("change", changeLang);
62943       let titleContainer = wrap2.selectAll(".wiki-title-container").data([0]);
62944       titleContainer = titleContainer.enter().append("div").attr("class", "wiki-title-container").merge(titleContainer);
62945       _titleInput = titleContainer.selectAll("input.wiki-title").data([0]);
62946       _titleInput = _titleInput.enter().append("input").attr("type", "text").attr("class", "wiki-title").attr("id", field.domId).call(utilNoAuto).call(titleCombo).merge(_titleInput);
62947       _titleInput.on("blur", function() {
62948         change(true);
62949       }).on("change", function() {
62950         change(false);
62951       });
62952       let link2 = titleContainer.selectAll(".wiki-link").data([0]);
62953       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);
62954       link2.on("click", (d3_event) => {
62955         d3_event.preventDefault();
62956         if (_wikiURL)
62957           window.open(_wikiURL, "_blank");
62958       });
62959     }
62960     function defaultLanguageInfo(skipEnglishFallback) {
62961       const langCode = _mainLocalizer.languageCode().toLowerCase();
62962       for (let i2 in _dataWikipedia) {
62963         let d = _dataWikipedia[i2];
62964         if (d[2] === langCode)
62965           return d;
62966       }
62967       return skipEnglishFallback ? ["", "", ""] : ["English", "English", "en"];
62968     }
62969     function language(skipEnglishFallback) {
62970       const value = utilGetSetValue(_langInput).toLowerCase();
62971       for (let i2 in _dataWikipedia) {
62972         let d = _dataWikipedia[i2];
62973         if (d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2] === value)
62974           return d;
62975       }
62976       return defaultLanguageInfo(skipEnglishFallback);
62977     }
62978     function changeLang() {
62979       utilGetSetValue(_langInput, language()[1]);
62980       change(true);
62981     }
62982     function change(skipWikidata) {
62983       let value = utilGetSetValue(_titleInput);
62984       const m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
62985       const langInfo = m && _dataWikipedia.find((d) => m[1] === d[2]);
62986       let syncTags = {};
62987       if (langInfo) {
62988         const nativeLangName = langInfo[1];
62989         value = decodeURIComponent(m[2]).replace(/_/g, " ");
62990         if (m[3]) {
62991           let anchor;
62992           anchor = decodeURIComponent(m[3]);
62993           value += "#" + anchor.replace(/_/g, " ");
62994         }
62995         value = value.slice(0, 1).toUpperCase() + value.slice(1);
62996         utilGetSetValue(_langInput, nativeLangName);
62997         utilGetSetValue(_titleInput, value);
62998       }
62999       if (value) {
63000         syncTags.wikipedia = context.cleanTagValue(language()[2] + ":" + value);
63001       } else {
63002         syncTags.wikipedia = void 0;
63003       }
63004       dispatch10.call("change", this, syncTags);
63005       if (skipWikidata || !value || !language()[2])
63006         return;
63007       const initGraph = context.graph();
63008       const initEntityIDs = _entityIDs;
63009       wikidata.itemsByTitle(language()[2], value, (err, data) => {
63010         if (err || !data || !Object.keys(data).length)
63011           return;
63012         if (context.graph() !== initGraph)
63013           return;
63014         const qids = Object.keys(data);
63015         const value2 = qids && qids.find((id2) => id2.match(/^Q\d+$/));
63016         let actions = initEntityIDs.map((entityID) => {
63017           let entity = context.entity(entityID).tags;
63018           let currTags = Object.assign({}, entity);
63019           if (currTags.wikidata !== value2) {
63020             currTags.wikidata = value2;
63021             return actionChangeTags(entityID, currTags);
63022           }
63023           return null;
63024         }).filter(Boolean);
63025         if (!actions.length)
63026           return;
63027         context.overwrite(
63028           function actionUpdateWikidataTags(graph) {
63029             actions.forEach(function(action) {
63030               graph = action(graph);
63031             });
63032             return graph;
63033           },
63034           context.history().undoAnnotation()
63035         );
63036       });
63037     }
63038     wiki.tags = (tags) => {
63039       _tags = tags;
63040       updateForTags(tags);
63041     };
63042     function updateForTags(tags) {
63043       const value = typeof tags[field.key] === "string" ? tags[field.key] : "";
63044       const m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
63045       const tagLang = m && m[1];
63046       const tagArticleTitle = m && m[2];
63047       let anchor = m && m[3];
63048       const tagLangInfo = tagLang && _dataWikipedia.find((d) => tagLang === d[2]);
63049       if (tagLangInfo) {
63050         const nativeLangName = tagLangInfo[1];
63051         utilGetSetValue(_langInput, nativeLangName);
63052         utilGetSetValue(_titleInput, tagArticleTitle + (anchor ? "#" + anchor : ""));
63053         if (anchor) {
63054           try {
63055             anchor = encodeURIComponent(anchor.replace(/ /g, "_")).replace(/%/g, ".");
63056           } catch (e) {
63057             anchor = anchor.replace(/ /g, "_");
63058           }
63059         }
63060         _wikiURL = "https://" + tagLang + ".wikipedia.org/wiki/" + tagArticleTitle.replace(/ /g, "_") + (anchor ? "#" + anchor : "");
63061       } else {
63062         utilGetSetValue(_titleInput, value);
63063         if (value && value !== "") {
63064           utilGetSetValue(_langInput, "");
63065           const defaultLangInfo = defaultLanguageInfo();
63066           _wikiURL = `https://${defaultLangInfo[2]}.wikipedia.org/w/index.php?fulltext=1&search=${value}`;
63067         } else {
63068           const shownOrDefaultLangInfo = language(
63069             true
63070             /* skipEnglishFallback */
63071           );
63072           utilGetSetValue(_langInput, shownOrDefaultLangInfo[1]);
63073           _wikiURL = "";
63074         }
63075       }
63076     }
63077     wiki.entityIDs = (val) => {
63078       if (!arguments.length)
63079         return _entityIDs;
63080       _entityIDs = val;
63081       return wiki;
63082     };
63083     wiki.focus = () => {
63084       _titleInput.node().focus();
63085     };
63086     return utilRebind(wiki, dispatch10, "on");
63087   }
63088   uiFieldWikipedia.supportsMultiselection = false;
63089
63090   // modules/ui/fields/index.js
63091   var uiFields = {
63092     access: uiFieldAccess,
63093     address: uiFieldAddress,
63094     check: uiFieldCheck,
63095     colour: uiFieldText,
63096     combo: uiFieldCombo,
63097     cycleway: uiFieldDirectionalCombo,
63098     date: uiFieldText,
63099     defaultCheck: uiFieldCheck,
63100     directionalCombo: uiFieldDirectionalCombo,
63101     email: uiFieldText,
63102     identifier: uiFieldText,
63103     lanes: uiFieldLanes,
63104     localized: uiFieldLocalized,
63105     roadheight: uiFieldRoadheight,
63106     roadspeed: uiFieldRoadspeed,
63107     manyCombo: uiFieldCombo,
63108     multiCombo: uiFieldCombo,
63109     networkCombo: uiFieldCombo,
63110     number: uiFieldText,
63111     onewayCheck: uiFieldCheck,
63112     radio: uiFieldRadio,
63113     restrictions: uiFieldRestrictions,
63114     semiCombo: uiFieldCombo,
63115     structureRadio: uiFieldRadio,
63116     tel: uiFieldText,
63117     text: uiFieldText,
63118     textarea: uiFieldTextarea,
63119     typeCombo: uiFieldCombo,
63120     url: uiFieldText,
63121     wikidata: uiFieldWikidata,
63122     wikipedia: uiFieldWikipedia
63123   };
63124
63125   // modules/ui/field.js
63126   function uiField(context, presetField2, entityIDs, options2) {
63127     options2 = Object.assign({
63128       show: true,
63129       wrap: true,
63130       remove: true,
63131       revert: true,
63132       info: true
63133     }, options2);
63134     var dispatch10 = dispatch_default("change", "revert");
63135     var field = Object.assign({}, presetField2);
63136     field.domId = utilUniqueDomId("form-field-" + field.safeid);
63137     var _show = options2.show;
63138     var _state = "";
63139     var _tags = {};
63140     var _entityExtent;
63141     if (entityIDs && entityIDs.length) {
63142       _entityExtent = entityIDs.reduce(function(extent, entityID) {
63143         var entity = context.graph().entity(entityID);
63144         return extent.extend(entity.extent(context.graph()));
63145       }, geoExtent());
63146     }
63147     var _locked = false;
63148     var _lockedTip = uiTooltip().title(() => _t.append("inspector.lock.suggestion", { label: field.title })).placement("bottom");
63149     if (_show && !field.impl) {
63150       createField();
63151     }
63152     function createField() {
63153       field.impl = uiFields[field.type](field, context).on("change", function(t, onInput) {
63154         dispatch10.call("change", field, t, onInput);
63155       });
63156       if (entityIDs) {
63157         field.entityIDs = entityIDs;
63158         if (field.impl.entityIDs) {
63159           field.impl.entityIDs(entityIDs);
63160         }
63161       }
63162     }
63163     function allKeys() {
63164       let keys2 = field.keys || [field.key];
63165       if (field.type === "directionalCombo" && field.key) {
63166         keys2 = keys2.concat(field.key);
63167       }
63168       return keys2;
63169     }
63170     function isModified() {
63171       if (!entityIDs || !entityIDs.length)
63172         return false;
63173       return entityIDs.some(function(entityID) {
63174         var original = context.graph().base().entities[entityID];
63175         var latest = context.graph().entity(entityID);
63176         return allKeys().some(function(key) {
63177           return original ? latest.tags[key] !== original.tags[key] : latest.tags[key];
63178         });
63179       });
63180     }
63181     function tagsContainFieldKey() {
63182       return allKeys().some(function(key) {
63183         if (field.type === "multiCombo") {
63184           for (var tagKey in _tags) {
63185             if (tagKey.indexOf(key) === 0) {
63186               return true;
63187             }
63188           }
63189           return false;
63190         }
63191         return _tags[key] !== void 0;
63192       });
63193     }
63194     function revert(d3_event, d) {
63195       d3_event.stopPropagation();
63196       d3_event.preventDefault();
63197       if (!entityIDs || _locked)
63198         return;
63199       dispatch10.call("revert", d, allKeys());
63200     }
63201     function remove2(d3_event, d) {
63202       d3_event.stopPropagation();
63203       d3_event.preventDefault();
63204       if (_locked)
63205         return;
63206       var t = {};
63207       allKeys().forEach(function(key) {
63208         t[key] = void 0;
63209       });
63210       dispatch10.call("change", d, t);
63211     }
63212     field.render = function(selection2) {
63213       var container = selection2.selectAll(".form-field").data([field]);
63214       var enter = container.enter().append("div").attr("class", function(d) {
63215         return "form-field form-field-" + d.safeid;
63216       }).classed("nowrap", !options2.wrap);
63217       if (options2.wrap) {
63218         var labelEnter = enter.append("label").attr("class", "field-label").attr("for", function(d) {
63219           return d.domId;
63220         });
63221         var textEnter = labelEnter.append("span").attr("class", "label-text");
63222         textEnter.append("span").attr("class", "label-textvalue").each(function(d) {
63223           d.label()(select_default2(this));
63224         });
63225         textEnter.append("span").attr("class", "label-textannotation");
63226         if (options2.remove) {
63227           labelEnter.append("button").attr("class", "remove-icon").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete"));
63228         }
63229         if (options2.revert) {
63230           labelEnter.append("button").attr("class", "modified-icon").attr("title", _t("icons.undo")).call(svgIcon(_mainLocalizer.textDirection() === "rtl" ? "#iD-icon-redo" : "#iD-icon-undo"));
63231         }
63232       }
63233       container = container.merge(enter);
63234       container.select(".field-label > .remove-icon").on("click", remove2);
63235       container.select(".field-label > .modified-icon").on("click", revert);
63236       container.each(function(d) {
63237         var selection3 = select_default2(this);
63238         if (!d.impl) {
63239           createField();
63240         }
63241         var reference, help;
63242         if (options2.wrap && field.type === "restrictions") {
63243           help = uiFieldHelp(context, "restrictions");
63244         }
63245         if (options2.wrap && options2.info) {
63246           var referenceKey = d.key || "";
63247           if (d.type === "multiCombo") {
63248             referenceKey = referenceKey.replace(/:$/, "");
63249           }
63250           reference = uiTagReference(d.reference || { key: referenceKey }, context);
63251           if (_state === "hover") {
63252             reference.showing(false);
63253           }
63254         }
63255         selection3.call(d.impl);
63256         if (help) {
63257           selection3.call(help.body).select(".field-label").call(help.button);
63258         }
63259         if (reference) {
63260           selection3.call(reference.body).select(".field-label").call(reference.button);
63261         }
63262         d.impl.tags(_tags);
63263       });
63264       container.classed("locked", _locked).classed("modified", isModified()).classed("present", tagsContainFieldKey());
63265       var annotation = container.selectAll(".field-label .label-textannotation");
63266       var icon2 = annotation.selectAll(".icon").data(_locked ? [0] : []);
63267       icon2.exit().remove();
63268       icon2.enter().append("svg").attr("class", "icon").append("use").attr("xlink:href", "#fas-lock");
63269       container.call(_locked ? _lockedTip : _lockedTip.destroy);
63270     };
63271     field.state = function(val) {
63272       if (!arguments.length)
63273         return _state;
63274       _state = val;
63275       return field;
63276     };
63277     field.tags = function(val) {
63278       if (!arguments.length)
63279         return _tags;
63280       _tags = val;
63281       if (tagsContainFieldKey() && !_show) {
63282         _show = true;
63283         if (!field.impl) {
63284           createField();
63285         }
63286       }
63287       return field;
63288     };
63289     field.locked = function(val) {
63290       if (!arguments.length)
63291         return _locked;
63292       _locked = val;
63293       return field;
63294     };
63295     field.show = function() {
63296       _show = true;
63297       if (!field.impl) {
63298         createField();
63299       }
63300       if (field.default && field.key && _tags[field.key] !== field.default) {
63301         var t = {};
63302         t[field.key] = field.default;
63303         dispatch10.call("change", this, t);
63304       }
63305     };
63306     field.isShown = function() {
63307       return _show;
63308     };
63309     field.isAllowed = function() {
63310       if (entityIDs && entityIDs.length > 1 && uiFields[field.type].supportsMultiselection === false)
63311         return false;
63312       if (field.geometry && !entityIDs.every(function(entityID) {
63313         return field.matchGeometry(context.graph().geometry(entityID));
63314       }))
63315         return false;
63316       if (entityIDs && _entityExtent && field.locationSetID) {
63317         var validHere = _sharedLocationManager.locationSetsAt(_entityExtent.center());
63318         if (!validHere[field.locationSetID])
63319           return false;
63320       }
63321       var prerequisiteTag = field.prerequisiteTag;
63322       if (entityIDs && !tagsContainFieldKey() && // ignore tagging prerequisites if a value is already present
63323       prerequisiteTag) {
63324         if (!entityIDs.every(function(entityID) {
63325           var entity = context.graph().entity(entityID);
63326           if (prerequisiteTag.key) {
63327             var value = entity.tags[prerequisiteTag.key];
63328             if (!value)
63329               return false;
63330             if (prerequisiteTag.valueNot) {
63331               return prerequisiteTag.valueNot !== value;
63332             }
63333             if (prerequisiteTag.value) {
63334               return prerequisiteTag.value === value;
63335             }
63336           } else if (prerequisiteTag.keyNot) {
63337             if (entity.tags[prerequisiteTag.keyNot])
63338               return false;
63339           }
63340           return true;
63341         }))
63342           return false;
63343       }
63344       return true;
63345     };
63346     field.focus = function() {
63347       if (field.impl) {
63348         field.impl.focus();
63349       }
63350     };
63351     return utilRebind(field, dispatch10, "on");
63352   }
63353
63354   // modules/ui/form_fields.js
63355   function uiFormFields(context) {
63356     var moreCombo = uiCombobox(context, "more-fields").minItems(1);
63357     var _fieldsArr = [];
63358     var _lastPlaceholder = "";
63359     var _state = "";
63360     var _klass = "";
63361     function formFields(selection2) {
63362       var allowedFields = _fieldsArr.filter(function(field) {
63363         return field.isAllowed();
63364       });
63365       var shown = allowedFields.filter(function(field) {
63366         return field.isShown();
63367       });
63368       var notShown = allowedFields.filter(function(field) {
63369         return !field.isShown();
63370       });
63371       var container = selection2.selectAll(".form-fields-container").data([0]);
63372       container = container.enter().append("div").attr("class", "form-fields-container " + (_klass || "")).merge(container);
63373       var fields = container.selectAll(".wrap-form-field").data(shown, function(d) {
63374         return d.id + (d.entityIDs ? d.entityIDs.join() : "");
63375       });
63376       fields.exit().remove();
63377       var enter = fields.enter().append("div").attr("class", function(d) {
63378         return "wrap-form-field wrap-form-field-" + d.safeid;
63379       });
63380       fields = fields.merge(enter);
63381       fields.order().each(function(d) {
63382         select_default2(this).call(d.render);
63383       });
63384       var titles = [];
63385       var moreFields = notShown.map(function(field) {
63386         var title = field.title();
63387         titles.push(title);
63388         var terms = field.terms();
63389         if (field.key)
63390           terms.push(field.key);
63391         if (field.keys)
63392           terms = terms.concat(field.keys);
63393         return {
63394           display: field.label(),
63395           value: title,
63396           title,
63397           field,
63398           terms
63399         };
63400       });
63401       var placeholder = titles.slice(0, 3).join(", ") + (titles.length > 3 ? "\u2026" : "");
63402       var more = selection2.selectAll(".more-fields").data(_state === "hover" || moreFields.length === 0 ? [] : [0]);
63403       more.exit().remove();
63404       var moreEnter = more.enter().append("div").attr("class", "more-fields").append("label");
63405       moreEnter.append("span").call(_t.append("inspector.add_fields"));
63406       more = moreEnter.merge(more);
63407       var input = more.selectAll(".value").data([0]);
63408       input.exit().remove();
63409       input = input.enter().append("input").attr("class", "value").attr("type", "text").attr("placeholder", placeholder).call(utilNoAuto).merge(input);
63410       input.call(utilGetSetValue, "").call(
63411         moreCombo.data(moreFields).on("accept", function(d) {
63412           if (!d)
63413             return;
63414           var field = d.field;
63415           field.show();
63416           selection2.call(formFields);
63417           field.focus();
63418         })
63419       );
63420       if (_lastPlaceholder !== placeholder) {
63421         input.attr("placeholder", placeholder);
63422         _lastPlaceholder = placeholder;
63423       }
63424     }
63425     formFields.fieldsArr = function(val) {
63426       if (!arguments.length)
63427         return _fieldsArr;
63428       _fieldsArr = val || [];
63429       return formFields;
63430     };
63431     formFields.state = function(val) {
63432       if (!arguments.length)
63433         return _state;
63434       _state = val;
63435       return formFields;
63436     };
63437     formFields.klass = function(val) {
63438       if (!arguments.length)
63439         return _klass;
63440       _klass = val;
63441       return formFields;
63442     };
63443     return formFields;
63444   }
63445
63446   // modules/ui/changeset_editor.js
63447   function uiChangesetEditor(context) {
63448     var dispatch10 = dispatch_default("change");
63449     var formFields = uiFormFields(context);
63450     var commentCombo = uiCombobox(context, "comment").caseSensitive(true);
63451     var _fieldsArr;
63452     var _tags;
63453     var _changesetID;
63454     function changesetEditor(selection2) {
63455       render(selection2);
63456     }
63457     function render(selection2) {
63458       var initial = false;
63459       if (!_fieldsArr) {
63460         initial = true;
63461         var presets = _mainPresetIndex;
63462         _fieldsArr = [
63463           uiField(context, presets.field("comment"), null, { show: true, revert: false }),
63464           uiField(context, presets.field("source"), null, { show: false, revert: false }),
63465           uiField(context, presets.field("hashtags"), null, { show: false, revert: false })
63466         ];
63467         _fieldsArr.forEach(function(field) {
63468           field.on("change", function(t, onInput) {
63469             dispatch10.call("change", field, void 0, t, onInput);
63470           });
63471         });
63472       }
63473       _fieldsArr.forEach(function(field) {
63474         field.tags(_tags);
63475       });
63476       selection2.call(formFields.fieldsArr(_fieldsArr));
63477       if (initial) {
63478         var commentField = selection2.select(".form-field-comment textarea");
63479         var commentNode = commentField.node();
63480         if (commentNode) {
63481           commentNode.focus();
63482           commentNode.select();
63483         }
63484         utilTriggerEvent(commentField, "blur");
63485         var osm = context.connection();
63486         if (osm) {
63487           osm.userChangesets(function(err, changesets) {
63488             if (err)
63489               return;
63490             var comments = changesets.map(function(changeset) {
63491               var comment = changeset.tags.comment;
63492               return comment ? { title: comment, value: comment } : null;
63493             }).filter(Boolean);
63494             commentField.call(
63495               commentCombo.data(utilArrayUniqBy(comments, "title"))
63496             );
63497           });
63498         }
63499       }
63500       const warnings = [];
63501       if (_tags.comment.match(/google/i)) {
63502         warnings.push({
63503           id: 'contains "google"',
63504           msg: _t.append("commit.google_warning"),
63505           link: _t("commit.google_warning_link")
63506         });
63507       }
63508       const maxChars = context.maxCharsForTagValue();
63509       const strLen = utilUnicodeCharsCount(utilCleanOsmString(_tags.comment, Number.POSITIVE_INFINITY));
63510       if (strLen > maxChars || false) {
63511         warnings.push({
63512           id: "message too long",
63513           msg: _t.append("commit.changeset_comment_length_warning", { maxChars })
63514         });
63515       }
63516       var commentWarning = selection2.select(".form-field-comment").selectAll(".comment-warning").data(warnings, (d) => d.id);
63517       commentWarning.exit().transition().duration(200).style("opacity", 0).remove();
63518       var commentEnter = commentWarning.enter().insert("div", ".comment-warning").attr("class", "comment-warning field-warning").style("opacity", 0);
63519       commentEnter.call(svgIcon("#iD-icon-alert", "inline")).append("span");
63520       commentEnter.transition().duration(200).style("opacity", 1);
63521       commentWarning.merge(commentEnter).selectAll("div > span").text("").each(function(d) {
63522         let selection3 = select_default2(this);
63523         if (d.link) {
63524           selection3 = selection3.append("a").attr("target", "_blank").attr("href", d.link);
63525         }
63526         selection3.call(d.msg);
63527       });
63528     }
63529     changesetEditor.tags = function(_) {
63530       if (!arguments.length)
63531         return _tags;
63532       _tags = _;
63533       return changesetEditor;
63534     };
63535     changesetEditor.changesetID = function(_) {
63536       if (!arguments.length)
63537         return _changesetID;
63538       if (_changesetID === _)
63539         return changesetEditor;
63540       _changesetID = _;
63541       _fieldsArr = null;
63542       return changesetEditor;
63543     };
63544     return utilRebind(changesetEditor, dispatch10, "on");
63545   }
63546
63547   // modules/ui/commit.js
63548   var import_fast_deep_equal9 = __toESM(require_fast_deep_equal());
63549
63550   // modules/util/jxon.js
63551   var JXON = new function() {
63552     var sValueProp = "keyValue", sAttributesProp = "keyAttributes", sAttrPref = "@", aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
63553     function parseText(sValue) {
63554       if (rIsNull.test(sValue)) {
63555         return null;
63556       }
63557       if (rIsBool.test(sValue)) {
63558         return sValue.toLowerCase() === "true";
63559       }
63560       if (isFinite(sValue)) {
63561         return parseFloat(sValue);
63562       }
63563       if (isFinite(Date.parse(sValue))) {
63564         return new Date(sValue);
63565       }
63566       return sValue;
63567     }
63568     function EmptyTree() {
63569     }
63570     EmptyTree.prototype.toString = function() {
63571       return "null";
63572     };
63573     EmptyTree.prototype.valueOf = function() {
63574       return null;
63575     };
63576     function objectify(vValue) {
63577       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
63578     }
63579     function createObjTree(oParentNode, nVerb, bFreeze, bNesteAttr) {
63580       var nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(), bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
63581       var sProp, vContent, nLength = 0, sCollectedTxt = "", vResult = bHighVerb ? {} : (
63582         /* put here the default value for empty nodes: */
63583         true
63584       );
63585       if (bChildren) {
63586         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
63587           oNode = oParentNode.childNodes.item(nItem);
63588           if (oNode.nodeType === 4) {
63589             sCollectedTxt += oNode.nodeValue;
63590           } else if (oNode.nodeType === 3) {
63591             sCollectedTxt += oNode.nodeValue.trim();
63592           } else if (oNode.nodeType === 1 && !oNode.prefix) {
63593             aCache.push(oNode);
63594           }
63595         }
63596       }
63597       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
63598       if (!bHighVerb && (bChildren || bAttributes)) {
63599         vResult = nVerb === 0 ? objectify(vBuiltVal) : {};
63600       }
63601       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
63602         sProp = aCache[nElId].nodeName.toLowerCase();
63603         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
63604         if (vResult.hasOwnProperty(sProp)) {
63605           if (vResult[sProp].constructor !== Array) {
63606             vResult[sProp] = [vResult[sProp]];
63607           }
63608           vResult[sProp].push(vContent);
63609         } else {
63610           vResult[sProp] = vContent;
63611           nLength++;
63612         }
63613       }
63614       if (bAttributes) {
63615         var nAttrLen = oParentNode.attributes.length, sAPrefix = bNesteAttr ? "" : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
63616         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
63617           oAttrib = oParentNode.attributes.item(nAttrib);
63618           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
63619         }
63620         if (bNesteAttr) {
63621           if (bFreeze) {
63622             Object.freeze(oAttrParent);
63623           }
63624           vResult[sAttributesProp] = oAttrParent;
63625           nLength -= nAttrLen - 1;
63626         }
63627       }
63628       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
63629         vResult[sValueProp] = vBuiltVal;
63630       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
63631         vResult = vBuiltVal;
63632       }
63633       if (bFreeze && (bHighVerb || nLength > 0)) {
63634         Object.freeze(vResult);
63635       }
63636       aCache.length = nLevelStart;
63637       return vResult;
63638     }
63639     function loadObjTree(oXMLDoc, oParentEl, oParentObj) {
63640       var vValue, oChild;
63641       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
63642         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString()));
63643       } else if (oParentObj.constructor === Date) {
63644         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
63645       }
63646       for (var sName in oParentObj) {
63647         vValue = oParentObj[sName];
63648         if (isFinite(sName) || vValue instanceof Function) {
63649           continue;
63650         }
63651         if (sName === sValueProp) {
63652           if (vValue !== null && vValue !== true) {
63653             oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue)));
63654           }
63655         } else if (sName === sAttributesProp) {
63656           for (var sAttrib in vValue) {
63657             oParentEl.setAttribute(sAttrib, vValue[sAttrib]);
63658           }
63659         } else if (sName.charAt(0) === sAttrPref) {
63660           oParentEl.setAttribute(sName.slice(1), vValue);
63661         } else if (vValue.constructor === Array) {
63662           for (var nItem = 0; nItem < vValue.length; nItem++) {
63663             oChild = oXMLDoc.createElement(sName);
63664             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
63665             oParentEl.appendChild(oChild);
63666           }
63667         } else {
63668           oChild = oXMLDoc.createElement(sName);
63669           if (vValue instanceof Object) {
63670             loadObjTree(oXMLDoc, oChild, vValue);
63671           } else if (vValue !== null && vValue !== true) {
63672             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
63673           }
63674           oParentEl.appendChild(oChild);
63675         }
63676       }
63677     }
63678     this.build = function(oXMLParent, nVerbosity, bFreeze, bNesteAttributes) {
63679       var _nVerb = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : (
63680         /* put here the default verbosity level: */
63681         1
63682       );
63683       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
63684     };
63685     this.unbuild = function(oObjTree) {
63686       var oNewDoc = document.implementation.createDocument("", "", null);
63687       loadObjTree(oNewDoc, oNewDoc, oObjTree);
63688       return oNewDoc;
63689     };
63690     this.stringify = function(oObjTree) {
63691       return new XMLSerializer().serializeToString(JXON.unbuild(oObjTree));
63692     };
63693   }();
63694
63695   // modules/ui/sections/changes.js
63696   function uiSectionChanges(context) {
63697     var _discardTags = {};
63698     _mainFileFetcher.get("discarded").then(function(d) {
63699       _discardTags = d;
63700     }).catch(function() {
63701     });
63702     var section = uiSection("changes-list", context).label(function() {
63703       var history = context.history();
63704       var summary = history.difference().summary();
63705       return _t.append("inspector.title_count", { title: _t("commit.changes"), count: summary.length });
63706     }).disclosureContent(renderDisclosureContent);
63707     function renderDisclosureContent(selection2) {
63708       var history = context.history();
63709       var summary = history.difference().summary();
63710       var container = selection2.selectAll(".commit-section").data([0]);
63711       var containerEnter = container.enter().append("div").attr("class", "commit-section");
63712       containerEnter.append("ul").attr("class", "changeset-list");
63713       container = containerEnter.merge(container);
63714       var items = container.select("ul").selectAll("li").data(summary);
63715       var itemsEnter = items.enter().append("li").attr("class", "change-item");
63716       var buttons = itemsEnter.append("button").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click);
63717       buttons.each(function(d) {
63718         select_default2(this).call(svgIcon("#iD-icon-" + d.entity.geometry(d.graph), "pre-text " + d.changeType));
63719       });
63720       buttons.append("span").attr("class", "change-type").html(function(d) {
63721         return _t.html("commit." + d.changeType) + " ";
63722       });
63723       buttons.append("strong").attr("class", "entity-type").text(function(d) {
63724         var matched = _mainPresetIndex.match(d.entity, d.graph);
63725         return matched && matched.name() || utilDisplayType(d.entity.id);
63726       });
63727       buttons.append("span").attr("class", "entity-name").text(function(d) {
63728         var name = utilDisplayName(d.entity) || "", string = "";
63729         if (name !== "") {
63730           string += ":";
63731         }
63732         return string += " " + name;
63733       });
63734       items = itemsEnter.merge(items);
63735       var changeset = new osmChangeset().update({ id: void 0 });
63736       var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
63737       delete changeset.id;
63738       var data = JXON.stringify(changeset.osmChangeJXON(changes));
63739       var blob = new Blob([data], { type: "text/xml;charset=utf-8;" });
63740       var fileName = "changes.osc";
63741       var linkEnter = container.selectAll(".download-changes").data([0]).enter().append("a").attr("class", "download-changes");
63742       linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName);
63743       linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("commit.download_changes"));
63744       function mouseover(d) {
63745         if (d.entity) {
63746           context.surface().selectAll(
63747             utilEntityOrMemberSelector([d.entity.id], context.graph())
63748           ).classed("hover", true);
63749         }
63750       }
63751       function mouseout() {
63752         context.surface().selectAll(".hover").classed("hover", false);
63753       }
63754       function click(d3_event, change) {
63755         if (change.changeType !== "deleted") {
63756           var entity = change.entity;
63757           context.map().zoomToEase(entity);
63758           context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true);
63759         }
63760       }
63761     }
63762     return section;
63763   }
63764
63765   // modules/ui/commit_warnings.js
63766   function uiCommitWarnings(context) {
63767     function commitWarnings(selection2) {
63768       var issuesBySeverity = context.validator().getIssuesBySeverity({ what: "edited", where: "all", includeDisabledRules: true });
63769       for (var severity in issuesBySeverity) {
63770         var issues = issuesBySeverity[severity];
63771         if (severity !== "error") {
63772           issues = issues.filter(function(issue) {
63773             return issue.type !== "help_request";
63774           });
63775         }
63776         var section = severity + "-section";
63777         var issueItem = severity + "-item";
63778         var container = selection2.selectAll("." + section).data(issues.length ? [0] : []);
63779         container.exit().remove();
63780         var containerEnter = container.enter().append("div").attr("class", "modal-section " + section + " fillL2");
63781         containerEnter.append("h3").call(severity === "warning" ? _t.append("commit.warnings") : _t.append("commit.errors"));
63782         containerEnter.append("ul").attr("class", "changeset-list");
63783         container = containerEnter.merge(container);
63784         var items = container.select("ul").selectAll("li").data(issues, function(d) {
63785           return d.key;
63786         });
63787         items.exit().remove();
63788         var itemsEnter = items.enter().append("li").attr("class", issueItem);
63789         var buttons = itemsEnter.append("button").on("mouseover", function(d3_event, d) {
63790           if (d.entityIds) {
63791             context.surface().selectAll(
63792               utilEntityOrMemberSelector(
63793                 d.entityIds,
63794                 context.graph()
63795               )
63796             ).classed("hover", true);
63797           }
63798         }).on("mouseout", function() {
63799           context.surface().selectAll(".hover").classed("hover", false);
63800         }).on("click", function(d3_event, d) {
63801           context.validator().focusIssue(d);
63802         });
63803         buttons.call(svgIcon("#iD-icon-alert", "pre-text"));
63804         buttons.append("strong").attr("class", "issue-message");
63805         buttons.filter(function(d) {
63806           return d.tooltip;
63807         }).call(
63808           uiTooltip().title(function(d) {
63809             return d.tooltip;
63810           }).placement("top")
63811         );
63812         items = itemsEnter.merge(items);
63813         items.selectAll(".issue-message").text("").each(function(d) {
63814           return d.message(context)(select_default2(this));
63815         });
63816       }
63817     }
63818     return commitWarnings;
63819   }
63820
63821   // modules/ui/commit.js
63822   var readOnlyTags = [
63823     /^changesets_count$/,
63824     /^created_by$/,
63825     /^ideditor:/,
63826     /^imagery_used$/,
63827     /^host$/,
63828     /^locale$/,
63829     /^warnings:/,
63830     /^resolved:/,
63831     /^closed:note$/,
63832     /^closed:keepright$/,
63833     /^closed:improveosm:/,
63834     /^closed:osmose:/
63835   ];
63836   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
63837   function uiCommit(context) {
63838     var dispatch10 = dispatch_default("cancel");
63839     var _userDetails2;
63840     var _selection;
63841     var changesetEditor = uiChangesetEditor(context).on("change", changeTags);
63842     var rawTagEditor = uiSectionRawTagEditor("changeset-tag-editor", context).on("change", changeTags).readOnlyTags(readOnlyTags);
63843     var commitChanges = uiSectionChanges(context);
63844     var commitWarnings = uiCommitWarnings(context);
63845     function commit(selection2) {
63846       _selection = selection2;
63847       if (!context.changeset)
63848         initChangeset();
63849       loadDerivedChangesetTags();
63850       selection2.call(render);
63851     }
63852     function initChangeset() {
63853       var commentDate = +corePreferences("commentDate") || 0;
63854       var currDate = Date.now();
63855       var cutoff = 2 * 86400 * 1e3;
63856       if (commentDate > currDate || currDate - commentDate > cutoff) {
63857         corePreferences("comment", null);
63858         corePreferences("hashtags", null);
63859         corePreferences("source", null);
63860       }
63861       if (context.defaultChangesetComment()) {
63862         corePreferences("comment", context.defaultChangesetComment());
63863         corePreferences("commentDate", Date.now());
63864       }
63865       if (context.defaultChangesetSource()) {
63866         corePreferences("source", context.defaultChangesetSource());
63867         corePreferences("commentDate", Date.now());
63868       }
63869       if (context.defaultChangesetHashtags()) {
63870         corePreferences("hashtags", context.defaultChangesetHashtags());
63871         corePreferences("commentDate", Date.now());
63872       }
63873       var detected = utilDetect();
63874       var tags = {
63875         comment: corePreferences("comment") || "",
63876         created_by: context.cleanTagValue("iD " + context.version),
63877         host: context.cleanTagValue(detected.host),
63878         locale: context.cleanTagValue(_mainLocalizer.localeCode())
63879       };
63880       findHashtags(tags, true);
63881       var hashtags = corePreferences("hashtags");
63882       if (hashtags) {
63883         tags.hashtags = hashtags;
63884       }
63885       var source = corePreferences("source");
63886       if (source) {
63887         tags.source = source;
63888       }
63889       var photoOverlaysUsed = context.history().photoOverlaysUsed();
63890       if (photoOverlaysUsed.length) {
63891         var sources = (tags.source || "").split(";");
63892         if (sources.indexOf("streetlevel imagery") === -1) {
63893           sources.push("streetlevel imagery");
63894         }
63895         photoOverlaysUsed.forEach(function(photoOverlay) {
63896           if (sources.indexOf(photoOverlay) === -1) {
63897             sources.push(photoOverlay);
63898           }
63899         });
63900         tags.source = context.cleanTagValue(sources.join(";"));
63901       }
63902       context.changeset = new osmChangeset({ tags });
63903     }
63904     function loadDerivedChangesetTags() {
63905       var osm = context.connection();
63906       if (!osm)
63907         return;
63908       var tags = Object.assign({}, context.changeset.tags);
63909       var imageryUsed = context.cleanTagValue(context.history().imageryUsed().join(";"));
63910       tags.imagery_used = imageryUsed || "None";
63911       var osmClosed = osm.getClosedIDs();
63912       var itemType;
63913       if (osmClosed.length) {
63914         tags["closed:note"] = context.cleanTagValue(osmClosed.join(";"));
63915       }
63916       if (services.keepRight) {
63917         var krClosed = services.keepRight.getClosedIDs();
63918         if (krClosed.length) {
63919           tags["closed:keepright"] = context.cleanTagValue(krClosed.join(";"));
63920         }
63921       }
63922       if (services.improveOSM) {
63923         var iOsmClosed = services.improveOSM.getClosedCounts();
63924         for (itemType in iOsmClosed) {
63925           tags["closed:improveosm:" + itemType] = context.cleanTagValue(iOsmClosed[itemType].toString());
63926         }
63927       }
63928       if (services.osmose) {
63929         var osmoseClosed = services.osmose.getClosedCounts();
63930         for (itemType in osmoseClosed) {
63931           tags["closed:osmose:" + itemType] = context.cleanTagValue(osmoseClosed[itemType].toString());
63932         }
63933       }
63934       for (var key in tags) {
63935         if (key.match(/(^warnings:)|(^resolved:)/)) {
63936           delete tags[key];
63937         }
63938       }
63939       function addIssueCounts(issues, prefix) {
63940         var issuesByType = utilArrayGroupBy(issues, "type");
63941         for (var issueType in issuesByType) {
63942           var issuesOfType = issuesByType[issueType];
63943           if (issuesOfType[0].subtype) {
63944             var issuesBySubtype = utilArrayGroupBy(issuesOfType, "subtype");
63945             for (var issueSubtype in issuesBySubtype) {
63946               var issuesOfSubtype = issuesBySubtype[issueSubtype];
63947               tags[prefix + ":" + issueType + ":" + issueSubtype] = context.cleanTagValue(issuesOfSubtype.length.toString());
63948             }
63949           } else {
63950             tags[prefix + ":" + issueType] = context.cleanTagValue(issuesOfType.length.toString());
63951           }
63952         }
63953       }
63954       var warnings = context.validator().getIssuesBySeverity({ what: "edited", where: "all", includeIgnored: true, includeDisabledRules: true }).warning.filter(function(issue) {
63955         return issue.type !== "help_request";
63956       });
63957       addIssueCounts(warnings, "warnings");
63958       var resolvedIssues = context.validator().getResolvedIssues();
63959       addIssueCounts(resolvedIssues, "resolved");
63960       context.changeset = context.changeset.update({ tags });
63961     }
63962     function render(selection2) {
63963       var osm = context.connection();
63964       if (!osm)
63965         return;
63966       var header = selection2.selectAll(".header").data([0]);
63967       var headerTitle = header.enter().append("div").attr("class", "header fillL");
63968       headerTitle.append("div").append("h2").call(_t.append("commit.title"));
63969       headerTitle.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
63970         dispatch10.call("cancel", this);
63971       }).call(svgIcon("#iD-icon-close"));
63972       var body = selection2.selectAll(".body").data([0]);
63973       body = body.enter().append("div").attr("class", "body").merge(body);
63974       var changesetSection = body.selectAll(".changeset-editor").data([0]);
63975       changesetSection = changesetSection.enter().append("div").attr("class", "modal-section changeset-editor").merge(changesetSection);
63976       changesetSection.call(
63977         changesetEditor.changesetID(context.changeset.id).tags(context.changeset.tags)
63978       );
63979       body.call(commitWarnings);
63980       var saveSection = body.selectAll(".save-section").data([0]);
63981       saveSection = saveSection.enter().append("div").attr("class", "modal-section save-section fillL").merge(saveSection);
63982       var prose = saveSection.selectAll(".commit-info").data([0]);
63983       if (prose.enter().size()) {
63984         _userDetails2 = null;
63985       }
63986       prose = prose.enter().append("p").attr("class", "commit-info").call(_t.append("commit.upload_explanation")).merge(prose);
63987       osm.userDetails(function(err, user) {
63988         if (err)
63989           return;
63990         if (_userDetails2 === user)
63991           return;
63992         _userDetails2 = user;
63993         var userLink = select_default2(document.createElement("div"));
63994         if (user.image_url) {
63995           userLink.append("img").attr("src", user.image_url).attr("class", "icon pre-text user-icon");
63996         }
63997         userLink.append("a").attr("class", "user-info").text(user.display_name).attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
63998         prose.html(_t.html("commit.upload_explanation_with_user", { user: { html: userLink.html() } }));
63999       });
64000       var requestReview = saveSection.selectAll(".request-review").data([0]);
64001       var requestReviewEnter = requestReview.enter().append("div").attr("class", "request-review");
64002       var requestReviewDomId = utilUniqueDomId("commit-input-request-review");
64003       var labelEnter = requestReviewEnter.append("label").attr("for", requestReviewDomId);
64004       if (!labelEnter.empty()) {
64005         labelEnter.call(uiTooltip().title(() => _t.append("commit.request_review_info")).placement("top"));
64006       }
64007       labelEnter.append("input").attr("type", "checkbox").attr("id", requestReviewDomId);
64008       labelEnter.append("span").call(_t.append("commit.request_review"));
64009       requestReview = requestReview.merge(requestReviewEnter);
64010       var requestReviewInput = requestReview.selectAll("input").property("checked", isReviewRequested(context.changeset.tags)).on("change", toggleRequestReview);
64011       var buttonSection = saveSection.selectAll(".buttons").data([0]);
64012       var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons fillL");
64013       buttonEnter.append("button").attr("class", "secondary-action button cancel-button").append("span").attr("class", "label").call(_t.append("commit.cancel"));
64014       var uploadButton = buttonEnter.append("button").attr("class", "action button save-button");
64015       uploadButton.append("span").attr("class", "label").call(_t.append("commit.save"));
64016       var uploadBlockerTooltipText = getUploadBlockerMessage();
64017       buttonSection = buttonSection.merge(buttonEnter);
64018       buttonSection.selectAll(".cancel-button").on("click.cancel", function() {
64019         dispatch10.call("cancel", this);
64020       });
64021       buttonSection.selectAll(".save-button").classed("disabled", uploadBlockerTooltipText !== null).on("click.save", function() {
64022         if (!select_default2(this).classed("disabled")) {
64023           this.blur();
64024           for (var key in context.changeset.tags) {
64025             if (!key)
64026               delete context.changeset.tags[key];
64027           }
64028           context.uploader().save(context.changeset);
64029         }
64030       });
64031       uiTooltip().destroyAny(buttonSection.selectAll(".save-button"));
64032       if (uploadBlockerTooltipText) {
64033         buttonSection.selectAll(".save-button").call(uiTooltip().title(() => uploadBlockerTooltipText).placement("top"));
64034       }
64035       var tagSection = body.selectAll(".tag-section.raw-tag-editor").data([0]);
64036       tagSection = tagSection.enter().append("div").attr("class", "modal-section tag-section raw-tag-editor").merge(tagSection);
64037       tagSection.call(
64038         rawTagEditor.tags(Object.assign({}, context.changeset.tags)).render
64039       );
64040       var changesSection = body.selectAll(".commit-changes-section").data([0]);
64041       changesSection = changesSection.enter().append("div").attr("class", "modal-section commit-changes-section").merge(changesSection);
64042       changesSection.call(commitChanges.render);
64043       function toggleRequestReview() {
64044         var rr = requestReviewInput.property("checked");
64045         updateChangeset({ review_requested: rr ? "yes" : void 0 });
64046         tagSection.call(
64047           rawTagEditor.tags(Object.assign({}, context.changeset.tags)).render
64048         );
64049       }
64050     }
64051     function getUploadBlockerMessage() {
64052       var errors = context.validator().getIssuesBySeverity({ what: "edited", where: "all" }).error;
64053       if (errors.length) {
64054         return _t.append("commit.outstanding_errors_message", { count: errors.length });
64055       } else {
64056         var hasChangesetComment = context.changeset && context.changeset.tags.comment && context.changeset.tags.comment.trim().length;
64057         if (!hasChangesetComment) {
64058           return _t.append("commit.comment_needed_message");
64059         }
64060       }
64061       return null;
64062     }
64063     function changeTags(_, changed, onInput) {
64064       if (changed.hasOwnProperty("comment")) {
64065         if (changed.comment === void 0) {
64066           changed.comment = "";
64067         }
64068         if (!onInput) {
64069           corePreferences("comment", changed.comment);
64070           corePreferences("commentDate", Date.now());
64071         }
64072       }
64073       if (changed.hasOwnProperty("source")) {
64074         if (changed.source === void 0) {
64075           corePreferences("source", null);
64076         } else if (!onInput) {
64077           corePreferences("source", changed.source);
64078           corePreferences("commentDate", Date.now());
64079         }
64080       }
64081       updateChangeset(changed, onInput);
64082       if (_selection) {
64083         _selection.call(render);
64084       }
64085     }
64086     function findHashtags(tags, commentOnly) {
64087       var detectedHashtags = commentHashtags();
64088       if (detectedHashtags.length) {
64089         corePreferences("hashtags", null);
64090       }
64091       if (!detectedHashtags.length || !commentOnly) {
64092         detectedHashtags = detectedHashtags.concat(hashtagHashtags());
64093       }
64094       var allLowerCase = /* @__PURE__ */ new Set();
64095       return detectedHashtags.filter(function(hashtag) {
64096         var lowerCase = hashtag.toLowerCase();
64097         if (!allLowerCase.has(lowerCase)) {
64098           allLowerCase.add(lowerCase);
64099           return true;
64100         }
64101         return false;
64102       });
64103       function commentHashtags() {
64104         var matches = (tags.comment || "").replace(/http\S*/g, "").match(hashtagRegex);
64105         return matches || [];
64106       }
64107       function hashtagHashtags() {
64108         var matches = (tags.hashtags || "").split(/[,;\s]+/).map(function(s) {
64109           if (s[0] !== "#") {
64110             s = "#" + s;
64111           }
64112           var matched = s.match(hashtagRegex);
64113           return matched && matched[0];
64114         }).filter(Boolean);
64115         return matches || [];
64116       }
64117     }
64118     function isReviewRequested(tags) {
64119       var rr = tags.review_requested;
64120       if (rr === void 0)
64121         return false;
64122       rr = rr.trim().toLowerCase();
64123       return !(rr === "" || rr === "no");
64124     }
64125     function updateChangeset(changed, onInput) {
64126       var tags = Object.assign({}, context.changeset.tags);
64127       Object.keys(changed).forEach(function(k) {
64128         var v = changed[k];
64129         k = context.cleanTagKey(k);
64130         if (readOnlyTags.indexOf(k) !== -1)
64131           return;
64132         if (v === void 0) {
64133           delete tags[k];
64134         } else if (onInput) {
64135           tags[k] = v;
64136         } else {
64137           tags[k] = context.cleanTagValue(v);
64138         }
64139       });
64140       if (!onInput) {
64141         var commentOnly = changed.hasOwnProperty("comment") && changed.comment !== "";
64142         var arr = findHashtags(tags, commentOnly);
64143         if (arr.length) {
64144           tags.hashtags = context.cleanTagValue(arr.join(";"));
64145           corePreferences("hashtags", tags.hashtags);
64146         } else {
64147           delete tags.hashtags;
64148           corePreferences("hashtags", null);
64149         }
64150       }
64151       if (_userDetails2 && _userDetails2.changesets_count !== void 0) {
64152         var changesetsCount = parseInt(_userDetails2.changesets_count, 10) + 1;
64153         tags.changesets_count = String(changesetsCount);
64154         if (changesetsCount <= 100) {
64155           var s;
64156           s = corePreferences("walkthrough_completed");
64157           if (s) {
64158             tags["ideditor:walkthrough_completed"] = s;
64159           }
64160           s = corePreferences("walkthrough_progress");
64161           if (s) {
64162             tags["ideditor:walkthrough_progress"] = s;
64163           }
64164           s = corePreferences("walkthrough_started");
64165           if (s) {
64166             tags["ideditor:walkthrough_started"] = s;
64167           }
64168         }
64169       } else {
64170         delete tags.changesets_count;
64171       }
64172       if (!(0, import_fast_deep_equal9.default)(context.changeset.tags, tags)) {
64173         context.changeset = context.changeset.update({ tags });
64174       }
64175     }
64176     commit.reset = function() {
64177       context.changeset = null;
64178     };
64179     return utilRebind(commit, dispatch10, "on");
64180   }
64181
64182   // modules/ui/confirm.js
64183   function uiConfirm(selection2) {
64184     var modalSelection = uiModal(selection2);
64185     modalSelection.select(".modal").classed("modal-alert", true);
64186     var section = modalSelection.select(".content");
64187     section.append("div").attr("class", "modal-section header");
64188     section.append("div").attr("class", "modal-section message-text");
64189     var buttons = section.append("div").attr("class", "modal-section buttons cf");
64190     modalSelection.okButton = function() {
64191       buttons.append("button").attr("class", "button ok-button action").on("click.confirm", function() {
64192         modalSelection.remove();
64193       }).call(_t.append("confirm.okay")).node().focus();
64194       return modalSelection;
64195     };
64196     return modalSelection;
64197   }
64198
64199   // modules/ui/conflicts.js
64200   function uiConflicts(context) {
64201     var dispatch10 = dispatch_default("cancel", "save");
64202     var keybinding = utilKeybinding("conflicts");
64203     var _origChanges;
64204     var _conflictList;
64205     var _shownConflictIndex;
64206     function keybindingOn() {
64207       select_default2(document).call(keybinding.on("\u238B", cancel, true));
64208     }
64209     function keybindingOff() {
64210       select_default2(document).call(keybinding.unbind);
64211     }
64212     function tryAgain() {
64213       keybindingOff();
64214       dispatch10.call("save");
64215     }
64216     function cancel() {
64217       keybindingOff();
64218       dispatch10.call("cancel");
64219     }
64220     function conflicts(selection2) {
64221       keybindingOn();
64222       var headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
64223       headerEnter.append("button").attr("class", "fr").attr("title", _t("icons.close")).on("click", cancel).call(svgIcon("#iD-icon-close"));
64224       headerEnter.append("h2").call(_t.append("save.conflict.header"));
64225       var bodyEnter = selection2.selectAll(".body").data([0]).enter().append("div").attr("class", "body fillL");
64226       var conflictsHelpEnter = bodyEnter.append("div").attr("class", "conflicts-help").call(_t.append("save.conflict.help"));
64227       var changeset = new osmChangeset();
64228       delete changeset.id;
64229       var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
64230       var blob = new Blob([data], { type: "text/xml;charset=utf-8;" });
64231       var fileName = "changes.osc";
64232       var linkEnter = conflictsHelpEnter.selectAll(".download-changes").append("a").attr("class", "download-changes");
64233       linkEnter.attr("href", window.URL.createObjectURL(blob)).attr("download", fileName);
64234       linkEnter.call(svgIcon("#iD-icon-load", "inline")).append("span").call(_t.append("save.conflict.download_changes"));
64235       bodyEnter.append("div").attr("class", "conflict-container fillL3").call(showConflict, 0);
64236       bodyEnter.append("div").attr("class", "conflicts-done").attr("opacity", 0).style("display", "none").call(_t.append("save.conflict.done"));
64237       var buttonsEnter = bodyEnter.append("div").attr("class", "buttons col12 joined conflicts-buttons");
64238       buttonsEnter.append("button").attr("disabled", _conflictList.length > 1).attr("class", "action conflicts-button col6").call(_t.append("save.title")).on("click.try_again", tryAgain);
64239       buttonsEnter.append("button").attr("class", "secondary-action conflicts-button col6").call(_t.append("confirm.cancel")).on("click.cancel", cancel);
64240     }
64241     function showConflict(selection2, index) {
64242       index = utilWrap(index, _conflictList.length);
64243       _shownConflictIndex = index;
64244       var parent = select_default2(selection2.node().parentNode);
64245       if (index === _conflictList.length - 1) {
64246         window.setTimeout(function() {
64247           parent.select(".conflicts-button").attr("disabled", null);
64248           parent.select(".conflicts-done").transition().attr("opacity", 1).style("display", "block");
64249         }, 250);
64250       }
64251       var conflict = selection2.selectAll(".conflict").data([_conflictList[index]]);
64252       conflict.exit().remove();
64253       var conflictEnter = conflict.enter().append("div").attr("class", "conflict");
64254       conflictEnter.append("h4").attr("class", "conflict-count").call(_t.append("save.conflict.count", { num: index + 1, total: _conflictList.length }));
64255       conflictEnter.append("a").attr("class", "conflict-description").attr("href", "#").text(function(d) {
64256         return d.name;
64257       }).on("click", function(d3_event, d) {
64258         d3_event.preventDefault();
64259         zoomToEntity(d.id);
64260       });
64261       var details = conflictEnter.append("div").attr("class", "conflict-detail-container");
64262       details.append("ul").attr("class", "conflict-detail-list").selectAll("li").data(function(d) {
64263         return d.details || [];
64264       }).enter().append("li").attr("class", "conflict-detail-item").html(function(d) {
64265         return d;
64266       });
64267       details.append("div").attr("class", "conflict-choices").call(addChoices);
64268       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) {
64269         return i2 === 0 && index === 0 || i2 === 1 && index === _conflictList.length - 1 || null;
64270       }).on("click", function(d3_event, d) {
64271         d3_event.preventDefault();
64272         var container = parent.selectAll(".conflict-container");
64273         var sign2 = d === "previous" ? -1 : 1;
64274         container.selectAll(".conflict").remove();
64275         container.call(showConflict, index + sign2);
64276       }).each(function(d) {
64277         _t.append("save.conflict." + d)(select_default2(this));
64278       });
64279     }
64280     function addChoices(selection2) {
64281       var choices = selection2.append("ul").attr("class", "layer-list").selectAll("li").data(function(d) {
64282         return d.choices || [];
64283       });
64284       var choicesEnter = choices.enter().append("li").attr("class", "layer");
64285       var labelEnter = choicesEnter.append("label");
64286       labelEnter.append("input").attr("type", "radio").attr("name", function(d) {
64287         return d.id;
64288       }).on("change", function(d3_event, d) {
64289         var ul = this.parentNode.parentNode.parentNode;
64290         ul.__data__.chosen = d.id;
64291         choose(d3_event, ul, d);
64292       });
64293       labelEnter.append("span").text(function(d) {
64294         return d.text;
64295       });
64296       choicesEnter.merge(choices).each(function(d) {
64297         var ul = this.parentNode;
64298         if (ul.__data__.chosen === d.id) {
64299           choose(null, ul, d);
64300         }
64301       });
64302     }
64303     function choose(d3_event, ul, datum2) {
64304       if (d3_event)
64305         d3_event.preventDefault();
64306       select_default2(ul).selectAll("li").classed("active", function(d) {
64307         return d === datum2;
64308       }).selectAll("input").property("checked", function(d) {
64309         return d === datum2;
64310       });
64311       var extent = geoExtent();
64312       var entity;
64313       entity = context.graph().hasEntity(datum2.id);
64314       if (entity)
64315         extent._extend(entity.extent(context.graph()));
64316       datum2.action();
64317       entity = context.graph().hasEntity(datum2.id);
64318       if (entity)
64319         extent._extend(entity.extent(context.graph()));
64320       zoomToEntity(datum2.id, extent);
64321     }
64322     function zoomToEntity(id2, extent) {
64323       context.surface().selectAll(".hover").classed("hover", false);
64324       var entity = context.graph().hasEntity(id2);
64325       if (entity) {
64326         if (extent) {
64327           context.map().trimmedExtent(extent);
64328         } else {
64329           context.map().zoomToEase(entity);
64330         }
64331         context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph())).classed("hover", true);
64332       }
64333     }
64334     conflicts.conflictList = function(_) {
64335       if (!arguments.length)
64336         return _conflictList;
64337       _conflictList = _;
64338       return conflicts;
64339     };
64340     conflicts.origChanges = function(_) {
64341       if (!arguments.length)
64342         return _origChanges;
64343       _origChanges = _;
64344       return conflicts;
64345     };
64346     conflicts.shownEntityIds = function() {
64347       if (_conflictList && typeof _shownConflictIndex === "number") {
64348         return [_conflictList[_shownConflictIndex].id];
64349       }
64350       return [];
64351     };
64352     return utilRebind(conflicts, dispatch10, "on");
64353   }
64354
64355   // modules/ui/entity_editor.js
64356   var import_fast_deep_equal10 = __toESM(require_fast_deep_equal());
64357
64358   // modules/ui/sections/entity_issues.js
64359   function uiSectionEntityIssues(context) {
64360     var preference = corePreferences("entity-issues.reference.expanded");
64361     var _expanded = preference === null ? true : preference === "true";
64362     var _entityIDs = [];
64363     var _issues = [];
64364     var _activeIssueID;
64365     var section = uiSection("entity-issues", context).shouldDisplay(function() {
64366       return _issues.length > 0;
64367     }).label(function() {
64368       return _t.append("inspector.title_count", { title: _t("issues.list_title"), count: _issues.length });
64369     }).disclosureContent(renderDisclosureContent);
64370     context.validator().on("validated.entity_issues", function() {
64371       reloadIssues();
64372       section.reRender();
64373     }).on("focusedIssue.entity_issues", function(issue) {
64374       makeActiveIssue(issue.id);
64375     });
64376     function reloadIssues() {
64377       _issues = context.validator().getSharedEntityIssues(_entityIDs, { includeDisabledRules: true });
64378     }
64379     function makeActiveIssue(issueID) {
64380       _activeIssueID = issueID;
64381       section.selection().selectAll(".issue-container").classed("active", function(d) {
64382         return d.id === _activeIssueID;
64383       });
64384     }
64385     function renderDisclosureContent(selection2) {
64386       selection2.classed("grouped-items-area", true);
64387       _activeIssueID = _issues.length > 0 ? _issues[0].id : null;
64388       var containers = selection2.selectAll(".issue-container").data(_issues, function(d) {
64389         return d.key;
64390       });
64391       containers.exit().remove();
64392       var containersEnter = containers.enter().append("div").attr("class", "issue-container");
64393       var itemsEnter = containersEnter.append("div").attr("class", function(d) {
64394         return "issue severity-" + d.severity;
64395       }).on("mouseover.highlight", function(d3_event, d) {
64396         var ids = d.entityIds.filter(function(e) {
64397           return _entityIDs.indexOf(e) === -1;
64398         });
64399         utilHighlightEntities(ids, true, context);
64400       }).on("mouseout.highlight", function(d3_event, d) {
64401         var ids = d.entityIds.filter(function(e) {
64402           return _entityIDs.indexOf(e) === -1;
64403         });
64404         utilHighlightEntities(ids, false, context);
64405       });
64406       var labelsEnter = itemsEnter.append("div").attr("class", "issue-label");
64407       var textEnter = labelsEnter.append("button").attr("class", "issue-text").on("click", function(d3_event, d) {
64408         makeActiveIssue(d.id);
64409         var extent = d.extent(context.graph());
64410         if (extent) {
64411           var setZoom = Math.max(context.map().zoom(), 19);
64412           context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
64413         }
64414       });
64415       textEnter.each(function(d) {
64416         var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error");
64417         select_default2(this).call(svgIcon(iconName, "issue-icon"));
64418       });
64419       textEnter.append("span").attr("class", "issue-message");
64420       var infoButton = labelsEnter.append("button").attr("class", "issue-info-button").attr("title", _t("icons.information")).call(svgIcon("#iD-icon-inspect"));
64421       infoButton.on("click", function(d3_event) {
64422         d3_event.stopPropagation();
64423         d3_event.preventDefault();
64424         this.blur();
64425         var container = select_default2(this.parentNode.parentNode.parentNode);
64426         var info = container.selectAll(".issue-info");
64427         var isExpanded = info.classed("expanded");
64428         _expanded = !isExpanded;
64429         corePreferences("entity-issues.reference.expanded", _expanded);
64430         if (isExpanded) {
64431           info.transition().duration(200).style("max-height", "0px").style("opacity", "0").on("end", function() {
64432             info.classed("expanded", false);
64433           });
64434         } else {
64435           info.classed("expanded", true).transition().duration(200).style("max-height", "200px").style("opacity", "1").on("end", function() {
64436             info.style("max-height", null);
64437           });
64438         }
64439       });
64440       itemsEnter.append("ul").attr("class", "issue-fix-list");
64441       containersEnter.append("div").attr("class", "issue-info" + (_expanded ? " expanded" : "")).style("max-height", _expanded ? null : "0").style("opacity", _expanded ? "1" : "0").each(function(d) {
64442         if (typeof d.reference === "function") {
64443           select_default2(this).call(d.reference);
64444         } else {
64445           select_default2(this).call(_t.append("inspector.no_documentation_key"));
64446         }
64447       });
64448       containers = containers.merge(containersEnter).classed("active", function(d) {
64449         return d.id === _activeIssueID;
64450       });
64451       containers.selectAll(".issue-message").text("").each(function(d) {
64452         return d.message(context)(select_default2(this));
64453       });
64454       var fixLists = containers.selectAll(".issue-fix-list");
64455       var fixes = fixLists.selectAll(".issue-fix-item").data(function(d) {
64456         return d.fixes ? d.fixes(context) : [];
64457       }, function(fix) {
64458         return fix.id;
64459       });
64460       fixes.exit().remove();
64461       var fixesEnter = fixes.enter().append("li").attr("class", "issue-fix-item");
64462       var buttons = fixesEnter.append("button").on("click", function(d3_event, d) {
64463         if (select_default2(this).attr("disabled") || !d.onClick)
64464           return;
64465         if (d.issue.dateLastRanFix && /* @__PURE__ */ new Date() - d.issue.dateLastRanFix < 1e3)
64466           return;
64467         d.issue.dateLastRanFix = /* @__PURE__ */ new Date();
64468         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
64469         new Promise(function(resolve, reject) {
64470           d.onClick(context, resolve, reject);
64471           if (d.onClick.length <= 1) {
64472             resolve();
64473           }
64474         }).then(function() {
64475           context.validator().validate();
64476         });
64477       }).on("mouseover.highlight", function(d3_event, d) {
64478         utilHighlightEntities(d.entityIds, true, context);
64479       }).on("mouseout.highlight", function(d3_event, d) {
64480         utilHighlightEntities(d.entityIds, false, context);
64481       });
64482       buttons.each(function(d) {
64483         var iconName = d.icon || "iD-icon-wrench";
64484         if (iconName.startsWith("maki")) {
64485           iconName += "-15";
64486         }
64487         select_default2(this).call(svgIcon("#" + iconName, "fix-icon"));
64488       });
64489       buttons.append("span").attr("class", "fix-message").each(function(d) {
64490         return d.title(select_default2(this));
64491       });
64492       fixesEnter.merge(fixes).selectAll("button").classed("actionable", function(d) {
64493         return d.onClick;
64494       }).attr("disabled", function(d) {
64495         return d.onClick ? null : "true";
64496       }).attr("title", function(d) {
64497         if (d.disabledReason) {
64498           return d.disabledReason;
64499         }
64500         return null;
64501       });
64502     }
64503     section.entityIDs = function(val) {
64504       if (!arguments.length)
64505         return _entityIDs;
64506       if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
64507         _entityIDs = val;
64508         _activeIssueID = null;
64509         reloadIssues();
64510       }
64511       return section;
64512     };
64513     return section;
64514   }
64515
64516   // modules/ui/preset_icon.js
64517   function uiPresetIcon() {
64518     let _preset;
64519     let _geometry;
64520     function presetIcon(selection2) {
64521       selection2.each(render);
64522     }
64523     function getIcon(p, geom) {
64524       if (p.isFallback && p.isFallback())
64525         return geom === "vertex" ? "" : "iD-icon-" + p.id;
64526       if (p.icon)
64527         return p.icon;
64528       if (geom === "line")
64529         return "iD-other-line";
64530       if (geom === "vertex")
64531         return "temaki-vertex";
64532       return "maki-marker-stroked";
64533     }
64534     function renderPointBorder(container, drawPoint) {
64535       let pointBorder = container.selectAll(".preset-icon-point-border").data(drawPoint ? [0] : []);
64536       pointBorder.exit().remove();
64537       let pointBorderEnter = pointBorder.enter();
64538       const w = 40;
64539       const h = 40;
64540       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");
64541       pointBorder = pointBorderEnter.merge(pointBorder);
64542     }
64543     function renderCategoryBorder(container, category) {
64544       let categoryBorder = container.selectAll(".preset-icon-category-border").data(category ? [0] : []);
64545       categoryBorder.exit().remove();
64546       let categoryBorderEnter = categoryBorder.enter();
64547       const d = 60;
64548       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}`);
64549       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");
64550       categoryBorder = categoryBorderEnter.merge(categoryBorder);
64551       if (category) {
64552         categoryBorder.selectAll("path").attr("class", `area ${category.id}`);
64553       }
64554     }
64555     function renderCircleFill(container, drawVertex) {
64556       let vertexFill = container.selectAll(".preset-icon-fill-vertex").data(drawVertex ? [0] : []);
64557       vertexFill.exit().remove();
64558       let vertexFillEnter = vertexFill.enter();
64559       const w = 60;
64560       const h = 60;
64561       const d = 40;
64562       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);
64563       vertexFill = vertexFillEnter.merge(vertexFill);
64564     }
64565     function renderSquareFill(container, drawArea, tagClasses) {
64566       let fill = container.selectAll(".preset-icon-fill-area").data(drawArea ? [0] : []);
64567       fill.exit().remove();
64568       let fillEnter = fill.enter();
64569       const d = 60;
64570       const w = d;
64571       const h = d;
64572       const l = d * 2 / 3;
64573       const c1 = (w - l) / 2;
64574       const c2 = c1 + l;
64575       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}`);
64576       ["fill", "stroke"].forEach((klass) => {
64577         fillEnter.append("path").attr("d", `M${c1} ${c1} L${c1} ${c2} L${c2} ${c2} L${c2} ${c1} Z`).attr("class", `area ${klass}`);
64578       });
64579       const rVertex = 2.5;
64580       [[c1, c1], [c1, c2], [c2, c2], [c2, c1]].forEach((point2) => {
64581         fillEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", rVertex);
64582       });
64583       const rMidpoint = 1.25;
64584       [[c1, w / 2], [c2, w / 2], [h / 2, c1], [h / 2, c2]].forEach((point2) => {
64585         fillEnter.append("circle").attr("class", "midpoint").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", rMidpoint);
64586       });
64587       fill = fillEnter.merge(fill);
64588       fill.selectAll("path.stroke").attr("class", `area stroke ${tagClasses}`);
64589       fill.selectAll("path.fill").attr("class", `area fill ${tagClasses}`);
64590     }
64591     function renderLine(container, drawLine, tagClasses) {
64592       let line = container.selectAll(".preset-icon-line").data(drawLine ? [0] : []);
64593       line.exit().remove();
64594       let lineEnter = line.enter();
64595       const d = 60;
64596       const w = d;
64597       const h = d;
64598       const y = Math.round(d * 0.72);
64599       const l = Math.round(d * 0.6);
64600       const r = 2.5;
64601       const x12 = (w - l) / 2;
64602       const x2 = x12 + l;
64603       lineEnter = lineEnter.append("svg").attr("class", "preset-icon-line").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
64604       ["casing", "stroke"].forEach((klass) => {
64605         lineEnter.append("path").attr("d", `M${x12} ${y} L${x2} ${y}`).attr("class", `line ${klass}`);
64606       });
64607       [[x12 - 1, y], [x2 + 1, y]].forEach((point2) => {
64608         lineEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", r);
64609       });
64610       line = lineEnter.merge(line);
64611       line.selectAll("path.stroke").attr("class", `line stroke ${tagClasses}`);
64612       line.selectAll("path.casing").attr("class", `line casing ${tagClasses}`);
64613     }
64614     function renderRoute(container, drawRoute, p) {
64615       let route = container.selectAll(".preset-icon-route").data(drawRoute ? [0] : []);
64616       route.exit().remove();
64617       let routeEnter = route.enter();
64618       const d = 60;
64619       const w = d;
64620       const h = d;
64621       const y12 = Math.round(d * 0.8);
64622       const y2 = Math.round(d * 0.68);
64623       const l = Math.round(d * 0.6);
64624       const r = 2;
64625       const x12 = (w - l) / 2;
64626       const x2 = x12 + l / 3;
64627       const x3 = x2 + l / 3;
64628       const x4 = x3 + l / 3;
64629       routeEnter = routeEnter.append("svg").attr("class", "preset-icon-route").attr("width", w).attr("height", h).attr("viewBox", `0 0 ${w} ${h}`);
64630       ["casing", "stroke"].forEach((klass) => {
64631         routeEnter.append("path").attr("d", `M${x12} ${y12} L${x2} ${y2}`).attr("class", `segment0 line ${klass}`);
64632         routeEnter.append("path").attr("d", `M${x2} ${y2} L${x3} ${y12}`).attr("class", `segment1 line ${klass}`);
64633         routeEnter.append("path").attr("d", `M${x3} ${y12} L${x4} ${y2}`).attr("class", `segment2 line ${klass}`);
64634       });
64635       [[x12, y12], [x2, y2], [x3, y12], [x4, y2]].forEach((point2) => {
64636         routeEnter.append("circle").attr("class", "vertex").attr("cx", point2[0]).attr("cy", point2[1]).attr("r", r);
64637       });
64638       route = routeEnter.merge(route);
64639       if (drawRoute) {
64640         let routeType = p.tags.type === "waterway" ? "waterway" : p.tags.route;
64641         const segmentPresetIDs = routeSegments[routeType];
64642         for (let i2 in segmentPresetIDs) {
64643           const segmentPreset = _mainPresetIndex.item(segmentPresetIDs[i2]);
64644           const segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, "");
64645           route.selectAll(`path.stroke.segment${i2}`).attr("class", `segment${i2} line stroke ${segmentTagClasses}`);
64646           route.selectAll(`path.casing.segment${i2}`).attr("class", `segment${i2} line casing ${segmentTagClasses}`);
64647         }
64648       }
64649     }
64650     function renderSvgIcon(container, picon, geom, isFramed, category, tagClasses) {
64651       const isMaki = picon && /^maki-/.test(picon);
64652       const isTemaki = picon && /^temaki-/.test(picon);
64653       const isFa = picon && /^fa[srb]-/.test(picon);
64654       const isR\u00F6ntgen = picon && /^roentgen-/.test(picon);
64655       const isiDIcon = picon && !(isMaki || isTemaki || isFa || isR\u00F6ntgen);
64656       let icon2 = container.selectAll(".preset-icon").data(picon ? [0] : []);
64657       icon2.exit().remove();
64658       icon2 = icon2.enter().append("div").attr("class", "preset-icon").call(svgIcon("")).merge(icon2);
64659       icon2.attr("class", "preset-icon " + (geom ? geom + "-geom" : "")).classed("category", category).classed("framed", isFramed).classed("preset-icon-iD", isiDIcon);
64660       icon2.selectAll("svg").attr("class", "icon " + picon + " " + (!isiDIcon && geom !== "line" ? "" : tagClasses));
64661       icon2.selectAll("use").attr("href", "#" + picon);
64662     }
64663     function renderImageIcon(container, imageURL) {
64664       let imageIcon = container.selectAll("img.image-icon").data(imageURL ? [0] : []);
64665       imageIcon.exit().remove();
64666       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);
64667       imageIcon.attr("src", imageURL);
64668     }
64669     const routeSegments = {
64670       bicycle: ["highway/cycleway", "highway/cycleway", "highway/cycleway"],
64671       bus: ["highway/unclassified", "highway/secondary", "highway/primary"],
64672       trolleybus: ["highway/unclassified", "highway/secondary", "highway/primary"],
64673       detour: ["highway/tertiary", "highway/residential", "highway/unclassified"],
64674       ferry: ["route/ferry", "route/ferry", "route/ferry"],
64675       foot: ["highway/footway", "highway/footway", "highway/footway"],
64676       hiking: ["highway/path", "highway/path", "highway/path"],
64677       horse: ["highway/bridleway", "highway/bridleway", "highway/bridleway"],
64678       light_rail: ["railway/light_rail", "railway/light_rail", "railway/light_rail"],
64679       monorail: ["railway/monorail", "railway/monorail", "railway/monorail"],
64680       mtb: ["highway/path", "highway/track", "highway/bridleway"],
64681       pipeline: ["man_made/pipeline", "man_made/pipeline", "man_made/pipeline"],
64682       piste: ["piste/downhill", "piste/hike", "piste/nordic"],
64683       power: ["power/line", "power/line", "power/line"],
64684       road: ["highway/secondary", "highway/primary", "highway/trunk"],
64685       subway: ["railway/subway", "railway/subway", "railway/subway"],
64686       train: ["railway/rail", "railway/rail", "railway/rail"],
64687       tram: ["railway/tram", "railway/tram", "railway/tram"],
64688       waterway: ["waterway/stream", "waterway/stream", "waterway/stream"]
64689     };
64690     function render() {
64691       let p = _preset.apply(this, arguments);
64692       let geom = _geometry ? _geometry.apply(this, arguments) : null;
64693       if (geom === "relation" && p.tags && (p.tags.type === "route" && p.tags.route && routeSegments[p.tags.route] || p.tags.type === "waterway")) {
64694         geom = "route";
64695       }
64696       const showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true";
64697       const isFallback = p.isFallback && p.isFallback();
64698       const imageURL = showThirdPartyIcons === "true" && p.imageURL;
64699       const picon = getIcon(p, geom);
64700       const isCategory = !p.setTags;
64701       const drawPoint = false;
64702       const drawVertex = picon !== null && geom === "vertex";
64703       const drawLine = picon && geom === "line" && !isFallback && !isCategory;
64704       const drawArea = picon && geom === "area" && !isFallback && !isCategory;
64705       const drawRoute = picon && geom === "route";
64706       const isFramed = drawVertex || drawArea || drawLine || drawRoute || isCategory;
64707       let tags = !isCategory ? p.setTags({}, geom) : {};
64708       for (let k in tags) {
64709         if (tags[k] === "*") {
64710           tags[k] = "yes";
64711         }
64712       }
64713       let tagClasses = svgTagClasses().getClassesString(tags, "");
64714       let selection2 = select_default2(this);
64715       let container = selection2.selectAll(".preset-icon-container").data([0]);
64716       container = container.enter().append("div").attr("class", "preset-icon-container").merge(container);
64717       container.classed("showing-img", !!imageURL).classed("fallback", isFallback);
64718       renderCategoryBorder(container, isCategory && p);
64719       renderPointBorder(container, drawPoint);
64720       renderCircleFill(container, drawVertex);
64721       renderSquareFill(container, drawArea, tagClasses);
64722       renderLine(container, drawLine, tagClasses);
64723       renderRoute(container, drawRoute, p);
64724       renderSvgIcon(container, picon, geom, isFramed, isCategory, tagClasses);
64725       renderImageIcon(container, imageURL);
64726     }
64727     presetIcon.preset = function(val) {
64728       if (!arguments.length)
64729         return _preset;
64730       _preset = utilFunctor(val);
64731       return presetIcon;
64732     };
64733     presetIcon.geometry = function(val) {
64734       if (!arguments.length)
64735         return _geometry;
64736       _geometry = utilFunctor(val);
64737       return presetIcon;
64738     };
64739     return presetIcon;
64740   }
64741
64742   // modules/ui/sections/feature_type.js
64743   function uiSectionFeatureType(context) {
64744     var dispatch10 = dispatch_default("choose");
64745     var _entityIDs = [];
64746     var _presets = [];
64747     var _tagReference;
64748     var section = uiSection("feature-type", context).label(() => _t.append("inspector.feature_type")).disclosureContent(renderDisclosureContent);
64749     function renderDisclosureContent(selection2) {
64750       selection2.classed("preset-list-item", true);
64751       selection2.classed("mixed-types", _presets.length > 1);
64752       var presetButtonWrap = selection2.selectAll(".preset-list-button-wrap").data([0]).enter().append("div").attr("class", "preset-list-button-wrap");
64753       var presetButton = presetButtonWrap.append("button").attr("class", "preset-list-button preset-reset").call(
64754         uiTooltip().title(() => _t.append("inspector.back_tooltip")).placement("bottom")
64755       );
64756       presetButton.append("div").attr("class", "preset-icon-container");
64757       presetButton.append("div").attr("class", "label").append("div").attr("class", "label-inner");
64758       presetButtonWrap.append("div").attr("class", "accessory-buttons");
64759       var tagReferenceBodyWrap = selection2.selectAll(".tag-reference-body-wrap").data([0]);
64760       tagReferenceBodyWrap = tagReferenceBodyWrap.enter().append("div").attr("class", "tag-reference-body-wrap").merge(tagReferenceBodyWrap);
64761       if (_tagReference) {
64762         selection2.selectAll(".preset-list-button-wrap .accessory-buttons").style("display", _presets.length === 1 ? null : "none").call(_tagReference.button);
64763         tagReferenceBodyWrap.style("display", _presets.length === 1 ? null : "none").call(_tagReference.body);
64764       }
64765       selection2.selectAll(".preset-reset").on("click", function() {
64766         dispatch10.call("choose", this, _presets);
64767       }).on("pointerdown pointerup mousedown mouseup", function(d3_event) {
64768         d3_event.preventDefault();
64769         d3_event.stopPropagation();
64770       });
64771       var geometries = entityGeometries();
64772       selection2.select(".preset-list-item button").call(
64773         uiPresetIcon().geometry(_presets.length === 1 ? geometries.length === 1 && geometries[0] : null).preset(_presets.length === 1 ? _presets[0] : _mainPresetIndex.item("point"))
64774       );
64775       var names = _presets.length === 1 ? [
64776         _presets[0].nameLabel(),
64777         _presets[0].subtitleLabel()
64778       ].filter(Boolean) : [_t.append("inspector.multiple_types")];
64779       var label = selection2.select(".label-inner");
64780       var nameparts = label.selectAll(".namepart").data(names, (d) => d.stringId);
64781       nameparts.exit().remove();
64782       nameparts.enter().append("div").attr("class", "namepart").text("").each(function(d) {
64783         d(select_default2(this));
64784       });
64785     }
64786     section.entityIDs = function(val) {
64787       if (!arguments.length)
64788         return _entityIDs;
64789       _entityIDs = val;
64790       return section;
64791     };
64792     section.presets = function(val) {
64793       if (!arguments.length)
64794         return _presets;
64795       if (!utilArrayIdentical(val, _presets)) {
64796         _presets = val;
64797         if (_presets.length === 1) {
64798           _tagReference = uiTagReference(_presets[0].reference(), context).showing(false);
64799         }
64800       }
64801       return section;
64802     };
64803     function entityGeometries() {
64804       var counts = {};
64805       for (var i2 in _entityIDs) {
64806         var geometry = context.graph().geometry(_entityIDs[i2]);
64807         if (!counts[geometry])
64808           counts[geometry] = 0;
64809         counts[geometry] += 1;
64810       }
64811       return Object.keys(counts).sort(function(geom1, geom2) {
64812         return counts[geom2] - counts[geom1];
64813       });
64814     }
64815     return utilRebind(section, dispatch10, "on");
64816   }
64817
64818   // modules/ui/sections/preset_fields.js
64819   function uiSectionPresetFields(context) {
64820     var section = uiSection("preset-fields", context).label(() => _t.append("inspector.fields")).disclosureContent(renderDisclosureContent);
64821     var dispatch10 = dispatch_default("change", "revert");
64822     var formFields = uiFormFields(context);
64823     var _state;
64824     var _fieldsArr;
64825     var _presets = [];
64826     var _tags;
64827     var _entityIDs;
64828     function renderDisclosureContent(selection2) {
64829       if (!_fieldsArr) {
64830         var graph = context.graph();
64831         var geometries = Object.keys(_entityIDs.reduce(function(geoms, entityID) {
64832           geoms[graph.entity(entityID).geometry(graph)] = true;
64833           return geoms;
64834         }, {}));
64835         const loc = _entityIDs.reduce(function(extent, entityID) {
64836           var entity = context.graph().entity(entityID);
64837           return extent.extend(entity.extent(context.graph()));
64838         }, geoExtent()).center();
64839         var presetsManager = _mainPresetIndex;
64840         var allFields = [];
64841         var allMoreFields = [];
64842         var sharedTotalFields;
64843         _presets.forEach(function(preset) {
64844           var fields = preset.fields(loc);
64845           var moreFields = preset.moreFields(loc);
64846           allFields = utilArrayUnion(allFields, fields);
64847           allMoreFields = utilArrayUnion(allMoreFields, moreFields);
64848           if (!sharedTotalFields) {
64849             sharedTotalFields = utilArrayUnion(fields, moreFields);
64850           } else {
64851             sharedTotalFields = sharedTotalFields.filter(function(field) {
64852               return fields.indexOf(field) !== -1 || moreFields.indexOf(field) !== -1;
64853             });
64854           }
64855         });
64856         var sharedFields = allFields.filter(function(field) {
64857           return sharedTotalFields.indexOf(field) !== -1;
64858         });
64859         var sharedMoreFields = allMoreFields.filter(function(field) {
64860           return sharedTotalFields.indexOf(field) !== -1;
64861         });
64862         _fieldsArr = [];
64863         sharedFields.forEach(function(field) {
64864           if (field.matchAllGeometry(geometries)) {
64865             _fieldsArr.push(
64866               uiField(context, field, _entityIDs)
64867             );
64868           }
64869         });
64870         var singularEntity = _entityIDs.length === 1 && graph.hasEntity(_entityIDs[0]);
64871         if (singularEntity && singularEntity.isHighwayIntersection(graph) && presetsManager.field("restrictions")) {
64872           _fieldsArr.push(
64873             uiField(context, presetsManager.field("restrictions"), _entityIDs)
64874           );
64875         }
64876         var additionalFields = utilArrayUnion(sharedMoreFields, presetsManager.universal());
64877         additionalFields.sort(function(field1, field2) {
64878           return field1.title().localeCompare(field2.title(), _mainLocalizer.localeCode());
64879         });
64880         additionalFields.forEach(function(field) {
64881           if (sharedFields.indexOf(field) === -1 && field.matchAllGeometry(geometries)) {
64882             _fieldsArr.push(
64883               uiField(context, field, _entityIDs, { show: false })
64884             );
64885           }
64886         });
64887         _fieldsArr.forEach(function(field) {
64888           field.on("change", function(t, onInput) {
64889             dispatch10.call("change", field, _entityIDs, t, onInput);
64890           }).on("revert", function(keys2) {
64891             dispatch10.call("revert", field, keys2);
64892           });
64893         });
64894       }
64895       _fieldsArr.forEach(function(field) {
64896         field.state(_state).tags(_tags);
64897       });
64898       selection2.call(
64899         formFields.fieldsArr(_fieldsArr).state(_state).klass("grouped-items-area")
64900       );
64901     }
64902     section.presets = function(val) {
64903       if (!arguments.length)
64904         return _presets;
64905       if (!_presets || !val || !utilArrayIdentical(_presets, val)) {
64906         _presets = val;
64907         _fieldsArr = null;
64908       }
64909       return section;
64910     };
64911     section.state = function(val) {
64912       if (!arguments.length)
64913         return _state;
64914       _state = val;
64915       return section;
64916     };
64917     section.tags = function(val) {
64918       if (!arguments.length)
64919         return _tags;
64920       _tags = val;
64921       return section;
64922     };
64923     section.entityIDs = function(val) {
64924       if (!arguments.length)
64925         return _entityIDs;
64926       if (!val || !_entityIDs || !utilArrayIdentical(_entityIDs, val)) {
64927         _entityIDs = val;
64928         _fieldsArr = null;
64929       }
64930       return section;
64931     };
64932     return utilRebind(section, dispatch10, "on");
64933   }
64934
64935   // modules/ui/sections/raw_member_editor.js
64936   function uiSectionRawMemberEditor(context) {
64937     var section = uiSection("raw-member-editor", context).shouldDisplay(function() {
64938       if (!_entityIDs || _entityIDs.length !== 1)
64939         return false;
64940       var entity = context.hasEntity(_entityIDs[0]);
64941       return entity && entity.type === "relation";
64942     }).label(function() {
64943       var entity = context.hasEntity(_entityIDs[0]);
64944       if (!entity)
64945         return "";
64946       var gt = entity.members.length > _maxMembers ? ">" : "";
64947       var count = gt + entity.members.slice(0, _maxMembers).length;
64948       return _t.append("inspector.title_count", { title: _t("inspector.members"), count });
64949     }).disclosureContent(renderDisclosureContent);
64950     var taginfo = services.taginfo;
64951     var _entityIDs;
64952     var _maxMembers = 1e3;
64953     function downloadMember(d3_event, d) {
64954       d3_event.preventDefault();
64955       select_default2(this.parentNode).classed("tag-reference-loading", true);
64956       context.loadEntity(d.id, function() {
64957         section.reRender();
64958       });
64959     }
64960     function zoomToMember(d3_event, d) {
64961       d3_event.preventDefault();
64962       var entity = context.entity(d.id);
64963       context.map().zoomToEase(entity);
64964       utilHighlightEntities([d.id], true, context);
64965     }
64966     function selectMember(d3_event, d) {
64967       d3_event.preventDefault();
64968       utilHighlightEntities([d.id], false, context);
64969       var entity = context.entity(d.id);
64970       var mapExtent = context.map().extent();
64971       if (!entity.intersects(mapExtent, context.graph())) {
64972         context.map().zoomToEase(entity);
64973       }
64974       context.enter(modeSelect(context, [d.id]));
64975     }
64976     function changeRole(d3_event, d) {
64977       var oldRole = d.role;
64978       var newRole = context.cleanRelationRole(select_default2(this).property("value"));
64979       if (oldRole !== newRole) {
64980         var member = { id: d.id, type: d.type, role: newRole };
64981         context.perform(
64982           actionChangeMember(d.relation.id, member, d.index),
64983           _t("operations.change_role.annotation", {
64984             n: 1
64985           })
64986         );
64987         context.validator().validate();
64988       }
64989     }
64990     function deleteMember(d3_event, d) {
64991       utilHighlightEntities([d.id], false, context);
64992       context.perform(
64993         actionDeleteMember(d.relation.id, d.index),
64994         _t("operations.delete_member.annotation", {
64995           n: 1
64996         })
64997       );
64998       if (!context.hasEntity(d.relation.id)) {
64999         context.enter(modeBrowse(context));
65000       } else {
65001         context.validator().validate();
65002       }
65003     }
65004     function renderDisclosureContent(selection2) {
65005       var entityID = _entityIDs[0];
65006       var memberships = [];
65007       var entity = context.entity(entityID);
65008       entity.members.slice(0, _maxMembers).forEach(function(member, index) {
65009         memberships.push({
65010           index,
65011           id: member.id,
65012           type: member.type,
65013           role: member.role,
65014           relation: entity,
65015           member: context.hasEntity(member.id),
65016           domId: utilUniqueDomId(entityID + "-member-" + index)
65017         });
65018       });
65019       var list = selection2.selectAll(".member-list").data([0]);
65020       list = list.enter().append("ul").attr("class", "member-list").merge(list);
65021       var items = list.selectAll("li").data(memberships, function(d) {
65022         return osmEntity.key(d.relation) + "," + d.index + "," + (d.member ? osmEntity.key(d.member) : "incomplete");
65023       });
65024       items.exit().each(unbind).remove();
65025       var itemsEnter = items.enter().append("li").attr("class", "member-row form-field").classed("member-incomplete", function(d) {
65026         return !d.member;
65027       });
65028       itemsEnter.each(function(d) {
65029         var item = select_default2(this);
65030         var label = item.append("label").attr("class", "field-label").attr("for", d.domId);
65031         if (d.member) {
65032           item.on("mouseover", function() {
65033             utilHighlightEntities([d.id], true, context);
65034           }).on("mouseout", function() {
65035             utilHighlightEntities([d.id], false, context);
65036           });
65037           var labelLink = label.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectMember);
65038           labelLink.append("span").attr("class", "member-entity-type").text(function(d2) {
65039             var matched = _mainPresetIndex.match(d2.member, context.graph());
65040             return matched && matched.name() || utilDisplayType(d2.member.id);
65041           });
65042           labelLink.append("span").attr("class", "member-entity-name").text(function(d2) {
65043             return utilDisplayName(d2.member);
65044           });
65045           label.append("button").attr("title", _t("icons.remove")).attr("class", "remove member-delete").call(svgIcon("#iD-operation-delete"));
65046           label.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToMember);
65047         } else {
65048           var labelText = label.append("span").attr("class", "label-text");
65049           labelText.append("span").attr("class", "member-entity-type").call(_t.append("inspector." + d.type, { id: d.id }));
65050           labelText.append("span").attr("class", "member-entity-name").call(_t.append("inspector.incomplete", { id: d.id }));
65051           label.append("button").attr("class", "member-download").attr("title", _t("icons.download")).call(svgIcon("#iD-icon-load")).on("click", downloadMember);
65052         }
65053       });
65054       var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
65055       wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) {
65056         return d.domId;
65057       }).property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto);
65058       if (taginfo) {
65059         wrapEnter.each(bindTypeahead);
65060       }
65061       items = items.merge(itemsEnter).order();
65062       items.select("input.member-role").property("value", function(d) {
65063         return d.role;
65064       }).on("blur", changeRole).on("change", changeRole);
65065       items.select("button.member-delete").on("click", deleteMember);
65066       var dragOrigin, targetIndex;
65067       items.call(
65068         drag_default().on("start", function(d3_event) {
65069           dragOrigin = {
65070             x: d3_event.x,
65071             y: d3_event.y
65072           };
65073           targetIndex = null;
65074         }).on("drag", function(d3_event) {
65075           var x = d3_event.x - dragOrigin.x, y = d3_event.y - dragOrigin.y;
65076           if (!select_default2(this).classed("dragging") && // don't display drag until dragging beyond a distance threshold
65077           Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5)
65078             return;
65079           var index = items.nodes().indexOf(this);
65080           select_default2(this).classed("dragging", true);
65081           targetIndex = null;
65082           selection2.selectAll("li.member-row").style("transform", function(d2, index2) {
65083             var node = select_default2(this).node();
65084             if (index === index2) {
65085               return "translate(" + x + "px, " + y + "px)";
65086             } else if (index2 > index && d3_event.y > node.offsetTop) {
65087               if (targetIndex === null || index2 > targetIndex) {
65088                 targetIndex = index2;
65089               }
65090               return "translateY(-100%)";
65091             } else if (index2 < index && d3_event.y < node.offsetTop + node.offsetHeight) {
65092               if (targetIndex === null || index2 < targetIndex) {
65093                 targetIndex = index2;
65094               }
65095               return "translateY(100%)";
65096             }
65097             return null;
65098           });
65099         }).on("end", function(d3_event, d) {
65100           if (!select_default2(this).classed("dragging"))
65101             return;
65102           var index = items.nodes().indexOf(this);
65103           select_default2(this).classed("dragging", false);
65104           selection2.selectAll("li.member-row").style("transform", null);
65105           if (targetIndex !== null) {
65106             context.perform(
65107               actionMoveMember(d.relation.id, index, targetIndex),
65108               _t("operations.reorder_members.annotation")
65109             );
65110             context.validator().validate();
65111           }
65112         })
65113       );
65114       function bindTypeahead(d) {
65115         var row = select_default2(this);
65116         var role = row.selectAll("input.member-role");
65117         var origValue = role.property("value");
65118         function sort(value, data) {
65119           var sameletter = [];
65120           var other = [];
65121           for (var i2 = 0; i2 < data.length; i2++) {
65122             if (data[i2].value.substring(0, value.length) === value) {
65123               sameletter.push(data[i2]);
65124             } else {
65125               other.push(data[i2]);
65126             }
65127           }
65128           return sameletter.concat(other);
65129         }
65130         role.call(
65131           uiCombobox(context, "member-role").fetcher(function(role2, callback) {
65132             var geometry;
65133             if (d.member) {
65134               geometry = context.graph().geometry(d.member.id);
65135             } else if (d.type === "relation") {
65136               geometry = "relation";
65137             } else if (d.type === "way") {
65138               geometry = "line";
65139             } else {
65140               geometry = "point";
65141             }
65142             var rtype = entity.tags.type;
65143             taginfo.roles({
65144               debounce: true,
65145               rtype: rtype || "",
65146               geometry,
65147               query: role2
65148             }, function(err, data) {
65149               if (!err)
65150                 callback(sort(role2, data));
65151             });
65152           }).on("cancel", function() {
65153             role.property("value", origValue);
65154           })
65155         );
65156       }
65157       function unbind() {
65158         var row = select_default2(this);
65159         row.selectAll("input.member-role").call(uiCombobox.off, context);
65160       }
65161     }
65162     section.entityIDs = function(val) {
65163       if (!arguments.length)
65164         return _entityIDs;
65165       _entityIDs = val;
65166       return section;
65167     };
65168     return section;
65169   }
65170
65171   // modules/actions/delete_members.js
65172   function actionDeleteMembers(relationId, memberIndexes) {
65173     return function(graph) {
65174       memberIndexes.sort((a, b) => b - a);
65175       for (var i2 in memberIndexes) {
65176         graph = actionDeleteMember(relationId, memberIndexes[i2])(graph);
65177       }
65178       return graph;
65179     };
65180   }
65181
65182   // modules/ui/sections/raw_membership_editor.js
65183   function uiSectionRawMembershipEditor(context) {
65184     var section = uiSection("raw-membership-editor", context).shouldDisplay(function() {
65185       return _entityIDs && _entityIDs.length;
65186     }).label(function() {
65187       var parents = getSharedParentRelations();
65188       var gt = parents.length > _maxMemberships ? ">" : "";
65189       var count = gt + parents.slice(0, _maxMemberships).length;
65190       return _t.append("inspector.title_count", { title: _t("inspector.relations"), count });
65191     }).disclosureContent(renderDisclosureContent);
65192     var taginfo = services.taginfo;
65193     var nearbyCombo = uiCombobox(context, "parent-relation").minItems(1).fetcher(fetchNearbyRelations).itemsMouseEnter(function(d3_event, d) {
65194       if (d.relation)
65195         utilHighlightEntities([d.relation.id], true, context);
65196     }).itemsMouseLeave(function(d3_event, d) {
65197       if (d.relation)
65198         utilHighlightEntities([d.relation.id], false, context);
65199     });
65200     var _inChange = false;
65201     var _entityIDs = [];
65202     var _showBlank;
65203     var _maxMemberships = 1e3;
65204     function getSharedParentRelations() {
65205       var parents = [];
65206       for (var i2 = 0; i2 < _entityIDs.length; i2++) {
65207         var entity = context.graph().hasEntity(_entityIDs[i2]);
65208         if (!entity)
65209           continue;
65210         if (i2 === 0) {
65211           parents = context.graph().parentRelations(entity);
65212         } else {
65213           parents = utilArrayIntersection(parents, context.graph().parentRelations(entity));
65214         }
65215         if (!parents.length)
65216           break;
65217       }
65218       return parents;
65219     }
65220     function getMemberships() {
65221       var memberships = [];
65222       var relations = getSharedParentRelations().slice(0, _maxMemberships);
65223       var isMultiselect = _entityIDs.length > 1;
65224       var i2, relation, membership, index, member, indexedMember;
65225       for (i2 = 0; i2 < relations.length; i2++) {
65226         relation = relations[i2];
65227         membership = {
65228           relation,
65229           members: [],
65230           hash: osmEntity.key(relation)
65231         };
65232         for (index = 0; index < relation.members.length; index++) {
65233           member = relation.members[index];
65234           if (_entityIDs.indexOf(member.id) !== -1) {
65235             indexedMember = Object.assign({}, member, { index });
65236             membership.members.push(indexedMember);
65237             membership.hash += "," + index.toString();
65238             if (!isMultiselect) {
65239               memberships.push(membership);
65240               membership = {
65241                 relation,
65242                 members: [],
65243                 hash: osmEntity.key(relation)
65244               };
65245             }
65246           }
65247         }
65248         if (membership.members.length)
65249           memberships.push(membership);
65250       }
65251       memberships.forEach(function(membership2) {
65252         membership2.domId = utilUniqueDomId("membership-" + membership2.relation.id);
65253         var roles = [];
65254         membership2.members.forEach(function(member2) {
65255           if (roles.indexOf(member2.role) === -1)
65256             roles.push(member2.role);
65257         });
65258         membership2.role = roles.length === 1 ? roles[0] : roles;
65259       });
65260       return memberships;
65261     }
65262     function selectRelation(d3_event, d) {
65263       d3_event.preventDefault();
65264       utilHighlightEntities([d.relation.id], false, context);
65265       context.enter(modeSelect(context, [d.relation.id]));
65266     }
65267     function zoomToRelation(d3_event, d) {
65268       d3_event.preventDefault();
65269       var entity = context.entity(d.relation.id);
65270       context.map().zoomToEase(entity);
65271       utilHighlightEntities([d.relation.id], true, context);
65272     }
65273     function changeRole(d3_event, d) {
65274       if (d === 0)
65275         return;
65276       if (_inChange)
65277         return;
65278       var newRole = context.cleanRelationRole(select_default2(this).property("value"));
65279       if (!newRole.trim() && typeof d.role !== "string")
65280         return;
65281       var membersToUpdate = d.members.filter(function(member) {
65282         return member.role !== newRole;
65283       });
65284       if (membersToUpdate.length) {
65285         _inChange = true;
65286         context.perform(
65287           function actionChangeMemberRoles(graph) {
65288             membersToUpdate.forEach(function(member) {
65289               var newMember = Object.assign({}, member, { role: newRole });
65290               delete newMember.index;
65291               graph = actionChangeMember(d.relation.id, newMember, member.index)(graph);
65292             });
65293             return graph;
65294           },
65295           _t("operations.change_role.annotation", {
65296             n: membersToUpdate.length
65297           })
65298         );
65299         context.validator().validate();
65300       }
65301       _inChange = false;
65302     }
65303     function addMembership(d, role) {
65304       this.blur();
65305       _showBlank = false;
65306       function actionAddMembers(relationId, ids, role2) {
65307         return function(graph) {
65308           for (var i2 in ids) {
65309             var member = { id: ids[i2], type: graph.entity(ids[i2]).type, role: role2 };
65310             graph = actionAddMember(relationId, member)(graph);
65311           }
65312           return graph;
65313         };
65314       }
65315       if (d.relation) {
65316         context.perform(
65317           actionAddMembers(d.relation.id, _entityIDs, role),
65318           _t("operations.add_member.annotation", {
65319             n: _entityIDs.length
65320           })
65321         );
65322         context.validator().validate();
65323       } else {
65324         var relation = osmRelation();
65325         context.perform(
65326           actionAddEntity(relation),
65327           actionAddMembers(relation.id, _entityIDs, role),
65328           _t("operations.add.annotation.relation")
65329         );
65330         context.enter(modeSelect(context, [relation.id]).newFeature(true));
65331       }
65332     }
65333     function deleteMembership(d3_event, d) {
65334       this.blur();
65335       if (d === 0)
65336         return;
65337       utilHighlightEntities([d.relation.id], false, context);
65338       var indexes = d.members.map(function(member) {
65339         return member.index;
65340       });
65341       context.perform(
65342         actionDeleteMembers(d.relation.id, indexes),
65343         _t("operations.delete_member.annotation", {
65344           n: _entityIDs.length
65345         })
65346       );
65347       context.validator().validate();
65348     }
65349     function fetchNearbyRelations(q, callback) {
65350       var newRelation = {
65351         relation: null,
65352         value: _t("inspector.new_relation"),
65353         display: _t.append("inspector.new_relation")
65354       };
65355       var entityID = _entityIDs[0];
65356       var result = [];
65357       var graph = context.graph();
65358       function baseDisplayLabel(entity) {
65359         var matched = _mainPresetIndex.match(entity, graph);
65360         var presetName = matched && matched.name() || _t("inspector.relation");
65361         var entityName = utilDisplayName(entity) || "";
65362         return presetName + " " + entityName;
65363       }
65364       var explicitRelation = q && context.hasEntity(q.toLowerCase());
65365       if (explicitRelation && explicitRelation.type === "relation" && explicitRelation.id !== entityID) {
65366         result.push({
65367           relation: explicitRelation,
65368           value: baseDisplayLabel(explicitRelation) + " " + explicitRelation.id
65369         });
65370       } else {
65371         context.history().intersects(context.map().extent()).forEach(function(entity) {
65372           if (entity.type !== "relation" || entity.id === entityID)
65373             return;
65374           var value = baseDisplayLabel(entity);
65375           if (q && (value + " " + entity.id).toLowerCase().indexOf(q.toLowerCase()) === -1)
65376             return;
65377           result.push({ relation: entity, value });
65378         });
65379         result.sort(function(a, b) {
65380           return osmRelation.creationOrder(a.relation, b.relation);
65381         });
65382         var dupeGroups = Object.values(utilArrayGroupBy(result, "value")).filter(function(v) {
65383           return v.length > 1;
65384         });
65385         dupeGroups.forEach(function(group) {
65386           group.forEach(function(obj) {
65387             obj.value += " " + obj.relation.id;
65388           });
65389         });
65390       }
65391       result.forEach(function(obj) {
65392         obj.title = obj.value;
65393       });
65394       result.unshift(newRelation);
65395       callback(result);
65396     }
65397     function renderDisclosureContent(selection2) {
65398       var memberships = getMemberships();
65399       var list = selection2.selectAll(".member-list").data([0]);
65400       list = list.enter().append("ul").attr("class", "member-list").merge(list);
65401       var items = list.selectAll("li.member-row-normal").data(memberships, function(d) {
65402         return d.hash;
65403       });
65404       items.exit().each(unbind).remove();
65405       var itemsEnter = items.enter().append("li").attr("class", "member-row member-row-normal form-field");
65406       itemsEnter.on("mouseover", function(d3_event, d) {
65407         utilHighlightEntities([d.relation.id], true, context);
65408       }).on("mouseout", function(d3_event, d) {
65409         utilHighlightEntities([d.relation.id], false, context);
65410       });
65411       var labelEnter = itemsEnter.append("label").attr("class", "field-label").attr("for", function(d) {
65412         return d.domId;
65413       });
65414       var labelLink = labelEnter.append("span").attr("class", "label-text").append("a").attr("href", "#").on("click", selectRelation);
65415       labelLink.append("span").attr("class", "member-entity-type").text(function(d) {
65416         var matched = _mainPresetIndex.match(d.relation, context.graph());
65417         return matched && matched.name() || _t.html("inspector.relation");
65418       });
65419       labelLink.append("span").attr("class", "member-entity-name").text(function(d) {
65420         return utilDisplayName(d.relation);
65421       });
65422       labelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", deleteMembership);
65423       labelEnter.append("button").attr("class", "member-zoom").attr("title", _t("icons.zoom_to")).call(svgIcon("#iD-icon-framed-dot", "monochrome")).on("click", zoomToRelation);
65424       var wrapEnter = itemsEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
65425       wrapEnter.append("input").attr("class", "member-role").attr("id", function(d) {
65426         return d.domId;
65427       }).property("type", "text").property("value", function(d) {
65428         return typeof d.role === "string" ? d.role : "";
65429       }).attr("title", function(d) {
65430         return Array.isArray(d.role) ? d.role.filter(Boolean).join("\n") : d.role;
65431       }).attr("placeholder", function(d) {
65432         return Array.isArray(d.role) ? _t("inspector.multiple_roles") : _t("inspector.role");
65433       }).classed("mixed", function(d) {
65434         return Array.isArray(d.role);
65435       }).call(utilNoAuto).on("blur", changeRole).on("change", changeRole);
65436       if (taginfo) {
65437         wrapEnter.each(bindTypeahead);
65438       }
65439       var newMembership = list.selectAll(".member-row-new").data(_showBlank ? [0] : []);
65440       newMembership.exit().remove();
65441       var newMembershipEnter = newMembership.enter().append("li").attr("class", "member-row member-row-new form-field");
65442       var newLabelEnter = newMembershipEnter.append("label").attr("class", "field-label");
65443       newLabelEnter.append("input").attr("placeholder", _t("inspector.choose_relation")).attr("type", "text").attr("class", "member-entity-input").call(utilNoAuto);
65444       newLabelEnter.append("button").attr("class", "remove member-delete").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete")).on("click", function() {
65445         list.selectAll(".member-row-new").remove();
65446       });
65447       var newWrapEnter = newMembershipEnter.append("div").attr("class", "form-field-input-wrap form-field-input-member");
65448       newWrapEnter.append("input").attr("class", "member-role").property("type", "text").attr("placeholder", _t("inspector.role")).call(utilNoAuto);
65449       newMembership = newMembership.merge(newMembershipEnter);
65450       newMembership.selectAll(".member-entity-input").on("blur", cancelEntity).call(
65451         nearbyCombo.on("accept", acceptEntity).on("cancel", cancelEntity)
65452       );
65453       var addRow = selection2.selectAll(".add-row").data([0]);
65454       var addRowEnter = addRow.enter().append("div").attr("class", "add-row");
65455       var addRelationButton = addRowEnter.append("button").attr("class", "add-relation").attr("aria-label", _t("inspector.add_to_relation"));
65456       addRelationButton.call(svgIcon("#iD-icon-plus", "light"));
65457       addRelationButton.call(uiTooltip().title(() => _t.append("inspector.add_to_relation")).placement(_mainLocalizer.textDirection() === "ltr" ? "right" : "left"));
65458       addRowEnter.append("div").attr("class", "space-value");
65459       addRowEnter.append("div").attr("class", "space-buttons");
65460       addRow = addRow.merge(addRowEnter);
65461       addRow.select(".add-relation").on("click", function() {
65462         _showBlank = true;
65463         section.reRender();
65464         list.selectAll(".member-entity-input").node().focus();
65465       });
65466       function acceptEntity(d) {
65467         if (!d) {
65468           cancelEntity();
65469           return;
65470         }
65471         if (d.relation)
65472           utilHighlightEntities([d.relation.id], false, context);
65473         var role = context.cleanRelationRole(list.selectAll(".member-row-new .member-role").property("value"));
65474         addMembership(d, role);
65475       }
65476       function cancelEntity() {
65477         var input = newMembership.selectAll(".member-entity-input");
65478         input.property("value", "");
65479         context.surface().selectAll(".highlighted").classed("highlighted", false);
65480       }
65481       function bindTypeahead(d) {
65482         var row = select_default2(this);
65483         var role = row.selectAll("input.member-role");
65484         var origValue = role.property("value");
65485         function sort(value, data) {
65486           var sameletter = [];
65487           var other = [];
65488           for (var i2 = 0; i2 < data.length; i2++) {
65489             if (data[i2].value.substring(0, value.length) === value) {
65490               sameletter.push(data[i2]);
65491             } else {
65492               other.push(data[i2]);
65493             }
65494           }
65495           return sameletter.concat(other);
65496         }
65497         role.call(
65498           uiCombobox(context, "member-role").fetcher(function(role2, callback) {
65499             var rtype = d.relation.tags.type;
65500             taginfo.roles({
65501               debounce: true,
65502               rtype: rtype || "",
65503               geometry: context.graph().geometry(_entityIDs[0]),
65504               query: role2
65505             }, function(err, data) {
65506               if (!err)
65507                 callback(sort(role2, data));
65508             });
65509           }).on("cancel", function() {
65510             role.property("value", origValue);
65511           })
65512         );
65513       }
65514       function unbind() {
65515         var row = select_default2(this);
65516         row.selectAll("input.member-role").call(uiCombobox.off, context);
65517       }
65518     }
65519     section.entityIDs = function(val) {
65520       if (!arguments.length)
65521         return _entityIDs;
65522       _entityIDs = val;
65523       _showBlank = false;
65524       return section;
65525     };
65526     return section;
65527   }
65528
65529   // modules/ui/sections/selection_list.js
65530   function uiSectionSelectionList(context) {
65531     var _selectedIDs = [];
65532     var section = uiSection("selected-features", context).shouldDisplay(function() {
65533       return _selectedIDs.length > 1;
65534     }).label(function() {
65535       return _t.append("inspector.title_count", { title: _t("inspector.features"), count: _selectedIDs.length });
65536     }).disclosureContent(renderDisclosureContent);
65537     context.history().on("change.selectionList", function(difference) {
65538       if (difference) {
65539         section.reRender();
65540       }
65541     });
65542     section.entityIDs = function(val) {
65543       if (!arguments.length)
65544         return _selectedIDs;
65545       _selectedIDs = val;
65546       return section;
65547     };
65548     function selectEntity(d3_event, entity) {
65549       context.enter(modeSelect(context, [entity.id]));
65550     }
65551     function deselectEntity(d3_event, entity) {
65552       var selectedIDs = _selectedIDs.slice();
65553       var index = selectedIDs.indexOf(entity.id);
65554       if (index > -1) {
65555         selectedIDs.splice(index, 1);
65556         context.enter(modeSelect(context, selectedIDs));
65557       }
65558     }
65559     function renderDisclosureContent(selection2) {
65560       var list = selection2.selectAll(".feature-list").data([0]);
65561       list = list.enter().append("ul").attr("class", "feature-list").merge(list);
65562       var entities = _selectedIDs.map(function(id2) {
65563         return context.hasEntity(id2);
65564       }).filter(Boolean);
65565       var items = list.selectAll(".feature-list-item").data(entities, osmEntity.key);
65566       items.exit().remove();
65567       var enter = items.enter().append("li").attr("class", "feature-list-item").each(function(d) {
65568         select_default2(this).on("mouseover", function() {
65569           utilHighlightEntities([d.id], true, context);
65570         }).on("mouseout", function() {
65571           utilHighlightEntities([d.id], false, context);
65572         });
65573       });
65574       var label = enter.append("button").attr("class", "label").on("click", selectEntity);
65575       label.append("span").attr("class", "entity-geom-icon").call(svgIcon("", "pre-text"));
65576       label.append("span").attr("class", "entity-type");
65577       label.append("span").attr("class", "entity-name");
65578       enter.append("button").attr("class", "close").attr("title", _t("icons.deselect")).on("click", deselectEntity).call(svgIcon("#iD-icon-close"));
65579       items = items.merge(enter);
65580       items.selectAll(".entity-geom-icon use").attr("href", function() {
65581         var entity = this.parentNode.parentNode.__data__;
65582         return "#iD-icon-" + entity.geometry(context.graph());
65583       });
65584       items.selectAll(".entity-type").text(function(entity) {
65585         return _mainPresetIndex.match(entity, context.graph()).name();
65586       });
65587       items.selectAll(".entity-name").text(function(d) {
65588         var entity = context.entity(d.id);
65589         return utilDisplayName(entity);
65590       });
65591     }
65592     return section;
65593   }
65594
65595   // modules/ui/entity_editor.js
65596   function uiEntityEditor(context) {
65597     var dispatch10 = dispatch_default("choose");
65598     var _state = "select";
65599     var _coalesceChanges = false;
65600     var _modified = false;
65601     var _base;
65602     var _entityIDs;
65603     var _activePresets = [];
65604     var _newFeature;
65605     var _sections;
65606     function entityEditor(selection2) {
65607       var combinedTags = utilCombinedTags(_entityIDs, context.graph());
65608       var header = selection2.selectAll(".header").data([0]);
65609       var headerEnter = header.enter().append("div").attr("class", "header fillL");
65610       var direction = _mainLocalizer.textDirection() === "rtl" ? "forward" : "backward";
65611       headerEnter.append("button").attr("class", "preset-reset preset-choose").attr("title", _t("inspector.back_tooltip")).call(svgIcon(`#iD-icon-${direction}`));
65612       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
65613         context.enter(modeBrowse(context));
65614       }).call(svgIcon(_modified ? "#iD-icon-apply" : "#iD-icon-close"));
65615       headerEnter.append("h2");
65616       header = header.merge(headerEnter);
65617       header.selectAll("h2").text("").call(_entityIDs.length === 1 ? _t.append("inspector.edit") : _t.append("inspector.edit_features"));
65618       header.selectAll(".preset-reset").on("click", function() {
65619         dispatch10.call("choose", this, _activePresets);
65620       });
65621       var body = selection2.selectAll(".inspector-body").data([0]);
65622       var bodyEnter = body.enter().append("div").attr("class", "entity-editor inspector-body sep-top");
65623       body = body.merge(bodyEnter);
65624       if (!_sections) {
65625         _sections = [
65626           uiSectionSelectionList(context),
65627           uiSectionFeatureType(context).on("choose", function(presets) {
65628             dispatch10.call("choose", this, presets);
65629           }),
65630           uiSectionEntityIssues(context),
65631           uiSectionPresetFields(context).on("change", changeTags).on("revert", revertTags),
65632           uiSectionRawTagEditor("raw-tag-editor", context).on("change", changeTags),
65633           uiSectionRawMemberEditor(context),
65634           uiSectionRawMembershipEditor(context)
65635         ];
65636       }
65637       _sections.forEach(function(section) {
65638         if (section.entityIDs) {
65639           section.entityIDs(_entityIDs);
65640         }
65641         if (section.presets) {
65642           section.presets(_activePresets);
65643         }
65644         if (section.tags) {
65645           section.tags(combinedTags);
65646         }
65647         if (section.state) {
65648           section.state(_state);
65649         }
65650         body.call(section.render);
65651       });
65652       context.history().on("change.entity-editor", historyChanged);
65653       function historyChanged(difference) {
65654         if (selection2.selectAll(".entity-editor").empty())
65655           return;
65656         if (_state === "hide")
65657           return;
65658         var significant = !difference || difference.didChange.properties || difference.didChange.addition || difference.didChange.deletion;
65659         if (!significant)
65660           return;
65661         _entityIDs = _entityIDs.filter(context.hasEntity);
65662         if (!_entityIDs.length)
65663           return;
65664         var priorActivePreset = _activePresets.length === 1 && _activePresets[0];
65665         loadActivePresets();
65666         var graph = context.graph();
65667         entityEditor.modified(_base !== graph);
65668         entityEditor(selection2);
65669         if (priorActivePreset && _activePresets.length === 1 && priorActivePreset !== _activePresets[0]) {
65670           context.container().selectAll(".entity-editor button.preset-reset .label").style("background-color", "#fff").transition().duration(750).style("background-color", null);
65671         }
65672       }
65673     }
65674     function changeTags(entityIDs, changed, onInput) {
65675       var actions = [];
65676       for (var i2 in entityIDs) {
65677         var entityID = entityIDs[i2];
65678         var entity = context.entity(entityID);
65679         var tags = Object.assign({}, entity.tags);
65680         if (typeof changed === "function") {
65681           tags = changed(tags);
65682         } else {
65683           for (var k in changed) {
65684             if (!k)
65685               continue;
65686             var v = changed[k];
65687             if (typeof v === "object") {
65688               tags[k] = tags[v.oldKey];
65689             } else if (v !== void 0 || tags.hasOwnProperty(k)) {
65690               tags[k] = v;
65691             }
65692           }
65693         }
65694         if (!onInput) {
65695           tags = utilCleanTags(tags);
65696         }
65697         if (!(0, import_fast_deep_equal10.default)(entity.tags, tags)) {
65698           actions.push(actionChangeTags(entityID, tags));
65699         }
65700       }
65701       if (actions.length) {
65702         var combinedAction = function(graph) {
65703           actions.forEach(function(action) {
65704             graph = action(graph);
65705           });
65706           return graph;
65707         };
65708         var annotation = _t("operations.change_tags.annotation");
65709         if (_coalesceChanges) {
65710           context.overwrite(combinedAction, annotation);
65711         } else {
65712           context.perform(combinedAction, annotation);
65713           _coalesceChanges = !!onInput;
65714         }
65715       }
65716       if (!onInput) {
65717         context.validator().validate();
65718       }
65719     }
65720     function revertTags(keys2) {
65721       var actions = [];
65722       for (var i2 in _entityIDs) {
65723         var entityID = _entityIDs[i2];
65724         var original = context.graph().base().entities[entityID];
65725         var changed = {};
65726         for (var j2 in keys2) {
65727           var key = keys2[j2];
65728           changed[key] = original ? original.tags[key] : void 0;
65729         }
65730         var entity = context.entity(entityID);
65731         var tags = Object.assign({}, entity.tags);
65732         for (var k in changed) {
65733           if (!k)
65734             continue;
65735           var v = changed[k];
65736           if (v !== void 0 || tags.hasOwnProperty(k)) {
65737             tags[k] = v;
65738           }
65739         }
65740         tags = utilCleanTags(tags);
65741         if (!(0, import_fast_deep_equal10.default)(entity.tags, tags)) {
65742           actions.push(actionChangeTags(entityID, tags));
65743         }
65744       }
65745       if (actions.length) {
65746         var combinedAction = function(graph) {
65747           actions.forEach(function(action) {
65748             graph = action(graph);
65749           });
65750           return graph;
65751         };
65752         var annotation = _t("operations.change_tags.annotation");
65753         if (_coalesceChanges) {
65754           context.overwrite(combinedAction, annotation);
65755         } else {
65756           context.perform(combinedAction, annotation);
65757           _coalesceChanges = false;
65758         }
65759       }
65760       context.validator().validate();
65761     }
65762     entityEditor.modified = function(val) {
65763       if (!arguments.length)
65764         return _modified;
65765       _modified = val;
65766       return entityEditor;
65767     };
65768     entityEditor.state = function(val) {
65769       if (!arguments.length)
65770         return _state;
65771       _state = val;
65772       return entityEditor;
65773     };
65774     entityEditor.entityIDs = function(val) {
65775       if (!arguments.length)
65776         return _entityIDs;
65777       _base = context.graph();
65778       _coalesceChanges = false;
65779       if (val && _entityIDs && utilArrayIdentical(_entityIDs, val))
65780         return entityEditor;
65781       _entityIDs = val;
65782       loadActivePresets(true);
65783       return entityEditor.modified(false);
65784     };
65785     entityEditor.newFeature = function(val) {
65786       if (!arguments.length)
65787         return _newFeature;
65788       _newFeature = val;
65789       return entityEditor;
65790     };
65791     function loadActivePresets(isForNewSelection) {
65792       var graph = context.graph();
65793       var counts = {};
65794       for (var i2 in _entityIDs) {
65795         var entity = graph.hasEntity(_entityIDs[i2]);
65796         if (!entity)
65797           return;
65798         var match = _mainPresetIndex.match(entity, graph);
65799         if (!counts[match.id])
65800           counts[match.id] = 0;
65801         counts[match.id] += 1;
65802       }
65803       var matches = Object.keys(counts).sort(function(p1, p2) {
65804         return counts[p2] - counts[p1];
65805       }).map(function(pID) {
65806         return _mainPresetIndex.item(pID);
65807       });
65808       if (!isForNewSelection) {
65809         var weakPreset = _activePresets.length === 1 && !_activePresets[0].isFallback() && Object.keys(_activePresets[0].addTags || {}).length === 0;
65810         if (weakPreset && matches.length === 1 && matches[0].isFallback())
65811           return;
65812       }
65813       entityEditor.presets(matches);
65814     }
65815     entityEditor.presets = function(val) {
65816       if (!arguments.length)
65817         return _activePresets;
65818       if (!utilArrayIdentical(val, _activePresets)) {
65819         _activePresets = val;
65820       }
65821       return entityEditor;
65822     };
65823     return utilRebind(entityEditor, dispatch10, "on");
65824   }
65825
65826   // modules/ui/feature_list.js
65827   var sexagesimal = __toESM(require_sexagesimal());
65828   function uiFeatureList(context) {
65829     var _geocodeResults;
65830     function featureList(selection2) {
65831       var header = selection2.append("div").attr("class", "header fillL");
65832       header.append("h2").call(_t.append("inspector.feature_list"));
65833       var searchWrap = selection2.append("div").attr("class", "search-header");
65834       searchWrap.call(svgIcon("#iD-icon-search", "pre-text"));
65835       var search = searchWrap.append("input").attr("placeholder", _t("inspector.search")).attr("type", "search").call(utilNoAuto).on("keypress", keypress).on("keydown", keydown).on("input", inputevent);
65836       var listWrap = selection2.append("div").attr("class", "inspector-body");
65837       var list = listWrap.append("div").attr("class", "feature-list");
65838       context.on("exit.feature-list", clearSearch);
65839       context.map().on("drawn.feature-list", mapDrawn);
65840       context.keybinding().on(uiCmd("\u2318F"), focusSearch);
65841       function focusSearch(d3_event) {
65842         var mode = context.mode() && context.mode().id;
65843         if (mode !== "browse")
65844           return;
65845         d3_event.preventDefault();
65846         search.node().focus();
65847       }
65848       function keydown(d3_event) {
65849         if (d3_event.keyCode === 27) {
65850           search.node().blur();
65851         }
65852       }
65853       function keypress(d3_event) {
65854         var q = search.property("value"), items = list.selectAll(".feature-list-item");
65855         if (d3_event.keyCode === 13 && // ↩ Return
65856         q.length && items.size()) {
65857           click(d3_event, items.datum());
65858         }
65859       }
65860       function inputevent() {
65861         _geocodeResults = void 0;
65862         drawList();
65863       }
65864       function clearSearch() {
65865         search.property("value", "");
65866         drawList();
65867       }
65868       function mapDrawn(e) {
65869         if (e.full) {
65870           drawList();
65871         }
65872       }
65873       function features() {
65874         var result = [];
65875         var graph = context.graph();
65876         var visibleCenter = context.map().extent().center();
65877         var q = search.property("value").toLowerCase();
65878         if (!q)
65879           return result;
65880         var locationMatch = sexagesimal.pair(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
65881         if (locationMatch) {
65882           var loc = [Number(locationMatch[0]), Number(locationMatch[1])];
65883           result.push({
65884             id: -1,
65885             geometry: "point",
65886             type: _t("inspector.location"),
65887             name: dmsCoordinatePair([loc[1], loc[0]]),
65888             location: loc
65889           });
65890         }
65891         var idMatch = !locationMatch && q.match(/(?:^|\W)(node|way|relation|[nwr])\W{0,2}0*([1-9]\d*)(?:\W|$)/i);
65892         if (idMatch) {
65893           var elemType = idMatch[1].charAt(0);
65894           var elemId = idMatch[2];
65895           result.push({
65896             id: elemType + elemId,
65897             geometry: elemType === "n" ? "point" : elemType === "w" ? "line" : "relation",
65898             type: elemType === "n" ? _t("inspector.node") : elemType === "w" ? _t("inspector.way") : _t("inspector.relation"),
65899             name: elemId
65900           });
65901         }
65902         var allEntities = graph.entities;
65903         var localResults = [];
65904         for (var id2 in allEntities) {
65905           var entity = allEntities[id2];
65906           if (!entity)
65907             continue;
65908           var name = utilDisplayName(entity) || "";
65909           if (name.toLowerCase().indexOf(q) < 0)
65910             continue;
65911           var matched = _mainPresetIndex.match(entity, graph);
65912           var type2 = matched && matched.name() || utilDisplayType(entity.id);
65913           var extent = entity.extent(graph);
65914           var distance = extent ? geoSphericalDistance(visibleCenter, extent.center()) : 0;
65915           localResults.push({
65916             id: entity.id,
65917             entity,
65918             geometry: entity.geometry(graph),
65919             type: type2,
65920             name,
65921             distance
65922           });
65923           if (localResults.length > 100)
65924             break;
65925         }
65926         localResults = localResults.sort(function byDistance(a, b) {
65927           return a.distance - b.distance;
65928         });
65929         result = result.concat(localResults);
65930         (_geocodeResults || []).forEach(function(d) {
65931           if (d.osm_type && d.osm_id) {
65932             var id3 = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
65933             var tags = {};
65934             tags[d.class] = d.type;
65935             var attrs = { id: id3, type: d.osm_type, tags };
65936             if (d.osm_type === "way") {
65937               attrs.nodes = ["a", "a"];
65938             }
65939             var tempEntity = osmEntity(attrs);
65940             var tempGraph = coreGraph([tempEntity]);
65941             var matched2 = _mainPresetIndex.match(tempEntity, tempGraph);
65942             var type3 = matched2 && matched2.name() || utilDisplayType(id3);
65943             result.push({
65944               id: tempEntity.id,
65945               geometry: tempEntity.geometry(tempGraph),
65946               type: type3,
65947               name: d.display_name,
65948               extent: new geoExtent(
65949                 [Number(d.boundingbox[3]), Number(d.boundingbox[0])],
65950                 [Number(d.boundingbox[2]), Number(d.boundingbox[1])]
65951               )
65952             });
65953           }
65954         });
65955         if (q.match(/^[0-9]+$/)) {
65956           result.push({
65957             id: "n" + q,
65958             geometry: "point",
65959             type: _t("inspector.node"),
65960             name: q
65961           });
65962           result.push({
65963             id: "w" + q,
65964             geometry: "line",
65965             type: _t("inspector.way"),
65966             name: q
65967           });
65968           result.push({
65969             id: "r" + q,
65970             geometry: "relation",
65971             type: _t("inspector.relation"),
65972             name: q
65973           });
65974         }
65975         return result;
65976       }
65977       function drawList() {
65978         var value = search.property("value");
65979         var results = features();
65980         list.classed("filtered", value.length);
65981         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"));
65982         resultsIndicator.append("span").attr("class", "entity-name");
65983         list.selectAll(".no-results-item .entity-name").html("").call(_t.append("geocoder.no_results_worldwide"));
65984         if (services.geocoder) {
65985           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"));
65986         }
65987         list.selectAll(".no-results-item").style("display", value.length && !results.length ? "block" : "none");
65988         list.selectAll(".geocode-item").style("display", value && _geocodeResults === void 0 ? "block" : "none");
65989         list.selectAll(".feature-list-item").data([-1]).remove();
65990         var items = list.selectAll(".feature-list-item").data(results, function(d) {
65991           return d.id;
65992         });
65993         var enter = items.enter().insert("button", ".geocode-item").attr("class", "feature-list-item").on("mouseover", mouseover).on("mouseout", mouseout).on("click", click);
65994         var label = enter.append("div").attr("class", "label");
65995         label.each(function(d) {
65996           select_default2(this).call(svgIcon("#iD-icon-" + d.geometry, "pre-text"));
65997         });
65998         label.append("span").attr("class", "entity-type").text(function(d) {
65999           return d.type;
66000         });
66001         label.append("span").attr("class", "entity-name").text(function(d) {
66002           return d.name;
66003         });
66004         enter.style("opacity", 0).transition().style("opacity", 1);
66005         items.order();
66006         items.exit().remove();
66007       }
66008       function mouseover(d3_event, d) {
66009         if (d.id === -1)
66010           return;
66011         utilHighlightEntities([d.id], true, context);
66012       }
66013       function mouseout(d3_event, d) {
66014         if (d.id === -1)
66015           return;
66016         utilHighlightEntities([d.id], false, context);
66017       }
66018       function click(d3_event, d) {
66019         d3_event.preventDefault();
66020         if (d.location) {
66021           context.map().centerZoomEase([d.location[1], d.location[0]], 19);
66022         } else if (d.entity) {
66023           utilHighlightEntities([d.id], false, context);
66024           context.enter(modeSelect(context, [d.entity.id]));
66025           context.map().zoomToEase(d.entity);
66026         } else {
66027           context.zoomToEntity(d.id);
66028         }
66029       }
66030       function geocoderSearch() {
66031         services.geocoder.search(search.property("value"), function(err, resp) {
66032           _geocodeResults = resp || [];
66033           drawList();
66034         });
66035       }
66036     }
66037     return featureList;
66038   }
66039
66040   // modules/ui/improveOSM_comments.js
66041   function uiImproveOsmComments() {
66042     let _qaItem;
66043     function issueComments(selection2) {
66044       let comments = selection2.selectAll(".comments-container").data([0]);
66045       comments = comments.enter().append("div").attr("class", "comments-container").merge(comments);
66046       services.improveOSM.getComments(_qaItem).then((d) => {
66047         if (!d.comments)
66048           return;
66049         const commentEnter = comments.selectAll(".comment").data(d.comments).enter().append("div").attr("class", "comment");
66050         commentEnter.append("div").attr("class", "comment-avatar").call(svgIcon("#iD-icon-avatar", "comment-avatar-icon"));
66051         const mainEnter = commentEnter.append("div").attr("class", "comment-main");
66052         const metadataEnter = mainEnter.append("div").attr("class", "comment-metadata");
66053         metadataEnter.append("div").attr("class", "comment-author").each(function(d2) {
66054           const osm = services.osm;
66055           let selection3 = select_default2(this);
66056           if (osm && d2.username) {
66057             selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d2.username)).attr("target", "_blank");
66058           }
66059           selection3.text((d4) => d4.username);
66060         });
66061         metadataEnter.append("div").attr("class", "comment-date").html((d2) => _t.html("note.status.commented", { when: localeDateString2(d2.timestamp) }));
66062         mainEnter.append("div").attr("class", "comment-text").append("p").text((d2) => d2.text);
66063       }).catch((err) => {
66064         console.log(err);
66065       });
66066     }
66067     function localeDateString2(s) {
66068       if (!s)
66069         return null;
66070       const options2 = { day: "numeric", month: "short", year: "numeric" };
66071       const d = new Date(s * 1e3);
66072       if (isNaN(d.getTime()))
66073         return null;
66074       return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
66075     }
66076     issueComments.issue = function(val) {
66077       if (!arguments.length)
66078         return _qaItem;
66079       _qaItem = val;
66080       return issueComments;
66081     };
66082     return issueComments;
66083   }
66084
66085   // modules/ui/improveOSM_details.js
66086   function uiImproveOsmDetails(context) {
66087     let _qaItem;
66088     function issueDetail(d) {
66089       if (d.desc)
66090         return d.desc;
66091       const issueKey = d.issueKey;
66092       d.replacements = d.replacements || {};
66093       d.replacements.default = { html: _t.html("inspector.unknown") };
66094       return _t.html(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements);
66095     }
66096     function improveOsmDetails(selection2) {
66097       const details = selection2.selectAll(".error-details").data(
66098         _qaItem ? [_qaItem] : [],
66099         (d) => `${d.id}-${d.status || 0}`
66100       );
66101       details.exit().remove();
66102       const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
66103       const descriptionEnter = detailsEnter.append("div").attr("class", "qa-details-subsection");
66104       descriptionEnter.append("h4").call(_t.append("QA.keepRight.detail_description"));
66105       descriptionEnter.append("div").attr("class", "qa-details-description-text").html(issueDetail);
66106       let relatedEntities = [];
66107       descriptionEnter.selectAll(".error_entity_link, .error_object_link").attr("href", "#").each(function() {
66108         const link2 = select_default2(this);
66109         const isObjectLink = link2.classed("error_object_link");
66110         const entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
66111         const entity = context.hasEntity(entityID);
66112         relatedEntities.push(entityID);
66113         link2.on("mouseenter", () => {
66114           utilHighlightEntities([entityID], true, context);
66115         }).on("mouseleave", () => {
66116           utilHighlightEntities([entityID], false, context);
66117         }).on("click", (d3_event) => {
66118           d3_event.preventDefault();
66119           utilHighlightEntities([entityID], false, context);
66120           const osmlayer = context.layers().layer("osm");
66121           if (!osmlayer.enabled()) {
66122             osmlayer.enabled(true);
66123           }
66124           context.map().centerZoom(_qaItem.loc, 20);
66125           if (entity) {
66126             context.enter(modeSelect(context, [entityID]));
66127           } else {
66128             context.loadEntity(entityID, (err, result) => {
66129               if (err)
66130                 return;
66131               const entity2 = result.data.find((e) => e.id === entityID);
66132               if (entity2)
66133                 context.enter(modeSelect(context, [entityID]));
66134             });
66135           }
66136         });
66137         if (entity) {
66138           let name = utilDisplayName(entity);
66139           if (!name && !isObjectLink) {
66140             const preset = _mainPresetIndex.match(entity, context.graph());
66141             name = preset && !preset.isFallback() && preset.name();
66142           }
66143           if (name) {
66144             this.innerText = name;
66145           }
66146         }
66147       });
66148       context.features().forceVisible(relatedEntities);
66149       context.map().pan([0, 0]);
66150     }
66151     improveOsmDetails.issue = function(val) {
66152       if (!arguments.length)
66153         return _qaItem;
66154       _qaItem = val;
66155       return improveOsmDetails;
66156     };
66157     return improveOsmDetails;
66158   }
66159
66160   // modules/ui/improveOSM_header.js
66161   function uiImproveOsmHeader() {
66162     let _qaItem;
66163     function issueTitle(d) {
66164       const issueKey = d.issueKey;
66165       d.replacements = d.replacements || {};
66166       d.replacements.default = { html: _t.html("inspector.unknown") };
66167       return _t.html(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements);
66168     }
66169     function improveOsmHeader(selection2) {
66170       const header = selection2.selectAll(".qa-header").data(
66171         _qaItem ? [_qaItem] : [],
66172         (d) => `${d.id}-${d.status || 0}`
66173       );
66174       header.exit().remove();
66175       const headerEnter = header.enter().append("div").attr("class", "qa-header");
66176       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}`);
66177       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");
66178       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 : "");
66179       headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle);
66180     }
66181     improveOsmHeader.issue = function(val) {
66182       if (!arguments.length)
66183         return _qaItem;
66184       _qaItem = val;
66185       return improveOsmHeader;
66186     };
66187     return improveOsmHeader;
66188   }
66189
66190   // modules/ui/improveOSM_editor.js
66191   function uiImproveOsmEditor(context) {
66192     const dispatch10 = dispatch_default("change");
66193     const qaDetails = uiImproveOsmDetails(context);
66194     const qaComments = uiImproveOsmComments(context);
66195     const qaHeader = uiImproveOsmHeader(context);
66196     let _qaItem;
66197     function improveOsmEditor(selection2) {
66198       const headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
66199       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
66200       headerEnter.append("h2").call(_t.append("QA.improveOSM.title"));
66201       let body = selection2.selectAll(".body").data([0]);
66202       body = body.enter().append("div").attr("class", "body").merge(body);
66203       const editor = body.selectAll(".qa-editor").data([0]);
66204       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);
66205     }
66206     function improveOsmSaveSection(selection2) {
66207       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
66208       const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
66209       let saveSection = selection2.selectAll(".qa-save").data(
66210         isShown ? [_qaItem] : [],
66211         (d) => `${d.id}-${d.status || 0}`
66212       );
66213       saveSection.exit().remove();
66214       const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
66215       saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("note.newComment"));
66216       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);
66217       saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
66218       function changeInput() {
66219         const input = select_default2(this);
66220         let val = input.property("value").trim();
66221         if (val === "") {
66222           val = void 0;
66223         }
66224         _qaItem = _qaItem.update({ newComment: val });
66225         const qaService = services.improveOSM;
66226         if (qaService) {
66227           qaService.replaceItem(_qaItem);
66228         }
66229         saveSection.call(qaSaveButtons);
66230       }
66231     }
66232     function qaSaveButtons(selection2) {
66233       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
66234       let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
66235       buttonSection.exit().remove();
66236       const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
66237       buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment"));
66238       buttonEnter.append("button").attr("class", "button close-button action");
66239       buttonEnter.append("button").attr("class", "button ignore-button action");
66240       buttonSection = buttonSection.merge(buttonEnter);
66241       buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) {
66242         this.blur();
66243         const qaService = services.improveOSM;
66244         if (qaService) {
66245           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66246         }
66247       });
66248       buttonSection.select(".close-button").html((d) => {
66249         const andComment = d.newComment ? "_comment" : "";
66250         return _t.html(`QA.keepRight.close${andComment}`);
66251       }).on("click.close", function(d3_event, d) {
66252         this.blur();
66253         const qaService = services.improveOSM;
66254         if (qaService) {
66255           d.newStatus = "SOLVED";
66256           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66257         }
66258       });
66259       buttonSection.select(".ignore-button").html((d) => {
66260         const andComment = d.newComment ? "_comment" : "";
66261         return _t.html(`QA.keepRight.ignore${andComment}`);
66262       }).on("click.ignore", function(d3_event, d) {
66263         this.blur();
66264         const qaService = services.improveOSM;
66265         if (qaService) {
66266           d.newStatus = "INVALID";
66267           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66268         }
66269       });
66270     }
66271     improveOsmEditor.error = function(val) {
66272       if (!arguments.length)
66273         return _qaItem;
66274       _qaItem = val;
66275       return improveOsmEditor;
66276     };
66277     return utilRebind(improveOsmEditor, dispatch10, "on");
66278   }
66279
66280   // modules/ui/preset_list.js
66281   function uiPresetList(context) {
66282     var dispatch10 = dispatch_default("cancel", "choose");
66283     var _entityIDs;
66284     var _currLoc;
66285     var _currentPresets;
66286     var _autofocus = false;
66287     function presetList(selection2) {
66288       if (!_entityIDs)
66289         return;
66290       var presets = _mainPresetIndex.matchAllGeometry(entityGeometries());
66291       selection2.html("");
66292       var messagewrap = selection2.append("div").attr("class", "header fillL");
66293       var message = messagewrap.append("h2").call(_t.append("inspector.choose"));
66294       var direction = _mainLocalizer.textDirection() === "rtl" ? "backward" : "forward";
66295       messagewrap.append("button").attr("class", "preset-choose").attr("title", _entityIDs.length === 1 ? _t("inspector.edit") : _t("inspector.edit_features")).on("click", function() {
66296         dispatch10.call("cancel", this);
66297       }).call(svgIcon(`#iD-icon-${direction}`));
66298       function initialKeydown(d3_event) {
66299         if (search.property("value").length === 0 && (d3_event.keyCode === utilKeybinding.keyCodes["\u232B"] || d3_event.keyCode === utilKeybinding.keyCodes["\u2326"])) {
66300           d3_event.preventDefault();
66301           d3_event.stopPropagation();
66302           operationDelete(context, _entityIDs)();
66303         } else if (search.property("value").length === 0 && (d3_event.ctrlKey || d3_event.metaKey) && d3_event.keyCode === utilKeybinding.keyCodes.z) {
66304           d3_event.preventDefault();
66305           d3_event.stopPropagation();
66306           context.undo();
66307         } else if (!d3_event.ctrlKey && !d3_event.metaKey) {
66308           select_default2(this).on("keydown", keydown);
66309           keydown.call(this, d3_event);
66310         }
66311       }
66312       function keydown(d3_event) {
66313         if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"] && // if insertion point is at the end of the string
66314         search.node().selectionStart === search.property("value").length) {
66315           d3_event.preventDefault();
66316           d3_event.stopPropagation();
66317           var buttons = list.selectAll(".preset-list-button");
66318           if (!buttons.empty())
66319             buttons.nodes()[0].focus();
66320         }
66321       }
66322       function keypress(d3_event) {
66323         var value = search.property("value");
66324         if (d3_event.keyCode === 13 && // ↩ Return
66325         value.length) {
66326           list.selectAll(".preset-list-item:first-child").each(function(d) {
66327             d.choose.call(this);
66328           });
66329         }
66330       }
66331       function inputevent() {
66332         var value = search.property("value");
66333         list.classed("filtered", value.length);
66334         var results, messageText;
66335         if (value.length) {
66336           results = presets.search(value, entityGeometries()[0], _currLoc);
66337           messageText = _t.html("inspector.results", {
66338             n: results.collection.length,
66339             search: value
66340           });
66341         } else {
66342           var entityPresets2 = _entityIDs.map((entityID) => _mainPresetIndex.match(context.graph().entity(entityID), context.graph()));
66343           results = _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc, entityPresets2);
66344           messageText = _t.html("inspector.choose");
66345         }
66346         list.call(drawList, results);
66347         message.html(messageText);
66348       }
66349       var searchWrap = selection2.append("div").attr("class", "search-header");
66350       searchWrap.call(svgIcon("#iD-icon-search", "pre-text"));
66351       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));
66352       if (_autofocus) {
66353         search.node().focus();
66354         setTimeout(function() {
66355           search.node().focus();
66356         }, 0);
66357       }
66358       var listWrap = selection2.append("div").attr("class", "inspector-body");
66359       var entityPresets = _entityIDs.map((entityID) => _mainPresetIndex.match(context.graph().entity(entityID), context.graph()));
66360       var list = listWrap.append("div").attr("class", "preset-list").call(drawList, _mainPresetIndex.defaults(entityGeometries()[0], 36, !context.inIntro(), _currLoc, entityPresets));
66361       context.features().on("change.preset-list", updateForFeatureHiddenState);
66362     }
66363     function drawList(list, presets) {
66364       presets = presets.matchAllGeometry(entityGeometries());
66365       var collection = presets.collection.reduce(function(collection2, preset) {
66366         if (!preset)
66367           return collection2;
66368         if (preset.members) {
66369           if (preset.members.collection.filter(function(preset2) {
66370             return preset2.addable();
66371           }).length > 1) {
66372             collection2.push(CategoryItem(preset));
66373           }
66374         } else if (preset.addable()) {
66375           collection2.push(PresetItem(preset));
66376         }
66377         return collection2;
66378       }, []);
66379       var items = list.selectAll(".preset-list-item").data(collection, function(d) {
66380         return d.preset.id;
66381       });
66382       items.order();
66383       items.exit().remove();
66384       items.enter().append("div").attr("class", function(item) {
66385         return "preset-list-item preset-" + item.preset.id.replace("/", "-");
66386       }).classed("current", function(item) {
66387         return _currentPresets.indexOf(item.preset) !== -1;
66388       }).each(function(item) {
66389         select_default2(this).call(item);
66390       }).style("opacity", 0).transition().style("opacity", 1);
66391       updateForFeatureHiddenState();
66392     }
66393     function itemKeydown(d3_event) {
66394       var item = select_default2(this.closest(".preset-list-item"));
66395       var parentItem = select_default2(item.node().parentNode.closest(".preset-list-item"));
66396       if (d3_event.keyCode === utilKeybinding.keyCodes["\u2193"]) {
66397         d3_event.preventDefault();
66398         d3_event.stopPropagation();
66399         var nextItem = select_default2(item.node().nextElementSibling);
66400         if (nextItem.empty()) {
66401           if (!parentItem.empty()) {
66402             nextItem = select_default2(parentItem.node().nextElementSibling);
66403           }
66404         } else if (select_default2(this).classed("expanded")) {
66405           nextItem = item.select(".subgrid .preset-list-item:first-child");
66406         }
66407         if (!nextItem.empty()) {
66408           nextItem.select(".preset-list-button").node().focus();
66409         }
66410       } else if (d3_event.keyCode === utilKeybinding.keyCodes["\u2191"]) {
66411         d3_event.preventDefault();
66412         d3_event.stopPropagation();
66413         var previousItem = select_default2(item.node().previousElementSibling);
66414         if (previousItem.empty()) {
66415           if (!parentItem.empty()) {
66416             previousItem = parentItem;
66417           }
66418         } else if (previousItem.select(".preset-list-button").classed("expanded")) {
66419           previousItem = previousItem.select(".subgrid .preset-list-item:last-child");
66420         }
66421         if (!previousItem.empty()) {
66422           previousItem.select(".preset-list-button").node().focus();
66423         } else {
66424           var search = select_default2(this.closest(".preset-list-pane")).select(".preset-search-input");
66425           search.node().focus();
66426         }
66427       } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2192" : "\u2190"]) {
66428         d3_event.preventDefault();
66429         d3_event.stopPropagation();
66430         if (!parentItem.empty()) {
66431           parentItem.select(".preset-list-button").node().focus();
66432         }
66433       } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2190" : "\u2192"]) {
66434         d3_event.preventDefault();
66435         d3_event.stopPropagation();
66436         item.datum().choose.call(select_default2(this).node());
66437       }
66438     }
66439     function CategoryItem(preset) {
66440       var box, sublist, shown = false;
66441       function item(selection2) {
66442         var wrap2 = selection2.append("div").attr("class", "preset-list-button-wrap category");
66443         function click() {
66444           var isExpanded = select_default2(this).classed("expanded");
66445           var iconName = isExpanded ? _mainLocalizer.textDirection() === "rtl" ? "#iD-icon-backward" : "#iD-icon-forward" : "#iD-icon-down";
66446           select_default2(this).classed("expanded", !isExpanded).attr("title", !isExpanded ? _t("icons.collapse") : _t("icons.expand"));
66447           select_default2(this).selectAll("div.label-inner svg.icon use").attr("href", iconName);
66448           item.choose();
66449         }
66450         var geometries = entityGeometries();
66451         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) {
66452           if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2190" : "\u2192"]) {
66453             d3_event.preventDefault();
66454             d3_event.stopPropagation();
66455             if (!select_default2(this).classed("expanded")) {
66456               click.call(this, d3_event);
66457             }
66458           } else if (d3_event.keyCode === utilKeybinding.keyCodes[_mainLocalizer.textDirection() === "rtl" ? "\u2192" : "\u2190"]) {
66459             d3_event.preventDefault();
66460             d3_event.stopPropagation();
66461             if (select_default2(this).classed("expanded")) {
66462               click.call(this, d3_event);
66463             }
66464           } else {
66465             itemKeydown.call(this, d3_event);
66466           }
66467         });
66468         var label = button.append("div").attr("class", "label").append("div").attr("class", "label-inner");
66469         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");
66470         box = selection2.append("div").attr("class", "subgrid").style("max-height", "0px").style("opacity", 0);
66471         box.append("div").attr("class", "arrow");
66472         sublist = box.append("div").attr("class", "preset-list fillL3");
66473       }
66474       item.choose = function() {
66475         if (!box || !sublist)
66476           return;
66477         if (shown) {
66478           shown = false;
66479           box.transition().duration(200).style("opacity", "0").style("max-height", "0px").style("padding-bottom", "0px");
66480         } else {
66481           shown = true;
66482           var members = preset.members.matchAllGeometry(entityGeometries());
66483           sublist.call(drawList, members);
66484           box.transition().duration(200).style("opacity", "1").style("max-height", 200 + members.collection.length * 190 + "px").style("padding-bottom", "10px");
66485         }
66486       };
66487       item.preset = preset;
66488       return item;
66489     }
66490     function PresetItem(preset) {
66491       function item(selection2) {
66492         var wrap2 = selection2.append("div").attr("class", "preset-list-button-wrap");
66493         var geometries = entityGeometries();
66494         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);
66495         var label = button.append("div").attr("class", "label").append("div").attr("class", "label-inner");
66496         var nameparts = [
66497           preset.nameLabel(),
66498           preset.subtitleLabel()
66499         ].filter(Boolean);
66500         label.selectAll(".namepart").data(nameparts, (d) => d.stringId).enter().append("div").attr("class", "namepart").text("").each(function(d) {
66501           d(select_default2(this));
66502         });
66503         wrap2.call(item.reference.button);
66504         selection2.call(item.reference.body);
66505       }
66506       item.choose = function() {
66507         if (select_default2(this).classed("disabled"))
66508           return;
66509         if (!context.inIntro()) {
66510           _mainPresetIndex.setMostRecent(preset, entityGeometries()[0]);
66511         }
66512         context.perform(
66513           function(graph) {
66514             for (var i2 in _entityIDs) {
66515               var entityID = _entityIDs[i2];
66516               var oldPreset = _mainPresetIndex.match(graph.entity(entityID), graph);
66517               graph = actionChangePreset(entityID, oldPreset, preset)(graph);
66518             }
66519             return graph;
66520           },
66521           _t("operations.change_tags.annotation")
66522         );
66523         context.validator().validate();
66524         dispatch10.call("choose", this, preset);
66525       };
66526       item.help = function(d3_event) {
66527         d3_event.stopPropagation();
66528         item.reference.toggle();
66529       };
66530       item.preset = preset;
66531       item.reference = uiTagReference(preset.reference(), context);
66532       return item;
66533     }
66534     function updateForFeatureHiddenState() {
66535       if (!_entityIDs.every(context.hasEntity))
66536         return;
66537       var geometries = entityGeometries();
66538       var button = context.container().selectAll(".preset-list .preset-list-button");
66539       button.call(uiTooltip().destroyAny);
66540       button.each(function(item, index) {
66541         var hiddenPresetFeaturesId;
66542         for (var i2 in geometries) {
66543           hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometries[i2]);
66544           if (hiddenPresetFeaturesId)
66545             break;
66546         }
66547         var isHiddenPreset = !context.inIntro() && !!hiddenPresetFeaturesId && (_currentPresets.length !== 1 || item.preset !== _currentPresets[0]);
66548         select_default2(this).classed("disabled", isHiddenPreset);
66549         if (isHiddenPreset) {
66550           var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
66551           select_default2(this).call(
66552             uiTooltip().title(() => _t.append("inspector.hidden_preset." + (isAutoHidden ? "zoom" : "manual"), {
66553               features: _t("feature." + hiddenPresetFeaturesId + ".description")
66554             })).placement(index < 2 ? "bottom" : "top")
66555           );
66556         }
66557       });
66558     }
66559     presetList.autofocus = function(val) {
66560       if (!arguments.length)
66561         return _autofocus;
66562       _autofocus = val;
66563       return presetList;
66564     };
66565     presetList.entityIDs = function(val) {
66566       if (!arguments.length)
66567         return _entityIDs;
66568       _entityIDs = val;
66569       _currLoc = null;
66570       if (_entityIDs && _entityIDs.length) {
66571         const extent = _entityIDs.reduce(function(extent2, entityID) {
66572           var entity = context.graph().entity(entityID);
66573           return extent2.extend(entity.extent(context.graph()));
66574         }, geoExtent());
66575         _currLoc = extent.center();
66576         var presets = _entityIDs.map(function(entityID) {
66577           return _mainPresetIndex.match(context.entity(entityID), context.graph());
66578         });
66579         presetList.presets(presets);
66580       }
66581       return presetList;
66582     };
66583     presetList.presets = function(val) {
66584       if (!arguments.length)
66585         return _currentPresets;
66586       _currentPresets = val;
66587       return presetList;
66588     };
66589     function entityGeometries() {
66590       var counts = {};
66591       for (var i2 in _entityIDs) {
66592         var entityID = _entityIDs[i2];
66593         var entity = context.entity(entityID);
66594         var geometry = entity.geometry(context.graph());
66595         if (geometry === "vertex" && entity.isOnAddressLine(context.graph())) {
66596           geometry = "point";
66597         }
66598         if (!counts[geometry])
66599           counts[geometry] = 0;
66600         counts[geometry] += 1;
66601       }
66602       return Object.keys(counts).sort(function(geom1, geom2) {
66603         return counts[geom2] - counts[geom1];
66604       });
66605     }
66606     return utilRebind(presetList, dispatch10, "on");
66607   }
66608
66609   // modules/ui/view_on_osm.js
66610   function uiViewOnOSM(context) {
66611     var _what;
66612     function viewOnOSM(selection2) {
66613       var url;
66614       if (_what instanceof osmEntity) {
66615         url = context.connection().entityURL(_what);
66616       } else if (_what instanceof osmNote) {
66617         url = context.connection().noteURL(_what);
66618       }
66619       var data = !_what || _what.isNew() ? [] : [_what];
66620       var link2 = selection2.selectAll(".view-on-osm").data(data, function(d) {
66621         return d.id;
66622       });
66623       link2.exit().remove();
66624       var linkEnter = link2.enter().append("a").attr("class", "view-on-osm").attr("target", "_blank").attr("href", url).call(svgIcon("#iD-icon-out-link", "inline"));
66625       linkEnter.append("span").call(_t.append("inspector.view_on_osm"));
66626     }
66627     viewOnOSM.what = function(_) {
66628       if (!arguments.length)
66629         return _what;
66630       _what = _;
66631       return viewOnOSM;
66632     };
66633     return viewOnOSM;
66634   }
66635
66636   // modules/ui/inspector.js
66637   function uiInspector(context) {
66638     var presetList = uiPresetList(context);
66639     var entityEditor = uiEntityEditor(context);
66640     var wrap2 = select_default2(null), presetPane = select_default2(null), editorPane = select_default2(null);
66641     var _state = "select";
66642     var _entityIDs;
66643     var _newFeature = false;
66644     function inspector(selection2) {
66645       presetList.entityIDs(_entityIDs).autofocus(_newFeature).on("choose", inspector.setPreset).on("cancel", function() {
66646         inspector.setPreset();
66647       });
66648       entityEditor.state(_state).entityIDs(_entityIDs).on("choose", inspector.showList);
66649       wrap2 = selection2.selectAll(".panewrap").data([0]);
66650       var enter = wrap2.enter().append("div").attr("class", "panewrap");
66651       enter.append("div").attr("class", "preset-list-pane pane");
66652       enter.append("div").attr("class", "entity-editor-pane pane");
66653       wrap2 = wrap2.merge(enter);
66654       presetPane = wrap2.selectAll(".preset-list-pane");
66655       editorPane = wrap2.selectAll(".entity-editor-pane");
66656       function shouldDefaultToPresetList() {
66657         if (_state !== "select")
66658           return false;
66659         if (_entityIDs.length !== 1)
66660           return false;
66661         var entityID = _entityIDs[0];
66662         var entity = context.hasEntity(entityID);
66663         if (!entity)
66664           return false;
66665         if (entity.hasNonGeometryTags())
66666           return false;
66667         if (_newFeature)
66668           return true;
66669         if (entity.geometry(context.graph()) !== "vertex")
66670           return false;
66671         if (context.graph().parentRelations(entity).length)
66672           return false;
66673         if (context.validator().getEntityIssues(entityID).length)
66674           return false;
66675         if (entity.isHighwayIntersection(context.graph()))
66676           return false;
66677         return true;
66678       }
66679       if (shouldDefaultToPresetList()) {
66680         wrap2.style("right", "-100%");
66681         editorPane.classed("hide", true);
66682         presetPane.classed("hide", false).call(presetList);
66683       } else {
66684         wrap2.style("right", "0%");
66685         presetPane.classed("hide", true);
66686         editorPane.classed("hide", false).call(entityEditor);
66687       }
66688       var footer = selection2.selectAll(".footer").data([0]);
66689       footer = footer.enter().append("div").attr("class", "footer").merge(footer);
66690       footer.call(
66691         uiViewOnOSM(context).what(context.hasEntity(_entityIDs.length === 1 && _entityIDs[0]))
66692       );
66693     }
66694     inspector.showList = function(presets) {
66695       presetPane.classed("hide", false);
66696       wrap2.transition().styleTween("right", function() {
66697         return value_default("0%", "-100%");
66698       }).on("end", function() {
66699         editorPane.classed("hide", true);
66700       });
66701       if (presets) {
66702         presetList.presets(presets);
66703       }
66704       presetPane.call(presetList.autofocus(true));
66705     };
66706     inspector.setPreset = function(preset) {
66707       if (preset && preset.id === "type/multipolygon") {
66708         presetPane.call(presetList.autofocus(true));
66709       } else {
66710         editorPane.classed("hide", false);
66711         wrap2.transition().styleTween("right", function() {
66712           return value_default("-100%", "0%");
66713         }).on("end", function() {
66714           presetPane.classed("hide", true);
66715         });
66716         if (preset) {
66717           entityEditor.presets([preset]);
66718         }
66719         editorPane.call(entityEditor);
66720       }
66721     };
66722     inspector.state = function(val) {
66723       if (!arguments.length)
66724         return _state;
66725       _state = val;
66726       entityEditor.state(_state);
66727       context.container().selectAll(".field-help-body").remove();
66728       return inspector;
66729     };
66730     inspector.entityIDs = function(val) {
66731       if (!arguments.length)
66732         return _entityIDs;
66733       _entityIDs = val;
66734       return inspector;
66735     };
66736     inspector.newFeature = function(val) {
66737       if (!arguments.length)
66738         return _newFeature;
66739       _newFeature = val;
66740       return inspector;
66741     };
66742     return inspector;
66743   }
66744
66745   // modules/ui/keepRight_details.js
66746   function uiKeepRightDetails(context) {
66747     let _qaItem;
66748     function issueDetail(d) {
66749       const { itemType, parentIssueType } = d;
66750       const unknown = { html: _t.html("inspector.unknown") };
66751       let replacements = d.replacements || {};
66752       replacements.default = unknown;
66753       if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) {
66754         return _t.html(`QA.keepRight.errorTypes.${itemType}.description`, replacements);
66755       } else {
66756         return _t.html(`QA.keepRight.errorTypes.${parentIssueType}.description`, replacements);
66757       }
66758     }
66759     function keepRightDetails(selection2) {
66760       const details = selection2.selectAll(".error-details").data(
66761         _qaItem ? [_qaItem] : [],
66762         (d) => `${d.id}-${d.status || 0}`
66763       );
66764       details.exit().remove();
66765       const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
66766       const descriptionEnter = detailsEnter.append("div").attr("class", "qa-details-subsection");
66767       descriptionEnter.append("h4").call(_t.append("QA.keepRight.detail_description"));
66768       descriptionEnter.append("div").attr("class", "qa-details-description-text").html(issueDetail);
66769       let relatedEntities = [];
66770       descriptionEnter.selectAll(".error_entity_link, .error_object_link").attr("href", "#").each(function() {
66771         const link2 = select_default2(this);
66772         const isObjectLink = link2.classed("error_object_link");
66773         const entityID = isObjectLink ? utilEntityRoot(_qaItem.objectType) + _qaItem.objectId : this.textContent;
66774         const entity = context.hasEntity(entityID);
66775         relatedEntities.push(entityID);
66776         link2.on("mouseenter", () => {
66777           utilHighlightEntities([entityID], true, context);
66778         }).on("mouseleave", () => {
66779           utilHighlightEntities([entityID], false, context);
66780         }).on("click", (d3_event) => {
66781           d3_event.preventDefault();
66782           utilHighlightEntities([entityID], false, context);
66783           const osmlayer = context.layers().layer("osm");
66784           if (!osmlayer.enabled()) {
66785             osmlayer.enabled(true);
66786           }
66787           context.map().centerZoomEase(_qaItem.loc, 20);
66788           if (entity) {
66789             context.enter(modeSelect(context, [entityID]));
66790           } else {
66791             context.loadEntity(entityID, (err, result) => {
66792               if (err)
66793                 return;
66794               const entity2 = result.data.find((e) => e.id === entityID);
66795               if (entity2)
66796                 context.enter(modeSelect(context, [entityID]));
66797             });
66798           }
66799         });
66800         if (entity) {
66801           let name = utilDisplayName(entity);
66802           if (!name && !isObjectLink) {
66803             const preset = _mainPresetIndex.match(entity, context.graph());
66804             name = preset && !preset.isFallback() && preset.name();
66805           }
66806           if (name) {
66807             this.innerText = name;
66808           }
66809         }
66810       });
66811       context.features().forceVisible(relatedEntities);
66812       context.map().pan([0, 0]);
66813     }
66814     keepRightDetails.issue = function(val) {
66815       if (!arguments.length)
66816         return _qaItem;
66817       _qaItem = val;
66818       return keepRightDetails;
66819     };
66820     return keepRightDetails;
66821   }
66822
66823   // modules/ui/keepRight_header.js
66824   function uiKeepRightHeader() {
66825     let _qaItem;
66826     function issueTitle(d) {
66827       const { itemType, parentIssueType } = d;
66828       const unknown = _t.html("inspector.unknown");
66829       let replacements = d.replacements || {};
66830       replacements.default = { html: unknown };
66831       if (_mainLocalizer.hasTextForStringId(`QA.keepRight.errorTypes.${itemType}.title`)) {
66832         return _t.html(`QA.keepRight.errorTypes.${itemType}.title`, replacements);
66833       } else {
66834         return _t.html(`QA.keepRight.errorTypes.${parentIssueType}.title`, replacements);
66835       }
66836     }
66837     function keepRightHeader(selection2) {
66838       const header = selection2.selectAll(".qa-header").data(
66839         _qaItem ? [_qaItem] : [],
66840         (d) => `${d.id}-${d.status || 0}`
66841       );
66842       header.exit().remove();
66843       const headerEnter = header.enter().append("div").attr("class", "qa-header");
66844       const iconEnter = headerEnter.append("div").attr("class", "qa-header-icon").classed("new", (d) => d.id < 0);
66845       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"));
66846       headerEnter.append("div").attr("class", "qa-header-label").html(issueTitle);
66847     }
66848     keepRightHeader.issue = function(val) {
66849       if (!arguments.length)
66850         return _qaItem;
66851       _qaItem = val;
66852       return keepRightHeader;
66853     };
66854     return keepRightHeader;
66855   }
66856
66857   // modules/ui/view_on_keepRight.js
66858   function uiViewOnKeepRight() {
66859     let _qaItem;
66860     function viewOnKeepRight(selection2) {
66861       let url;
66862       if (services.keepRight && _qaItem instanceof QAItem) {
66863         url = services.keepRight.issueURL(_qaItem);
66864       }
66865       const link2 = selection2.selectAll(".view-on-keepRight").data(url ? [url] : []);
66866       link2.exit().remove();
66867       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"));
66868       linkEnter.append("span").call(_t.append("inspector.view_on_keepRight"));
66869     }
66870     viewOnKeepRight.what = function(val) {
66871       if (!arguments.length)
66872         return _qaItem;
66873       _qaItem = val;
66874       return viewOnKeepRight;
66875     };
66876     return viewOnKeepRight;
66877   }
66878
66879   // modules/ui/keepRight_editor.js
66880   function uiKeepRightEditor(context) {
66881     const dispatch10 = dispatch_default("change");
66882     const qaDetails = uiKeepRightDetails(context);
66883     const qaHeader = uiKeepRightHeader(context);
66884     let _qaItem;
66885     function keepRightEditor(selection2) {
66886       const headerEnter = selection2.selectAll(".header").data([0]).enter().append("div").attr("class", "header fillL");
66887       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
66888       headerEnter.append("h2").call(_t.append("QA.keepRight.title"));
66889       let body = selection2.selectAll(".body").data([0]);
66890       body = body.enter().append("div").attr("class", "body").merge(body);
66891       const editor = body.selectAll(".qa-editor").data([0]);
66892       editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(keepRightSaveSection);
66893       const footer = selection2.selectAll(".footer").data([0]);
66894       footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnKeepRight(context).what(_qaItem));
66895     }
66896     function keepRightSaveSection(selection2) {
66897       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
66898       const isShown = _qaItem && (isSelected || _qaItem.newComment || _qaItem.comment);
66899       let saveSection = selection2.selectAll(".qa-save").data(
66900         isShown ? [_qaItem] : [],
66901         (d) => `${d.id}-${d.status || 0}`
66902       );
66903       saveSection.exit().remove();
66904       const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
66905       saveSectionEnter.append("h4").attr("class", ".qa-save-header").call(_t.append("QA.keepRight.comment"));
66906       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);
66907       saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
66908       function changeInput() {
66909         const input = select_default2(this);
66910         let val = input.property("value").trim();
66911         if (val === _qaItem.comment) {
66912           val = void 0;
66913         }
66914         _qaItem = _qaItem.update({ newComment: val });
66915         const qaService = services.keepRight;
66916         if (qaService) {
66917           qaService.replaceItem(_qaItem);
66918         }
66919         saveSection.call(qaSaveButtons);
66920       }
66921     }
66922     function qaSaveButtons(selection2) {
66923       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
66924       let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
66925       buttonSection.exit().remove();
66926       const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
66927       buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("QA.keepRight.save_comment"));
66928       buttonEnter.append("button").attr("class", "button close-button action");
66929       buttonEnter.append("button").attr("class", "button ignore-button action");
66930       buttonSection = buttonSection.merge(buttonEnter);
66931       buttonSection.select(".comment-button").attr("disabled", (d) => d.newComment ? null : true).on("click.comment", function(d3_event, d) {
66932         this.blur();
66933         const qaService = services.keepRight;
66934         if (qaService) {
66935           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66936         }
66937       });
66938       buttonSection.select(".close-button").html((d) => {
66939         const andComment = d.newComment ? "_comment" : "";
66940         return _t.html(`QA.keepRight.close${andComment}`);
66941       }).on("click.close", function(d3_event, d) {
66942         this.blur();
66943         const qaService = services.keepRight;
66944         if (qaService) {
66945           d.newStatus = "ignore_t";
66946           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66947         }
66948       });
66949       buttonSection.select(".ignore-button").html((d) => {
66950         const andComment = d.newComment ? "_comment" : "";
66951         return _t.html(`QA.keepRight.ignore${andComment}`);
66952       }).on("click.ignore", function(d3_event, d) {
66953         this.blur();
66954         const qaService = services.keepRight;
66955         if (qaService) {
66956           d.newStatus = "ignore";
66957           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
66958         }
66959       });
66960     }
66961     keepRightEditor.error = function(val) {
66962       if (!arguments.length)
66963         return _qaItem;
66964       _qaItem = val;
66965       return keepRightEditor;
66966     };
66967     return utilRebind(keepRightEditor, dispatch10, "on");
66968   }
66969
66970   // modules/ui/lasso.js
66971   function uiLasso(context) {
66972     var group, polygon2;
66973     lasso.coordinates = [];
66974     function lasso(selection2) {
66975       context.container().classed("lasso", true);
66976       group = selection2.append("g").attr("class", "lasso hide");
66977       polygon2 = group.append("path").attr("class", "lasso-path");
66978       group.call(uiToggle(true));
66979     }
66980     function draw() {
66981       if (polygon2) {
66982         polygon2.data([lasso.coordinates]).attr("d", function(d) {
66983           return "M" + d.join(" L") + " Z";
66984         });
66985       }
66986     }
66987     lasso.extent = function() {
66988       return lasso.coordinates.reduce(function(extent, point2) {
66989         return extent.extend(geoExtent(point2));
66990       }, geoExtent());
66991     };
66992     lasso.p = function(_) {
66993       if (!arguments.length)
66994         return lasso;
66995       lasso.coordinates.push(_);
66996       draw();
66997       return lasso;
66998     };
66999     lasso.close = function() {
67000       if (group) {
67001         group.call(uiToggle(false, function() {
67002           select_default2(this).remove();
67003         }));
67004       }
67005       context.container().classed("lasso", false);
67006     };
67007     return lasso;
67008   }
67009
67010   // modules/ui/note_comments.js
67011   function uiNoteComments() {
67012     var _note;
67013     function noteComments(selection2) {
67014       if (_note.isNew())
67015         return;
67016       var comments = selection2.selectAll(".comments-container").data([0]);
67017       comments = comments.enter().append("div").attr("class", "comments-container").merge(comments);
67018       var commentEnter = comments.selectAll(".comment").data(_note.comments).enter().append("div").attr("class", "comment");
67019       commentEnter.append("div").attr("class", function(d) {
67020         return "comment-avatar user-" + d.uid;
67021       }).call(svgIcon("#iD-icon-avatar", "comment-avatar-icon"));
67022       var mainEnter = commentEnter.append("div").attr("class", "comment-main");
67023       var metadataEnter = mainEnter.append("div").attr("class", "comment-metadata");
67024       metadataEnter.append("div").attr("class", "comment-author").each(function(d) {
67025         var selection3 = select_default2(this);
67026         var osm = services.osm;
67027         if (osm && d.user) {
67028           selection3 = selection3.append("a").attr("class", "comment-author-link").attr("href", osm.userURL(d.user)).attr("target", "_blank");
67029         }
67030         if (d.user) {
67031           selection3.text(d.user);
67032         } else {
67033           selection3.call(_t.append("note.anonymous"));
67034         }
67035       });
67036       metadataEnter.append("div").attr("class", "comment-date").html(function(d) {
67037         return _t.html("note.status." + d.action, { when: localeDateString2(d.date) });
67038       });
67039       mainEnter.append("div").attr("class", "comment-text").html(function(d) {
67040         return d.html;
67041       }).selectAll("a").attr("rel", "noopener nofollow").attr("target", "_blank");
67042       comments.call(replaceAvatars);
67043     }
67044     function replaceAvatars(selection2) {
67045       var showThirdPartyIcons = corePreferences("preferences.privacy.thirdpartyicons") || "true";
67046       var osm = services.osm;
67047       if (showThirdPartyIcons !== "true" || !osm)
67048         return;
67049       var uids = {};
67050       _note.comments.forEach(function(d) {
67051         if (d.uid)
67052           uids[d.uid] = true;
67053       });
67054       Object.keys(uids).forEach(function(uid) {
67055         osm.loadUser(uid, function(err, user) {
67056           if (!user || !user.image_url)
67057             return;
67058           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);
67059         });
67060       });
67061     }
67062     function localeDateString2(s) {
67063       if (!s)
67064         return null;
67065       var options2 = { day: "numeric", month: "short", year: "numeric" };
67066       s = s.replace(/-/g, "/");
67067       var d = new Date(s);
67068       if (isNaN(d.getTime()))
67069         return null;
67070       return d.toLocaleDateString(_mainLocalizer.localeCode(), options2);
67071     }
67072     noteComments.note = function(val) {
67073       if (!arguments.length)
67074         return _note;
67075       _note = val;
67076       return noteComments;
67077     };
67078     return noteComments;
67079   }
67080
67081   // modules/ui/note_header.js
67082   function uiNoteHeader() {
67083     var _note;
67084     function noteHeader(selection2) {
67085       var header = selection2.selectAll(".note-header").data(
67086         _note ? [_note] : [],
67087         function(d) {
67088           return d.status + d.id;
67089         }
67090       );
67091       header.exit().remove();
67092       var headerEnter = header.enter().append("div").attr("class", "note-header");
67093       var iconEnter = headerEnter.append("div").attr("class", function(d) {
67094         return "note-header-icon " + d.status;
67095       }).classed("new", function(d) {
67096         return d.id < 0;
67097       });
67098       iconEnter.append("div").attr("class", "preset-icon-28").call(svgIcon("#iD-icon-note", "note-fill"));
67099       iconEnter.each(function(d) {
67100         var statusIcon;
67101         if (d.id < 0) {
67102           statusIcon = "#iD-icon-plus";
67103         } else if (d.status === "open") {
67104           statusIcon = "#iD-icon-close";
67105         } else {
67106           statusIcon = "#iD-icon-apply";
67107         }
67108         iconEnter.append("div").attr("class", "note-icon-annotation").attr("title", _t("icons.close")).call(svgIcon(statusIcon, "icon-annotation"));
67109       });
67110       headerEnter.append("div").attr("class", "note-header-label").html(function(d) {
67111         if (_note.isNew()) {
67112           return _t.html("note.new");
67113         }
67114         return _t.html("note.note") + " " + d.id + " " + (d.status === "closed" ? _t.html("note.closed") : "");
67115       });
67116     }
67117     noteHeader.note = function(val) {
67118       if (!arguments.length)
67119         return _note;
67120       _note = val;
67121       return noteHeader;
67122     };
67123     return noteHeader;
67124   }
67125
67126   // modules/ui/note_report.js
67127   function uiNoteReport() {
67128     var _note;
67129     function noteReport(selection2) {
67130       var url;
67131       if (services.osm && _note instanceof osmNote && !_note.isNew()) {
67132         url = services.osm.noteReportURL(_note);
67133       }
67134       var link2 = selection2.selectAll(".note-report").data(url ? [url] : []);
67135       link2.exit().remove();
67136       var linkEnter = link2.enter().append("a").attr("class", "note-report").attr("target", "_blank").attr("href", function(d) {
67137         return d;
67138       }).call(svgIcon("#iD-icon-out-link", "inline"));
67139       linkEnter.append("span").call(_t.append("note.report"));
67140     }
67141     noteReport.note = function(val) {
67142       if (!arguments.length)
67143         return _note;
67144       _note = val;
67145       return noteReport;
67146     };
67147     return noteReport;
67148   }
67149
67150   // modules/ui/note_editor.js
67151   function uiNoteEditor(context) {
67152     var dispatch10 = dispatch_default("change");
67153     var noteComments = uiNoteComments(context);
67154     var noteHeader = uiNoteHeader();
67155     var _note;
67156     var _newNote;
67157     function noteEditor(selection2) {
67158       var header = selection2.selectAll(".header").data([0]);
67159       var headerEnter = header.enter().append("div").attr("class", "header fillL");
67160       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
67161         context.enter(modeBrowse(context));
67162       }).call(svgIcon("#iD-icon-close"));
67163       headerEnter.append("h2").call(_t.append("note.title"));
67164       var body = selection2.selectAll(".body").data([0]);
67165       body = body.enter().append("div").attr("class", "body").merge(body);
67166       var editor = body.selectAll(".note-editor").data([0]);
67167       editor.enter().append("div").attr("class", "modal-section note-editor").merge(editor).call(noteHeader.note(_note)).call(noteComments.note(_note)).call(noteSaveSection);
67168       var footer = selection2.selectAll(".footer").data([0]);
67169       footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnOSM(context).what(_note)).call(uiNoteReport(context).note(_note));
67170       var osm = services.osm;
67171       if (osm) {
67172         osm.on("change.note-save", function() {
67173           selection2.call(noteEditor);
67174         });
67175       }
67176     }
67177     function noteSaveSection(selection2) {
67178       var isSelected = _note && _note.id === context.selectedNoteID();
67179       var noteSave = selection2.selectAll(".note-save").data(isSelected ? [_note] : [], function(d) {
67180         return d.status + d.id;
67181       });
67182       noteSave.exit().remove();
67183       var noteSaveEnter = noteSave.enter().append("div").attr("class", "note-save save-section cf");
67184       noteSaveEnter.append("h4").attr("class", ".note-save-header").html(function() {
67185         return _note.isNew() ? _t.html("note.newDescription") : _t.html("note.newComment");
67186       });
67187       var commentTextarea = noteSaveEnter.append("textarea").attr("class", "new-comment-input").attr("placeholder", _t("note.inputPlaceholder")).attr("maxlength", 1e3).property("value", function(d) {
67188         return d.newComment;
67189       }).call(utilNoAuto).on("keydown.note-input", keydown).on("input.note-input", changeInput).on("blur.note-input", changeInput);
67190       if (!commentTextarea.empty() && _newNote) {
67191         commentTextarea.node().focus();
67192       }
67193       noteSave = noteSaveEnter.merge(noteSave).call(userDetails).call(noteSaveButtons);
67194       function keydown(d3_event) {
67195         if (!(d3_event.keyCode === 13 && // ↩ Return
67196         d3_event.metaKey))
67197           return;
67198         var osm = services.osm;
67199         if (!osm)
67200           return;
67201         var hasAuth = osm.authenticated();
67202         if (!hasAuth)
67203           return;
67204         if (!_note.newComment)
67205           return;
67206         d3_event.preventDefault();
67207         select_default2(this).on("keydown.note-input", null);
67208         window.setTimeout(function() {
67209           if (_note.isNew()) {
67210             noteSave.selectAll(".save-button").node().focus();
67211             clickSave(_note);
67212           } else {
67213             noteSave.selectAll(".comment-button").node().focus();
67214             clickComment(_note);
67215           }
67216         }, 10);
67217       }
67218       function changeInput() {
67219         var input = select_default2(this);
67220         var val = input.property("value").trim() || void 0;
67221         _note = _note.update({ newComment: val });
67222         var osm = services.osm;
67223         if (osm) {
67224           osm.replaceNote(_note);
67225         }
67226         noteSave.call(noteSaveButtons);
67227       }
67228     }
67229     function userDetails(selection2) {
67230       var detailSection = selection2.selectAll(".detail-section").data([0]);
67231       detailSection = detailSection.enter().append("div").attr("class", "detail-section").merge(detailSection);
67232       var osm = services.osm;
67233       if (!osm)
67234         return;
67235       var hasAuth = osm.authenticated();
67236       var authWarning = detailSection.selectAll(".auth-warning").data(hasAuth ? [] : [0]);
67237       authWarning.exit().transition().duration(200).style("opacity", 0).remove();
67238       var authEnter = authWarning.enter().insert("div", ".tag-reference-body").attr("class", "field-warning auth-warning").style("opacity", 0);
67239       authEnter.call(svgIcon("#iD-icon-alert", "inline"));
67240       authEnter.append("span").call(_t.append("note.login"));
67241       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) {
67242         d3_event.preventDefault();
67243         osm.authenticate();
67244       });
67245       authEnter.transition().duration(200).style("opacity", 1);
67246       var prose = detailSection.selectAll(".note-save-prose").data(hasAuth ? [0] : []);
67247       prose.exit().remove();
67248       prose = prose.enter().append("p").attr("class", "note-save-prose").call(_t.append("note.upload_explanation")).merge(prose);
67249       osm.userDetails(function(err, user) {
67250         if (err)
67251           return;
67252         var userLink = select_default2(document.createElement("div"));
67253         if (user.image_url) {
67254           userLink.append("img").attr("src", user.image_url).attr("class", "icon pre-text user-icon");
67255         }
67256         userLink.append("a").attr("class", "user-info").text(user.display_name).attr("href", osm.userURL(user.display_name)).attr("target", "_blank");
67257         prose.html(_t.html("note.upload_explanation_with_user", { user: { html: userLink.html() } }));
67258       });
67259     }
67260     function noteSaveButtons(selection2) {
67261       var osm = services.osm;
67262       var hasAuth = osm && osm.authenticated();
67263       var isSelected = _note && _note.id === context.selectedNoteID();
67264       var buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_note] : [], function(d) {
67265         return d.status + d.id;
67266       });
67267       buttonSection.exit().remove();
67268       var buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
67269       if (_note.isNew()) {
67270         buttonEnter.append("button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
67271         buttonEnter.append("button").attr("class", "button save-button action").call(_t.append("note.save"));
67272       } else {
67273         buttonEnter.append("button").attr("class", "button status-button action");
67274         buttonEnter.append("button").attr("class", "button comment-button action").call(_t.append("note.comment"));
67275       }
67276       buttonSection = buttonSection.merge(buttonEnter);
67277       buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
67278       buttonSection.select(".save-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
67279       buttonSection.select(".status-button").attr("disabled", hasAuth ? null : true).html(function(d) {
67280         var action = d.status === "open" ? "close" : "open";
67281         var andComment = d.newComment ? "_comment" : "";
67282         return _t.html("note." + action + andComment);
67283       }).on("click.status", clickStatus);
67284       buttonSection.select(".comment-button").attr("disabled", isSaveDisabled).on("click.comment", clickComment);
67285       function isSaveDisabled(d) {
67286         return hasAuth && d.status === "open" && d.newComment ? null : true;
67287       }
67288     }
67289     function clickCancel(d3_event, d) {
67290       this.blur();
67291       var osm = services.osm;
67292       if (osm) {
67293         osm.removeNote(d);
67294       }
67295       context.enter(modeBrowse(context));
67296       dispatch10.call("change");
67297     }
67298     function clickSave(d3_event, d) {
67299       this.blur();
67300       var osm = services.osm;
67301       if (osm) {
67302         osm.postNoteCreate(d, function(err, note) {
67303           dispatch10.call("change", note);
67304         });
67305       }
67306     }
67307     function clickStatus(d3_event, d) {
67308       this.blur();
67309       var osm = services.osm;
67310       if (osm) {
67311         var setStatus = d.status === "open" ? "closed" : "open";
67312         osm.postNoteUpdate(d, setStatus, function(err, note) {
67313           dispatch10.call("change", note);
67314         });
67315       }
67316     }
67317     function clickComment(d3_event, d) {
67318       this.blur();
67319       var osm = services.osm;
67320       if (osm) {
67321         osm.postNoteUpdate(d, d.status, function(err, note) {
67322           dispatch10.call("change", note);
67323         });
67324       }
67325     }
67326     noteEditor.note = function(val) {
67327       if (!arguments.length)
67328         return _note;
67329       _note = val;
67330       return noteEditor;
67331     };
67332     noteEditor.newNote = function(val) {
67333       if (!arguments.length)
67334         return _newNote;
67335       _newNote = val;
67336       return noteEditor;
67337     };
67338     return utilRebind(noteEditor, dispatch10, "on");
67339   }
67340
67341   // modules/ui/source_switch.js
67342   function uiSourceSwitch(context) {
67343     var keys2;
67344     function click(d3_event) {
67345       d3_event.preventDefault();
67346       var osm = context.connection();
67347       if (!osm)
67348         return;
67349       if (context.inIntro())
67350         return;
67351       if (context.history().hasChanges() && !window.confirm(_t("source_switch.lose_changes")))
67352         return;
67353       var isLive = select_default2(this).classed("live");
67354       isLive = !isLive;
67355       context.enter(modeBrowse(context));
67356       context.history().clearSaved();
67357       context.flush();
67358       select_default2(this).html(isLive ? _t.html("source_switch.live") : _t.html("source_switch.dev")).classed("live", isLive).classed("chip", isLive);
67359       osm.switch(isLive ? keys2[0] : keys2[1]);
67360     }
67361     var sourceSwitch = function(selection2) {
67362       selection2.append("a").attr("href", "#").call(_t.append("source_switch.live")).attr("class", "live chip").on("click", click);
67363     };
67364     sourceSwitch.keys = function(_) {
67365       if (!arguments.length)
67366         return keys2;
67367       keys2 = _;
67368       return sourceSwitch;
67369     };
67370     return sourceSwitch;
67371   }
67372
67373   // modules/ui/spinner.js
67374   function uiSpinner(context) {
67375     var osm = context.connection();
67376     return function(selection2) {
67377       var img = selection2.append("img").attr("src", context.imagePath("loader-black.gif")).style("opacity", 0);
67378       if (osm) {
67379         osm.on("loading.spinner", function() {
67380           img.transition().style("opacity", 1);
67381         }).on("loaded.spinner", function() {
67382           img.transition().style("opacity", 0);
67383         });
67384       }
67385     };
67386   }
67387
67388   // modules/ui/sections/privacy.js
67389   function uiSectionPrivacy(context) {
67390     let section = uiSection("preferences-third-party", context).label(() => _t.append("preferences.privacy.title")).disclosureContent(renderDisclosureContent);
67391     function renderDisclosureContent(selection2) {
67392       selection2.selectAll(".privacy-options-list").data([0]).enter().append("ul").attr("class", "layer-list privacy-options-list");
67393       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(
67394         uiTooltip().title(() => _t.append("preferences.privacy.third_party_icons.tooltip")).placement("bottom")
67395       );
67396       thirdPartyIconsEnter.append("input").attr("type", "checkbox").on("change", (d3_event, d) => {
67397         d3_event.preventDefault();
67398         corePreferences("preferences.privacy.thirdpartyicons", d === "true" ? "false" : "true");
67399       });
67400       thirdPartyIconsEnter.append("span").call(_t.append("preferences.privacy.third_party_icons.description"));
67401       selection2.selectAll(".privacy-third-party-icons-item").classed("active", (d) => d === "true").select("input").property("checked", (d) => d === "true");
67402       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"));
67403     }
67404     corePreferences.onChange("preferences.privacy.thirdpartyicons", section.reRender);
67405     return section;
67406   }
67407
67408   // modules/ui/splash.js
67409   function uiSplash(context) {
67410     return (selection2) => {
67411       if (context.history().hasRestorableChanges())
67412         return;
67413       let updateMessage = "";
67414       const sawPrivacyVersion = corePreferences("sawPrivacyVersion");
67415       let showSplash = !corePreferences("sawSplash");
67416       if (sawPrivacyVersion !== context.privacyVersion) {
67417         updateMessage = _t("splash.privacy_update");
67418         showSplash = true;
67419       }
67420       if (!showSplash)
67421         return;
67422       corePreferences("sawSplash", true);
67423       corePreferences("sawPrivacyVersion", context.privacyVersion);
67424       _mainFileFetcher.get("intro_graph");
67425       let modalSelection = uiModal(selection2);
67426       modalSelection.select(".modal").attr("class", "modal-splash modal");
67427       let introModal = modalSelection.select(".content").append("div").attr("class", "fillL");
67428       introModal.append("div").attr("class", "modal-section").append("h3").call(_t.append("splash.welcome"));
67429       let modalSection = introModal.append("div").attr("class", "modal-section");
67430       modalSection.append("p").html(_t.html("splash.text", {
67431         version: context.version,
67432         website: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/develop/CHANGELOG.md#whats-new">' + _t.html("splash.changelog") + "</a>" },
67433         github: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/issues">github.com</a>' }
67434       }));
67435       modalSection.append("p").html(_t.html("splash.privacy", {
67436         updateMessage,
67437         privacyLink: { html: '<a target="_blank" href="https://github.com/openstreetmap/iD/blob/release/PRIVACY.md">' + _t("splash.privacy_policy") + "</a>" }
67438       }));
67439       uiSectionPrivacy(context).label(() => _t.append("splash.privacy_settings")).render(modalSection);
67440       let buttonWrap = introModal.append("div").attr("class", "modal-actions");
67441       let walkthrough = buttonWrap.append("button").attr("class", "walkthrough").on("click", () => {
67442         context.container().call(uiIntro(context));
67443         modalSelection.close();
67444       });
67445       walkthrough.append("svg").attr("class", "logo logo-walkthrough").append("use").attr("xlink:href", "#iD-logo-walkthrough");
67446       walkthrough.append("div").call(_t.append("splash.walkthrough"));
67447       let startEditing = buttonWrap.append("button").attr("class", "start-editing").on("click", modalSelection.close);
67448       startEditing.append("svg").attr("class", "logo logo-features").append("use").attr("xlink:href", "#iD-logo-features");
67449       startEditing.append("div").call(_t.append("splash.start"));
67450       modalSelection.select("button.close").attr("class", "hide");
67451     };
67452   }
67453
67454   // modules/ui/status.js
67455   function uiStatus(context) {
67456     var osm = context.connection();
67457     return function(selection2) {
67458       if (!osm)
67459         return;
67460       function update(err, apiStatus) {
67461         selection2.html("");
67462         if (err) {
67463           if (apiStatus === "connectionSwitched") {
67464             return;
67465           } else if (apiStatus === "rateLimited") {
67466             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) {
67467               d3_event.preventDefault();
67468               osm.authenticate();
67469             });
67470           } else {
67471             var throttledRetry = throttle_default(function() {
67472               context.loadTiles(context.projection);
67473               osm.reloadApiStatus();
67474             }, 2e3);
67475             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) {
67476               d3_event.preventDefault();
67477               throttledRetry();
67478             });
67479           }
67480         } else if (apiStatus === "readonly") {
67481           selection2.call(_t.append("osm_api_status.message.readonly"));
67482         } else if (apiStatus === "offline") {
67483           selection2.call(_t.append("osm_api_status.message.offline"));
67484         }
67485         selection2.attr("class", "api-status " + (err ? "error" : apiStatus));
67486       }
67487       osm.on("apiStatusChange.uiStatus", update);
67488       context.history().on("storage_error", () => {
67489         selection2.selectAll("span.local-storage-full").remove();
67490         selection2.append("span").attr("class", "local-storage-full").call(_t.append("osm_api_status.message.local_storage_full"));
67491         selection2.classed("error", true);
67492       });
67493       window.setInterval(function() {
67494         osm.reloadApiStatus();
67495       }, 9e4);
67496       osm.reloadApiStatus();
67497     };
67498   }
67499
67500   // node_modules/osm-community-index/lib/simplify.js
67501   var import_diacritics2 = __toESM(require_diacritics(), 1);
67502   function simplify(str2) {
67503     if (typeof str2 !== "string")
67504       return "";
67505     return import_diacritics2.default.remove(
67506       str2.replace(/&/g, "and").replace(/(İ|i̇)/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()
67507     );
67508   }
67509
67510   // node_modules/osm-community-index/lib/resolve_strings.js
67511   function resolveStrings(item, defaults2, localizerFn) {
67512     let itemStrings = Object.assign({}, item.strings);
67513     let defaultStrings = Object.assign({}, defaults2[item.type]);
67514     const anyToken = new RegExp(/(\{\w+\})/, "gi");
67515     if (localizerFn) {
67516       if (itemStrings.community) {
67517         const communityID = simplify(itemStrings.community);
67518         itemStrings.community = localizerFn(`_communities.${communityID}`);
67519       }
67520       ["name", "description", "extendedDescription"].forEach((prop) => {
67521         if (defaultStrings[prop])
67522           defaultStrings[prop] = localizerFn(`_defaults.${item.type}.${prop}`);
67523         if (itemStrings[prop])
67524           itemStrings[prop] = localizerFn(`${item.id}.${prop}`);
67525       });
67526     }
67527     let replacements = {
67528       account: item.account,
67529       community: itemStrings.community,
67530       signupUrl: itemStrings.signupUrl,
67531       url: itemStrings.url
67532     };
67533     if (!replacements.signupUrl) {
67534       replacements.signupUrl = resolve(itemStrings.signupUrl || defaultStrings.signupUrl);
67535     }
67536     if (!replacements.url) {
67537       replacements.url = resolve(itemStrings.url || defaultStrings.url);
67538     }
67539     let resolved = {
67540       name: resolve(itemStrings.name || defaultStrings.name),
67541       url: resolve(itemStrings.url || defaultStrings.url),
67542       signupUrl: resolve(itemStrings.signupUrl || defaultStrings.signupUrl),
67543       description: resolve(itemStrings.description || defaultStrings.description),
67544       extendedDescription: resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription)
67545     };
67546     resolved.nameHTML = linkify(resolved.url, resolved.name);
67547     resolved.urlHTML = linkify(resolved.url);
67548     resolved.signupUrlHTML = linkify(resolved.signupUrl);
67549     resolved.descriptionHTML = resolve(itemStrings.description || defaultStrings.description, true);
67550     resolved.extendedDescriptionHTML = resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription, true);
67551     return resolved;
67552     function resolve(s, addLinks) {
67553       if (!s)
67554         return void 0;
67555       let result = s;
67556       for (let key in replacements) {
67557         const token = `{${key}}`;
67558         const regex = new RegExp(token, "g");
67559         if (regex.test(result)) {
67560           let replacement = replacements[key];
67561           if (!replacement) {
67562             throw new Error(`Cannot resolve token: ${token}`);
67563           } else {
67564             if (addLinks && (key === "signupUrl" || key === "url")) {
67565               replacement = linkify(replacement);
67566             }
67567             result = result.replace(regex, replacement);
67568           }
67569         }
67570       }
67571       const leftovers = result.match(anyToken);
67572       if (leftovers) {
67573         throw new Error(`Cannot resolve tokens: ${leftovers}`);
67574       }
67575       if (addLinks && item.type === "reddit") {
67576         result = result.replace(/(\/r\/\w+\/*)/i, (match) => linkify(resolved.url, match));
67577       }
67578       return result;
67579     }
67580     function linkify(url, text2) {
67581       if (!url)
67582         return void 0;
67583       text2 = text2 || url;
67584       return `<a target="_blank" href="${url}">${text2}</a>`;
67585     }
67586   }
67587
67588   // modules/ui/success.js
67589   var _oci = null;
67590   function uiSuccess(context) {
67591     const MAXEVENTS = 2;
67592     const dispatch10 = dispatch_default("cancel");
67593     let _changeset2;
67594     let _location;
67595     ensureOSMCommunityIndex();
67596     function ensureOSMCommunityIndex() {
67597       const data = _mainFileFetcher;
67598       return Promise.all([
67599         data.get("oci_features"),
67600         data.get("oci_resources"),
67601         data.get("oci_defaults")
67602       ]).then((vals) => {
67603         if (_oci)
67604           return _oci;
67605         if (vals[0] && Array.isArray(vals[0].features)) {
67606           _sharedLocationManager.mergeCustomGeoJSON(vals[0]);
67607         }
67608         let ociResources = Object.values(vals[1].resources);
67609         if (ociResources.length) {
67610           return _sharedLocationManager.mergeLocationSets(ociResources).then(() => {
67611             _oci = {
67612               resources: ociResources,
67613               defaults: vals[2].defaults
67614             };
67615             return _oci;
67616           });
67617         } else {
67618           _oci = {
67619             resources: [],
67620             // no resources?
67621             defaults: vals[2].defaults
67622           };
67623           return _oci;
67624         }
67625       });
67626     }
67627     function parseEventDate(when) {
67628       if (!when)
67629         return;
67630       let raw = when.trim();
67631       if (!raw)
67632         return;
67633       if (!/Z$/.test(raw)) {
67634         raw += "Z";
67635       }
67636       const parsed = new Date(raw);
67637       return new Date(parsed.toUTCString().slice(0, 25));
67638     }
67639     function success(selection2) {
67640       let header = selection2.append("div").attr("class", "header fillL");
67641       header.append("h2").call(_t.append("success.just_edited"));
67642       header.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => dispatch10.call("cancel")).call(svgIcon("#iD-icon-close"));
67643       let body = selection2.append("div").attr("class", "body save-success fillL");
67644       let summary = body.append("div").attr("class", "save-summary");
67645       summary.append("h3").call(_t.append("success.thank_you" + (_location ? "_location" : ""), { where: _location }));
67646       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"));
67647       let osm = context.connection();
67648       if (!osm)
67649         return;
67650       let changesetURL = osm.changesetURL(_changeset2.id);
67651       let table = summary.append("table").attr("class", "summary-table");
67652       let row = table.append("tr").attr("class", "summary-row");
67653       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");
67654       let summaryDetail = row.append("td").attr("class", "cell-detail summary-detail");
67655       summaryDetail.append("a").attr("class", "cell-detail summary-view-on-osm").attr("target", "_blank").attr("href", changesetURL).call(_t.append("success.view_on_osm"));
67656       summaryDetail.append("div").html(_t.html("success.changeset_id", {
67657         changeset_id: { html: `<a href="${changesetURL}" target="_blank">${_changeset2.id}</a>` }
67658       }));
67659       ensureOSMCommunityIndex().then((oci) => {
67660         const loc = context.map().center();
67661         const validHere = _sharedLocationManager.locationSetsAt(loc);
67662         let communities = [];
67663         oci.resources.forEach((resource) => {
67664           let area = validHere[resource.locationSetID];
67665           if (!area)
67666             return;
67667           const localizer = (stringID) => _t.html(`community.${stringID}`);
67668           resource.resolved = resolveStrings(resource, oci.defaults, localizer);
67669           communities.push({
67670             area,
67671             order: resource.order || 0,
67672             resource
67673           });
67674         });
67675         communities.sort((a, b) => a.area - b.area || b.order - a.order);
67676         body.call(showCommunityLinks, communities.map((c) => c.resource));
67677       });
67678     }
67679     function showCommunityLinks(selection2, resources) {
67680       let communityLinks = selection2.append("div").attr("class", "save-communityLinks");
67681       communityLinks.append("h3").call(_t.append("success.like_osm"));
67682       let table = communityLinks.append("table").attr("class", "community-table");
67683       let row = table.selectAll(".community-row").data(resources);
67684       let rowEnter = row.enter().append("tr").attr("class", "community-row");
67685       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}`);
67686       let communityDetail = rowEnter.append("td").attr("class", "cell-detail community-detail");
67687       communityDetail.each(showCommunityDetails);
67688       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"));
67689     }
67690     function showCommunityDetails(d) {
67691       let selection2 = select_default2(this);
67692       let communityID = d.id;
67693       selection2.append("div").attr("class", "community-name").html(d.resolved.nameHTML);
67694       selection2.append("div").attr("class", "community-description").html(d.resolved.descriptionHTML);
67695       if (d.resolved.extendedDescriptionHTML || d.languageCodes && d.languageCodes.length) {
67696         selection2.append("div").call(
67697           uiDisclosure(context, `community-more-${d.id}`, false).expanded(false).updatePreference(false).label(() => _t.append("success.more")).content(showMore)
67698         );
67699       }
67700       let nextEvents = (d.events || []).map((event) => {
67701         event.date = parseEventDate(event.when);
67702         return event;
67703       }).filter((event) => {
67704         const t = event.date.getTime();
67705         const now3 = (/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0);
67706         return !isNaN(t) && t >= now3;
67707       }).sort((a, b) => {
67708         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
67709       }).slice(0, MAXEVENTS);
67710       if (nextEvents.length) {
67711         selection2.append("div").call(
67712           uiDisclosure(context, `community-events-${d.id}`, false).expanded(false).updatePreference(false).label(_t.html("success.events")).content(showNextEvents)
67713         ).select(".hide-toggle").append("span").attr("class", "badge-text").text(nextEvents.length);
67714       }
67715       function showMore(selection3) {
67716         let more = selection3.selectAll(".community-more").data([0]);
67717         let moreEnter = more.enter().append("div").attr("class", "community-more");
67718         if (d.resolved.extendedDescriptionHTML) {
67719           moreEnter.append("div").attr("class", "community-extended-description").html(d.resolved.extendedDescriptionHTML);
67720         }
67721         if (d.languageCodes && d.languageCodes.length) {
67722           const languageList = d.languageCodes.map((code) => _mainLocalizer.languageName(code)).join(", ");
67723           moreEnter.append("div").attr("class", "community-languages").call(_t.append("success.languages", { languages: languageList }));
67724         }
67725       }
67726       function showNextEvents(selection3) {
67727         let events = selection3.append("div").attr("class", "community-events");
67728         let item = events.selectAll(".community-event").data(nextEvents);
67729         let itemEnter = item.enter().append("div").attr("class", "community-event");
67730         itemEnter.append("div").attr("class", "community-event-name").append("a").attr("target", "_blank").attr("href", (d2) => d2.url).text((d2) => {
67731           let name = d2.name;
67732           if (d2.i18n && d2.id) {
67733             name = _t(`community.${communityID}.events.${d2.id}.name`, { default: name });
67734           }
67735           return name;
67736         });
67737         itemEnter.append("div").attr("class", "community-event-when").text((d2) => {
67738           let options2 = { weekday: "short", day: "numeric", month: "short", year: "numeric" };
67739           if (d2.date.getHours() || d2.date.getMinutes()) {
67740             options2.hour = "numeric";
67741             options2.minute = "numeric";
67742           }
67743           return d2.date.toLocaleString(_mainLocalizer.localeCode(), options2);
67744         });
67745         itemEnter.append("div").attr("class", "community-event-where").text((d2) => {
67746           let where = d2.where;
67747           if (d2.i18n && d2.id) {
67748             where = _t(`community.${communityID}.events.${d2.id}.where`, { default: where });
67749           }
67750           return where;
67751         });
67752         itemEnter.append("div").attr("class", "community-event-description").text((d2) => {
67753           let description = d2.description;
67754           if (d2.i18n && d2.id) {
67755             description = _t(`community.${communityID}.events.${d2.id}.description`, { default: description });
67756           }
67757           return description;
67758         });
67759       }
67760     }
67761     success.changeset = function(val) {
67762       if (!arguments.length)
67763         return _changeset2;
67764       _changeset2 = val;
67765       return success;
67766     };
67767     success.location = function(val) {
67768       if (!arguments.length)
67769         return _location;
67770       _location = val;
67771       return success;
67772     };
67773     return utilRebind(success, dispatch10, "on");
67774   }
67775
67776   // modules/ui/version.js
67777   var sawVersion = null;
67778   var isNewVersion = false;
67779   var isNewUser = false;
67780   function uiVersion(context) {
67781     var currVersion = context.version;
67782     var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
67783     if (sawVersion === null && matchedVersion !== null) {
67784       if (corePreferences("sawVersion")) {
67785         isNewUser = false;
67786         isNewVersion = corePreferences("sawVersion") !== currVersion && currVersion.indexOf("-") === -1;
67787       } else {
67788         isNewUser = true;
67789         isNewVersion = true;
67790       }
67791       corePreferences("sawVersion", currVersion);
67792       sawVersion = currVersion;
67793     }
67794     return function(selection2) {
67795       selection2.append("a").attr("target", "_blank").attr("href", "https://github.com/openstreetmap/iD").text(currVersion);
67796       if (isNewVersion && !isNewUser) {
67797         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(
67798           uiTooltip().title(() => _t.append("version.whats_new", { version: currVersion })).placement("top").scrollContainer(context.container().select(".main-footer-wrap"))
67799         );
67800       }
67801     };
67802   }
67803
67804   // modules/ui/zoom.js
67805   function uiZoom(context) {
67806     var zooms = [{
67807       id: "zoom-in",
67808       icon: "iD-icon-plus",
67809       title: _t.append("zoom.in"),
67810       action: zoomIn,
67811       disabled: function() {
67812         return !context.map().canZoomIn();
67813       },
67814       disabledTitle: _t.append("zoom.disabled.in"),
67815       key: "+"
67816     }, {
67817       id: "zoom-out",
67818       icon: "iD-icon-minus",
67819       title: _t.append("zoom.out"),
67820       action: zoomOut,
67821       disabled: function() {
67822         return !context.map().canZoomOut();
67823       },
67824       disabledTitle: _t.append("zoom.disabled.out"),
67825       key: "-"
67826     }];
67827     function zoomIn(d3_event) {
67828       if (d3_event.shiftKey)
67829         return;
67830       d3_event.preventDefault();
67831       context.map().zoomIn();
67832     }
67833     function zoomOut(d3_event) {
67834       if (d3_event.shiftKey)
67835         return;
67836       d3_event.preventDefault();
67837       context.map().zoomOut();
67838     }
67839     function zoomInFurther(d3_event) {
67840       if (d3_event.shiftKey)
67841         return;
67842       d3_event.preventDefault();
67843       context.map().zoomInFurther();
67844     }
67845     function zoomOutFurther(d3_event) {
67846       if (d3_event.shiftKey)
67847         return;
67848       d3_event.preventDefault();
67849       context.map().zoomOutFurther();
67850     }
67851     return function(selection2) {
67852       var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function(d) {
67853         if (d.disabled()) {
67854           return d.disabledTitle;
67855         }
67856         return d.title;
67857       }).keys(function(d) {
67858         return [d.key];
67859       });
67860       var lastPointerUpType;
67861       var buttons = selection2.selectAll("button").data(zooms).enter().append("button").attr("class", function(d) {
67862         return d.id;
67863       }).on("pointerup.editor", function(d3_event) {
67864         lastPointerUpType = d3_event.pointerType;
67865       }).on("click.editor", function(d3_event, d) {
67866         if (!d.disabled()) {
67867           d.action(d3_event);
67868         } else if (lastPointerUpType === "touch" || lastPointerUpType === "pen") {
67869           context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass("disabled").label(d.disabledTitle)();
67870         }
67871         lastPointerUpType = null;
67872       }).call(tooltipBehavior);
67873       buttons.each(function(d) {
67874         select_default2(this).call(svgIcon("#" + d.icon, "light"));
67875       });
67876       utilKeybinding.plusKeys.forEach(function(key) {
67877         context.keybinding().on([key], zoomIn);
67878         context.keybinding().on([uiCmd("\u2325" + key)], zoomInFurther);
67879       });
67880       utilKeybinding.minusKeys.forEach(function(key) {
67881         context.keybinding().on([key], zoomOut);
67882         context.keybinding().on([uiCmd("\u2325" + key)], zoomOutFurther);
67883       });
67884       function updateButtonStates() {
67885         buttons.classed("disabled", function(d) {
67886           return d.disabled();
67887         }).each(function() {
67888           var selection3 = select_default2(this);
67889           if (!selection3.select(".tooltip.in").empty()) {
67890             selection3.call(tooltipBehavior.updateContent);
67891           }
67892         });
67893       }
67894       updateButtonStates();
67895       context.map().on("move.uiZoom", updateButtonStates);
67896     };
67897   }
67898
67899   // modules/ui/sections/raw_tag_editor.js
67900   function uiSectionRawTagEditor(id2, context) {
67901     var section = uiSection(id2, context).classes("raw-tag-editor").label(function() {
67902       var count = Object.keys(_tags).filter(function(d) {
67903         return d;
67904       }).length;
67905       return _t.append("inspector.title_count", { title: _t("inspector.tags"), count });
67906     }).expandedByDefault(false).disclosureContent(renderDisclosureContent);
67907     var taginfo = services.taginfo;
67908     var dispatch10 = dispatch_default("change");
67909     var availableViews = [
67910       { id: "list", icon: "#fas-th-list" },
67911       { id: "text", icon: "#fas-i-cursor" }
67912     ];
67913     var _tagView = corePreferences("raw-tag-editor-view") || "list";
67914     var _readOnlyTags = [];
67915     var _orderedKeys = [];
67916     var _showBlank = false;
67917     var _pendingChange = null;
67918     var _state;
67919     var _presets;
67920     var _tags;
67921     var _entityIDs;
67922     var _didInteract = false;
67923     function interacted() {
67924       _didInteract = true;
67925     }
67926     function renderDisclosureContent(wrap2) {
67927       _orderedKeys = _orderedKeys.filter(function(key) {
67928         return _tags[key] !== void 0;
67929       });
67930       var all = Object.keys(_tags).sort();
67931       var missingKeys = utilArrayDifference(all, _orderedKeys);
67932       for (var i2 in missingKeys) {
67933         _orderedKeys.push(missingKeys[i2]);
67934       }
67935       var rowData = _orderedKeys.map(function(key, i3) {
67936         return { index: i3, key, value: _tags[key] };
67937       });
67938       if (!rowData.length || _showBlank) {
67939         _showBlank = false;
67940         rowData.push({ index: rowData.length, key: "", value: "" });
67941       }
67942       var options2 = wrap2.selectAll(".raw-tag-options").data([0]);
67943       options2.exit().remove();
67944       var optionsEnter = options2.enter().insert("div", ":first-child").attr("class", "raw-tag-options").attr("role", "tablist");
67945       var optionEnter = optionsEnter.selectAll(".raw-tag-option").data(availableViews, function(d) {
67946         return d.id;
67947       }).enter();
67948       optionEnter.append("button").attr("class", function(d) {
67949         return "raw-tag-option raw-tag-option-" + d.id + (_tagView === d.id ? " selected" : "");
67950       }).attr("aria-selected", function(d) {
67951         return _tagView === d.id;
67952       }).attr("role", "tab").attr("title", function(d) {
67953         return _t("icons." + d.id);
67954       }).on("click", function(d3_event, d) {
67955         _tagView = d.id;
67956         corePreferences("raw-tag-editor-view", d.id);
67957         wrap2.selectAll(".raw-tag-option").classed("selected", function(datum2) {
67958           return datum2 === d;
67959         }).attr("aria-selected", function(datum2) {
67960           return datum2 === d;
67961         });
67962         wrap2.selectAll(".tag-text").classed("hide", d.id !== "text").each(setTextareaHeight);
67963         wrap2.selectAll(".tag-list, .add-row").classed("hide", d.id !== "list");
67964       }).each(function(d) {
67965         select_default2(this).call(svgIcon(d.icon));
67966       });
67967       var textData = rowsToText(rowData);
67968       var textarea = wrap2.selectAll(".tag-text").data([0]);
67969       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);
67970       textarea.call(utilGetSetValue, textData).each(setTextareaHeight).on("input", setTextareaHeight).on("focus", interacted).on("blur", textChanged).on("change", textChanged);
67971       var list = wrap2.selectAll(".tag-list").data([0]);
67972       list = list.enter().append("ul").attr("class", "tag-list" + (_tagView !== "list" ? " hide" : "")).merge(list);
67973       var addRowEnter = wrap2.selectAll(".add-row").data([0]).enter().append("div").attr("class", "add-row" + (_tagView !== "list" ? " hide" : ""));
67974       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);
67975       addRowEnter.append("div").attr("class", "space-value");
67976       addRowEnter.append("div").attr("class", "space-buttons");
67977       var items = list.selectAll(".tag-row").data(rowData, function(d) {
67978         return d.key;
67979       });
67980       items.exit().each(unbind).remove();
67981       var itemsEnter = items.enter().append("li").attr("class", "tag-row").classed("readonly", isReadOnly);
67982       var innerWrap = itemsEnter.append("div").attr("class", "inner-wrap");
67983       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);
67984       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);
67985       innerWrap.append("button").attr("class", "form-field-button remove").attr("title", _t("icons.remove")).call(svgIcon("#iD-operation-delete"));
67986       items = items.merge(itemsEnter).sort(function(a, b) {
67987         return a.index - b.index;
67988       });
67989       items.each(function(d) {
67990         var row = select_default2(this);
67991         var key = row.select("input.key");
67992         var value = row.select("input.value");
67993         if (_entityIDs && taginfo && _state !== "hover") {
67994           bindTypeahead(key, value);
67995         }
67996         var referenceOptions = { key: d.key };
67997         if (typeof d.value === "string") {
67998           referenceOptions.value = d.value;
67999         }
68000         var reference = uiTagReference(referenceOptions, context);
68001         if (_state === "hover") {
68002           reference.showing(false);
68003         }
68004         row.select(".inner-wrap").call(reference.button);
68005         row.call(reference.body);
68006         row.select("button.remove");
68007       });
68008       items.selectAll("input.key").attr("title", function(d) {
68009         return d.key;
68010       }).call(utilGetSetValue, function(d) {
68011         return d.key;
68012       }).attr("readonly", function(d) {
68013         return isReadOnly(d) || null;
68014       });
68015       items.selectAll("input.value").attr("title", function(d) {
68016         return Array.isArray(d.value) ? d.value.filter(Boolean).join("\n") : d.value;
68017       }).classed("mixed", function(d) {
68018         return Array.isArray(d.value);
68019       }).attr("placeholder", function(d) {
68020         return typeof d.value === "string" ? null : _t("inspector.multiple_values");
68021       }).call(utilGetSetValue, function(d) {
68022         return typeof d.value === "string" ? d.value : "";
68023       }).attr("readonly", function(d) {
68024         return isReadOnly(d) || null;
68025       });
68026       items.selectAll("button.remove").on(("PointerEvent" in window ? "pointer" : "mouse") + "down", removeTag);
68027     }
68028     function isReadOnly(d) {
68029       for (var i2 = 0; i2 < _readOnlyTags.length; i2++) {
68030         if (d.key.match(_readOnlyTags[i2]) !== null) {
68031           return true;
68032         }
68033       }
68034       return false;
68035     }
68036     function setTextareaHeight() {
68037       if (_tagView !== "text")
68038         return;
68039       var selection2 = select_default2(this);
68040       var matches = selection2.node().value.match(/\n/g);
68041       var lineCount = 2 + Number(matches && matches.length);
68042       var lineHeight = 20;
68043       selection2.style("height", lineCount * lineHeight + "px");
68044     }
68045     function stringify3(s) {
68046       return JSON.stringify(s).slice(1, -1);
68047     }
68048     function unstringify(s) {
68049       var leading = "";
68050       var trailing = "";
68051       if (s.length < 1 || s.charAt(0) !== '"') {
68052         leading = '"';
68053       }
68054       if (s.length < 2 || s.charAt(s.length - 1) !== '"' || s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === "\\") {
68055         trailing = '"';
68056       }
68057       return JSON.parse(leading + s + trailing);
68058     }
68059     function rowsToText(rows) {
68060       var str2 = rows.filter(function(row) {
68061         return row.key && row.key.trim() !== "";
68062       }).map(function(row) {
68063         var rawVal = row.value;
68064         if (typeof rawVal !== "string")
68065           rawVal = "*";
68066         var val = rawVal ? stringify3(rawVal) : "";
68067         return stringify3(row.key) + "=" + val;
68068       }).join("\n");
68069       if (_state !== "hover" && str2.length) {
68070         return str2 + "\n";
68071       }
68072       return str2;
68073     }
68074     function textChanged() {
68075       var newText = this.value.trim();
68076       var newTags = {};
68077       newText.split("\n").forEach(function(row) {
68078         var m = row.match(/^\s*([^=]+)=(.*)$/);
68079         if (m !== null) {
68080           var k = context.cleanTagKey(unstringify(m[1].trim()));
68081           var v = context.cleanTagValue(unstringify(m[2].trim()));
68082           newTags[k] = v;
68083         }
68084       });
68085       var tagDiff = utilTagDiff(_tags, newTags);
68086       if (!tagDiff.length)
68087         return;
68088       _pendingChange = _pendingChange || {};
68089       tagDiff.forEach(function(change) {
68090         if (isReadOnly({ key: change.key }))
68091           return;
68092         if (change.newVal === "*" && typeof change.oldVal !== "string")
68093           return;
68094         if (change.type === "-") {
68095           _pendingChange[change.key] = void 0;
68096         } else if (change.type === "+") {
68097           _pendingChange[change.key] = change.newVal || "";
68098         }
68099       });
68100       if (Object.keys(_pendingChange).length === 0) {
68101         _pendingChange = null;
68102         return;
68103       }
68104       scheduleChange();
68105     }
68106     function pushMore(d3_event) {
68107       if (d3_event.keyCode === 9 && !d3_event.shiftKey && section.selection().selectAll(".tag-list li:last-child input.value").node() === this && utilGetSetValue(select_default2(this))) {
68108         addTag();
68109       }
68110     }
68111     function bindTypeahead(key, value) {
68112       if (isReadOnly(key.datum()))
68113         return;
68114       if (Array.isArray(value.datum().value)) {
68115         value.call(uiCombobox(context, "tag-value").minItems(1).fetcher(function(value2, callback) {
68116           var keyString = utilGetSetValue(key);
68117           if (!_tags[keyString])
68118             return;
68119           var data = _tags[keyString].filter(Boolean).map(function(tagValue) {
68120             return {
68121               value: tagValue,
68122               title: tagValue
68123             };
68124           });
68125           callback(data);
68126         }));
68127         return;
68128       }
68129       var geometry = context.graph().geometry(_entityIDs[0]);
68130       key.call(uiCombobox(context, "tag-key").fetcher(function(value2, callback) {
68131         taginfo.keys({
68132           debounce: true,
68133           geometry,
68134           query: value2
68135         }, function(err, data) {
68136           if (!err) {
68137             const filtered = data.filter((d) => _tags[d.value] === void 0).filter((d) => d.value.toLowerCase().includes(value2.toLowerCase()));
68138             callback(sort(value2, filtered));
68139           }
68140         });
68141       }));
68142       value.call(uiCombobox(context, "tag-value").fetcher(function(value2, callback) {
68143         taginfo.values({
68144           debounce: true,
68145           key: utilGetSetValue(key),
68146           geometry,
68147           query: value2
68148         }, function(err, data) {
68149           if (!err) {
68150             const filtered = data.filter((d) => d.value.toLowerCase().includes(value2.toLowerCase()));
68151             callback(sort(value2, filtered));
68152           }
68153         });
68154       }).caseSensitive(allowUpperCaseTagValues.test(utilGetSetValue(key))));
68155       function sort(value2, data) {
68156         var sameletter = [];
68157         var other = [];
68158         for (var i2 = 0; i2 < data.length; i2++) {
68159           if (data[i2].value.substring(0, value2.length) === value2) {
68160             sameletter.push(data[i2]);
68161           } else {
68162             other.push(data[i2]);
68163           }
68164         }
68165         return sameletter.concat(other);
68166       }
68167     }
68168     function unbind() {
68169       var row = select_default2(this);
68170       row.selectAll("input.key").call(uiCombobox.off, context);
68171       row.selectAll("input.value").call(uiCombobox.off, context);
68172     }
68173     function keyChange(d3_event, d) {
68174       if (select_default2(this).attr("readonly"))
68175         return;
68176       var kOld = d.key;
68177       if (_pendingChange && _pendingChange.hasOwnProperty(kOld) && _pendingChange[kOld] === void 0)
68178         return;
68179       var kNew = context.cleanTagKey(this.value.trim());
68180       if (isReadOnly({ key: kNew })) {
68181         this.value = kOld;
68182         return;
68183       }
68184       if (kNew && kNew !== kOld && _tags[kNew] !== void 0) {
68185         this.value = kOld;
68186         section.selection().selectAll(".tag-list input.value").each(function(d2) {
68187           if (d2.key === kNew) {
68188             var input = select_default2(this).node();
68189             input.focus();
68190             input.select();
68191           }
68192         });
68193         return;
68194       }
68195       _pendingChange = _pendingChange || {};
68196       if (kOld) {
68197         if (kOld === kNew)
68198           return;
68199         _pendingChange[kNew] = _pendingChange[kOld] || { oldKey: kOld };
68200         _pendingChange[kOld] = void 0;
68201       } else {
68202         let row = this.parentNode.parentNode;
68203         let inputVal = select_default2(row).selectAll("input.value");
68204         let vNew = context.cleanTagValue(utilGetSetValue(inputVal));
68205         _pendingChange[kNew] = vNew;
68206         utilGetSetValue(inputVal, vNew);
68207       }
68208       var existingKeyIndex = _orderedKeys.indexOf(kOld);
68209       if (existingKeyIndex !== -1)
68210         _orderedKeys[existingKeyIndex] = kNew;
68211       d.key = kNew;
68212       this.value = kNew;
68213       scheduleChange();
68214     }
68215     function valueChange(d3_event, d) {
68216       if (isReadOnly(d))
68217         return;
68218       if (typeof d.value !== "string" && !this.value)
68219         return;
68220       if (_pendingChange && _pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === void 0)
68221         return;
68222       _pendingChange = _pendingChange || {};
68223       _pendingChange[d.key] = context.cleanTagValue(this.value);
68224       scheduleChange();
68225     }
68226     function removeTag(d3_event, d) {
68227       if (isReadOnly(d))
68228         return;
68229       if (d.key === "") {
68230         _showBlank = false;
68231         section.reRender();
68232       } else {
68233         _orderedKeys = _orderedKeys.filter(function(key) {
68234           return key !== d.key;
68235         });
68236         _pendingChange = _pendingChange || {};
68237         _pendingChange[d.key] = void 0;
68238         scheduleChange();
68239       }
68240     }
68241     function addTag() {
68242       window.setTimeout(function() {
68243         _showBlank = true;
68244         section.reRender();
68245         section.selection().selectAll(".tag-list li:last-child input.key").node().focus();
68246       }, 20);
68247     }
68248     function scheduleChange() {
68249       var entityIDs = _entityIDs;
68250       window.setTimeout(function() {
68251         if (!_pendingChange)
68252           return;
68253         dispatch10.call("change", this, entityIDs, _pendingChange);
68254         _pendingChange = null;
68255       }, 10);
68256     }
68257     section.state = function(val) {
68258       if (!arguments.length)
68259         return _state;
68260       if (_state !== val) {
68261         _orderedKeys = [];
68262         _state = val;
68263       }
68264       return section;
68265     };
68266     section.presets = function(val) {
68267       if (!arguments.length)
68268         return _presets;
68269       _presets = val;
68270       if (_presets && _presets.length && _presets[0].isFallback()) {
68271         section.disclosureExpanded(true);
68272       } else if (!_didInteract) {
68273         section.disclosureExpanded(null);
68274       }
68275       return section;
68276     };
68277     section.tags = function(val) {
68278       if (!arguments.length)
68279         return _tags;
68280       _tags = val;
68281       return section;
68282     };
68283     section.entityIDs = function(val) {
68284       if (!arguments.length)
68285         return _entityIDs;
68286       if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) {
68287         _entityIDs = val;
68288         _orderedKeys = [];
68289       }
68290       return section;
68291     };
68292     section.readOnlyTags = function(val) {
68293       if (!arguments.length)
68294         return _readOnlyTags;
68295       _readOnlyTags = val;
68296       return section;
68297     };
68298     return utilRebind(section, dispatch10, "on");
68299   }
68300
68301   // modules/ui/data_editor.js
68302   function uiDataEditor(context) {
68303     var dataHeader = uiDataHeader();
68304     var rawTagEditor = uiSectionRawTagEditor("custom-data-tag-editor", context).expandedByDefault(true).readOnlyTags([/./]);
68305     var _datum;
68306     function dataEditor(selection2) {
68307       var header = selection2.selectAll(".header").data([0]);
68308       var headerEnter = header.enter().append("div").attr("class", "header fillL");
68309       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", function() {
68310         context.enter(modeBrowse(context));
68311       }).call(svgIcon("#iD-icon-close"));
68312       headerEnter.append("h2").call(_t.append("map_data.title"));
68313       var body = selection2.selectAll(".body").data([0]);
68314       body = body.enter().append("div").attr("class", "body").merge(body);
68315       var editor = body.selectAll(".data-editor").data([0]);
68316       editor.enter().append("div").attr("class", "modal-section data-editor").merge(editor).call(dataHeader.datum(_datum));
68317       var rte = body.selectAll(".raw-tag-editor").data([0]);
68318       rte.enter().append("div").attr("class", "raw-tag-editor data-editor").merge(rte).call(
68319         rawTagEditor.tags(_datum && _datum.properties || {}).state("hover").render
68320       ).selectAll("textarea.tag-text").attr("readonly", true).classed("readonly", true);
68321     }
68322     dataEditor.datum = function(val) {
68323       if (!arguments.length)
68324         return _datum;
68325       _datum = val;
68326       return this;
68327     };
68328     return dataEditor;
68329   }
68330
68331   // modules/ui/osmose_details.js
68332   function uiOsmoseDetails(context) {
68333     let _qaItem;
68334     function issueString(d, type2) {
68335       if (!d)
68336         return "";
68337       const s = services.osmose.getStrings(d.itemType);
68338       return type2 in s ? s[type2] : "";
68339     }
68340     function osmoseDetails(selection2) {
68341       const details = selection2.selectAll(".error-details").data(
68342         _qaItem ? [_qaItem] : [],
68343         (d) => `${d.id}-${d.status || 0}`
68344       );
68345       details.exit().remove();
68346       const detailsEnter = details.enter().append("div").attr("class", "error-details qa-details-container");
68347       if (issueString(_qaItem, "detail")) {
68348         const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
68349         div.append("h4").call(_t.append("QA.keepRight.detail_description"));
68350         div.append("p").attr("class", "qa-details-description-text").html((d) => issueString(d, "detail")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
68351       }
68352       const detailsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection");
68353       const elemsDiv = detailsEnter.append("div").attr("class", "qa-details-subsection");
68354       if (issueString(_qaItem, "fix")) {
68355         const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
68356         div.append("h4").call(_t.append("QA.osmose.fix_title"));
68357         div.append("p").html((d) => issueString(d, "fix")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
68358       }
68359       if (issueString(_qaItem, "trap")) {
68360         const div = detailsEnter.append("div").attr("class", "qa-details-subsection");
68361         div.append("h4").call(_t.append("QA.osmose.trap_title"));
68362         div.append("p").html((d) => issueString(d, "trap")).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
68363       }
68364       const thisItem = _qaItem;
68365       services.osmose.loadIssueDetail(_qaItem).then((d) => {
68366         if (!d.elems || d.elems.length === 0)
68367           return;
68368         if (context.selectedErrorID() !== thisItem.id && context.container().selectAll(`.qaItem.osmose.hover.itemId-${thisItem.id}`).empty())
68369           return;
68370         if (d.detail) {
68371           detailsDiv.append("h4").call(_t.append("QA.osmose.detail_title"));
68372           detailsDiv.append("p").html((d2) => d2.detail).selectAll("a").attr("rel", "noopener").attr("target", "_blank");
68373         }
68374         elemsDiv.append("h4").call(_t.append("QA.osmose.elems_title"));
68375         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() {
68376           const link2 = select_default2(this);
68377           const entityID = this.textContent;
68378           const entity = context.hasEntity(entityID);
68379           link2.on("mouseenter", () => {
68380             utilHighlightEntities([entityID], true, context);
68381           }).on("mouseleave", () => {
68382             utilHighlightEntities([entityID], false, context);
68383           }).on("click", (d3_event) => {
68384             d3_event.preventDefault();
68385             utilHighlightEntities([entityID], false, context);
68386             const osmlayer = context.layers().layer("osm");
68387             if (!osmlayer.enabled()) {
68388               osmlayer.enabled(true);
68389             }
68390             context.map().centerZoom(d.loc, 20);
68391             if (entity) {
68392               context.enter(modeSelect(context, [entityID]));
68393             } else {
68394               context.loadEntity(entityID, (err, result) => {
68395                 if (err)
68396                   return;
68397                 const entity2 = result.data.find((e) => e.id === entityID);
68398                 if (entity2)
68399                   context.enter(modeSelect(context, [entityID]));
68400               });
68401             }
68402           });
68403           if (entity) {
68404             let name = utilDisplayName(entity);
68405             if (!name) {
68406               const preset = _mainPresetIndex.match(entity, context.graph());
68407               name = preset && !preset.isFallback() && preset.name();
68408             }
68409             if (name) {
68410               this.innerText = name;
68411             }
68412           }
68413         });
68414         context.features().forceVisible(d.elems);
68415         context.map().pan([0, 0]);
68416       }).catch((err) => {
68417         console.log(err);
68418       });
68419     }
68420     osmoseDetails.issue = function(val) {
68421       if (!arguments.length)
68422         return _qaItem;
68423       _qaItem = val;
68424       return osmoseDetails;
68425     };
68426     return osmoseDetails;
68427   }
68428
68429   // modules/ui/osmose_header.js
68430   function uiOsmoseHeader() {
68431     let _qaItem;
68432     function issueTitle(d) {
68433       const unknown = _t("inspector.unknown");
68434       if (!d)
68435         return unknown;
68436       const s = services.osmose.getStrings(d.itemType);
68437       return "title" in s ? s.title : unknown;
68438     }
68439     function osmoseHeader(selection2) {
68440       const header = selection2.selectAll(".qa-header").data(
68441         _qaItem ? [_qaItem] : [],
68442         (d) => `${d.id}-${d.status || 0}`
68443       );
68444       header.exit().remove();
68445       const headerEnter = header.enter().append("div").attr("class", "qa-header");
68446       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}`);
68447       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");
68448       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 : "");
68449       headerEnter.append("div").attr("class", "qa-header-label").text(issueTitle);
68450     }
68451     osmoseHeader.issue = function(val) {
68452       if (!arguments.length)
68453         return _qaItem;
68454       _qaItem = val;
68455       return osmoseHeader;
68456     };
68457     return osmoseHeader;
68458   }
68459
68460   // modules/ui/view_on_osmose.js
68461   function uiViewOnOsmose() {
68462     let _qaItem;
68463     function viewOnOsmose(selection2) {
68464       let url;
68465       if (services.osmose && _qaItem instanceof QAItem) {
68466         url = services.osmose.itemURL(_qaItem);
68467       }
68468       const link2 = selection2.selectAll(".view-on-osmose").data(url ? [url] : []);
68469       link2.exit().remove();
68470       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"));
68471       linkEnter.append("span").call(_t.append("inspector.view_on_osmose"));
68472     }
68473     viewOnOsmose.what = function(val) {
68474       if (!arguments.length)
68475         return _qaItem;
68476       _qaItem = val;
68477       return viewOnOsmose;
68478     };
68479     return viewOnOsmose;
68480   }
68481
68482   // modules/ui/osmose_editor.js
68483   function uiOsmoseEditor(context) {
68484     const dispatch10 = dispatch_default("change");
68485     const qaDetails = uiOsmoseDetails(context);
68486     const qaHeader = uiOsmoseHeader(context);
68487     let _qaItem;
68488     function osmoseEditor(selection2) {
68489       const header = selection2.selectAll(".header").data([0]);
68490       const headerEnter = header.enter().append("div").attr("class", "header fillL");
68491       headerEnter.append("button").attr("class", "close").attr("title", _t("icons.close")).on("click", () => context.enter(modeBrowse(context))).call(svgIcon("#iD-icon-close"));
68492       headerEnter.append("h2").call(_t.append("QA.osmose.title"));
68493       let body = selection2.selectAll(".body").data([0]);
68494       body = body.enter().append("div").attr("class", "body").merge(body);
68495       let editor = body.selectAll(".qa-editor").data([0]);
68496       editor.enter().append("div").attr("class", "modal-section qa-editor").merge(editor).call(qaHeader.issue(_qaItem)).call(qaDetails.issue(_qaItem)).call(osmoseSaveSection);
68497       const footer = selection2.selectAll(".footer").data([0]);
68498       footer.enter().append("div").attr("class", "footer").merge(footer).call(uiViewOnOsmose(context).what(_qaItem));
68499     }
68500     function osmoseSaveSection(selection2) {
68501       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
68502       const isShown = _qaItem && isSelected;
68503       let saveSection = selection2.selectAll(".qa-save").data(
68504         isShown ? [_qaItem] : [],
68505         (d) => `${d.id}-${d.status || 0}`
68506       );
68507       saveSection.exit().remove();
68508       const saveSectionEnter = saveSection.enter().append("div").attr("class", "qa-save save-section cf");
68509       saveSection = saveSectionEnter.merge(saveSection).call(qaSaveButtons);
68510     }
68511     function qaSaveButtons(selection2) {
68512       const isSelected = _qaItem && _qaItem.id === context.selectedErrorID();
68513       let buttonSection = selection2.selectAll(".buttons").data(isSelected ? [_qaItem] : [], (d) => d.status + d.id);
68514       buttonSection.exit().remove();
68515       const buttonEnter = buttonSection.enter().append("div").attr("class", "buttons");
68516       buttonEnter.append("button").attr("class", "button close-button action");
68517       buttonEnter.append("button").attr("class", "button ignore-button action");
68518       buttonSection = buttonSection.merge(buttonEnter);
68519       buttonSection.select(".close-button").call(_t.append("QA.keepRight.close")).on("click.close", function(d3_event, d) {
68520         this.blur();
68521         const qaService = services.osmose;
68522         if (qaService) {
68523           d.newStatus = "done";
68524           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
68525         }
68526       });
68527       buttonSection.select(".ignore-button").call(_t.append("QA.keepRight.ignore")).on("click.ignore", function(d3_event, d) {
68528         this.blur();
68529         const qaService = services.osmose;
68530         if (qaService) {
68531           d.newStatus = "false";
68532           qaService.postUpdate(d, (err, item) => dispatch10.call("change", item));
68533         }
68534       });
68535     }
68536     osmoseEditor.error = function(val) {
68537       if (!arguments.length)
68538         return _qaItem;
68539       _qaItem = val;
68540       return osmoseEditor;
68541     };
68542     return utilRebind(osmoseEditor, dispatch10, "on");
68543   }
68544
68545   // modules/ui/sidebar.js
68546   function uiSidebar(context) {
68547     var inspector = uiInspector(context);
68548     var dataEditor = uiDataEditor(context);
68549     var noteEditor = uiNoteEditor(context);
68550     var improveOsmEditor = uiImproveOsmEditor(context);
68551     var keepRightEditor = uiKeepRightEditor(context);
68552     var osmoseEditor = uiOsmoseEditor(context);
68553     var _current;
68554     var _wasData = false;
68555     var _wasNote = false;
68556     var _wasQaItem = false;
68557     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
68558     function sidebar(selection2) {
68559       var container = context.container();
68560       var minWidth = 240;
68561       var sidebarWidth;
68562       var containerWidth;
68563       var dragOffset;
68564       selection2.style("min-width", minWidth + "px").style("max-width", "400px").style("width", "33.3333%");
68565       var resizer = selection2.append("div").attr("class", "sidebar-resizer").on(_pointerPrefix + "down.sidebar-resizer", pointerdown);
68566       var downPointerId, lastClientX, containerLocGetter;
68567       function pointerdown(d3_event) {
68568         if (downPointerId)
68569           return;
68570         if ("button" in d3_event && d3_event.button !== 0)
68571           return;
68572         downPointerId = d3_event.pointerId || "mouse";
68573         lastClientX = d3_event.clientX;
68574         containerLocGetter = utilFastMouse(container.node());
68575         dragOffset = utilFastMouse(resizer.node())(d3_event)[0] - 1;
68576         sidebarWidth = selection2.node().getBoundingClientRect().width;
68577         containerWidth = container.node().getBoundingClientRect().width;
68578         var widthPct = sidebarWidth / containerWidth * 100;
68579         selection2.style("width", widthPct + "%").style("max-width", "85%");
68580         resizer.classed("dragging", true);
68581         select_default2(window).on("touchmove.sidebar-resizer", function(d3_event2) {
68582           d3_event2.preventDefault();
68583         }, { passive: false }).on(_pointerPrefix + "move.sidebar-resizer", pointermove).on(_pointerPrefix + "up.sidebar-resizer pointercancel.sidebar-resizer", pointerup);
68584       }
68585       function pointermove(d3_event) {
68586         if (downPointerId !== (d3_event.pointerId || "mouse"))
68587           return;
68588         d3_event.preventDefault();
68589         var dx = d3_event.clientX - lastClientX;
68590         lastClientX = d3_event.clientX;
68591         var isRTL = _mainLocalizer.textDirection() === "rtl";
68592         var scaleX = isRTL ? 0 : 1;
68593         var xMarginProperty = isRTL ? "margin-right" : "margin-left";
68594         var x = containerLocGetter(d3_event)[0] - dragOffset;
68595         sidebarWidth = isRTL ? containerWidth - x : x;
68596         var isCollapsed = selection2.classed("collapsed");
68597         var shouldCollapse = sidebarWidth < minWidth;
68598         selection2.classed("collapsed", shouldCollapse);
68599         if (shouldCollapse) {
68600           if (!isCollapsed) {
68601             selection2.style(xMarginProperty, "-400px").style("width", "400px");
68602             context.ui().onResize([(sidebarWidth - dx) * scaleX, 0]);
68603           }
68604         } else {
68605           var widthPct = sidebarWidth / containerWidth * 100;
68606           selection2.style(xMarginProperty, null).style("width", widthPct + "%");
68607           if (isCollapsed) {
68608             context.ui().onResize([-sidebarWidth * scaleX, 0]);
68609           } else {
68610             context.ui().onResize([-dx * scaleX, 0]);
68611           }
68612         }
68613       }
68614       function pointerup(d3_event) {
68615         if (downPointerId !== (d3_event.pointerId || "mouse"))
68616           return;
68617         downPointerId = null;
68618         resizer.classed("dragging", false);
68619         select_default2(window).on("touchmove.sidebar-resizer", null).on(_pointerPrefix + "move.sidebar-resizer", null).on(_pointerPrefix + "up.sidebar-resizer pointercancel.sidebar-resizer", null);
68620       }
68621       var featureListWrap = selection2.append("div").attr("class", "feature-list-pane").call(uiFeatureList(context));
68622       var inspectorWrap = selection2.append("div").attr("class", "inspector-hidden inspector-wrap");
68623       var hoverModeSelect = function(targets) {
68624         context.container().selectAll(".feature-list-item button").classed("hover", false);
68625         if (context.selectedIDs().length > 1 && targets && targets.length) {
68626           var elements = context.container().selectAll(".feature-list-item button").filter(function(node) {
68627             return targets.indexOf(node) !== -1;
68628           });
68629           if (!elements.empty()) {
68630             elements.classed("hover", true);
68631           }
68632         }
68633       };
68634       sidebar.hoverModeSelect = throttle_default(hoverModeSelect, 200);
68635       function hover(targets) {
68636         var datum2 = targets && targets.length && targets[0];
68637         if (datum2 && datum2.__featurehash__) {
68638           _wasData = true;
68639           sidebar.show(dataEditor.datum(datum2));
68640           selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
68641         } else if (datum2 instanceof osmNote) {
68642           if (context.mode().id === "drag-note")
68643             return;
68644           _wasNote = true;
68645           var osm = services.osm;
68646           if (osm) {
68647             datum2 = osm.getNote(datum2.id);
68648           }
68649           sidebar.show(noteEditor.note(datum2));
68650           selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
68651         } else if (datum2 instanceof QAItem) {
68652           _wasQaItem = true;
68653           var errService = services[datum2.service];
68654           if (errService) {
68655             datum2 = errService.getError(datum2.id);
68656           }
68657           var errEditor;
68658           if (datum2.service === "keepRight") {
68659             errEditor = keepRightEditor;
68660           } else if (datum2.service === "osmose") {
68661             errEditor = osmoseEditor;
68662           } else {
68663             errEditor = improveOsmEditor;
68664           }
68665           context.container().selectAll(".qaItem." + datum2.service).classed("hover", function(d) {
68666             return d.id === datum2.id;
68667           });
68668           sidebar.show(errEditor.error(datum2));
68669           selection2.selectAll(".sidebar-component").classed("inspector-hover", true);
68670         } else if (!_current && datum2 instanceof osmEntity) {
68671           featureListWrap.classed("inspector-hidden", true);
68672           inspectorWrap.classed("inspector-hidden", false).classed("inspector-hover", true);
68673           if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), [datum2.id]) || inspector.state() !== "hover") {
68674             inspector.state("hover").entityIDs([datum2.id]).newFeature(false);
68675             inspectorWrap.call(inspector);
68676           }
68677         } else if (!_current) {
68678           featureListWrap.classed("inspector-hidden", false);
68679           inspectorWrap.classed("inspector-hidden", true);
68680           inspector.state("hide");
68681         } else if (_wasData || _wasNote || _wasQaItem) {
68682           _wasNote = false;
68683           _wasData = false;
68684           _wasQaItem = false;
68685           context.container().selectAll(".note").classed("hover", false);
68686           context.container().selectAll(".qaItem").classed("hover", false);
68687           sidebar.hide();
68688         }
68689       }
68690       sidebar.hover = throttle_default(hover, 200);
68691       sidebar.intersects = function(extent) {
68692         var rect = selection2.node().getBoundingClientRect();
68693         return extent.intersects([
68694           context.projection.invert([0, rect.height]),
68695           context.projection.invert([rect.width, 0])
68696         ]);
68697       };
68698       sidebar.select = function(ids, newFeature) {
68699         sidebar.hide();
68700         if (ids && ids.length) {
68701           var entity = ids.length === 1 && context.entity(ids[0]);
68702           if (entity && newFeature && selection2.classed("collapsed")) {
68703             var extent = entity.extent(context.graph());
68704             sidebar.expand(sidebar.intersects(extent));
68705           }
68706           featureListWrap.classed("inspector-hidden", true);
68707           inspectorWrap.classed("inspector-hidden", false).classed("inspector-hover", false);
68708           inspector.state("select").entityIDs(ids).newFeature(newFeature);
68709           inspectorWrap.call(inspector);
68710         } else {
68711           inspector.state("hide");
68712         }
68713       };
68714       sidebar.showPresetList = function() {
68715         inspector.showList();
68716       };
68717       sidebar.show = function(component, element) {
68718         featureListWrap.classed("inspector-hidden", true);
68719         inspectorWrap.classed("inspector-hidden", true);
68720         if (_current)
68721           _current.remove();
68722         _current = selection2.append("div").attr("class", "sidebar-component").call(component, element);
68723       };
68724       sidebar.hide = function() {
68725         featureListWrap.classed("inspector-hidden", false);
68726         inspectorWrap.classed("inspector-hidden", true);
68727         if (_current)
68728           _current.remove();
68729         _current = null;
68730       };
68731       sidebar.expand = function(moveMap) {
68732         if (selection2.classed("collapsed")) {
68733           sidebar.toggle(moveMap);
68734         }
68735       };
68736       sidebar.collapse = function(moveMap) {
68737         if (!selection2.classed("collapsed")) {
68738           sidebar.toggle(moveMap);
68739         }
68740       };
68741       sidebar.toggle = function(moveMap) {
68742         if (context.inIntro())
68743           return;
68744         var isCollapsed = selection2.classed("collapsed");
68745         var isCollapsing = !isCollapsed;
68746         var isRTL = _mainLocalizer.textDirection() === "rtl";
68747         var scaleX = isRTL ? 0 : 1;
68748         var xMarginProperty = isRTL ? "margin-right" : "margin-left";
68749         sidebarWidth = selection2.node().getBoundingClientRect().width;
68750         selection2.style("width", sidebarWidth + "px");
68751         var startMargin, endMargin, lastMargin;
68752         if (isCollapsing) {
68753           startMargin = lastMargin = 0;
68754           endMargin = -sidebarWidth;
68755         } else {
68756           startMargin = lastMargin = -sidebarWidth;
68757           endMargin = 0;
68758         }
68759         if (!isCollapsing) {
68760           selection2.classed("collapsed", isCollapsing);
68761         }
68762         selection2.transition().style(xMarginProperty, endMargin + "px").tween("panner", function() {
68763           var i2 = number_default(startMargin, endMargin);
68764           return function(t) {
68765             var dx = lastMargin - Math.round(i2(t));
68766             lastMargin = lastMargin - dx;
68767             context.ui().onResize(moveMap ? void 0 : [dx * scaleX, 0]);
68768           };
68769         }).on("end", function() {
68770           if (isCollapsing) {
68771             selection2.classed("collapsed", isCollapsing);
68772           }
68773           if (!isCollapsing) {
68774             var containerWidth2 = container.node().getBoundingClientRect().width;
68775             var widthPct = sidebarWidth / containerWidth2 * 100;
68776             selection2.style(xMarginProperty, null).style("width", widthPct + "%");
68777           }
68778         });
68779       };
68780       resizer.on("dblclick", function(d3_event) {
68781         d3_event.preventDefault();
68782         if (d3_event.sourceEvent) {
68783           d3_event.sourceEvent.preventDefault();
68784         }
68785         sidebar.toggle();
68786       });
68787       context.map().on("crossEditableZoom.sidebar", function(within) {
68788         if (!within && !selection2.select(".inspector-hover").empty()) {
68789           hover([]);
68790         }
68791       });
68792     }
68793     sidebar.showPresetList = function() {
68794     };
68795     sidebar.hover = function() {
68796     };
68797     sidebar.hover.cancel = function() {
68798     };
68799     sidebar.intersects = function() {
68800     };
68801     sidebar.select = function() {
68802     };
68803     sidebar.show = function() {
68804     };
68805     sidebar.hide = function() {
68806     };
68807     sidebar.expand = function() {
68808     };
68809     sidebar.collapse = function() {
68810     };
68811     sidebar.toggle = function() {
68812     };
68813     return sidebar;
68814   }
68815
68816   // modules/modes/draw_area.js
68817   function modeDrawArea(context, wayID, startGraph, button) {
68818     var mode = {
68819       button,
68820       id: "draw-area"
68821     };
68822     var behavior = behaviorDrawWay(context, wayID, mode, startGraph).on("rejectedSelfIntersection.modeDrawArea", function() {
68823       context.ui().flash.iconName("#iD-icon-no").label(_t.append("self_intersection.error.areas"))();
68824     });
68825     mode.wayID = wayID;
68826     mode.enter = function() {
68827       context.install(behavior);
68828     };
68829     mode.exit = function() {
68830       context.uninstall(behavior);
68831     };
68832     mode.selectedIDs = function() {
68833       return [wayID];
68834     };
68835     mode.activeID = function() {
68836       return behavior && behavior.activeID() || [];
68837     };
68838     return mode;
68839   }
68840
68841   // modules/modes/add_area.js
68842   function modeAddArea(context, mode) {
68843     mode.id = "add-area";
68844     var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode);
68845     function defaultTags(loc) {
68846       var defaultTags2 = { area: "yes" };
68847       if (mode.preset)
68848         defaultTags2 = mode.preset.setTags(defaultTags2, "area", false, loc);
68849       return defaultTags2;
68850     }
68851     function actionClose(wayId) {
68852       return function(graph) {
68853         return graph.replace(graph.entity(wayId).close());
68854       };
68855     }
68856     function start2(loc) {
68857       var startGraph = context.graph();
68858       var node = osmNode({ loc });
68859       var way = osmWay({ tags: defaultTags(loc) });
68860       context.perform(
68861         actionAddEntity(node),
68862         actionAddEntity(way),
68863         actionAddVertex(way.id, node.id),
68864         actionClose(way.id)
68865       );
68866       context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
68867     }
68868     function startFromWay(loc, edge) {
68869       var startGraph = context.graph();
68870       var node = osmNode({ loc });
68871       var way = osmWay({ tags: defaultTags(loc) });
68872       context.perform(
68873         actionAddEntity(node),
68874         actionAddEntity(way),
68875         actionAddVertex(way.id, node.id),
68876         actionClose(way.id),
68877         actionAddMidpoint({ loc, edge }, node)
68878       );
68879       context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
68880     }
68881     function startFromNode(node) {
68882       var startGraph = context.graph();
68883       var way = osmWay({ tags: defaultTags(node.loc) });
68884       context.perform(
68885         actionAddEntity(way),
68886         actionAddVertex(way.id, node.id),
68887         actionClose(way.id)
68888       );
68889       context.enter(modeDrawArea(context, way.id, startGraph, mode.button));
68890     }
68891     mode.enter = function() {
68892       context.install(behavior);
68893     };
68894     mode.exit = function() {
68895       context.uninstall(behavior);
68896     };
68897     return mode;
68898   }
68899
68900   // modules/modes/add_line.js
68901   function modeAddLine(context, mode) {
68902     mode.id = "add-line";
68903     var behavior = behaviorAddWay(context).on("start", start2).on("startFromWay", startFromWay).on("startFromNode", startFromNode);
68904     function defaultTags(loc) {
68905       var defaultTags2 = {};
68906       if (mode.preset)
68907         defaultTags2 = mode.preset.setTags(defaultTags2, "line", false, loc);
68908       return defaultTags2;
68909     }
68910     function start2(loc) {
68911       var startGraph = context.graph();
68912       var node = osmNode({ loc });
68913       var way = osmWay({ tags: defaultTags(loc) });
68914       context.perform(
68915         actionAddEntity(node),
68916         actionAddEntity(way),
68917         actionAddVertex(way.id, node.id)
68918       );
68919       context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
68920     }
68921     function startFromWay(loc, edge) {
68922       var startGraph = context.graph();
68923       var node = osmNode({ loc });
68924       var way = osmWay({ tags: defaultTags(loc) });
68925       context.perform(
68926         actionAddEntity(node),
68927         actionAddEntity(way),
68928         actionAddVertex(way.id, node.id),
68929         actionAddMidpoint({ loc, edge }, node)
68930       );
68931       context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
68932     }
68933     function startFromNode(node) {
68934       var startGraph = context.graph();
68935       var way = osmWay({ tags: defaultTags(node.loc) });
68936       context.perform(
68937         actionAddEntity(way),
68938         actionAddVertex(way.id, node.id)
68939       );
68940       context.enter(modeDrawLine(context, way.id, startGraph, mode.button));
68941     }
68942     mode.enter = function() {
68943       context.install(behavior);
68944     };
68945     mode.exit = function() {
68946       context.uninstall(behavior);
68947     };
68948     return mode;
68949   }
68950
68951   // modules/modes/add_point.js
68952   function modeAddPoint(context, mode) {
68953     mode.id = "add-point";
68954     var behavior = behaviorDraw(context).on("click", add).on("clickWay", addWay).on("clickNode", addNode).on("cancel", cancel).on("finish", cancel);
68955     function defaultTags(loc) {
68956       var defaultTags2 = {};
68957       if (mode.preset)
68958         defaultTags2 = mode.preset.setTags(defaultTags2, "point", false, loc);
68959       return defaultTags2;
68960     }
68961     function add(loc) {
68962       var node = osmNode({ loc, tags: defaultTags(loc) });
68963       context.perform(
68964         actionAddEntity(node),
68965         _t("operations.add.annotation.point")
68966       );
68967       enterSelectMode(node);
68968     }
68969     function addWay(loc, edge) {
68970       var node = osmNode({ tags: defaultTags(loc) });
68971       context.perform(
68972         actionAddMidpoint({ loc, edge }, node),
68973         _t("operations.add.annotation.vertex")
68974       );
68975       enterSelectMode(node);
68976     }
68977     function enterSelectMode(node) {
68978       context.enter(
68979         modeSelect(context, [node.id]).newFeature(true)
68980       );
68981     }
68982     function addNode(node) {
68983       const _defaultTags = defaultTags(node.loc);
68984       if (Object.keys(_defaultTags).length === 0) {
68985         enterSelectMode(node);
68986         return;
68987       }
68988       var tags = Object.assign({}, node.tags);
68989       for (var key in _defaultTags) {
68990         tags[key] = _defaultTags[key];
68991       }
68992       context.perform(
68993         actionChangeTags(node.id, tags),
68994         _t("operations.add.annotation.point")
68995       );
68996       enterSelectMode(node);
68997     }
68998     function cancel() {
68999       context.enter(modeBrowse(context));
69000     }
69001     mode.enter = function() {
69002       context.install(behavior);
69003     };
69004     mode.exit = function() {
69005       context.uninstall(behavior);
69006     };
69007     return mode;
69008   }
69009
69010   // modules/modes/select_note.js
69011   function modeSelectNote(context, selectedNoteID) {
69012     var mode = {
69013       id: "select-note",
69014       button: "browse"
69015     };
69016     var _keybinding = utilKeybinding("select-note");
69017     var _noteEditor = uiNoteEditor(context).on("change", function() {
69018       context.map().pan([0, 0]);
69019       var note = checkSelectedID();
69020       if (!note)
69021         return;
69022       context.ui().sidebar.show(_noteEditor.note(note));
69023     });
69024     var _behaviors = [
69025       behaviorBreathe(context),
69026       behaviorHover(context),
69027       behaviorSelect(context),
69028       behaviorLasso(context),
69029       modeDragNode(context).behavior,
69030       modeDragNote(context).behavior
69031     ];
69032     var _newFeature = false;
69033     function checkSelectedID() {
69034       if (!services.osm)
69035         return;
69036       var note = services.osm.getNote(selectedNoteID);
69037       if (!note) {
69038         context.enter(modeBrowse(context));
69039       }
69040       return note;
69041     }
69042     function selectNote(d3_event, drawn) {
69043       if (!checkSelectedID())
69044         return;
69045       var selection2 = context.surface().selectAll(".layer-notes .note-" + selectedNoteID);
69046       if (selection2.empty()) {
69047         var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
69048         if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
69049           context.enter(modeBrowse(context));
69050         }
69051       } else {
69052         selection2.classed("selected", true);
69053         context.selectedNoteID(selectedNoteID);
69054       }
69055     }
69056     function esc() {
69057       if (context.container().select(".combobox").size())
69058         return;
69059       context.enter(modeBrowse(context));
69060     }
69061     mode.zoomToSelected = function() {
69062       if (!services.osm)
69063         return;
69064       var note = services.osm.getNote(selectedNoteID);
69065       if (note) {
69066         context.map().centerZoomEase(note.loc, 20);
69067       }
69068     };
69069     mode.newFeature = function(val) {
69070       if (!arguments.length)
69071         return _newFeature;
69072       _newFeature = val;
69073       return mode;
69074     };
69075     mode.enter = function() {
69076       var note = checkSelectedID();
69077       if (!note)
69078         return;
69079       _behaviors.forEach(context.install);
69080       _keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
69081       select_default2(document).call(_keybinding);
69082       selectNote();
69083       var sidebar = context.ui().sidebar;
69084       sidebar.show(_noteEditor.note(note).newNote(_newFeature));
69085       sidebar.expand(sidebar.intersects(note.extent()));
69086       context.map().on("drawn.select", selectNote);
69087     };
69088     mode.exit = function() {
69089       _behaviors.forEach(context.uninstall);
69090       select_default2(document).call(_keybinding.unbind);
69091       context.surface().selectAll(".layer-notes .selected").classed("selected hover", false);
69092       context.map().on("drawn.select", null);
69093       context.ui().sidebar.hide();
69094       context.selectedNoteID(null);
69095     };
69096     return mode;
69097   }
69098
69099   // modules/modes/add_note.js
69100   function modeAddNote(context) {
69101     var mode = {
69102       id: "add-note",
69103       button: "note",
69104       description: _t.append("modes.add_note.description"),
69105       key: _t("modes.add_note.key")
69106     };
69107     var behavior = behaviorDraw(context).on("click", add).on("cancel", cancel).on("finish", cancel);
69108     function add(loc) {
69109       var osm = services.osm;
69110       if (!osm)
69111         return;
69112       var note = osmNote({ loc, status: "open", comments: [] });
69113       osm.replaceNote(note);
69114       context.map().pan([0, 0]);
69115       context.selectedNoteID(note.id).enter(modeSelectNote(context, note.id).newFeature(true));
69116     }
69117     function cancel() {
69118       context.enter(modeBrowse(context));
69119     }
69120     mode.enter = function() {
69121       context.install(behavior);
69122     };
69123     mode.exit = function() {
69124       context.uninstall(behavior);
69125     };
69126     return mode;
69127   }
69128
69129   // modules/modes/save.js
69130   function modeSave(context) {
69131     var mode = { id: "save" };
69132     var keybinding = utilKeybinding("modeSave");
69133     var commit = uiCommit(context).on("cancel", cancel);
69134     var _conflictsUi;
69135     var _location;
69136     var _success;
69137     var uploader = context.uploader().on("saveStarted.modeSave", function() {
69138       keybindingOff();
69139     }).on("willAttemptUpload.modeSave", prepareForSuccess).on("progressChanged.modeSave", showProgress).on("resultNoChanges.modeSave", function() {
69140       cancel();
69141     }).on("resultErrors.modeSave", showErrors).on("resultConflicts.modeSave", showConflicts).on("resultSuccess.modeSave", showSuccess);
69142     function cancel() {
69143       context.enter(modeBrowse(context));
69144     }
69145     function showProgress(num, total) {
69146       var modal = context.container().select(".loading-modal .modal-section");
69147       var progress = modal.selectAll(".progress").data([0]);
69148       progress.enter().append("div").attr("class", "progress").merge(progress).text(_t("save.conflict_progress", { num, total }));
69149     }
69150     function showConflicts(changeset, conflicts, origChanges) {
69151       var selection2 = context.container().select(".sidebar").append("div").attr("class", "sidebar-component");
69152       context.container().selectAll(".main-content").classed("active", true).classed("inactive", false);
69153       _conflictsUi = uiConflicts(context).conflictList(conflicts).origChanges(origChanges).on("cancel", function() {
69154         context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
69155         selection2.remove();
69156         keybindingOn();
69157         uploader.cancelConflictResolution();
69158       }).on("save", function() {
69159         context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
69160         selection2.remove();
69161         uploader.processResolvedConflicts(changeset);
69162       });
69163       selection2.call(_conflictsUi);
69164     }
69165     function showErrors(errors) {
69166       keybindingOn();
69167       var selection2 = uiConfirm(context.container());
69168       selection2.select(".modal-section.header").append("h3").text(_t("save.error"));
69169       addErrors(selection2, errors);
69170       selection2.okButton();
69171     }
69172     function addErrors(selection2, data) {
69173       var message = selection2.select(".modal-section.message-text");
69174       var items = message.selectAll(".error-container").data(data);
69175       var enter = items.enter().append("div").attr("class", "error-container");
69176       enter.append("a").attr("class", "error-description").attr("href", "#").classed("hide-toggle", true).text(function(d) {
69177         return d.msg || _t("save.unknown_error_details");
69178       }).on("click", function(d3_event) {
69179         d3_event.preventDefault();
69180         var error = select_default2(this);
69181         var detail = select_default2(this.nextElementSibling);
69182         var exp2 = error.classed("expanded");
69183         detail.style("display", exp2 ? "none" : "block");
69184         error.classed("expanded", !exp2);
69185       });
69186       var details = enter.append("div").attr("class", "error-detail-container").style("display", "none");
69187       details.append("ul").attr("class", "error-detail-list").selectAll("li").data(function(d) {
69188         return d.details || [];
69189       }).enter().append("li").attr("class", "error-detail-item").text(function(d) {
69190         return d;
69191       });
69192       items.exit().remove();
69193     }
69194     function showSuccess(changeset) {
69195       commit.reset();
69196       var ui = _success.changeset(changeset).location(_location).on("cancel", function() {
69197         context.ui().sidebar.hide();
69198       });
69199       context.enter(modeBrowse(context).sidebar(ui));
69200     }
69201     function keybindingOn() {
69202       select_default2(document).call(keybinding.on("\u238B", cancel, true));
69203     }
69204     function keybindingOff() {
69205       select_default2(document).call(keybinding.unbind);
69206     }
69207     function prepareForSuccess() {
69208       _success = uiSuccess(context);
69209       _location = null;
69210       if (!services.geocoder)
69211         return;
69212       services.geocoder.reverse(context.map().center(), function(err, result) {
69213         if (err || !result || !result.address)
69214           return;
69215         var addr = result.address;
69216         var place = addr && (addr.town || addr.city || addr.county) || "";
69217         var region = addr && (addr.state || addr.country) || "";
69218         var separator = place && region ? _t("success.thank_you_where.separator") : "";
69219         _location = _t(
69220           "success.thank_you_where.format",
69221           { place, separator, region }
69222         );
69223       });
69224     }
69225     mode.selectedIDs = function() {
69226       return _conflictsUi ? _conflictsUi.shownEntityIds() : [];
69227     };
69228     mode.enter = function() {
69229       context.ui().sidebar.expand();
69230       function done() {
69231         context.ui().sidebar.show(commit);
69232       }
69233       keybindingOn();
69234       context.container().selectAll(".main-content").classed("active", false).classed("inactive", true);
69235       var osm = context.connection();
69236       if (!osm) {
69237         cancel();
69238         return;
69239       }
69240       if (osm.authenticated()) {
69241         done();
69242       } else {
69243         osm.authenticate(function(err) {
69244           if (err) {
69245             cancel();
69246           } else {
69247             done();
69248           }
69249         });
69250       }
69251     };
69252     mode.exit = function() {
69253       keybindingOff();
69254       context.container().selectAll(".main-content").classed("active", true).classed("inactive", false);
69255       context.ui().sidebar.hide();
69256     };
69257     return mode;
69258   }
69259
69260   // modules/modes/select_error.js
69261   function modeSelectError(context, selectedErrorID, selectedErrorService) {
69262     var mode = {
69263       id: "select-error",
69264       button: "browse"
69265     };
69266     var keybinding = utilKeybinding("select-error");
69267     var errorService = services[selectedErrorService];
69268     var errorEditor;
69269     switch (selectedErrorService) {
69270       case "improveOSM":
69271         errorEditor = uiImproveOsmEditor(context).on("change", function() {
69272           context.map().pan([0, 0]);
69273           var error = checkSelectedID();
69274           if (!error)
69275             return;
69276           context.ui().sidebar.show(errorEditor.error(error));
69277         });
69278         break;
69279       case "keepRight":
69280         errorEditor = uiKeepRightEditor(context).on("change", function() {
69281           context.map().pan([0, 0]);
69282           var error = checkSelectedID();
69283           if (!error)
69284             return;
69285           context.ui().sidebar.show(errorEditor.error(error));
69286         });
69287         break;
69288       case "osmose":
69289         errorEditor = uiOsmoseEditor(context).on("change", function() {
69290           context.map().pan([0, 0]);
69291           var error = checkSelectedID();
69292           if (!error)
69293             return;
69294           context.ui().sidebar.show(errorEditor.error(error));
69295         });
69296         break;
69297     }
69298     var behaviors = [
69299       behaviorBreathe(context),
69300       behaviorHover(context),
69301       behaviorSelect(context),
69302       behaviorLasso(context),
69303       modeDragNode(context).behavior,
69304       modeDragNote(context).behavior
69305     ];
69306     function checkSelectedID() {
69307       if (!errorService)
69308         return;
69309       var error = errorService.getError(selectedErrorID);
69310       if (!error) {
69311         context.enter(modeBrowse(context));
69312       }
69313       return error;
69314     }
69315     mode.zoomToSelected = function() {
69316       if (!errorService)
69317         return;
69318       var error = errorService.getError(selectedErrorID);
69319       if (error) {
69320         context.map().centerZoomEase(error.loc, 20);
69321       }
69322     };
69323     mode.enter = function() {
69324       var error = checkSelectedID();
69325       if (!error)
69326         return;
69327       behaviors.forEach(context.install);
69328       keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
69329       select_default2(document).call(keybinding);
69330       selectError();
69331       var sidebar = context.ui().sidebar;
69332       sidebar.show(errorEditor.error(error));
69333       context.map().on("drawn.select-error", selectError);
69334       function selectError(d3_event, drawn) {
69335         if (!checkSelectedID())
69336           return;
69337         var selection2 = context.surface().selectAll(".itemId-" + selectedErrorID + "." + selectedErrorService);
69338         if (selection2.empty()) {
69339           var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
69340           if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
69341             context.enter(modeBrowse(context));
69342           }
69343         } else {
69344           selection2.classed("selected", true);
69345           context.selectedErrorID(selectedErrorID);
69346         }
69347       }
69348       function esc() {
69349         if (context.container().select(".combobox").size())
69350           return;
69351         context.enter(modeBrowse(context));
69352       }
69353     };
69354     mode.exit = function() {
69355       behaviors.forEach(context.uninstall);
69356       select_default2(document).call(keybinding.unbind);
69357       context.surface().selectAll(".qaItem.selected").classed("selected hover", false);
69358       context.map().on("drawn.select-error", null);
69359       context.ui().sidebar.hide();
69360       context.selectedErrorID(null);
69361       context.features().forceVisible([]);
69362     };
69363     return mode;
69364   }
69365
69366   // modules/ui/tools/modes.js
69367   function uiToolDrawModes(context) {
69368     var tool = {
69369       id: "old_modes",
69370       label: _t.append("toolbar.add_feature")
69371     };
69372     var modes = [
69373       modeAddPoint(context, {
69374         title: _t.append("modes.add_point.title"),
69375         button: "point",
69376         description: _t.append("modes.add_point.description"),
69377         preset: _mainPresetIndex.item("point"),
69378         key: "1"
69379       }),
69380       modeAddLine(context, {
69381         title: _t.append("modes.add_line.title"),
69382         button: "line",
69383         description: _t.append("modes.add_line.description"),
69384         preset: _mainPresetIndex.item("line"),
69385         key: "2"
69386       }),
69387       modeAddArea(context, {
69388         title: _t.append("modes.add_area.title"),
69389         button: "area",
69390         description: _t.append("modes.add_area.description"),
69391         preset: _mainPresetIndex.item("area"),
69392         key: "3"
69393       })
69394     ];
69395     function enabled(_mode) {
69396       return osmEditable();
69397     }
69398     function osmEditable() {
69399       return context.editable();
69400     }
69401     modes.forEach(function(mode) {
69402       context.keybinding().on(mode.key, function() {
69403         if (!enabled(mode))
69404           return;
69405         if (mode.id === context.mode().id) {
69406           context.enter(modeBrowse(context));
69407         } else {
69408           context.enter(mode);
69409         }
69410       });
69411     });
69412     tool.render = function(selection2) {
69413       var wrap2 = selection2.append("div").attr("class", "joined").style("display", "flex");
69414       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
69415       context.map().on("move.modes", debouncedUpdate).on("drawn.modes", debouncedUpdate);
69416       context.on("enter.modes", update);
69417       update();
69418       function update() {
69419         var buttons = wrap2.selectAll("button.add-button").data(modes, function(d) {
69420           return d.id;
69421         });
69422         buttons.exit().remove();
69423         var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
69424           return d.id + " add-button bar-button";
69425         }).on("click.mode-buttons", function(d3_event, d) {
69426           if (!enabled(d))
69427             return;
69428           var currMode = context.mode().id;
69429           if (/^draw/.test(currMode))
69430             return;
69431           if (d.id === currMode) {
69432             context.enter(modeBrowse(context));
69433           } else {
69434             context.enter(d);
69435           }
69436         }).call(
69437           uiTooltip().placement("bottom").title(function(d) {
69438             return d.description;
69439           }).keys(function(d) {
69440             return [d.key];
69441           }).scrollContainer(context.container().select(".top-toolbar"))
69442         );
69443         buttonsEnter.each(function(d) {
69444           select_default2(this).call(svgIcon("#iD-icon-" + d.button));
69445         });
69446         buttonsEnter.append("span").attr("class", "label").text("").each(function(mode) {
69447           mode.title(select_default2(this));
69448         });
69449         if (buttons.enter().size() || buttons.exit().size()) {
69450           context.ui().checkOverflow(".top-toolbar", true);
69451         }
69452         buttons = buttons.merge(buttonsEnter).attr("aria-disabled", function(d) {
69453           return !enabled(d);
69454         }).classed("disabled", function(d) {
69455           return !enabled(d);
69456         }).attr("aria-pressed", function(d) {
69457           return context.mode() && context.mode().button === d.button;
69458         }).classed("active", function(d) {
69459           return context.mode() && context.mode().button === d.button;
69460         });
69461       }
69462     };
69463     return tool;
69464   }
69465
69466   // modules/ui/tools/notes.js
69467   function uiToolNotes(context) {
69468     var tool = {
69469       id: "notes",
69470       label: _t.append("modes.add_note.label")
69471     };
69472     var mode = modeAddNote(context);
69473     function enabled() {
69474       return notesEnabled() && notesEditable();
69475     }
69476     function notesEnabled() {
69477       var noteLayer = context.layers().layer("notes");
69478       return noteLayer && noteLayer.enabled();
69479     }
69480     function notesEditable() {
69481       var mode2 = context.mode();
69482       return context.map().notesEditable() && mode2 && mode2.id !== "save";
69483     }
69484     context.keybinding().on(mode.key, function() {
69485       if (!enabled())
69486         return;
69487       if (mode.id === context.mode().id) {
69488         context.enter(modeBrowse(context));
69489       } else {
69490         context.enter(mode);
69491       }
69492     });
69493     tool.render = function(selection2) {
69494       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
69495       context.map().on("move.notes", debouncedUpdate).on("drawn.notes", debouncedUpdate);
69496       context.on("enter.notes", update);
69497       update();
69498       function update() {
69499         var showNotes = notesEnabled();
69500         var data = showNotes ? [mode] : [];
69501         var buttons = selection2.selectAll("button.add-button").data(data, function(d) {
69502           return d.id;
69503         });
69504         buttons.exit().remove();
69505         var buttonsEnter = buttons.enter().append("button").attr("class", function(d) {
69506           return d.id + " add-button bar-button";
69507         }).on("click.notes", function(d3_event, d) {
69508           if (!enabled())
69509             return;
69510           var currMode = context.mode().id;
69511           if (/^draw/.test(currMode))
69512             return;
69513           if (d.id === currMode) {
69514             context.enter(modeBrowse(context));
69515           } else {
69516             context.enter(d);
69517           }
69518         }).call(
69519           uiTooltip().placement("bottom").title(function(d) {
69520             return d.description;
69521           }).keys(function(d) {
69522             return [d.key];
69523           }).scrollContainer(context.container().select(".top-toolbar"))
69524         );
69525         buttonsEnter.each(function(d) {
69526           select_default2(this).call(svgIcon(d.icon || "#iD-icon-" + d.button));
69527         });
69528         if (buttons.enter().size() || buttons.exit().size()) {
69529           context.ui().checkOverflow(".top-toolbar", true);
69530         }
69531         buttons = buttons.merge(buttonsEnter).classed("disabled", function() {
69532           return !enabled();
69533         }).attr("aria-disabled", function() {
69534           return !enabled();
69535         }).classed("active", function(d) {
69536           return context.mode() && context.mode().button === d.button;
69537         }).attr("aria-pressed", function(d) {
69538           return context.mode() && context.mode().button === d.button;
69539         });
69540       }
69541     };
69542     tool.uninstall = function() {
69543       context.on("enter.editor.notes", null).on("exit.editor.notes", null).on("enter.notes", null);
69544       context.map().on("move.notes", null).on("drawn.notes", null);
69545     };
69546     return tool;
69547   }
69548
69549   // modules/ui/tools/save.js
69550   function uiToolSave(context) {
69551     var tool = {
69552       id: "save",
69553       label: _t.append("save.title")
69554     };
69555     var button = null;
69556     var tooltipBehavior = null;
69557     var history = context.history();
69558     var key = uiCmd("\u2318S");
69559     var _numChanges = 0;
69560     function isSaving() {
69561       var mode = context.mode();
69562       return mode && mode.id === "save";
69563     }
69564     function isDisabled() {
69565       return _numChanges === 0 || isSaving();
69566     }
69567     function save(d3_event) {
69568       d3_event.preventDefault();
69569       if (!context.inIntro() && !isSaving() && history.hasChanges()) {
69570         context.enter(modeSave(context));
69571       }
69572     }
69573     function bgColor(numChanges) {
69574       var step;
69575       if (numChanges === 0) {
69576         return null;
69577       } else if (numChanges <= 50) {
69578         step = numChanges / 50;
69579         return rgb_default("#fff", "#ff8")(step);
69580       } else {
69581         step = Math.min((numChanges - 50) / 50, 1);
69582         return rgb_default("#ff8", "#f88")(step);
69583       }
69584     }
69585     function updateCount() {
69586       var val = history.difference().summary().length;
69587       if (val === _numChanges)
69588         return;
69589       _numChanges = val;
69590       if (tooltipBehavior) {
69591         tooltipBehavior.title(() => _t.append(_numChanges > 0 ? "save.help" : "save.no_changes")).keys([key]);
69592       }
69593       if (button) {
69594         button.classed("disabled", isDisabled()).style("background", bgColor(_numChanges));
69595         button.select("span.count").text(_numChanges);
69596       }
69597     }
69598     tool.render = function(selection2) {
69599       tooltipBehavior = uiTooltip().placement("bottom").title(() => _t.append("save.no_changes")).keys([key]).scrollContainer(context.container().select(".top-toolbar"));
69600       var lastPointerUpType;
69601       button = selection2.append("button").attr("class", "save disabled bar-button").on("pointerup", function(d3_event) {
69602         lastPointerUpType = d3_event.pointerType;
69603       }).on("click", function(d3_event) {
69604         save(d3_event);
69605         if (_numChanges === 0 && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) {
69606           context.ui().flash.duration(2e3).iconName("#iD-icon-save").iconClass("disabled").label(_t.append("save.no_changes"))();
69607         }
69608         lastPointerUpType = null;
69609       }).call(tooltipBehavior);
69610       button.call(svgIcon("#iD-icon-save"));
69611       button.append("span").attr("class", "count").attr("aria-hidden", "true").text("0");
69612       updateCount();
69613       context.keybinding().on(key, save, true);
69614       context.history().on("change.save", updateCount);
69615       context.on("enter.save", function() {
69616         if (button) {
69617           button.classed("disabled", isDisabled());
69618           if (isSaving()) {
69619             button.call(tooltipBehavior.hide);
69620           }
69621         }
69622       });
69623     };
69624     tool.uninstall = function() {
69625       context.keybinding().off(key, true);
69626       context.history().on("change.save", null);
69627       context.on("enter.save", null);
69628       button = null;
69629       tooltipBehavior = null;
69630     };
69631     return tool;
69632   }
69633
69634   // modules/ui/tools/sidebar_toggle.js
69635   function uiToolSidebarToggle(context) {
69636     var tool = {
69637       id: "sidebar_toggle",
69638       label: _t.append("toolbar.inspect")
69639     };
69640     tool.render = function(selection2) {
69641       selection2.append("button").attr("class", "bar-button").attr("aria-label", _t("sidebar.tooltip")).on("click", function() {
69642         context.ui().sidebar.toggle();
69643       }).call(
69644         uiTooltip().placement("bottom").title(() => _t.append("sidebar.tooltip")).keys([_t("sidebar.key")]).scrollContainer(context.container().select(".top-toolbar"))
69645       ).call(svgIcon("#iD-icon-sidebar-" + (_mainLocalizer.textDirection() === "rtl" ? "right" : "left")));
69646     };
69647     return tool;
69648   }
69649
69650   // modules/ui/tools/undo_redo.js
69651   function uiToolUndoRedo(context) {
69652     var tool = {
69653       id: "undo_redo",
69654       label: _t.append("toolbar.undo_redo")
69655     };
69656     var commands = [{
69657       id: "undo",
69658       cmd: uiCmd("\u2318Z"),
69659       action: function() {
69660         context.undo();
69661       },
69662       annotation: function() {
69663         return context.history().undoAnnotation();
69664       },
69665       icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")
69666     }, {
69667       id: "redo",
69668       cmd: uiCmd("\u2318\u21E7Z"),
69669       action: function() {
69670         context.redo();
69671       },
69672       annotation: function() {
69673         return context.history().redoAnnotation();
69674       },
69675       icon: "iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "undo" : "redo")
69676     }];
69677     function editable() {
69678       return context.mode() && context.mode().id !== "save" && context.map().editableDataEnabled(
69679         true
69680         /* ignore min zoom */
69681       );
69682     }
69683     tool.render = function(selection2) {
69684       var tooltipBehavior = uiTooltip().placement("bottom").title(function(d) {
69685         return d.annotation() ? _t.append(d.id + ".tooltip", { action: d.annotation() }) : _t.append(d.id + ".nothing");
69686       }).keys(function(d) {
69687         return [d.cmd];
69688       }).scrollContainer(context.container().select(".top-toolbar"));
69689       var lastPointerUpType;
69690       var buttons = selection2.selectAll("button").data(commands).enter().append("button").attr("class", function(d) {
69691         return "disabled " + d.id + "-button bar-button";
69692       }).on("pointerup", function(d3_event) {
69693         lastPointerUpType = d3_event.pointerType;
69694       }).on("click", function(d3_event, d) {
69695         d3_event.preventDefault();
69696         var annotation = d.annotation();
69697         if (editable() && annotation) {
69698           d.action();
69699         }
69700         if (editable() && (lastPointerUpType === "touch" || lastPointerUpType === "pen")) {
69701           var label = annotation ? _t.append(d.id + ".tooltip", { action: annotation }) : _t.append(d.id + ".nothing");
69702           context.ui().flash.duration(2e3).iconName("#" + d.icon).iconClass(annotation ? "" : "disabled").label(label)();
69703         }
69704         lastPointerUpType = null;
69705       }).call(tooltipBehavior);
69706       buttons.each(function(d) {
69707         select_default2(this).call(svgIcon("#" + d.icon));
69708       });
69709       context.keybinding().on(commands[0].cmd, function(d3_event) {
69710         d3_event.preventDefault();
69711         if (editable())
69712           commands[0].action();
69713       }).on(commands[1].cmd, function(d3_event) {
69714         d3_event.preventDefault();
69715         if (editable())
69716           commands[1].action();
69717       });
69718       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
69719       context.map().on("move.undo_redo", debouncedUpdate).on("drawn.undo_redo", debouncedUpdate);
69720       context.history().on("change.undo_redo", function(difference) {
69721         if (difference)
69722           update();
69723       });
69724       context.on("enter.undo_redo", update);
69725       function update() {
69726         buttons.classed("disabled", function(d) {
69727           return !editable() || !d.annotation();
69728         }).each(function() {
69729           var selection3 = select_default2(this);
69730           if (!selection3.select(".tooltip.in").empty()) {
69731             selection3.call(tooltipBehavior.updateContent);
69732           }
69733         });
69734       }
69735     };
69736     tool.uninstall = function() {
69737       context.keybinding().off(commands[0].cmd).off(commands[1].cmd);
69738       context.map().on("move.undo_redo", null).on("drawn.undo_redo", null);
69739       context.history().on("change.undo_redo", null);
69740       context.on("enter.undo_redo", null);
69741     };
69742     return tool;
69743   }
69744
69745   // modules/ui/top_toolbar.js
69746   function uiTopToolbar(context) {
69747     var sidebarToggle = uiToolSidebarToggle(context), modes = uiToolDrawModes(context), notes = uiToolNotes(context), undoRedo = uiToolUndoRedo(context), save = uiToolSave(context);
69748     function notesEnabled() {
69749       var noteLayer = context.layers().layer("notes");
69750       return noteLayer && noteLayer.enabled();
69751     }
69752     function topToolbar(bar) {
69753       bar.on("wheel.topToolbar", function(d3_event) {
69754         if (!d3_event.deltaX) {
69755           bar.node().scrollLeft += d3_event.deltaY;
69756         }
69757       });
69758       var debouncedUpdate = debounce_default(update, 500, { leading: true, trailing: true });
69759       context.layers().on("change.topToolbar", debouncedUpdate);
69760       update();
69761       function update() {
69762         var tools = [
69763           sidebarToggle,
69764           "spacer",
69765           modes
69766         ];
69767         tools.push("spacer");
69768         if (notesEnabled()) {
69769           tools = tools.concat([notes, "spacer"]);
69770         }
69771         tools = tools.concat([undoRedo, save]);
69772         var toolbarItems = bar.selectAll(".toolbar-item").data(tools, function(d) {
69773           return d.id || d;
69774         });
69775         toolbarItems.exit().each(function(d) {
69776           if (d.uninstall) {
69777             d.uninstall();
69778           }
69779         }).remove();
69780         var itemsEnter = toolbarItems.enter().append("div").attr("class", function(d) {
69781           var classes = "toolbar-item " + (d.id || d).replace("_", "-");
69782           if (d.klass)
69783             classes += " " + d.klass;
69784           return classes;
69785         });
69786         var actionableItems = itemsEnter.filter(function(d) {
69787           return d !== "spacer";
69788         });
69789         actionableItems.append("div").attr("class", "item-content").each(function(d) {
69790           select_default2(this).call(d.render, bar);
69791         });
69792         actionableItems.append("div").attr("class", "item-label").each(function(d) {
69793           d.label(select_default2(this));
69794         });
69795       }
69796     }
69797     return topToolbar;
69798   }
69799
69800   // modules/ui/zoom_to_selection.js
69801   function uiZoomToSelection(context) {
69802     function isDisabled() {
69803       var mode = context.mode();
69804       return !mode || !mode.zoomToSelected;
69805     }
69806     var _lastPointerUpType;
69807     function pointerup(d3_event) {
69808       _lastPointerUpType = d3_event.pointerType;
69809     }
69810     function click(d3_event) {
69811       d3_event.preventDefault();
69812       if (isDisabled()) {
69813         if (_lastPointerUpType === "touch" || _lastPointerUpType === "pen") {
69814           context.ui().flash.duration(2e3).iconName("#iD-icon-framed-dot").iconClass("disabled").label(_t.append("inspector.zoom_to.no_selection"))();
69815         }
69816       } else {
69817         var mode = context.mode();
69818         if (mode && mode.zoomToSelected) {
69819           mode.zoomToSelected();
69820         }
69821       }
69822       _lastPointerUpType = null;
69823     }
69824     return function(selection2) {
69825       var tooltipBehavior = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(function() {
69826         if (isDisabled()) {
69827           return _t.append("inspector.zoom_to.no_selection");
69828         }
69829         return _t.append("inspector.zoom_to.title");
69830       }).keys([_t("inspector.zoom_to.key")]);
69831       var button = selection2.append("button").on("pointerup", pointerup).on("click", click).call(svgIcon("#iD-icon-framed-dot", "light")).call(tooltipBehavior);
69832       function setEnabledState() {
69833         button.classed("disabled", isDisabled());
69834         if (!button.select(".tooltip.in").empty()) {
69835           button.call(tooltipBehavior.updateContent);
69836         }
69837       }
69838       context.on("enter.uiZoomToSelection", setEnabledState);
69839       setEnabledState();
69840     };
69841   }
69842
69843   // modules/ui/pane.js
69844   function uiPane(id2, context) {
69845     var _key;
69846     var _label = "";
69847     var _description = "";
69848     var _iconName = "";
69849     var _sections;
69850     var _paneSelection = select_default2(null);
69851     var _paneTooltip;
69852     var pane = {
69853       id: id2
69854     };
69855     pane.label = function(val) {
69856       if (!arguments.length)
69857         return _label;
69858       _label = val;
69859       return pane;
69860     };
69861     pane.key = function(val) {
69862       if (!arguments.length)
69863         return _key;
69864       _key = val;
69865       return pane;
69866     };
69867     pane.description = function(val) {
69868       if (!arguments.length)
69869         return _description;
69870       _description = val;
69871       return pane;
69872     };
69873     pane.iconName = function(val) {
69874       if (!arguments.length)
69875         return _iconName;
69876       _iconName = val;
69877       return pane;
69878     };
69879     pane.sections = function(val) {
69880       if (!arguments.length)
69881         return _sections;
69882       _sections = val;
69883       return pane;
69884     };
69885     pane.selection = function() {
69886       return _paneSelection;
69887     };
69888     function hidePane() {
69889       context.ui().togglePanes();
69890     }
69891     pane.togglePane = function(d3_event) {
69892       if (d3_event)
69893         d3_event.preventDefault();
69894       _paneTooltip.hide();
69895       context.ui().togglePanes(!_paneSelection.classed("shown") ? _paneSelection : void 0);
69896     };
69897     pane.renderToggleButton = function(selection2) {
69898       if (!_paneTooltip) {
69899         _paneTooltip = uiTooltip().placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left").title(() => _description).keys([_key]);
69900       }
69901       selection2.append("button").on("click", pane.togglePane).call(svgIcon("#" + _iconName, "light")).call(_paneTooltip);
69902     };
69903     pane.renderContent = function(selection2) {
69904       if (_sections) {
69905         _sections.forEach(function(section) {
69906           selection2.call(section.render);
69907         });
69908       }
69909     };
69910     pane.renderPane = function(selection2) {
69911       _paneSelection = selection2.append("div").attr("class", "fillL map-pane hide " + id2 + "-pane").attr("pane", id2);
69912       var heading = _paneSelection.append("div").attr("class", "pane-heading");
69913       heading.append("h2").text("").call(_label);
69914       heading.append("button").attr("title", _t("icons.close")).on("click", hidePane).call(svgIcon("#iD-icon-close"));
69915       _paneSelection.append("div").attr("class", "pane-content").call(pane.renderContent);
69916       if (_key) {
69917         context.keybinding().on(_key, pane.togglePane);
69918       }
69919     };
69920     return pane;
69921   }
69922
69923   // modules/ui/sections/background_display_options.js
69924   function uiSectionBackgroundDisplayOptions(context) {
69925     var section = uiSection("background-display-options", context).label(() => _t.append("background.display_options")).disclosureContent(renderDisclosureContent);
69926     var _storedOpacity = corePreferences("background-opacity");
69927     var _minVal = 0;
69928     var _maxVal = 3;
69929     var _sliders = ["brightness", "contrast", "saturation", "sharpness"];
69930     var _options = {
69931       brightness: _storedOpacity !== null ? +_storedOpacity : 1,
69932       contrast: 1,
69933       saturation: 1,
69934       sharpness: 1
69935     };
69936     function clamp3(x, min3, max3) {
69937       return Math.max(min3, Math.min(x, max3));
69938     }
69939     function updateValue(d, val) {
69940       val = clamp3(val, _minVal, _maxVal);
69941       _options[d] = val;
69942       context.background()[d](val);
69943       if (d === "brightness") {
69944         corePreferences("background-opacity", val);
69945       }
69946       section.reRender();
69947     }
69948     function renderDisclosureContent(selection2) {
69949       var container = selection2.selectAll(".display-options-container").data([0]);
69950       var containerEnter = container.enter().append("div").attr("class", "display-options-container controls-list");
69951       var slidersEnter = containerEnter.selectAll(".display-control").data(_sliders).enter().append("label").attr("class", function(d) {
69952         return "display-control display-control-" + d;
69953       });
69954       slidersEnter.html(function(d) {
69955         return _t.html("background." + d);
69956       }).append("span").attr("class", function(d) {
69957         return "display-option-value display-option-value-" + d;
69958       });
69959       var sildersControlEnter = slidersEnter.append("div").attr("class", "control-wrap");
69960       sildersControlEnter.append("input").attr("class", function(d) {
69961         return "display-option-input display-option-input-" + d;
69962       }).attr("type", "range").attr("min", _minVal).attr("max", _maxVal).attr("step", "0.05").on("input", function(d3_event, d) {
69963         var val = select_default2(this).property("value");
69964         if (!val && d3_event && d3_event.target) {
69965           val = d3_event.target.value;
69966         }
69967         updateValue(d, val);
69968       });
69969       sildersControlEnter.append("button").attr("title", function(d) {
69970         return `${_t("background.reset")} ${_t("background." + d)}`;
69971       }).attr("class", function(d) {
69972         return "display-option-reset display-option-reset-" + d;
69973       }).on("click", function(d3_event, d) {
69974         if (d3_event.button !== 0)
69975           return;
69976         updateValue(d, 1);
69977       }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")));
69978       containerEnter.append("a").attr("class", "display-option-resetlink").attr("role", "button").attr("href", "#").call(_t.append("background.reset_all")).on("click", function(d3_event) {
69979         d3_event.preventDefault();
69980         for (var i2 = 0; i2 < _sliders.length; i2++) {
69981           updateValue(_sliders[i2], 1);
69982         }
69983       });
69984       container = containerEnter.merge(container);
69985       container.selectAll(".display-option-input").property("value", function(d) {
69986         return _options[d];
69987       });
69988       container.selectAll(".display-option-value").text(function(d) {
69989         return Math.floor(_options[d] * 100) + "%";
69990       });
69991       container.selectAll(".display-option-reset").classed("disabled", function(d) {
69992         return _options[d] === 1;
69993       });
69994       if (containerEnter.size() && _options.brightness !== 1) {
69995         context.background().brightness(_options.brightness);
69996       }
69997     }
69998     return section;
69999   }
70000
70001   // modules/ui/settings/custom_background.js
70002   function uiSettingsCustomBackground() {
70003     var dispatch10 = dispatch_default("change");
70004     function render(selection2) {
70005       var _origSettings = {
70006         template: corePreferences("background-custom-template")
70007       };
70008       var _currSettings = {
70009         template: corePreferences("background-custom-template")
70010       };
70011       var example = "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png";
70012       var modal = uiConfirm(selection2).okButton();
70013       modal.classed("settings-modal settings-custom-background", true);
70014       modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_background.header"));
70015       var textSection = modal.select(".modal-section.message-text");
70016       var instructions = `${_t.html("settings.custom_background.instructions.info")}
70017
70018 #### ${_t.html("settings.custom_background.instructions.wms.tokens_label")}
70019 * ${_t.html("settings.custom_background.instructions.wms.tokens.proj")}
70020 * ${_t.html("settings.custom_background.instructions.wms.tokens.wkid")}
70021 * ${_t.html("settings.custom_background.instructions.wms.tokens.dimensions")}
70022 * ${_t.html("settings.custom_background.instructions.wms.tokens.bbox")}
70023
70024 #### ${_t.html("settings.custom_background.instructions.tms.tokens_label")}
70025 * ${_t.html("settings.custom_background.instructions.tms.tokens.xyz")}
70026 * ${_t.html("settings.custom_background.instructions.tms.tokens.flipped_y")}
70027 * ${_t.html("settings.custom_background.instructions.tms.tokens.switch")}
70028 * ${_t.html("settings.custom_background.instructions.tms.tokens.quadtile")}
70029 * ${_t.html("settings.custom_background.instructions.tms.tokens.scale_factor")}
70030
70031 #### ${_t.html("settings.custom_background.instructions.example")}
70032 \`${example}\``;
70033       textSection.append("div").attr("class", "instructions-template").html(marked(instructions));
70034       textSection.append("textarea").attr("class", "field-template").attr("placeholder", _t("settings.custom_background.template.placeholder")).call(utilNoAuto).property("value", _currSettings.template);
70035       var buttonSection = modal.select(".modal-section.buttons");
70036       buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
70037       buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
70038       buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
70039       function isSaveDisabled() {
70040         return null;
70041       }
70042       function clickCancel() {
70043         textSection.select(".field-template").property("value", _origSettings.template);
70044         corePreferences("background-custom-template", _origSettings.template);
70045         this.blur();
70046         modal.close();
70047       }
70048       function clickSave() {
70049         _currSettings.template = textSection.select(".field-template").property("value");
70050         corePreferences("background-custom-template", _currSettings.template);
70051         this.blur();
70052         modal.close();
70053         dispatch10.call("change", this, _currSettings);
70054       }
70055     }
70056     return utilRebind(render, dispatch10, "on");
70057   }
70058
70059   // modules/ui/sections/background_list.js
70060   function uiSectionBackgroundList(context) {
70061     var _backgroundList = select_default2(null);
70062     var _customSource = context.background().findSource("custom");
70063     var _settingsCustomBackground = uiSettingsCustomBackground(context).on("change", customChanged);
70064     var section = uiSection("background-list", context).label(() => _t.append("background.backgrounds")).disclosureContent(renderDisclosureContent);
70065     function previousBackgroundID() {
70066       return corePreferences("background-last-used-toggle");
70067     }
70068     function renderDisclosureContent(selection2) {
70069       var container = selection2.selectAll(".layer-background-list").data([0]);
70070       _backgroundList = container.enter().append("ul").attr("class", "layer-list layer-background-list").attr("dir", "auto").merge(container);
70071       var bgExtrasListEnter = selection2.selectAll(".bg-extras-list").data([0]).enter().append("ul").attr("class", "layer-list bg-extras-list");
70072       var minimapLabelEnter = bgExtrasListEnter.append("li").attr("class", "minimap-toggle-item").append("label").call(
70073         uiTooltip().title(() => _t.append("background.minimap.tooltip")).keys([_t("background.minimap.key")]).placement("top")
70074       );
70075       minimapLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
70076         d3_event.preventDefault();
70077         uiMapInMap.toggle();
70078       });
70079       minimapLabelEnter.append("span").call(_t.append("background.minimap.description"));
70080       var panelLabelEnter = bgExtrasListEnter.append("li").attr("class", "background-panel-toggle-item").append("label").call(
70081         uiTooltip().title(() => _t.append("background.panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.background.key"))]).placement("top")
70082       );
70083       panelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
70084         d3_event.preventDefault();
70085         context.ui().info.toggle("background");
70086       });
70087       panelLabelEnter.append("span").call(_t.append("background.panel.description"));
70088       var locPanelLabelEnter = bgExtrasListEnter.append("li").attr("class", "location-panel-toggle-item").append("label").call(
70089         uiTooltip().title(() => _t.append("background.location_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.location.key"))]).placement("top")
70090       );
70091       locPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
70092         d3_event.preventDefault();
70093         context.ui().info.toggle("location");
70094       });
70095       locPanelLabelEnter.append("span").call(_t.append("background.location_panel.description"));
70096       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"));
70097       _backgroundList.call(drawListItems, "radio", function(d3_event, d) {
70098         chooseBackground(d);
70099       }, function(d) {
70100         return !d.isHidden() && !d.overlay;
70101       });
70102     }
70103     function setTooltips(selection2) {
70104       selection2.each(function(d, i2, nodes) {
70105         var item = select_default2(this).select("label");
70106         var span = item.select("span");
70107         var placement = i2 < nodes.length / 2 ? "bottom" : "top";
70108         var hasDescription = d.hasDescription();
70109         var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth");
70110         item.call(uiTooltip().destroyAny);
70111         if (d.id === previousBackgroundID()) {
70112           item.call(
70113             uiTooltip().placement(placement).title(() => _t.append("background.switch")).keys([uiCmd("\u2318" + _t("background.key"))])
70114           );
70115         } else if (hasDescription || isOverflowing) {
70116           item.call(
70117             uiTooltip().placement(placement).title(() => hasDescription ? d.description() : d.label())
70118           );
70119         }
70120       });
70121     }
70122     function drawListItems(layerList, type2, change, filter2) {
70123       var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2).sort(function(a, b) {
70124         return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
70125       });
70126       var layerLinks = layerList.selectAll("li").data(sources, function(d, i2) {
70127         return d.id + "---" + i2;
70128       });
70129       layerLinks.exit().remove();
70130       var enter = layerLinks.enter().append("li").classed("layer-custom", function(d) {
70131         return d.id === "custom";
70132       }).classed("best", function(d) {
70133         return d.best();
70134       });
70135       var label = enter.append("label");
70136       label.append("input").attr("type", type2).attr("name", "background-layer").attr("value", function(d) {
70137         return d.id;
70138       }).on("change", change);
70139       label.append("span").each(function(d) {
70140         d.label()(select_default2(this));
70141       });
70142       enter.filter(function(d) {
70143         return d.id === "custom";
70144       }).append("button").attr("class", "layer-browse").call(
70145         uiTooltip().title(() => _t.append("settings.custom_background.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
70146       ).on("click", function(d3_event) {
70147         d3_event.preventDefault();
70148         editCustom();
70149       }).call(svgIcon("#iD-icon-more"));
70150       enter.filter(function(d) {
70151         return d.best();
70152       }).append("div").attr("class", "best").call(
70153         uiTooltip().title(() => _t.append("background.best_imagery")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
70154       ).append("span").text("\u2605");
70155       layerList.call(updateLayerSelections);
70156     }
70157     function updateLayerSelections(selection2) {
70158       function active(d) {
70159         return context.background().showsLayer(d);
70160       }
70161       selection2.selectAll("li").classed("active", active).classed("switch", function(d) {
70162         return d.id === previousBackgroundID();
70163       }).call(setTooltips).selectAll("input").property("checked", active);
70164     }
70165     function chooseBackground(d) {
70166       if (d.id === "custom" && !d.template()) {
70167         return editCustom();
70168       }
70169       var previousBackground = context.background().baseLayerSource();
70170       corePreferences("background-last-used-toggle", previousBackground.id);
70171       corePreferences("background-last-used", d.id);
70172       context.background().baseLayerSource(d);
70173     }
70174     function customChanged(d) {
70175       if (d && d.template) {
70176         _customSource.template(d.template);
70177         chooseBackground(_customSource);
70178       } else {
70179         _customSource.template("");
70180         chooseBackground(context.background().findSource("none"));
70181       }
70182     }
70183     function editCustom() {
70184       context.container().call(_settingsCustomBackground);
70185     }
70186     context.background().on("change.background_list", function() {
70187       _backgroundList.call(updateLayerSelections);
70188     });
70189     context.map().on(
70190       "move.background_list",
70191       debounce_default(function() {
70192         window.requestIdleCallback(section.reRender);
70193       }, 1e3)
70194     );
70195     return section;
70196   }
70197
70198   // modules/ui/sections/background_offset.js
70199   function uiSectionBackgroundOffset(context) {
70200     var section = uiSection("background-offset", context).label(() => _t.append("background.fix_misalignment")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
70201     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
70202     var _directions = [
70203       ["top", [0, -0.5]],
70204       ["left", [-0.5, 0]],
70205       ["right", [0.5, 0]],
70206       ["bottom", [0, 0.5]]
70207     ];
70208     function updateValue() {
70209       var meters = geoOffsetToMeters(context.background().offset());
70210       var x = +meters[0].toFixed(2);
70211       var y = +meters[1].toFixed(2);
70212       context.container().selectAll(".nudge-inner-rect").select("input").classed("error", false).property("value", x + ", " + y);
70213       context.container().selectAll(".nudge-reset").classed("disabled", function() {
70214         return x === 0 && y === 0;
70215       });
70216     }
70217     function resetOffset() {
70218       context.background().offset([0, 0]);
70219       updateValue();
70220     }
70221     function nudge(d) {
70222       context.background().nudge(d, context.map().zoom());
70223       updateValue();
70224     }
70225     function inputOffset() {
70226       var input = select_default2(this);
70227       var d = input.node().value;
70228       if (d === "")
70229         return resetOffset();
70230       d = d.replace(/;/g, ",").split(",").map(function(n2) {
70231         return !isNaN(n2) && n2;
70232       });
70233       if (d.length !== 2 || !d[0] || !d[1]) {
70234         input.classed("error", true);
70235         return;
70236       }
70237       context.background().offset(geoMetersToOffset(d));
70238       updateValue();
70239     }
70240     function dragOffset(d3_event) {
70241       if (d3_event.button !== 0)
70242         return;
70243       var origin = [d3_event.clientX, d3_event.clientY];
70244       var pointerId = d3_event.pointerId || "mouse";
70245       context.container().append("div").attr("class", "nudge-surface");
70246       select_default2(window).on(_pointerPrefix + "move.drag-bg-offset", pointermove).on(_pointerPrefix + "up.drag-bg-offset", pointerup);
70247       if (_pointerPrefix === "pointer") {
70248         select_default2(window).on("pointercancel.drag-bg-offset", pointerup);
70249       }
70250       function pointermove(d3_event2) {
70251         if (pointerId !== (d3_event2.pointerId || "mouse"))
70252           return;
70253         var latest = [d3_event2.clientX, d3_event2.clientY];
70254         var d = [
70255           -(origin[0] - latest[0]) / 4,
70256           -(origin[1] - latest[1]) / 4
70257         ];
70258         origin = latest;
70259         nudge(d);
70260       }
70261       function pointerup(d3_event2) {
70262         if (pointerId !== (d3_event2.pointerId || "mouse"))
70263           return;
70264         if (d3_event2.button !== 0)
70265           return;
70266         context.container().selectAll(".nudge-surface").remove();
70267         select_default2(window).on(".drag-bg-offset", null);
70268       }
70269     }
70270     function renderDisclosureContent(selection2) {
70271       var container = selection2.selectAll(".nudge-container").data([0]);
70272       var containerEnter = container.enter().append("div").attr("class", "nudge-container");
70273       containerEnter.append("div").attr("class", "nudge-instructions").call(_t.append("background.offset"));
70274       var nudgeWrapEnter = containerEnter.append("div").attr("class", "nudge-controls-wrap");
70275       var nudgeEnter = nudgeWrapEnter.append("div").attr("class", "nudge-outer-rect").on(_pointerPrefix + "down", dragOffset);
70276       nudgeEnter.append("div").attr("class", "nudge-inner-rect").append("input").attr("type", "text").attr("aria-label", _t("background.offset_label")).on("change", inputOffset);
70277       nudgeWrapEnter.append("div").selectAll("button").data(_directions).enter().append("button").attr("title", function(d) {
70278         return _t(`background.nudge.${d[0]}`);
70279       }).attr("class", function(d) {
70280         return d[0] + " nudge";
70281       }).on("click", function(d3_event, d) {
70282         nudge(d[1]);
70283       });
70284       nudgeWrapEnter.append("button").attr("title", _t("background.reset")).attr("class", "nudge-reset disabled").on("click", function(d3_event) {
70285         d3_event.preventDefault();
70286         resetOffset();
70287       }).call(svgIcon("#iD-icon-" + (_mainLocalizer.textDirection() === "rtl" ? "redo" : "undo")));
70288       updateValue();
70289     }
70290     context.background().on("change.backgroundOffset-update", updateValue);
70291     return section;
70292   }
70293
70294   // modules/ui/sections/overlay_list.js
70295   function uiSectionOverlayList(context) {
70296     var section = uiSection("overlay-list", context).label(() => _t.append("background.overlays")).disclosureContent(renderDisclosureContent);
70297     var _overlayList = select_default2(null);
70298     function setTooltips(selection2) {
70299       selection2.each(function(d, i2, nodes) {
70300         var item = select_default2(this).select("label");
70301         var span = item.select("span");
70302         var placement = i2 < nodes.length / 2 ? "bottom" : "top";
70303         var description = d.description();
70304         var isOverflowing = span.property("clientWidth") !== span.property("scrollWidth");
70305         item.call(uiTooltip().destroyAny);
70306         if (description || isOverflowing) {
70307           item.call(
70308             uiTooltip().placement(placement).title(() => description || d.name())
70309           );
70310         }
70311       });
70312     }
70313     function updateLayerSelections(selection2) {
70314       function active(d) {
70315         return context.background().showsLayer(d);
70316       }
70317       selection2.selectAll("li").classed("active", active).call(setTooltips).selectAll("input").property("checked", active);
70318     }
70319     function chooseOverlay(d3_event, d) {
70320       d3_event.preventDefault();
70321       context.background().toggleOverlayLayer(d);
70322       _overlayList.call(updateLayerSelections);
70323       document.activeElement.blur();
70324     }
70325     function drawListItems(layerList, type2, change, filter2) {
70326       var sources = context.background().sources(context.map().extent(), context.map().zoom(), true).filter(filter2);
70327       var layerLinks = layerList.selectAll("li").data(sources, function(d) {
70328         return d.name();
70329       });
70330       layerLinks.exit().remove();
70331       var enter = layerLinks.enter().append("li");
70332       var label = enter.append("label");
70333       label.append("input").attr("type", type2).attr("name", "layers").on("change", change);
70334       label.append("span").each(function(d) {
70335         d.label()(select_default2(this));
70336       });
70337       layerList.selectAll("li").sort(sortSources);
70338       layerList.call(updateLayerSelections);
70339       function sortSources(a, b) {
70340         return a.best() && !b.best() ? -1 : b.best() && !a.best() ? 1 : descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
70341       }
70342     }
70343     function renderDisclosureContent(selection2) {
70344       var container = selection2.selectAll(".layer-overlay-list").data([0]);
70345       _overlayList = container.enter().append("ul").attr("class", "layer-list layer-overlay-list").attr("dir", "auto").merge(container);
70346       _overlayList.call(drawListItems, "checkbox", chooseOverlay, function(d) {
70347         return !d.isHidden() && d.overlay;
70348       });
70349     }
70350     context.map().on(
70351       "move.overlay_list",
70352       debounce_default(function() {
70353         window.requestIdleCallback(section.reRender);
70354       }, 1e3)
70355     );
70356     return section;
70357   }
70358
70359   // modules/ui/panes/background.js
70360   function uiPaneBackground(context) {
70361     var backgroundPane = uiPane("background", context).key(_t("background.key")).label(_t.append("background.title")).description(_t.append("background.description")).iconName("iD-icon-layers").sections([
70362       uiSectionBackgroundList(context),
70363       uiSectionOverlayList(context),
70364       uiSectionBackgroundDisplayOptions(context),
70365       uiSectionBackgroundOffset(context)
70366     ]);
70367     return backgroundPane;
70368   }
70369
70370   // modules/ui/panes/help.js
70371   function uiPaneHelp(context) {
70372     var docKeys = [
70373       ["help", [
70374         "welcome",
70375         "open_data_h",
70376         "open_data",
70377         "before_start_h",
70378         "before_start",
70379         "open_source_h",
70380         "open_source",
70381         "open_source_attribution",
70382         "open_source_help"
70383       ]],
70384       ["overview", [
70385         "navigation_h",
70386         "navigation_drag",
70387         "navigation_zoom",
70388         "features_h",
70389         "features",
70390         "nodes_ways"
70391       ]],
70392       ["editing", [
70393         "select_h",
70394         "select_left_click",
70395         "select_right_click",
70396         "select_space",
70397         "multiselect_h",
70398         "multiselect",
70399         "multiselect_shift_click",
70400         "multiselect_lasso",
70401         "undo_redo_h",
70402         "undo_redo",
70403         "save_h",
70404         "save",
70405         "save_validation",
70406         "upload_h",
70407         "upload",
70408         "backups_h",
70409         "backups",
70410         "keyboard_h",
70411         "keyboard"
70412       ]],
70413       ["feature_editor", [
70414         "intro",
70415         "definitions",
70416         "type_h",
70417         "type",
70418         "type_picker",
70419         "fields_h",
70420         "fields_all_fields",
70421         "fields_example",
70422         "fields_add_field",
70423         "tags_h",
70424         "tags_all_tags",
70425         "tags_resources"
70426       ]],
70427       ["points", [
70428         "intro",
70429         "add_point_h",
70430         "add_point",
70431         "add_point_finish",
70432         "move_point_h",
70433         "move_point",
70434         "delete_point_h",
70435         "delete_point",
70436         "delete_point_command"
70437       ]],
70438       ["lines", [
70439         "intro",
70440         "add_line_h",
70441         "add_line",
70442         "add_line_draw",
70443         "add_line_continue",
70444         "add_line_finish",
70445         "modify_line_h",
70446         "modify_line_dragnode",
70447         "modify_line_addnode",
70448         "connect_line_h",
70449         "connect_line",
70450         "connect_line_display",
70451         "connect_line_drag",
70452         "connect_line_tag",
70453         "disconnect_line_h",
70454         "disconnect_line_command",
70455         "move_line_h",
70456         "move_line_command",
70457         "move_line_connected",
70458         "delete_line_h",
70459         "delete_line",
70460         "delete_line_command"
70461       ]],
70462       ["areas", [
70463         "intro",
70464         "point_or_area_h",
70465         "point_or_area",
70466         "add_area_h",
70467         "add_area_command",
70468         "add_area_draw",
70469         "add_area_continue",
70470         "add_area_finish",
70471         "square_area_h",
70472         "square_area_command",
70473         "modify_area_h",
70474         "modify_area_dragnode",
70475         "modify_area_addnode",
70476         "delete_area_h",
70477         "delete_area",
70478         "delete_area_command"
70479       ]],
70480       ["relations", [
70481         "intro",
70482         "edit_relation_h",
70483         "edit_relation",
70484         "edit_relation_add",
70485         "edit_relation_delete",
70486         "maintain_relation_h",
70487         "maintain_relation",
70488         "relation_types_h",
70489         "multipolygon_h",
70490         "multipolygon",
70491         "multipolygon_create",
70492         "multipolygon_merge",
70493         "turn_restriction_h",
70494         "turn_restriction",
70495         "turn_restriction_field",
70496         "turn_restriction_editing",
70497         "route_h",
70498         "route",
70499         "route_add",
70500         "boundary_h",
70501         "boundary",
70502         "boundary_add"
70503       ]],
70504       ["operations", [
70505         "intro",
70506         "intro_2",
70507         "straighten",
70508         "orthogonalize",
70509         "circularize",
70510         "move",
70511         "rotate",
70512         "reflect",
70513         "continue",
70514         "reverse",
70515         "disconnect",
70516         "split",
70517         "extract",
70518         "merge",
70519         "delete",
70520         "downgrade",
70521         "copy_paste"
70522       ]],
70523       ["notes", [
70524         "intro",
70525         "add_note_h",
70526         "add_note",
70527         "place_note",
70528         "move_note",
70529         "update_note_h",
70530         "update_note",
70531         "save_note_h",
70532         "save_note"
70533       ]],
70534       ["imagery", [
70535         "intro",
70536         "sources_h",
70537         "choosing",
70538         "sources",
70539         "offsets_h",
70540         "offset",
70541         "offset_change"
70542       ]],
70543       ["streetlevel", [
70544         "intro",
70545         "using_h",
70546         "using",
70547         "photos",
70548         "viewer"
70549       ]],
70550       ["gps", [
70551         "intro",
70552         "survey",
70553         "using_h",
70554         "using",
70555         "tracing",
70556         "upload"
70557       ]],
70558       ["qa", [
70559         "intro",
70560         "tools_h",
70561         "tools",
70562         "issues_h",
70563         "issues"
70564       ]]
70565     ];
70566     var headings = {
70567       "help.help.open_data_h": 3,
70568       "help.help.before_start_h": 3,
70569       "help.help.open_source_h": 3,
70570       "help.overview.navigation_h": 3,
70571       "help.overview.features_h": 3,
70572       "help.editing.select_h": 3,
70573       "help.editing.multiselect_h": 3,
70574       "help.editing.undo_redo_h": 3,
70575       "help.editing.save_h": 3,
70576       "help.editing.upload_h": 3,
70577       "help.editing.backups_h": 3,
70578       "help.editing.keyboard_h": 3,
70579       "help.feature_editor.type_h": 3,
70580       "help.feature_editor.fields_h": 3,
70581       "help.feature_editor.tags_h": 3,
70582       "help.points.add_point_h": 3,
70583       "help.points.move_point_h": 3,
70584       "help.points.delete_point_h": 3,
70585       "help.lines.add_line_h": 3,
70586       "help.lines.modify_line_h": 3,
70587       "help.lines.connect_line_h": 3,
70588       "help.lines.disconnect_line_h": 3,
70589       "help.lines.move_line_h": 3,
70590       "help.lines.delete_line_h": 3,
70591       "help.areas.point_or_area_h": 3,
70592       "help.areas.add_area_h": 3,
70593       "help.areas.square_area_h": 3,
70594       "help.areas.modify_area_h": 3,
70595       "help.areas.delete_area_h": 3,
70596       "help.relations.edit_relation_h": 3,
70597       "help.relations.maintain_relation_h": 3,
70598       "help.relations.relation_types_h": 2,
70599       "help.relations.multipolygon_h": 3,
70600       "help.relations.turn_restriction_h": 3,
70601       "help.relations.route_h": 3,
70602       "help.relations.boundary_h": 3,
70603       "help.notes.add_note_h": 3,
70604       "help.notes.update_note_h": 3,
70605       "help.notes.save_note_h": 3,
70606       "help.imagery.sources_h": 3,
70607       "help.imagery.offsets_h": 3,
70608       "help.streetlevel.using_h": 3,
70609       "help.gps.using_h": 3,
70610       "help.qa.tools_h": 3,
70611       "help.qa.issues_h": 3
70612     };
70613     var docs = docKeys.map(function(key) {
70614       var helpkey = "help." + key[0];
70615       var helpPaneReplacements = { version: context.version };
70616       var text2 = key[1].reduce(function(all, part) {
70617         var subkey = helpkey + "." + part;
70618         var depth = headings[subkey];
70619         var hhh = depth ? Array(depth + 1).join("#") + " " : "";
70620         return all + hhh + helpHtml(subkey, helpPaneReplacements) + "\n\n";
70621       }, "");
70622       return {
70623         title: _t.html(helpkey + ".title"),
70624         content: marked(text2.trim()).replace(/<code>/g, "<kbd>").replace(/<\/code>/g, "</kbd>")
70625       };
70626     });
70627     var helpPane = uiPane("help", context).key(_t("help.key")).label(_t.append("help.title")).description(_t.append("help.title")).iconName("iD-icon-help");
70628     helpPane.renderContent = function(content) {
70629       function clickHelp(d, i2) {
70630         var rtl = _mainLocalizer.textDirection() === "rtl";
70631         content.property("scrollTop", 0);
70632         helpPane.selection().select(".pane-heading h2").html(d.title);
70633         body.html(d.content);
70634         body.selectAll("a").attr("target", "_blank");
70635         menuItems.classed("selected", function(m) {
70636           return m.title === d.title;
70637         });
70638         nav.html("");
70639         if (rtl) {
70640           nav.call(drawNext).call(drawPrevious);
70641         } else {
70642           nav.call(drawPrevious).call(drawNext);
70643         }
70644         function drawNext(selection2) {
70645           if (i2 < docs.length - 1) {
70646             var nextLink = selection2.append("a").attr("href", "#").attr("class", "next").on("click", function(d3_event) {
70647               d3_event.preventDefault();
70648               clickHelp(docs[i2 + 1], i2 + 1);
70649             });
70650             nextLink.append("span").html(docs[i2 + 1].title).call(svgIcon(rtl ? "#iD-icon-backward" : "#iD-icon-forward", "inline"));
70651           }
70652         }
70653         function drawPrevious(selection2) {
70654           if (i2 > 0) {
70655             var prevLink = selection2.append("a").attr("href", "#").attr("class", "previous").on("click", function(d3_event) {
70656               d3_event.preventDefault();
70657               clickHelp(docs[i2 - 1], i2 - 1);
70658             });
70659             prevLink.call(svgIcon(rtl ? "#iD-icon-forward" : "#iD-icon-backward", "inline")).append("span").html(docs[i2 - 1].title);
70660           }
70661         }
70662       }
70663       function clickWalkthrough(d3_event) {
70664         d3_event.preventDefault();
70665         if (context.inIntro())
70666           return;
70667         context.container().call(uiIntro(context));
70668         context.ui().togglePanes();
70669       }
70670       function clickShortcuts(d3_event) {
70671         d3_event.preventDefault();
70672         context.container().call(context.ui().shortcuts, true);
70673       }
70674       var toc = content.append("ul").attr("class", "toc");
70675       var menuItems = toc.selectAll("li").data(docs).enter().append("li").append("a").attr("role", "button").attr("href", "#").html(function(d) {
70676         return d.title;
70677       }).on("click", function(d3_event, d) {
70678         d3_event.preventDefault();
70679         clickHelp(d, docs.indexOf(d));
70680       });
70681       var shortcuts = toc.append("li").attr("class", "shortcuts").call(
70682         uiTooltip().title(() => _t.append("shortcuts.tooltip")).keys(["?"]).placement("top")
70683       ).append("a").attr("href", "#").on("click", clickShortcuts);
70684       shortcuts.append("div").call(_t.append("shortcuts.title"));
70685       var walkthrough = toc.append("li").attr("class", "walkthrough").append("a").attr("href", "#").on("click", clickWalkthrough);
70686       walkthrough.append("svg").attr("class", "logo logo-walkthrough").append("use").attr("xlink:href", "#iD-logo-walkthrough");
70687       walkthrough.append("div").call(_t.append("splash.walkthrough"));
70688       var helpContent = content.append("div").attr("class", "left-content");
70689       var body = helpContent.append("div").attr("class", "body");
70690       var nav = helpContent.append("div").attr("class", "nav");
70691       clickHelp(docs[0], 0);
70692     };
70693     return helpPane;
70694   }
70695
70696   // modules/ui/sections/validation_issues.js
70697   function uiSectionValidationIssues(id2, severity, context) {
70698     var _issues = [];
70699     var section = uiSection(id2, context).label(function() {
70700       if (!_issues)
70701         return "";
70702       var issueCountText = _issues.length > 1e3 ? "1000+" : String(_issues.length);
70703       return _t.append("inspector.title_count", { title: _t("issues." + severity + "s.list_title"), count: issueCountText });
70704     }).disclosureContent(renderDisclosureContent).shouldDisplay(function() {
70705       return _issues && _issues.length;
70706     });
70707     function getOptions() {
70708       return {
70709         what: corePreferences("validate-what") || "edited",
70710         where: corePreferences("validate-where") || "all"
70711       };
70712     }
70713     function reloadIssues() {
70714       _issues = context.validator().getIssuesBySeverity(getOptions())[severity];
70715     }
70716     function renderDisclosureContent(selection2) {
70717       var center = context.map().center();
70718       var graph = context.graph();
70719       var issues = _issues.map(function withDistance(issue) {
70720         var extent = issue.extent(graph);
70721         var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
70722         return Object.assign(issue, { dist });
70723       }).sort(function byDistance(a, b) {
70724         return a.dist - b.dist;
70725       });
70726       issues = issues.slice(0, 1e3);
70727       selection2.call(drawIssuesList, issues);
70728     }
70729     function drawIssuesList(selection2, issues) {
70730       var list = selection2.selectAll(".issues-list").data([0]);
70731       list = list.enter().append("ul").attr("class", "layer-list issues-list " + severity + "s-list").merge(list);
70732       var items = list.selectAll("li").data(issues, function(d) {
70733         return d.key;
70734       });
70735       items.exit().remove();
70736       var itemsEnter = items.enter().append("li").attr("class", function(d) {
70737         return "issue severity-" + d.severity;
70738       });
70739       var labelsEnter = itemsEnter.append("button").attr("class", "issue-label").on("click", function(d3_event, d) {
70740         context.validator().focusIssue(d);
70741       }).on("mouseover", function(d3_event, d) {
70742         utilHighlightEntities(d.entityIds, true, context);
70743       }).on("mouseout", function(d3_event, d) {
70744         utilHighlightEntities(d.entityIds, false, context);
70745       });
70746       var textEnter = labelsEnter.append("span").attr("class", "issue-text");
70747       textEnter.append("span").attr("class", "issue-icon").each(function(d) {
70748         var iconName = "#iD-icon-" + (d.severity === "warning" ? "alert" : "error");
70749         select_default2(this).call(svgIcon(iconName));
70750       });
70751       textEnter.append("span").attr("class", "issue-message");
70752       items = items.merge(itemsEnter).order();
70753       items.selectAll(".issue-message").text("").each(function(d) {
70754         return d.message(context)(select_default2(this));
70755       });
70756     }
70757     context.validator().on("validated.uiSectionValidationIssues" + id2, function() {
70758       window.requestIdleCallback(function() {
70759         reloadIssues();
70760         section.reRender();
70761       });
70762     });
70763     context.map().on(
70764       "move.uiSectionValidationIssues" + id2,
70765       debounce_default(function() {
70766         window.requestIdleCallback(function() {
70767           if (getOptions().where === "visible") {
70768             reloadIssues();
70769           }
70770           section.reRender();
70771         });
70772       }, 1e3)
70773     );
70774     return section;
70775   }
70776
70777   // modules/ui/sections/validation_options.js
70778   function uiSectionValidationOptions(context) {
70779     var section = uiSection("issues-options", context).content(renderContent);
70780     function renderContent(selection2) {
70781       var container = selection2.selectAll(".issues-options-container").data([0]);
70782       container = container.enter().append("div").attr("class", "issues-options-container").merge(container);
70783       var data = [
70784         { key: "what", values: ["edited", "all"] },
70785         { key: "where", values: ["visible", "all"] }
70786       ];
70787       var options2 = container.selectAll(".issues-option").data(data, function(d) {
70788         return d.key;
70789       });
70790       var optionsEnter = options2.enter().append("div").attr("class", function(d) {
70791         return "issues-option issues-option-" + d.key;
70792       });
70793       optionsEnter.append("div").attr("class", "issues-option-title").html(function(d) {
70794         return _t.html("issues.options." + d.key + ".title");
70795       });
70796       var valuesEnter = optionsEnter.selectAll("label").data(function(d) {
70797         return d.values.map(function(val) {
70798           return { value: val, key: d.key };
70799         });
70800       }).enter().append("label");
70801       valuesEnter.append("input").attr("type", "radio").attr("name", function(d) {
70802         return "issues-option-" + d.key;
70803       }).attr("value", function(d) {
70804         return d.value;
70805       }).property("checked", function(d) {
70806         return getOptions()[d.key] === d.value;
70807       }).on("change", function(d3_event, d) {
70808         updateOptionValue(d3_event, d.key, d.value);
70809       });
70810       valuesEnter.append("span").html(function(d) {
70811         return _t.html("issues.options." + d.key + "." + d.value);
70812       });
70813     }
70814     function getOptions() {
70815       return {
70816         what: corePreferences("validate-what") || "edited",
70817         // 'all', 'edited'
70818         where: corePreferences("validate-where") || "all"
70819         // 'all', 'visible'
70820       };
70821     }
70822     function updateOptionValue(d3_event, d, val) {
70823       if (!val && d3_event && d3_event.target) {
70824         val = d3_event.target.value;
70825       }
70826       corePreferences("validate-" + d, val);
70827       context.validator().validate();
70828     }
70829     return section;
70830   }
70831
70832   // modules/ui/sections/validation_rules.js
70833   function uiSectionValidationRules(context) {
70834     var MINSQUARE = 0;
70835     var MAXSQUARE = 20;
70836     var DEFAULTSQUARE = 5;
70837     var section = uiSection("issues-rules", context).disclosureContent(renderDisclosureContent).label(() => _t.append("issues.rules.title"));
70838     var _ruleKeys = context.validator().getRuleKeys().filter(function(key) {
70839       return key !== "maprules";
70840     }).sort(function(key1, key2) {
70841       return _t("issues." + key1 + ".title") < _t("issues." + key2 + ".title") ? -1 : 1;
70842     });
70843     function renderDisclosureContent(selection2) {
70844       var container = selection2.selectAll(".issues-rulelist-container").data([0]);
70845       var containerEnter = container.enter().append("div").attr("class", "issues-rulelist-container");
70846       containerEnter.append("ul").attr("class", "layer-list issue-rules-list");
70847       var ruleLinks = containerEnter.append("div").attr("class", "issue-rules-links section-footer");
70848       ruleLinks.append("a").attr("class", "issue-rules-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) {
70849         d3_event.preventDefault();
70850         context.validator().disableRules(_ruleKeys);
70851       });
70852       ruleLinks.append("a").attr("class", "issue-rules-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) {
70853         d3_event.preventDefault();
70854         context.validator().disableRules([]);
70855       });
70856       container = container.merge(containerEnter);
70857       container.selectAll(".issue-rules-list").call(drawListItems, _ruleKeys, "checkbox", "rule", toggleRule, isRuleEnabled);
70858     }
70859     function drawListItems(selection2, data, type2, name, change, active) {
70860       var items = selection2.selectAll("li").data(data);
70861       items.exit().remove();
70862       var enter = items.enter().append("li");
70863       if (name === "rule") {
70864         enter.call(
70865           uiTooltip().title(function(d) {
70866             return _t.append("issues." + d + ".tip");
70867           }).placement("top")
70868         );
70869       }
70870       var label = enter.append("label");
70871       label.append("input").attr("type", type2).attr("name", name).on("change", change);
70872       label.append("span").html(function(d) {
70873         var params = {};
70874         if (d === "unsquare_way") {
70875           params.val = { html: '<span class="square-degrees"></span>' };
70876         }
70877         return _t.html("issues." + d + ".title", params);
70878       });
70879       items = items.merge(enter);
70880       items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false);
70881       var degStr = corePreferences("validate-square-degrees");
70882       if (degStr === null) {
70883         degStr = DEFAULTSQUARE.toString();
70884       }
70885       var span = items.selectAll(".square-degrees");
70886       var input = span.selectAll(".square-degrees-input").data([0]);
70887       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) {
70888         d3_event.preventDefault();
70889         d3_event.stopPropagation();
70890         this.select();
70891       }).on("keyup", function(d3_event) {
70892         if (d3_event.keyCode === 13) {
70893           this.blur();
70894           this.select();
70895         }
70896       }).on("blur", changeSquare).merge(input).property("value", degStr);
70897     }
70898     function changeSquare() {
70899       var input = select_default2(this);
70900       var degStr = utilGetSetValue(input).trim();
70901       var degNum = Number(degStr);
70902       if (!isFinite(degNum)) {
70903         degNum = DEFAULTSQUARE;
70904       } else if (degNum > MAXSQUARE) {
70905         degNum = MAXSQUARE;
70906       } else if (degNum < MINSQUARE) {
70907         degNum = MINSQUARE;
70908       }
70909       degNum = Math.round(degNum * 10) / 10;
70910       degStr = degNum.toString();
70911       input.property("value", degStr);
70912       corePreferences("validate-square-degrees", degStr);
70913       context.validator().revalidateUnsquare();
70914     }
70915     function isRuleEnabled(d) {
70916       return context.validator().isRuleEnabled(d);
70917     }
70918     function toggleRule(d3_event, d) {
70919       context.validator().toggleRule(d);
70920     }
70921     context.validator().on("validated.uiSectionValidationRules", function() {
70922       window.requestIdleCallback(section.reRender);
70923     });
70924     return section;
70925   }
70926
70927   // modules/ui/sections/validation_status.js
70928   function uiSectionValidationStatus(context) {
70929     var section = uiSection("issues-status", context).content(renderContent).shouldDisplay(function() {
70930       var issues = context.validator().getIssues(getOptions());
70931       return issues.length === 0;
70932     });
70933     function getOptions() {
70934       return {
70935         what: corePreferences("validate-what") || "edited",
70936         where: corePreferences("validate-where") || "all"
70937       };
70938     }
70939     function renderContent(selection2) {
70940       var box = selection2.selectAll(".box").data([0]);
70941       var boxEnter = box.enter().append("div").attr("class", "box");
70942       boxEnter.append("div").call(svgIcon("#iD-icon-apply", "pre-text"));
70943       var noIssuesMessage = boxEnter.append("span");
70944       noIssuesMessage.append("strong").attr("class", "message");
70945       noIssuesMessage.append("br");
70946       noIssuesMessage.append("span").attr("class", "details");
70947       renderIgnoredIssuesReset(selection2);
70948       setNoIssuesText(selection2);
70949     }
70950     function renderIgnoredIssuesReset(selection2) {
70951       var ignoredIssues = context.validator().getIssues({ what: "all", where: "all", includeDisabledRules: true, includeIgnored: "only" });
70952       var resetIgnored = selection2.selectAll(".reset-ignored").data(ignoredIssues.length ? [0] : []);
70953       resetIgnored.exit().remove();
70954       var resetIgnoredEnter = resetIgnored.enter().append("div").attr("class", "reset-ignored section-footer");
70955       resetIgnoredEnter.append("a").attr("href", "#");
70956       resetIgnored = resetIgnored.merge(resetIgnoredEnter);
70957       resetIgnored.select("a").html(_t.html("inspector.title_count", { title: { html: _t.html("issues.reset_ignored") }, count: ignoredIssues.length }));
70958       resetIgnored.on("click", function(d3_event) {
70959         d3_event.preventDefault();
70960         context.validator().resetIgnoredIssues();
70961       });
70962     }
70963     function setNoIssuesText(selection2) {
70964       var opts = getOptions();
70965       function checkForHiddenIssues(cases) {
70966         for (var type2 in cases) {
70967           var hiddenOpts = cases[type2];
70968           var hiddenIssues = context.validator().getIssues(hiddenOpts);
70969           if (hiddenIssues.length) {
70970             selection2.select(".box .details").html("").call(_t.append(
70971               "issues.no_issues.hidden_issues." + type2,
70972               { count: hiddenIssues.length.toString() }
70973             ));
70974             return;
70975           }
70976         }
70977         selection2.select(".box .details").html("").call(_t.append("issues.no_issues.hidden_issues.none"));
70978       }
70979       var messageType;
70980       if (opts.what === "edited" && opts.where === "visible") {
70981         messageType = "edits_in_view";
70982         checkForHiddenIssues({
70983           elsewhere: { what: "edited", where: "all" },
70984           everything_else: { what: "all", where: "visible" },
70985           disabled_rules: { what: "edited", where: "visible", includeDisabledRules: "only" },
70986           everything_else_elsewhere: { what: "all", where: "all" },
70987           disabled_rules_elsewhere: { what: "edited", where: "all", includeDisabledRules: "only" },
70988           ignored_issues: { what: "edited", where: "visible", includeIgnored: "only" },
70989           ignored_issues_elsewhere: { what: "edited", where: "all", includeIgnored: "only" }
70990         });
70991       } else if (opts.what === "edited" && opts.where === "all") {
70992         messageType = "edits";
70993         checkForHiddenIssues({
70994           everything_else: { what: "all", where: "all" },
70995           disabled_rules: { what: "edited", where: "all", includeDisabledRules: "only" },
70996           ignored_issues: { what: "edited", where: "all", includeIgnored: "only" }
70997         });
70998       } else if (opts.what === "all" && opts.where === "visible") {
70999         messageType = "everything_in_view";
71000         checkForHiddenIssues({
71001           elsewhere: { what: "all", where: "all" },
71002           disabled_rules: { what: "all", where: "visible", includeDisabledRules: "only" },
71003           disabled_rules_elsewhere: { what: "all", where: "all", includeDisabledRules: "only" },
71004           ignored_issues: { what: "all", where: "visible", includeIgnored: "only" },
71005           ignored_issues_elsewhere: { what: "all", where: "all", includeIgnored: "only" }
71006         });
71007       } else if (opts.what === "all" && opts.where === "all") {
71008         messageType = "everything";
71009         checkForHiddenIssues({
71010           disabled_rules: { what: "all", where: "all", includeDisabledRules: "only" },
71011           ignored_issues: { what: "all", where: "all", includeIgnored: "only" }
71012         });
71013       }
71014       if (opts.what === "edited" && context.history().difference().summary().length === 0) {
71015         messageType = "no_edits";
71016       }
71017       selection2.select(".box .message").html("").call(_t.append("issues.no_issues.message." + messageType));
71018     }
71019     context.validator().on("validated.uiSectionValidationStatus", function() {
71020       window.requestIdleCallback(section.reRender);
71021     });
71022     context.map().on(
71023       "move.uiSectionValidationStatus",
71024       debounce_default(function() {
71025         window.requestIdleCallback(section.reRender);
71026       }, 1e3)
71027     );
71028     return section;
71029   }
71030
71031   // modules/ui/panes/issues.js
71032   function uiPaneIssues(context) {
71033     var issuesPane = uiPane("issues", context).key(_t("issues.key")).label(_t.append("issues.title")).description(_t.append("issues.title")).iconName("iD-icon-alert").sections([
71034       uiSectionValidationOptions(context),
71035       uiSectionValidationStatus(context),
71036       uiSectionValidationIssues("issues-errors", "error", context),
71037       uiSectionValidationIssues("issues-warnings", "warning", context),
71038       uiSectionValidationRules(context)
71039     ]);
71040     return issuesPane;
71041   }
71042
71043   // modules/ui/settings/custom_data.js
71044   function uiSettingsCustomData(context) {
71045     var dispatch10 = dispatch_default("change");
71046     function render(selection2) {
71047       var dataLayer = context.layers().layer("data");
71048       var _origSettings = {
71049         fileList: dataLayer && dataLayer.fileList() || null,
71050         url: corePreferences("settings-custom-data-url")
71051       };
71052       var _currSettings = {
71053         fileList: dataLayer && dataLayer.fileList() || null,
71054         url: corePreferences("settings-custom-data-url")
71055       };
71056       var modal = uiConfirm(selection2).okButton();
71057       modal.classed("settings-modal settings-custom-data", true);
71058       modal.select(".modal-section.header").append("h3").call(_t.append("settings.custom_data.header"));
71059       var textSection = modal.select(".modal-section.message-text");
71060       textSection.append("pre").attr("class", "instructions-file").call(_t.append("settings.custom_data.file.instructions"));
71061       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) {
71062         var files = d3_event.target.files;
71063         if (files && files.length) {
71064           _currSettings.url = "";
71065           textSection.select(".field-url").property("value", "");
71066           _currSettings.fileList = files;
71067         } else {
71068           _currSettings.fileList = null;
71069         }
71070       });
71071       textSection.append("h4").call(_t.append("settings.custom_data.or"));
71072       textSection.append("pre").attr("class", "instructions-url").call(_t.append("settings.custom_data.url.instructions"));
71073       textSection.append("textarea").attr("class", "field-url").attr("placeholder", _t("settings.custom_data.url.placeholder")).call(utilNoAuto).property("value", _currSettings.url);
71074       var buttonSection = modal.select(".modal-section.buttons");
71075       buttonSection.insert("button", ".ok-button").attr("class", "button cancel-button secondary-action").call(_t.append("confirm.cancel"));
71076       buttonSection.select(".cancel-button").on("click.cancel", clickCancel);
71077       buttonSection.select(".ok-button").attr("disabled", isSaveDisabled).on("click.save", clickSave);
71078       function isSaveDisabled() {
71079         return null;
71080       }
71081       function clickCancel() {
71082         textSection.select(".field-url").property("value", _origSettings.url);
71083         corePreferences("settings-custom-data-url", _origSettings.url);
71084         this.blur();
71085         modal.close();
71086       }
71087       function clickSave() {
71088         _currSettings.url = textSection.select(".field-url").property("value").trim();
71089         if (_currSettings.url) {
71090           _currSettings.fileList = null;
71091         }
71092         if (_currSettings.fileList) {
71093           _currSettings.url = "";
71094         }
71095         corePreferences("settings-custom-data-url", _currSettings.url);
71096         this.blur();
71097         modal.close();
71098         dispatch10.call("change", this, _currSettings);
71099       }
71100     }
71101     return utilRebind(render, dispatch10, "on");
71102   }
71103
71104   // modules/ui/sections/data_layers.js
71105   function uiSectionDataLayers(context) {
71106     var settingsCustomData = uiSettingsCustomData(context).on("change", customChanged);
71107     var layers = context.layers();
71108     var section = uiSection("data-layers", context).label(() => _t.append("map_data.data_layers")).disclosureContent(renderDisclosureContent);
71109     function renderDisclosureContent(selection2) {
71110       var container = selection2.selectAll(".data-layer-container").data([0]);
71111       container.enter().append("div").attr("class", "data-layer-container").merge(container).call(drawOsmItems).call(drawQAItems).call(drawCustomDataItems).call(drawVectorItems).call(drawPanelItems);
71112     }
71113     function showsLayer(which) {
71114       var layer = layers.layer(which);
71115       if (layer) {
71116         return layer.enabled();
71117       }
71118       return false;
71119     }
71120     function setLayer(which, enabled) {
71121       var mode = context.mode();
71122       if (mode && /^draw/.test(mode.id))
71123         return;
71124       var layer = layers.layer(which);
71125       if (layer) {
71126         layer.enabled(enabled);
71127         if (!enabled && (which === "osm" || which === "notes")) {
71128           context.enter(modeBrowse(context));
71129         }
71130       }
71131     }
71132     function toggleLayer(which) {
71133       setLayer(which, !showsLayer(which));
71134     }
71135     function drawOsmItems(selection2) {
71136       var osmKeys = ["osm", "notes"];
71137       var osmLayers = layers.all().filter(function(obj) {
71138         return osmKeys.indexOf(obj.id) !== -1;
71139       });
71140       var ul = selection2.selectAll(".layer-list-osm").data([0]);
71141       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-osm").merge(ul);
71142       var li = ul.selectAll(".list-item").data(osmLayers);
71143       li.exit().remove();
71144       var liEnter = li.enter().append("li").attr("class", function(d) {
71145         return "list-item list-item-" + d.id;
71146       });
71147       var labelEnter = liEnter.append("label").each(function(d) {
71148         if (d.id === "osm") {
71149           select_default2(this).call(
71150             uiTooltip().title(() => _t.append("map_data.layers." + d.id + ".tooltip")).keys([uiCmd("\u2325" + _t("area_fill.wireframe.key"))]).placement("bottom")
71151           );
71152         } else {
71153           select_default2(this).call(
71154             uiTooltip().title(() => _t.append("map_data.layers." + d.id + ".tooltip")).placement("bottom")
71155           );
71156         }
71157       });
71158       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
71159         toggleLayer(d.id);
71160       });
71161       labelEnter.append("span").html(function(d) {
71162         return _t.html("map_data.layers." + d.id + ".title");
71163       });
71164       li.merge(liEnter).classed("active", function(d) {
71165         return d.layer.enabled();
71166       }).selectAll("input").property("checked", function(d) {
71167         return d.layer.enabled();
71168       });
71169     }
71170     function drawQAItems(selection2) {
71171       var qaKeys = ["keepRight", "improveOSM", "osmose"];
71172       var qaLayers = layers.all().filter(function(obj) {
71173         return qaKeys.indexOf(obj.id) !== -1;
71174       });
71175       var ul = selection2.selectAll(".layer-list-qa").data([0]);
71176       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-qa").merge(ul);
71177       var li = ul.selectAll(".list-item").data(qaLayers);
71178       li.exit().remove();
71179       var liEnter = li.enter().append("li").attr("class", function(d) {
71180         return "list-item list-item-" + d.id;
71181       });
71182       var labelEnter = liEnter.append("label").each(function(d) {
71183         select_default2(this).call(
71184           uiTooltip().title(() => _t.append("map_data.layers." + d.id + ".tooltip")).placement("bottom")
71185         );
71186       });
71187       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
71188         toggleLayer(d.id);
71189       });
71190       labelEnter.append("span").each(function(d) {
71191         _t.append("map_data.layers." + d.id + ".title")(select_default2(this));
71192       });
71193       li.merge(liEnter).classed("active", function(d) {
71194         return d.layer.enabled();
71195       }).selectAll("input").property("checked", function(d) {
71196         return d.layer.enabled();
71197       });
71198     }
71199     function drawVectorItems(selection2) {
71200       var dataLayer = layers.layer("data");
71201       var vtData = [
71202         {
71203           name: "Detroit Neighborhoods/Parks",
71204           src: "neighborhoods-parks",
71205           tooltip: "Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.",
71206           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"
71207         },
71208         {
71209           name: "Detroit Composite POIs",
71210           src: "composite-poi",
71211           tooltip: "Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.",
71212           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"
71213         },
71214         {
71215           name: "Detroit All-The-Places POIs",
71216           src: "alltheplaces-poi",
71217           tooltip: "Public domain business location data created by web scrapers.",
71218           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"
71219         }
71220       ];
71221       var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
71222       var showVectorItems = context.map().zoom() > 9 && detroit.contains(context.map().center());
71223       var container = selection2.selectAll(".vectortile-container").data(showVectorItems ? [0] : []);
71224       container.exit().remove();
71225       var containerEnter = container.enter().append("div").attr("class", "vectortile-container");
71226       containerEnter.append("h4").attr("class", "vectortile-header").text("Detroit Vector Tiles (Beta)");
71227       containerEnter.append("ul").attr("class", "layer-list layer-list-vectortile");
71228       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");
71229       container = container.merge(containerEnter);
71230       var ul = container.selectAll(".layer-list-vectortile");
71231       var li = ul.selectAll(".list-item").data(vtData);
71232       li.exit().remove();
71233       var liEnter = li.enter().append("li").attr("class", function(d) {
71234         return "list-item list-item-" + d.src;
71235       });
71236       var labelEnter = liEnter.append("label").each(function(d) {
71237         select_default2(this).call(
71238           uiTooltip().title(d.tooltip).placement("top")
71239         );
71240       });
71241       labelEnter.append("input").attr("type", "radio").attr("name", "vectortile").on("change", selectVTLayer);
71242       labelEnter.append("span").text(function(d) {
71243         return d.name;
71244       });
71245       li.merge(liEnter).classed("active", isVTLayerSelected).selectAll("input").property("checked", isVTLayerSelected);
71246       function isVTLayerSelected(d) {
71247         return dataLayer && dataLayer.template() === d.template;
71248       }
71249       function selectVTLayer(d3_event, d) {
71250         corePreferences("settings-custom-data-url", d.template);
71251         if (dataLayer) {
71252           dataLayer.template(d.template, d.src);
71253           dataLayer.enabled(true);
71254         }
71255       }
71256     }
71257     function drawCustomDataItems(selection2) {
71258       var dataLayer = layers.layer("data");
71259       var hasData = dataLayer && dataLayer.hasData();
71260       var showsData = hasData && dataLayer.enabled();
71261       var ul = selection2.selectAll(".layer-list-data").data(dataLayer ? [0] : []);
71262       ul.exit().remove();
71263       var ulEnter = ul.enter().append("ul").attr("class", "layer-list layer-list-data");
71264       var liEnter = ulEnter.append("li").attr("class", "list-item-data");
71265       var labelEnter = liEnter.append("label").call(
71266         uiTooltip().title(() => _t.append("map_data.layers.custom.tooltip")).placement("top")
71267       );
71268       labelEnter.append("input").attr("type", "checkbox").on("change", function() {
71269         toggleLayer("data");
71270       });
71271       labelEnter.append("span").call(_t.append("map_data.layers.custom.title"));
71272       liEnter.append("button").attr("class", "open-data-options").call(
71273         uiTooltip().title(() => _t.append("settings.custom_data.tooltip")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
71274       ).on("click", function(d3_event) {
71275         d3_event.preventDefault();
71276         editCustom();
71277       }).call(svgIcon("#iD-icon-more"));
71278       liEnter.append("button").attr("class", "zoom-to-data").call(
71279         uiTooltip().title(() => _t.append("map_data.layers.custom.zoom")).placement(_mainLocalizer.textDirection() === "rtl" ? "right" : "left")
71280       ).on("click", function(d3_event) {
71281         if (select_default2(this).classed("disabled"))
71282           return;
71283         d3_event.preventDefault();
71284         d3_event.stopPropagation();
71285         dataLayer.fitZoom();
71286       }).call(svgIcon("#iD-icon-framed-dot", "monochrome"));
71287       ul = ul.merge(ulEnter);
71288       ul.selectAll(".list-item-data").classed("active", showsData).selectAll("label").classed("deemphasize", !hasData).selectAll("input").property("disabled", !hasData).property("checked", showsData);
71289       ul.selectAll("button.zoom-to-data").classed("disabled", !hasData);
71290     }
71291     function editCustom() {
71292       context.container().call(settingsCustomData);
71293     }
71294     function customChanged(d) {
71295       var dataLayer = layers.layer("data");
71296       if (d && d.url) {
71297         dataLayer.url(d.url);
71298       } else if (d && d.fileList) {
71299         dataLayer.fileList(d.fileList);
71300       }
71301     }
71302     function drawPanelItems(selection2) {
71303       var panelsListEnter = selection2.selectAll(".md-extras-list").data([0]).enter().append("ul").attr("class", "layer-list md-extras-list");
71304       var historyPanelLabelEnter = panelsListEnter.append("li").attr("class", "history-panel-toggle-item").append("label").call(
71305         uiTooltip().title(() => _t.append("map_data.history_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.history.key"))]).placement("top")
71306       );
71307       historyPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
71308         d3_event.preventDefault();
71309         context.ui().info.toggle("history");
71310       });
71311       historyPanelLabelEnter.append("span").call(_t.append("map_data.history_panel.title"));
71312       var measurementPanelLabelEnter = panelsListEnter.append("li").attr("class", "measurement-panel-toggle-item").append("label").call(
71313         uiTooltip().title(() => _t.append("map_data.measurement_panel.tooltip")).keys([uiCmd("\u2318\u21E7" + _t("info_panels.measurement.key"))]).placement("top")
71314       );
71315       measurementPanelLabelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event) {
71316         d3_event.preventDefault();
71317         context.ui().info.toggle("measurement");
71318       });
71319       measurementPanelLabelEnter.append("span").call(_t.append("map_data.measurement_panel.title"));
71320     }
71321     context.layers().on("change.uiSectionDataLayers", section.reRender);
71322     context.map().on(
71323       "move.uiSectionDataLayers",
71324       debounce_default(function() {
71325         window.requestIdleCallback(section.reRender);
71326       }, 1e3)
71327     );
71328     return section;
71329   }
71330
71331   // modules/ui/sections/map_features.js
71332   function uiSectionMapFeatures(context) {
71333     var _features = context.features().keys();
71334     var section = uiSection("map-features", context).label(() => _t.append("map_data.map_features")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
71335     function renderDisclosureContent(selection2) {
71336       var container = selection2.selectAll(".layer-feature-list-container").data([0]);
71337       var containerEnter = container.enter().append("div").attr("class", "layer-feature-list-container");
71338       containerEnter.append("ul").attr("class", "layer-list layer-feature-list");
71339       var footer = containerEnter.append("div").attr("class", "feature-list-links section-footer");
71340       footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.disable_all")).on("click", function(d3_event) {
71341         d3_event.preventDefault();
71342         context.features().disableAll();
71343       });
71344       footer.append("a").attr("class", "feature-list-link").attr("role", "button").attr("href", "#").call(_t.append("issues.enable_all")).on("click", function(d3_event) {
71345         d3_event.preventDefault();
71346         context.features().enableAll();
71347       });
71348       container = container.merge(containerEnter);
71349       container.selectAll(".layer-feature-list").call(drawListItems, _features, "checkbox", "feature", clickFeature, showsFeature);
71350     }
71351     function drawListItems(selection2, data, type2, name, change, active) {
71352       var items = selection2.selectAll("li").data(data);
71353       items.exit().remove();
71354       var enter = items.enter().append("li").call(
71355         uiTooltip().title(function(d) {
71356           var tip = _t.append(name + "." + d + ".tooltip");
71357           if (autoHiddenFeature(d)) {
71358             var msg = showsLayer("osm") ? _t.append("map_data.autohidden") : _t.append("map_data.osmhidden");
71359             return (selection3) => {
71360               selection3.call(tip);
71361               selection3.append("div").call(msg);
71362             };
71363           }
71364           return tip;
71365         }).placement("top")
71366       );
71367       var label = enter.append("label");
71368       label.append("input").attr("type", type2).attr("name", name).on("change", change);
71369       label.append("span").html(function(d) {
71370         return _t.html(name + "." + d + ".description");
71371       });
71372       items = items.merge(enter);
71373       items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", autoHiddenFeature);
71374     }
71375     function autoHiddenFeature(d) {
71376       return context.features().autoHidden(d);
71377     }
71378     function showsFeature(d) {
71379       return context.features().enabled(d);
71380     }
71381     function clickFeature(d3_event, d) {
71382       context.features().toggle(d);
71383     }
71384     function showsLayer(id2) {
71385       var layer = context.layers().layer(id2);
71386       return layer && layer.enabled();
71387     }
71388     context.features().on("change.map_features", section.reRender);
71389     return section;
71390   }
71391
71392   // modules/ui/sections/map_style_options.js
71393   function uiSectionMapStyleOptions(context) {
71394     var section = uiSection("fill-area", context).label(() => _t.append("map_data.style_options")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
71395     function renderDisclosureContent(selection2) {
71396       var container = selection2.selectAll(".layer-fill-list").data([0]);
71397       container.enter().append("ul").attr("class", "layer-list layer-fill-list").merge(container).call(drawListItems, context.map().areaFillOptions, "radio", "area_fill", setFill, isActiveFill);
71398       var container2 = selection2.selectAll(".layer-visual-diff-list").data([0]);
71399       container2.enter().append("ul").attr("class", "layer-list layer-visual-diff-list").merge(container2).call(drawListItems, ["highlight_edits"], "checkbox", "visual_diff", toggleHighlightEdited, function() {
71400         return context.surface().classed("highlight-edited");
71401       });
71402     }
71403     function drawListItems(selection2, data, type2, name, change, active) {
71404       var items = selection2.selectAll("li").data(data);
71405       items.exit().remove();
71406       var enter = items.enter().append("li").call(
71407         uiTooltip().title(function(d) {
71408           return _t.append(name + "." + d + ".tooltip");
71409         }).keys(function(d) {
71410           var key = d === "wireframe" ? _t("area_fill.wireframe.key") : null;
71411           if (d === "highlight_edits")
71412             key = _t("map_data.highlight_edits.key");
71413           return key ? [key] : null;
71414         }).placement("top")
71415       );
71416       var label = enter.append("label");
71417       label.append("input").attr("type", type2).attr("name", name).on("change", change);
71418       label.append("span").html(function(d) {
71419         return _t.html(name + "." + d + ".description");
71420       });
71421       items = items.merge(enter);
71422       items.classed("active", active).selectAll("input").property("checked", active).property("indeterminate", false);
71423     }
71424     function isActiveFill(d) {
71425       return context.map().activeAreaFill() === d;
71426     }
71427     function toggleHighlightEdited(d3_event) {
71428       d3_event.preventDefault();
71429       context.map().toggleHighlightEdited();
71430     }
71431     function setFill(d3_event, d) {
71432       context.map().activeAreaFill(d);
71433     }
71434     context.map().on("changeHighlighting.ui_style, changeAreaFill.ui_style", section.reRender);
71435     return section;
71436   }
71437
71438   // modules/ui/sections/photo_overlays.js
71439   function uiSectionPhotoOverlays(context) {
71440     var layers = context.layers();
71441     var section = uiSection("photo-overlays", context).label(() => _t.append("photo_overlays.title")).disclosureContent(renderDisclosureContent).expandedByDefault(false);
71442     function renderDisclosureContent(selection2) {
71443       var container = selection2.selectAll(".photo-overlay-container").data([0]);
71444       container.enter().append("div").attr("class", "photo-overlay-container").merge(container).call(drawPhotoItems).call(drawPhotoTypeItems).call(drawDateFilter).call(drawUsernameFilter);
71445     }
71446     function drawPhotoItems(selection2) {
71447       var photoKeys = context.photos().overlayLayerIDs();
71448       var photoLayers = layers.all().filter(function(obj) {
71449         return photoKeys.indexOf(obj.id) !== -1;
71450       });
71451       var data = photoLayers.filter(function(obj) {
71452         return obj.layer.supported();
71453       });
71454       function layerSupported(d) {
71455         return d.layer && d.layer.supported();
71456       }
71457       function layerEnabled(d) {
71458         return layerSupported(d) && d.layer.enabled();
71459       }
71460       var ul = selection2.selectAll(".layer-list-photos").data([0]);
71461       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photos").merge(ul);
71462       var li = ul.selectAll(".list-item-photos").data(data);
71463       li.exit().remove();
71464       var liEnter = li.enter().append("li").attr("class", function(d) {
71465         var classes = "list-item-photos list-item-" + d.id;
71466         if (d.id === "mapillary-signs" || d.id === "mapillary-map-features") {
71467           classes += " indented";
71468         }
71469         return classes;
71470       });
71471       var labelEnter = liEnter.append("label").each(function(d) {
71472         var titleID;
71473         if (d.id === "mapillary-signs")
71474           titleID = "mapillary.signs.tooltip";
71475         else if (d.id === "mapillary")
71476           titleID = "mapillary_images.tooltip";
71477         else if (d.id === "kartaview")
71478           titleID = "kartaview_images.tooltip";
71479         else
71480           titleID = d.id.replace(/-/g, "_") + ".tooltip";
71481         select_default2(this).call(
71482           uiTooltip().title(() => _t.append(titleID)).placement("top")
71483         );
71484       });
71485       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
71486         toggleLayer(d.id);
71487       });
71488       labelEnter.append("span").html(function(d) {
71489         var id2 = d.id;
71490         if (id2 === "mapillary-signs")
71491           id2 = "photo_overlays.traffic_signs";
71492         return _t.html(id2.replace(/-/g, "_") + ".title");
71493       });
71494       li.merge(liEnter).classed("active", layerEnabled).selectAll("input").property("checked", layerEnabled);
71495     }
71496     function drawPhotoTypeItems(selection2) {
71497       var data = context.photos().allPhotoTypes();
71498       function typeEnabled(d) {
71499         return context.photos().showsPhotoType(d);
71500       }
71501       var ul = selection2.selectAll(".layer-list-photo-types").data([0]);
71502       ul.exit().remove();
71503       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-photo-types").merge(ul);
71504       var li = ul.selectAll(".list-item-photo-types").data(context.photos().shouldFilterByPhotoType() ? data : []);
71505       li.exit().remove();
71506       var liEnter = li.enter().append("li").attr("class", function(d) {
71507         return "list-item-photo-types list-item-" + d;
71508       });
71509       var labelEnter = liEnter.append("label").each(function(d) {
71510         select_default2(this).call(
71511           uiTooltip().title(() => _t.append("photo_overlays.photo_type." + d + ".tooltip")).placement("top")
71512         );
71513       });
71514       labelEnter.append("input").attr("type", "checkbox").on("change", function(d3_event, d) {
71515         context.photos().togglePhotoType(d);
71516       });
71517       labelEnter.append("span").html(function(d) {
71518         return _t.html("photo_overlays.photo_type." + d + ".title");
71519       });
71520       li.merge(liEnter).classed("active", typeEnabled).selectAll("input").property("checked", typeEnabled);
71521     }
71522     function drawDateFilter(selection2) {
71523       var data = context.photos().dateFilters();
71524       function filterEnabled(d) {
71525         return context.photos().dateFilterValue(d);
71526       }
71527       var ul = selection2.selectAll(".layer-list-date-filter").data([0]);
71528       ul.exit().remove();
71529       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-date-filter").merge(ul);
71530       var li = ul.selectAll(".list-item-date-filter").data(context.photos().shouldFilterByDate() ? data : []);
71531       li.exit().remove();
71532       var liEnter = li.enter().append("li").attr("class", "list-item-date-filter");
71533       var labelEnter = liEnter.append("label").each(function(d) {
71534         select_default2(this).call(
71535           uiTooltip().title(() => _t.append("photo_overlays.date_filter." + d + ".tooltip")).placement("top")
71536         );
71537       });
71538       labelEnter.append("span").each(function(d) {
71539         _t.append("photo_overlays.date_filter." + d + ".title")(select_default2(this));
71540       });
71541       labelEnter.append("input").attr("type", "date").attr("class", "list-item-input").attr("placeholder", _t("units.year_month_day")).call(utilNoAuto).each(function(d) {
71542         utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d) || "");
71543       }).on("change", function(d3_event, d) {
71544         var value = utilGetSetValue(select_default2(this)).trim();
71545         context.photos().setDateFilter(d, value, true);
71546         li.selectAll("input").each(function(d2) {
71547           utilGetSetValue(select_default2(this), context.photos().dateFilterValue(d2) || "");
71548         });
71549       });
71550       li = li.merge(liEnter).classed("active", filterEnabled);
71551     }
71552     function drawUsernameFilter(selection2) {
71553       function filterEnabled() {
71554         return context.photos().usernames();
71555       }
71556       var ul = selection2.selectAll(".layer-list-username-filter").data([0]);
71557       ul.exit().remove();
71558       ul = ul.enter().append("ul").attr("class", "layer-list layer-list-username-filter").merge(ul);
71559       var li = ul.selectAll(".list-item-username-filter").data(context.photos().shouldFilterByUsername() ? ["username-filter"] : []);
71560       li.exit().remove();
71561       var liEnter = li.enter().append("li").attr("class", "list-item-username-filter");
71562       var labelEnter = liEnter.append("label").each(function() {
71563         select_default2(this).call(
71564           uiTooltip().title(() => _t.append("photo_overlays.username_filter.tooltip")).placement("top")
71565         );
71566       });
71567       labelEnter.append("span").call(_t.append("photo_overlays.username_filter.title"));
71568       labelEnter.append("input").attr("type", "text").attr("class", "list-item-input").call(utilNoAuto).property("value", usernameValue).on("change", function() {
71569         var value = select_default2(this).property("value");
71570         context.photos().setUsernameFilter(value, true);
71571         select_default2(this).property("value", usernameValue);
71572       });
71573       li.merge(liEnter).classed("active", filterEnabled);
71574       function usernameValue() {
71575         var usernames = context.photos().usernames();
71576         if (usernames)
71577           return usernames.join("; ");
71578         return usernames;
71579       }
71580     }
71581     function toggleLayer(which) {
71582       setLayer(which, !showsLayer(which));
71583     }
71584     function showsLayer(which) {
71585       var layer = layers.layer(which);
71586       if (layer) {
71587         return layer.enabled();
71588       }
71589       return false;
71590     }
71591     function setLayer(which, enabled) {
71592       var layer = layers.layer(which);
71593       if (layer) {
71594         layer.enabled(enabled);
71595       }
71596     }
71597     context.layers().on("change.uiSectionPhotoOverlays", section.reRender);
71598     context.photos().on("change.uiSectionPhotoOverlays", section.reRender);
71599     return section;
71600   }
71601
71602   // modules/ui/panes/map_data.js
71603   function uiPaneMapData(context) {
71604     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([
71605       uiSectionDataLayers(context),
71606       uiSectionPhotoOverlays(context),
71607       uiSectionMapStyleOptions(context),
71608       uiSectionMapFeatures(context)
71609     ]);
71610     return mapDataPane;
71611   }
71612
71613   // modules/ui/panes/preferences.js
71614   function uiPanePreferences(context) {
71615     let preferencesPane = uiPane("preferences", context).key(_t("preferences.key")).label(_t.append("preferences.title")).description(_t.append("preferences.description")).iconName("fas-user-cog").sections([
71616       uiSectionPrivacy(context)
71617     ]);
71618     return preferencesPane;
71619   }
71620
71621   // modules/ui/init.js
71622   function uiInit(context) {
71623     var _initCounter = 0;
71624     var _needWidth = {};
71625     var _lastPointerType;
71626     function render(container) {
71627       container.on("click.ui", function(d3_event) {
71628         if (d3_event.button !== 0)
71629           return;
71630         if (!d3_event.composedPath)
71631           return;
71632         var isOkayTarget = d3_event.composedPath().some(function(node) {
71633           return node.nodeType === 1 && // clicking <input> focuses it and/or changes a value
71634           (node.nodeName === "INPUT" || // clicking <label> affects its <input> by default
71635           node.nodeName === "LABEL" || // clicking <a> opens a hyperlink by default
71636           node.nodeName === "A");
71637         });
71638         if (isOkayTarget)
71639           return;
71640         d3_event.preventDefault();
71641       });
71642       var detected = utilDetect();
71643       if ("GestureEvent" in window && // Listening for gesture events on iOS 13.4+ breaks double-tapping,
71644       // but we only need to do this on desktop Safari anyway. – #7694
71645       !detected.isMobileWebKit) {
71646         container.on("gesturestart.ui gesturechange.ui gestureend.ui", function(d3_event) {
71647           d3_event.preventDefault();
71648         });
71649       }
71650       if ("PointerEvent" in window) {
71651         select_default2(window).on("pointerdown.ui pointerup.ui", function(d3_event) {
71652           var pointerType = d3_event.pointerType || "mouse";
71653           if (_lastPointerType !== pointerType) {
71654             _lastPointerType = pointerType;
71655             container.attr("pointer", pointerType);
71656           }
71657         }, true);
71658       } else {
71659         _lastPointerType = "mouse";
71660         container.attr("pointer", "mouse");
71661       }
71662       container.attr("lang", _mainLocalizer.localeCode()).attr("dir", _mainLocalizer.textDirection());
71663       container.call(uiFullScreen(context));
71664       var map2 = context.map();
71665       map2.redrawEnable(false);
71666       map2.on("hitMinZoom.ui", function() {
71667         ui.flash.iconName("#iD-icon-no").label(_t.append("cannot_zoom"))();
71668       });
71669       container.append("svg").attr("id", "ideditor-defs").call(ui.svgDefs);
71670       container.append("div").attr("class", "sidebar").call(ui.sidebar);
71671       var content = container.append("div").attr("class", "main-content active");
71672       content.append("div").attr("class", "top-toolbar-wrap").append("div").attr("class", "top-toolbar fillD").call(uiTopToolbar(context));
71673       content.append("div").attr("class", "main-map").attr("dir", "ltr").call(map2);
71674       var overMap = content.append("div").attr("class", "over-map");
71675       overMap.append("div").attr("class", "select-trap").text("t");
71676       overMap.call(uiMapInMap(context)).call(uiNotice(context));
71677       overMap.append("div").attr("class", "spinner").call(uiSpinner(context));
71678       var controlsWrap = overMap.append("div").attr("class", "map-controls-wrap");
71679       var controls = controlsWrap.append("div").attr("class", "map-controls");
71680       controls.append("div").attr("class", "map-control zoombuttons").call(uiZoom(context));
71681       controls.append("div").attr("class", "map-control zoom-to-selection-control").call(uiZoomToSelection(context));
71682       controls.append("div").attr("class", "map-control geolocate-control").call(uiGeolocate(context));
71683       controlsWrap.on("wheel.mapControls", function(d3_event) {
71684         if (!d3_event.deltaX) {
71685           controlsWrap.node().scrollTop += d3_event.deltaY;
71686         }
71687       });
71688       var panes = overMap.append("div").attr("class", "map-panes");
71689       var uiPanes = [
71690         uiPaneBackground(context),
71691         uiPaneMapData(context),
71692         uiPaneIssues(context),
71693         uiPanePreferences(context),
71694         uiPaneHelp(context)
71695       ];
71696       uiPanes.forEach(function(pane) {
71697         controls.append("div").attr("class", "map-control map-pane-control " + pane.id + "-control").call(pane.renderToggleButton);
71698         panes.call(pane.renderPane);
71699       });
71700       ui.info = uiInfo(context);
71701       overMap.call(ui.info);
71702       overMap.append("div").attr("class", "photoviewer").classed("al", true).classed("hide", true).call(ui.photoviewer);
71703       overMap.append("div").attr("class", "attribution-wrap").attr("dir", "ltr").call(uiAttribution(context));
71704       var about = content.append("div").attr("class", "map-footer");
71705       about.append("div").attr("class", "api-status").call(uiStatus(context));
71706       var footer = about.append("div").attr("class", "map-footer-bar fillD");
71707       footer.append("div").attr("class", "flash-wrap footer-hide");
71708       var footerWrap = footer.append("div").attr("class", "main-footer-wrap footer-show");
71709       footerWrap.append("div").attr("class", "scale-block").call(uiScale(context));
71710       var aboutList = footerWrap.append("div").attr("class", "info-block").append("ul").attr("class", "map-footer-list");
71711       aboutList.append("li").attr("class", "user-list").call(uiContributors(context));
71712       var apiConnections = context.connection().apiConnections();
71713       if (apiConnections && apiConnections.length > 1) {
71714         aboutList.append("li").attr("class", "source-switch").call(
71715           uiSourceSwitch(context).keys(apiConnections)
71716         );
71717       }
71718       aboutList.append("li").attr("class", "issues-info").call(uiIssuesInfo(context));
71719       aboutList.append("li").attr("class", "feature-warning").call(uiFeatureInfo(context));
71720       var issueLinks = aboutList.append("li");
71721       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"));
71722       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"));
71723       aboutList.append("li").attr("class", "version").call(uiVersion(context));
71724       if (!context.embed()) {
71725         aboutList.call(uiAccount(context));
71726       }
71727       ui.onResize();
71728       map2.redrawEnable(true);
71729       ui.hash = behaviorHash(context);
71730       ui.hash();
71731       if (!ui.hash.hadLocation) {
71732         map2.centerZoom([0, 0], 2);
71733       }
71734       window.onbeforeunload = function() {
71735         return context.save();
71736       };
71737       window.onunload = function() {
71738         context.history().unlock();
71739       };
71740       select_default2(window).on("resize.editor", function() {
71741         ui.onResize();
71742       });
71743       var panPixels = 80;
71744       context.keybinding().on("\u232B", function(d3_event) {
71745         d3_event.preventDefault();
71746       }).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) {
71747         if (d3_event) {
71748           d3_event.stopImmediatePropagation();
71749           d3_event.preventDefault();
71750         }
71751         var previousBackground = context.background().findSource(corePreferences("background-last-used-toggle"));
71752         if (previousBackground) {
71753           var currentBackground = context.background().baseLayerSource();
71754           corePreferences("background-last-used-toggle", currentBackground.id);
71755           corePreferences("background-last-used", previousBackground.id);
71756           context.background().baseLayerSource(previousBackground);
71757         }
71758       }).on(_t("area_fill.wireframe.key"), function toggleWireframe(d3_event) {
71759         d3_event.preventDefault();
71760         d3_event.stopPropagation();
71761         context.map().toggleWireframe();
71762       }).on(uiCmd("\u2325" + _t("area_fill.wireframe.key")), function toggleOsmData(d3_event) {
71763         d3_event.preventDefault();
71764         d3_event.stopPropagation();
71765         var mode = context.mode();
71766         if (mode && /^draw/.test(mode.id))
71767           return;
71768         var layer = context.layers().layer("osm");
71769         if (layer) {
71770           layer.enabled(!layer.enabled());
71771           if (!layer.enabled()) {
71772             context.enter(modeBrowse(context));
71773           }
71774         }
71775       }).on(_t("map_data.highlight_edits.key"), function toggleHighlightEdited(d3_event) {
71776         d3_event.preventDefault();
71777         context.map().toggleHighlightEdited();
71778       });
71779       context.on("enter.editor", function(entered) {
71780         container.classed("mode-" + entered.id, true);
71781       }).on("exit.editor", function(exited) {
71782         container.classed("mode-" + exited.id, false);
71783       });
71784       context.enter(modeBrowse(context));
71785       if (!_initCounter++) {
71786         if (!ui.hash.startWalkthrough) {
71787           context.container().call(uiSplash(context)).call(uiRestore(context));
71788         }
71789         context.container().call(ui.shortcuts);
71790       }
71791       var osm = context.connection();
71792       var auth = uiLoading(context).message(_t.html("loading_auth")).blocking(true);
71793       if (osm && auth) {
71794         osm.on("authLoading.ui", function() {
71795           context.container().call(auth);
71796         }).on("authDone.ui", function() {
71797           auth.close();
71798         });
71799       }
71800       _initCounter++;
71801       if (ui.hash.startWalkthrough) {
71802         ui.hash.startWalkthrough = false;
71803         context.container().call(uiIntro(context));
71804       }
71805       function pan(d) {
71806         return function(d3_event) {
71807           if (d3_event.shiftKey)
71808             return;
71809           if (context.container().select(".combobox").size())
71810             return;
71811           d3_event.preventDefault();
71812           context.map().pan(d, 100);
71813         };
71814       }
71815     }
71816     let ui = {};
71817     let _loadPromise;
71818     ui.ensureLoaded = () => {
71819       if (_loadPromise)
71820         return _loadPromise;
71821       return _loadPromise = Promise.all([
71822         // must have strings and presets before loading the UI
71823         _mainLocalizer.ensureLoaded(),
71824         _mainPresetIndex.ensureLoaded()
71825       ]).then(() => {
71826         if (!context.container().empty())
71827           render(context.container());
71828       }).catch((err) => console.error(err));
71829     };
71830     ui.restart = function() {
71831       context.keybinding().clear();
71832       _loadPromise = null;
71833       context.container().selectAll("*").remove();
71834       ui.ensureLoaded();
71835     };
71836     ui.lastPointerType = function() {
71837       return _lastPointerType;
71838     };
71839     ui.svgDefs = svgDefs(context);
71840     ui.flash = uiFlash(context);
71841     ui.sidebar = uiSidebar(context);
71842     ui.photoviewer = uiPhotoviewer(context);
71843     ui.shortcuts = uiShortcuts(context);
71844     ui.onResize = function(withPan) {
71845       var map2 = context.map();
71846       var mapDimensions = utilGetDimensions(context.container().select(".main-content"), true);
71847       utilGetDimensions(context.container().select(".sidebar"), true);
71848       if (withPan !== void 0) {
71849         map2.redrawEnable(false);
71850         map2.pan(withPan);
71851         map2.redrawEnable(true);
71852       }
71853       map2.dimensions(mapDimensions);
71854       ui.photoviewer.onMapResize();
71855       ui.checkOverflow(".top-toolbar");
71856       ui.checkOverflow(".map-footer-bar");
71857       var resizeWindowEvent = document.createEvent("Event");
71858       resizeWindowEvent.initEvent("resizeWindow", true, true);
71859       document.dispatchEvent(resizeWindowEvent);
71860     };
71861     ui.checkOverflow = function(selector, reset) {
71862       if (reset) {
71863         delete _needWidth[selector];
71864       }
71865       var selection2 = context.container().select(selector);
71866       if (selection2.empty())
71867         return;
71868       var scrollWidth = selection2.property("scrollWidth");
71869       var clientWidth = selection2.property("clientWidth");
71870       var needed = _needWidth[selector] || scrollWidth;
71871       if (scrollWidth > clientWidth) {
71872         selection2.classed("narrow", true);
71873         if (!_needWidth[selector]) {
71874           _needWidth[selector] = scrollWidth;
71875         }
71876       } else if (scrollWidth >= needed) {
71877         selection2.classed("narrow", false);
71878       }
71879     };
71880     ui.togglePanes = function(showPane) {
71881       var hidePanes = context.container().selectAll(".map-pane.shown");
71882       var side = _mainLocalizer.textDirection() === "ltr" ? "right" : "left";
71883       hidePanes.classed("shown", false).classed("hide", true);
71884       context.container().selectAll(".map-pane-control button").classed("active", false);
71885       if (showPane) {
71886         hidePanes.classed("shown", false).classed("hide", true).style(side, "-500px");
71887         context.container().selectAll("." + showPane.attr("pane") + "-control button").classed("active", true);
71888         showPane.classed("shown", true).classed("hide", false);
71889         if (hidePanes.empty()) {
71890           showPane.style(side, "-500px").transition().duration(200).style(side, "0px");
71891         } else {
71892           showPane.style(side, "0px");
71893         }
71894       } else {
71895         hidePanes.classed("shown", true).classed("hide", false).style(side, "0px").transition().duration(200).style(side, "-500px").on("end", function() {
71896           select_default2(this).classed("shown", false).classed("hide", true);
71897         });
71898       }
71899     };
71900     var _editMenu = uiEditMenu(context);
71901     ui.editMenu = function() {
71902       return _editMenu;
71903     };
71904     ui.showEditMenu = function(anchorPoint, triggerType, operations) {
71905       ui.closeEditMenu();
71906       if (!operations && context.mode().operations)
71907         operations = context.mode().operations();
71908       if (!operations || !operations.length)
71909         return;
71910       if (!context.map().editableDataEnabled())
71911         return;
71912       var surfaceNode = context.surface().node();
71913       if (surfaceNode.focus) {
71914         surfaceNode.focus();
71915       }
71916       operations.forEach(function(operation) {
71917         if (operation.point)
71918           operation.point(anchorPoint);
71919       });
71920       _editMenu.anchorLoc(anchorPoint).triggerType(triggerType).operations(operations);
71921       context.map().supersurface.call(_editMenu);
71922     };
71923     ui.closeEditMenu = function() {
71924       context.map().supersurface.select(".edit-menu").remove();
71925     };
71926     var _saveLoading = select_default2(null);
71927     context.uploader().on("saveStarted.ui", function() {
71928       _saveLoading = uiLoading(context).message(_t.html("save.uploading")).blocking(true);
71929       context.container().call(_saveLoading);
71930     }).on("saveEnded.ui", function() {
71931       _saveLoading.close();
71932       _saveLoading = select_default2(null);
71933     });
71934     return ui;
71935   }
71936
71937   // modules/core/context.js
71938   function coreContext() {
71939     const dispatch10 = dispatch_default("enter", "exit", "change");
71940     let context = utilRebind({}, dispatch10, "on");
71941     let _deferred2 = /* @__PURE__ */ new Set();
71942     context.version = package_default.version;
71943     context.privacyVersion = "20201202";
71944     context.initialHashParams = window.location.hash ? utilStringQs(window.location.hash) : {};
71945     context.changeset = null;
71946     let _defaultChangesetComment = context.initialHashParams.comment;
71947     let _defaultChangesetSource = context.initialHashParams.source;
71948     let _defaultChangesetHashtags = context.initialHashParams.hashtags;
71949     context.defaultChangesetComment = function(val) {
71950       if (!arguments.length)
71951         return _defaultChangesetComment;
71952       _defaultChangesetComment = val;
71953       return context;
71954     };
71955     context.defaultChangesetSource = function(val) {
71956       if (!arguments.length)
71957         return _defaultChangesetSource;
71958       _defaultChangesetSource = val;
71959       return context;
71960     };
71961     context.defaultChangesetHashtags = function(val) {
71962       if (!arguments.length)
71963         return _defaultChangesetHashtags;
71964       _defaultChangesetHashtags = val;
71965       return context;
71966     };
71967     let _setsDocumentTitle = true;
71968     context.setsDocumentTitle = function(val) {
71969       if (!arguments.length)
71970         return _setsDocumentTitle;
71971       _setsDocumentTitle = val;
71972       return context;
71973     };
71974     let _documentTitleBase = document.title;
71975     context.documentTitleBase = function(val) {
71976       if (!arguments.length)
71977         return _documentTitleBase;
71978       _documentTitleBase = val;
71979       return context;
71980     };
71981     let _ui;
71982     context.ui = () => _ui;
71983     context.lastPointerType = () => _ui.lastPointerType();
71984     let _keybinding = utilKeybinding("context");
71985     context.keybinding = () => _keybinding;
71986     select_default2(document).call(_keybinding);
71987     let _connection = services.osm;
71988     let _history;
71989     let _validator;
71990     let _uploader;
71991     context.connection = () => _connection;
71992     context.history = () => _history;
71993     context.validator = () => _validator;
71994     context.uploader = () => _uploader;
71995     context.preauth = (options2) => {
71996       if (_connection) {
71997         _connection.switch(options2);
71998       }
71999       return context;
72000     };
72001     context.locale = function(locale2) {
72002       if (!arguments.length)
72003         return _mainLocalizer.localeCode();
72004       _mainLocalizer.preferredLocaleCodes(locale2);
72005       return context;
72006     };
72007     function afterLoad(cid, callback) {
72008       return (err, result) => {
72009         if (err) {
72010           if (err.status === 400 || err.status === 401 || err.status === 403) {
72011             if (_connection) {
72012               _connection.logout();
72013             }
72014           }
72015           if (typeof callback === "function") {
72016             callback(err);
72017           }
72018           return;
72019         } else if (_connection && _connection.getConnectionId() !== cid) {
72020           if (typeof callback === "function") {
72021             callback({ message: "Connection Switched", status: -1 });
72022           }
72023           return;
72024         } else {
72025           _history.merge(result.data, result.extent);
72026           if (typeof callback === "function") {
72027             callback(err, result);
72028           }
72029           return;
72030         }
72031       };
72032     }
72033     context.loadTiles = (projection2, callback) => {
72034       const handle = window.requestIdleCallback(() => {
72035         _deferred2.delete(handle);
72036         if (_connection && context.editableDataEnabled()) {
72037           const cid = _connection.getConnectionId();
72038           _connection.loadTiles(projection2, afterLoad(cid, callback));
72039         }
72040       });
72041       _deferred2.add(handle);
72042     };
72043     context.loadTileAtLoc = (loc, callback) => {
72044       const handle = window.requestIdleCallback(() => {
72045         _deferred2.delete(handle);
72046         if (_connection && context.editableDataEnabled()) {
72047           const cid = _connection.getConnectionId();
72048           _connection.loadTileAtLoc(loc, afterLoad(cid, callback));
72049         }
72050       });
72051       _deferred2.add(handle);
72052     };
72053     context.loadEntity = (entityID, callback) => {
72054       if (_connection) {
72055         const cid = _connection.getConnectionId();
72056         _connection.loadEntity(entityID, afterLoad(cid, callback));
72057         _connection.loadEntityRelations(entityID, afterLoad(cid, callback));
72058       }
72059     };
72060     context.zoomToEntity = (entityID, zoomTo) => {
72061       context.loadEntity(entityID, (err, result) => {
72062         if (err)
72063           return;
72064         if (zoomTo !== false) {
72065           const entity = result.data.find((e) => e.id === entityID);
72066           if (entity) {
72067             _map.zoomTo(entity);
72068           }
72069         }
72070       });
72071       _map.on("drawn.zoomToEntity", () => {
72072         if (!context.hasEntity(entityID))
72073           return;
72074         _map.on("drawn.zoomToEntity", null);
72075         context.on("enter.zoomToEntity", null);
72076         context.enter(modeSelect(context, [entityID]));
72077       });
72078       context.on("enter.zoomToEntity", () => {
72079         if (_mode.id !== "browse") {
72080           _map.on("drawn.zoomToEntity", null);
72081           context.on("enter.zoomToEntity", null);
72082         }
72083       });
72084     };
72085     let _minEditableZoom = 16;
72086     context.minEditableZoom = function(val) {
72087       if (!arguments.length)
72088         return _minEditableZoom;
72089       _minEditableZoom = val;
72090       if (_connection) {
72091         _connection.tileZoom(val);
72092       }
72093       return context;
72094     };
72095     context.maxCharsForTagKey = () => 255;
72096     context.maxCharsForTagValue = () => 255;
72097     context.maxCharsForRelationRole = () => 255;
72098     context.cleanTagKey = (val) => utilCleanOsmString(val, context.maxCharsForTagKey());
72099     context.cleanTagValue = (val) => utilCleanOsmString(val, context.maxCharsForTagValue());
72100     context.cleanRelationRole = (val) => utilCleanOsmString(val, context.maxCharsForRelationRole());
72101     let _inIntro = false;
72102     context.inIntro = function(val) {
72103       if (!arguments.length)
72104         return _inIntro;
72105       _inIntro = val;
72106       return context;
72107     };
72108     context.save = () => {
72109       if (_inIntro || context.container().select(".modal").size())
72110         return;
72111       let canSave;
72112       if (_mode && _mode.id === "save") {
72113         canSave = false;
72114         if (services.osm && services.osm.isChangesetInflight()) {
72115           _history.clearSaved();
72116           return;
72117         }
72118       } else {
72119         canSave = context.selectedIDs().every((id2) => {
72120           const entity = context.hasEntity(id2);
72121           return entity && !entity.isDegenerate();
72122         });
72123       }
72124       if (canSave) {
72125         _history.save();
72126       }
72127       if (_history.hasChanges()) {
72128         return _t("save.unsaved_changes");
72129       }
72130     };
72131     context.debouncedSave = debounce_default(context.save, 350);
72132     function withDebouncedSave(fn) {
72133       return function() {
72134         const result = fn.apply(_history, arguments);
72135         context.debouncedSave();
72136         return result;
72137       };
72138     }
72139     context.hasEntity = (id2) => _history.graph().hasEntity(id2);
72140     context.entity = (id2) => _history.graph().entity(id2);
72141     let _mode;
72142     context.mode = () => _mode;
72143     context.enter = (newMode) => {
72144       if (_mode) {
72145         _mode.exit();
72146         dispatch10.call("exit", this, _mode);
72147       }
72148       _mode = newMode;
72149       _mode.enter();
72150       dispatch10.call("enter", this, _mode);
72151     };
72152     context.selectedIDs = () => _mode && _mode.selectedIDs && _mode.selectedIDs() || [];
72153     context.activeID = () => _mode && _mode.activeID && _mode.activeID();
72154     let _selectedNoteID;
72155     context.selectedNoteID = function(noteID) {
72156       if (!arguments.length)
72157         return _selectedNoteID;
72158       _selectedNoteID = noteID;
72159       return context;
72160     };
72161     let _selectedErrorID;
72162     context.selectedErrorID = function(errorID) {
72163       if (!arguments.length)
72164         return _selectedErrorID;
72165       _selectedErrorID = errorID;
72166       return context;
72167     };
72168     context.install = (behavior) => context.surface().call(behavior);
72169     context.uninstall = (behavior) => context.surface().call(behavior.off);
72170     let _copyGraph;
72171     context.copyGraph = () => _copyGraph;
72172     let _copyIDs = [];
72173     context.copyIDs = function(val) {
72174       if (!arguments.length)
72175         return _copyIDs;
72176       _copyIDs = val;
72177       _copyGraph = _history.graph();
72178       return context;
72179     };
72180     let _copyLonLat;
72181     context.copyLonLat = function(val) {
72182       if (!arguments.length)
72183         return _copyLonLat;
72184       _copyLonLat = val;
72185       return context;
72186     };
72187     let _background;
72188     context.background = () => _background;
72189     let _features;
72190     context.features = () => _features;
72191     context.hasHiddenConnections = (id2) => {
72192       const graph = _history.graph();
72193       const entity = graph.entity(id2);
72194       return _features.hasHiddenConnections(entity, graph);
72195     };
72196     let _photos;
72197     context.photos = () => _photos;
72198     let _map;
72199     context.map = () => _map;
72200     context.layers = () => _map.layers();
72201     context.surface = () => _map.surface;
72202     context.editableDataEnabled = () => _map.editableDataEnabled();
72203     context.surfaceRect = () => _map.surface.node().getBoundingClientRect();
72204     context.editable = () => {
72205       const mode = context.mode();
72206       if (!mode || mode.id === "save")
72207         return false;
72208       return _map.editableDataEnabled();
72209     };
72210     let _debugFlags = {
72211       tile: false,
72212       // tile boundaries
72213       collision: false,
72214       // label collision bounding boxes
72215       imagery: false,
72216       // imagery bounding polygons
72217       target: false,
72218       // touch targets
72219       downloaded: false
72220       // downloaded data from osm
72221     };
72222     context.debugFlags = () => _debugFlags;
72223     context.getDebug = (flag) => flag && _debugFlags[flag];
72224     context.setDebug = function(flag, val) {
72225       if (arguments.length === 1)
72226         val = true;
72227       _debugFlags[flag] = val;
72228       dispatch10.call("change");
72229       return context;
72230     };
72231     let _container = select_default2(null);
72232     context.container = function(val) {
72233       if (!arguments.length)
72234         return _container;
72235       _container = val;
72236       _container.classed("ideditor", true);
72237       return context;
72238     };
72239     context.containerNode = function(val) {
72240       if (!arguments.length)
72241         return context.container().node();
72242       context.container(select_default2(val));
72243       return context;
72244     };
72245     let _embed;
72246     context.embed = function(val) {
72247       if (!arguments.length)
72248         return _embed;
72249       _embed = val;
72250       return context;
72251     };
72252     let _assetPath = "";
72253     context.assetPath = function(val) {
72254       if (!arguments.length)
72255         return _assetPath;
72256       _assetPath = val;
72257       _mainFileFetcher.assetPath(val);
72258       return context;
72259     };
72260     let _assetMap = {};
72261     context.assetMap = function(val) {
72262       if (!arguments.length)
72263         return _assetMap;
72264       _assetMap = val;
72265       _mainFileFetcher.assetMap(val);
72266       return context;
72267     };
72268     context.asset = (val) => {
72269       if (/^http(s)?:\/\//i.test(val))
72270         return val;
72271       const filename = _assetPath + val;
72272       return _assetMap[filename] || filename;
72273     };
72274     context.imagePath = (val) => context.asset(`img/${val}`);
72275     context.reset = context.flush = () => {
72276       context.debouncedSave.cancel();
72277       Array.from(_deferred2).forEach((handle) => {
72278         window.cancelIdleCallback(handle);
72279         _deferred2.delete(handle);
72280       });
72281       Object.values(services).forEach((service) => {
72282         if (service && typeof service.reset === "function") {
72283           service.reset(context);
72284         }
72285       });
72286       context.changeset = null;
72287       _validator.reset();
72288       _features.reset();
72289       _history.reset();
72290       _uploader.reset();
72291       context.container().select(".inspector-wrap *").remove();
72292       return context;
72293     };
72294     context.projection = geoRawMercator();
72295     context.curtainProjection = geoRawMercator();
72296     context.init = () => {
72297       instantiateInternal();
72298       initializeDependents();
72299       return context;
72300       function instantiateInternal() {
72301         _history = coreHistory(context);
72302         context.graph = _history.graph;
72303         context.pauseChangeDispatch = _history.pauseChangeDispatch;
72304         context.resumeChangeDispatch = _history.resumeChangeDispatch;
72305         context.perform = withDebouncedSave(_history.perform);
72306         context.replace = withDebouncedSave(_history.replace);
72307         context.pop = withDebouncedSave(_history.pop);
72308         context.overwrite = withDebouncedSave(_history.overwrite);
72309         context.undo = withDebouncedSave(_history.undo);
72310         context.redo = withDebouncedSave(_history.redo);
72311         _validator = coreValidator(context);
72312         _uploader = coreUploader(context);
72313         _background = rendererBackground(context);
72314         _features = rendererFeatures(context);
72315         _map = rendererMap(context);
72316         _photos = rendererPhotos(context);
72317         _ui = uiInit(context);
72318       }
72319       function initializeDependents() {
72320         if (context.initialHashParams.presets) {
72321           _mainPresetIndex.addablePresetIDs(new Set(context.initialHashParams.presets.split(",")));
72322         }
72323         if (context.initialHashParams.locale) {
72324           _mainLocalizer.preferredLocaleCodes(context.initialHashParams.locale);
72325         }
72326         _mainLocalizer.ensureLoaded();
72327         _mainPresetIndex.ensureLoaded();
72328         _background.ensureLoaded();
72329         Object.values(services).forEach((service) => {
72330           if (service && typeof service.init === "function") {
72331             service.init();
72332           }
72333         });
72334         _map.init();
72335         _validator.init();
72336         _features.init();
72337         if (services.maprules && context.initialHashParams.maprules) {
72338           json_default(context.initialHashParams.maprules).then((mapcss) => {
72339             services.maprules.init();
72340             mapcss.forEach((mapcssSelector) => services.maprules.addRule(mapcssSelector));
72341           }).catch(() => {
72342           });
72343         }
72344         if (!context.container().empty()) {
72345           _ui.ensureLoaded().then(() => {
72346             _background.init();
72347             _photos.init();
72348           });
72349         }
72350       }
72351     };
72352     return context;
72353   }
72354
72355   // modules/services/nominatim.js
72356   var apibase = nominatimApiUrl;
72357   var _inflight = {};
72358   var _nominatimCache;
72359   var nominatim_default = {
72360     init: function() {
72361       _inflight = {};
72362       _nominatimCache = new import_rbush7.default();
72363     },
72364     reset: function() {
72365       Object.values(_inflight).forEach(function(controller) {
72366         controller.abort();
72367       });
72368       _inflight = {};
72369       _nominatimCache = new import_rbush7.default();
72370     },
72371     countryCode: function(location, callback) {
72372       this.reverse(location, function(err, result) {
72373         if (err) {
72374           return callback(err);
72375         } else if (result.address) {
72376           return callback(null, result.address.country_code);
72377         } else {
72378           return callback("Unable to geocode", null);
72379         }
72380       });
72381     },
72382     reverse: function(loc, callback) {
72383       var cached = _nominatimCache.search(
72384         { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
72385       );
72386       if (cached.length > 0) {
72387         if (callback)
72388           callback(null, cached[0].data);
72389         return;
72390       }
72391       var params = { zoom: 13, format: "json", addressdetails: 1, lat: loc[1], lon: loc[0] };
72392       var url = apibase + "reverse?" + utilQsString(params);
72393       if (_inflight[url])
72394         return;
72395       var controller = new AbortController();
72396       _inflight[url] = controller;
72397       json_default(url, {
72398         signal: controller.signal,
72399         headers: {
72400           "Accept-Language": _mainLocalizer.localeCodes().join(",")
72401         }
72402       }).then(function(result) {
72403         delete _inflight[url];
72404         if (result && result.error) {
72405           throw new Error(result.error);
72406         }
72407         var extent = geoExtent(loc).padByMeters(200);
72408         _nominatimCache.insert(Object.assign(extent.bbox(), { data: result }));
72409         if (callback)
72410           callback(null, result);
72411       }).catch(function(err) {
72412         delete _inflight[url];
72413         if (err.name === "AbortError")
72414           return;
72415         if (callback)
72416           callback(err.message);
72417       });
72418     },
72419     search: function(val, callback) {
72420       var searchVal = encodeURIComponent(val);
72421       var url = apibase + "search/" + searchVal + "?limit=10&format=json";
72422       if (_inflight[url])
72423         return;
72424       var controller = new AbortController();
72425       _inflight[url] = controller;
72426       json_default(url, {
72427         signal: controller.signal,
72428         headers: {
72429           "Accept-Language": _mainLocalizer.localeCodes().join(",")
72430         }
72431       }).then(function(result) {
72432         delete _inflight[url];
72433         if (result && result.error) {
72434           throw new Error(result.error);
72435         }
72436         if (callback)
72437           callback(null, result);
72438       }).catch(function(err) {
72439         delete _inflight[url];
72440         if (err.name === "AbortError")
72441           return;
72442         if (callback)
72443           callback(err.message);
72444       });
72445     }
72446   };
72447
72448   // node_modules/name-suggestion-index/lib/matcher.js
72449   var import_which_polygon4 = __toESM(require_which_polygon(), 1);
72450
72451   // node_modules/name-suggestion-index/lib/simplify.js
72452   var import_diacritics3 = __toESM(require_diacritics(), 1);
72453   function simplify2(str2) {
72454     if (typeof str2 !== "string")
72455       return "";
72456     return import_diacritics3.default.remove(
72457       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()
72458     );
72459   }
72460
72461   // node_modules/name-suggestion-index/config/matchGroups.json
72462   var matchGroups_default = {
72463     matchGroups: {
72464       adult_gaming_centre: [
72465         "amenity/casino",
72466         "amenity/gambling",
72467         "leisure/adult_gaming_centre"
72468       ],
72469       beauty: [
72470         "shop/beauty",
72471         "shop/hairdresser_supply"
72472       ],
72473       bed: [
72474         "shop/bed",
72475         "shop/furniture"
72476       ],
72477       beverages: [
72478         "shop/alcohol",
72479         "shop/beer",
72480         "shop/beverages",
72481         "shop/kiosk",
72482         "shop/wine"
72483       ],
72484       camping: [
72485         "tourism/camp_site",
72486         "tourism/caravan_site"
72487       ],
72488       car_parts: [
72489         "shop/car_parts",
72490         "shop/car_repair",
72491         "shop/tires",
72492         "shop/tyres"
72493       ],
72494       clinic: [
72495         "amenity/clinic",
72496         "amenity/doctors",
72497         "healthcare/clinic",
72498         "healthcare/laboratory",
72499         "healthcare/physiotherapist",
72500         "healthcare/sample_collection",
72501         "healthcare/dialysis"
72502       ],
72503       convenience: [
72504         "shop/beauty",
72505         "shop/chemist",
72506         "shop/convenience",
72507         "shop/cosmetics",
72508         "shop/grocery",
72509         "shop/kiosk",
72510         "shop/newsagent",
72511         "shop/perfumery"
72512       ],
72513       coworking: [
72514         "amenity/coworking_space",
72515         "office/coworking",
72516         "office/coworking_space"
72517       ],
72518       dentist: [
72519         "amenity/dentist",
72520         "amenity/doctors",
72521         "healthcare/dentist"
72522       ],
72523       electronics: [
72524         "office/telecommunication",
72525         "shop/computer",
72526         "shop/electronics",
72527         "shop/hifi",
72528         "shop/kiosk",
72529         "shop/mobile",
72530         "shop/mobile_phone",
72531         "shop/telecommunication"
72532       ],
72533       fabric: [
72534         "shop/fabric",
72535         "shop/haberdashery",
72536         "shop/sewing"
72537       ],
72538       fashion: [
72539         "shop/accessories",
72540         "shop/bag",
72541         "shop/boutique",
72542         "shop/clothes",
72543         "shop/department_store",
72544         "shop/fashion",
72545         "shop/fashion_accessories",
72546         "shop/sports",
72547         "shop/shoes"
72548       ],
72549       financial: [
72550         "amenity/bank",
72551         "office/accountant",
72552         "office/financial",
72553         "office/financial_advisor",
72554         "office/tax_advisor",
72555         "shop/tax"
72556       ],
72557       fitness: [
72558         "leisure/fitness_centre",
72559         "leisure/fitness_center",
72560         "leisure/sports_centre",
72561         "leisure/sports_center"
72562       ],
72563       food: [
72564         "amenity/bar",
72565         "amenity/cafe",
72566         "amenity/fast_food",
72567         "amenity/ice_cream",
72568         "amenity/pub",
72569         "amenity/restaurant",
72570         "shop/bakery",
72571         "shop/candy",
72572         "shop/chocolate",
72573         "shop/coffee",
72574         "shop/confectionary",
72575         "shop/confectionery",
72576         "shop/food",
72577         "shop/kiosk",
72578         "shop/ice_cream",
72579         "shop/pastry",
72580         "shop/tea"
72581       ],
72582       fuel: [
72583         "amenity/fuel",
72584         "shop/gas",
72585         "shop/convenience;gas",
72586         "shop/gas;convenience"
72587       ],
72588       gift: [
72589         "shop/gift",
72590         "shop/card",
72591         "shop/cards",
72592         "shop/kiosk",
72593         "shop/stationery"
72594       ],
72595       hardware: [
72596         "shop/bathroom_furnishing",
72597         "shop/carpet",
72598         "shop/diy",
72599         "shop/doityourself",
72600         "shop/doors",
72601         "shop/electrical",
72602         "shop/flooring",
72603         "shop/hardware",
72604         "shop/hardware_store",
72605         "shop/power_tools",
72606         "shop/tool_hire",
72607         "shop/tools",
72608         "shop/trade"
72609       ],
72610       health_food: [
72611         "shop/health",
72612         "shop/health_food",
72613         "shop/herbalist",
72614         "shop/nutrition_supplements"
72615       ],
72616       hobby: [
72617         "shop/electronics",
72618         "shop/hobby",
72619         "shop/books",
72620         "shop/games",
72621         "shop/collector",
72622         "shop/toys",
72623         "shop/model",
72624         "shop/video_games",
72625         "shop/anime"
72626       ],
72627       hospital: [
72628         "amenity/doctors",
72629         "amenity/hospital",
72630         "healthcare/hospital"
72631       ],
72632       houseware: [
72633         "shop/houseware",
72634         "shop/interior_decoration"
72635       ],
72636       lifeboat_station: [
72637         "amenity/lifeboat_station",
72638         "emergency/lifeboat_station",
72639         "emergency/marine_rescue"
72640       ],
72641       lodging: [
72642         "tourism/hotel",
72643         "tourism/motel"
72644       ],
72645       money_transfer: [
72646         "amenity/money_transfer",
72647         "shop/money_transfer"
72648       ],
72649       office_supplies: [
72650         "shop/office_supplies",
72651         "shop/stationary",
72652         "shop/stationery"
72653       ],
72654       outdoor: [
72655         "shop/clothes",
72656         "shop/outdoor",
72657         "shop/sports"
72658       ],
72659       parcel_locker: [
72660         "amenity/parcel_locker",
72661         "amenity/vending_machine"
72662       ],
72663       pharmacy: [
72664         "amenity/doctors",
72665         "amenity/pharmacy",
72666         "healthcare/pharmacy"
72667       ],
72668       playground: [
72669         "amenity/theme_park",
72670         "leisure/amusement_arcade",
72671         "leisure/playground"
72672       ],
72673       rental: [
72674         "amenity/bicycle_rental",
72675         "amenity/boat_rental",
72676         "amenity/car_rental",
72677         "amenity/truck_rental",
72678         "amenity/vehicle_rental",
72679         "shop/kiosk",
72680         "shop/rental"
72681       ],
72682       school: [
72683         "amenity/childcare",
72684         "amenity/college",
72685         "amenity/kindergarten",
72686         "amenity/language_school",
72687         "amenity/prep_school",
72688         "amenity/school",
72689         "amenity/university"
72690       ],
72691       storage: [
72692         "shop/storage_units",
72693         "shop/storage_rental"
72694       ],
72695       substation: [
72696         "power/station",
72697         "power/substation",
72698         "power/sub_station"
72699       ],
72700       supermarket: [
72701         "shop/food",
72702         "shop/frozen_food",
72703         "shop/greengrocer",
72704         "shop/grocery",
72705         "shop/supermarket",
72706         "shop/wholesale"
72707       ],
72708       variety_store: [
72709         "shop/variety_store",
72710         "shop/discount",
72711         "shop/convenience"
72712       ],
72713       vending: [
72714         "amenity/vending_machine",
72715         "shop/kiosk",
72716         "shop/vending_machine"
72717       ],
72718       weight_loss: [
72719         "amenity/clinic",
72720         "amenity/doctors",
72721         "amenity/weight_clinic",
72722         "healthcare/counselling",
72723         "leisure/fitness_centre",
72724         "office/therapist",
72725         "shop/beauty",
72726         "shop/diet",
72727         "shop/food",
72728         "shop/health_food",
72729         "shop/herbalist",
72730         "shop/nutrition",
72731         "shop/nutrition_supplements",
72732         "shop/weight_loss"
72733       ],
72734       wholesale: [
72735         "shop/wholesale",
72736         "shop/supermarket",
72737         "shop/department_store"
72738       ]
72739     }
72740   };
72741
72742   // node_modules/name-suggestion-index/config/genericWords.json
72743   var genericWords_default = {
72744     genericWords: [
72745       "^(barn|bazaa?r|bench|bou?tique|building|casa|church)$",
72746       "^(baseball|basketball|football|soccer|softball|tennis(halle)?)\\s?(field|court)?$",
72747       "^(club|green|out|ware)\\s?house$",
72748       "^(driveway|el \xE1rbol|fountain|generic|golf|government|graveyard)$",
72749       "^(fixme|n\\s?\\/?\\s?a|name|no\\s?name|none|null|temporary|test|unknown)$",
72750       "^(hofladen|librairie|magazine?|maison)$",
72751       "^(mobile home|skate)?\\s?park$",
72752       "^(obuwie|pond|pool|sale|shops?|sklep|stores?)$",
72753       "^\\?+$",
72754       "^private$",
72755       "^tattoo( studio)?$",
72756       "^windmill$",
72757       "^\u0446\u0435\u0440\u043A\u043E\u0432\u043D\u0430\u044F( \u043B\u0430\u0432\u043A\u0430)?$"
72758     ]
72759   };
72760
72761   // node_modules/name-suggestion-index/config/trees.json
72762   var trees_default = {
72763     trees: {
72764       brands: {
72765         emoji: "\u{1F354}",
72766         mainTag: "brand:wikidata",
72767         sourceTags: ["brand", "name"],
72768         nameTags: {
72769           primary: "^(name|name:\\w+)$",
72770           alternate: "^(brand|brand:\\w+|operator|operator:\\w+|\\w+_name|\\w+_name:\\w+)$"
72771         }
72772       },
72773       flags: {
72774         emoji: "\u{1F6A9}",
72775         mainTag: "flag:wikidata",
72776         nameTags: {
72777           primary: "^(flag:name|flag:name:\\w+)$",
72778           alternate: "^(country|country:\\w+|flag|flag:\\w+|subject|subject:\\w+)$"
72779         }
72780       },
72781       operators: {
72782         emoji: "\u{1F4BC}",
72783         mainTag: "operator:wikidata",
72784         sourceTags: ["operator"],
72785         nameTags: {
72786           primary: "^(name|name:\\w+|operator|operator:\\w+)$",
72787           alternate: "^(brand|brand:\\w+|\\w+_name|\\w+_name:\\w+)$"
72788         }
72789       },
72790       transit: {
72791         emoji: "\u{1F687}",
72792         mainTag: "network:wikidata",
72793         sourceTags: ["network"],
72794         nameTags: {
72795           primary: "^network$",
72796           alternate: "^(operator|operator:\\w+|network:\\w+|\\w+_name|\\w+_name:\\w+)$"
72797         }
72798       }
72799     }
72800   };
72801
72802   // node_modules/name-suggestion-index/lib/matcher.js
72803   var matchGroups = matchGroups_default.matchGroups;
72804   var trees = trees_default.trees;
72805   var Matcher = class {
72806     //
72807     // `constructor`
72808     // initialize the genericWords regexes
72809     constructor() {
72810       this.matchIndex = void 0;
72811       this.genericWords = /* @__PURE__ */ new Map();
72812       (genericWords_default.genericWords || []).forEach((s) => this.genericWords.set(s, new RegExp(s, "i")));
72813       this.itemLocation = void 0;
72814       this.locationSets = void 0;
72815       this.locationIndex = void 0;
72816       this.warnings = [];
72817     }
72818     //
72819     // `buildMatchIndex()`
72820     // Call this to prepare the matcher for use
72821     //
72822     // `data` needs to be an Object indexed on a 'tree/key/value' path.
72823     // (e.g. cache filled by `fileTree.read` or data found in `dist/nsi.json`)
72824     // {
72825     //    'brands/amenity/bank': { properties: {}, items: [ {}, {}, … ] },
72826     //    'brands/amenity/bar':  { properties: {}, items: [ {}, {}, … ] },
72827     //    …
72828     // }
72829     //
72830     buildMatchIndex(data) {
72831       const that = this;
72832       if (that.matchIndex)
72833         return;
72834       that.matchIndex = /* @__PURE__ */ new Map();
72835       const seenTree = /* @__PURE__ */ new Map();
72836       Object.keys(data).forEach((tkv) => {
72837         const category = data[tkv];
72838         const parts = tkv.split("/", 3);
72839         const t = parts[0];
72840         const k = parts[1];
72841         const v = parts[2];
72842         const thiskv = `${k}/${v}`;
72843         const tree = trees[t];
72844         let branch = that.matchIndex.get(thiskv);
72845         if (!branch) {
72846           branch = {
72847             primary: /* @__PURE__ */ new Map(),
72848             alternate: /* @__PURE__ */ new Map(),
72849             excludeGeneric: /* @__PURE__ */ new Map(),
72850             excludeNamed: /* @__PURE__ */ new Map()
72851           };
72852           that.matchIndex.set(thiskv, branch);
72853         }
72854         const properties = category.properties || {};
72855         const exclude = properties.exclude || {};
72856         (exclude.generic || []).forEach((s) => branch.excludeGeneric.set(s, new RegExp(s, "i")));
72857         (exclude.named || []).forEach((s) => branch.excludeNamed.set(s, new RegExp(s, "i")));
72858         const excludeRegexes = [...branch.excludeGeneric.values(), ...branch.excludeNamed.values()];
72859         let items = category.items;
72860         if (!Array.isArray(items) || !items.length)
72861           return;
72862         const primaryName = new RegExp(tree.nameTags.primary, "i");
72863         const alternateName = new RegExp(tree.nameTags.alternate, "i");
72864         const notName = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i;
72865         const skipGenericKV = skipGenericKVMatches(t, k, v);
72866         const genericKV = /* @__PURE__ */ new Set([`${k}/yes`, `building/yes`]);
72867         const matchGroupKV = /* @__PURE__ */ new Set();
72868         Object.values(matchGroups).forEach((matchGroup) => {
72869           const inGroup = matchGroup.some((otherkv) => otherkv === thiskv);
72870           if (!inGroup)
72871             return;
72872           matchGroup.forEach((otherkv) => {
72873             if (otherkv === thiskv)
72874               return;
72875             matchGroupKV.add(otherkv);
72876             const otherk = otherkv.split("/", 2)[0];
72877             genericKV.add(`${otherk}/yes`);
72878           });
72879         });
72880         items.forEach((item) => {
72881           if (!item.id)
72882             return;
72883           if (Array.isArray(item.matchTags) && item.matchTags.length) {
72884             item.matchTags = item.matchTags.filter((matchTag) => !matchGroupKV.has(matchTag) && !genericKV.has(matchTag));
72885             if (!item.matchTags.length)
72886               delete item.matchTags;
72887           }
72888           let kvTags = [`${thiskv}`].concat(item.matchTags || []);
72889           if (!skipGenericKV) {
72890             kvTags = kvTags.concat(Array.from(genericKV));
72891           }
72892           Object.keys(item.tags).forEach((osmkey) => {
72893             if (notName.test(osmkey))
72894               return;
72895             const osmvalue = item.tags[osmkey];
72896             if (!osmvalue || excludeRegexes.some((regex) => regex.test(osmvalue)))
72897               return;
72898             if (primaryName.test(osmkey)) {
72899               kvTags.forEach((kv) => insertName("primary", t, kv, simplify2(osmvalue), item.id));
72900             } else if (alternateName.test(osmkey)) {
72901               kvTags.forEach((kv) => insertName("alternate", t, kv, simplify2(osmvalue), item.id));
72902             }
72903           });
72904           let keepMatchNames = /* @__PURE__ */ new Set();
72905           (item.matchNames || []).forEach((matchName) => {
72906             const nsimple = simplify2(matchName);
72907             kvTags.forEach((kv) => {
72908               const branch2 = that.matchIndex.get(kv);
72909               const primaryLeaf = branch2 && branch2.primary.get(nsimple);
72910               const alternateLeaf = branch2 && branch2.alternate.get(nsimple);
72911               const inPrimary = primaryLeaf && primaryLeaf.has(item.id);
72912               const inAlternate = alternateLeaf && alternateLeaf.has(item.id);
72913               if (!inPrimary && !inAlternate) {
72914                 insertName("alternate", t, kv, nsimple, item.id);
72915                 keepMatchNames.add(matchName);
72916               }
72917             });
72918           });
72919           if (keepMatchNames.size) {
72920             item.matchNames = Array.from(keepMatchNames);
72921           } else {
72922             delete item.matchNames;
72923           }
72924         });
72925       });
72926       function insertName(which, t, kv, nsimple, itemID) {
72927         if (!nsimple) {
72928           that.warnings.push(`Warning: skipping empty ${which} name for item ${t}/${kv}: ${itemID}`);
72929           return;
72930         }
72931         let branch = that.matchIndex.get(kv);
72932         if (!branch) {
72933           branch = {
72934             primary: /* @__PURE__ */ new Map(),
72935             alternate: /* @__PURE__ */ new Map(),
72936             excludeGeneric: /* @__PURE__ */ new Map(),
72937             excludeNamed: /* @__PURE__ */ new Map()
72938           };
72939           that.matchIndex.set(kv, branch);
72940         }
72941         let leaf = branch[which].get(nsimple);
72942         if (!leaf) {
72943           leaf = /* @__PURE__ */ new Set();
72944           branch[which].set(nsimple, leaf);
72945         }
72946         leaf.add(itemID);
72947         if (!/yes$/.test(kv)) {
72948           const kvnsimple = `${kv}/${nsimple}`;
72949           const existing = seenTree.get(kvnsimple);
72950           if (existing && existing !== t) {
72951             const items = Array.from(leaf);
72952             that.warnings.push(`Duplicate cache key "${kvnsimple}" in trees "${t}" and "${existing}", check items: ${items}`);
72953             return;
72954           }
72955           seenTree.set(kvnsimple, t);
72956         }
72957       }
72958       function skipGenericKVMatches(t, k, v) {
72959         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";
72960       }
72961     }
72962     //
72963     // `buildLocationIndex()`
72964     // Call this to prepare a which-polygon location index.
72965     // This *resolves* all the locationSets into GeoJSON, which takes some time.
72966     // You can skip this step if you don't care about matching within a location.
72967     //
72968     // `data` needs to be an Object indexed on a 'tree/key/value' path.
72969     // (e.g. cache filled by `fileTree.read` or data found in `dist/nsi.json`)
72970     // {
72971     //    'brands/amenity/bank': { properties: {}, items: [ {}, {}, … ] },
72972     //    'brands/amenity/bar':  { properties: {}, items: [ {}, {}, … ] },
72973     //    …
72974     // }
72975     //
72976     buildLocationIndex(data, loco) {
72977       const that = this;
72978       if (that.locationIndex)
72979         return;
72980       that.itemLocation = /* @__PURE__ */ new Map();
72981       that.locationSets = /* @__PURE__ */ new Map();
72982       Object.keys(data).forEach((tkv) => {
72983         const items = data[tkv].items;
72984         if (!Array.isArray(items) || !items.length)
72985           return;
72986         items.forEach((item) => {
72987           if (that.itemLocation.has(item.id))
72988             return;
72989           let resolved;
72990           try {
72991             resolved = loco.resolveLocationSet(item.locationSet);
72992           } catch (err) {
72993             console.warn(`buildLocationIndex: ${err.message}`);
72994           }
72995           if (!resolved || !resolved.id)
72996             return;
72997           that.itemLocation.set(item.id, resolved.id);
72998           if (that.locationSets.has(resolved.id))
72999             return;
73000           let feature3 = _cloneDeep2(resolved.feature);
73001           feature3.id = resolved.id;
73002           feature3.properties.id = resolved.id;
73003           if (!feature3.geometry.coordinates.length || !feature3.properties.area) {
73004             console.warn(`buildLocationIndex: locationSet ${resolved.id} for ${item.id} resolves to an empty feature:`);
73005             console.warn(JSON.stringify(feature3));
73006             return;
73007           }
73008           that.locationSets.set(resolved.id, feature3);
73009         });
73010       });
73011       that.locationIndex = (0, import_which_polygon4.default)({ type: "FeatureCollection", features: [...that.locationSets.values()] });
73012       function _cloneDeep2(obj) {
73013         return JSON.parse(JSON.stringify(obj));
73014       }
73015     }
73016     //
73017     // `match()`
73018     // Pass parts and return an Array of matches.
73019     // `k` - key
73020     // `v` - value
73021     // `n` - namelike
73022     // `loc` - optional - [lon,lat] location to search
73023     //
73024     // 1. If the [k,v,n] tuple matches a canonical item…
73025     // Return an Array of match results.
73026     // Each result will include the area in km² that the item is valid.
73027     //
73028     // Order of results:
73029     // Primary ordering will be on the "match" column:
73030     //   "primary" - where the query matches the `name` tag, followed by
73031     //   "alternate" - where the query matches an alternate name tag (e.g. short_name, brand, operator, etc)
73032     // Secondary ordering will be on the "area" column:
73033     //   "area descending" if no location was provided, (worldwide before local)
73034     //   "area ascending" if location was provided (local before worldwide)
73035     //
73036     // [
73037     //   { match: 'primary',   itemID: String,  area: Number,  kv: String,  nsimple: String },
73038     //   { match: 'primary',   itemID: String,  area: Number,  kv: String,  nsimple: String },
73039     //   { match: 'alternate', itemID: String,  area: Number,  kv: String,  nsimple: String },
73040     //   { match: 'alternate', itemID: String,  area: Number,  kv: String,  nsimple: String },
73041     //   …
73042     // ]
73043     //
73044     // -or-
73045     //
73046     // 2. If the [k,v,n] tuple matches an exclude pattern…
73047     // Return an Array with a single exclude result, either
73048     //
73049     // [ { match: 'excludeGeneric', pattern: String,  kv: String } ]  // "generic" e.g. "Food Court"
73050     //   or
73051     // [ { match: 'excludeNamed', pattern: String,  kv: String } ]    // "named", e.g. "Kebabai"
73052     //
73053     // About results
73054     //   "generic" - a generic word that is probably not really a name.
73055     //     For these, iD should warn the user "Hey don't put 'food court' in the name tag".
73056     //   "named" - a real name like "Kebabai" that is just common, but not a brand.
73057     //     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.
73058     //
73059     // -or-
73060     //
73061     // 3. If the [k,v,n] tuple matches nothing of any kind, return `null`
73062     //
73063     //
73064     match(k, v, n2, loc) {
73065       const that = this;
73066       if (!that.matchIndex) {
73067         throw new Error("match:  matchIndex not built.");
73068       }
73069       let matchLocations;
73070       if (Array.isArray(loc) && that.locationIndex) {
73071         matchLocations = that.locationIndex([loc[0], loc[1], loc[0], loc[1]], true);
73072       }
73073       const nsimple = simplify2(n2);
73074       let seen = /* @__PURE__ */ new Set();
73075       let results = [];
73076       gatherResults("primary");
73077       gatherResults("alternate");
73078       if (results.length)
73079         return results;
73080       gatherResults("exclude");
73081       return results.length ? results : null;
73082       function gatherResults(which) {
73083         const kv = `${k}/${v}`;
73084         let didMatch = tryMatch(which, kv);
73085         if (didMatch)
73086           return;
73087         for (let mg in matchGroups) {
73088           const matchGroup = matchGroups[mg];
73089           const inGroup = matchGroup.some((otherkv) => otherkv === kv);
73090           if (!inGroup)
73091             continue;
73092           for (let i2 = 0; i2 < matchGroup.length; i2++) {
73093             const otherkv = matchGroup[i2];
73094             if (otherkv === kv)
73095               continue;
73096             didMatch = tryMatch(which, otherkv);
73097             if (didMatch)
73098               return;
73099           }
73100         }
73101         if (which === "exclude") {
73102           const regex = [...that.genericWords.values()].find((regex2) => regex2.test(n2));
73103           if (regex) {
73104             results.push({ match: "excludeGeneric", pattern: String(regex) });
73105             return;
73106           }
73107         }
73108       }
73109       function tryMatch(which, kv) {
73110         const branch = that.matchIndex.get(kv);
73111         if (!branch)
73112           return;
73113         if (which === "exclude") {
73114           let regex = [...branch.excludeNamed.values()].find((regex2) => regex2.test(n2));
73115           if (regex) {
73116             results.push({ match: "excludeNamed", pattern: String(regex), kv });
73117             return;
73118           }
73119           regex = [...branch.excludeGeneric.values()].find((regex2) => regex2.test(n2));
73120           if (regex) {
73121             results.push({ match: "excludeGeneric", pattern: String(regex), kv });
73122             return;
73123           }
73124           return;
73125         }
73126         const leaf = branch[which].get(nsimple);
73127         if (!leaf || !leaf.size)
73128           return;
73129         let hits = Array.from(leaf).map((itemID) => {
73130           let area = Infinity;
73131           if (that.itemLocation && that.locationSets) {
73132             const location = that.locationSets.get(that.itemLocation.get(itemID));
73133             area = location && location.properties.area || Infinity;
73134           }
73135           return { match: which, itemID, area, kv, nsimple };
73136         });
73137         let sortFn = byAreaDescending;
73138         if (matchLocations) {
73139           hits = hits.filter(isValidLocation);
73140           sortFn = byAreaAscending;
73141         }
73142         if (!hits.length)
73143           return;
73144         hits.sort(sortFn).forEach((hit) => {
73145           if (seen.has(hit.itemID))
73146             return;
73147           seen.add(hit.itemID);
73148           results.push(hit);
73149         });
73150         return true;
73151         function isValidLocation(hit) {
73152           if (!that.itemLocation)
73153             return true;
73154           return matchLocations.find((props) => props.id === that.itemLocation.get(hit.itemID));
73155         }
73156         function byAreaAscending(hitA, hitB) {
73157           return hitA.area - hitB.area;
73158         }
73159         function byAreaDescending(hitA, hitB) {
73160           return hitB.area - hitA.area;
73161         }
73162       }
73163     }
73164     //
73165     // `getWarnings()`
73166     // Return any warnings discovered when buiding the index.
73167     // (currently this does nothing)
73168     //
73169     getWarnings() {
73170       return this.warnings;
73171     }
73172   };
73173
73174   // modules/services/nsi.js
73175   var import_vparse2 = __toESM(require_vparse());
73176   var _nsiStatus = "loading";
73177   var _nsi = {};
73178   var buildingPreset = {
73179     "building/commercial": true,
73180     "building/government": true,
73181     "building/hotel": true,
73182     "building/retail": true,
73183     "building/office": true,
73184     "building/supermarket": true,
73185     "building/yes": true
73186   };
73187   var notNames = /:(colou?r|type|forward|backward|left|right|etymology|pronunciation|wikipedia)$/i;
73188   var notBranches = /(coop|express|wireless|factory|outlet)/i;
73189   function setNsiSources() {
73190     const nsiVersion = package_default.dependencies["name-suggestion-index"] || package_default.devDependencies["name-suggestion-index"];
73191     const v = (0, import_vparse2.default)(nsiVersion);
73192     const vMinor = `${v.major}.${v.minor}`;
73193     const cdn = nsiCdnUrl.replace("{version}", vMinor);
73194     const sources = {
73195       "nsi_data": cdn + "dist/nsi.min.json",
73196       "nsi_dissolved": cdn + "dist/dissolved.min.json",
73197       "nsi_features": cdn + "dist/featureCollection.min.json",
73198       "nsi_generics": cdn + "dist/genericWords.min.json",
73199       "nsi_presets": cdn + "dist/presets/nsi-id-presets.min.json",
73200       "nsi_replacements": cdn + "dist/replacements.min.json",
73201       "nsi_trees": cdn + "dist/trees.min.json"
73202     };
73203     let fileMap = _mainFileFetcher.fileMap();
73204     for (const k in sources) {
73205       if (!fileMap[k])
73206         fileMap[k] = sources[k];
73207     }
73208   }
73209   function loadNsiPresets() {
73210     return Promise.all([
73211       _mainFileFetcher.get("nsi_presets"),
73212       _mainFileFetcher.get("nsi_features")
73213     ]).then((vals) => {
73214       Object.values(vals[0].presets).forEach((preset) => preset.suggestion = true);
73215       _mainPresetIndex.merge({
73216         presets: vals[0].presets,
73217         featureCollection: vals[1]
73218       });
73219     });
73220   }
73221   function loadNsiData() {
73222     return Promise.all([
73223       _mainFileFetcher.get("nsi_data"),
73224       _mainFileFetcher.get("nsi_dissolved"),
73225       _mainFileFetcher.get("nsi_replacements"),
73226       _mainFileFetcher.get("nsi_trees")
73227     ]).then((vals) => {
73228       _nsi = {
73229         data: vals[0].nsi,
73230         // the raw name-suggestion-index data
73231         dissolved: vals[1].dissolved,
73232         // list of dissolved items
73233         replacements: vals[2].replacements,
73234         // trivial old->new qid replacements
73235         trees: vals[3].trees,
73236         // metadata about trees, main tags
73237         kvt: /* @__PURE__ */ new Map(),
73238         // Map (k -> Map (v -> t) )
73239         qids: /* @__PURE__ */ new Map(),
73240         // Map (wd/wp tag values -> qids)
73241         ids: /* @__PURE__ */ new Map()
73242         // Map (id -> NSI item)
73243       };
73244       const matcher = _nsi.matcher = new Matcher();
73245       matcher.buildMatchIndex(_nsi.data);
73246       matcher.itemLocation = /* @__PURE__ */ new Map();
73247       matcher.locationSets = /* @__PURE__ */ new Map();
73248       Object.keys(_nsi.data).forEach((tkv) => {
73249         const items = _nsi.data[tkv].items;
73250         if (!Array.isArray(items) || !items.length)
73251           return;
73252         items.forEach((item) => {
73253           if (matcher.itemLocation.has(item.id))
73254             return;
73255           const locationSetID = _sharedLocationManager.locationSetID(item.locationSet);
73256           matcher.itemLocation.set(item.id, locationSetID);
73257           if (matcher.locationSets.has(locationSetID))
73258             return;
73259           const fakeFeature = { id: locationSetID, properties: { id: locationSetID, area: 1 } };
73260           matcher.locationSets.set(locationSetID, fakeFeature);
73261         });
73262       });
73263       matcher.locationIndex = (bbox2) => {
73264         const validHere = _sharedLocationManager.locationSetsAt([bbox2[0], bbox2[1]]);
73265         const results = [];
73266         for (const [locationSetID, area] of Object.entries(validHere)) {
73267           const fakeFeature = matcher.locationSets.get(locationSetID);
73268           if (fakeFeature) {
73269             fakeFeature.properties.area = area;
73270             results.push(fakeFeature);
73271           }
73272         }
73273         return results;
73274       };
73275       Object.keys(_nsi.data).forEach((tkv) => {
73276         const category = _nsi.data[tkv];
73277         const parts = tkv.split("/", 3);
73278         const t = parts[0];
73279         const k = parts[1];
73280         const v = parts[2];
73281         let vmap = _nsi.kvt.get(k);
73282         if (!vmap) {
73283           vmap = /* @__PURE__ */ new Map();
73284           _nsi.kvt.set(k, vmap);
73285         }
73286         vmap.set(v, t);
73287         const tree = _nsi.trees[t];
73288         const mainTag = tree.mainTag;
73289         const items = category.items || [];
73290         items.forEach((item) => {
73291           item.tkv = tkv;
73292           item.mainTag = mainTag;
73293           _nsi.ids.set(item.id, item);
73294           const wd = item.tags[mainTag];
73295           const wp = item.tags[mainTag.replace("wikidata", "wikipedia")];
73296           if (wd)
73297             _nsi.qids.set(wd, wd);
73298           if (wp && wd)
73299             _nsi.qids.set(wp, wd);
73300         });
73301       });
73302     });
73303   }
73304   function gatherKVs(tags) {
73305     let primary = /* @__PURE__ */ new Set();
73306     let alternate = /* @__PURE__ */ new Set();
73307     Object.keys(tags).forEach((osmkey) => {
73308       const osmvalue = tags[osmkey];
73309       if (!osmvalue)
73310         return;
73311       if (osmkey === "route_master")
73312         osmkey = "route";
73313       const vmap = _nsi.kvt.get(osmkey);
73314       if (!vmap)
73315         return;
73316       if (vmap.get(osmvalue)) {
73317         primary.add(`${osmkey}/${osmvalue}`);
73318       } else if (osmvalue === "yes") {
73319         alternate.add(`${osmkey}/${osmvalue}`);
73320       }
73321     });
73322     const preset = _mainPresetIndex.matchTags(tags, "area");
73323     if (buildingPreset[preset.id]) {
73324       alternate.add("building/yes");
73325     }
73326     return { primary, alternate };
73327   }
73328   function identifyTree(tags) {
73329     let unknown;
73330     let t;
73331     Object.keys(tags).forEach((osmkey) => {
73332       if (t)
73333         return;
73334       const osmvalue = tags[osmkey];
73335       if (!osmvalue)
73336         return;
73337       if (osmkey === "route_master")
73338         osmkey = "route";
73339       const vmap = _nsi.kvt.get(osmkey);
73340       if (!vmap)
73341         return;
73342       if (osmvalue === "yes") {
73343         unknown = "unknown";
73344       } else {
73345         t = vmap.get(osmvalue);
73346       }
73347     });
73348     return t || unknown || null;
73349   }
73350   function gatherNames(tags) {
73351     const empty2 = { primary: /* @__PURE__ */ new Set(), alternate: /* @__PURE__ */ new Set() };
73352     let primary = /* @__PURE__ */ new Set();
73353     let alternate = /* @__PURE__ */ new Set();
73354     let foundSemi = false;
73355     let testNameFragments = false;
73356     let patterns2;
73357     let t = identifyTree(tags);
73358     if (!t)
73359       return empty2;
73360     if (t === "transit") {
73361       patterns2 = {
73362         primary: /^network$/i,
73363         alternate: /^(operator|operator:\w+|network:\w+|\w+_name|\w+_name:\w+)$/i
73364       };
73365     } else if (t === "flags") {
73366       patterns2 = {
73367         primary: /^(flag:name|flag:name:\w+)$/i,
73368         alternate: /^(flag|flag:\w+|subject|subject:\w+)$/i
73369         // note: no `country`, we special-case it below
73370       };
73371     } else if (t === "brands") {
73372       testNameFragments = true;
73373       patterns2 = {
73374         primary: /^(name|name:\w+)$/i,
73375         alternate: /^(brand|brand:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
73376       };
73377     } else if (t === "operators") {
73378       testNameFragments = true;
73379       patterns2 = {
73380         primary: /^(name|name:\w+|operator|operator:\w+)$/i,
73381         alternate: /^(brand|brand:\w+|\w+_name|\w+_name:\w+)/i
73382       };
73383     } else {
73384       testNameFragments = true;
73385       patterns2 = {
73386         primary: /^(name|name:\w+)$/i,
73387         alternate: /^(brand|brand:\w+|network|network:\w+|operator|operator:\w+|\w+_name|\w+_name:\w+)/i
73388       };
73389     }
73390     if (tags.name && testNameFragments) {
73391       const nameParts = tags.name.split(/[\s\-\/,.]/);
73392       for (let split = nameParts.length; split > 0; split--) {
73393         const name = nameParts.slice(0, split).join(" ");
73394         primary.add(name);
73395       }
73396     }
73397     Object.keys(tags).forEach((osmkey) => {
73398       const osmvalue = tags[osmkey];
73399       if (!osmvalue)
73400         return;
73401       if (isNamelike(osmkey, "primary")) {
73402         if (/;/.test(osmvalue)) {
73403           foundSemi = true;
73404         } else {
73405           primary.add(osmvalue);
73406           alternate.delete(osmvalue);
73407         }
73408       } else if (!primary.has(osmvalue) && isNamelike(osmkey, "alternate")) {
73409         if (/;/.test(osmvalue)) {
73410           foundSemi = true;
73411         } else {
73412           alternate.add(osmvalue);
73413         }
73414       }
73415     });
73416     if (tags.man_made === "flagpole" && !primary.size && !alternate.size && !!tags.country) {
73417       const osmvalue = tags.country;
73418       if (/;/.test(osmvalue)) {
73419         foundSemi = true;
73420       } else {
73421         alternate.add(osmvalue);
73422       }
73423     }
73424     if (foundSemi) {
73425       return empty2;
73426     } else {
73427       return { primary, alternate };
73428     }
73429     function isNamelike(osmkey, which) {
73430       if (osmkey === "old_name")
73431         return false;
73432       return patterns2[which].test(osmkey) && !notNames.test(osmkey);
73433     }
73434   }
73435   function gatherTuples(tryKVs, tryNames) {
73436     let tuples = [];
73437     ["primary", "alternate"].forEach((whichName) => {
73438       const arr = Array.from(tryNames[whichName]).sort((a, b) => b.length - a.length);
73439       arr.forEach((n2) => {
73440         ["primary", "alternate"].forEach((whichKV) => {
73441           tryKVs[whichKV].forEach((kv) => {
73442             const parts = kv.split("/", 2);
73443             const k = parts[0];
73444             const v = parts[1];
73445             tuples.push({ k, v, n: n2 });
73446           });
73447         });
73448       });
73449     });
73450     return tuples;
73451   }
73452   function _upgradeTags(tags, loc) {
73453     let newTags = Object.assign({}, tags);
73454     let changed = false;
73455     Object.keys(newTags).forEach((osmkey) => {
73456       const matchTag = osmkey.match(/^(\w+:)?wikidata$/);
73457       if (matchTag) {
73458         const prefix = matchTag[1] || "";
73459         const wd = newTags[osmkey];
73460         const replace = _nsi.replacements[wd];
73461         if (replace && replace.wikidata !== void 0) {
73462           changed = true;
73463           if (replace.wikidata) {
73464             newTags[osmkey] = replace.wikidata;
73465           } else {
73466             delete newTags[osmkey];
73467           }
73468         }
73469         if (replace && replace.wikipedia !== void 0) {
73470           changed = true;
73471           const wpkey = `${prefix}wikipedia`;
73472           if (replace.wikipedia) {
73473             newTags[wpkey] = replace.wikipedia;
73474           } else {
73475             delete newTags[wpkey];
73476           }
73477         }
73478       }
73479     });
73480     const isRouteMaster = tags.type === "route_master";
73481     const tryKVs = gatherKVs(tags);
73482     if (!tryKVs.primary.size && !tryKVs.alternate.size) {
73483       return changed ? { newTags, matched: null } : null;
73484     }
73485     const tryNames = gatherNames(tags);
73486     const foundQID = _nsi.qids.get(tags.wikidata) || _nsi.qids.get(tags.wikipedia);
73487     if (foundQID)
73488       tryNames.primary.add(foundQID);
73489     if (!tryNames.primary.size && !tryNames.alternate.size) {
73490       return changed ? { newTags, matched: null } : null;
73491     }
73492     const tuples = gatherTuples(tryKVs, tryNames);
73493     for (let i2 = 0; i2 < tuples.length; i2++) {
73494       const tuple = tuples[i2];
73495       const hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n, loc);
73496       if (!hits || !hits.length)
73497         continue;
73498       if (hits[0].match !== "primary" && hits[0].match !== "alternate")
73499         break;
73500       let itemID, item;
73501       for (let j2 = 0; j2 < hits.length; j2++) {
73502         const hit = hits[j2];
73503         itemID = hit.itemID;
73504         if (_nsi.dissolved[itemID])
73505           continue;
73506         item = _nsi.ids.get(itemID);
73507         if (!item)
73508           continue;
73509         const mainTag = item.mainTag;
73510         const itemQID = item.tags[mainTag];
73511         const notQID = newTags[`not:${mainTag}`];
73512         if (
73513           // Exceptions, skip this hit
73514           !itemQID || itemQID === notQID || // No `*:wikidata` or matched a `not:*:wikidata`
73515           newTags.office && !item.tags.office
73516         ) {
73517           item = null;
73518           continue;
73519         } else {
73520           break;
73521         }
73522       }
73523       if (!item)
73524         continue;
73525       item = JSON.parse(JSON.stringify(item));
73526       const tkv = item.tkv;
73527       const parts = tkv.split("/", 3);
73528       const k = parts[1];
73529       const v = parts[2];
73530       const category = _nsi.data[tkv];
73531       const properties = category.properties || {};
73532       let preserveTags = item.preserveTags || properties.preserveTags || [];
73533       ["building", "emergency", "internet_access", "takeaway"].forEach((osmkey) => {
73534         if (k !== osmkey)
73535           preserveTags.push(`^${osmkey}$`);
73536       });
73537       const regexes = preserveTags.map((s) => new RegExp(s, "i"));
73538       let keepTags = {};
73539       Object.keys(newTags).forEach((osmkey) => {
73540         if (regexes.some((regex) => regex.test(osmkey))) {
73541           keepTags[osmkey] = newTags[osmkey];
73542         }
73543       });
73544       _nsi.kvt.forEach((vmap, k2) => {
73545         if (newTags[k2] === "yes")
73546           delete newTags[k2];
73547       });
73548       if (foundQID) {
73549         delete newTags.wikipedia;
73550         delete newTags.wikidata;
73551       }
73552       Object.assign(newTags, item.tags, keepTags);
73553       if (isRouteMaster) {
73554         newTags.route_master = newTags.route;
73555         delete newTags.route;
73556       }
73557       const origName = tags.name;
73558       const newName = newTags.name;
73559       if (newName && origName && newName !== origName && !newTags.branch) {
73560         const newNames = gatherNames(newTags);
73561         const newSet = /* @__PURE__ */ new Set([...newNames.primary, ...newNames.alternate]);
73562         const isMoved = newSet.has(origName);
73563         if (!isMoved) {
73564           const nameParts = origName.split(/[\s\-\/,.]/);
73565           for (let split = nameParts.length; split > 0; split--) {
73566             const name = nameParts.slice(0, split).join(" ");
73567             const branch = nameParts.slice(split).join(" ");
73568             const nameHits = _nsi.matcher.match(k, v, name, loc);
73569             if (!nameHits || !nameHits.length)
73570               continue;
73571             if (nameHits.some((hit) => hit.itemID === itemID)) {
73572               if (branch) {
73573                 if (notBranches.test(branch)) {
73574                   newTags.name = origName;
73575                 } else {
73576                   const branchHits = _nsi.matcher.match(k, v, branch, loc);
73577                   if (branchHits && branchHits.length) {
73578                     if (branchHits[0].match === "primary" || branchHits[0].match === "alternate") {
73579                       return null;
73580                     }
73581                   } else {
73582                     newTags.branch = branch;
73583                   }
73584                 }
73585               }
73586               break;
73587             }
73588           }
73589         }
73590       }
73591       return { newTags, matched: item };
73592     }
73593     return changed ? { newTags, matched: null } : null;
73594   }
73595   function _isGenericName(tags) {
73596     const n2 = tags.name;
73597     if (!n2)
73598       return false;
73599     const tryNames = { primary: /* @__PURE__ */ new Set([n2]), alternate: /* @__PURE__ */ new Set() };
73600     const tryKVs = gatherKVs(tags);
73601     if (!tryKVs.primary.size && !tryKVs.alternate.size)
73602       return false;
73603     const tuples = gatherTuples(tryKVs, tryNames);
73604     for (let i2 = 0; i2 < tuples.length; i2++) {
73605       const tuple = tuples[i2];
73606       const hits = _nsi.matcher.match(tuple.k, tuple.v, tuple.n);
73607       if (hits && hits.length && hits[0].match === "excludeGeneric")
73608         return true;
73609     }
73610     return false;
73611   }
73612   var nsi_default = {
73613     // `init()`
73614     // On init, start preparing the name-suggestion-index
73615     //
73616     init: () => {
73617       setNsiSources();
73618       _mainPresetIndex.ensureLoaded().then(() => loadNsiPresets()).then(() => loadNsiData()).then(() => _nsiStatus = "ok").catch(() => _nsiStatus = "failed");
73619     },
73620     // `reset()`
73621     // Reset is called when user saves data to OSM (does nothing here)
73622     //
73623     reset: () => {
73624     },
73625     // `status()`
73626     // To let other code know how it's going...
73627     //
73628     // Returns
73629     //   `String`: 'loading', 'ok', 'failed'
73630     //
73631     status: () => _nsiStatus,
73632     // `isGenericName()`
73633     // Is the `name` tag generic?
73634     //
73635     // Arguments
73636     //   `tags`: `Object` containing the feature's OSM tags
73637     // Returns
73638     //   `true` if it is generic, `false` if not
73639     //
73640     isGenericName: (tags) => _isGenericName(tags),
73641     // `upgradeTags()`
73642     // Suggest tag upgrades.
73643     // This function will not modify the input tags, it makes a copy.
73644     //
73645     // Arguments
73646     //   `tags`: `Object` containing the feature's OSM tags
73647     //   `loc`: Location where this feature exists, as a [lon, lat]
73648     // Returns
73649     //   `Object` containing the result, or `null` if no changes needed:
73650     //   {
73651     //     'newTags': `Object` - The tags the the feature should have
73652     //     'matched': `Object` - The matched item
73653     //   }
73654     //
73655     upgradeTags: (tags, loc) => _upgradeTags(tags, loc),
73656     // `cache()`
73657     // Direct access to the NSI cache, useful for testing or breaking things
73658     //
73659     // Returns
73660     //   `Object`: the internal NSI cache
73661     //
73662     cache: () => _nsi
73663   };
73664
73665   // modules/services/kartaview.js
73666   var import_rbush8 = __toESM(require_rbush_min());
73667   var apibase2 = "https://kartaview.org";
73668   var maxResults = 1e3;
73669   var tileZoom = 14;
73670   var tiler4 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
73671   var dispatch6 = dispatch_default("loadedImages");
73672   var imgZoom = zoom_default2().extent([[0, 0], [320, 240]]).translateExtent([[0, 0], [320, 240]]).scaleExtent([1, 15]);
73673   var _oscCache;
73674   var _oscSelectedImage;
73675   var _loadViewerPromise2;
73676   function abortRequest4(controller) {
73677     controller.abort();
73678   }
73679   function maxPageAtZoom(z) {
73680     if (z < 15)
73681       return 2;
73682     if (z === 15)
73683       return 5;
73684     if (z === 16)
73685       return 10;
73686     if (z === 17)
73687       return 20;
73688     if (z === 18)
73689       return 40;
73690     if (z > 18)
73691       return 80;
73692   }
73693   function loadTiles2(which, url, projection2) {
73694     var currZoom = Math.floor(geoScaleToZoom(projection2.scale()));
73695     var tiles = tiler4.getTiles(projection2);
73696     var cache = _oscCache[which];
73697     Object.keys(cache.inflight).forEach(function(k) {
73698       var wanted = tiles.find(function(tile) {
73699         return k.indexOf(tile.id + ",") === 0;
73700       });
73701       if (!wanted) {
73702         abortRequest4(cache.inflight[k]);
73703         delete cache.inflight[k];
73704       }
73705     });
73706     tiles.forEach(function(tile) {
73707       loadNextTilePage(which, currZoom, url, tile);
73708     });
73709   }
73710   function loadNextTilePage(which, currZoom, url, tile) {
73711     var cache = _oscCache[which];
73712     var bbox2 = tile.extent.bbox();
73713     var maxPages = maxPageAtZoom(currZoom);
73714     var nextPage = cache.nextPage[tile.id] || 1;
73715     var params = utilQsString({
73716       ipp: maxResults,
73717       page: nextPage,
73718       // client_id: clientId,
73719       bbTopLeft: [bbox2.maxY, bbox2.minX].join(","),
73720       bbBottomRight: [bbox2.minY, bbox2.maxX].join(",")
73721     }, true);
73722     if (nextPage > maxPages)
73723       return;
73724     var id2 = tile.id + "," + String(nextPage);
73725     if (cache.loaded[id2] || cache.inflight[id2])
73726       return;
73727     var controller = new AbortController();
73728     cache.inflight[id2] = controller;
73729     var options2 = {
73730       method: "POST",
73731       signal: controller.signal,
73732       body: params,
73733       headers: { "Content-Type": "application/x-www-form-urlencoded" }
73734     };
73735     json_default(url, options2).then(function(data) {
73736       cache.loaded[id2] = true;
73737       delete cache.inflight[id2];
73738       if (!data || !data.currentPageItems || !data.currentPageItems.length) {
73739         throw new Error("No Data");
73740       }
73741       var features = data.currentPageItems.map(function(item) {
73742         var loc = [+item.lng, +item.lat];
73743         var d;
73744         if (which === "images") {
73745           d = {
73746             loc,
73747             key: item.id,
73748             ca: +item.heading,
73749             captured_at: item.shot_date || item.date_added,
73750             captured_by: item.username,
73751             imagePath: item.lth_name,
73752             sequence_id: item.sequence_id,
73753             sequence_index: +item.sequence_index
73754           };
73755           var seq = _oscCache.sequences[d.sequence_id];
73756           if (!seq) {
73757             seq = { rotation: 0, images: [] };
73758             _oscCache.sequences[d.sequence_id] = seq;
73759           }
73760           seq.images[d.sequence_index] = d;
73761           _oscCache.images.forImageKey[d.key] = d;
73762         }
73763         return {
73764           minX: loc[0],
73765           minY: loc[1],
73766           maxX: loc[0],
73767           maxY: loc[1],
73768           data: d
73769         };
73770       });
73771       cache.rtree.load(features);
73772       if (data.currentPageItems.length === maxResults) {
73773         cache.nextPage[tile.id] = nextPage + 1;
73774         loadNextTilePage(which, currZoom, url, tile);
73775       } else {
73776         cache.nextPage[tile.id] = Infinity;
73777       }
73778       if (which === "images") {
73779         dispatch6.call("loadedImages");
73780       }
73781     }).catch(function() {
73782       cache.loaded[id2] = true;
73783       delete cache.inflight[id2];
73784     });
73785   }
73786   function partitionViewport2(projection2) {
73787     var z = geoScaleToZoom(projection2.scale());
73788     var z2 = Math.ceil(z * 2) / 2 + 2.5;
73789     var tiler8 = utilTiler().zoomExtent([z2, z2]);
73790     return tiler8.getTiles(projection2).map(function(tile) {
73791       return tile.extent;
73792     });
73793   }
73794   function searchLimited2(limit, projection2, rtree) {
73795     limit = limit || 5;
73796     return partitionViewport2(projection2).reduce(function(result, extent) {
73797       var found = rtree.search(extent.bbox()).slice(0, limit).map(function(d) {
73798         return d.data;
73799       });
73800       return found.length ? result.concat(found) : result;
73801     }, []);
73802   }
73803   var kartaview_default = {
73804     init: function() {
73805       if (!_oscCache) {
73806         this.reset();
73807       }
73808       this.event = utilRebind(this, dispatch6, "on");
73809     },
73810     reset: function() {
73811       if (_oscCache) {
73812         Object.values(_oscCache.images.inflight).forEach(abortRequest4);
73813       }
73814       _oscCache = {
73815         images: { inflight: {}, loaded: {}, nextPage: {}, rtree: new import_rbush8.default(), forImageKey: {} },
73816         sequences: {}
73817       };
73818       _oscSelectedImage = null;
73819     },
73820     images: function(projection2) {
73821       var limit = 5;
73822       return searchLimited2(limit, projection2, _oscCache.images.rtree);
73823     },
73824     sequences: function(projection2) {
73825       var viewport = projection2.clipExtent();
73826       var min3 = [viewport[0][0], viewport[1][1]];
73827       var max3 = [viewport[1][0], viewport[0][1]];
73828       var bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
73829       var sequenceKeys = {};
73830       _oscCache.images.rtree.search(bbox2).forEach(function(d) {
73831         sequenceKeys[d.data.sequence_id] = true;
73832       });
73833       var lineStrings = [];
73834       Object.keys(sequenceKeys).forEach(function(sequenceKey) {
73835         var seq = _oscCache.sequences[sequenceKey];
73836         var images = seq && seq.images;
73837         if (images) {
73838           lineStrings.push({
73839             type: "LineString",
73840             coordinates: images.map(function(d) {
73841               return d.loc;
73842             }).filter(Boolean),
73843             properties: {
73844               captured_at: images[0] ? images[0].captured_at : null,
73845               captured_by: images[0] ? images[0].captured_by : null,
73846               key: sequenceKey
73847             }
73848           });
73849         }
73850       });
73851       return lineStrings;
73852     },
73853     cachedImage: function(imageKey) {
73854       return _oscCache.images.forImageKey[imageKey];
73855     },
73856     loadImages: function(projection2) {
73857       var url = apibase2 + "/1.0/list/nearby-photos/";
73858       loadTiles2("images", url, projection2);
73859     },
73860     ensureViewerLoaded: function(context) {
73861       if (_loadViewerPromise2)
73862         return _loadViewerPromise2;
73863       var wrap2 = context.container().select(".photoviewer").selectAll(".kartaview-wrapper").data([0]);
73864       var that = this;
73865       var wrapEnter = wrap2.enter().append("div").attr("class", "photo-wrapper kartaview-wrapper").classed("hide", true).call(imgZoom.on("zoom", zoomPan)).on("dblclick.zoom", null);
73866       wrapEnter.append("div").attr("class", "photo-attribution fillD");
73867       var controlsEnter = wrapEnter.append("div").attr("class", "photo-controls-wrap").append("div").attr("class", "photo-controls");
73868       controlsEnter.append("button").on("click.back", step(-1)).text("\u25C4");
73869       controlsEnter.append("button").on("click.rotate-ccw", rotate(-90)).text("\u293F");
73870       controlsEnter.append("button").on("click.rotate-cw", rotate(90)).text("\u293E");
73871       controlsEnter.append("button").on("click.forward", step(1)).text("\u25BA");
73872       wrapEnter.append("div").attr("class", "kartaview-image-wrap");
73873       context.ui().photoviewer.on("resize.kartaview", function(dimensions) {
73874         imgZoom = zoom_default2().extent([[0, 0], dimensions]).translateExtent([[0, 0], dimensions]).scaleExtent([1, 15]).on("zoom", zoomPan);
73875       });
73876       function zoomPan(d3_event) {
73877         var t = d3_event.transform;
73878         context.container().select(".photoviewer .kartaview-image-wrap").call(utilSetTransform, t.x, t.y, t.k);
73879       }
73880       function rotate(deg) {
73881         return function() {
73882           if (!_oscSelectedImage)
73883             return;
73884           var sequenceKey = _oscSelectedImage.sequence_id;
73885           var sequence = _oscCache.sequences[sequenceKey];
73886           if (!sequence)
73887             return;
73888           var r = sequence.rotation || 0;
73889           r += deg;
73890           if (r > 180)
73891             r -= 360;
73892           if (r < -180)
73893             r += 360;
73894           sequence.rotation = r;
73895           var wrap3 = context.container().select(".photoviewer .kartaview-wrapper");
73896           wrap3.transition().duration(100).call(imgZoom.transform, identity2);
73897           wrap3.selectAll(".kartaview-image").transition().duration(100).style("transform", "rotate(" + r + "deg)");
73898         };
73899       }
73900       function step(stepBy) {
73901         return function() {
73902           if (!_oscSelectedImage)
73903             return;
73904           var sequenceKey = _oscSelectedImage.sequence_id;
73905           var sequence = _oscCache.sequences[sequenceKey];
73906           if (!sequence)
73907             return;
73908           var nextIndex = _oscSelectedImage.sequence_index + stepBy;
73909           var nextImage = sequence.images[nextIndex];
73910           if (!nextImage)
73911             return;
73912           context.map().centerEase(nextImage.loc);
73913           that.selectImage(context, nextImage.key);
73914         };
73915       }
73916       _loadViewerPromise2 = Promise.resolve();
73917       return _loadViewerPromise2;
73918     },
73919     showViewer: function(context) {
73920       var viewer = context.container().select(".photoviewer").classed("hide", false);
73921       var isHidden = viewer.selectAll(".photo-wrapper.kartaview-wrapper.hide").size();
73922       if (isHidden) {
73923         viewer.selectAll(".photo-wrapper:not(.kartaview-wrapper)").classed("hide", true);
73924         viewer.selectAll(".photo-wrapper.kartaview-wrapper").classed("hide", false);
73925       }
73926       return this;
73927     },
73928     hideViewer: function(context) {
73929       _oscSelectedImage = null;
73930       this.updateUrlImage(null);
73931       var viewer = context.container().select(".photoviewer");
73932       if (!viewer.empty())
73933         viewer.datum(null);
73934       viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
73935       context.container().selectAll(".viewfield-group, .sequence, .icon-sign").classed("currentView", false);
73936       return this.setStyles(context, null, true);
73937     },
73938     selectImage: function(context, imageKey) {
73939       var d = this.cachedImage(imageKey);
73940       _oscSelectedImage = d;
73941       this.updateUrlImage(imageKey);
73942       var viewer = context.container().select(".photoviewer");
73943       if (!viewer.empty())
73944         viewer.datum(d);
73945       this.setStyles(context, null, true);
73946       context.container().selectAll(".icon-sign").classed("currentView", false);
73947       if (!d)
73948         return this;
73949       var wrap2 = context.container().select(".photoviewer .kartaview-wrapper");
73950       var imageWrap = wrap2.selectAll(".kartaview-image-wrap");
73951       var attribution = wrap2.selectAll(".photo-attribution").text("");
73952       wrap2.transition().duration(100).call(imgZoom.transform, identity2);
73953       imageWrap.selectAll(".kartaview-image").remove();
73954       if (d) {
73955         var sequence = _oscCache.sequences[d.sequence_id];
73956         var r = sequence && sequence.rotation || 0;
73957         imageWrap.append("img").attr("class", "kartaview-image").attr("src", apibase2 + "/" + d.imagePath).style("transform", "rotate(" + r + "deg)");
73958         if (d.captured_by) {
73959           attribution.append("a").attr("class", "captured_by").attr("target", "_blank").attr("href", "https://kartaview.org/user/" + encodeURIComponent(d.captured_by)).text("@" + d.captured_by);
73960           attribution.append("span").text("|");
73961         }
73962         if (d.captured_at) {
73963           attribution.append("span").attr("class", "captured_at").text(localeDateString2(d.captured_at));
73964           attribution.append("span").text("|");
73965         }
73966         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");
73967       }
73968       return this;
73969       function localeDateString2(s) {
73970         if (!s)
73971           return null;
73972         var options2 = { day: "numeric", month: "short", year: "numeric" };
73973         var d2 = new Date(s);
73974         if (isNaN(d2.getTime()))
73975           return null;
73976         return d2.toLocaleDateString(_mainLocalizer.localeCode(), options2);
73977       }
73978     },
73979     getSelectedImage: function() {
73980       return _oscSelectedImage;
73981     },
73982     getSequenceKeyForImage: function(d) {
73983       return d && d.sequence_id;
73984     },
73985     // Updates the currently highlighted sequence and selected bubble.
73986     // Reset is only necessary when interacting with the viewport because
73987     // this implicitly changes the currently selected bubble/sequence
73988     setStyles: function(context, hovered, reset) {
73989       if (reset) {
73990         context.container().selectAll(".viewfield-group").classed("highlighted", false).classed("hovered", false).classed("currentView", false);
73991         context.container().selectAll(".sequence").classed("highlighted", false).classed("currentView", false);
73992       }
73993       var hoveredImageKey = hovered && hovered.key;
73994       var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
73995       var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
73996       var hoveredImageKeys = hoveredSequence && hoveredSequence.images.map(function(d) {
73997         return d.key;
73998       }) || [];
73999       var viewer = context.container().select(".photoviewer");
74000       var selected = viewer.empty() ? void 0 : viewer.datum();
74001       var selectedImageKey = selected && selected.key;
74002       var selectedSequenceKey = this.getSequenceKeyForImage(selected);
74003       var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
74004       var selectedImageKeys = selectedSequence && selectedSequence.images.map(function(d) {
74005         return d.key;
74006       }) || [];
74007       var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
74008       context.container().selectAll(".layer-kartaview .viewfield-group").classed("highlighted", function(d) {
74009         return highlightedImageKeys.indexOf(d.key) !== -1;
74010       }).classed("hovered", function(d) {
74011         return d.key === hoveredImageKey;
74012       }).classed("currentView", function(d) {
74013         return d.key === selectedImageKey;
74014       });
74015       context.container().selectAll(".layer-kartaview .sequence").classed("highlighted", function(d) {
74016         return d.properties.key === hoveredSequenceKey;
74017       }).classed("currentView", function(d) {
74018         return d.properties.key === selectedSequenceKey;
74019       });
74020       context.container().selectAll(".layer-kartaview .viewfield-group .viewfield").attr("d", viewfieldPath);
74021       function viewfieldPath() {
74022         var d = this.parentNode.__data__;
74023         if (d.pano && d.key !== selectedImageKey) {
74024           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
74025         } else {
74026           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
74027         }
74028       }
74029       return this;
74030     },
74031     updateUrlImage: function(imageKey) {
74032       if (!window.mocha) {
74033         var hash = utilStringQs(window.location.hash);
74034         if (imageKey) {
74035           hash.photo = "kartaview/" + imageKey;
74036         } else {
74037           delete hash.photo;
74038         }
74039         window.location.replace("#" + utilQsString(hash, true));
74040       }
74041     },
74042     cache: function() {
74043       return _oscCache;
74044     }
74045   };
74046
74047   // node_modules/osm-auth/src/osm-auth.mjs
74048   var import_store = __toESM(require_store_legacy(), 1);
74049   function osmAuth(o) {
74050     var oauth2 = {};
74051     oauth2.authenticated = function() {
74052       return !!token("oauth2_access_token");
74053     };
74054     oauth2.logout = function() {
74055       token("oauth2_access_token", "");
74056       token("oauth_token", "");
74057       token("oauth_token_secret", "");
74058       token("oauth_request_token_secret", "");
74059       return oauth2;
74060     };
74061     oauth2.authenticate = function(callback) {
74062       if (oauth2.authenticated()) {
74063         callback(null, oauth2);
74064         return;
74065       }
74066       oauth2.logout();
74067       var url = o.url + "/oauth2/authorize?" + utilQsString2({
74068         client_id: o.client_id,
74069         redirect_uri: o.redirect_uri,
74070         response_type: "code",
74071         scope: o.scope
74072       });
74073       if (o.singlepage) {
74074         var params = utilStringQs2(window.location.search.slice(1));
74075         if (params.code) {
74076           getAccessToken(params.code);
74077         } else {
74078           window.location = url;
74079         }
74080       } else {
74081         var w = 600;
74082         var h = 550;
74083         var settings = [
74084           ["width", w],
74085           ["height", h],
74086           ["left", window.screen.width / 2 - w / 2],
74087           ["top", window.screen.height / 2 - h / 2]
74088         ].map(function(x) {
74089           return x.join("=");
74090         }).join(",");
74091         var popup = window.open("about:blank", "oauth_window", settings);
74092         oauth2.popupWindow = popup;
74093         popup.location = url;
74094         if (!popup) {
74095           var error = new Error("Popup was blocked");
74096           error.status = "popup-blocked";
74097           throw error;
74098         }
74099       }
74100       window.authComplete = function(url2) {
74101         var params2 = utilStringQs2(url2.split("?")[1]);
74102         getAccessToken(params2.code);
74103         delete window.authComplete;
74104       };
74105       function getAccessToken(auth_code) {
74106         var url2 = o.url + "/oauth2/token?" + utilQsString2({
74107           client_id: o.client_id,
74108           grant_type: "authorization_code",
74109           code: auth_code,
74110           redirect_uri: o.redirect_uri,
74111           client_secret: o.client_secret
74112         });
74113         oauth2.rawxhr("POST", url2, null, null, null, accessTokenDone);
74114         o.loading();
74115       }
74116       function accessTokenDone(err, xhr) {
74117         o.done();
74118         if (err) {
74119           callback(err);
74120           return;
74121         }
74122         var access_token = JSON.parse(xhr.response);
74123         token("oauth2_access_token", access_token.access_token);
74124         callback(null, oauth2);
74125       }
74126     };
74127     oauth2.bringPopupWindowToFront = function() {
74128       var broughtPopupToFront = false;
74129       try {
74130         if (oauth2.popupWindow && !oauth2.popupWindow.closed) {
74131           oauth2.popupWindow.focus();
74132           broughtPopupToFront = true;
74133         }
74134       } catch (err) {
74135       }
74136       return broughtPopupToFront;
74137     };
74138     oauth2.bootstrapToken = function(auth_code, callback) {
74139       function getAccessToken(auth_code2) {
74140         var url = o.url + "/oauth2/token?" + utilQsString2({
74141           client_id: o.client_id,
74142           grant_type: "authorization_code",
74143           code: auth_code2,
74144           redirect_uri: o.redirect_uri,
74145           client_secret: o.client_secret
74146         });
74147         oauth2.rawxhr("POST", url, null, null, null, accessTokenDone);
74148         o.loading();
74149       }
74150       function accessTokenDone(err, xhr) {
74151         o.done();
74152         if (err) {
74153           callback(err);
74154           return;
74155         }
74156         var access_token = JSON.parse(xhr.response);
74157         token("oauth2_access_token", access_token.access_token);
74158         callback(null, oauth2);
74159       }
74160       getAccessToken(auth_code);
74161     };
74162     oauth2.fetch = function(path, options2, callback) {
74163       if (oauth2.authenticated()) {
74164         return run();
74165       } else {
74166         if (o.auto) {
74167           oauth2.authenticate(run);
74168           return;
74169         } else {
74170           callback("not authenticated", null);
74171           return;
74172         }
74173       }
74174       function run() {
74175         var url = options2.prefix !== false ? o.url + path : path;
74176         var headers = options2.headers || { "Content-Type": "application/x-www-form-urlencoded" };
74177         headers.Authorization = "Bearer " + token("oauth2_access_token");
74178         return fetch(url, {
74179           method: options2.method,
74180           body: options2.body,
74181           headers
74182         }).then((resp) => {
74183           var contentType = resp.headers.get("content-type").split(";")[0];
74184           switch (contentType) {
74185             case "text/html":
74186             case "text/xml":
74187               return resp.text().then(
74188                 (txt) => new window.DOMParser().parseFromString(txt, contentType)
74189               );
74190             case "application/html":
74191               return resp.json();
74192             default:
74193               return resp.text();
74194           }
74195         });
74196       }
74197     };
74198     oauth2.xhr = function(options2, callback) {
74199       if (oauth2.authenticated()) {
74200         return run();
74201       } else {
74202         if (o.auto) {
74203           oauth2.authenticate(run);
74204           return;
74205         } else {
74206           callback("not authenticated", null);
74207           return;
74208         }
74209       }
74210       function run() {
74211         var url = options2.prefix !== false ? o.url + options2.path : options2.path;
74212         return oauth2.rawxhr(
74213           options2.method,
74214           url,
74215           token("oauth2_access_token"),
74216           options2.content,
74217           options2.headers,
74218           done
74219         );
74220       }
74221       function done(err, xhr) {
74222         if (err) {
74223           callback(err);
74224         } else if (xhr.responseXML) {
74225           callback(err, xhr.responseXML);
74226         } else {
74227           callback(err, xhr.response);
74228         }
74229       }
74230     };
74231     oauth2.rawxhr = function(method, url, access_token, data, headers, callback) {
74232       headers = headers || { "Content-Type": "application/x-www-form-urlencoded" };
74233       if (access_token) {
74234         headers.Authorization = "Bearer " + access_token;
74235       }
74236       var xhr = new XMLHttpRequest();
74237       xhr.onreadystatechange = function() {
74238         if (4 === xhr.readyState && 0 !== xhr.status) {
74239           if (/^20\d$/.test(xhr.status)) {
74240             callback(null, xhr);
74241           } else {
74242             callback(xhr, null);
74243           }
74244         }
74245       };
74246       xhr.onerror = function(e) {
74247         callback(e, null);
74248       };
74249       xhr.open(method, url, true);
74250       for (var h in headers)
74251         xhr.setRequestHeader(h, headers[h]);
74252       xhr.send(data);
74253       return xhr;
74254     };
74255     oauth2.preauth = function(val) {
74256       if (val && val.access_token) {
74257         token("oauth2_access_token", val.access_token);
74258       }
74259       return oauth2;
74260     };
74261     oauth2.options = function(val) {
74262       if (!arguments.length)
74263         return o;
74264       o = val;
74265       o.url = o.url || "https://www.openstreetmap.org";
74266       o.auto = o.auto || false;
74267       o.singlepage = o.singlepage || false;
74268       o.loading = o.loading || function() {
74269       };
74270       o.done = o.done || function() {
74271       };
74272       return oauth2.preauth(o);
74273     };
74274     var token;
74275     if (import_store.default.enabled) {
74276       token = function(x, y) {
74277         if (arguments.length === 1)
74278           return import_store.default.get(o.url + x);
74279         else if (arguments.length === 2)
74280           return import_store.default.set(o.url + x, y);
74281       };
74282     } else {
74283       var storage = {};
74284       token = function(x, y) {
74285         if (arguments.length === 1)
74286           return storage[o.url + x];
74287         else if (arguments.length === 2)
74288           return storage[o.url + x] = y;
74289       };
74290     }
74291     oauth2.options(o);
74292     return oauth2;
74293   }
74294   function utilQsString2(obj) {
74295     return Object.keys(obj).sort().map(function(key) {
74296       return encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]);
74297     }).join("&");
74298   }
74299   function utilStringQs2(str2) {
74300     var i2 = 0;
74301     while (i2 < str2.length && (str2[i2] === "?" || str2[i2] === "#"))
74302       i2++;
74303     str2 = str2.slice(i2);
74304     return str2.split("&").reduce(function(obj, pair2) {
74305       var parts = pair2.split("=");
74306       if (parts.length === 2) {
74307         obj[parts[0]] = decodeURIComponent(parts[1]);
74308       }
74309       return obj;
74310     }, {});
74311   }
74312
74313   // modules/services/osm.js
74314   var import_rbush9 = __toESM(require_rbush_min());
74315   var tiler5 = utilTiler();
74316   var dispatch7 = dispatch_default("apiStatusChange", "authLoading", "authDone", "change", "loading", "loaded", "loadedNotes");
74317   var urlroot = osmApiConnections[0].url;
74318   var redirectPath = window.location.origin + window.location.pathname;
74319   var oauth = osmAuth({
74320     url: urlroot,
74321     client_id: osmApiConnections[0].client_id,
74322     client_secret: osmApiConnections[0].client_secret,
74323     scope: "read_prefs write_prefs write_api read_gpx write_notes",
74324     redirect_uri: redirectPath + "land.html",
74325     loading: authLoading,
74326     done: authDone
74327   });
74328   var _apiConnections = osmApiConnections;
74329   var _imageryBlocklists = [/.*\.google(apis)?\..*\/(vt|kh)[\?\/].*([xyz]=.*){3}.*/];
74330   var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new import_rbush9.default() };
74331   var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new import_rbush9.default() };
74332   var _userCache = { toLoad: {}, user: {} };
74333   var _cachedApiStatus;
74334   var _changeset = {};
74335   var _deferred = /* @__PURE__ */ new Set();
74336   var _connectionID = 1;
74337   var _tileZoom4 = 16;
74338   var _noteZoom = 12;
74339   var _rateLimitError;
74340   var _userChangesets;
74341   var _userDetails;
74342   var _off;
74343   var _maxWayNodes = 2e3;
74344   function authLoading() {
74345     dispatch7.call("authLoading");
74346   }
74347   function authDone() {
74348     dispatch7.call("authDone");
74349   }
74350   function abortRequest5(controllerOrXHR) {
74351     if (controllerOrXHR) {
74352       controllerOrXHR.abort();
74353     }
74354   }
74355   function hasInflightRequests(cache) {
74356     return Object.keys(cache.inflight).length;
74357   }
74358   function abortUnwantedRequests4(cache, visibleTiles) {
74359     Object.keys(cache.inflight).forEach(function(k) {
74360       if (cache.toLoad[k])
74361         return;
74362       if (visibleTiles.find(function(tile) {
74363         return k === tile.id;
74364       }))
74365         return;
74366       abortRequest5(cache.inflight[k]);
74367       delete cache.inflight[k];
74368     });
74369   }
74370   function getLoc(attrs) {
74371     var lon = attrs.lon && attrs.lon.value;
74372     var lat = attrs.lat && attrs.lat.value;
74373     return [Number(lon), Number(lat)];
74374   }
74375   function getNodes(obj) {
74376     var elems = obj.getElementsByTagName("nd");
74377     var nodes = new Array(elems.length);
74378     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
74379       nodes[i2] = "n" + elems[i2].attributes.ref.value;
74380     }
74381     return nodes;
74382   }
74383   function getNodesJSON(obj) {
74384     var elems = obj.nodes;
74385     var nodes = new Array(elems.length);
74386     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
74387       nodes[i2] = "n" + elems[i2];
74388     }
74389     return nodes;
74390   }
74391   function getTags(obj) {
74392     var elems = obj.getElementsByTagName("tag");
74393     var tags = {};
74394     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
74395       var attrs = elems[i2].attributes;
74396       tags[attrs.k.value] = attrs.v.value;
74397     }
74398     return tags;
74399   }
74400   function getMembers(obj) {
74401     var elems = obj.getElementsByTagName("member");
74402     var members = new Array(elems.length);
74403     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
74404       var attrs = elems[i2].attributes;
74405       members[i2] = {
74406         id: attrs.type.value[0] + attrs.ref.value,
74407         type: attrs.type.value,
74408         role: attrs.role.value
74409       };
74410     }
74411     return members;
74412   }
74413   function getMembersJSON(obj) {
74414     var elems = obj.members;
74415     var members = new Array(elems.length);
74416     for (var i2 = 0, l = elems.length; i2 < l; i2++) {
74417       var attrs = elems[i2];
74418       members[i2] = {
74419         id: attrs.type[0] + attrs.ref,
74420         type: attrs.type,
74421         role: attrs.role
74422       };
74423     }
74424     return members;
74425   }
74426   function getVisible(attrs) {
74427     return !attrs.visible || attrs.visible.value !== "false";
74428   }
74429   function parseComments(comments) {
74430     var parsedComments = [];
74431     for (var i2 = 0; i2 < comments.length; i2++) {
74432       var comment = comments[i2];
74433       if (comment.nodeName === "comment") {
74434         var childNodes = comment.childNodes;
74435         var parsedComment = {};
74436         for (var j2 = 0; j2 < childNodes.length; j2++) {
74437           var node = childNodes[j2];
74438           var nodeName = node.nodeName;
74439           if (nodeName === "#text")
74440             continue;
74441           parsedComment[nodeName] = node.textContent;
74442           if (nodeName === "uid") {
74443             var uid = node.textContent;
74444             if (uid && !_userCache.user[uid]) {
74445               _userCache.toLoad[uid] = true;
74446             }
74447           }
74448         }
74449         if (parsedComment) {
74450           parsedComments.push(parsedComment);
74451         }
74452       }
74453     }
74454     return parsedComments;
74455   }
74456   function encodeNoteRtree(note) {
74457     return {
74458       minX: note.loc[0],
74459       minY: note.loc[1],
74460       maxX: note.loc[0],
74461       maxY: note.loc[1],
74462       data: note
74463     };
74464   }
74465   var jsonparsers = {
74466     node: function nodeData(obj, uid) {
74467       return new osmNode({
74468         id: uid,
74469         visible: typeof obj.visible === "boolean" ? obj.visible : true,
74470         version: obj.version && obj.version.toString(),
74471         changeset: obj.changeset && obj.changeset.toString(),
74472         timestamp: obj.timestamp,
74473         user: obj.user,
74474         uid: obj.uid && obj.uid.toString(),
74475         loc: [Number(obj.lon), Number(obj.lat)],
74476         tags: obj.tags
74477       });
74478     },
74479     way: function wayData(obj, uid) {
74480       return new osmWay({
74481         id: uid,
74482         visible: typeof obj.visible === "boolean" ? obj.visible : true,
74483         version: obj.version && obj.version.toString(),
74484         changeset: obj.changeset && obj.changeset.toString(),
74485         timestamp: obj.timestamp,
74486         user: obj.user,
74487         uid: obj.uid && obj.uid.toString(),
74488         tags: obj.tags,
74489         nodes: getNodesJSON(obj)
74490       });
74491     },
74492     relation: function relationData(obj, uid) {
74493       return new osmRelation({
74494         id: uid,
74495         visible: typeof obj.visible === "boolean" ? obj.visible : true,
74496         version: obj.version && obj.version.toString(),
74497         changeset: obj.changeset && obj.changeset.toString(),
74498         timestamp: obj.timestamp,
74499         user: obj.user,
74500         uid: obj.uid && obj.uid.toString(),
74501         tags: obj.tags,
74502         members: getMembersJSON(obj)
74503       });
74504     },
74505     user: function parseUser(obj, uid) {
74506       return {
74507         id: uid,
74508         display_name: obj.display_name,
74509         account_created: obj.account_created,
74510         image_url: obj.img && obj.img.href,
74511         changesets_count: obj.changesets && obj.changesets.count && obj.changesets.count.toString() || "0",
74512         active_blocks: obj.blocks && obj.blocks.received && obj.blocks.received.active && obj.blocks.received.active.toString() || "0"
74513       };
74514     }
74515   };
74516   function parseJSON(payload, callback, options2) {
74517     options2 = Object.assign({ skipSeen: true }, options2);
74518     if (!payload) {
74519       return callback({ message: "No JSON", status: -1 });
74520     }
74521     var json = payload;
74522     if (typeof json !== "object")
74523       json = JSON.parse(payload);
74524     if (!json.elements)
74525       return callback({ message: "No JSON", status: -1 });
74526     var children2 = json.elements;
74527     var handle = window.requestIdleCallback(function() {
74528       _deferred.delete(handle);
74529       var results = [];
74530       var result;
74531       for (var i2 = 0; i2 < children2.length; i2++) {
74532         result = parseChild(children2[i2]);
74533         if (result)
74534           results.push(result);
74535       }
74536       callback(null, results);
74537     });
74538     _deferred.add(handle);
74539     function parseChild(child) {
74540       var parser3 = jsonparsers[child.type];
74541       if (!parser3)
74542         return null;
74543       var uid;
74544       uid = osmEntity.id.fromOSM(child.type, child.id);
74545       if (options2.skipSeen) {
74546         if (_tileCache.seen[uid])
74547           return null;
74548         _tileCache.seen[uid] = true;
74549       }
74550       return parser3(child, uid);
74551     }
74552   }
74553   function parseUserJSON(payload, callback, options2) {
74554     options2 = Object.assign({ skipSeen: true }, options2);
74555     if (!payload) {
74556       return callback({ message: "No JSON", status: -1 });
74557     }
74558     var json = payload;
74559     if (typeof json !== "object")
74560       json = JSON.parse(payload);
74561     if (!json.users && !json.user)
74562       return callback({ message: "No JSON", status: -1 });
74563     var objs = json.users || [json];
74564     var handle = window.requestIdleCallback(function() {
74565       _deferred.delete(handle);
74566       var results = [];
74567       var result;
74568       for (var i2 = 0; i2 < objs.length; i2++) {
74569         result = parseObj(objs[i2]);
74570         if (result)
74571           results.push(result);
74572       }
74573       callback(null, results);
74574     });
74575     _deferred.add(handle);
74576     function parseObj(obj) {
74577       var uid = obj.user.id && obj.user.id.toString();
74578       if (options2.skipSeen && _userCache.user[uid]) {
74579         delete _userCache.toLoad[uid];
74580         return null;
74581       }
74582       var user = jsonparsers.user(obj.user, uid);
74583       _userCache.user[uid] = user;
74584       delete _userCache.toLoad[uid];
74585       return user;
74586     }
74587   }
74588   var parsers = {
74589     node: function nodeData2(obj, uid) {
74590       var attrs = obj.attributes;
74591       return new osmNode({
74592         id: uid,
74593         visible: getVisible(attrs),
74594         version: attrs.version.value,
74595         changeset: attrs.changeset && attrs.changeset.value,
74596         timestamp: attrs.timestamp && attrs.timestamp.value,
74597         user: attrs.user && attrs.user.value,
74598         uid: attrs.uid && attrs.uid.value,
74599         loc: getLoc(attrs),
74600         tags: getTags(obj)
74601       });
74602     },
74603     way: function wayData2(obj, uid) {
74604       var attrs = obj.attributes;
74605       return new osmWay({
74606         id: uid,
74607         visible: getVisible(attrs),
74608         version: attrs.version.value,
74609         changeset: attrs.changeset && attrs.changeset.value,
74610         timestamp: attrs.timestamp && attrs.timestamp.value,
74611         user: attrs.user && attrs.user.value,
74612         uid: attrs.uid && attrs.uid.value,
74613         tags: getTags(obj),
74614         nodes: getNodes(obj)
74615       });
74616     },
74617     relation: function relationData2(obj, uid) {
74618       var attrs = obj.attributes;
74619       return new osmRelation({
74620         id: uid,
74621         visible: getVisible(attrs),
74622         version: attrs.version.value,
74623         changeset: attrs.changeset && attrs.changeset.value,
74624         timestamp: attrs.timestamp && attrs.timestamp.value,
74625         user: attrs.user && attrs.user.value,
74626         uid: attrs.uid && attrs.uid.value,
74627         tags: getTags(obj),
74628         members: getMembers(obj)
74629       });
74630     },
74631     note: function parseNote(obj, uid) {
74632       var attrs = obj.attributes;
74633       var childNodes = obj.childNodes;
74634       var props = {};
74635       props.id = uid;
74636       props.loc = getLoc(attrs);
74637       var coincident = false;
74638       var epsilon3 = 1e-5;
74639       do {
74640         if (coincident) {
74641           props.loc = geoVecAdd(props.loc, [epsilon3, epsilon3]);
74642         }
74643         var bbox2 = geoExtent(props.loc).bbox();
74644         coincident = _noteCache.rtree.search(bbox2).length;
74645       } while (coincident);
74646       for (var i2 = 0; i2 < childNodes.length; i2++) {
74647         var node = childNodes[i2];
74648         var nodeName = node.nodeName;
74649         if (nodeName === "#text")
74650           continue;
74651         if (nodeName === "comments") {
74652           props[nodeName] = parseComments(node.childNodes);
74653         } else {
74654           props[nodeName] = node.textContent;
74655         }
74656       }
74657       var note = new osmNote(props);
74658       var item = encodeNoteRtree(note);
74659       _noteCache.note[note.id] = note;
74660       _noteCache.rtree.insert(item);
74661       return note;
74662     },
74663     user: function parseUser2(obj, uid) {
74664       var attrs = obj.attributes;
74665       var user = {
74666         id: uid,
74667         display_name: attrs.display_name && attrs.display_name.value,
74668         account_created: attrs.account_created && attrs.account_created.value,
74669         changesets_count: "0",
74670         active_blocks: "0"
74671       };
74672       var img = obj.getElementsByTagName("img");
74673       if (img && img[0] && img[0].getAttribute("href")) {
74674         user.image_url = img[0].getAttribute("href");
74675       }
74676       var changesets = obj.getElementsByTagName("changesets");
74677       if (changesets && changesets[0] && changesets[0].getAttribute("count")) {
74678         user.changesets_count = changesets[0].getAttribute("count");
74679       }
74680       var blocks = obj.getElementsByTagName("blocks");
74681       if (blocks && blocks[0]) {
74682         var received = blocks[0].getElementsByTagName("received");
74683         if (received && received[0] && received[0].getAttribute("active")) {
74684           user.active_blocks = received[0].getAttribute("active");
74685         }
74686       }
74687       _userCache.user[uid] = user;
74688       delete _userCache.toLoad[uid];
74689       return user;
74690     }
74691   };
74692   function parseXML(xml, callback, options2) {
74693     options2 = Object.assign({ skipSeen: true }, options2);
74694     if (!xml || !xml.childNodes) {
74695       return callback({ message: "No XML", status: -1 });
74696     }
74697     var root3 = xml.childNodes[0];
74698     var children2 = root3.childNodes;
74699     var handle = window.requestIdleCallback(function() {
74700       _deferred.delete(handle);
74701       var results = [];
74702       var result;
74703       for (var i2 = 0; i2 < children2.length; i2++) {
74704         result = parseChild(children2[i2]);
74705         if (result)
74706           results.push(result);
74707       }
74708       callback(null, results);
74709     });
74710     _deferred.add(handle);
74711     function parseChild(child) {
74712       var parser3 = parsers[child.nodeName];
74713       if (!parser3)
74714         return null;
74715       var uid;
74716       if (child.nodeName === "user") {
74717         uid = child.attributes.id.value;
74718         if (options2.skipSeen && _userCache.user[uid]) {
74719           delete _userCache.toLoad[uid];
74720           return null;
74721         }
74722       } else if (child.nodeName === "note") {
74723         uid = child.getElementsByTagName("id")[0].textContent;
74724       } else {
74725         uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
74726         if (options2.skipSeen) {
74727           if (_tileCache.seen[uid])
74728             return null;
74729           _tileCache.seen[uid] = true;
74730         }
74731       }
74732       return parser3(child, uid);
74733     }
74734   }
74735   function updateRtree4(item, replace) {
74736     _noteCache.rtree.remove(item, function isEql(a, b) {
74737       return a.data.id === b.data.id;
74738     });
74739     if (replace) {
74740       _noteCache.rtree.insert(item);
74741     }
74742   }
74743   function wrapcb(thisArg, callback, cid) {
74744     return function(err, result) {
74745       if (err) {
74746         if (err.status === 400 || err.status === 401 || err.status === 403) {
74747           thisArg.logout();
74748         }
74749         return callback.call(thisArg, err);
74750       } else if (thisArg.getConnectionId() !== cid) {
74751         return callback.call(thisArg, { message: "Connection Switched", status: -1 });
74752       } else {
74753         return callback.call(thisArg, err, result);
74754       }
74755     };
74756   }
74757   var osm_default = {
74758     init: function() {
74759       utilRebind(this, dispatch7, "on");
74760     },
74761     reset: function() {
74762       Array.from(_deferred).forEach(function(handle) {
74763         window.cancelIdleCallback(handle);
74764         _deferred.delete(handle);
74765       });
74766       _connectionID++;
74767       _userChangesets = void 0;
74768       _userDetails = void 0;
74769       _rateLimitError = void 0;
74770       Object.values(_tileCache.inflight).forEach(abortRequest5);
74771       Object.values(_noteCache.inflight).forEach(abortRequest5);
74772       Object.values(_noteCache.inflightPost).forEach(abortRequest5);
74773       if (_changeset.inflight)
74774         abortRequest5(_changeset.inflight);
74775       _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: new import_rbush9.default() };
74776       _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: new import_rbush9.default() };
74777       _userCache = { toLoad: {}, user: {} };
74778       _cachedApiStatus = void 0;
74779       _changeset = {};
74780       return this;
74781     },
74782     getConnectionId: function() {
74783       return _connectionID;
74784     },
74785     getUrlRoot: function() {
74786       return urlroot;
74787     },
74788     changesetURL: function(changesetID) {
74789       return urlroot + "/changeset/" + changesetID;
74790     },
74791     changesetsURL: function(center, zoom) {
74792       var precision2 = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
74793       return urlroot + "/history#map=" + Math.floor(zoom) + "/" + center[1].toFixed(precision2) + "/" + center[0].toFixed(precision2);
74794     },
74795     entityURL: function(entity) {
74796       return urlroot + "/" + entity.type + "/" + entity.osmId();
74797     },
74798     historyURL: function(entity) {
74799       return urlroot + "/" + entity.type + "/" + entity.osmId() + "/history";
74800     },
74801     userURL: function(username) {
74802       return urlroot + "/user/" + encodeURIComponent(username);
74803     },
74804     noteURL: function(note) {
74805       return urlroot + "/note/" + note.id;
74806     },
74807     noteReportURL: function(note) {
74808       return urlroot + "/reports/new?reportable_type=Note&reportable_id=" + note.id;
74809     },
74810     // Generic method to load data from the OSM API
74811     // Can handle either auth or unauth calls.
74812     loadFromAPI: function(path, callback, options2) {
74813       options2 = Object.assign({ skipSeen: true }, options2);
74814       var that = this;
74815       var cid = _connectionID;
74816       function done(err, payload) {
74817         if (that.getConnectionId() !== cid) {
74818           if (callback)
74819             callback({ message: "Connection Switched", status: -1 });
74820           return;
74821         }
74822         var isAuthenticated = that.authenticated();
74823         if (isAuthenticated && err && err.status && (err.status === 400 || err.status === 401 || err.status === 403)) {
74824           that.logout();
74825           that.loadFromAPI(path, callback, options2);
74826         } else {
74827           if (!isAuthenticated && !_rateLimitError && err && err.status && (err.status === 509 || err.status === 429)) {
74828             _rateLimitError = err;
74829             dispatch7.call("change");
74830             that.reloadApiStatus();
74831           } else if (err && _cachedApiStatus === "online" || !err && _cachedApiStatus !== "online") {
74832             that.reloadApiStatus();
74833           }
74834           if (callback) {
74835             if (err) {
74836               return callback(err);
74837             } else {
74838               if (path.indexOf(".json") !== -1) {
74839                 return parseJSON(payload, callback, options2);
74840               } else {
74841                 return parseXML(payload, callback, options2);
74842               }
74843             }
74844           }
74845         }
74846       }
74847       if (this.authenticated()) {
74848         return oauth.xhr({ method: "GET", path }, done);
74849       } else {
74850         var url = urlroot + path;
74851         var controller = new AbortController();
74852         var fn;
74853         if (path.indexOf(".json") !== -1) {
74854           fn = json_default;
74855         } else {
74856           fn = xml_default;
74857         }
74858         fn(url, { signal: controller.signal }).then(function(data) {
74859           done(null, data);
74860         }).catch(function(err) {
74861           if (err.name === "AbortError")
74862             return;
74863           var match = err.message.match(/^\d{3}/);
74864           if (match) {
74865             done({ status: +match[0], statusText: err.message });
74866           } else {
74867             done(err.message);
74868           }
74869         });
74870         return controller;
74871       }
74872     },
74873     // Load a single entity by id (ways and relations use the `/full` call to include
74874     // nodes and members). Parent relations are not included, see `loadEntityRelations`.
74875     // GET /api/0.6/node/#id
74876     // GET /api/0.6/[way|relation]/#id/full
74877     loadEntity: function(id2, callback) {
74878       var type2 = osmEntity.id.type(id2);
74879       var osmID = osmEntity.id.toOSM(id2);
74880       var options2 = { skipSeen: false };
74881       this.loadFromAPI(
74882         "/api/0.6/" + type2 + "/" + osmID + (type2 !== "node" ? "/full" : "") + ".json",
74883         function(err, entities) {
74884           if (callback)
74885             callback(err, { data: entities });
74886         },
74887         options2
74888       );
74889     },
74890     // Load a single entity with a specific version
74891     // GET /api/0.6/[node|way|relation]/#id/#version
74892     loadEntityVersion: function(id2, version, callback) {
74893       var type2 = osmEntity.id.type(id2);
74894       var osmID = osmEntity.id.toOSM(id2);
74895       var options2 = { skipSeen: false };
74896       this.loadFromAPI(
74897         "/api/0.6/" + type2 + "/" + osmID + "/" + version + ".json",
74898         function(err, entities) {
74899           if (callback)
74900             callback(err, { data: entities });
74901         },
74902         options2
74903       );
74904     },
74905     // Load the relations of a single entity with the given.
74906     // GET /api/0.6/[node|way|relation]/#id/relations
74907     loadEntityRelations: function(id2, callback) {
74908       var type2 = osmEntity.id.type(id2);
74909       var osmID = osmEntity.id.toOSM(id2);
74910       var options2 = { skipSeen: false };
74911       this.loadFromAPI(
74912         "/api/0.6/" + type2 + "/" + osmID + "/relations.json",
74913         function(err, entities) {
74914           if (callback)
74915             callback(err, { data: entities });
74916         },
74917         options2
74918       );
74919     },
74920     // Load multiple entities in chunks
74921     // (note: callback may be called multiple times)
74922     // Unlike `loadEntity`, child nodes and members are not fetched
74923     // GET /api/0.6/[nodes|ways|relations]?#parameters
74924     loadMultiple: function(ids, callback) {
74925       var that = this;
74926       var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
74927       Object.keys(groups).forEach(function(k) {
74928         var type2 = k + "s";
74929         var osmIDs = groups[k].map(function(id2) {
74930           return osmEntity.id.toOSM(id2);
74931         });
74932         var options2 = { skipSeen: false };
74933         utilArrayChunk(osmIDs, 150).forEach(function(arr) {
74934           that.loadFromAPI(
74935             "/api/0.6/" + type2 + ".json?" + type2 + "=" + arr.join(),
74936             function(err, entities) {
74937               if (callback)
74938                 callback(err, { data: entities });
74939             },
74940             options2
74941           );
74942         });
74943       });
74944     },
74945     // Create, upload, and close a changeset
74946     // PUT /api/0.6/changeset/create
74947     // POST /api/0.6/changeset/#id/upload
74948     // PUT /api/0.6/changeset/#id/close
74949     putChangeset: function(changeset, changes, callback) {
74950       var cid = _connectionID;
74951       if (_changeset.inflight) {
74952         return callback({ message: "Changeset already inflight", status: -2 }, changeset);
74953       } else if (_changeset.open) {
74954         return createdChangeset.call(this, null, _changeset.open);
74955       } else {
74956         var options2 = {
74957           method: "PUT",
74958           path: "/api/0.6/changeset/create",
74959           headers: { "Content-Type": "text/xml" },
74960           content: JXON.stringify(changeset.asJXON())
74961         };
74962         _changeset.inflight = oauth.xhr(
74963           options2,
74964           wrapcb(this, createdChangeset, cid)
74965         );
74966       }
74967       function createdChangeset(err, changesetID) {
74968         _changeset.inflight = null;
74969         if (err) {
74970           return callback(err, changeset);
74971         }
74972         _changeset.open = changesetID;
74973         changeset = changeset.update({ id: changesetID });
74974         var options3 = {
74975           method: "POST",
74976           path: "/api/0.6/changeset/" + changesetID + "/upload",
74977           headers: { "Content-Type": "text/xml" },
74978           content: JXON.stringify(changeset.osmChangeJXON(changes))
74979         };
74980         _changeset.inflight = oauth.xhr(
74981           options3,
74982           wrapcb(this, uploadedChangeset, cid)
74983         );
74984       }
74985       function uploadedChangeset(err) {
74986         _changeset.inflight = null;
74987         if (err)
74988           return callback(err, changeset);
74989         window.setTimeout(function() {
74990           callback(null, changeset);
74991         }, 2500);
74992         _changeset.open = null;
74993         if (this.getConnectionId() === cid) {
74994           oauth.xhr({
74995             method: "PUT",
74996             path: "/api/0.6/changeset/" + changeset.id + "/close",
74997             headers: { "Content-Type": "text/xml" }
74998           }, function() {
74999             return true;
75000           });
75001         }
75002       }
75003     },
75004     // Load multiple users in chunks
75005     // (note: callback may be called multiple times)
75006     // GET /api/0.6/users?users=#id1,#id2,...,#idn
75007     loadUsers: function(uids, callback) {
75008       var toLoad = [];
75009       var cached = [];
75010       utilArrayUniq(uids).forEach(function(uid) {
75011         if (_userCache.user[uid]) {
75012           delete _userCache.toLoad[uid];
75013           cached.push(_userCache.user[uid]);
75014         } else {
75015           toLoad.push(uid);
75016         }
75017       });
75018       if (cached.length || !this.authenticated()) {
75019         callback(void 0, cached);
75020         if (!this.authenticated())
75021           return;
75022       }
75023       utilArrayChunk(toLoad, 150).forEach(function(arr) {
75024         oauth.xhr(
75025           { method: "GET", path: "/api/0.6/users.json?users=" + arr.join() },
75026           wrapcb(this, done, _connectionID)
75027         );
75028       }.bind(this));
75029       function done(err, payload) {
75030         if (err)
75031           return callback(err);
75032         var options2 = { skipSeen: true };
75033         return parseUserJSON(payload, function(err2, results) {
75034           if (err2)
75035             return callback(err2);
75036           return callback(void 0, results);
75037         }, options2);
75038       }
75039     },
75040     // Load a given user by id
75041     // GET /api/0.6/user/#id
75042     loadUser: function(uid, callback) {
75043       if (_userCache.user[uid] || !this.authenticated()) {
75044         delete _userCache.toLoad[uid];
75045         return callback(void 0, _userCache.user[uid]);
75046       }
75047       oauth.xhr(
75048         { method: "GET", path: "/api/0.6/user/" + uid + ".json" },
75049         wrapcb(this, done, _connectionID)
75050       );
75051       function done(err, payload) {
75052         if (err)
75053           return callback(err);
75054         var options2 = { skipSeen: true };
75055         return parseUserJSON(payload, function(err2, results) {
75056           if (err2)
75057             return callback(err2);
75058           return callback(void 0, results[0]);
75059         }, options2);
75060       }
75061     },
75062     // Load the details of the logged-in user
75063     // GET /api/0.6/user/details
75064     userDetails: function(callback) {
75065       if (_userDetails) {
75066         return callback(void 0, _userDetails);
75067       }
75068       oauth.xhr(
75069         { method: "GET", path: "/api/0.6/user/details.json" },
75070         wrapcb(this, done, _connectionID)
75071       );
75072       function done(err, payload) {
75073         if (err)
75074           return callback(err);
75075         var options2 = { skipSeen: false };
75076         return parseUserJSON(payload, function(err2, results) {
75077           if (err2)
75078             return callback(err2);
75079           _userDetails = results[0];
75080           return callback(void 0, _userDetails);
75081         }, options2);
75082       }
75083     },
75084     // Load previous changesets for the logged in user
75085     // GET /api/0.6/changesets?user=#id
75086     userChangesets: function(callback) {
75087       if (_userChangesets) {
75088         return callback(void 0, _userChangesets);
75089       }
75090       this.userDetails(
75091         wrapcb(this, gotDetails, _connectionID)
75092       );
75093       function gotDetails(err, user) {
75094         if (err) {
75095           return callback(err);
75096         }
75097         oauth.xhr(
75098           { method: "GET", path: "/api/0.6/changesets?user=" + user.id },
75099           wrapcb(this, done, _connectionID)
75100         );
75101       }
75102       function done(err, xml) {
75103         if (err) {
75104           return callback(err);
75105         }
75106         _userChangesets = Array.prototype.map.call(
75107           xml.getElementsByTagName("changeset"),
75108           function(changeset) {
75109             return { tags: getTags(changeset) };
75110           }
75111         ).filter(function(changeset) {
75112           var comment = changeset.tags.comment;
75113           return comment && comment !== "";
75114         });
75115         return callback(void 0, _userChangesets);
75116       }
75117     },
75118     // Fetch the status of the OSM API
75119     // GET /api/capabilities
75120     status: function(callback) {
75121       var url = urlroot + "/api/capabilities";
75122       var errback = wrapcb(this, done, _connectionID);
75123       xml_default(url).then(function(data) {
75124         errback(null, data);
75125       }).catch(function(err) {
75126         errback(err.message);
75127       });
75128       function done(err, xml) {
75129         if (err) {
75130           return callback(err, null);
75131         }
75132         var elements = xml.getElementsByTagName("blacklist");
75133         var regexes = [];
75134         for (var i2 = 0; i2 < elements.length; i2++) {
75135           var regexString = elements[i2].getAttribute("regex");
75136           if (regexString) {
75137             try {
75138               var regex = new RegExp(regexString);
75139               regexes.push(regex);
75140             } catch (e) {
75141             }
75142           }
75143         }
75144         if (regexes.length) {
75145           _imageryBlocklists = regexes;
75146         }
75147         if (_rateLimitError) {
75148           return callback(_rateLimitError, "rateLimited");
75149         } else {
75150           var waynodes = xml.getElementsByTagName("waynodes");
75151           var maxWayNodes = waynodes.length && parseInt(waynodes[0].getAttribute("maximum"), 10);
75152           if (maxWayNodes && isFinite(maxWayNodes))
75153             _maxWayNodes = maxWayNodes;
75154           var apiStatus = xml.getElementsByTagName("status");
75155           var val = apiStatus[0].getAttribute("api");
75156           return callback(void 0, val);
75157         }
75158       }
75159     },
75160     // Calls `status` and dispatches an `apiStatusChange` event if the returned
75161     // status differs from the cached status.
75162     reloadApiStatus: function() {
75163       if (!this.throttledReloadApiStatus) {
75164         var that = this;
75165         this.throttledReloadApiStatus = throttle_default(function() {
75166           that.status(function(err, status) {
75167             if (status !== _cachedApiStatus) {
75168               _cachedApiStatus = status;
75169               dispatch7.call("apiStatusChange", that, err, status);
75170             }
75171           });
75172         }, 500);
75173       }
75174       this.throttledReloadApiStatus();
75175     },
75176     // Returns the maximum number of nodes a single way can have
75177     maxWayNodes: function() {
75178       return _maxWayNodes;
75179     },
75180     // Load data (entities) from the API in tiles
75181     // GET /api/0.6/map?bbox=
75182     loadTiles: function(projection2, callback) {
75183       if (_off)
75184         return;
75185       var tiles = tiler5.zoomExtent([_tileZoom4, _tileZoom4]).getTiles(projection2);
75186       var hadRequests = hasInflightRequests(_tileCache);
75187       abortUnwantedRequests4(_tileCache, tiles);
75188       if (hadRequests && !hasInflightRequests(_tileCache)) {
75189         dispatch7.call("loaded");
75190       }
75191       tiles.forEach(function(tile) {
75192         this.loadTile(tile, callback);
75193       }, this);
75194     },
75195     // Load a single data tile
75196     // GET /api/0.6/map?bbox=
75197     loadTile: function(tile, callback) {
75198       if (_off)
75199         return;
75200       if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id])
75201         return;
75202       if (!hasInflightRequests(_tileCache)) {
75203         dispatch7.call("loading");
75204       }
75205       var path = "/api/0.6/map.json?bbox=";
75206       var options2 = { skipSeen: true };
75207       _tileCache.inflight[tile.id] = this.loadFromAPI(
75208         path + tile.extent.toParam(),
75209         tileCallback,
75210         options2
75211       );
75212       function tileCallback(err, parsed) {
75213         delete _tileCache.inflight[tile.id];
75214         if (!err) {
75215           delete _tileCache.toLoad[tile.id];
75216           _tileCache.loaded[tile.id] = true;
75217           var bbox2 = tile.extent.bbox();
75218           bbox2.id = tile.id;
75219           _tileCache.rtree.insert(bbox2);
75220         }
75221         if (callback) {
75222           callback(err, Object.assign({ data: parsed }, tile));
75223         }
75224         if (!hasInflightRequests(_tileCache)) {
75225           dispatch7.call("loaded");
75226         }
75227       }
75228     },
75229     isDataLoaded: function(loc) {
75230       var bbox2 = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
75231       return _tileCache.rtree.collides(bbox2);
75232     },
75233     // load the tile that covers the given `loc`
75234     loadTileAtLoc: function(loc, callback) {
75235       if (Object.keys(_tileCache.toLoad).length > 50)
75236         return;
75237       var k = geoZoomToScale(_tileZoom4 + 1);
75238       var offset = geoRawMercator().scale(k)(loc);
75239       var projection2 = geoRawMercator().transform({ k, x: -offset[0], y: -offset[1] });
75240       var tiles = tiler5.zoomExtent([_tileZoom4, _tileZoom4]).getTiles(projection2);
75241       tiles.forEach(function(tile) {
75242         if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id])
75243           return;
75244         _tileCache.toLoad[tile.id] = true;
75245         this.loadTile(tile, callback);
75246       }, this);
75247     },
75248     // Load notes from the API in tiles
75249     // GET /api/0.6/notes?bbox=
75250     loadNotes: function(projection2, noteOptions) {
75251       noteOptions = Object.assign({ limit: 1e4, closed: 7 }, noteOptions);
75252       if (_off)
75253         return;
75254       var that = this;
75255       var path = "/api/0.6/notes?limit=" + noteOptions.limit + "&closed=" + noteOptions.closed + "&bbox=";
75256       var throttleLoadUsers = throttle_default(function() {
75257         var uids = Object.keys(_userCache.toLoad);
75258         if (!uids.length)
75259           return;
75260         that.loadUsers(uids, function() {
75261         });
75262       }, 750);
75263       var tiles = tiler5.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection2);
75264       abortUnwantedRequests4(_noteCache, tiles);
75265       tiles.forEach(function(tile) {
75266         if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id])
75267           return;
75268         var options2 = { skipSeen: false };
75269         _noteCache.inflight[tile.id] = that.loadFromAPI(
75270           path + tile.extent.toParam(),
75271           function(err) {
75272             delete _noteCache.inflight[tile.id];
75273             if (!err) {
75274               _noteCache.loaded[tile.id] = true;
75275             }
75276             throttleLoadUsers();
75277             dispatch7.call("loadedNotes");
75278           },
75279           options2
75280         );
75281       });
75282     },
75283     // Create a note
75284     // POST /api/0.6/notes?params
75285     postNoteCreate: function(note, callback) {
75286       if (!this.authenticated()) {
75287         return callback({ message: "Not Authenticated", status: -3 }, note);
75288       }
75289       if (_noteCache.inflightPost[note.id]) {
75290         return callback({ message: "Note update already inflight", status: -2 }, note);
75291       }
75292       if (!note.loc[0] || !note.loc[1] || !note.newComment)
75293         return;
75294       var comment = note.newComment;
75295       if (note.newCategory && note.newCategory !== "None") {
75296         comment += " #" + note.newCategory;
75297       }
75298       var path = "/api/0.6/notes?" + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
75299       _noteCache.inflightPost[note.id] = oauth.xhr(
75300         { method: "POST", path },
75301         wrapcb(this, done, _connectionID)
75302       );
75303       function done(err, xml) {
75304         delete _noteCache.inflightPost[note.id];
75305         if (err) {
75306           return callback(err);
75307         }
75308         this.removeNote(note);
75309         var options2 = { skipSeen: false };
75310         return parseXML(xml, function(err2, results) {
75311           if (err2) {
75312             return callback(err2);
75313           } else {
75314             return callback(void 0, results[0]);
75315           }
75316         }, options2);
75317       }
75318     },
75319     // Update a note
75320     // POST /api/0.6/notes/#id/comment?text=comment
75321     // POST /api/0.6/notes/#id/close?text=comment
75322     // POST /api/0.6/notes/#id/reopen?text=comment
75323     postNoteUpdate: function(note, newStatus, callback) {
75324       if (!this.authenticated()) {
75325         return callback({ message: "Not Authenticated", status: -3 }, note);
75326       }
75327       if (_noteCache.inflightPost[note.id]) {
75328         return callback({ message: "Note update already inflight", status: -2 }, note);
75329       }
75330       var action;
75331       if (note.status !== "closed" && newStatus === "closed") {
75332         action = "close";
75333       } else if (note.status !== "open" && newStatus === "open") {
75334         action = "reopen";
75335       } else {
75336         action = "comment";
75337         if (!note.newComment)
75338           return;
75339       }
75340       var path = "/api/0.6/notes/" + note.id + "/" + action;
75341       if (note.newComment) {
75342         path += "?" + utilQsString({ text: note.newComment });
75343       }
75344       _noteCache.inflightPost[note.id] = oauth.xhr(
75345         { method: "POST", path },
75346         wrapcb(this, done, _connectionID)
75347       );
75348       function done(err, xml) {
75349         delete _noteCache.inflightPost[note.id];
75350         if (err) {
75351           return callback(err);
75352         }
75353         this.removeNote(note);
75354         if (action === "close") {
75355           _noteCache.closed[note.id] = true;
75356         } else if (action === "reopen") {
75357           delete _noteCache.closed[note.id];
75358         }
75359         var options2 = { skipSeen: false };
75360         return parseXML(xml, function(err2, results) {
75361           if (err2) {
75362             return callback(err2);
75363           } else {
75364             return callback(void 0, results[0]);
75365           }
75366         }, options2);
75367       }
75368     },
75369     /* connection options for source switcher (optional) */
75370     apiConnections: function(val) {
75371       if (!arguments.length)
75372         return _apiConnections;
75373       _apiConnections = val;
75374       return this;
75375     },
75376     switch: function(newOptions) {
75377       urlroot = newOptions.url;
75378       var oldOptions = utilObjectOmit(oauth.options(), "access_token");
75379       oauth.options(Object.assign(oldOptions, newOptions));
75380       this.reset();
75381       this.userChangesets(function() {
75382       });
75383       dispatch7.call("change");
75384       return this;
75385     },
75386     toggle: function(val) {
75387       _off = !val;
75388       return this;
75389     },
75390     isChangesetInflight: function() {
75391       return !!_changeset.inflight;
75392     },
75393     // get/set cached data
75394     // This is used to save/restore the state when entering/exiting the walkthrough
75395     // Also used for testing purposes.
75396     caches: function(obj) {
75397       function cloneCache(source) {
75398         var target = {};
75399         Object.keys(source).forEach(function(k) {
75400           if (k === "rtree") {
75401             target.rtree = new import_rbush9.default().fromJSON(source.rtree.toJSON());
75402           } else if (k === "note") {
75403             target.note = {};
75404             Object.keys(source.note).forEach(function(id2) {
75405               target.note[id2] = osmNote(source.note[id2]);
75406             });
75407           } else {
75408             target[k] = JSON.parse(JSON.stringify(source[k]));
75409           }
75410         });
75411         return target;
75412       }
75413       if (!arguments.length) {
75414         return {
75415           tile: cloneCache(_tileCache),
75416           note: cloneCache(_noteCache),
75417           user: cloneCache(_userCache)
75418         };
75419       }
75420       if (obj === "get") {
75421         return {
75422           tile: _tileCache,
75423           note: _noteCache,
75424           user: _userCache
75425         };
75426       }
75427       if (obj.tile) {
75428         _tileCache = obj.tile;
75429         _tileCache.inflight = {};
75430       }
75431       if (obj.note) {
75432         _noteCache = obj.note;
75433         _noteCache.inflight = {};
75434         _noteCache.inflightPost = {};
75435       }
75436       if (obj.user) {
75437         _userCache = obj.user;
75438       }
75439       return this;
75440     },
75441     logout: function() {
75442       _userChangesets = void 0;
75443       _userDetails = void 0;
75444       oauth.logout();
75445       dispatch7.call("change");
75446       return this;
75447     },
75448     authenticated: function() {
75449       return oauth.authenticated();
75450     },
75451     authenticate: function(callback) {
75452       var that = this;
75453       var cid = _connectionID;
75454       _userChangesets = void 0;
75455       _userDetails = void 0;
75456       function done(err, res) {
75457         if (err) {
75458           if (callback)
75459             callback(err);
75460           return;
75461         }
75462         if (that.getConnectionId() !== cid) {
75463           if (callback)
75464             callback({ message: "Connection Switched", status: -1 });
75465           return;
75466         }
75467         _rateLimitError = void 0;
75468         dispatch7.call("change");
75469         if (callback)
75470           callback(err, res);
75471         that.userChangesets(function() {
75472         });
75473       }
75474       oauth.authenticate(done);
75475     },
75476     imageryBlocklists: function() {
75477       return _imageryBlocklists;
75478     },
75479     tileZoom: function(val) {
75480       if (!arguments.length)
75481         return _tileZoom4;
75482       _tileZoom4 = val;
75483       return this;
75484     },
75485     // get all cached notes covering the viewport
75486     notes: function(projection2) {
75487       var viewport = projection2.clipExtent();
75488       var min3 = [viewport[0][0], viewport[1][1]];
75489       var max3 = [viewport[1][0], viewport[0][1]];
75490       var bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
75491       return _noteCache.rtree.search(bbox2).map(function(d) {
75492         return d.data;
75493       });
75494     },
75495     // get a single note from the cache
75496     getNote: function(id2) {
75497       return _noteCache.note[id2];
75498     },
75499     // remove a single note from the cache
75500     removeNote: function(note) {
75501       if (!(note instanceof osmNote) || !note.id)
75502         return;
75503       delete _noteCache.note[note.id];
75504       updateRtree4(encodeNoteRtree(note), false);
75505     },
75506     // replace a single note in the cache
75507     replaceNote: function(note) {
75508       if (!(note instanceof osmNote) || !note.id)
75509         return;
75510       _noteCache.note[note.id] = note;
75511       updateRtree4(encodeNoteRtree(note), true);
75512       return note;
75513     },
75514     // Get an array of note IDs closed during this session.
75515     // Used to populate `closed:note` changeset tag
75516     getClosedIDs: function() {
75517       return Object.keys(_noteCache.closed).sort();
75518     }
75519   };
75520
75521   // modules/services/osm_wikibase.js
75522   var apibase3 = "https://wiki.openstreetmap.org/w/api.php";
75523   var _inflight2 = {};
75524   var _wikibaseCache = {};
75525   var _localeIDs = { en: false };
75526   var debouncedRequest = debounce_default(request, 500, { leading: false });
75527   function request(url, callback) {
75528     if (_inflight2[url])
75529       return;
75530     var controller = new AbortController();
75531     _inflight2[url] = controller;
75532     json_default(url, { signal: controller.signal }).then(function(result) {
75533       delete _inflight2[url];
75534       if (callback)
75535         callback(null, result);
75536     }).catch(function(err) {
75537       delete _inflight2[url];
75538       if (err.name === "AbortError")
75539         return;
75540       if (callback)
75541         callback(err.message);
75542     });
75543   }
75544   var osm_wikibase_default = {
75545     init: function() {
75546       _inflight2 = {};
75547       _wikibaseCache = {};
75548       _localeIDs = {};
75549     },
75550     reset: function() {
75551       Object.values(_inflight2).forEach(function(controller) {
75552         controller.abort();
75553       });
75554       _inflight2 = {};
75555     },
75556     /**
75557      * Get the best value for the property, or undefined if not found
75558      * @param entity object from wikibase
75559      * @param property string e.g. 'P4' for image
75560      * @param langCode string e.g. 'fr' for French
75561      */
75562     claimToValue: function(entity, property, langCode) {
75563       if (!entity.claims[property])
75564         return void 0;
75565       var locale2 = _localeIDs[langCode];
75566       var preferredPick, localePick;
75567       entity.claims[property].forEach(function(stmt) {
75568         if (!preferredPick && stmt.rank === "preferred") {
75569           preferredPick = stmt;
75570         }
75571         if (locale2 && stmt.qualifiers && stmt.qualifiers.P26 && stmt.qualifiers.P26[0].datavalue.value.id === locale2) {
75572           localePick = stmt;
75573         }
75574       });
75575       var result = localePick || preferredPick;
75576       if (result) {
75577         var datavalue = result.mainsnak.datavalue;
75578         return datavalue.type === "wikibase-entityid" ? datavalue.value.id : datavalue.value;
75579       } else {
75580         return void 0;
75581       }
75582     },
75583     /**
75584      * Convert monolingual property into a key-value object (language -> value)
75585      * @param entity object from wikibase
75586      * @param property string e.g. 'P31' for monolingual wiki page title
75587      */
75588     monolingualClaimToValueObj: function(entity, property) {
75589       if (!entity || !entity.claims[property])
75590         return void 0;
75591       return entity.claims[property].reduce(function(acc, obj) {
75592         var value = obj.mainsnak.datavalue.value;
75593         acc[value.language] = value.text;
75594         return acc;
75595       }, {});
75596     },
75597     toSitelink: function(key, value) {
75598       var result = value ? "Tag:" + key + "=" + value : "Key:" + key;
75599       return result.replace(/_/g, " ").trim();
75600     },
75601     //
75602     // Pass params object of the form:
75603     // {
75604     //   key: 'string',
75605     //   value: 'string',
75606     //   langCode: 'string'
75607     // }
75608     //
75609     getEntity: function(params, callback) {
75610       var doRequest = params.debounce ? debouncedRequest : request;
75611       var that = this;
75612       var titles = [];
75613       var result = {};
75614       var rtypeSitelink = params.key === "type" && params.value ? ("Relation:" + params.value).replace(/_/g, " ").trim() : false;
75615       var keySitelink = params.key ? this.toSitelink(params.key) : false;
75616       var tagSitelink = params.key && params.value ? this.toSitelink(params.key, params.value) : false;
75617       var localeSitelink;
75618       if (params.langCodes) {
75619         params.langCodes.forEach(function(langCode) {
75620           if (_localeIDs[langCode] === void 0) {
75621             localeSitelink = ("Locale:" + langCode).replace(/_/g, " ").trim();
75622             titles.push(localeSitelink);
75623           }
75624         });
75625       }
75626       if (rtypeSitelink) {
75627         if (_wikibaseCache[rtypeSitelink]) {
75628           result.rtype = _wikibaseCache[rtypeSitelink];
75629         } else {
75630           titles.push(rtypeSitelink);
75631         }
75632       }
75633       if (keySitelink) {
75634         if (_wikibaseCache[keySitelink]) {
75635           result.key = _wikibaseCache[keySitelink];
75636         } else {
75637           titles.push(keySitelink);
75638         }
75639       }
75640       if (tagSitelink) {
75641         if (_wikibaseCache[tagSitelink]) {
75642           result.tag = _wikibaseCache[tagSitelink];
75643         } else {
75644           titles.push(tagSitelink);
75645         }
75646       }
75647       if (!titles.length) {
75648         return callback(null, result);
75649       }
75650       var obj = {
75651         action: "wbgetentities",
75652         sites: "wiki",
75653         titles: titles.join("|"),
75654         languages: params.langCodes.join("|"),
75655         languagefallback: 1,
75656         origin: "*",
75657         format: "json"
75658         // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
75659         // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
75660         // formatversion: 2,
75661       };
75662       var url = apibase3 + "?" + utilQsString(obj);
75663       doRequest(url, function(err, d) {
75664         if (err) {
75665           callback(err);
75666         } else if (!d.success || d.error) {
75667           callback(d.error.messages.map(function(v) {
75668             return v.html["*"];
75669           }).join("<br>"));
75670         } else {
75671           var localeID = false;
75672           Object.values(d.entities).forEach(function(res) {
75673             if (res.missing !== "") {
75674               var title = res.sitelinks.wiki.title;
75675               if (title === rtypeSitelink) {
75676                 _wikibaseCache[rtypeSitelink] = res;
75677                 result.rtype = res;
75678               } else if (title === keySitelink) {
75679                 _wikibaseCache[keySitelink] = res;
75680                 result.key = res;
75681               } else if (title === tagSitelink) {
75682                 _wikibaseCache[tagSitelink] = res;
75683                 result.tag = res;
75684               } else if (title === localeSitelink) {
75685                 localeID = res.id;
75686               } else {
75687                 console.log("Unexpected title " + title);
75688               }
75689             }
75690           });
75691           if (localeSitelink) {
75692             that.addLocale(params.langCodes[0], localeID);
75693           }
75694           callback(null, result);
75695         }
75696       });
75697     },
75698     //
75699     // Pass params object of the form:
75700     // {
75701     //   key: 'string',     // required
75702     //   value: 'string'    // optional
75703     // }
75704     //
75705     // Get an result object used to display tag documentation
75706     // {
75707     //   title:        'string',
75708     //   description:  'string',
75709     //   editURL:      'string',
75710     //   imageURL:     'string',
75711     //   wiki:         { title: 'string', text: 'string', url: 'string' }
75712     // }
75713     //
75714     getDocs: function(params, callback) {
75715       var that = this;
75716       var langCodes = _mainLocalizer.localeCodes().map(function(code) {
75717         return code.toLowerCase();
75718       });
75719       params.langCodes = langCodes;
75720       this.getEntity(params, function(err, data) {
75721         if (err) {
75722           callback(err);
75723           return;
75724         }
75725         var entity = data.rtype || data.tag || data.key;
75726         if (!entity) {
75727           callback("No entity");
75728           return;
75729         }
75730         var i2;
75731         var description;
75732         for (i2 in langCodes) {
75733           let code2 = langCodes[i2];
75734           if (entity.descriptions[code2] && entity.descriptions[code2].language === code2) {
75735             description = entity.descriptions[code2];
75736             break;
75737           }
75738         }
75739         if (!description && Object.values(entity.descriptions).length)
75740           description = Object.values(entity.descriptions)[0];
75741         var result = {
75742           title: entity.title,
75743           description: description ? description.value : "",
75744           descriptionLocaleCode: description ? description.language : "",
75745           editURL: "https://wiki.openstreetmap.org/wiki/" + entity.title
75746         };
75747         if (entity.claims) {
75748           var imageroot;
75749           var image = that.claimToValue(entity, "P4", langCodes[0]);
75750           if (image) {
75751             imageroot = "https://commons.wikimedia.org/w/index.php";
75752           } else {
75753             image = that.claimToValue(entity, "P28", langCodes[0]);
75754             if (image) {
75755               imageroot = "https://wiki.openstreetmap.org/w/index.php";
75756             }
75757           }
75758           if (imageroot && image) {
75759             result.imageURL = imageroot + "?" + utilQsString({
75760               title: "Special:Redirect/file/" + image,
75761               width: 400
75762             });
75763           }
75764         }
75765         var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, "P31");
75766         var tagWiki = that.monolingualClaimToValueObj(data.tag, "P31");
75767         var keyWiki = that.monolingualClaimToValueObj(data.key, "P31");
75768         var wikis = [rtypeWiki, tagWiki, keyWiki];
75769         for (i2 in wikis) {
75770           var wiki = wikis[i2];
75771           for (var j2 in langCodes) {
75772             var code = langCodes[j2];
75773             var referenceId = langCodes[0].split("-")[0] !== "en" && code.split("-")[0] === "en" ? "inspector.wiki_en_reference" : "inspector.wiki_reference";
75774             var info = getWikiInfo(wiki, code, referenceId);
75775             if (info) {
75776               result.wiki = info;
75777               break;
75778             }
75779           }
75780           if (result.wiki)
75781             break;
75782         }
75783         callback(null, result);
75784         function getWikiInfo(wiki2, langCode, tKey) {
75785           if (wiki2 && wiki2[langCode]) {
75786             return {
75787               title: wiki2[langCode],
75788               text: tKey,
75789               url: "https://wiki.openstreetmap.org/wiki/" + wiki2[langCode]
75790             };
75791           }
75792         }
75793       });
75794     },
75795     addLocale: function(langCode, qid) {
75796       _localeIDs[langCode] = qid;
75797     },
75798     apibase: function(val) {
75799       if (!arguments.length)
75800         return apibase3;
75801       apibase3 = val;
75802       return this;
75803     }
75804   };
75805
75806   // modules/services/streetside.js
75807   var import_rbush10 = __toESM(require_rbush_min());
75808
75809   // modules/util/jsonp_request.js
75810   var jsonpCache = {};
75811   window.jsonpCache = jsonpCache;
75812   function jsonpRequest(url, callback) {
75813     var request3 = {
75814       abort: function() {
75815       }
75816     };
75817     if (window.JSONP_FIX) {
75818       if (window.JSONP_DELAY === 0) {
75819         callback(window.JSONP_FIX);
75820       } else {
75821         var t = window.setTimeout(function() {
75822           callback(window.JSONP_FIX);
75823         }, window.JSONP_DELAY || 0);
75824         request3.abort = function() {
75825           window.clearTimeout(t);
75826         };
75827       }
75828       return request3;
75829     }
75830     function rand() {
75831       var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
75832       var c = "";
75833       var i2 = -1;
75834       while (++i2 < 15)
75835         c += chars.charAt(Math.floor(Math.random() * 52));
75836       return c;
75837     }
75838     function create2(url2) {
75839       var e = url2.match(/callback=(\w+)/);
75840       var c = e ? e[1] : rand();
75841       jsonpCache[c] = function(data) {
75842         if (jsonpCache[c]) {
75843           callback(data);
75844         }
75845         finalize();
75846       };
75847       function finalize() {
75848         delete jsonpCache[c];
75849         script.remove();
75850       }
75851       request3.abort = finalize;
75852       return "jsonpCache." + c;
75853     }
75854     var cb = create2(url);
75855     var script = select_default2("head").append("script").attr("type", "text/javascript").attr("src", url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
75856     return request3;
75857   }
75858
75859   // modules/services/streetside.js
75860   var bubbleApi = "https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?";
75861   var streetsideImagesApi = "https://t.ssl.ak.tiles.virtualearth.net/tiles/";
75862   var bubbleAppKey = "AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm";
75863   var pannellumViewerCSS = "pannellum-streetside/pannellum.css";
75864   var pannellumViewerJS = "pannellum-streetside/pannellum.js";
75865   var maxResults2 = 2e3;
75866   var tileZoom2 = 16.5;
75867   var tiler6 = utilTiler().zoomExtent([tileZoom2, tileZoom2]).skipNullIsland(true);
75868   var dispatch8 = dispatch_default("loadedImages", "viewerChanged");
75869   var minHfov = 10;
75870   var maxHfov = 90;
75871   var defaultHfov = 45;
75872   var _hires = false;
75873   var _resolution = 512;
75874   var _currScene = 0;
75875   var _ssCache;
75876   var _pannellumViewer;
75877   var _sceneOptions = {
75878     showFullscreenCtrl: false,
75879     autoLoad: true,
75880     compass: true,
75881     yaw: 0,
75882     minHfov,
75883     maxHfov,
75884     hfov: defaultHfov,
75885     type: "cubemap",
75886     cubeMap: []
75887   };
75888   var _loadViewerPromise3;
75889   function abortRequest6(i2) {
75890     i2.abort();
75891   }
75892   function localeTimestamp(s) {
75893     if (!s)
75894       return null;
75895     const options2 = { day: "numeric", month: "short", year: "numeric" };
75896     const d = new Date(s);
75897     if (isNaN(d.getTime()))
75898       return null;
75899     return d.toLocaleString(_mainLocalizer.localeCode(), options2);
75900   }
75901   function loadTiles3(which, url, projection2, margin) {
75902     const tiles = tiler6.margin(margin).getTiles(projection2);
75903     const cache = _ssCache[which];
75904     Object.keys(cache.inflight).forEach((k) => {
75905       const wanted = tiles.find((tile) => k.indexOf(tile.id + ",") === 0);
75906       if (!wanted) {
75907         abortRequest6(cache.inflight[k]);
75908         delete cache.inflight[k];
75909       }
75910     });
75911     tiles.forEach((tile) => loadNextTilePage2(which, url, tile));
75912   }
75913   function loadNextTilePage2(which, url, tile) {
75914     const cache = _ssCache[which];
75915     const nextPage = cache.nextPage[tile.id] || 0;
75916     const id2 = tile.id + "," + String(nextPage);
75917     if (cache.loaded[id2] || cache.inflight[id2])
75918       return;
75919     cache.inflight[id2] = getBubbles(url, tile, (bubbles) => {
75920       cache.loaded[id2] = true;
75921       delete cache.inflight[id2];
75922       if (!bubbles)
75923         return;
75924       bubbles.shift();
75925       const features = bubbles.map((bubble) => {
75926         if (cache.points[bubble.id])
75927           return null;
75928         const loc = [bubble.lo, bubble.la];
75929         const d = {
75930           loc,
75931           key: bubble.id,
75932           ca: bubble.he,
75933           captured_at: bubble.cd,
75934           captured_by: "microsoft",
75935           // nbn: bubble.nbn,
75936           // pbn: bubble.pbn,
75937           // ad: bubble.ad,
75938           // rn: bubble.rn,
75939           pr: bubble.pr,
75940           // previous
75941           ne: bubble.ne,
75942           // next
75943           pano: true,
75944           sequenceKey: null
75945         };
75946         cache.points[bubble.id] = d;
75947         if (bubble.pr === void 0) {
75948           cache.leaders.push(bubble.id);
75949         }
75950         return {
75951           minX: loc[0],
75952           minY: loc[1],
75953           maxX: loc[0],
75954           maxY: loc[1],
75955           data: d
75956         };
75957       }).filter(Boolean);
75958       cache.rtree.load(features);
75959       connectSequences();
75960       if (which === "bubbles") {
75961         dispatch8.call("loadedImages");
75962       }
75963     });
75964   }
75965   function connectSequences() {
75966     let cache = _ssCache.bubbles;
75967     let keepLeaders = [];
75968     for (let i2 = 0; i2 < cache.leaders.length; i2++) {
75969       let bubble = cache.points[cache.leaders[i2]];
75970       let seen = {};
75971       let sequence = { key: bubble.key, bubbles: [] };
75972       let complete = false;
75973       do {
75974         sequence.bubbles.push(bubble);
75975         seen[bubble.key] = true;
75976         if (bubble.ne === void 0) {
75977           complete = true;
75978         } else {
75979           bubble = cache.points[bubble.ne];
75980         }
75981       } while (bubble && !seen[bubble.key] && !complete);
75982       if (complete) {
75983         _ssCache.sequences[sequence.key] = sequence;
75984         for (let j2 = 0; j2 < sequence.bubbles.length; j2++) {
75985           sequence.bubbles[j2].sequenceKey = sequence.key;
75986         }
75987         sequence.geojson = {
75988           type: "LineString",
75989           properties: {
75990             captured_at: sequence.bubbles[0] ? sequence.bubbles[0].captured_at : null,
75991             captured_by: sequence.bubbles[0] ? sequence.bubbles[0].captured_by : null,
75992             key: sequence.key
75993           },
75994           coordinates: sequence.bubbles.map((d) => d.loc)
75995         };
75996       } else {
75997         keepLeaders.push(cache.leaders[i2]);
75998       }
75999     }
76000     cache.leaders = keepLeaders;
76001   }
76002   function getBubbles(url, tile, callback) {
76003     let rect = tile.extent.rectangle();
76004     let urlForRequest = url + utilQsString({
76005       n: rect[3],
76006       s: rect[1],
76007       e: rect[2],
76008       w: rect[0],
76009       c: maxResults2,
76010       appkey: bubbleAppKey,
76011       jsCallback: "{callback}"
76012     });
76013     return jsonpRequest(urlForRequest, (data) => {
76014       if (!data || data.error) {
76015         callback(null);
76016       } else {
76017         callback(data);
76018       }
76019     });
76020   }
76021   function partitionViewport3(projection2) {
76022     let z = geoScaleToZoom(projection2.scale());
76023     let z2 = Math.ceil(z * 2) / 2 + 2.5;
76024     let tiler8 = utilTiler().zoomExtent([z2, z2]);
76025     return tiler8.getTiles(projection2).map((tile) => tile.extent);
76026   }
76027   function searchLimited3(limit, projection2, rtree) {
76028     limit = limit || 5;
76029     return partitionViewport3(projection2).reduce((result, extent) => {
76030       let found = rtree.search(extent.bbox()).slice(0, limit).map((d) => d.data);
76031       return found.length ? result.concat(found) : result;
76032     }, []);
76033   }
76034   function loadImage(imgInfo) {
76035     return new Promise((resolve) => {
76036       let img = new Image();
76037       img.onload = () => {
76038         let canvas = document.getElementById("ideditor-canvas" + imgInfo.face);
76039         let ctx = canvas.getContext("2d");
76040         ctx.drawImage(img, imgInfo.x, imgInfo.y);
76041         resolve({ imgInfo, status: "ok" });
76042       };
76043       img.onerror = () => {
76044         resolve({ data: imgInfo, status: "error" });
76045       };
76046       img.setAttribute("crossorigin", "");
76047       img.src = imgInfo.url;
76048     });
76049   }
76050   function loadCanvas(imageGroup) {
76051     return Promise.all(imageGroup.map(loadImage)).then((data) => {
76052       let canvas = document.getElementById("ideditor-canvas" + data[0].imgInfo.face);
76053       const which = { "01": 0, "02": 1, "03": 2, "10": 3, "11": 4, "12": 5 };
76054       let face = data[0].imgInfo.face;
76055       _sceneOptions.cubeMap[which[face]] = canvas.toDataURL("image/jpeg", 1);
76056       return { status: "loadCanvas for face " + data[0].imgInfo.face + "ok" };
76057     });
76058   }
76059   function loadFaces(faceGroup) {
76060     return Promise.all(faceGroup.map(loadCanvas)).then(() => {
76061       return { status: "loadFaces done" };
76062     });
76063   }
76064   function setupCanvas(selection2, reset) {
76065     if (reset) {
76066       selection2.selectAll("#ideditor-stitcher-canvases").remove();
76067     }
76068     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);
76069   }
76070   function qkToXY(qk) {
76071     let x = 0;
76072     let y = 0;
76073     let scale = 256;
76074     for (let i2 = qk.length; i2 > 0; i2--) {
76075       const key = qk[i2 - 1];
76076       x += +(key === "1" || key === "3") * scale;
76077       y += +(key === "2" || key === "3") * scale;
76078       scale *= 2;
76079     }
76080     return [x, y];
76081   }
76082   function getQuadKeys() {
76083     let dim = _resolution / 256;
76084     let quadKeys;
76085     if (dim === 16) {
76086       quadKeys = [
76087         "0000",
76088         "0001",
76089         "0010",
76090         "0011",
76091         "0100",
76092         "0101",
76093         "0110",
76094         "0111",
76095         "1000",
76096         "1001",
76097         "1010",
76098         "1011",
76099         "1100",
76100         "1101",
76101         "1110",
76102         "1111",
76103         "0002",
76104         "0003",
76105         "0012",
76106         "0013",
76107         "0102",
76108         "0103",
76109         "0112",
76110         "0113",
76111         "1002",
76112         "1003",
76113         "1012",
76114         "1013",
76115         "1102",
76116         "1103",
76117         "1112",
76118         "1113",
76119         "0020",
76120         "0021",
76121         "0030",
76122         "0031",
76123         "0120",
76124         "0121",
76125         "0130",
76126         "0131",
76127         "1020",
76128         "1021",
76129         "1030",
76130         "1031",
76131         "1120",
76132         "1121",
76133         "1130",
76134         "1131",
76135         "0022",
76136         "0023",
76137         "0032",
76138         "0033",
76139         "0122",
76140         "0123",
76141         "0132",
76142         "0133",
76143         "1022",
76144         "1023",
76145         "1032",
76146         "1033",
76147         "1122",
76148         "1123",
76149         "1132",
76150         "1133",
76151         "0200",
76152         "0201",
76153         "0210",
76154         "0211",
76155         "0300",
76156         "0301",
76157         "0310",
76158         "0311",
76159         "1200",
76160         "1201",
76161         "1210",
76162         "1211",
76163         "1300",
76164         "1301",
76165         "1310",
76166         "1311",
76167         "0202",
76168         "0203",
76169         "0212",
76170         "0213",
76171         "0302",
76172         "0303",
76173         "0312",
76174         "0313",
76175         "1202",
76176         "1203",
76177         "1212",
76178         "1213",
76179         "1302",
76180         "1303",
76181         "1312",
76182         "1313",
76183         "0220",
76184         "0221",
76185         "0230",
76186         "0231",
76187         "0320",
76188         "0321",
76189         "0330",
76190         "0331",
76191         "1220",
76192         "1221",
76193         "1230",
76194         "1231",
76195         "1320",
76196         "1321",
76197         "1330",
76198         "1331",
76199         "0222",
76200         "0223",
76201         "0232",
76202         "0233",
76203         "0322",
76204         "0323",
76205         "0332",
76206         "0333",
76207         "1222",
76208         "1223",
76209         "1232",
76210         "1233",
76211         "1322",
76212         "1323",
76213         "1332",
76214         "1333",
76215         "2000",
76216         "2001",
76217         "2010",
76218         "2011",
76219         "2100",
76220         "2101",
76221         "2110",
76222         "2111",
76223         "3000",
76224         "3001",
76225         "3010",
76226         "3011",
76227         "3100",
76228         "3101",
76229         "3110",
76230         "3111",
76231         "2002",
76232         "2003",
76233         "2012",
76234         "2013",
76235         "2102",
76236         "2103",
76237         "2112",
76238         "2113",
76239         "3002",
76240         "3003",
76241         "3012",
76242         "3013",
76243         "3102",
76244         "3103",
76245         "3112",
76246         "3113",
76247         "2020",
76248         "2021",
76249         "2030",
76250         "2031",
76251         "2120",
76252         "2121",
76253         "2130",
76254         "2131",
76255         "3020",
76256         "3021",
76257         "3030",
76258         "3031",
76259         "3120",
76260         "3121",
76261         "3130",
76262         "3131",
76263         "2022",
76264         "2023",
76265         "2032",
76266         "2033",
76267         "2122",
76268         "2123",
76269         "2132",
76270         "2133",
76271         "3022",
76272         "3023",
76273         "3032",
76274         "3033",
76275         "3122",
76276         "3123",
76277         "3132",
76278         "3133",
76279         "2200",
76280         "2201",
76281         "2210",
76282         "2211",
76283         "2300",
76284         "2301",
76285         "2310",
76286         "2311",
76287         "3200",
76288         "3201",
76289         "3210",
76290         "3211",
76291         "3300",
76292         "3301",
76293         "3310",
76294         "3311",
76295         "2202",
76296         "2203",
76297         "2212",
76298         "2213",
76299         "2302",
76300         "2303",
76301         "2312",
76302         "2313",
76303         "3202",
76304         "3203",
76305         "3212",
76306         "3213",
76307         "3302",
76308         "3303",
76309         "3312",
76310         "3313",
76311         "2220",
76312         "2221",
76313         "2230",
76314         "2231",
76315         "2320",
76316         "2321",
76317         "2330",
76318         "2331",
76319         "3220",
76320         "3221",
76321         "3230",
76322         "3231",
76323         "3320",
76324         "3321",
76325         "3330",
76326         "3331",
76327         "2222",
76328         "2223",
76329         "2232",
76330         "2233",
76331         "2322",
76332         "2323",
76333         "2332",
76334         "2333",
76335         "3222",
76336         "3223",
76337         "3232",
76338         "3233",
76339         "3322",
76340         "3323",
76341         "3332",
76342         "3333"
76343       ];
76344     } else if (dim === 8) {
76345       quadKeys = [
76346         "000",
76347         "001",
76348         "010",
76349         "011",
76350         "100",
76351         "101",
76352         "110",
76353         "111",
76354         "002",
76355         "003",
76356         "012",
76357         "013",
76358         "102",
76359         "103",
76360         "112",
76361         "113",
76362         "020",
76363         "021",
76364         "030",
76365         "031",
76366         "120",
76367         "121",
76368         "130",
76369         "131",
76370         "022",
76371         "023",
76372         "032",
76373         "033",
76374         "122",
76375         "123",
76376         "132",
76377         "133",
76378         "200",
76379         "201",
76380         "210",
76381         "211",
76382         "300",
76383         "301",
76384         "310",
76385         "311",
76386         "202",
76387         "203",
76388         "212",
76389         "213",
76390         "302",
76391         "303",
76392         "312",
76393         "313",
76394         "220",
76395         "221",
76396         "230",
76397         "231",
76398         "320",
76399         "321",
76400         "330",
76401         "331",
76402         "222",
76403         "223",
76404         "232",
76405         "233",
76406         "322",
76407         "323",
76408         "332",
76409         "333"
76410       ];
76411     } else if (dim === 4) {
76412       quadKeys = [
76413         "00",
76414         "01",
76415         "10",
76416         "11",
76417         "02",
76418         "03",
76419         "12",
76420         "13",
76421         "20",
76422         "21",
76423         "30",
76424         "31",
76425         "22",
76426         "23",
76427         "32",
76428         "33"
76429       ];
76430     } else {
76431       quadKeys = [
76432         "0",
76433         "1",
76434         "2",
76435         "3"
76436       ];
76437     }
76438     return quadKeys;
76439   }
76440   var streetside_default = {
76441     /**
76442      * init() initialize streetside.
76443      */
76444     init: function() {
76445       if (!_ssCache) {
76446         this.reset();
76447       }
76448       this.event = utilRebind(this, dispatch8, "on");
76449     },
76450     /**
76451      * reset() reset the cache.
76452      */
76453     reset: function() {
76454       if (_ssCache) {
76455         Object.values(_ssCache.bubbles.inflight).forEach(abortRequest6);
76456       }
76457       _ssCache = {
76458         bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: new import_rbush10.default(), points: {}, leaders: [] },
76459         sequences: {}
76460       };
76461     },
76462     /**
76463      * bubbles()
76464      */
76465     bubbles: function(projection2) {
76466       const limit = 5;
76467       return searchLimited3(limit, projection2, _ssCache.bubbles.rtree);
76468     },
76469     cachedImage: function(imageKey) {
76470       return _ssCache.bubbles.points[imageKey];
76471     },
76472     sequences: function(projection2) {
76473       const viewport = projection2.clipExtent();
76474       const min3 = [viewport[0][0], viewport[1][1]];
76475       const max3 = [viewport[1][0], viewport[0][1]];
76476       const bbox2 = geoExtent(projection2.invert(min3), projection2.invert(max3)).bbox();
76477       let seen = {};
76478       let results = [];
76479       _ssCache.bubbles.rtree.search(bbox2).forEach((d) => {
76480         const key = d.data.sequenceKey;
76481         if (key && !seen[key]) {
76482           seen[key] = true;
76483           results.push(_ssCache.sequences[key].geojson);
76484         }
76485       });
76486       return results;
76487     },
76488     /**
76489      * loadBubbles()
76490      */
76491     loadBubbles: function(projection2, margin) {
76492       if (margin === void 0)
76493         margin = 2;
76494       loadTiles3("bubbles", bubbleApi, projection2, margin);
76495     },
76496     viewer: function() {
76497       return _pannellumViewer;
76498     },
76499     initViewer: function() {
76500       if (!window.pannellum)
76501         return;
76502       if (_pannellumViewer)
76503         return;
76504       _currScene += 1;
76505       const sceneID = _currScene.toString();
76506       const options2 = {
76507         "default": { firstScene: sceneID },
76508         scenes: {}
76509       };
76510       options2.scenes[sceneID] = _sceneOptions;
76511       _pannellumViewer = window.pannellum.viewer("ideditor-viewer-streetside", options2);
76512     },
76513     ensureViewerLoaded: function(context) {
76514       if (_loadViewerPromise3)
76515         return _loadViewerPromise3;
76516       let wrap2 = context.container().select(".photoviewer").selectAll(".ms-wrapper").data([0]);
76517       let wrapEnter = wrap2.enter().append("div").attr("class", "photo-wrapper ms-wrapper").classed("hide", true);
76518       let that = this;
76519       let pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
76520       wrapEnter.append("div").attr("id", "ideditor-viewer-streetside").on(pointerPrefix + "down.streetside", () => {
76521         select_default2(window).on(pointerPrefix + "move.streetside", () => {
76522           dispatch8.call("viewerChanged");
76523         }, true);
76524       }).on(pointerPrefix + "up.streetside pointercancel.streetside", () => {
76525         select_default2(window).on(pointerPrefix + "move.streetside", null);
76526         let t = timer((elapsed) => {
76527           dispatch8.call("viewerChanged");
76528           if (elapsed > 2e3) {
76529             t.stop();
76530           }
76531         });
76532       }).append("div").attr("class", "photo-attribution fillD");
76533       let controlsEnter = wrapEnter.append("div").attr("class", "photo-controls-wrap").append("div").attr("class", "photo-controls");
76534       controlsEnter.append("button").on("click.back", step(-1)).text("\u25C4");
76535       controlsEnter.append("button").on("click.forward", step(1)).text("\u25BA");
76536       wrap2 = wrap2.merge(wrapEnter).call(setupCanvas, true);
76537       context.ui().photoviewer.on("resize.streetside", () => {
76538         if (_pannellumViewer) {
76539           _pannellumViewer.resize();
76540         }
76541       });
76542       _loadViewerPromise3 = new Promise((resolve, reject) => {
76543         let loadedCount = 0;
76544         function loaded() {
76545           loadedCount += 1;
76546           if (loadedCount === 2)
76547             resolve();
76548         }
76549         const head = select_default2("head");
76550         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() {
76551           reject();
76552         });
76553         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() {
76554           reject();
76555         });
76556       }).catch(function() {
76557         _loadViewerPromise3 = null;
76558       });
76559       return _loadViewerPromise3;
76560       function step(stepBy) {
76561         return () => {
76562           let viewer = context.container().select(".photoviewer");
76563           let selected = viewer.empty() ? void 0 : viewer.datum();
76564           if (!selected)
76565             return;
76566           let nextID = stepBy === 1 ? selected.ne : selected.pr;
76567           let yaw = _pannellumViewer.getYaw();
76568           let ca = selected.ca + yaw;
76569           let origin = selected.loc;
76570           const meters = 35;
76571           let p1 = [
76572             origin[0] + geoMetersToLon(meters / 5, origin[1]),
76573             origin[1]
76574           ];
76575           let p2 = [
76576             origin[0] + geoMetersToLon(meters / 2, origin[1]),
76577             origin[1] + geoMetersToLat(meters)
76578           ];
76579           let p3 = [
76580             origin[0] - geoMetersToLon(meters / 2, origin[1]),
76581             origin[1] + geoMetersToLat(meters)
76582           ];
76583           let p4 = [
76584             origin[0] - geoMetersToLon(meters / 5, origin[1]),
76585             origin[1]
76586           ];
76587           let poly = [p1, p2, p3, p4, p1];
76588           let angle2 = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
76589           poly = geoRotate(poly, -angle2, origin);
76590           let extent = poly.reduce((extent2, point2) => {
76591             return extent2.extend(geoExtent(point2));
76592           }, geoExtent());
76593           let minDist = Infinity;
76594           _ssCache.bubbles.rtree.search(extent.bbox()).forEach((d) => {
76595             if (d.data.key === selected.key)
76596               return;
76597             if (!geoPointInPolygon(d.data.loc, poly))
76598               return;
76599             let dist = geoVecLength(d.data.loc, selected.loc);
76600             let theta = selected.ca - d.data.ca;
76601             let minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
76602             if (minTheta > 20) {
76603               dist += 5;
76604             }
76605             if (dist < minDist) {
76606               nextID = d.data.key;
76607               minDist = dist;
76608             }
76609           });
76610           let nextBubble = nextID && that.cachedImage(nextID);
76611           if (!nextBubble)
76612             return;
76613           context.map().centerEase(nextBubble.loc);
76614           that.selectImage(context, nextBubble.key).yaw(yaw).showViewer(context);
76615         };
76616       }
76617     },
76618     yaw: function(yaw) {
76619       if (typeof yaw !== "number")
76620         return yaw;
76621       _sceneOptions.yaw = yaw;
76622       return this;
76623     },
76624     /**
76625      * showViewer()
76626      */
76627     showViewer: function(context) {
76628       let wrap2 = context.container().select(".photoviewer").classed("hide", false);
76629       let isHidden = wrap2.selectAll(".photo-wrapper.ms-wrapper.hide").size();
76630       if (isHidden) {
76631         wrap2.selectAll(".photo-wrapper:not(.ms-wrapper)").classed("hide", true);
76632         wrap2.selectAll(".photo-wrapper.ms-wrapper").classed("hide", false);
76633       }
76634       return this;
76635     },
76636     /**
76637      * hideViewer()
76638      */
76639     hideViewer: function(context) {
76640       let viewer = context.container().select(".photoviewer");
76641       if (!viewer.empty())
76642         viewer.datum(null);
76643       viewer.classed("hide", true).selectAll(".photo-wrapper").classed("hide", true);
76644       context.container().selectAll(".viewfield-group, .sequence, .icon-sign").classed("currentView", false);
76645       this.updateUrlImage(null);
76646       return this.setStyles(context, null, true);
76647     },
76648     /**
76649      * selectImage().
76650      */
76651     selectImage: function(context, key) {
76652       let that = this;
76653       let d = this.cachedImage(key);
76654       let viewer = context.container().select(".photoviewer");
76655       if (!viewer.empty())
76656         viewer.datum(d);
76657       this.setStyles(context, null, true);
76658       let wrap2 = context.container().select(".photoviewer .ms-wrapper");
76659       let attribution = wrap2.selectAll(".photo-attribution").html("");
76660       wrap2.selectAll(".pnlm-load-box").style("display", "block");
76661       if (!d)
76662         return this;
76663       this.updateUrlImage(key);
76664       _sceneOptions.northOffset = d.ca;
76665       let line1 = attribution.append("div").attr("class", "attribution-row");
76666       const hiresDomId = utilUniqueDomId("streetside-hires");
76667       let label = line1.append("label").attr("for", hiresDomId).attr("class", "streetside-hires");
76668       label.append("input").attr("type", "checkbox").attr("id", hiresDomId).property("checked", _hires).on("click", (d3_event) => {
76669         d3_event.stopPropagation();
76670         _hires = !_hires;
76671         _resolution = _hires ? 1024 : 512;
76672         wrap2.call(setupCanvas, true);
76673         let viewstate = {
76674           yaw: _pannellumViewer.getYaw(),
76675           pitch: _pannellumViewer.getPitch(),
76676           hfov: _pannellumViewer.getHfov()
76677         };
76678         _sceneOptions = Object.assign(_sceneOptions, viewstate);
76679         that.selectImage(context, d.key).showViewer(context);
76680       });
76681       label.append("span").call(_t.append("streetside.hires"));
76682       let captureInfo = line1.append("div").attr("class", "attribution-capture-info");
76683       if (d.captured_by) {
76684         const yyyy = (/* @__PURE__ */ new Date()).getFullYear();
76685         captureInfo.append("a").attr("class", "captured_by").attr("target", "_blank").attr("href", "https://www.microsoft.com/en-us/maps/streetside").text("\xA9" + yyyy + " Microsoft");
76686         captureInfo.append("span").text("|");
76687       }
76688       if (d.captured_at) {
76689         captureInfo.append("span").attr("class", "captured_at").text(localeTimestamp(d.captured_at));
76690       }
76691       let line2 = attribution.append("div").attr("class", "attribution-row");
76692       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"));
76693       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"));
76694       let bubbleIdQuadKey = d.key.toString(4);
76695       const paddingNeeded = 16 - bubbleIdQuadKey.length;
76696       for (let i2 = 0; i2 < paddingNeeded; i2++) {
76697         bubbleIdQuadKey = "0" + bubbleIdQuadKey;
76698       }
76699       const imgUrlPrefix = streetsideImagesApi + "hs" + bubbleIdQuadKey;
76700       const imgUrlSuffix = ".jpg?g=13515&n=z";
76701       const faceKeys = ["01", "02", "03", "10", "11", "12"];
76702       let quadKeys = getQuadKeys();
76703       let faces = faceKeys.map((faceKey) => {
76704         return quadKeys.map((quadKey) => {
76705           const xy = qkToXY(quadKey);
76706           return {
76707             face: faceKey,
76708             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
76709             x: xy[0],
76710             y: xy[1]
76711           };
76712         });
76713       });
76714       loadFaces(faces).then(function() {
76715         if (!_pannellumViewer) {
76716           that.initViewer();
76717         } else {
76718           _currScene += 1;
76719           let sceneID = _currScene.toString();
76720           _pannellumViewer.addScene(sceneID, _sceneOptions).loadScene(sceneID);
76721           if (_currScene > 2) {
76722             sceneID = (_currScene - 1).toString();
76723             _pannellumViewer.removeScene(sceneID);
76724           }
76725         }
76726       });
76727       return this;
76728     },
76729     getSequenceKeyForBubble: function(d) {
76730       return d && d.sequenceKey;
76731     },
76732     // Updates the currently highlighted sequence and selected bubble.
76733     // Reset is only necessary when interacting with the viewport because
76734     // this implicitly changes the currently selected bubble/sequence
76735     setStyles: function(context, hovered, reset) {
76736       if (reset) {
76737         context.container().selectAll(".viewfield-group").classed("highlighted", false).classed("hovered", false).classed("currentView", false);
76738         context.container().selectAll(".sequence").classed("highlighted", false).classed("currentView", false);
76739       }
76740       let hoveredBubbleKey = hovered && hovered.key;
76741       let hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
76742       let hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
76743       let hoveredBubbleKeys = hoveredSequence && hoveredSequence.bubbles.map((d) => d.key) || [];
76744       let viewer = context.container().select(".photoviewer");
76745       let selected = viewer.empty() ? void 0 : viewer.datum();
76746       let selectedBubbleKey = selected && selected.key;
76747       let selectedSequenceKey = this.getSequenceKeyForBubble(selected);
76748       let selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
76749       let selectedBubbleKeys = selectedSequence && selectedSequence.bubbles.map((d) => d.key) || [];
76750       let highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
76751       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);
76752       context.container().selectAll(".layer-streetside-images .sequence").classed("highlighted", (d) => d.properties.key === hoveredSequenceKey).classed("currentView", (d) => d.properties.key === selectedSequenceKey);
76753       context.container().selectAll(".layer-streetside-images .viewfield-group .viewfield").attr("d", viewfieldPath);
76754       function viewfieldPath() {
76755         let d = this.parentNode.__data__;
76756         if (d.pano && d.key !== selectedBubbleKey) {
76757           return "M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0";
76758         } else {
76759           return "M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z";
76760         }
76761       }
76762       return this;
76763     },
76764     updateUrlImage: function(imageKey) {
76765       if (!window.mocha) {
76766         var hash = utilStringQs(window.location.hash);
76767         if (imageKey) {
76768           hash.photo = "streetside/" + imageKey;
76769         } else {
76770           delete hash.photo;
76771         }
76772         window.location.replace("#" + utilQsString(hash, true));
76773       }
76774     },
76775     /**
76776      * cache().
76777      */
76778     cache: function() {
76779       return _ssCache;
76780     }
76781   };
76782
76783   // modules/services/taginfo.js
76784   var apibase4 = taginfoApiUrl;
76785   var _inflight3 = {};
76786   var _popularKeys = {};
76787   var _taginfoCache = {};
76788   var tag_sorts = {
76789     point: "count_nodes",
76790     vertex: "count_nodes",
76791     area: "count_ways",
76792     line: "count_ways"
76793   };
76794   var tag_sort_members = {
76795     point: "count_node_members",
76796     vertex: "count_node_members",
76797     area: "count_way_members",
76798     line: "count_way_members",
76799     relation: "count_relation_members"
76800   };
76801   var tag_filters = {
76802     point: "nodes",
76803     vertex: "nodes",
76804     area: "ways",
76805     line: "ways"
76806   };
76807   var tag_members_fractions = {
76808     point: "count_node_members_fraction",
76809     vertex: "count_node_members_fraction",
76810     area: "count_way_members_fraction",
76811     line: "count_way_members_fraction",
76812     relation: "count_relation_members_fraction"
76813   };
76814   function sets(params, n2, o) {
76815     if (params.geometry && o[params.geometry]) {
76816       params[n2] = o[params.geometry];
76817     }
76818     return params;
76819   }
76820   function setFilter(params) {
76821     return sets(params, "filter", tag_filters);
76822   }
76823   function setSort(params) {
76824     return sets(params, "sortname", tag_sorts);
76825   }
76826   function setSortMembers(params) {
76827     return sets(params, "sortname", tag_sort_members);
76828   }
76829   function clean(params) {
76830     return utilObjectOmit(params, ["geometry", "debounce"]);
76831   }
76832   function filterKeys(type2) {
76833     var count_type = type2 ? "count_" + type2 : "count_all";
76834     return function(d) {
76835       return Number(d[count_type]) > 2500 || d.in_wiki;
76836     };
76837   }
76838   function filterMultikeys(prefix) {
76839     return function(d) {
76840       var re2 = new RegExp("^" + prefix + "(.*)$", "i");
76841       var matches = d.key.match(re2) || [];
76842       return matches.length === 2 && matches[1].indexOf(":") === -1;
76843     };
76844   }
76845   function filterValues(allowUpperCase) {
76846     return function(d) {
76847       if (d.value.match(/[;,]/) !== null)
76848         return false;
76849       if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null)
76850         return false;
76851       return d.count > 100 || d.in_wiki;
76852     };
76853   }
76854   function filterRoles(geometry) {
76855     return function(d) {
76856       if (d.role === "")
76857         return false;
76858       if (d.role.match(/[A-Z*;,]/) !== null)
76859         return false;
76860       return Number(d[tag_members_fractions[geometry]]) > 0;
76861     };
76862   }
76863   function valKey(d) {
76864     return {
76865       value: d.key,
76866       title: d.key
76867     };
76868   }
76869   function valKeyDescription(d) {
76870     var obj = {
76871       value: d.value,
76872       title: d.description || d.value
76873     };
76874     return obj;
76875   }
76876   function roleKey(d) {
76877     return {
76878       value: d.role,
76879       title: d.role
76880     };
76881   }
76882   function sortKeys(a, b) {
76883     return a.key.indexOf(":") === -1 && b.key.indexOf(":") !== -1 ? -1 : a.key.indexOf(":") !== -1 && b.key.indexOf(":") === -1 ? 1 : 0;
76884   }
76885   var debouncedRequest2 = debounce_default(request2, 300, { leading: false });
76886   function request2(url, params, exactMatch, callback, loaded) {
76887     if (_inflight3[url])
76888       return;
76889     if (checkCache(url, params, exactMatch, callback))
76890       return;
76891     var controller = new AbortController();
76892     _inflight3[url] = controller;
76893     json_default(url, { signal: controller.signal }).then(function(result) {
76894       delete _inflight3[url];
76895       if (loaded)
76896         loaded(null, result);
76897     }).catch(function(err) {
76898       delete _inflight3[url];
76899       if (err.name === "AbortError")
76900         return;
76901       if (loaded)
76902         loaded(err.message);
76903     });
76904   }
76905   function checkCache(url, params, exactMatch, callback) {
76906     var rp = params.rp || 25;
76907     var testQuery = params.query || "";
76908     var testUrl = url;
76909     do {
76910       var hit = _taginfoCache[testUrl];
76911       if (hit && (url === testUrl || hit.length < rp)) {
76912         callback(null, hit);
76913         return true;
76914       }
76915       if (exactMatch || !testQuery.length)
76916         return false;
76917       testQuery = testQuery.slice(0, -1);
76918       testUrl = url.replace(/&query=(.*?)&/, "&query=" + testQuery + "&");
76919     } while (testQuery.length >= 0);
76920     return false;
76921   }
76922   var taginfo_default = {
76923     init: function() {
76924       _inflight3 = {};
76925       _taginfoCache = {};
76926       _popularKeys = {
76927         // manually exclude some keys – #5377, #7485
76928         postal_code: true,
76929         full_name: true,
76930         loc_name: true,
76931         reg_name: true,
76932         short_name: true,
76933         sorting_name: true,
76934         artist_name: true,
76935         nat_name: true,
76936         long_name: true,
76937         via: true,
76938         "bridge:name": true
76939       };
76940       var params = {
76941         rp: 100,
76942         sortname: "values_all",
76943         sortorder: "desc",
76944         page: 1,
76945         debounce: false,
76946         lang: _mainLocalizer.languageCode()
76947       };
76948       this.keys(params, function(err, data) {
76949         if (err)
76950           return;
76951         data.forEach(function(d) {
76952           if (d.value === "opening_hours")
76953             return;
76954           _popularKeys[d.value] = true;
76955         });
76956       });
76957     },
76958     reset: function() {
76959       Object.values(_inflight3).forEach(function(controller) {
76960         controller.abort();
76961       });
76962       _inflight3 = {};
76963     },
76964     keys: function(params, callback) {
76965       var doRequest = params.debounce ? debouncedRequest2 : request2;
76966       params = clean(setSort(params));
76967       params = Object.assign({
76968         rp: 10,
76969         sortname: "count_all",
76970         sortorder: "desc",
76971         page: 1,
76972         lang: _mainLocalizer.languageCode()
76973       }, params);
76974       var url = apibase4 + "keys/all?" + utilQsString(params);
76975       doRequest(url, params, false, callback, function(err, d) {
76976         if (err) {
76977           callback(err);
76978         } else {
76979           var f2 = filterKeys(params.filter);
76980           var result = d.data.filter(f2).sort(sortKeys).map(valKey);
76981           _taginfoCache[url] = result;
76982           callback(null, result);
76983         }
76984       });
76985     },
76986     multikeys: function(params, callback) {
76987       var doRequest = params.debounce ? debouncedRequest2 : request2;
76988       params = clean(setSort(params));
76989       params = Object.assign({
76990         rp: 25,
76991         sortname: "count_all",
76992         sortorder: "desc",
76993         page: 1,
76994         lang: _mainLocalizer.languageCode()
76995       }, params);
76996       var prefix = params.query;
76997       var url = apibase4 + "keys/all?" + utilQsString(params);
76998       doRequest(url, params, true, callback, function(err, d) {
76999         if (err) {
77000           callback(err);
77001         } else {
77002           var f2 = filterMultikeys(prefix);
77003           var result = d.data.filter(f2).map(valKey);
77004           _taginfoCache[url] = result;
77005           callback(null, result);
77006         }
77007       });
77008     },
77009     values: function(params, callback) {
77010       var key = params.key;
77011       if (key && _popularKeys[key]) {
77012         callback(null, []);
77013         return;
77014       }
77015       var doRequest = params.debounce ? debouncedRequest2 : request2;
77016       params = clean(setSort(setFilter(params)));
77017       params = Object.assign({
77018         rp: 25,
77019         sortname: "count_all",
77020         sortorder: "desc",
77021         page: 1,
77022         lang: _mainLocalizer.languageCode()
77023       }, params);
77024       var url = apibase4 + "key/values?" + utilQsString(params);
77025       doRequest(url, params, false, callback, function(err, d) {
77026         if (err) {
77027           callback(err);
77028         } else {
77029           var allowUpperCase = allowUpperCaseTagValues.test(params.key);
77030           var f2 = filterValues(allowUpperCase);
77031           var result = d.data.filter(f2).map(valKeyDescription);
77032           _taginfoCache[url] = result;
77033           callback(null, result);
77034         }
77035       });
77036     },
77037     roles: function(params, callback) {
77038       var doRequest = params.debounce ? debouncedRequest2 : request2;
77039       var geometry = params.geometry;
77040       params = clean(setSortMembers(params));
77041       params = Object.assign({
77042         rp: 25,
77043         sortname: "count_all_members",
77044         sortorder: "desc",
77045         page: 1,
77046         lang: _mainLocalizer.languageCode()
77047       }, params);
77048       var url = apibase4 + "relation/roles?" + utilQsString(params);
77049       doRequest(url, params, true, callback, function(err, d) {
77050         if (err) {
77051           callback(err);
77052         } else {
77053           var f2 = filterRoles(geometry);
77054           var result = d.data.filter(f2).map(roleKey);
77055           _taginfoCache[url] = result;
77056           callback(null, result);
77057         }
77058       });
77059     },
77060     docs: function(params, callback) {
77061       var doRequest = params.debounce ? debouncedRequest2 : request2;
77062       params = clean(setSort(params));
77063       var path = "key/wiki_pages?";
77064       if (params.value) {
77065         path = "tag/wiki_pages?";
77066       } else if (params.rtype) {
77067         path = "relation/wiki_pages?";
77068       }
77069       var url = apibase4 + path + utilQsString(params);
77070       doRequest(url, params, true, callback, function(err, d) {
77071         if (err) {
77072           callback(err);
77073         } else {
77074           _taginfoCache[url] = d.data;
77075           callback(null, d.data);
77076         }
77077       });
77078     },
77079     apibase: function(_) {
77080       if (!arguments.length)
77081         return apibase4;
77082       apibase4 = _;
77083       return this;
77084     }
77085   };
77086
77087   // modules/services/vector_tile.js
77088   var import_fast_deep_equal11 = __toESM(require_fast_deep_equal());
77089   var import_fast_json_stable_stringify2 = __toESM(require_fast_json_stable_stringify());
77090   var import_polygon_clipping2 = __toESM(require_polygon_clipping_umd());
77091   var import_pbf2 = __toESM(require_pbf());
77092   var import_vector_tile2 = __toESM(require_vector_tile());
77093   var tiler7 = utilTiler().tileSize(512).margin(1);
77094   var dispatch9 = dispatch_default("loadedData");
77095   var _vtCache;
77096   function abortRequest7(controller) {
77097     controller.abort();
77098   }
77099   function vtToGeoJSON(data, tile, mergeCache) {
77100     var vectorTile = new import_vector_tile2.default.VectorTile(new import_pbf2.default(data));
77101     var layers = Object.keys(vectorTile.layers);
77102     if (!Array.isArray(layers)) {
77103       layers = [layers];
77104     }
77105     var features = [];
77106     layers.forEach(function(layerID) {
77107       var layer = vectorTile.layers[layerID];
77108       if (layer) {
77109         for (var i2 = 0; i2 < layer.length; i2++) {
77110           var feature3 = layer.feature(i2).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
77111           var geometry = feature3.geometry;
77112           if (geometry.type === "Polygon") {
77113             geometry.type = "MultiPolygon";
77114             geometry.coordinates = [geometry.coordinates];
77115           }
77116           var isClipped = false;
77117           if (geometry.type === "MultiPolygon") {
77118             var featureClip = bboxClip(feature3, tile.extent.rectangle());
77119             if (!(0, import_fast_deep_equal11.default)(feature3.geometry, featureClip.geometry)) {
77120               isClipped = true;
77121             }
77122             if (!feature3.geometry.coordinates.length)
77123               continue;
77124             if (!feature3.geometry.coordinates[0].length)
77125               continue;
77126           }
77127           var featurehash = utilHashcode((0, import_fast_json_stable_stringify2.default)(feature3));
77128           var propertyhash = utilHashcode((0, import_fast_json_stable_stringify2.default)(feature3.properties || {}));
77129           feature3.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, "_");
77130           feature3.__featurehash__ = featurehash;
77131           feature3.__propertyhash__ = propertyhash;
77132           features.push(feature3);
77133           if (isClipped && geometry.type === "MultiPolygon") {
77134             var merged = mergeCache[propertyhash];
77135             if (merged && merged.length) {
77136               var other = merged[0];
77137               var coords = import_polygon_clipping2.default.union(
77138                 feature3.geometry.coordinates,
77139                 other.geometry.coordinates
77140               );
77141               if (!coords || !coords.length) {
77142                 continue;
77143               }
77144               merged.push(feature3);
77145               for (var j2 = 0; j2 < merged.length; j2++) {
77146                 merged[j2].geometry.coordinates = coords;
77147                 merged[j2].__featurehash__ = featurehash;
77148               }
77149             } else {
77150               mergeCache[propertyhash] = [feature3];
77151             }
77152           }
77153         }
77154       }
77155     });
77156     return features;
77157   }
77158   function loadTile2(source, tile) {
77159     if (source.loaded[tile.id] || source.inflight[tile.id])
77160       return;
77161     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) {
77162       var subdomains = r.split(",");
77163       return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
77164     });
77165     var controller = new AbortController();
77166     source.inflight[tile.id] = controller;
77167     fetch(url, { signal: controller.signal }).then(function(response) {
77168       if (!response.ok) {
77169         throw new Error(response.status + " " + response.statusText);
77170       }
77171       source.loaded[tile.id] = [];
77172       delete source.inflight[tile.id];
77173       return response.arrayBuffer();
77174     }).then(function(data) {
77175       if (!data) {
77176         throw new Error("No Data");
77177       }
77178       var z = tile.xyz[2];
77179       if (!source.canMerge[z]) {
77180         source.canMerge[z] = {};
77181       }
77182       source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
77183       dispatch9.call("loadedData");
77184     }).catch(function() {
77185       source.loaded[tile.id] = [];
77186       delete source.inflight[tile.id];
77187     });
77188   }
77189   var vector_tile_default = {
77190     init: function() {
77191       if (!_vtCache) {
77192         this.reset();
77193       }
77194       this.event = utilRebind(this, dispatch9, "on");
77195     },
77196     reset: function() {
77197       for (var sourceID in _vtCache) {
77198         var source = _vtCache[sourceID];
77199         if (source && source.inflight) {
77200           Object.values(source.inflight).forEach(abortRequest7);
77201         }
77202       }
77203       _vtCache = {};
77204     },
77205     addSource: function(sourceID, template) {
77206       _vtCache[sourceID] = { template, inflight: {}, loaded: {}, canMerge: {} };
77207       return _vtCache[sourceID];
77208     },
77209     data: function(sourceID, projection2) {
77210       var source = _vtCache[sourceID];
77211       if (!source)
77212         return [];
77213       var tiles = tiler7.getTiles(projection2);
77214       var seen = {};
77215       var results = [];
77216       for (var i2 = 0; i2 < tiles.length; i2++) {
77217         var features = source.loaded[tiles[i2].id];
77218         if (!features || !features.length)
77219           continue;
77220         for (var j2 = 0; j2 < features.length; j2++) {
77221           var feature3 = features[j2];
77222           var hash = feature3.__featurehash__;
77223           if (seen[hash])
77224             continue;
77225           seen[hash] = true;
77226           results.push(Object.assign({}, feature3));
77227         }
77228       }
77229       return results;
77230     },
77231     loadTiles: function(sourceID, template, projection2) {
77232       var source = _vtCache[sourceID];
77233       if (!source) {
77234         source = this.addSource(sourceID, template);
77235       }
77236       var tiles = tiler7.getTiles(projection2);
77237       Object.keys(source.inflight).forEach(function(k) {
77238         var wanted = tiles.find(function(tile) {
77239           return k === tile.id;
77240         });
77241         if (!wanted) {
77242           abortRequest7(source.inflight[k]);
77243           delete source.inflight[k];
77244         }
77245       });
77246       tiles.forEach(function(tile) {
77247         loadTile2(source, tile);
77248       });
77249     },
77250     cache: function() {
77251       return _vtCache;
77252     }
77253   };
77254
77255   // modules/services/wikidata.js
77256   var apibase5 = "https://www.wikidata.org/w/api.php?";
77257   var _wikidataCache = {};
77258   var wikidata_default = {
77259     init: function() {
77260     },
77261     reset: function() {
77262       _wikidataCache = {};
77263     },
77264     // Search for Wikidata items matching the query
77265     itemsForSearchQuery: function(query, callback, language) {
77266       if (!query) {
77267         if (callback)
77268           callback("No query", {});
77269         return;
77270       }
77271       var lang = this.languagesToQuery()[0];
77272       var url = apibase5 + utilQsString({
77273         action: "wbsearchentities",
77274         format: "json",
77275         formatversion: 2,
77276         search: query,
77277         type: "item",
77278         // the language to search
77279         language: language || lang,
77280         // the language for the label and description in the result
77281         uselang: lang,
77282         limit: 10,
77283         origin: "*"
77284       });
77285       json_default(url).then((result) => {
77286         if (result && result.error) {
77287           if (result.error.code === "badvalue" && result.error.info.includes(lang) && !language && lang.includes("-")) {
77288             this.itemsForSearchQuery(query, callback, lang.split("-")[0]);
77289             return;
77290           } else {
77291             throw new Error(result.error);
77292           }
77293         }
77294         if (callback)
77295           callback(null, result.search || {});
77296       }).catch(function(err) {
77297         if (callback)
77298           callback(err.message, {});
77299       });
77300     },
77301     // Given a Wikipedia language and article title,
77302     // return an array of corresponding Wikidata entities.
77303     itemsByTitle: function(lang, title, callback) {
77304       if (!title) {
77305         if (callback)
77306           callback("No title", {});
77307         return;
77308       }
77309       lang = lang || "en";
77310       var url = apibase5 + utilQsString({
77311         action: "wbgetentities",
77312         format: "json",
77313         formatversion: 2,
77314         sites: lang.replace(/-/g, "_") + "wiki",
77315         titles: title,
77316         languages: "en",
77317         // shrink response by filtering to one language
77318         origin: "*"
77319       });
77320       json_default(url).then(function(result) {
77321         if (result && result.error) {
77322           throw new Error(result.error);
77323         }
77324         if (callback)
77325           callback(null, result.entities || {});
77326       }).catch(function(err) {
77327         if (callback)
77328           callback(err.message, {});
77329       });
77330     },
77331     languagesToQuery: function() {
77332       return _mainLocalizer.localeCodes().map(function(code) {
77333         return code.toLowerCase();
77334       }).filter(function(code) {
77335         return code !== "en-us";
77336       });
77337     },
77338     entityByQID: function(qid, callback) {
77339       if (!qid) {
77340         callback("No qid", {});
77341         return;
77342       }
77343       if (_wikidataCache[qid]) {
77344         if (callback)
77345           callback(null, _wikidataCache[qid]);
77346         return;
77347       }
77348       var langs = this.languagesToQuery();
77349       var url = apibase5 + utilQsString({
77350         action: "wbgetentities",
77351         format: "json",
77352         formatversion: 2,
77353         ids: qid,
77354         props: "labels|descriptions|claims|sitelinks",
77355         sitefilter: langs.map(function(d) {
77356           return d + "wiki";
77357         }).join("|"),
77358         languages: langs.join("|"),
77359         languagefallback: 1,
77360         origin: "*"
77361       });
77362       json_default(url).then(function(result) {
77363         if (result && result.error) {
77364           throw new Error(result.error);
77365         }
77366         if (callback)
77367           callback(null, result.entities[qid] || {});
77368       }).catch(function(err) {
77369         if (callback)
77370           callback(err.message, {});
77371       });
77372     },
77373     // Pass `params` object of the form:
77374     // {
77375     //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
77376     // }
77377     //
77378     // Get an result object used to display tag documentation
77379     // {
77380     //   title:        'string',
77381     //   description:  'string',
77382     //   editURL:      'string',
77383     //   imageURL:     'string',
77384     //   wiki:         { title: 'string', text: 'string', url: 'string' }
77385     // }
77386     //
77387     getDocs: function(params, callback) {
77388       var langs = this.languagesToQuery();
77389       this.entityByQID(params.qid, function(err, entity) {
77390         if (err || !entity) {
77391           callback(err || "No entity");
77392           return;
77393         }
77394         var i2;
77395         var description;
77396         for (i2 in langs) {
77397           let code = langs[i2];
77398           if (entity.descriptions[code] && entity.descriptions[code].language === code) {
77399             description = entity.descriptions[code];
77400             break;
77401           }
77402         }
77403         if (!description && Object.values(entity.descriptions).length)
77404           description = Object.values(entity.descriptions)[0];
77405         var result = {
77406           title: entity.id,
77407           description: description ? description.value : "",
77408           descriptionLocaleCode: description ? description.language : "",
77409           editURL: "https://www.wikidata.org/wiki/" + entity.id
77410         };
77411         if (entity.claims) {
77412           var imageroot = "https://commons.wikimedia.org/w/index.php";
77413           var props = ["P154", "P18"];
77414           var prop, image;
77415           for (i2 = 0; i2 < props.length; i2++) {
77416             prop = entity.claims[props[i2]];
77417             if (prop && Object.keys(prop).length > 0) {
77418               image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
77419               if (image) {
77420                 result.imageURL = imageroot + "?" + utilQsString({
77421                   title: "Special:Redirect/file/" + image,
77422                   width: 400
77423                 });
77424                 break;
77425               }
77426             }
77427           }
77428         }
77429         if (entity.sitelinks) {
77430           var englishLocale = _mainLocalizer.languageCode().toLowerCase() === "en";
77431           for (i2 = 0; i2 < langs.length; i2++) {
77432             var w = langs[i2] + "wiki";
77433             if (entity.sitelinks[w]) {
77434               var title = entity.sitelinks[w].title;
77435               var tKey = "inspector.wiki_reference";
77436               if (!englishLocale && langs[i2] === "en") {
77437                 tKey = "inspector.wiki_en_reference";
77438               }
77439               result.wiki = {
77440                 title,
77441                 text: tKey,
77442                 url: "https://" + langs[i2] + ".wikipedia.org/wiki/" + title.replace(/ /g, "_")
77443               };
77444               break;
77445             }
77446           }
77447         }
77448         callback(null, result);
77449       });
77450     }
77451   };
77452
77453   // modules/services/wikipedia.js
77454   var endpoint = "https://en.wikipedia.org/w/api.php?";
77455   var wikipedia_default = {
77456     init: function() {
77457     },
77458     reset: function() {
77459     },
77460     search: function(lang, query, callback) {
77461       if (!query) {
77462         if (callback)
77463           callback("No Query", []);
77464         return;
77465       }
77466       lang = lang || "en";
77467       var url = endpoint.replace("en", lang) + utilQsString({
77468         action: "query",
77469         list: "search",
77470         srlimit: "10",
77471         srinfo: "suggestion",
77472         format: "json",
77473         origin: "*",
77474         srsearch: query
77475       });
77476       json_default(url).then(function(result) {
77477         if (result && result.error) {
77478           throw new Error(result.error);
77479         } else if (!result || !result.query || !result.query.search) {
77480           throw new Error("No Results");
77481         }
77482         if (callback) {
77483           var titles = result.query.search.map(function(d) {
77484             return d.title;
77485           });
77486           callback(null, titles);
77487         }
77488       }).catch(function(err) {
77489         if (callback)
77490           callback(err, []);
77491       });
77492     },
77493     suggestions: function(lang, query, callback) {
77494       if (!query) {
77495         if (callback)
77496           callback("", []);
77497         return;
77498       }
77499       lang = lang || "en";
77500       var url = endpoint.replace("en", lang) + utilQsString({
77501         action: "opensearch",
77502         namespace: 0,
77503         suggest: "",
77504         format: "json",
77505         origin: "*",
77506         search: query
77507       });
77508       json_default(url).then(function(result) {
77509         if (result && result.error) {
77510           throw new Error(result.error);
77511         } else if (!result || result.length < 2) {
77512           throw new Error("No Results");
77513         }
77514         if (callback)
77515           callback(null, result[1] || []);
77516       }).catch(function(err) {
77517         if (callback)
77518           callback(err.message, []);
77519       });
77520     },
77521     translations: function(lang, title, callback) {
77522       if (!title) {
77523         if (callback)
77524           callback("No Title");
77525         return;
77526       }
77527       var url = endpoint.replace("en", lang) + utilQsString({
77528         action: "query",
77529         prop: "langlinks",
77530         format: "json",
77531         origin: "*",
77532         lllimit: 500,
77533         titles: title
77534       });
77535       json_default(url).then(function(result) {
77536         if (result && result.error) {
77537           throw new Error(result.error);
77538         } else if (!result || !result.query || !result.query.pages) {
77539           throw new Error("No Results");
77540         }
77541         if (callback) {
77542           var list = result.query.pages[Object.keys(result.query.pages)[0]];
77543           var translations = {};
77544           if (list && list.langlinks) {
77545             list.langlinks.forEach(function(d) {
77546               translations[d.lang] = d["*"];
77547             });
77548           }
77549           callback(null, translations);
77550         }
77551       }).catch(function(err) {
77552         if (callback)
77553           callback(err.message);
77554       });
77555     }
77556   };
77557
77558   // modules/services/index.js
77559   var services = {
77560     geocoder: nominatim_default,
77561     keepRight: keepRight_default,
77562     improveOSM: improveOSM_default,
77563     osmose: osmose_default,
77564     mapillary: mapillary_default,
77565     nsi: nsi_default,
77566     kartaview: kartaview_default,
77567     osm: osm_default,
77568     osmWikibase: osm_wikibase_default,
77569     maprules: maprules_default,
77570     streetside: streetside_default,
77571     taginfo: taginfo_default,
77572     vectorTile: vector_tile_default,
77573     wikidata: wikidata_default,
77574     wikipedia: wikipedia_default
77575   };
77576
77577   // modules/modes/drag_note.js
77578   function modeDragNote(context) {
77579     var mode = {
77580       id: "drag-note",
77581       button: "browse"
77582     };
77583     var edit2 = behaviorEdit(context);
77584     var _nudgeInterval;
77585     var _lastLoc;
77586     var _note;
77587     function startNudge(d3_event, nudge) {
77588       if (_nudgeInterval)
77589         window.clearInterval(_nudgeInterval);
77590       _nudgeInterval = window.setInterval(function() {
77591         context.map().pan(nudge);
77592         doMove(d3_event, nudge);
77593       }, 50);
77594     }
77595     function stopNudge() {
77596       if (_nudgeInterval) {
77597         window.clearInterval(_nudgeInterval);
77598         _nudgeInterval = null;
77599       }
77600     }
77601     function origin(note) {
77602       return context.projection(note.loc);
77603     }
77604     function start2(d3_event, note) {
77605       _note = note;
77606       var osm = services.osm;
77607       if (osm) {
77608         _note = osm.getNote(_note.id);
77609       }
77610       context.surface().selectAll(".note-" + _note.id).classed("active", true);
77611       context.perform(actionNoop());
77612       context.enter(mode);
77613       context.selectedNoteID(_note.id);
77614     }
77615     function move(d3_event, entity, point2) {
77616       d3_event.stopPropagation();
77617       _lastLoc = context.projection.invert(point2);
77618       doMove(d3_event);
77619       var nudge = geoViewportEdge(point2, context.map().dimensions());
77620       if (nudge) {
77621         startNudge(d3_event, nudge);
77622       } else {
77623         stopNudge();
77624       }
77625     }
77626     function doMove(d3_event, nudge) {
77627       nudge = nudge || [0, 0];
77628       var currPoint = d3_event && d3_event.point || context.projection(_lastLoc);
77629       var currMouse = geoVecSubtract(currPoint, nudge);
77630       var loc = context.projection.invert(currMouse);
77631       _note = _note.move(loc);
77632       var osm = services.osm;
77633       if (osm) {
77634         osm.replaceNote(_note);
77635       }
77636       context.replace(actionNoop());
77637     }
77638     function end() {
77639       context.replace(actionNoop());
77640       context.selectedNoteID(_note.id).enter(modeSelectNote(context, _note.id));
77641     }
77642     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);
77643     mode.enter = function() {
77644       context.install(edit2);
77645     };
77646     mode.exit = function() {
77647       context.ui().sidebar.hover.cancel();
77648       context.uninstall(edit2);
77649       context.surface().selectAll(".active").classed("active", false);
77650       stopNudge();
77651     };
77652     mode.behavior = drag;
77653     return mode;
77654   }
77655
77656   // modules/modes/select_data.js
77657   function modeSelectData(context, selectedDatum) {
77658     var mode = {
77659       id: "select-data",
77660       button: "browse"
77661     };
77662     var keybinding = utilKeybinding("select-data");
77663     var dataEditor = uiDataEditor(context);
77664     var behaviors = [
77665       behaviorBreathe(context),
77666       behaviorHover(context),
77667       behaviorSelect(context),
77668       behaviorLasso(context),
77669       modeDragNode(context).behavior,
77670       modeDragNote(context).behavior
77671     ];
77672     function selectData(d3_event, drawn) {
77673       var selection2 = context.surface().selectAll(".layer-mapdata .data" + selectedDatum.__featurehash__);
77674       if (selection2.empty()) {
77675         var source = d3_event && d3_event.type === "zoom" && d3_event.sourceEvent;
77676         if (drawn && source && (source.type === "pointermove" || source.type === "mousemove" || source.type === "touchmove")) {
77677           context.enter(modeBrowse(context));
77678         }
77679       } else {
77680         selection2.classed("selected", true);
77681       }
77682     }
77683     function esc() {
77684       if (context.container().select(".combobox").size())
77685         return;
77686       context.enter(modeBrowse(context));
77687     }
77688     mode.zoomToSelected = function() {
77689       var extent = geoExtent(bounds_default(selectedDatum));
77690       context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
77691     };
77692     mode.enter = function() {
77693       behaviors.forEach(context.install);
77694       keybinding.on(_t("inspector.zoom_to.key"), mode.zoomToSelected).on("\u238B", esc, true);
77695       select_default2(document).call(keybinding);
77696       selectData();
77697       var sidebar = context.ui().sidebar;
77698       sidebar.show(dataEditor.datum(selectedDatum));
77699       var extent = geoExtent(bounds_default(selectedDatum));
77700       sidebar.expand(sidebar.intersects(extent));
77701       context.map().on("drawn.select-data", selectData);
77702     };
77703     mode.exit = function() {
77704       behaviors.forEach(context.uninstall);
77705       select_default2(document).call(keybinding.unbind);
77706       context.surface().selectAll(".layer-mapdata .selected").classed("selected hover", false);
77707       context.map().on("drawn.select-data", null);
77708       context.ui().sidebar.hide();
77709     };
77710     return mode;
77711   }
77712
77713   // modules/behavior/select.js
77714   function behaviorSelect(context) {
77715     var _tolerancePx = 4;
77716     var _lastMouseEvent = null;
77717     var _showMenu = false;
77718     var _downPointers = {};
77719     var _longPressTimeout = null;
77720     var _lastInteractionType = null;
77721     var _multiselectionPointerId = null;
77722     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
77723     function keydown(d3_event) {
77724       if (d3_event.keyCode === 32) {
77725         var activeNode = document.activeElement;
77726         if (activeNode && (/* @__PURE__ */ new Set(["INPUT", "TEXTAREA"])).has(activeNode.nodeName))
77727           return;
77728       }
77729       if (d3_event.keyCode === 93 || // context menu key
77730       d3_event.keyCode === 32) {
77731         d3_event.preventDefault();
77732       }
77733       if (d3_event.repeat)
77734         return;
77735       cancelLongPress();
77736       if (d3_event.shiftKey) {
77737         context.surface().classed("behavior-multiselect", true);
77738       }
77739       if (d3_event.keyCode === 32) {
77740         if (!_downPointers.spacebar && _lastMouseEvent) {
77741           cancelLongPress();
77742           _longPressTimeout = window.setTimeout(didLongPress, 500, "spacebar", "spacebar");
77743           _downPointers.spacebar = {
77744             firstEvent: _lastMouseEvent,
77745             lastEvent: _lastMouseEvent
77746           };
77747         }
77748       }
77749     }
77750     function keyup(d3_event) {
77751       cancelLongPress();
77752       if (!d3_event.shiftKey) {
77753         context.surface().classed("behavior-multiselect", false);
77754       }
77755       if (d3_event.keyCode === 93) {
77756         d3_event.preventDefault();
77757         _lastInteractionType = "menukey";
77758         contextmenu(d3_event);
77759       } else if (d3_event.keyCode === 32) {
77760         var pointer = _downPointers.spacebar;
77761         if (pointer) {
77762           delete _downPointers.spacebar;
77763           if (pointer.done)
77764             return;
77765           d3_event.preventDefault();
77766           _lastInteractionType = "spacebar";
77767           click(pointer.firstEvent, pointer.lastEvent, "spacebar");
77768         }
77769       }
77770     }
77771     function pointerdown(d3_event) {
77772       var id2 = (d3_event.pointerId || "mouse").toString();
77773       cancelLongPress();
77774       if (d3_event.buttons && d3_event.buttons !== 1)
77775         return;
77776       context.ui().closeEditMenu();
77777       if (d3_event.pointerType !== "mouse") {
77778         _longPressTimeout = window.setTimeout(didLongPress, 500, id2, "longdown-" + (d3_event.pointerType || "mouse"));
77779       }
77780       _downPointers[id2] = {
77781         firstEvent: d3_event,
77782         lastEvent: d3_event
77783       };
77784     }
77785     function didLongPress(id2, interactionType) {
77786       var pointer = _downPointers[id2];
77787       if (!pointer)
77788         return;
77789       for (var i2 in _downPointers) {
77790         _downPointers[i2].done = true;
77791       }
77792       _longPressTimeout = null;
77793       _lastInteractionType = interactionType;
77794       _showMenu = true;
77795       click(pointer.firstEvent, pointer.lastEvent, id2);
77796     }
77797     function pointermove(d3_event) {
77798       var id2 = (d3_event.pointerId || "mouse").toString();
77799       if (_downPointers[id2]) {
77800         _downPointers[id2].lastEvent = d3_event;
77801       }
77802       if (!d3_event.pointerType || d3_event.pointerType === "mouse") {
77803         _lastMouseEvent = d3_event;
77804         if (_downPointers.spacebar) {
77805           _downPointers.spacebar.lastEvent = d3_event;
77806         }
77807       }
77808     }
77809     function pointerup(d3_event) {
77810       var id2 = (d3_event.pointerId || "mouse").toString();
77811       var pointer = _downPointers[id2];
77812       if (!pointer)
77813         return;
77814       delete _downPointers[id2];
77815       if (_multiselectionPointerId === id2) {
77816         _multiselectionPointerId = null;
77817       }
77818       if (pointer.done)
77819         return;
77820       click(pointer.firstEvent, d3_event, id2);
77821     }
77822     function pointercancel(d3_event) {
77823       var id2 = (d3_event.pointerId || "mouse").toString();
77824       if (!_downPointers[id2])
77825         return;
77826       delete _downPointers[id2];
77827       if (_multiselectionPointerId === id2) {
77828         _multiselectionPointerId = null;
77829       }
77830     }
77831     function contextmenu(d3_event) {
77832       d3_event.preventDefault();
77833       if (!+d3_event.clientX && !+d3_event.clientY) {
77834         if (_lastMouseEvent) {
77835           d3_event = _lastMouseEvent;
77836         } else {
77837           return;
77838         }
77839       } else {
77840         _lastMouseEvent = d3_event;
77841         if (d3_event.pointerType === "touch" || d3_event.pointerType === "pen" || d3_event.mozInputSource && // firefox doesn't give a pointerType on contextmenu events
77842         (d3_event.mozInputSource === MouseEvent.MOZ_SOURCE_TOUCH || d3_event.mozInputSource === MouseEvent.MOZ_SOURCE_PEN)) {
77843           _lastInteractionType = "touch";
77844         } else {
77845           _lastInteractionType = "rightclick";
77846         }
77847       }
77848       _showMenu = true;
77849       click(d3_event, d3_event);
77850     }
77851     function click(firstEvent, lastEvent, pointerId) {
77852       cancelLongPress();
77853       var mapNode = context.container().select(".main-map").node();
77854       var pointGetter = utilFastMouse(mapNode);
77855       var p1 = pointGetter(firstEvent);
77856       var p2 = pointGetter(lastEvent);
77857       var dist = geoVecLength(p1, p2);
77858       if (dist > _tolerancePx || !mapContains(lastEvent)) {
77859         resetProperties();
77860         return;
77861       }
77862       var targetDatum = lastEvent.target.__data__;
77863       var multiselectEntityId;
77864       if (!_multiselectionPointerId) {
77865         var selectPointerInfo = pointerDownOnSelection(pointerId);
77866         if (selectPointerInfo) {
77867           _multiselectionPointerId = selectPointerInfo.pointerId;
77868           multiselectEntityId = !selectPointerInfo.selected && selectPointerInfo.entityId;
77869           _downPointers[selectPointerInfo.pointerId].done = true;
77870         }
77871       }
77872       var isMultiselect = context.mode().id === "select" && // and shift key is down
77873       (lastEvent && lastEvent.shiftKey || // or we're lasso-selecting
77874       context.surface().select(".lasso").node() || // or a pointer is down over a selected feature
77875       _multiselectionPointerId && !multiselectEntityId);
77876       processClick(targetDatum, isMultiselect, p2, multiselectEntityId);
77877       function mapContains(event) {
77878         var rect = mapNode.getBoundingClientRect();
77879         return event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;
77880       }
77881       function pointerDownOnSelection(skipPointerId) {
77882         var mode = context.mode();
77883         var selectedIDs = mode.id === "select" ? mode.selectedIDs() : [];
77884         for (var pointerId2 in _downPointers) {
77885           if (pointerId2 === "spacebar" || pointerId2 === skipPointerId)
77886             continue;
77887           var pointerInfo = _downPointers[pointerId2];
77888           var p12 = pointGetter(pointerInfo.firstEvent);
77889           var p22 = pointGetter(pointerInfo.lastEvent);
77890           if (geoVecLength(p12, p22) > _tolerancePx)
77891             continue;
77892           var datum2 = pointerInfo.firstEvent.target.__data__;
77893           var entity = datum2 && datum2.properties && datum2.properties.entity || datum2;
77894           if (context.graph().hasEntity(entity.id)) {
77895             return {
77896               pointerId: pointerId2,
77897               entityId: entity.id,
77898               selected: selectedIDs.indexOf(entity.id) !== -1
77899             };
77900           }
77901         }
77902         return null;
77903       }
77904     }
77905     function processClick(datum2, isMultiselect, point2, alsoSelectId) {
77906       var mode = context.mode();
77907       var showMenu = _showMenu;
77908       var interactionType = _lastInteractionType;
77909       var entity = datum2 && datum2.properties && datum2.properties.entity;
77910       if (entity)
77911         datum2 = entity;
77912       if (datum2 && datum2.type === "midpoint") {
77913         datum2 = datum2.parents[0];
77914       }
77915       var newMode;
77916       if (datum2 instanceof osmEntity) {
77917         var selectedIDs = context.selectedIDs();
77918         context.selectedNoteID(null);
77919         context.selectedErrorID(null);
77920         if (!isMultiselect) {
77921           if (!showMenu || selectedIDs.length <= 1 || selectedIDs.indexOf(datum2.id) === -1) {
77922             if (alsoSelectId === datum2.id)
77923               alsoSelectId = null;
77924             selectedIDs = (alsoSelectId ? [alsoSelectId] : []).concat([datum2.id]);
77925             newMode = mode.id === "select" ? mode.selectedIDs(selectedIDs) : modeSelect(context, selectedIDs).selectBehavior(behavior);
77926             context.enter(newMode);
77927           }
77928         } else {
77929           if (selectedIDs.indexOf(datum2.id) !== -1) {
77930             if (!showMenu) {
77931               selectedIDs = selectedIDs.filter(function(id2) {
77932                 return id2 !== datum2.id;
77933               });
77934               newMode = selectedIDs.length ? mode.selectedIDs(selectedIDs) : modeBrowse(context).selectBehavior(behavior);
77935               context.enter(newMode);
77936             }
77937           } else {
77938             selectedIDs = selectedIDs.concat([datum2.id]);
77939             newMode = mode.selectedIDs(selectedIDs);
77940             context.enter(newMode);
77941           }
77942         }
77943       } else if (datum2 && datum2.__featurehash__ && !isMultiselect) {
77944         context.selectedNoteID(null).enter(modeSelectData(context, datum2));
77945       } else if (datum2 instanceof osmNote && !isMultiselect) {
77946         context.selectedNoteID(datum2.id).enter(modeSelectNote(context, datum2.id));
77947       } else if (datum2 instanceof QAItem && !isMultiselect) {
77948         context.selectedErrorID(datum2.id).enter(modeSelectError(context, datum2.id, datum2.service));
77949       } else {
77950         context.selectedNoteID(null);
77951         context.selectedErrorID(null);
77952         if (!isMultiselect && mode.id !== "browse") {
77953           context.enter(modeBrowse(context));
77954         }
77955       }
77956       context.ui().closeEditMenu();
77957       if (showMenu)
77958         context.ui().showEditMenu(point2, interactionType);
77959       resetProperties();
77960     }
77961     function cancelLongPress() {
77962       if (_longPressTimeout)
77963         window.clearTimeout(_longPressTimeout);
77964       _longPressTimeout = null;
77965     }
77966     function resetProperties() {
77967       cancelLongPress();
77968       _showMenu = false;
77969       _lastInteractionType = null;
77970     }
77971     function behavior(selection2) {
77972       resetProperties();
77973       _lastMouseEvent = context.map().lastPointerEvent();
77974       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) {
77975         var e = d3_event;
77976         if (+e.clientX === 0 && +e.clientY === 0) {
77977           d3_event.preventDefault();
77978         }
77979       });
77980       selection2.on(_pointerPrefix + "down.select", pointerdown).on("contextmenu.select", contextmenu);
77981     }
77982     behavior.off = function(selection2) {
77983       cancelLongPress();
77984       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);
77985       selection2.on(_pointerPrefix + "down.select", null).on("contextmenu.select", null);
77986       context.surface().classed("behavior-multiselect", false);
77987     };
77988     return behavior;
77989   }
77990
77991   // modules/operations/index.js
77992   var operations_exports = {};
77993   __export(operations_exports, {
77994     operationCircularize: () => operationCircularize,
77995     operationContinue: () => operationContinue,
77996     operationCopy: () => operationCopy,
77997     operationDelete: () => operationDelete,
77998     operationDisconnect: () => operationDisconnect,
77999     operationDowngrade: () => operationDowngrade,
78000     operationExtract: () => operationExtract,
78001     operationMerge: () => operationMerge,
78002     operationMove: () => operationMove,
78003     operationOrthogonalize: () => operationOrthogonalize,
78004     operationPaste: () => operationPaste,
78005     operationReflectLong: () => operationReflectLong,
78006     operationReflectShort: () => operationReflectShort,
78007     operationReverse: () => operationReverse,
78008     operationRotate: () => operationRotate,
78009     operationSplit: () => operationSplit,
78010     operationStraighten: () => operationStraighten
78011   });
78012
78013   // modules/operations/continue.js
78014   function operationContinue(context, selectedIDs) {
78015     var _entities = selectedIDs.map(function(id2) {
78016       return context.graph().entity(id2);
78017     });
78018     var _geometries = Object.assign(
78019       { line: [], vertex: [] },
78020       utilArrayGroupBy(_entities, function(entity) {
78021         return entity.geometry(context.graph());
78022       })
78023     );
78024     var _vertex = _geometries.vertex.length && _geometries.vertex[0];
78025     function candidateWays() {
78026       return _vertex ? context.graph().parentWays(_vertex).filter(function(parent) {
78027         return parent.geometry(context.graph()) === "line" && !parent.isClosed() && parent.affix(_vertex.id) && (_geometries.line.length === 0 || _geometries.line[0] === parent);
78028       }) : [];
78029     }
78030     var _candidates = candidateWays();
78031     var operation = function() {
78032       var candidate = _candidates[0];
78033       context.enter(
78034         modeDrawLine(context, candidate.id, context.graph(), "line", candidate.affix(_vertex.id), true)
78035       );
78036     };
78037     operation.relatedEntityIds = function() {
78038       return _candidates.length ? [_candidates[0].id] : [];
78039     };
78040     operation.available = function() {
78041       return _geometries.vertex.length === 1 && _geometries.line.length <= 1 && !context.features().hasHiddenConnections(_vertex, context.graph());
78042     };
78043     operation.disabled = function() {
78044       if (_candidates.length === 0) {
78045         return "not_eligible";
78046       } else if (_candidates.length > 1) {
78047         return "multiple";
78048       }
78049       return false;
78050     };
78051     operation.tooltip = function() {
78052       var disable = operation.disabled();
78053       return disable ? _t.append("operations.continue." + disable) : _t.append("operations.continue.description");
78054     };
78055     operation.annotation = function() {
78056       return _t("operations.continue.annotation.line");
78057     };
78058     operation.id = "continue";
78059     operation.keys = [_t("operations.continue.key")];
78060     operation.title = _t.append("operations.continue.title");
78061     operation.behavior = behaviorOperation(context).which(operation);
78062     return operation;
78063   }
78064
78065   // modules/operations/copy.js
78066   function operationCopy(context, selectedIDs) {
78067     function getFilteredIdsToCopy() {
78068       return selectedIDs.filter(function(selectedID) {
78069         var entity = context.graph().hasEntity(selectedID);
78070         return entity.hasInterestingTags() || entity.geometry(context.graph()) !== "vertex";
78071       });
78072     }
78073     var operation = function() {
78074       var graph = context.graph();
78075       var selected = groupEntities(getFilteredIdsToCopy(), graph);
78076       var canCopy = [];
78077       var skip = {};
78078       var entity;
78079       var i2;
78080       for (i2 = 0; i2 < selected.relation.length; i2++) {
78081         entity = selected.relation[i2];
78082         if (!skip[entity.id] && entity.isComplete(graph)) {
78083           canCopy.push(entity.id);
78084           skip = getDescendants(entity.id, graph, skip);
78085         }
78086       }
78087       for (i2 = 0; i2 < selected.way.length; i2++) {
78088         entity = selected.way[i2];
78089         if (!skip[entity.id]) {
78090           canCopy.push(entity.id);
78091           skip = getDescendants(entity.id, graph, skip);
78092         }
78093       }
78094       for (i2 = 0; i2 < selected.node.length; i2++) {
78095         entity = selected.node[i2];
78096         if (!skip[entity.id]) {
78097           canCopy.push(entity.id);
78098         }
78099       }
78100       context.copyIDs(canCopy);
78101       if (_point && (canCopy.length !== 1 || graph.entity(canCopy[0]).type !== "node")) {
78102         context.copyLonLat(context.projection.invert(_point));
78103       } else {
78104         context.copyLonLat(null);
78105       }
78106     };
78107     function groupEntities(ids, graph) {
78108       var entities = ids.map(function(id2) {
78109         return graph.entity(id2);
78110       });
78111       return Object.assign(
78112         { relation: [], way: [], node: [] },
78113         utilArrayGroupBy(entities, "type")
78114       );
78115     }
78116     function getDescendants(id2, graph, descendants) {
78117       var entity = graph.entity(id2);
78118       var children2;
78119       descendants = descendants || {};
78120       if (entity.type === "relation") {
78121         children2 = entity.members.map(function(m) {
78122           return m.id;
78123         });
78124       } else if (entity.type === "way") {
78125         children2 = entity.nodes;
78126       } else {
78127         children2 = [];
78128       }
78129       for (var i2 = 0; i2 < children2.length; i2++) {
78130         if (!descendants[children2[i2]]) {
78131           descendants[children2[i2]] = true;
78132           descendants = getDescendants(children2[i2], graph, descendants);
78133         }
78134       }
78135       return descendants;
78136     }
78137     operation.available = function() {
78138       return getFilteredIdsToCopy().length > 0;
78139     };
78140     operation.disabled = function() {
78141       var extent = utilTotalExtent(getFilteredIdsToCopy(), context.graph());
78142       if (extent.percentContainedIn(context.map().extent()) < 0.8) {
78143         return "too_large";
78144       }
78145       return false;
78146     };
78147     operation.availableForKeypress = function() {
78148       var selection2 = window.getSelection && window.getSelection();
78149       return !selection2 || !selection2.toString();
78150     };
78151     operation.tooltip = function() {
78152       var disable = operation.disabled();
78153       return disable ? _t.append("operations.copy." + disable, { n: selectedIDs.length }) : _t.append("operations.copy.description", { n: selectedIDs.length });
78154     };
78155     operation.annotation = function() {
78156       return _t("operations.copy.annotation", { n: selectedIDs.length });
78157     };
78158     var _point;
78159     operation.point = function(val) {
78160       _point = val;
78161       return operation;
78162     };
78163     operation.id = "copy";
78164     operation.keys = [uiCmd("\u2318C")];
78165     operation.title = _t.append("operations.copy.title");
78166     operation.behavior = behaviorOperation(context).which(operation);
78167     return operation;
78168   }
78169
78170   // modules/operations/disconnect.js
78171   function operationDisconnect(context, selectedIDs) {
78172     var _vertexIDs = [];
78173     var _wayIDs = [];
78174     var _otherIDs = [];
78175     var _actions = [];
78176     selectedIDs.forEach(function(id2) {
78177       var entity = context.entity(id2);
78178       if (entity.type === "way") {
78179         _wayIDs.push(id2);
78180       } else if (entity.geometry(context.graph()) === "vertex") {
78181         _vertexIDs.push(id2);
78182       } else {
78183         _otherIDs.push(id2);
78184       }
78185     });
78186     var _coords, _descriptionID = "", _annotationID = "features";
78187     var _disconnectingVertexIds = [];
78188     var _disconnectingWayIds = [];
78189     if (_vertexIDs.length > 0) {
78190       _disconnectingVertexIds = _vertexIDs;
78191       _vertexIDs.forEach(function(vertexID) {
78192         var action = actionDisconnect(vertexID);
78193         if (_wayIDs.length > 0) {
78194           var waysIDsForVertex = _wayIDs.filter(function(wayID) {
78195             var way = context.entity(wayID);
78196             return way.nodes.indexOf(vertexID) !== -1;
78197           });
78198           action.limitWays(waysIDsForVertex);
78199         }
78200         _actions.push(action);
78201         _disconnectingWayIds = _disconnectingWayIds.concat(context.graph().parentWays(context.graph().entity(vertexID)).map((d) => d.id));
78202       });
78203       _disconnectingWayIds = utilArrayUniq(_disconnectingWayIds).filter(function(id2) {
78204         return _wayIDs.indexOf(id2) === -1;
78205       });
78206       _descriptionID += _actions.length === 1 ? "single_point." : "multiple_points.";
78207       if (_wayIDs.length === 1) {
78208         _descriptionID += "single_way." + context.graph().geometry(_wayIDs[0]);
78209       } else {
78210         _descriptionID += _wayIDs.length === 0 ? "no_ways" : "multiple_ways";
78211       }
78212     } else if (_wayIDs.length > 0) {
78213       var ways = _wayIDs.map(function(id2) {
78214         return context.entity(id2);
78215       });
78216       var nodes = utilGetAllNodes(_wayIDs, context.graph());
78217       _coords = nodes.map(function(n2) {
78218         return n2.loc;
78219       });
78220       var sharedActions = [];
78221       var sharedNodes = [];
78222       var unsharedActions = [];
78223       var unsharedNodes = [];
78224       nodes.forEach(function(node) {
78225         var action = actionDisconnect(node.id).limitWays(_wayIDs);
78226         if (action.disabled(context.graph()) !== "not_connected") {
78227           var count = 0;
78228           for (var i2 in ways) {
78229             var way = ways[i2];
78230             if (way.nodes.indexOf(node.id) !== -1) {
78231               count += 1;
78232             }
78233             if (count > 1)
78234               break;
78235           }
78236           if (count > 1) {
78237             sharedActions.push(action);
78238             sharedNodes.push(node);
78239           } else {
78240             unsharedActions.push(action);
78241             unsharedNodes.push(node);
78242           }
78243         }
78244       });
78245       _descriptionID += "no_points.";
78246       _descriptionID += _wayIDs.length === 1 ? "single_way." : "multiple_ways.";
78247       if (sharedActions.length) {
78248         _actions = sharedActions;
78249         _disconnectingVertexIds = sharedNodes.map((node) => node.id);
78250         _descriptionID += "conjoined";
78251         _annotationID = "from_each_other";
78252       } else {
78253         _actions = unsharedActions;
78254         _disconnectingVertexIds = unsharedNodes.map((node) => node.id);
78255         if (_wayIDs.length === 1) {
78256           _descriptionID += context.graph().geometry(_wayIDs[0]);
78257         } else {
78258           _descriptionID += "separate";
78259         }
78260       }
78261     }
78262     var _extent = utilTotalExtent(_disconnectingVertexIds, context.graph());
78263     var operation = function() {
78264       context.perform(function(graph) {
78265         return _actions.reduce(function(graph2, action) {
78266           return action(graph2);
78267         }, graph);
78268       }, operation.annotation());
78269       context.validator().validate();
78270     };
78271     operation.relatedEntityIds = function() {
78272       if (_vertexIDs.length) {
78273         return _disconnectingWayIds;
78274       }
78275       return _disconnectingVertexIds;
78276     };
78277     operation.available = function() {
78278       if (_actions.length === 0)
78279         return false;
78280       if (_otherIDs.length !== 0)
78281         return false;
78282       if (_vertexIDs.length !== 0 && _wayIDs.length !== 0 && !_wayIDs.every(function(wayID) {
78283         return _vertexIDs.some(function(vertexID) {
78284           var way = context.entity(wayID);
78285           return way.nodes.indexOf(vertexID) !== -1;
78286         });
78287       }))
78288         return false;
78289       return true;
78290     };
78291     operation.disabled = function() {
78292       var reason;
78293       for (var actionIndex in _actions) {
78294         reason = _actions[actionIndex].disabled(context.graph());
78295         if (reason)
78296           return reason;
78297       }
78298       if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
78299         return "too_large." + ((_vertexIDs.length ? _vertexIDs : _wayIDs).length === 1 ? "single" : "multiple");
78300       } else if (_coords && someMissing()) {
78301         return "not_downloaded";
78302       } else if (selectedIDs.some(context.hasHiddenConnections)) {
78303         return "connected_to_hidden";
78304       }
78305       return false;
78306       function someMissing() {
78307         if (context.inIntro())
78308           return false;
78309         var osm = context.connection();
78310         if (osm) {
78311           var missing = _coords.filter(function(loc) {
78312             return !osm.isDataLoaded(loc);
78313           });
78314           if (missing.length) {
78315             missing.forEach(function(loc) {
78316               context.loadTileAtLoc(loc);
78317             });
78318             return true;
78319           }
78320         }
78321         return false;
78322       }
78323     };
78324     operation.tooltip = function() {
78325       var disable = operation.disabled();
78326       return disable ? _t.append("operations.disconnect." + disable) : _t.append("operations.disconnect.description." + _descriptionID);
78327     };
78328     operation.annotation = function() {
78329       return _t("operations.disconnect.annotation." + _annotationID);
78330     };
78331     operation.id = "disconnect";
78332     operation.keys = [_t("operations.disconnect.key")];
78333     operation.title = _t.append("operations.disconnect.title");
78334     operation.behavior = behaviorOperation(context).which(operation);
78335     return operation;
78336   }
78337
78338   // modules/operations/downgrade.js
78339   function operationDowngrade(context, selectedIDs) {
78340     var _affectedFeatureCount = 0;
78341     var _downgradeType = downgradeTypeForEntityIDs(selectedIDs);
78342     var _multi = _affectedFeatureCount === 1 ? "single" : "multiple";
78343     function downgradeTypeForEntityIDs(entityIds) {
78344       var downgradeType;
78345       _affectedFeatureCount = 0;
78346       for (var i2 in entityIds) {
78347         var entityID = entityIds[i2];
78348         var type2 = downgradeTypeForEntityID(entityID);
78349         if (type2) {
78350           _affectedFeatureCount += 1;
78351           if (downgradeType && type2 !== downgradeType) {
78352             if (downgradeType !== "generic" && type2 !== "generic") {
78353               downgradeType = "building_address";
78354             } else {
78355               downgradeType = "generic";
78356             }
78357           } else {
78358             downgradeType = type2;
78359           }
78360         }
78361       }
78362       return downgradeType;
78363     }
78364     function downgradeTypeForEntityID(entityID) {
78365       var graph = context.graph();
78366       var entity = graph.entity(entityID);
78367       var preset = _mainPresetIndex.match(entity, graph);
78368       if (!preset || preset.isFallback())
78369         return null;
78370       if (entity.type === "node" && preset.id !== "address" && Object.keys(entity.tags).some(function(key) {
78371         return key.match(/^addr:.{1,}/);
78372       })) {
78373         return "address";
78374       }
78375       var geometry = entity.geometry(graph);
78376       if (geometry === "area" && entity.tags.building && !preset.tags.building) {
78377         return "building";
78378       }
78379       if (geometry === "vertex" && Object.keys(entity.tags).length) {
78380         return "generic";
78381       }
78382       return null;
78383     }
78384     var buildingKeysToKeep = ["architect", "building", "height", "layer", "source", "type", "wheelchair"];
78385     var addressKeysToKeep = ["source"];
78386     var operation = function() {
78387       context.perform(function(graph) {
78388         for (var i2 in selectedIDs) {
78389           var entityID = selectedIDs[i2];
78390           var type2 = downgradeTypeForEntityID(entityID);
78391           if (!type2)
78392             continue;
78393           var tags = Object.assign({}, graph.entity(entityID).tags);
78394           for (var key in tags) {
78395             if (type2 === "address" && addressKeysToKeep.indexOf(key) !== -1)
78396               continue;
78397             if (type2 === "building") {
78398               if (buildingKeysToKeep.indexOf(key) !== -1 || key.match(/^building:.{1,}/) || key.match(/^roof:.{1,}/))
78399                 continue;
78400             }
78401             if (type2 !== "generic") {
78402               if (key.match(/^addr:.{1,}/) || key.match(/^source:.{1,}/))
78403                 continue;
78404             }
78405             delete tags[key];
78406           }
78407           graph = actionChangeTags(entityID, tags)(graph);
78408         }
78409         return graph;
78410       }, operation.annotation());
78411       context.validator().validate();
78412       context.enter(modeSelect(context, selectedIDs));
78413     };
78414     operation.available = function() {
78415       return _downgradeType;
78416     };
78417     operation.disabled = function() {
78418       if (selectedIDs.some(hasWikidataTag)) {
78419         return "has_wikidata_tag";
78420       }
78421       return false;
78422       function hasWikidataTag(id2) {
78423         var entity = context.entity(id2);
78424         return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
78425       }
78426     };
78427     operation.tooltip = function() {
78428       var disable = operation.disabled();
78429       return disable ? _t.append("operations.downgrade." + disable + "." + _multi) : _t.append("operations.downgrade.description." + _downgradeType);
78430     };
78431     operation.annotation = function() {
78432       var suffix;
78433       if (_downgradeType === "building_address") {
78434         suffix = "generic";
78435       } else {
78436         suffix = _downgradeType;
78437       }
78438       return _t("operations.downgrade.annotation." + suffix, { n: _affectedFeatureCount });
78439     };
78440     operation.id = "downgrade";
78441     operation.keys = [uiCmd("\u232B")];
78442     operation.title = _t.append("operations.downgrade.title");
78443     operation.behavior = behaviorOperation(context).which(operation);
78444     return operation;
78445   }
78446
78447   // modules/operations/extract.js
78448   function operationExtract(context, selectedIDs) {
78449     var _amount = selectedIDs.length === 1 ? "single" : "multiple";
78450     var _geometries = utilArrayUniq(selectedIDs.map(function(entityID) {
78451       return context.graph().hasEntity(entityID) && context.graph().geometry(entityID);
78452     }).filter(Boolean));
78453     var _geometryID = _geometries.length === 1 ? _geometries[0] : "feature";
78454     var _extent;
78455     var _actions = selectedIDs.map(function(entityID) {
78456       var graph = context.graph();
78457       var entity = graph.hasEntity(entityID);
78458       if (!entity || !entity.hasInterestingTags())
78459         return null;
78460       if (entity.type === "node" && graph.parentWays(entity).length === 0)
78461         return null;
78462       if (entity.type !== "node") {
78463         var preset = _mainPresetIndex.match(entity, graph);
78464         if (preset.geometry.indexOf("point") === -1)
78465           return null;
78466       }
78467       _extent = _extent ? _extent.extend(entity.extent(graph)) : entity.extent(graph);
78468       return actionExtract(entityID, context.projection);
78469     }).filter(Boolean);
78470     var operation = function() {
78471       var combinedAction = function(graph) {
78472         _actions.forEach(function(action) {
78473           graph = action(graph);
78474         });
78475         return graph;
78476       };
78477       context.perform(combinedAction, operation.annotation());
78478       var extractedNodeIDs = _actions.map(function(action) {
78479         return action.getExtractedNodeID();
78480       });
78481       context.enter(modeSelect(context, extractedNodeIDs));
78482     };
78483     operation.available = function() {
78484       return _actions.length && selectedIDs.length === _actions.length;
78485     };
78486     operation.disabled = function() {
78487       if (_extent && _extent.percentContainedIn(context.map().extent()) < 0.8) {
78488         return "too_large";
78489       } else if (selectedIDs.some(function(entityID) {
78490         return context.graph().geometry(entityID) === "vertex" && context.hasHiddenConnections(entityID);
78491       })) {
78492         return "connected_to_hidden";
78493       }
78494       return false;
78495     };
78496     operation.tooltip = function() {
78497       var disableReason = operation.disabled();
78498       if (disableReason) {
78499         return _t.append("operations.extract." + disableReason + "." + _amount);
78500       } else {
78501         return _t.append("operations.extract.description." + _geometryID + "." + _amount);
78502       }
78503     };
78504     operation.annotation = function() {
78505       return _t("operations.extract.annotation", { n: selectedIDs.length });
78506     };
78507     operation.id = "extract";
78508     operation.keys = [_t("operations.extract.key")];
78509     operation.title = _t.append("operations.extract.title");
78510     operation.behavior = behaviorOperation(context).which(operation);
78511     return operation;
78512   }
78513
78514   // modules/operations/merge.js
78515   function operationMerge(context, selectedIDs) {
78516     var _action = getAction();
78517     function getAction() {
78518       var join = actionJoin(selectedIDs);
78519       if (!join.disabled(context.graph()))
78520         return join;
78521       var merge2 = actionMerge(selectedIDs);
78522       if (!merge2.disabled(context.graph()))
78523         return merge2;
78524       var mergePolygon = actionMergePolygon(selectedIDs);
78525       if (!mergePolygon.disabled(context.graph()))
78526         return mergePolygon;
78527       var mergeNodes = actionMergeNodes(selectedIDs);
78528       if (!mergeNodes.disabled(context.graph()))
78529         return mergeNodes;
78530       if (join.disabled(context.graph()) !== "not_eligible")
78531         return join;
78532       if (merge2.disabled(context.graph()) !== "not_eligible")
78533         return merge2;
78534       if (mergePolygon.disabled(context.graph()) !== "not_eligible")
78535         return mergePolygon;
78536       return mergeNodes;
78537     }
78538     var operation = function() {
78539       if (operation.disabled())
78540         return;
78541       context.perform(_action, operation.annotation());
78542       context.validator().validate();
78543       var resultIDs = selectedIDs.filter(context.hasEntity);
78544       if (resultIDs.length > 1) {
78545         var interestingIDs = resultIDs.filter(function(id2) {
78546           return context.entity(id2).hasInterestingTags();
78547         });
78548         if (interestingIDs.length)
78549           resultIDs = interestingIDs;
78550       }
78551       context.enter(modeSelect(context, resultIDs));
78552     };
78553     operation.available = function() {
78554       return selectedIDs.length >= 2;
78555     };
78556     operation.disabled = function() {
78557       var actionDisabled = _action.disabled(context.graph());
78558       if (actionDisabled)
78559         return actionDisabled;
78560       var osm = context.connection();
78561       if (osm && _action.resultingWayNodesLength && _action.resultingWayNodesLength(context.graph()) > osm.maxWayNodes()) {
78562         return "too_many_vertices";
78563       }
78564       return false;
78565     };
78566     operation.tooltip = function() {
78567       var disabled = operation.disabled();
78568       if (disabled) {
78569         if (disabled === "conflicting_relations") {
78570           return _t.append("operations.merge.conflicting_relations");
78571         }
78572         if (disabled === "restriction" || disabled === "connectivity") {
78573           return _t.append(
78574             "operations.merge.damage_relation",
78575             { relation: _mainPresetIndex.item("type/" + disabled).name() }
78576           );
78577         }
78578         return _t.append("operations.merge." + disabled);
78579       }
78580       return _t.append("operations.merge.description");
78581     };
78582     operation.annotation = function() {
78583       return _t("operations.merge.annotation", { n: selectedIDs.length });
78584     };
78585     operation.id = "merge";
78586     operation.keys = [_t("operations.merge.key")];
78587     operation.title = _t.append("operations.merge.title");
78588     operation.behavior = behaviorOperation(context).which(operation);
78589     return operation;
78590   }
78591
78592   // modules/operations/paste.js
78593   function operationPaste(context) {
78594     var _pastePoint;
78595     var operation = function() {
78596       if (!_pastePoint)
78597         return;
78598       var oldIDs = context.copyIDs();
78599       if (!oldIDs.length)
78600         return;
78601       var projection2 = context.projection;
78602       var extent = geoExtent();
78603       var oldGraph = context.copyGraph();
78604       var newIDs = [];
78605       var action = actionCopyEntities(oldIDs, oldGraph);
78606       context.perform(action);
78607       var copies = action.copies();
78608       var originals = /* @__PURE__ */ new Set();
78609       Object.values(copies).forEach(function(entity) {
78610         originals.add(entity.id);
78611       });
78612       for (var id2 in copies) {
78613         var oldEntity = oldGraph.entity(id2);
78614         var newEntity = copies[id2];
78615         extent._extend(oldEntity.extent(oldGraph));
78616         var parents = context.graph().parentWays(newEntity);
78617         var parentCopied = parents.some(function(parent) {
78618           return originals.has(parent.id);
78619         });
78620         if (!parentCopied) {
78621           newIDs.push(newEntity.id);
78622         }
78623       }
78624       var copyPoint = context.copyLonLat() && projection2(context.copyLonLat()) || projection2(extent.center());
78625       var delta = geoVecSubtract(_pastePoint, copyPoint);
78626       context.replace(actionMove(newIDs, delta, projection2), operation.annotation());
78627       context.enter(modeSelect(context, newIDs));
78628     };
78629     operation.point = function(val) {
78630       _pastePoint = val;
78631       return operation;
78632     };
78633     operation.available = function() {
78634       return context.mode().id === "browse";
78635     };
78636     operation.disabled = function() {
78637       return !context.copyIDs().length;
78638     };
78639     operation.tooltip = function() {
78640       var oldGraph = context.copyGraph();
78641       var ids = context.copyIDs();
78642       if (!ids.length) {
78643         return _t.append("operations.paste.nothing_copied");
78644       }
78645       return _t.append("operations.paste.description", { feature: utilDisplayLabel(oldGraph.entity(ids[0]), oldGraph), n: ids.length });
78646     };
78647     operation.annotation = function() {
78648       var ids = context.copyIDs();
78649       return _t("operations.paste.annotation", { n: ids.length });
78650     };
78651     operation.id = "paste";
78652     operation.keys = [uiCmd("\u2318V")];
78653     operation.title = _t.append("operations.paste.title");
78654     return operation;
78655   }
78656
78657   // modules/operations/reverse.js
78658   function operationReverse(context, selectedIDs) {
78659     var operation = function() {
78660       context.perform(function combinedReverseAction(graph) {
78661         actions().forEach(function(action) {
78662           graph = action(graph);
78663         });
78664         return graph;
78665       }, operation.annotation());
78666       context.validator().validate();
78667     };
78668     function actions(situation) {
78669       return selectedIDs.map(function(entityID) {
78670         var entity = context.hasEntity(entityID);
78671         if (!entity)
78672           return null;
78673         if (situation === "toolbar") {
78674           if (entity.type === "way" && (!entity.isOneWay() && !entity.isSided()))
78675             return null;
78676         }
78677         var geometry = entity.geometry(context.graph());
78678         if (entity.type !== "node" && geometry !== "line")
78679           return null;
78680         var action = actionReverse(entityID);
78681         if (action.disabled(context.graph()))
78682           return null;
78683         return action;
78684       }).filter(Boolean);
78685     }
78686     function reverseTypeID() {
78687       var acts = actions();
78688       var nodeActionCount = acts.filter(function(act) {
78689         var entity = context.hasEntity(act.entityID());
78690         return entity && entity.type === "node";
78691       }).length;
78692       if (nodeActionCount === 0)
78693         return "line";
78694       if (nodeActionCount === acts.length)
78695         return "point";
78696       return "feature";
78697     }
78698     operation.available = function(situation) {
78699       return actions(situation).length > 0;
78700     };
78701     operation.disabled = function() {
78702       return false;
78703     };
78704     operation.tooltip = function() {
78705       return _t.append("operations.reverse.description." + reverseTypeID());
78706     };
78707     operation.annotation = function() {
78708       var acts = actions();
78709       return _t("operations.reverse.annotation." + reverseTypeID(), { n: acts.length });
78710     };
78711     operation.id = "reverse";
78712     operation.keys = [_t("operations.reverse.key")];
78713     operation.title = _t.append("operations.reverse.title");
78714     operation.behavior = behaviorOperation(context).which(operation);
78715     return operation;
78716   }
78717
78718   // modules/operations/split.js
78719   function operationSplit(context, selectedIDs) {
78720     var _vertexIds = selectedIDs.filter(function(id2) {
78721       return context.graph().geometry(id2) === "vertex";
78722     });
78723     var _selectedWayIds = selectedIDs.filter(function(id2) {
78724       var entity = context.graph().hasEntity(id2);
78725       return entity && entity.type === "way";
78726     });
78727     var _isAvailable = _vertexIds.length > 0 && _vertexIds.length + _selectedWayIds.length === selectedIDs.length;
78728     var _action = actionSplit(_vertexIds);
78729     var _ways = [];
78730     var _geometry = "feature";
78731     var _waysAmount = "single";
78732     var _nodesAmount = _vertexIds.length === 1 ? "single" : "multiple";
78733     if (_isAvailable) {
78734       if (_selectedWayIds.length)
78735         _action.limitWays(_selectedWayIds);
78736       _ways = _action.ways(context.graph());
78737       var geometries = {};
78738       _ways.forEach(function(way) {
78739         geometries[way.geometry(context.graph())] = true;
78740       });
78741       if (Object.keys(geometries).length === 1) {
78742         _geometry = Object.keys(geometries)[0];
78743       }
78744       _waysAmount = _ways.length === 1 ? "single" : "multiple";
78745     }
78746     var operation = function() {
78747       var difference = context.perform(_action, operation.annotation());
78748       var idsToSelect = _vertexIds.concat(difference.extantIDs().filter(function(id2) {
78749         return context.entity(id2).type === "way";
78750       }));
78751       context.enter(modeSelect(context, idsToSelect));
78752     };
78753     operation.relatedEntityIds = function() {
78754       return _selectedWayIds.length ? [] : _ways.map((way) => way.id);
78755     };
78756     operation.available = function() {
78757       return _isAvailable;
78758     };
78759     operation.disabled = function() {
78760       var reason = _action.disabled(context.graph());
78761       if (reason) {
78762         return reason;
78763       } else if (selectedIDs.some(context.hasHiddenConnections)) {
78764         return "connected_to_hidden";
78765       }
78766       return false;
78767     };
78768     operation.tooltip = function() {
78769       var disable = operation.disabled();
78770       return disable ? _t.append("operations.split." + disable) : _t.append("operations.split.description." + _geometry + "." + _waysAmount + "." + _nodesAmount + "_node");
78771     };
78772     operation.annotation = function() {
78773       return _t("operations.split.annotation." + _geometry, { n: _ways.length });
78774     };
78775     operation.icon = function() {
78776       if (_waysAmount === "multiple") {
78777         return "#iD-operation-split-multiple";
78778       } else {
78779         return "#iD-operation-split";
78780       }
78781     };
78782     operation.id = "split";
78783     operation.keys = [_t("operations.split.key")];
78784     operation.title = _t.append("operations.split.title");
78785     operation.behavior = behaviorOperation(context).which(operation);
78786     return operation;
78787   }
78788
78789   // modules/operations/straighten.js
78790   function operationStraighten(context, selectedIDs) {
78791     var _wayIDs = selectedIDs.filter(function(id2) {
78792       return id2.charAt(0) === "w";
78793     });
78794     var _nodeIDs = selectedIDs.filter(function(id2) {
78795       return id2.charAt(0) === "n";
78796     });
78797     var _amount = (_wayIDs.length ? _wayIDs : _nodeIDs).length === 1 ? "single" : "multiple";
78798     var _nodes = utilGetAllNodes(selectedIDs, context.graph());
78799     var _coords = _nodes.map(function(n2) {
78800       return n2.loc;
78801     });
78802     var _extent = utilTotalExtent(selectedIDs, context.graph());
78803     var _action = chooseAction();
78804     var _geometry;
78805     function chooseAction() {
78806       if (_wayIDs.length === 0 && _nodeIDs.length > 2) {
78807         _geometry = "point";
78808         return actionStraightenNodes(_nodeIDs, context.projection);
78809       } else if (_wayIDs.length > 0 && (_nodeIDs.length === 0 || _nodeIDs.length === 2)) {
78810         var startNodeIDs = [];
78811         var endNodeIDs = [];
78812         for (var i2 = 0; i2 < selectedIDs.length; i2++) {
78813           var entity = context.entity(selectedIDs[i2]);
78814           if (entity.type === "node") {
78815             continue;
78816           } else if (entity.type !== "way" || entity.isClosed()) {
78817             return null;
78818           }
78819           startNodeIDs.push(entity.first());
78820           endNodeIDs.push(entity.last());
78821         }
78822         startNodeIDs = startNodeIDs.filter(function(n2) {
78823           return startNodeIDs.indexOf(n2) === startNodeIDs.lastIndexOf(n2);
78824         });
78825         endNodeIDs = endNodeIDs.filter(function(n2) {
78826           return endNodeIDs.indexOf(n2) === endNodeIDs.lastIndexOf(n2);
78827         });
78828         if (utilArrayDifference(startNodeIDs, endNodeIDs).length + utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2)
78829           return null;
78830         var wayNodeIDs = utilGetAllNodes(_wayIDs, context.graph()).map(function(node) {
78831           return node.id;
78832         });
78833         if (wayNodeIDs.length <= 2)
78834           return null;
78835         if (_nodeIDs.length === 2 && (wayNodeIDs.indexOf(_nodeIDs[0]) === -1 || wayNodeIDs.indexOf(_nodeIDs[1]) === -1))
78836           return null;
78837         if (_nodeIDs.length) {
78838           _extent = utilTotalExtent(_nodeIDs, context.graph());
78839         }
78840         _geometry = "line";
78841         return actionStraightenWay(selectedIDs, context.projection);
78842       }
78843       return null;
78844     }
78845     function operation() {
78846       if (!_action)
78847         return;
78848       context.perform(_action, operation.annotation());
78849       window.setTimeout(function() {
78850         context.validator().validate();
78851       }, 300);
78852     }
78853     operation.available = function() {
78854       return Boolean(_action);
78855     };
78856     operation.disabled = function() {
78857       var reason = _action.disabled(context.graph());
78858       if (reason) {
78859         return reason;
78860       } else if (_extent.percentContainedIn(context.map().extent()) < 0.8) {
78861         return "too_large";
78862       } else if (someMissing()) {
78863         return "not_downloaded";
78864       } else if (selectedIDs.some(context.hasHiddenConnections)) {
78865         return "connected_to_hidden";
78866       }
78867       return false;
78868       function someMissing() {
78869         if (context.inIntro())
78870           return false;
78871         var osm = context.connection();
78872         if (osm) {
78873           var missing = _coords.filter(function(loc) {
78874             return !osm.isDataLoaded(loc);
78875           });
78876           if (missing.length) {
78877             missing.forEach(function(loc) {
78878               context.loadTileAtLoc(loc);
78879             });
78880             return true;
78881           }
78882         }
78883         return false;
78884       }
78885     };
78886     operation.tooltip = function() {
78887       var disable = operation.disabled();
78888       return disable ? _t.append("operations.straighten." + disable + "." + _amount) : _t.append("operations.straighten.description." + _geometry + (_wayIDs.length === 1 ? "" : "s"));
78889     };
78890     operation.annotation = function() {
78891       return _t("operations.straighten.annotation." + _geometry, { n: _wayIDs.length ? _wayIDs.length : _nodeIDs.length });
78892     };
78893     operation.id = "straighten";
78894     operation.keys = [_t("operations.straighten.key")];
78895     operation.title = _t.append("operations.straighten.title");
78896     operation.behavior = behaviorOperation(context).which(operation);
78897     return operation;
78898   }
78899
78900   // modules/modes/select.js
78901   function modeSelect(context, selectedIDs) {
78902     var mode = {
78903       id: "select",
78904       button: "browse"
78905     };
78906     var keybinding = utilKeybinding("select");
78907     var _breatheBehavior = behaviorBreathe(context);
78908     var _modeDragNode = modeDragNode(context);
78909     var _selectBehavior;
78910     var _behaviors = [];
78911     var _operations = [];
78912     var _newFeature = false;
78913     var _follow = false;
78914     var _focusedParentWayId;
78915     var _focusedVertexIds;
78916     function singular() {
78917       if (selectedIDs && selectedIDs.length === 1) {
78918         return context.hasEntity(selectedIDs[0]);
78919       }
78920     }
78921     function selectedEntities() {
78922       return selectedIDs.map(function(id2) {
78923         return context.hasEntity(id2);
78924       }).filter(Boolean);
78925     }
78926     function checkSelectedIDs() {
78927       var ids = [];
78928       if (Array.isArray(selectedIDs)) {
78929         ids = selectedIDs.filter(function(id2) {
78930           return context.hasEntity(id2);
78931         });
78932       }
78933       if (!ids.length) {
78934         context.enter(modeBrowse(context));
78935         return false;
78936       } else if (selectedIDs.length > 1 && ids.length === 1 || selectedIDs.length === 1 && ids.length > 1) {
78937         context.enter(modeSelect(context, ids));
78938         return false;
78939       }
78940       selectedIDs = ids;
78941       return true;
78942     }
78943     function parentWaysIdsOfSelection(onlyCommonParents) {
78944       var graph = context.graph();
78945       var parents = [];
78946       for (var i2 = 0; i2 < selectedIDs.length; i2++) {
78947         var entity = context.hasEntity(selectedIDs[i2]);
78948         if (!entity || entity.geometry(graph) !== "vertex") {
78949           return [];
78950         }
78951         var currParents = graph.parentWays(entity).map(function(w) {
78952           return w.id;
78953         });
78954         if (!parents.length) {
78955           parents = currParents;
78956           continue;
78957         }
78958         parents = (onlyCommonParents ? utilArrayIntersection : utilArrayUnion)(parents, currParents);
78959         if (!parents.length) {
78960           return [];
78961         }
78962       }
78963       return parents;
78964     }
78965     function childNodeIdsOfSelection(onlyCommon) {
78966       var graph = context.graph();
78967       var childs = [];
78968       for (var i2 = 0; i2 < selectedIDs.length; i2++) {
78969         var entity = context.hasEntity(selectedIDs[i2]);
78970         if (!entity || !["area", "line"].includes(entity.geometry(graph))) {
78971           return [];
78972         }
78973         var currChilds = graph.childNodes(entity).map(function(node) {
78974           return node.id;
78975         });
78976         if (!childs.length) {
78977           childs = currChilds;
78978           continue;
78979         }
78980         childs = (onlyCommon ? utilArrayIntersection : utilArrayUnion)(childs, currChilds);
78981         if (!childs.length) {
78982           return [];
78983         }
78984       }
78985       return childs;
78986     }
78987     function checkFocusedParent() {
78988       if (_focusedParentWayId) {
78989         var parents = parentWaysIdsOfSelection(true);
78990         if (parents.indexOf(_focusedParentWayId) === -1)
78991           _focusedParentWayId = null;
78992       }
78993     }
78994     function parentWayIdForVertexNavigation() {
78995       var parentIds = parentWaysIdsOfSelection(true);
78996       if (_focusedParentWayId && parentIds.indexOf(_focusedParentWayId) !== -1) {
78997         return _focusedParentWayId;
78998       }
78999       return parentIds.length ? parentIds[0] : null;
79000     }
79001     mode.selectedIDs = function(val) {
79002       if (!arguments.length)
79003         return selectedIDs;
79004       selectedIDs = val;
79005       return mode;
79006     };
79007     mode.zoomToSelected = function() {
79008       context.map().zoomToEase(selectedEntities());
79009     };
79010     mode.newFeature = function(val) {
79011       if (!arguments.length)
79012         return _newFeature;
79013       _newFeature = val;
79014       return mode;
79015     };
79016     mode.selectBehavior = function(val) {
79017       if (!arguments.length)
79018         return _selectBehavior;
79019       _selectBehavior = val;
79020       return mode;
79021     };
79022     mode.follow = function(val) {
79023       if (!arguments.length)
79024         return _follow;
79025       _follow = val;
79026       return mode;
79027     };
79028     function loadOperations() {
79029       _operations.forEach(function(operation) {
79030         if (operation.behavior) {
79031           context.uninstall(operation.behavior);
79032         }
79033       });
79034       _operations = Object.values(operations_exports).map(function(o) {
79035         return o(context, selectedIDs);
79036       }).filter(function(o) {
79037         return o.id !== "delete" && o.id !== "downgrade" && o.id !== "copy";
79038       }).concat([
79039         // group copy/downgrade/delete operation together at the end of the list
79040         operationCopy(context, selectedIDs),
79041         operationDowngrade(context, selectedIDs),
79042         operationDelete(context, selectedIDs)
79043       ]).filter(function(operation) {
79044         return operation.available();
79045       });
79046       _operations.forEach(function(operation) {
79047         if (operation.behavior) {
79048           context.install(operation.behavior);
79049         }
79050       });
79051       context.ui().closeEditMenu();
79052     }
79053     mode.operations = function() {
79054       return _operations;
79055     };
79056     mode.enter = function() {
79057       if (!checkSelectedIDs())
79058         return;
79059       context.features().forceVisible(selectedIDs);
79060       _modeDragNode.restoreSelectedIDs(selectedIDs);
79061       loadOperations();
79062       if (!_behaviors.length) {
79063         if (!_selectBehavior)
79064           _selectBehavior = behaviorSelect(context);
79065         _behaviors = [
79066           behaviorPaste(context),
79067           _breatheBehavior,
79068           behaviorHover(context).on("hover", context.ui().sidebar.hoverModeSelect),
79069           _selectBehavior,
79070           behaviorLasso(context),
79071           _modeDragNode.behavior,
79072           modeDragNote(context).behavior
79073         ];
79074       }
79075       _behaviors.forEach(context.install);
79076       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);
79077       select_default2(document).call(keybinding);
79078       context.ui().sidebar.select(selectedIDs, _newFeature);
79079       context.history().on("change.select", function() {
79080         loadOperations();
79081         selectElements();
79082       }).on("undone.select", checkSelectedIDs).on("redone.select", checkSelectedIDs);
79083       context.map().on("drawn.select", selectElements).on("crossEditableZoom.select", function() {
79084         selectElements();
79085         _breatheBehavior.restartIfNeeded(context.surface());
79086       });
79087       context.map().doubleUpHandler().on("doubleUp.modeSelect", didDoubleUp);
79088       selectElements();
79089       if (_follow) {
79090         var extent = geoExtent();
79091         var graph = context.graph();
79092         selectedIDs.forEach(function(id2) {
79093           var entity = context.entity(id2);
79094           extent._extend(entity.extent(graph));
79095         });
79096         var loc = extent.center();
79097         context.map().centerEase(loc);
79098         _follow = false;
79099       }
79100       function nudgeSelection(delta) {
79101         return function() {
79102           if (!context.map().withinEditableZoom())
79103             return;
79104           var moveOp = operationMove(context, selectedIDs);
79105           if (moveOp.disabled()) {
79106             context.ui().flash.duration(4e3).iconName("#iD-operation-" + moveOp.id).iconClass("operation disabled").label(moveOp.tooltip())();
79107           } else {
79108             context.perform(actionMove(selectedIDs, delta, context.projection), moveOp.annotation());
79109             context.validator().validate();
79110           }
79111         };
79112       }
79113       function scaleSelection(factor) {
79114         return function() {
79115           if (!context.map().withinEditableZoom())
79116             return;
79117           let nodes = utilGetAllNodes(selectedIDs, context.graph());
79118           let isUp = factor > 1;
79119           if (nodes.length <= 1)
79120             return;
79121           let extent2 = utilTotalExtent(selectedIDs, context.graph());
79122           function scalingDisabled() {
79123             if (tooSmall()) {
79124               return "too_small";
79125             } else if (extent2.percentContainedIn(context.map().extent()) < 0.8) {
79126               return "too_large";
79127             } else if (someMissing() || selectedIDs.some(incompleteRelation)) {
79128               return "not_downloaded";
79129             } else if (selectedIDs.some(context.hasHiddenConnections)) {
79130               return "connected_to_hidden";
79131             }
79132             return false;
79133             function tooSmall() {
79134               if (isUp)
79135                 return false;
79136               let dLon = Math.abs(extent2[1][0] - extent2[0][0]);
79137               let dLat = Math.abs(extent2[1][1] - extent2[0][1]);
79138               return dLon < geoMetersToLon(1, extent2[1][1]) && dLat < geoMetersToLat(1);
79139             }
79140             function someMissing() {
79141               if (context.inIntro())
79142                 return false;
79143               let osm = context.connection();
79144               if (osm) {
79145                 let missing = nodes.filter(function(n2) {
79146                   return !osm.isDataLoaded(n2.loc);
79147                 });
79148                 if (missing.length) {
79149                   missing.forEach(function(loc2) {
79150                     context.loadTileAtLoc(loc2);
79151                   });
79152                   return true;
79153                 }
79154               }
79155               return false;
79156             }
79157             function incompleteRelation(id2) {
79158               let entity = context.entity(id2);
79159               return entity.type === "relation" && !entity.isComplete(context.graph());
79160             }
79161           }
79162           const disabled = scalingDisabled();
79163           if (disabled) {
79164             let multi = selectedIDs.length === 1 ? "single" : "multiple";
79165             context.ui().flash.duration(4e3).iconName("#iD-icon-no").iconClass("operation disabled").label(_t.append("operations.scale." + disabled + "." + multi))();
79166           } else {
79167             const pivot = context.projection(extent2.center());
79168             const annotation = _t("operations.scale.annotation." + (isUp ? "up" : "down") + ".feature", { n: selectedIDs.length });
79169             context.perform(actionScale(selectedIDs, pivot, factor, context.projection), annotation);
79170             context.validator().validate();
79171           }
79172         };
79173       }
79174       function didDoubleUp(d3_event, loc2) {
79175         if (!context.map().withinEditableZoom())
79176           return;
79177         var target = select_default2(d3_event.target);
79178         var datum2 = target.datum();
79179         var entity = datum2 && datum2.properties && datum2.properties.entity;
79180         if (!entity)
79181           return;
79182         if (entity instanceof osmWay && target.classed("target")) {
79183           var choice = geoChooseEdge(context.graph().childNodes(entity), loc2, context.projection);
79184           var prev = entity.nodes[choice.index - 1];
79185           var next = entity.nodes[choice.index];
79186           context.perform(
79187             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
79188             _t("operations.add.annotation.vertex")
79189           );
79190           context.validator().validate();
79191         } else if (entity.type === "midpoint") {
79192           context.perform(
79193             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
79194             _t("operations.add.annotation.vertex")
79195           );
79196           context.validator().validate();
79197         }
79198       }
79199       function selectElements() {
79200         if (!checkSelectedIDs())
79201           return;
79202         var surface = context.surface();
79203         surface.selectAll(".selected-member").classed("selected-member", false);
79204         surface.selectAll(".selected").classed("selected", false);
79205         surface.selectAll(".related").classed("related", false);
79206         checkFocusedParent();
79207         if (_focusedParentWayId) {
79208           surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed("related", true);
79209         }
79210         if (context.map().withinEditableZoom()) {
79211           surface.selectAll(utilDeepMemberSelector(
79212             selectedIDs,
79213             context.graph(),
79214             true
79215             /* skipMultipolgonMembers */
79216           )).classed("selected-member", true);
79217           surface.selectAll(utilEntityOrDeepMemberSelector(selectedIDs, context.graph())).classed("selected", true);
79218         }
79219       }
79220       function esc() {
79221         if (context.container().select(".combobox").size())
79222           return;
79223         context.enter(modeBrowse(context));
79224       }
79225       function firstVertex(d3_event) {
79226         d3_event.preventDefault();
79227         var entity = singular();
79228         var parentId = parentWayIdForVertexNavigation();
79229         var way;
79230         if (entity && entity.type === "way") {
79231           way = entity;
79232         } else if (parentId) {
79233           way = context.entity(parentId);
79234         }
79235         _focusedParentWayId = way && way.id;
79236         if (way) {
79237           context.enter(
79238             mode.selectedIDs([way.first()]).follow(true)
79239           );
79240         }
79241       }
79242       function lastVertex(d3_event) {
79243         d3_event.preventDefault();
79244         var entity = singular();
79245         var parentId = parentWayIdForVertexNavigation();
79246         var way;
79247         if (entity && entity.type === "way") {
79248           way = entity;
79249         } else if (parentId) {
79250           way = context.entity(parentId);
79251         }
79252         _focusedParentWayId = way && way.id;
79253         if (way) {
79254           context.enter(
79255             mode.selectedIDs([way.last()]).follow(true)
79256           );
79257         }
79258       }
79259       function previousVertex(d3_event) {
79260         d3_event.preventDefault();
79261         var parentId = parentWayIdForVertexNavigation();
79262         _focusedParentWayId = parentId;
79263         if (!parentId)
79264           return;
79265         var way = context.entity(parentId);
79266         var length = way.nodes.length;
79267         var curr = way.nodes.indexOf(selectedIDs[0]);
79268         var index = -1;
79269         if (curr > 0) {
79270           index = curr - 1;
79271         } else if (way.isClosed()) {
79272           index = length - 2;
79273         }
79274         if (index !== -1) {
79275           context.enter(
79276             mode.selectedIDs([way.nodes[index]]).follow(true)
79277           );
79278         }
79279       }
79280       function nextVertex(d3_event) {
79281         d3_event.preventDefault();
79282         var parentId = parentWayIdForVertexNavigation();
79283         _focusedParentWayId = parentId;
79284         if (!parentId)
79285           return;
79286         var way = context.entity(parentId);
79287         var length = way.nodes.length;
79288         var curr = way.nodes.indexOf(selectedIDs[0]);
79289         var index = -1;
79290         if (curr < length - 1) {
79291           index = curr + 1;
79292         } else if (way.isClosed()) {
79293           index = 0;
79294         }
79295         if (index !== -1) {
79296           context.enter(
79297             mode.selectedIDs([way.nodes[index]]).follow(true)
79298           );
79299         }
79300       }
79301       function focusNextParent(d3_event) {
79302         d3_event.preventDefault();
79303         var parents = parentWaysIdsOfSelection(true);
79304         if (!parents || parents.length < 2)
79305           return;
79306         var index = parents.indexOf(_focusedParentWayId);
79307         if (index < 0 || index > parents.length - 2) {
79308           _focusedParentWayId = parents[0];
79309         } else {
79310           _focusedParentWayId = parents[index + 1];
79311         }
79312         var surface = context.surface();
79313         surface.selectAll(".related").classed("related", false);
79314         if (_focusedParentWayId) {
79315           surface.selectAll(utilEntitySelector([_focusedParentWayId])).classed("related", true);
79316         }
79317       }
79318       function selectParent(d3_event) {
79319         d3_event.preventDefault();
79320         var currentSelectedIds = mode.selectedIDs();
79321         var parentIds = _focusedParentWayId ? [_focusedParentWayId] : parentWaysIdsOfSelection(false);
79322         if (!parentIds.length)
79323           return;
79324         context.enter(
79325           mode.selectedIDs(parentIds)
79326         );
79327         _focusedVertexIds = currentSelectedIds;
79328       }
79329       function selectChild(d3_event) {
79330         d3_event.preventDefault();
79331         var currentSelectedIds = mode.selectedIDs();
79332         var childIds = _focusedVertexIds ? _focusedVertexIds.filter((id2) => context.hasEntity(id2)) : childNodeIdsOfSelection(true);
79333         if (!childIds || !childIds.length)
79334           return;
79335         if (currentSelectedIds.length === 1)
79336           _focusedParentWayId = currentSelectedIds[0];
79337         context.enter(
79338           mode.selectedIDs(childIds)
79339         );
79340       }
79341     };
79342     mode.exit = function() {
79343       _newFeature = false;
79344       _focusedVertexIds = null;
79345       _operations.forEach(function(operation) {
79346         if (operation.behavior) {
79347           context.uninstall(operation.behavior);
79348         }
79349       });
79350       _operations = [];
79351       _behaviors.forEach(context.uninstall);
79352       select_default2(document).call(keybinding.unbind);
79353       context.ui().closeEditMenu();
79354       context.history().on("change.select", null).on("undone.select", null).on("redone.select", null);
79355       var surface = context.surface();
79356       surface.selectAll(".selected-member").classed("selected-member", false);
79357       surface.selectAll(".selected").classed("selected", false);
79358       surface.selectAll(".highlighted").classed("highlighted", false);
79359       surface.selectAll(".related").classed("related", false);
79360       context.map().on("drawn.select", null);
79361       context.ui().sidebar.hide();
79362       context.features().forceVisible([]);
79363       var entity = singular();
79364       if (_newFeature && entity && entity.type === "relation" && // no tags
79365       Object.keys(entity.tags).length === 0 && // no parent relations
79366       context.graph().parentRelations(entity).length === 0 && // no members or one member with no role
79367       (entity.members.length === 0 || entity.members.length === 1 && !entity.members[0].role)) {
79368         var deleteAction = actionDeleteRelation(
79369           entity.id,
79370           true
79371           /* don't delete untagged members */
79372         );
79373         context.perform(deleteAction, _t("operations.delete.annotation.relation"));
79374         context.validator().validate();
79375       }
79376     };
79377     return mode;
79378   }
79379
79380   // modules/behavior/lasso.js
79381   function behaviorLasso(context) {
79382     var _pointerPrefix = "PointerEvent" in window ? "pointer" : "mouse";
79383     var behavior = function(selection2) {
79384       var lasso;
79385       function pointerdown(d3_event) {
79386         var button = 0;
79387         if (d3_event.button === button && d3_event.shiftKey === true) {
79388           lasso = null;
79389           select_default2(window).on(_pointerPrefix + "move.lasso", pointermove).on(_pointerPrefix + "up.lasso", pointerup);
79390           d3_event.stopPropagation();
79391         }
79392       }
79393       function pointermove() {
79394         if (!lasso) {
79395           lasso = uiLasso(context);
79396           context.surface().call(lasso);
79397         }
79398         lasso.p(context.map().mouse());
79399       }
79400       function normalize2(a, b) {
79401         return [
79402           [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
79403           [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
79404         ];
79405       }
79406       function lassoed() {
79407         if (!lasso)
79408           return [];
79409         var graph = context.graph();
79410         var limitToNodes;
79411         if (context.map().editableDataEnabled(
79412           true
79413           /* skipZoomCheck */
79414         ) && context.map().isInWideSelection()) {
79415           limitToNodes = new Set(utilGetAllNodes(context.selectedIDs(), graph));
79416         } else if (!context.map().editableDataEnabled()) {
79417           return [];
79418         }
79419         var bounds = lasso.extent().map(context.projection.invert);
79420         var extent = geoExtent(normalize2(bounds[0], bounds[1]));
79421         var intersects = context.history().intersects(extent).filter(function(entity) {
79422           return entity.type === "node" && (!limitToNodes || limitToNodes.has(entity)) && geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) && !context.features().isHidden(entity, graph, entity.geometry(graph));
79423         });
79424         intersects.sort(function(node1, node2) {
79425           var parents1 = graph.parentWays(node1);
79426           var parents2 = graph.parentWays(node2);
79427           if (parents1.length && parents2.length) {
79428             var sharedParents = utilArrayIntersection(parents1, parents2);
79429             if (sharedParents.length) {
79430               var sharedParentNodes = sharedParents[0].nodes;
79431               return sharedParentNodes.indexOf(node1.id) - sharedParentNodes.indexOf(node2.id);
79432             } else {
79433               return Number(parents1[0].id.slice(1)) - Number(parents2[0].id.slice(1));
79434             }
79435           } else if (parents1.length || parents2.length) {
79436             return parents1.length - parents2.length;
79437           }
79438           return node1.loc[0] - node2.loc[0];
79439         });
79440         return intersects.map(function(entity) {
79441           return entity.id;
79442         });
79443       }
79444       function pointerup() {
79445         select_default2(window).on(_pointerPrefix + "move.lasso", null).on(_pointerPrefix + "up.lasso", null);
79446         if (!lasso)
79447           return;
79448         var ids = lassoed();
79449         lasso.close();
79450         if (ids.length) {
79451           context.enter(modeSelect(context, ids));
79452         }
79453       }
79454       selection2.on(_pointerPrefix + "down.lasso", pointerdown);
79455     };
79456     behavior.off = function(selection2) {
79457       selection2.on(_pointerPrefix + "down.lasso", null);
79458     };
79459     return behavior;
79460   }
79461
79462   // modules/modes/browse.js
79463   function modeBrowse(context) {
79464     var mode = {
79465       button: "browse",
79466       id: "browse",
79467       title: _t.append("modes.browse.title"),
79468       description: _t.append("modes.browse.description")
79469     };
79470     var sidebar;
79471     var _selectBehavior;
79472     var _behaviors = [];
79473     mode.selectBehavior = function(val) {
79474       if (!arguments.length)
79475         return _selectBehavior;
79476       _selectBehavior = val;
79477       return mode;
79478     };
79479     mode.enter = function() {
79480       if (!_behaviors.length) {
79481         if (!_selectBehavior)
79482           _selectBehavior = behaviorSelect(context);
79483         _behaviors = [
79484           behaviorPaste(context),
79485           behaviorHover(context).on("hover", context.ui().sidebar.hover),
79486           _selectBehavior,
79487           behaviorLasso(context),
79488           modeDragNode(context).behavior,
79489           modeDragNote(context).behavior
79490         ];
79491       }
79492       _behaviors.forEach(context.install);
79493       if (document.activeElement && document.activeElement.blur) {
79494         document.activeElement.blur();
79495       }
79496       if (sidebar) {
79497         context.ui().sidebar.show(sidebar);
79498       } else {
79499         context.ui().sidebar.select(null);
79500       }
79501     };
79502     mode.exit = function() {
79503       context.ui().sidebar.hover.cancel();
79504       _behaviors.forEach(context.uninstall);
79505       if (sidebar) {
79506         context.ui().sidebar.hide();
79507       }
79508     };
79509     mode.sidebar = function(_) {
79510       if (!arguments.length)
79511         return sidebar;
79512       sidebar = _;
79513       return mode;
79514     };
79515     mode.operations = function() {
79516       return [operationPaste(context)];
79517     };
79518     return mode;
79519   }
79520
79521   // modules/behavior/add_way.js
79522   function behaviorAddWay(context) {
79523     var dispatch10 = dispatch_default("start", "startFromWay", "startFromNode");
79524     var draw = behaviorDraw(context);
79525     function behavior(surface) {
79526       draw.on("click", function() {
79527         dispatch10.apply("start", this, arguments);
79528       }).on("clickWay", function() {
79529         dispatch10.apply("startFromWay", this, arguments);
79530       }).on("clickNode", function() {
79531         dispatch10.apply("startFromNode", this, arguments);
79532       }).on("cancel", behavior.cancel).on("finish", behavior.cancel);
79533       context.map().dblclickZoomEnable(false);
79534       surface.call(draw);
79535     }
79536     behavior.off = function(surface) {
79537       surface.call(draw.off);
79538     };
79539     behavior.cancel = function() {
79540       window.setTimeout(function() {
79541         context.map().dblclickZoomEnable(true);
79542       }, 1e3);
79543       context.enter(modeBrowse(context));
79544     };
79545     return utilRebind(behavior, dispatch10, "on");
79546   }
79547
79548   // modules/behavior/hash.js
79549   function behaviorHash(context) {
79550     var _cachedHash = null;
79551     var _latitudeLimit = 90 - 1e-8;
79552     function computedHashParameters() {
79553       var map2 = context.map();
79554       var center = map2.center();
79555       var zoom = map2.zoom();
79556       var precision2 = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
79557       var oldParams = utilObjectOmit(
79558         utilStringQs(window.location.hash),
79559         ["comment", "source", "hashtags", "walkthrough"]
79560       );
79561       var newParams = {};
79562       delete oldParams.id;
79563       var selected = context.selectedIDs().filter(function(id2) {
79564         return context.hasEntity(id2);
79565       });
79566       if (selected.length) {
79567         newParams.id = selected.join(",");
79568       }
79569       newParams.map = zoom.toFixed(2) + "/" + center[1].toFixed(precision2) + "/" + center[0].toFixed(precision2);
79570       return Object.assign(oldParams, newParams);
79571     }
79572     function computedHash() {
79573       return "#" + utilQsString(computedHashParameters(), true);
79574     }
79575     function computedTitle(includeChangeCount) {
79576       var baseTitle = context.documentTitleBase() || "iD";
79577       var contextual;
79578       var changeCount;
79579       var titleID;
79580       var selected = context.selectedIDs().filter(function(id2) {
79581         return context.hasEntity(id2);
79582       });
79583       if (selected.length) {
79584         var firstLabel = utilDisplayLabel(context.entity(selected[0]), context.graph());
79585         if (selected.length > 1) {
79586           contextual = _t("title.labeled_and_more", {
79587             labeled: firstLabel,
79588             count: selected.length - 1
79589           });
79590         } else {
79591           contextual = firstLabel;
79592         }
79593         titleID = "context";
79594       }
79595       if (includeChangeCount) {
79596         changeCount = context.history().difference().summary().length;
79597         if (changeCount > 0) {
79598           titleID = contextual ? "changes_context" : "changes";
79599         }
79600       }
79601       if (titleID) {
79602         return _t("title.format." + titleID, {
79603           changes: changeCount,
79604           base: baseTitle,
79605           context: contextual
79606         });
79607       }
79608       return baseTitle;
79609     }
79610     function updateTitle(includeChangeCount) {
79611       if (!context.setsDocumentTitle())
79612         return;
79613       var newTitle = computedTitle(includeChangeCount);
79614       if (document.title !== newTitle) {
79615         document.title = newTitle;
79616       }
79617     }
79618     function updateHashIfNeeded() {
79619       if (context.inIntro())
79620         return;
79621       var latestHash = computedHash();
79622       if (_cachedHash !== latestHash) {
79623         _cachedHash = latestHash;
79624         window.history.replaceState(null, computedTitle(
79625           false
79626           /* includeChangeCount */
79627         ), latestHash);
79628         updateTitle(
79629           true
79630           /* includeChangeCount */
79631         );
79632         const q = utilStringQs(latestHash);
79633         if (q.map) {
79634           corePreferences("map-location", q.map);
79635         }
79636       }
79637     }
79638     var _throttledUpdate = throttle_default(updateHashIfNeeded, 500);
79639     var _throttledUpdateTitle = throttle_default(function() {
79640       updateTitle(
79641         true
79642         /* includeChangeCount */
79643       );
79644     }, 500);
79645     function hashchange() {
79646       if (window.location.hash === _cachedHash)
79647         return;
79648       _cachedHash = window.location.hash;
79649       var q = utilStringQs(_cachedHash);
79650       var mapArgs = (q.map || "").split("/").map(Number);
79651       if (mapArgs.length < 3 || mapArgs.some(isNaN)) {
79652         updateHashIfNeeded();
79653       } else {
79654         if (_cachedHash === computedHash())
79655           return;
79656         var mode = context.mode();
79657         context.map().centerZoom([mapArgs[2], Math.min(_latitudeLimit, Math.max(-_latitudeLimit, mapArgs[1]))], mapArgs[0]);
79658         if (q.id && mode) {
79659           var ids = q.id.split(",").filter(function(id2) {
79660             return context.hasEntity(id2);
79661           });
79662           if (ids.length && (mode.id === "browse" || mode.id === "select" && !utilArrayIdentical(mode.selectedIDs(), ids))) {
79663             context.enter(modeSelect(context, ids));
79664             return;
79665           }
79666         }
79667         var center = context.map().center();
79668         var dist = geoSphericalDistance(center, [mapArgs[2], mapArgs[1]]);
79669         var maxdist = 500;
79670         if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
79671           context.enter(modeBrowse(context));
79672           return;
79673         }
79674       }
79675     }
79676     function behavior() {
79677       context.map().on("move.behaviorHash", _throttledUpdate);
79678       context.history().on("change.behaviorHash", _throttledUpdateTitle);
79679       context.on("enter.behaviorHash", _throttledUpdate);
79680       select_default2(window).on("hashchange.behaviorHash", hashchange);
79681       var q = utilStringQs(window.location.hash);
79682       if (q.id) {
79683         context.zoomToEntity(q.id.split(",")[0], !q.map);
79684       }
79685       if (q.walkthrough === "true") {
79686         behavior.startWalkthrough = true;
79687       }
79688       if (q.map) {
79689         behavior.hadLocation = true;
79690       } else if (!q.id && corePreferences("map-location")) {
79691         const mapArgs = corePreferences("map-location").split("/").map(Number);
79692         context.map().centerZoom([mapArgs[2], Math.min(_latitudeLimit, Math.max(-_latitudeLimit, mapArgs[1]))], mapArgs[0]);
79693         updateHashIfNeeded();
79694         behavior.hadLocation = true;
79695       }
79696       hashchange();
79697       updateTitle(false);
79698     }
79699     behavior.off = function() {
79700       _throttledUpdate.cancel();
79701       _throttledUpdateTitle.cancel();
79702       context.map().on("move.behaviorHash", null);
79703       context.on("enter.behaviorHash", null);
79704       select_default2(window).on("hashchange.behaviorHash", null);
79705       window.location.hash = "";
79706     };
79707     return behavior;
79708   }
79709
79710   // node_modules/d3-brush/src/brush.js
79711   var { abs: abs2, max: max2, min: min2 } = Math;
79712   function number1(e) {
79713     return [+e[0], +e[1]];
79714   }
79715   function number22(e) {
79716     return [number1(e[0]), number1(e[1])];
79717   }
79718   var X = {
79719     name: "x",
79720     handles: ["w", "e"].map(type),
79721     input: function(x, e) {
79722       return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]];
79723     },
79724     output: function(xy) {
79725       return xy && [xy[0][0], xy[1][0]];
79726     }
79727   };
79728   var Y = {
79729     name: "y",
79730     handles: ["n", "s"].map(type),
79731     input: function(y, e) {
79732       return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]];
79733     },
79734     output: function(xy) {
79735       return xy && [xy[0][1], xy[1][1]];
79736     }
79737   };
79738   var XY = {
79739     name: "xy",
79740     handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),
79741     input: function(xy) {
79742       return xy == null ? null : number22(xy);
79743     },
79744     output: function(xy) {
79745       return xy;
79746     }
79747   };
79748   function type(t) {
79749     return { type: t };
79750   }
79751
79752   // modules/index.js
79753   var debug = false;
79754   var d3 = {
79755     dispatch: dispatch_default,
79756     geoMercator: mercator_default,
79757     geoProjection: projection,
79758     polygonArea: area_default3,
79759     polygonCentroid: centroid_default2,
79760     select: select_default2,
79761     selectAll: selectAll_default2,
79762     timerFlush
79763   };
79764
79765   // modules/id.js
79766   window.requestIdleCallback = window.requestIdleCallback || function(cb) {
79767     var start2 = Date.now();
79768     return window.requestAnimationFrame(function() {
79769       cb({
79770         didTimeout: false,
79771         timeRemaining: function() {
79772           return Math.max(0, 50 - (Date.now() - start2));
79773         }
79774       });
79775     });
79776   };
79777   window.cancelIdleCallback = window.cancelIdleCallback || function(id2) {
79778     window.cancelAnimationFrame(id2);
79779   };
79780   window.iD = modules_exports;
79781 })();
79782 //# sourceMappingURL=iD.js.map